一個(gè)管理系統(tǒng)的成長(zhǎng)歷程

所有系統(tǒng)的開(kāi)發(fā)都受限于當(dāng)時(shí)的技術(shù)積累、人力資源、設(shè)計(jì)方案,沒(méi)有完美的系統(tǒng),
我們只是在自己的技術(shù)能力內(nèi)做到100分。           -- fuyuan

沒(méi)有完美的系統(tǒng),只有適合的系統(tǒng)。我不是大神,本文結(jié)合我以前在一個(gè)企業(yè)的CRM管理系統(tǒng)和后來(lái)開(kāi)發(fā)維護(hù)的一個(gè)系統(tǒng)來(lái)說(shuō)介紹下我踩過(guò)的坑。
??

洪湖ssl適用于網(wǎng)站、小程序/APP、API接口等需要進(jìn)行數(shù)據(jù)傳輸應(yīng)用場(chǎng)景,ssl證書(shū)未來(lái)市場(chǎng)廣闊!成為創(chuàng)新互聯(lián)的ssl證書(shū)銷(xiāo)售渠道,可以享受市場(chǎng)價(jià)格4-6折優(yōu)惠!如果有意向歡迎電話聯(lián)系或者加微信:13518219792(備注:SSL證書(shū)合作)期待與您的合作!

業(yè)務(wù)背景

先說(shuō)下業(yè)務(wù)背景吧,我當(dāng)時(shí)接手重構(gòu)改造任務(wù)的時(shí)候,面臨如下情況:

  1. 老系統(tǒng)部署環(huán)境比較陳舊,還是apache+php, 比較老的環(huán)境了,經(jīng)過(guò)若干年人員更替,部門(mén)分拆,已經(jīng)不能說(shuō)清楚上面運(yùn)行的各種服務(wù)了,運(yùn)維部署起來(lái)也比較困難,哪天死了,基本上無(wú)法復(fù)制,單點(diǎn)情況比較嚴(yán)重。
  2. 所用框架也比較老舊,自有框架,不僅包含后臺(tái)服務(wù)代碼,還包含管理系統(tǒng)代碼,開(kāi)發(fā)維護(hù)也比較困難。
  3. 界面風(fēng)格也比較舊,還是十幾年前的風(fēng)格,操作起來(lái)比較怪異。
  4. 領(lǐng)導(dǎo)授權(quán)說(shuō)重構(gòu)吧。這個(gè)是最關(guān)鍵的,領(lǐng)導(dǎo)授權(quán),是一個(gè)項(xiàng)目啟動(dòng)的旗幟。
    ?一個(gè)管理系統(tǒng)的成長(zhǎng)歷程
    系統(tǒng)從開(kāi)發(fā)到后來(lái)的優(yōu)化都是遵循的原則PDCA。?
    一個(gè)管理系統(tǒng)的成長(zhǎng)歷程??
    ?

好,匯總各方面需求總結(jié)的情況如下:

  1. 新作一個(gè)管理后臺(tái)系統(tǒng),最好與主業(yè)務(wù)一樣的結(jié)構(gòu),這樣便于開(kāi)發(fā)。即linux + nginx + php + yaf + memcache + yaconf + MySQL等等。
  2. 遷移舊系統(tǒng)功能,按時(shí)完成,實(shí)現(xiàn)新的需要的功能。
  3. 找個(gè)流行的響應(yīng)式模版。
  4. 技術(shù)棧升級(jí),這個(gè)是最近才加入的內(nèi)容。
    一個(gè)管理系統(tǒng)的成長(zhǎng)歷程

系統(tǒng)整體架構(gòu)設(shè)計(jì)

開(kāi)始的時(shí)候因?yàn)閷?duì)yaf不太熟,所以沒(méi)有注意到application.dispatcher.defaultRoute.controllerPrefer=true 這個(gè)配置。以至于 每次一個(gè)接口,都得重建一個(gè)文件,寫(xiě)一個(gè)controller。
后來(lái)我想了一方法:對(duì)于a/b/c_d 這種路由,自己寫(xiě)了個(gè)規(guī)則,映射到A_B_C controller的d action方法中。
這樣 對(duì)于簡(jiǎn)單的增刪改查方法,就可以放在一個(gè)文件里了。

model設(shè)計(jì)

訪問(wèn)數(shù)據(jù)庫(kù)的model,因?yàn)閥af框架比較簡(jiǎn)單,所以我參照了thinkphp的訪問(wèn)數(shù)據(jù)庫(kù)部分自己寫(xiě)了一個(gè)簡(jiǎn)單的模塊。
后來(lái)一個(gè)兄弟引入了laravel的ORM模塊Eloquent,不過(guò)沒(méi)有遷移所有的業(yè)務(wù),所以存在了兩套內(nèi)容。

賬號(hào)

這個(gè)比較簡(jiǎn)單,跟常用的系統(tǒng)相同。

角色

角色管理是確定角色具備哪些權(quán)限的一個(gè)過(guò)程,他是一個(gè)集合的概念,是眾多最小權(quán)限顆粒的組成。我們通過(guò)把權(quán)限給這個(gè)角色,再把角色給賬號(hào),從而實(shí)現(xiàn)賬號(hào)的權(quán)限,這是網(wǎng)上摘抄的,我在系統(tǒng)中并沒(méi)有實(shí)現(xiàn)這么復(fù)雜。沒(méi)用用到 超級(jí)管理員,管理員,普通用戶角色區(qū)分,這個(gè)要看系統(tǒng)應(yīng)用場(chǎng)景吧。

權(quán)限的定義

網(wǎng)上有各種個(gè)樣的帖子介紹管理系統(tǒng)的,我也介紹下我的這個(gè)系統(tǒng)里面權(quán)限的部分。

權(quán)限可以分為三種:頁(yè)面權(quán)限,操作權(quán)限,數(shù)據(jù)權(quán)限??
頁(yè)面權(quán)限:即入口,用戶可以看到哪個(gè)頁(yè)面,看不到哪個(gè)頁(yè)面。
操作權(quán)限:進(jìn)入同樣的頁(yè)面,有些人看到這個(gè)按鈕可點(diǎn)擊,有些人只能瀏覽這個(gè)頁(yè)面的數(shù)據(jù)。
數(shù)據(jù)權(quán)限:則是控制你可以看到哪些數(shù)據(jù),比如會(huì)員的人A只能看到或者修改A部創(chuàng)建的數(shù)據(jù),他看不到或者不能修改B部的數(shù)據(jù)。

我這邊實(shí)現(xiàn)是限定一個(gè)一個(gè)常量列表和一個(gè)權(quán)限菜單。可以是增刪改查的,我這邊考慮到這個(gè)變化有限,所以只在代碼中寫(xiě)成了固定的內(nèi)容,增加一項(xiàng)菜單就改回代碼就行了。

// 常量定義
define('P_USER_MANAGE', 1); // 后臺(tái)用戶管理
define('P_USER', 2); // 用戶管理列表
define('P_GROUP', 3); // 組管理列表
... ...

// 權(quán)限樹(shù)
P_USER_MANAGE => [
            'title' => '后臺(tái)管理',
            'link' => '',
            'class' => 'fa fa-user',
            'child' => [
                P_USER => [
                    'title' => '用戶列表',
                    'link' => '/user/list',
                    'class' => '',
                    'child' => array()
                ],
                P_GROUP => [
                    'title' => '組列表',
                    'link' => '/group/list',
                    'class' => '',
                    'child' => array()
                ]
             ]
]

這樣 每次用戶進(jìn)入頁(yè)面 再根據(jù)一定的算法獲得用戶 應(yīng)該有的權(quán)限,相關(guān)代碼可以參考:
https://github.com/netbird/permission

這個(gè)是以前實(shí)現(xiàn)的一個(gè)類(lèi),是將權(quán)限由低到高排列,保存的時(shí)候每4位轉(zhuǎn)變成1個(gè)十六進(jìn)制的字符,然后合并。
例如: 用戶權(quán)限是 '', 把權(quán)限 12加上,就是1000 0000 0000, 保存就是,800。
主要實(shí)現(xiàn)了以下方法:

Permission::setuserPermission($permission_index, $user_perm)
    // 這個(gè)是設(shè)置權(quán)限,比如用戶的現(xiàn)在權(quán)限是'', 如果把12這個(gè)權(quán)限號(hào)碼加上則執(zhí)行:
    // $user_permission = Permission::setuserPermission(12, $user_permission)

Permission::deleteUserPermission($permission_index, $user_perm)
    // 刪除權(quán)限
Permission::isAllowUserPermission($permission_index, $user_perm)
     // 判斷用戶是否有權(quán)限

至于按鈕權(quán)限,這個(gè)也可以參照這個(gè)進(jìn)行,定義一個(gè)按鈕的設(shè)置常量,判斷有那個(gè)權(quán)限,則展示按鈕。
數(shù)據(jù)訪問(wèn),這個(gè)具體場(chǎng)景 具體分析了,不過(guò)每個(gè)接口入口的地方 至少需要判定訪問(wèn)權(quán)限。
?

響應(yīng)式模版

技術(shù)講究厚積薄發(fā),只有平時(shí)多積累多實(shí)踐,關(guān)鍵的時(shí)候才能發(fā)揮用途。因?yàn)橐郧白隽祟?lèi)似的系統(tǒng),所以利用了以下一個(gè)模版框架。然后進(jìn)行改造。
?
我不愿意每次都寫(xiě)表格頁(yè)面,所以使用jquery table這個(gè)第三方的插件,采用異步加載數(shù)據(jù)的方式。在這個(gè)插件上面進(jìn)行了簡(jiǎn)單的二次開(kāi)發(fā)。后來(lái)的大多數(shù)功能都是采用的這個(gè)插件。
?
bootstrap是個(gè)好東西,以前用的少,這次大規(guī)模使用,每天就是調(diào)頁(yè)面,調(diào)前端。在筆記本上看著不錯(cuò),到了顯示器上就走樣,很苦惱。不過(guò)我經(jīng)手的頁(yè)面普遍沒(méi)啥問(wèn)題。
?

功能改進(jìn)

之前每次新建功能都得新建個(gè)表,然后寫(xiě)編輯頁(yè)面,好煩啊。能不能搞個(gè)公用的機(jī)制,簡(jiǎn)單的引用就生成個(gè)簡(jiǎn)單的編輯頁(yè)面。于是,我對(duì)編輯部分進(jìn)行了封裝改進(jìn)。
先說(shuō)下數(shù)據(jù)庫(kù):建造個(gè)公共表:主要包含 main_key, second_key, config_value,等內(nèi)容,config_value是參照key-value格式數(shù)據(jù)庫(kù)的value字段使用,當(dāng)然 text類(lèi)型最高65535個(gè)字節(jié)把,如果太大,會(huì)造成bug。
一個(gè)管理系統(tǒng)的成長(zhǎng)歷程
?
就是將關(guān)系型數(shù)據(jù)庫(kù)作為key-value用了,一些加單的配置信息,經(jīng)過(guò)json轉(zhuǎn)成字符串然后保存下來(lái)。
?

自定義通用配置

有沒(méi)有一種方案,能夠不編寫(xiě)代碼,僅靠后臺(tái)點(diǎn)點(diǎn)就能滿足配置? 于是先出設(shè)計(jì)方案,后加工。
一般的項(xiàng)目配置分成單頁(yè)和列表的配置。可參照如下需求:

  1. 進(jìn)入設(shè)置頁(yè)面,創(chuàng)建1個(gè)item,類(lèi)型分成單頁(yè)和列表。
  2. 選擇 編輯頁(yè)面是否包含日期,發(fā)布權(quán)限的人員,可修改字段的人員,發(fā)布的文件名稱等等吧。
  3. 單頁(yè)面或者列表的單頁(yè)面編輯頁(yè)支持自定義字段編輯(可添加或減少字段)。

于是這個(gè)項(xiàng)目就產(chǎn)生了。雖然體驗(yàn)差了一點(diǎn),但是基本滿足需求,節(jié)約開(kāi)發(fā)時(shí)間還是沒(méi)有問(wèn)題的。

模版

關(guān)于模版是在列表頁(yè)面提出的,在自定義列表頁(yè),每次創(chuàng)建單頁(yè)面的時(shí)候都需要重建數(shù)據(jù)很麻煩。于是改進(jìn)了下,在配置頁(yè)面有個(gè)模版設(shè)置頁(yè)面,模版頁(yè)面可以添加刪除定義字段。這樣在創(chuàng)建新頁(yè)面的時(shí)候就可以繼承模版了。
?

ini配置文件

關(guān)于生成的配置信息,我們還是采用了yaconf的php擴(kuò)展插件,所以大部分配置以ini文件的形式推到線上。yaconf的用戶可以參考線上說(shuō)明。下面博客也總結(jié)了一些yaconf使用的坑。
一些使用Yaconf的經(jīng)驗(yàn)分享

日志及備份

一開(kāi)始記錄mysql,每條都記錄,后來(lái)發(fā)現(xiàn)不太好,需要的時(shí)候什么也查不出來(lái)。還是應(yīng)該從產(chǎn)品的角度看這個(gè)日志吧。
這個(gè)模塊一直在開(kāi)發(fā)改進(jìn)中。大致的方向是給使用者一個(gè)友好的查詢界面,去查詢相關(guān)的內(nèi)容。
因?yàn)橐恍╇[患,后來(lái)我加入了配置信息備份功能,每次配置更新的時(shí)候保存已有的線上這個(gè)文件配置,并且記錄到數(shù)據(jù)庫(kù)。然后做個(gè)后臺(tái),可以查看,比對(duì)配置并且上線。
這個(gè)地方引用了一個(gè)公共類(lèi)庫(kù):https://github.com/chrisboulton/php-diff
?

vue

一次偶然的機(jī)會(huì)接觸到vue基礎(chǔ)知識(shí),在系統(tǒng)的某些頁(yè)面決定嘗試以下,沒(méi)有深入使用,只是引入了 vue.js。進(jìn)行了一些頁(yè)面處理,感覺(jué)確實(shí)方便了很多。當(dāng)時(shí)只是看了vue的一些基礎(chǔ)知識(shí),有很多問(wèn)題還停留在表面層,所以沒(méi)有深入應(yīng)用。

類(lèi)似下面的代碼,很舒服的感覺(jué)。

new Vue({
        el: '#app',
        data: {
            source_url:"",
            count_result_text: "",
            uid: ""
        },
        methods: {
            count_result: function () {
                var that = this;

                if (this.source_url == '') {
                    bootbox.alert('url不能為空');
                    return;
                }
                var param = {
                    "source_url": this.source_url,
                    "uid": this.uid
                };

                $.post('/api/counts', param, function(return_data){
                    that.count_result_text = return_data.s;
                }, 'json');
            }
        }
    });

Vue.js 組件與路由
一個(gè)管理系統(tǒng)的成長(zhǎng)歷程

ant design

年初,想對(duì)系統(tǒng)升級(jí)改造。增加幾個(gè)模塊,朋友推薦ant design。感覺(jué)挺好,使用各種入坑。
一個(gè)管理系統(tǒng)的成長(zhǎng)歷程
一個(gè)管理系統(tǒng)的成長(zhǎng)歷程
下面是一些問(wèn)題的總結(jié), 我在另外的兩篇文章中提到的:
ant design form表單的時(shí)間處理
碰到一個(gè)ant design跨域問(wèn)題

全新的開(kāi)發(fā)模式,我很喜歡。
一個(gè)管理系統(tǒng)的成長(zhǎng)歷程
?
技術(shù)棧:react,ant-design,dva,Mock
關(guān)于dva,有個(gè)圖,我想大家應(yīng)該學(xué)習(xí)下:
一個(gè)管理系統(tǒng)的成長(zhǎng)歷程

本次學(xué)會(huì)使用了npm,webpack, mock.js, node.js等相關(guān)內(nèi)容。
最后學(xué)以致用,技術(shù)永遠(yuǎn)為業(yè)務(wù)服務(wù)。這個(gè)是歷史以來(lái)的道理。多運(yùn)用,多思考。

分享題目:一個(gè)管理系統(tǒng)的成長(zhǎng)歷程
本文路徑:http://m.kartarina.com/article44/jeohee.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供軟件開(kāi)發(fā)定制開(kāi)發(fā)手機(jī)網(wǎng)站建設(shè)自適應(yīng)網(wǎng)站域名注冊(cè)網(wǎng)站設(shè)計(jì)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

營(yíng)銷(xiāo)型網(wǎng)站建設(shè)
主站蜘蛛池模板: 久久久久亚洲AV无码网站| 久久av高潮av无码av喷吹| 少妇无码一区二区三区| 中文字幕人妻无码系列第三区| 亚洲av无码一区二区三区不卡| 日韩精品无码人妻免费视频| 午夜福利av无码一区二区| 国产日产欧洲无码视频| 日韩精品无码中文字幕一区二区| 无码人妻丰满熟妇区毛片| 小13箩利洗澡无码视频网站| 中文字幕精品无码久久久久久3D日动漫| 无码精品国产VA在线观看| 最新国产AV无码专区亚洲| 在线A级毛片无码免费真人| 无码精品日韩中文字幕| 亚洲中文字幕久久精品无码APP| 蜜臀亚洲AV无码精品国产午夜.| 精品无码久久久久国产| 亚洲综合av永久无码精品一区二区 | 亚洲av无码无在线观看红杏| 成人免费无码大片a毛片| 亚洲另类无码专区首页| 国产精品无码久久综合| 亚洲情XO亚洲色XO无码| 中文字幕无码久久精品青草| 亚洲AV无码一区二区三区国产| 熟妇人妻无码xxx视频| 亚洲中文无码永久免费| 亚洲中文字幕久久无码| 少妇特殊按摩高潮惨叫无码| 亚洲AV永久无码精品放毛片| 中文AV人妻AV无码中文视频| 久久精品亚洲中文字幕无码麻豆| 久久无码专区国产精品s| 久久久无码精品亚洲日韩蜜臀浪潮 | 国产高清无码二区| 国产精品毛片无码| 国产AV无码专区亚洲AV漫画| 国产AV无码专区亚洲AVJULIA| 亚洲AV日韩AV永久无码久久|