權管理系統(tǒng):申報審核與付費下載全流程解析)
簡介基于SSM框架與MySQL開發(fā)的Java Web知識產(chǎn)權管理系統(tǒng)面向Java Web學習、課程設計與畢業(yè)設計場景。系統(tǒng)采用前臺后臺模式前臺支持用戶注冊登錄、公告查看、知識產(chǎn)權搜索、免費資料下載以及付費下載可自定義費用和租借時長后臺區(qū)分管理員、員工、注冊用戶三類角色管理員可進行密碼修改、員工管理、用戶管理、公告管理、資料下載管理及申報結果公布員工負責申報審核與失敗反饋注冊用戶可在線申報、查看結果并管理個人資料。資源包共1071個文件約32.36MB主要包含JSP頁面、Java源碼、class文件、jar依賴庫以及JS/CSS前端資源、GIF/PNG圖片、SQL數(shù)據(jù)庫腳本等目錄結構完整可直接導入Eclipse配合MySQL運行。已有78人學習參考適合需要完整前后臺項目源碼、數(shù)據(jù)庫腳本與業(yè)務流程參照的開發(fā)者。1. 知識產(chǎn)權管理系統(tǒng)把申報、審核和付費下載從臺賬里搬出來做知識產(chǎn)權申報和資料分發(fā)的小團隊通??縀xcel加網(wǎng)盤的組合拳申報人交一份Word審核人用Excel登記結果資料下載掛個網(wǎng)盤鏈接過期了再手動續(xù)。這套基于SSM框架的知識產(chǎn)權管理系統(tǒng)把「申報、審核、公布、付費下載」串成了一條完整業(yè)務鏈。前臺用戶注冊登錄后可以搜索知識產(chǎn)權、下載免費資料、付費租借下載權限后臺員工負責申報審核和失敗反饋管理員統(tǒng)一管理員工、用戶、公告、申報結果公布以及帶編號、名稱、費用、圖片、租借時間的付費產(chǎn)權信息。技術棧很典型SpringSpringMVCMyBatisJSP頁面MySQL數(shù)據(jù)庫Eclipse工程。適合兩類人一是有知識產(chǎn)權申報管理真實需求的機構二是想找完整JavaWeb前后臺案例來復現(xiàn)的開發(fā)者。2. 系統(tǒng)架構拆解SSMJSP的前后臺雙入口與關鍵類2.1 前臺與后臺的職責邊界用戶在用什么、員工在管什么這套系統(tǒng)不是前后端分離也不是微服務而是傳統(tǒng)JSP項目里典型的「一個工程、多套入口」模式。前臺頁面是注冊用戶看到的部分核心動作可以壓縮成三個詞查、下、報。查是搜索知識產(chǎn)權和查看公告下是免費下載和付費下載報是提交新的知識產(chǎn)權申報資料。后臺則是另一個世界按角色繼續(xù)劈成兩半——員工登錄進去只能處理申報審核和失敗反饋管理員則能碰員工管理、用戶注冊管理、公告信息管理、資料下載管理、申報結果公布和付費產(chǎn)權信息維護。角色區(qū)分的實現(xiàn)方式不復雜常見做法是登錄成功后把角色標識寫進SessionJSP頁面用標簽判斷角色來渲染菜單Controller層的方法入口再檢查一次角色。從項目類名來看Controller拆得相當細YonghuController管用戶登錄下載、YonghuzhuceController管注冊、YuangongController管員工審核、ChanquanxinxiController管產(chǎn)權信息。這種按角色加資源拆控制器的方式好處是每個類職責單一出問題時定位很快代價是Controller數(shù)量多如果后期加功能類會比較膨脹。這里要提醒一句菜單隱藏絕不是權限控制。如果只在頁面上把后臺入口藏了沒有在服務端校驗角色用戶直接在瀏覽器里拼一個后臺URL照樣能訪問員工功能。拿到這套系統(tǒng)后建議先統(tǒng)覽一遍所有Controller的請求映射再決定要不要加攔截器具體做法在第6章會展開。2.2 核心Controller與數(shù)據(jù)流轉鏈路從項目里能看出的幾個主要控制器職責梳理如下控制器類職責典型請求前綴YonghuController前臺用戶登錄、個人信息修改、下載處理/user/**YonghuzhuceController新用戶注冊、注冊信息落庫/registerYuangongController員工申報審核、失敗反饋、個人資料/staff/**ChanquanxinxiController產(chǎn)權信息查詢、免費付費下載入口/info/**數(shù)據(jù)處理的大致鏈路是這樣的用戶在前臺訪問列表頁Controller先把產(chǎn)權信息從數(shù)據(jù)庫查出來經(jīng)過分頁和搜索條件過濾由SpringMVC把數(shù)據(jù)放到Model里再交給JSP渲染。用戶提交申報時表單數(shù)據(jù)和上傳文件一起進Controller申報記錄插入數(shù)據(jù)庫狀態(tài)字段初始化為「待審核」。員工登錄后臺后YuangongController去查所有待審核記錄審核通過就把狀態(tài)改成「已通過」該記錄對前臺用戶變?yōu)榭梢妼徍瞬煌ㄟ^就寫一條失敗反饋用戶在前臺「我的申報結果」里能看到駁回原因。這條鏈路上的狀態(tài)字段是關鍵。常見約定是0代表待審核、1代表已通過、2代表已駁回。搜索功能看似簡單實際有幾個容易忽略的點按編號搜索時要用模糊匹配還是精確匹配按名稱搜索時中文編碼能不能正確處理分頁參數(shù)在翻頁后會不會丟失。這個項目里搜索入口不止前臺有員工后臺也有一份兩者應該走同一個Service方法避免兩套SQL邏輯后來出現(xiàn)不一致。2.3 工具類文件db.class與Info.class的定位以及那批asp文件怎么處理項目里有幾個不以Controller命名的類分別是db.class和Info.class。在SSM工程里數(shù)據(jù)庫訪問一般由MyBatis管理DataSource在Spring配置文件里統(tǒng)一配置db.class極可能是早期JDBC風格的連接封裝被保留下來給某些獨立模塊或歷史代碼使用。Info.class則是一個典型的通用消息包裝類作用是統(tǒng)一Controller返回給頁面的提示信息。它內(nèi)部結構大致是public class Info { private Integer code; // 0為成功1為失敗 private String message; // 提示內(nèi)容 public Info(Integer code, String message) { this.code code; this.message message; } }邏輯說明這類工具類本身不處理業(yè)務只是把「成或敗、成功提示、失敗原因」打包成一個對象傳到JSP。頁面拿到之后用EL表達式讀code和message決定彈窗還是跳轉。參數(shù)說明code的取值約定全項目要統(tǒng)一不然前端判斷會亂message最好用中文業(yè)務提示方便用戶直接看懂。再看那幾個支付相關文件alipay_md5.asp、alipay_function.asp、alipay_notify.asp、alipay_service.asp。在JavaWeb項目里看到asp后綴文件很多人會以為下錯了資源其實這并不罕見——早期的支付接口常以ASP文件形式分發(fā)開發(fā)者在遷移系統(tǒng)時把這份參考文件也順帶放進了工程目錄。Tomcat不會執(zhí)行asp所以這些文件對項目運行沒有任何影響保留當文檔看就好真正要接支付時應該用官方Java SDK重寫而不是試圖在Tomcat里跑asp。這一點在第5章避坑部分還會單獨講。3. 數(shù)據(jù)庫設計申報、審核、下載這三件事怎么建模3.1 核心表結構與字段清單從功能反推這套系統(tǒng)至少需要這幾張核心表用戶表、員工表、公告表、產(chǎn)權信息表、申報表、下載記錄表。由于項目里Controller名字用的拼音表名和字段名大概率也是拼音風格實際工作時不要被這個風格嚇到它只是命名習慣差異。產(chǎn)權信息表是關鍵中的關鍵因為它要支撐前臺展示、免費下載、付費租借、管理員維護四類操作字段上必須把編號、名稱、費用、圖片、介紹、租借時間這些信息都接住。CREATE TABLE chanquan_xinxi ( id INT PRIMARY KEY AUTO_INCREMENT, bianhao VARCHAR(50) NOT NULL COMMENT 產(chǎn)權編號, mingcheng VARCHAR(200) NOT NULL COMMENT 名稱, feiyong DECIMAL(10,2) DEFAULT 0.00 COMMENT 下載費用, tupian VARCHAR(255) DEFAULT COMMENT 展示圖片路徑, jieshao TEXT COMMENT 產(chǎn)權介紹, zujin_days INT DEFAULT 30 COMMENT 付費后租借天數(shù), status TINYINT DEFAULT 0 COMMENT 0未公布 1已公布 );邏輯說明這張表把前臺付費下載展示需要的字段全部收納進來。bianhao對應列表頁顯示的編號feiyong用DECIMAL存金額避免浮點誤差zujin_days存天數(shù)付費成功后系統(tǒng)根據(jù)它計算到期時間。參數(shù)說明status為0時前臺不可見管理員在后臺維護完信息后改為1前臺列表才會出現(xiàn)這條記錄如果要做下架能力可以把status改成2表示已下架。申報表也是核心表它要連接用戶和產(chǎn)權還要承接審核狀態(tài)和反饋信息。字段大致包括user_id記錄申報人chanquan_id關聯(lián)前面的產(chǎn)權信息表apply_docs存申報文檔路徑status存審核狀態(tài)feedback存失敗原因。這里要注意反饋字段一定要和審核時間分開存不然用戶看到反饋卻不知道是什么時候給的會出現(xiàn)體驗問題。3.2 租借時間與下載記錄的關系設計付費下載這個模塊最核心的設計決策是把「一次購買永久下載」改成「一次付費租借一段時間」。如果只設計一個flag字段標識用戶買沒買過后續(xù)狀態(tài)會非常難維護——用戶買過之后不能撤銷過期了也無法再收費。正確做法是在下載記錄表里同時存開始時間和到期時間每次用戶發(fā)起下載時都去判斷當前時間落在哪個區(qū)間。CREATE TABLE download_log ( id INT PRIMARY KEY AUTO_INCREMENT, user_id INT NOT NULL, chanquan_id INT NOT NULL, type TINYINT DEFAULT 0 COMMENT 0免費 1付費, download_time DATETIME DEFAULT NULL, expire_time DATETIME DEFAULT NULL );邏輯說明type字段區(qū)分免費下載和付費下載免費記錄的expire_time可以為NULL表示不限制過期付費記錄必須寫到期時間。查詢有效租期的SQL是整個付費下載權限判斷的核心。參數(shù)說明download_time是這次權限的開始時間expire_time等于download_time加zujin_days天兩個時間都應由服務端生成不要讓客戶端傳。實際查詢邏輯如下用戶每次點付費下載先查這條記錄SELECT * FROM download_log WHERE user_id #{userId} AND chanquan_id #{chanquanId} AND expire_time NOW() AND type 1 ORDER BY id DESC LIMIT 1;邏輯說明如果這條SQL返回一條記錄說明用戶當前處于有效租期內(nèi)直接放行下載如果返回空說明沒有購買記錄或者租期已過期此時應該引導用戶重新支付。參數(shù)說明NOW()是MySQL當前時間如果你的項目里服務器時間和數(shù)據(jù)庫時間不一致租期判斷會翻車后面避坑部分會專門講這個問題。4. 下載鏈路實戰(zhàn)免費與付費兩條路徑的代碼要害4.1 免費下載身份校驗、文件讀取、日志記錄三步走免費下載看似簡單代碼里也要走完身份校驗、文件讀取、日志記錄三步缺任何一步都會留下隱患。我一般會在Controller方法開頭先取Session里的用戶對象拿不到就直接重定向到登錄頁這是防止未登錄用戶繞過頁面按鈕直接請求下載地址的關鍵。GetMapping(/freeDownload) public void freeDownload(Integer infoId, HttpSession session, HttpServletResponse response) throws IOException { Yonghu user (Yonghu) session.getAttribute(loginUser); if (user null) { response.sendRedirect(/login); return; } Chanquan info infoService.getById(infoId); if (info null || info.getStatus() ! 1) { response.sendRedirect(/index); return; } File file new File(info.getSavePath()); String fileName URLEncoder.encode(info.getFileName(), UTF-8) .replaceAll(\\, %20); response.setContentType(application/octet-stream); response.setHeader(Content-Disposition, attachment;filename fileName); downloadService.log(user.getId(), infoId, 0); FileInputStream fis new FileInputStream(file); // 流復制寫入response.getOutputStream() }邏輯說明第一步取Session用戶第二步校驗產(chǎn)權信息存在并且狀態(tài)是已公布第三步才是下載響應和記錄日志。參數(shù)說明infoId是產(chǎn)權表主鍵type傳0表示免費下載fileName經(jīng)過URLEncoder編碼否則中文文件名會在瀏覽器里變成亂碼或直接丟失。注意這里下載日志是下載前記錄好處是用戶流量已經(jīng)產(chǎn)生壞處是如果文件讀取失敗會留下一條不完整記錄實際項目里可以把寫日志放到流復制成功之后。4.2 付費下載有效租期判斷與過期重新支付付費下載的Controller核心邏輯只有一句話先查有效租期有就放行沒有就跳支付。這句話實現(xiàn)起來雖然不長但最容易出錯的地方在于「有效」二字的定義。有效租期必須同時滿足三個條件用戶ID匹配、產(chǎn)權ID匹配、到期時間晚于當前時間。條件缺一個都不能放行。GetMapping(/payDownload) public void payDownload(Integer infoId, HttpSession session, HttpServletResponse response) throws IOException { Yonghu user (Yonghu) session.getAttribute(loginUser); if (user null) { response.sendRedirect(/login); return; } DownloadLog log downloadService.findValidRent(user.getId(), infoId); if (log null) { response.sendRedirect(/pay?infoId infoId); return; } downloadService.countDownload(log.getId()); // 寫入文件流邏輯同免費下載 }邏輯說明findValidRent內(nèi)部執(zhí)行的就是第3章那段SQL查不到有效記錄就跳轉支付頁面生成訂單。這里有個細節(jié)跳轉支付的URL要帶上infoId支付成功后回調(diào)里要靠這個參數(shù)去定位產(chǎn)權記錄。參數(shù)說明countDownload是記錄用戶在租期內(nèi)總共下載了多少次方便管理員后續(xù)統(tǒng)計如果不想做這個統(tǒng)計這一行可以省掉。租期設計上還有一個容易被忽略的點到期時長的計算應該以支付成功時刻為起點而不是下單時刻。用戶可能下單后一直沒付款隔了兩天再付如果以下單時間計算租期就會白扣兩天。常見做法是支付成功回調(diào)落庫時取系統(tǒng)當前時間作為download_time再累加zujin_days天作為expire_time。4.3 支付回調(diào)與簽名校驗別把「管理員手動改狀態(tài)」當真方案付費下載要真正跑通支付回調(diào)是繞不開的。支付平臺在用戶付款成功后會往你配置的回調(diào)地址發(fā)一個異步通知你的代碼需要在通知里做兩件事驗簽和落庫。驗簽是為了確認這個請求真的來自支付平臺不是用戶偽造的落庫是把有效租期寫入download_log表寫完之后用戶才有點付費下載的權限。RequestMapping(/alipayNotify) ResponseBody public String alipayNotify(HttpServletRequest request) { String orderId request.getParameter(out_trade_no); String tradeStatus request.getParameter(trade_status); if (TRADE_SUCCESS.equals(tradeStatus) signVerified(request)) { downloadService.createRentByOrderId(orderId); return success; } return failure; }邏輯說明先判斷交易狀態(tài)再驗簽驗簽通過后把訂單轉換成租期記錄。參數(shù)說明out_trade_no是業(yè)務側下單時生成的唯一訂單號createRentByOrderId會根據(jù)訂單號找到對應的用戶和產(chǎn)權然后插入download_log并計算expire_time。返回success這個詞是給支付平臺看的約定字符串只有返回success它才停止重發(fā)通知返回其他任何內(nèi)容都會被當作處理失敗支付平臺會繼續(xù)重試。這里要特別強調(diào)項目zip里自帶的alipay_md5.asp等文件只能作為接口字段的參考文檔。真正在Java項目里接支付是用官方Java SDK發(fā)起下單請求、驗簽、接收異步通知而不是把這些asp文件放到Tomcat里跑。如果你只是本地復現(xiàn)項目也可以先用支付回調(diào)入口加一個測試模擬開關跳過真實支付流程——但要記得上線前必須關掉。5. 部署與避坑EclipseTomcatMySQL導入首跑的6條踩坑記錄5.1 項目導入與運行環(huán)境準備拿到zip解壓后建議先用Eclipse導入整個項目目錄選擇Existing Projects into Workspace而不是新建項目再拷代碼。導入后第一件事是打開項目屬性找到Java Compiler把JDK調(diào)整到1.8——這個項目推測是在JDK8時期開發(fā)的用太高版本編譯會報一些奇怪的類庫兼容問題。第二步給項目配置Tomcat運行時把項目加入Tomcat的Server列表里讓Eclipse知道去哪里找Servlet相關類庫。# 啟動前先確認端口占用Linux/macOS用 lsof -i:8080 # Windows用 netstat -ano | findstr 8080邏輯說明Tomcat默認端口是8080如果本機其他服務占用了這個端口Tomcat會在Eclipse里報端口被占用或啟動超時。參數(shù)說明如果確定要換端口去Tomcat的conf/server.xml里改Connector標簽的port屬性但不建議—后續(xù)所有前臺頁面的鏈接和回調(diào)地址都跟著變?nèi)菀茁└摹?.2 數(shù)據(jù)庫初始化與數(shù)據(jù)庫連接配置數(shù)據(jù)庫配置在Spring的jdbc配置文件里常見位置是resources目錄下屬性包括數(shù)據(jù)庫地址、用戶名、密碼和連接驅動。MySQL數(shù)據(jù)庫名需要和連接URL保持一致字符集必須指定utf8否則頁面顯示中文會是一堆問號。jdbc.urljdbc:mysql://localhost:3306/db_ssm?useUnicodetruecharacterEncodingutf8useSSLfalseserverTimezoneAsia/Shanghai jdbc.usernameroot jdbc.password123456邏輯說明characterEncodingutf8保證中文寫入和讀取不亂碼useSSLfalse是因為本機開發(fā)環(huán)境一般沒有配置SSL證書MySQL新版默認會嘗試動用SSL連接并報警告serverTimezoneAsia/Shanghai則專門解決MySQL 8的時區(qū)報錯“The server time zone value ?D1ú±ê×?ê±?? is unrecognized”。參數(shù)說明root和123456只是本地開發(fā)用的占位示意實際部署請換成獨立賬號并設強密碼。5.3 常見問題與排查記錄坑1解壓后看到src目錄下有4個asp文件以為下錯了項目現(xiàn)象alipay_md5.asp、alipay_function.asp、alipay_notify.asp、alipay_service.asp躺在項目源碼目錄里懷疑是混合代碼工程。原因這是從老ASP站遷移或參考文件拷貝殘留Tomcat不解析asp不影響Java運行。解決不用刪除把它們當接口字段參考就行真要接支付自己用JavaSDK重寫。如果看著礙眼把這四個文件移出項目源碼目錄也不會破壞編譯???Eclipse導入后大面積紅xjavax.servlet找不到現(xiàn)象項目樹里所有JSP文件、Controller文件都報“The superclass javax.servlet.http.HttpServlet was not found on the Java Build Path”。原因項目沒有引入Tomcat運行時Eclipse不知道去哪找Servlet和JSP相關的類。解決項目右鍵Build Path→Add Library→Server Runtime→選擇你配置好的Tomcat版本然后Clean一下項目重新編譯。注意這里不要加JRE目錄加的是Server運行時???啟動后登錄頁能開一提交就報數(shù)據(jù)庫ClassNotFoundException現(xiàn)象Tomcat控制臺打出一串找不到com.mysql.jdbc.Driver的異常。原因MySQL的JDBC驅動jar沒有放進項目的WEB-INF/lib或者放在但沒被部署到Tomcat的lib路徑。解決確認mysql-connector-java的jar存在于WEB-INF/lib下同時檢查項目Properties的Deployment Assembly里有沒有把lib目錄發(fā)布出去。驅動類名也要注意MySQL 8之后用com.mysql.cj.jdbc.Driver老版本才寫com.mysql.jdbc.Driver???下載文件名中文亂碼或者直接下載失敗現(xiàn)象點免費下載后瀏覽器彈出的文件名是亂碼有些直接變成一串加號。原因HttpServletResponse的Content-Disposition頭默認按ISO-8859-1解析中文文件名必須在代碼里做URL編碼。解決第4章代碼里用了URLEncoder.encode先編碼文件名再把加號替換成%20這種方式對Chrome、Firefox和Edge都兼容。如果你看到文件流里帶真實路徑基本可以確定是傳入的fileName參數(shù)傳成了完整磁盤路徑修正調(diào)用處???付費下載后回到頁面還是提示沒有下載權限現(xiàn)象支付都扣款成功了用戶再點下載仍然是「請先付費」。原因支付回調(diào)沒有成功寫入download_log或者寫入時expire_time比較的字段類型不對——最常見的是回調(diào)URL配置錯了支付平臺通知到另一個地址導致租期記錄永遠沒有落庫。解決先查download_log表看有沒有新增記錄沒有就看支付平臺回調(diào)日志核對notify地址和Controller映射是否一致有記錄但判斷失敗排查是否把過期時間存成了字符串導致和NOW()比較時數(shù)據(jù)庫做隱式轉換。大概率不是代碼邏輯問題而是回調(diào)鏈路沒通???員工登錄后臺看不到申報審核菜單現(xiàn)象員工賬號能登錄但功能菜單里只有個人資料申報審核入口消失。原因頁面用角色標識控制菜單渲染員工記錄的角色字段值和代碼里約定的角色常量不一致常見于初始化數(shù)據(jù)時少填了角色或者填寫了默認值。解決先查員工表對應記錄的role字段再去代碼里找到Session里存的角色變量名兩邊的字符串完全對應上。別在頁面里短接邏輯臨時把菜單顯示出來會繞過權限控制。6. 上線前的驗證清單與一處權限加固技巧6.1 驗證申報、審核、公布全鏈路我每次拿到這類系統(tǒng)都會先建一套完整流程走一遍確認狀態(tài)流轉沒有斷點。賬號準備三個一個注冊用戶、一個員工、一個管理員按表格順序操作步驟操作預期結果1新用戶注冊并登錄前臺跳轉首頁導航欄出現(xiàn)下載和申報入口2提交一條知識產(chǎn)權申報申報列表里顯示待審核狀態(tài)3員工登錄后臺查看待審核列表能看到剛提交的申報記錄4員工審核通過前臺搜索結果出現(xiàn)該知識產(chǎn)權5普通用戶搜索該知識產(chǎn)權能搜到且可進入詳情頁如果中間某一步卡住優(yōu)先檢查對應記錄的狀態(tài)字段值不要急著改代碼。絕大多數(shù)申報鏈路問題都出在狀態(tài)機沒走通而不是頁面邏輯壞了。6.2 驗證下載權限與租借時間邊界下載模塊的驗收要點在于「邊界」。免費下載要驗證未登錄攔截、已登錄直接下載付費下載要驗證未付費跳支付、付費后立即下載、過期后重新跳支付。我把租期設成1分鐘的測試數(shù)據(jù)在界面上盯到過期后看按鈕狀態(tài)是否變化是排查時間邏輯最有效的方式。6.3 給系統(tǒng)補一層統(tǒng)一登錄攔截對照一遍Controller清單之后如果確認沒有統(tǒng)一權限攔截我建議加一個最基礎的登錄攔截器避免用戶拼URL訪問后臺功能。public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest req, HttpServletResponse resp, Object handler) throws Exception { Object user req.getSession().getAttribute(loginUser); if (user null) { resp.sendRedirect(/login); return false; } return true; } }在Spring配置里注冊這個攔截器mvc:interceptors mvc:interceptor mvc:mapping path/user/**/ mvc:exclude-mapping path/user/login/ bean classcom.demo.interceptor.LoginInterceptor/ /mvc:interceptor /mvc:interceptors邏輯說明mapping配置了/user/**路徑凡是匹配的前臺請求都會先進這個攔截器exclude-mapping把登錄接口排除掉否則登錄頁面自己也進不了。參數(shù)說明如果你還要保護后臺員工路徑就再配一條/staff/**映射另外加一個管理員角色判斷。這套配置改動小、風險低能在不動業(yè)務代碼的情況下把「未登錄訪問」這個最大的權限漏洞堵上。以前我接這類老JavaWeb項目上來就開始改業(yè)務代碼結果被各種隱藏接口和權限漏洞折騰了一周。從那以后我每接手一套SSM系統(tǒng)第一件事永遠是先把Controller方法清單捋一遍再補統(tǒng)一登錄攔截然后再動其他業(yè)務代碼。這套知識產(chǎn)權管理系統(tǒng)的功能閉環(huán)已經(jīng)很清晰但入口權限值得你多看一眼。希望幫到你。本文還有配套的精品資源點擊獲取