PHP開發(fā) APP H5混合開發(fā)庶骄,后臺(tái)架構(gòu)!

本人技術(shù)不高践磅,設(shè)計(jì)有缺陷的地方還請(qǐng)各位指點(diǎn)一下单刁,或者有地方不明白可以 評(píng)論一下,我也會(huì)說出自己的思路。第一次寫文章羔飞,不知道說啥好肺樟,就直接開搞把

開發(fā)項(xiàng)目:房產(chǎn)類APP、H5

開發(fā)語言:PHP

語言框架:Yii

框架選擇:之前已經(jīng)用Thinkphp框架做了套小程序接口和后臺(tái)管理逻淌,想換個(gè)框架來重寫接口么伯,在 Yii 和 Laravel中選擇,經(jīng)過多方面的考慮和個(gè)人喜好最后選擇的Yii卡儒。

既然是混合開發(fā) 那么就需要無狀態(tài)登錄田柔,簡單介紹一下:

傳統(tǒng)的web端登錄,是將登錄信息緩存到服務(wù)端的session中骨望,每個(gè)session有唯一的sessionId硬爆,瀏覽器請(qǐng)求服務(wù)端會(huì)自動(dòng)在請(qǐng)求頭的cookie中帶上sessionId,服務(wù)端得到sessionId在session緩存器中獲取數(shù)據(jù)擎鸠。

無狀態(tài)登錄有哪些優(yōu)勢(shì)

1.服務(wù)端不需要緩存用戶信息缀磕,可以減少服務(wù)器壓力

2.token緩存在客戶端,服務(wù)器重啟劣光,登錄狀態(tài)不會(huì)失效

3.容易擴(kuò)展袜蚕,如果使用負(fù)載均衡 傳統(tǒng)登錄雖然可以實(shí)現(xiàn),但是成本和時(shí)間會(huì)大大提高绢涡,使用TOKEN就不需要麻煩牲剃,只需要多臺(tái)服務(wù)器使用相同解密代碼即可

接口安全

JWT(JSON Web Token)簽名算法 SHA512,考慮到有些隱私的數(shù)據(jù)雄可,增加了新的字段颠黎,并且使用 RSA(非對(duì)稱算法) 進(jìn)行了加密。
為什么要增加字段而不是 直接使用RSA算法對(duì)Token進(jìn)行加密:RSA加密解密速度比對(duì)稱算法要慢的多滞项,會(huì)嚴(yán)重影響接口響應(yīng)速度浪費(fèi)服務(wù)器資源夭坪。增加字段文判,不需要每次都解密,只有需要使用的時(shí)候解密就可以了室梅。

我自己封裝好了JWTRSA加解密戏仓,代碼有點(diǎn)多 就不好貼出來了。

接口數(shù)據(jù)安全

數(shù)據(jù)安全依然采用SHA算法簽名驗(yàn)證亡鼠,每一次請(qǐng)求 把請(qǐng)求的內(nèi)容和KEY 一起加密赏殃,并且設(shè)置接口有效期 5秒左右,服務(wù)端接收到數(shù)據(jù) 進(jìn)行 簽名和有效期驗(yàn)證间涵,由于 KEY是私密的別人無法得到就算拿到這個(gè)包也無法從服務(wù)端拿到數(shù)據(jù)仁热。

Restful 風(fēng)格設(shè)計(jì)

標(biāo)準(zhǔn)的Restful風(fēng)格,我是不太喜歡勾哩,根據(jù)這個(gè)風(fēng)格調(diào)整了下抗蠢,GET 查詢举哟,增刪改用POST,就只用了這兩種方式迅矛。

版本號(hào)方式:

apiv1.xxxx.com

接口返回結(jié)果

響應(yīng)碼:

<?php
class Code {
     const success = array(
        2000 => ['status' => 2000, 'msg' => '查詢成功', 'sysMsg' => 'success', 'is' => true],
        2005 => ['status' => 2005, 'msg' => '查詢成功,無數(shù)據(jù)', 'sysMsg' => 'success', 'is' => true],
        2001 => ['status' => 2001, 'msg' => '操作成功', 'sysMsg' => 'success', 'is' => true], // 更新或插入操作
        2002 => ['status' => 2002, 'msg' => '后臺(tái)已執(zhí)行', 'sysMsg' => 'success', 'is' => true],
        2004 => ['status' => 2004, 'msg' => '刪除成功', 'sysMsg' => 'success', 'is' => true]
    );
    const error = array(
        4000 => ['status' => 4000, 'msg' => '未執(zhí)行任何操作', 'sysMsg' => 'error', 'is' => false],
        4001 => ['status' => 4001, 'msg' => '驗(yàn)證碼錯(cuò)誤', 'sysMsg' => 'error', 'is' => false], // 驗(yàn)證碼用戶名或密碼錯(cuò)誤過期
        4003 => ['status' => 4003, 'msg' => '無權(quán)訪問', 'sysMsg' => 'error', 'is' => false],
        4004 => ['status' => 4004, 'msg' => '記錄不存在', 'sysMsg' => 'error', 'is' => false],
        4006 => ['status' => 4006, 'msg' => '格式不正確', 'sysMsg' => 'error', 'is' => false],
        4022 => ['status' => 4022, 'msg' => '缺少參數(shù)', 'sysMsg' => 'error', 'is' => false], // 自定義錯(cuò)誤信息
        4029 => ['status' => 4006, 'msg' => '請(qǐng)求次數(shù)超過限額', 'sysMsg' => 'error', 'is' => false],
    );
    public static function getSCode($code)
    {
        return self::success[$code];
    }
    public static function getECode($code)
    {
        return self::error[$code];
    }
}

復(fù)用類

Trait ResponseCode{
    private static $instance;
    public static function successResponse($code, $data)
    {
        $code = Code::getSCode($code);
        $code['data'] = $data;
        return json_encode($code);
    }
    public static function errorResponse($code, $msg = '')
    {
        $code = Code::getECode($code);
        if ($msg != ''){
            $code['msg'] = $msg;
        }
        return json_encode($code);
    }
}

如何使用妨猩?
引入 ResponseCode 類 填入響應(yīng)狀態(tài)碼即可

return ResponseCode::successResponse(2000, $data);

Yii框架數(shù)據(jù)庫操作

在這也是 糾結(jié)了一下,活動(dòng)記錄也就是模型果斷放棄的秽褒,又在 查詢器和 createCommand做選擇 查詢器 可讀性更好些壶硅,createCommand 后期做分布式數(shù)據(jù)庫很方便。

最后還是選擇了 createCommand 销斟,它更高效庐椒,不會(huì)產(chǎn)生多余的SQL,我也進(jìn)行了簡單的封裝票堵,看起來不是那么啰嗦扼睬, 滿屏幕的 'select'的字符串,寫起來都很頭疼悴势。

代碼如下:

class Sql
{
    private $db;
    private static $sql;
    function __construct($name = '')
    {
        if (!$this->db) {
            $this->db = \Yii::$app->db;
        }
        if ($name !== '') {
            $this->sql = " from {{%$name}}";
        }
    }
    public  function select(string $fields)
    {
        self::$sql = " select " . $fields . self::$sql;
        return $this;
    }
    public static function from(string $name)
    {
        self::$sql = " from {{%$name}}";
        return new self();
    }
    public  function map($map = '')
    {
        if ($map) {
            self::$sql .=' ' . $map;
        }
        return $this->db->createCommand(self::$sql);
    }
}

如何使用?

use common\models\Sql;

$data = Sql::from('advert')
                ->select("id, title, CONCAT($dir, cateimg) as cateimg, page_url")
                ->map('where type = 1 and cityid = :cityid')
                ->bindValue(':cityid', $cityid)
                ->queryAll();

這樣看起來 是不是 就舒服很多了窗宇,當(dāng)然每個(gè)人想法不一樣。
我個(gè)人喜歡原生的PHP特纤,如果不是窮....
所以我的 工具類都是基于 原生PHP編寫军俊,自己寫的看起來更清晰,也能夠兼容于大部分的框架捧存。
以上就是我的設(shè)計(jì)思路粪躬,歡迎各位朋友提出寶貴的建議!大家一起進(jìn)步昔穴!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末镰官,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子吗货,更是在濱河造成了極大的恐慌泳唠,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,681評(píng)論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件宙搬,死亡現(xiàn)場(chǎng)離奇詭異笨腥,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)勇垛,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,205評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門脖母,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人闲孤,你說我怎么就攤上這事谆级。” “怎么了?”我有些...
    開封第一講書人閱讀 169,421評(píng)論 0 362
  • 文/不壞的土叔 我叫張陵哨苛,是天一觀的道長鸽凶。 經(jīng)常有香客問我,道長建峭,這世上最難降的妖魔是什么玻侥? 我笑而不...
    開封第一講書人閱讀 60,114評(píng)論 1 300
  • 正文 為了忘掉前任,我火速辦了婚禮亿蒸,結(jié)果婚禮上凑兰,老公的妹妹穿的比我還像新娘。我一直安慰自己边锁,他們只是感情好姑食,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,116評(píng)論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著茅坛,像睡著了一般音半。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上贡蓖,一...
    開封第一講書人閱讀 52,713評(píng)論 1 312
  • 那天曹鸠,我揣著相機(jī)與錄音,去河邊找鬼斥铺。 笑死彻桃,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的晾蜘。 我是一名探鬼主播邻眷,決...
    沈念sama閱讀 41,170評(píng)論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼剔交!你這毒婦竟也來了肆饶?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,116評(píng)論 0 277
  • 序言:老撾萬榮一對(duì)情侶失蹤岖常,失蹤者是張志新(化名)和其女友劉穎抖拴,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體腥椒,經(jīng)...
    沈念sama閱讀 46,651評(píng)論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,714評(píng)論 3 342
  • 正文 我和宋清朗相戀三年候衍,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了笼蛛。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,865評(píng)論 1 353
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡蛉鹿,死狀恐怖滨砍,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤惋戏,帶...
    沈念sama閱讀 36,527評(píng)論 5 351
  • 正文 年R本政府宣布领追,位于F島的核電站,受9級(jí)特大地震影響响逢,放射性物質(zhì)發(fā)生泄漏绒窑。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,211評(píng)論 3 336
  • 文/蒙蒙 一舔亭、第九天 我趴在偏房一處隱蔽的房頂上張望些膨。 院中可真熱鬧,春花似錦钦铺、人聲如沸订雾。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,699評(píng)論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽洼哎。三九已至,卻和暖如春沼本,著一層夾襖步出監(jiān)牢的瞬間噩峦,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,814評(píng)論 1 274
  • 我被黑心中介騙來泰國打工擅威, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留壕探,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 49,299評(píng)論 3 379
  • 正文 我出身青樓郊丛,卻偏偏與公主長得像李请,于是被迫代替她去往敵國和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子厉熟,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,870評(píng)論 2 361

推薦閱讀更多精彩內(nèi)容