feat(admin): Add user management and upgrade to module permission system

Features - User Management (Phase 4.1):
- Database: Add user_modules table for fine-grained module permissions
- Database: Add 4 user permissions (view/create/edit/delete) to role_permissions
- Backend: UserService (780 lines) - CRUD with tenant isolation
- Backend: UserController + UserRoutes (648 lines) - 13 API endpoints
- Backend: Batch import users from Excel
- Frontend: UserListPage (412 lines) - list/filter/search/pagination
- Frontend: UserFormPage (341 lines) - create/edit with module config
- Frontend: UserDetailPage (393 lines) - details/tenant/module management
- Frontend: 3 modal components (592 lines) - import/assign/configure
- API: GET/POST/PUT/DELETE /api/admin/users/* endpoints

Architecture Upgrade - Module Permission System:
- Backend: Add getUserModules() method in auth.service
- Backend: Login API returns modules array in user object
- Frontend: AuthContext adds hasModule() method
- Frontend: Navigation filters modules based on user.modules
- Frontend: RouteGuard checks requiredModule instead of requiredVersion
- Frontend: Remove deprecated version-based permission system
- UX: Only show accessible modules in navigation (clean UI)
- UX: Smart redirect after login (avoid 403 for regular users)

Fixes:
- Fix UTF-8 encoding corruption in ~100 docs files
- Fix pageSize type conversion in userService (String to Number)
- Fix authUser undefined error in TopNavigation
- Fix login redirect logic with role-based access check
- Update Git commit guidelines v1.2 with UTF-8 safety rules

Database Changes:
- CREATE TABLE user_modules (user_id, tenant_id, module_code, is_enabled)
- ADD UNIQUE CONSTRAINT (user_id, tenant_id, module_code)
- INSERT 4 permissions + role assignments
- UPDATE PUBLIC tenant with 8 module subscriptions

Technical:
- Backend: 5 new files (~2400 lines)
- Frontend: 10 new files (~2500 lines)
- Docs: 1 development record + 2 status updates + 1 guideline update
- Total: ~4900 lines of code

Status: User management 100% complete, module permission system operational
This commit is contained in:
2026-01-16 13:42:10 +08:00
parent 98d862dbd4
commit 66255368b7
560 changed files with 70424 additions and 52353 deletions

View File

@@ -1,52 +1,59 @@
# **荳主次蝙句崟逧<EFBFBD>キョ霍?*
# **与原型图的差距**
<EFBFBD>。」逶ョ逧<EFBFBD>シ?菫ョ豁」蠑€蜿大ョ樒鴫謨域棡<E59F9F><EFBFBD>?17.png<6E>我ク惹コァ蜩∬ョセ隶。遞ソ<E9819E><EFBFBD>?18.png<6E>我ケ矩龍逧<E9BE8D><EFBFBD>ァ牙キョ霍晢シ梧署蜊<E7BDB2>コァ蜩∫イセ閾エ蠎ヲ縲?
莨伜<EFBFBD>郤ァ<EFBFBD><EFBFBD> High (P0) \- 蠖ア蜩崎ァ<EFBFBD>ァ我ス馴ェ檎噪譬ク蠢<EFBFBD>琉鬚?
## **1\. 諤サ菴灘ク<E78198>€荳朱龍霍?(Global Layout & Spacing)**
文档目的: 修正开发实现效果(图 17.png与产品设计稿图 18.png之间的视觉差距提升产品精致度。
优先级: High (P0) \- 影响视觉体验的核心问题
## **1\. 总体布局与间距 (Global Layout & Spacing)**
设计稿强调了清晰的层级和呼吸感,而实现版本的元素过于紧凑,导致界面显得拥挤。
隶セ隶。遞ソ蠑コ隹<EFBFBD><EFBFBD><EFBFBD>匆逧<EFBFBD>アらコァ蜥悟他蜷ク諢滂シ瑚€悟ョ樒鴫迚域悽逧<EFBFBD><EFBFBD><EFBFBD><EFBFBD>コ守エァ蜃托シ悟ッシ閾エ逡碁擇譏セ蠕玲凶謖、縲?
* **页面边距 (Page Margins):**
* **髣ョ鬚<EFBFBD>:** 螳樒鴫迚亥キヲ蜿ウ霎ケ霍昜シシ荵手ソ<E6898B><EFBFBD>シ域<EFBDBC>荳堺ク€閾エ<E996BE>会シ悟ッシ閾エ蜀<EFBDB4>ョケ雍エ霎ケ縲?
* **菫ョ謾ケ:** 蜈ィ螻€<C280>ョケ蛹コ蝓滂シ<E6BB82>ontainer<EFBFBD>臥噪蟾ヲ蜿ウ Padding €隕∫サ滉ク€<EFBFBD>悟サコ隶ョ隶セ鄂ョ荳コ 16px 謌?20px<EFBFBD>郁ッキ蜿り€<EFBFBD>ョセ隶。遞ソ蜈キ菴捺焚蛟シ<EFBFBD>会シ御ソ晄戟隗<EFBFBD>ァ牙ケウ陦。縲?
* **问题:** 实现版左右边距似乎过窄(或不一致),导致内容贴边。
* **修改:** 全局内容区域Container)的左右 Padding 需要统一,建议设置为 16px 20px(请参考设计稿具体数值),保持视觉平衡。
* **卡片/区块间距:**
* **髣ョ鬚<EFBFBD>:** 蛻苓。ィ鬘ケ謌門今迚<E4BB8A>ケ矩龍逧<E9BE8D>桙逶エ髣エ霍晁ソ<E69981>ー上€?
* **菫ョ謾ケ:** 蠅槫刈蜊。迚<EFBDA1>/蛻苓。ィ鬘ケ荵矩龍逧<E9BE8D> margin-bottom<6F>檎。ョ菫晏<E88FAB>螳ケ蝮嶺ケ矩龍譛画<E8AD9B>譏セ逧<EFBDBE>玄蛻<E78E84>€?
## **2\. 蟄嶺ス謎ク取賜迚?(Typography)**
* **问题:** 列表项或卡片之间的垂直间距过小。
* **修改:** 增加卡片/列表项之间的 margin-bottom确保内容块之间有明显的区分。
## **2\. 字体与排版 (Typography)**
这是造成视觉差异最大的部分。实现版本文字层级拉不开,重点不突出。
霑呎弍騾<EFBFBD>謌占ァ<EFBFBD>ァ牙キョ蠑よ怙螟ァ逧<EFBFBD>Κ<EFBFBD>€ょョ樒鴫迚域悽譁<EFBFBD>ュ怜アらコァ諡我ク榊シ€<EFBFBD>碁㍾轤ケ荳咲ェ∝<EFBFBD>縲?
* **标题文字 (Headings):**
* **髣ョ鬚<EFBFBD>:** 螳樒鴫迚育噪譬<E599AA>「伜ュ鈴㍾<E988B4><E38DBE>ont Weight<68>我ク崎カウ<EFBDB6>御ク泌ュ怜捷蜿ッ閭ス蛛丞ー上€?
* **菫ョ謾ケ:** 蜉<>螟ァ譬<EFBDA7>「伜ュ鈴㍾<E988B4>御スソ逕?font-weight: 600 (Semi-bold) 謌?bold縲ょセョ隹<EFBFBD>ュ怜捷螟ァ蟆擾シ檎。ョ菫昜ク手ョセ隶。遞ソ荳€閾エ縲?
* **问题:** 实现版的标题字重Font Weight不足且字号可能偏小。
* **修改:** 加大标题字重,使用 font-weight: 600 (Semi-bold) bold。微调字号大小,确保与设计稿一致。
* **正文/辅助文字 (Body/Secondary Text):**
* **髣ョ鬚<EFBFBD>:** 霎<>勧菫。諱ッ<E8ABB1>亥ヲよ律譛溘€<C280><E288B5>ュセ縲∵緒霑ー<E99C91>蛾「懆牡霑<E789A1>キア<EFBDB7>悟ッシ閾エ荳取<E88DB3><E58F96>「俶瓦螟コ隗<EFBDBA>コソ縲?
* **问题:** 辅助信息(如日期、标签、描述)颜色过深,导致与标题抢夺视线。
* **修改:**
* <EFBFBD>クサ隕∵枚蟄鈴「懆牡隹<EFBFBD>紛荳コ豺ア轣ー<EFBFBD>亥ヲ<EFBFBD> \#333333 謌?\#1F2937<EFBFBD>€?
* <EFBFBD><EFBFBD>勧譁<EFBFBD>ュ暦シ域ャ。隕∽ソ。諱ッ<EFBFBD>蛾「懆牡隹<EFBFBD>紛荳コ豬<EFBFBD><EFBFBD><EFBFBD>亥ヲ<EFBFBD> \#666666 謌?\#9CA3AF<EFBFBD>会シ梧級蠑€螻らコァ縲?
* 将主要文字颜色调整为深灰(如 \#333333 \#1F2937)。
* 将辅助文字(次要信息)颜色调整为浅灰(如 \#666666 \#9CA3AF),拉开层级。
* **行高 (Line Height):**
* **髣ョ鬚<EFBFBD>:** 螟夊。梧枚譛ャ逧<EFBDAC>。碁龍霍晁ソ<E69981><EFBFBD>シ碁<EFBDBC>隸サ菴馴ェ悟キョ縲?
* **菫ョ謾ケ:** 蠅槫刈 line-height<EFBFBD>悟サコ隶ョ隶セ鄂ョ荳コ蟄怜捷逧?1.4 閾?1.5 蛟阪€?
## **3\. 扈<>サカ荳手ァ<E6898B>ァ画<EFBDA7>キ蠑?(Components & Visual Styles)**
* **问题:** 多行文本的行间距过密,阅读体验差。
* **修改:** 增加 line-height,建议设置为字号的 1.4 1.5 倍。
## **3\. 组件与视觉样式 (Components & Visual Styles)**
* **圆角 (Border Radius):**
* **髣ョ鬚<EFBFBD>:** 螳樒鴫迚育噪謖蛾聴縲∝今迚<E4BB8A><E8BF9A>蝗セ迚<EFBDBE>噪蝨<E599AA>ァ堤恚襍キ譚・豈碑セ<E7A291><EFBFBD><EFBFBD><EFBFBD>怕隗呈焚蛟シ荳榊ッケ<EFBDAF>€?
* **菫ョ謾ケ:** 扈滉ク€<C280>ァ貞、ァ蟆上€ょヲよ棡隶セ隶。遞ソ譏?8px 謌?12px<EFBFBD>瑚ッキ遑ョ菫<EFBFBD> CSS 荳ュ荳・譬シ謇ァ陦鯉シ御ク崎ヲ∽スソ逕ィ鮟倩ョ、逧<EFBDA4>峩隗偵€?
* **髦エ蠖ア荳手セケ譯?(Shadows & Borders):**
* **髣ョ鬚<EFBFBD>:** 隶セ隶。遞ソ荳ュ蜿ッ閭ス霑千畑莠<E79591>スサ蠕ョ逧<EFBDAE>兜蠖ア譚・蠅槫刈遶倶ス捺─<E68DBA><EFBFBD><EFBFBD>スソ逕ィ莠<EFBDA8>栫扈<E6A0AB>噪蛻<E599AA>囈郤ソ<E983A4>€悟ョ樒鴫迚域悽蜿ッ閭ス荳「螟ア莠<EFBDB1>亢蠖ア<E8A096><EFBFBD><EFBFBD>セケ譯<EFBDB9>「懆牡霑<E789A1>キア縲?
* **问题:** 实现版的按钮、卡片或图片的圆角看起来比较直(或者圆角数值不对)。
* **修改:** 统一圆角大小。如果设计稿是 8px 12px,请确保 CSS 中严格执行,不要使用默认的直角。
* **阴影与边框 (Shadows & Borders):**
* **问题:** 设计稿中可能运用了轻微的投影来增加立体感,或者使用了极细的分隔线,而实现版本可能丢失了阴影,或者边框颜色过深。
* **修改:**
* 螯よ棡譏ッ蜊。迚<EFBFBD>ョセ隶。<EFBFBD>梧キサ蜉<EFBFBD>霓サ蠕ョ逧?box-shadow<EFBFBD>井セ句ヲ?0 2px 8px rgba(0,0,0,0.05)<EFBFBD>€?
* <EFBFBD>囈郤ソ鬚懆牡蠎疲峩豺。<EFBFBD>悟サコ隶ョ菴ソ逕?\#E5E7EB 謌也アサ莨シ譫∵オ<E288B5><EFBDB5>濶イ縲?
* 如果是卡片设计,添加轻微的 box-shadow(例如 0 2px 8px rgba(0,0,0,0.05))。
* 分隔线颜色应更淡,建议使用 \#E5E7EB 或类似极浅灰色。
* **图片/图标 (Images & Icons):**
* **髣ョ鬚<EFBFBD>:** 蝗セ迚<EFBDBE>ッ比セ句庄閭ス螟ア隹<EFBDB1>シ郁「ォ諡我シク謌門視郛ゥ<E9839B>会シ梧<EFBDBC><EFBFBD>崟譬<E5B49F>ス咲スョ譛ェ螻<EFBDAA>クュ蟇ケ鮨舌€?
* **问题:** 图片比例可能失调(被拉伸或压缩),或者图标位置未居中对齐。
* **修改:**
* 蝗セ迚<EFBFBD>ョセ鄂ョ object-fit: cover 髦イ豁「蜿伜ス「縲?
* €譟・蝗セ譬<EFBFBD>ク取枚蟄礼噪蝙ら峩蟇ケ鮨先婿蠑擾シ<EFBFBD>lex 蟶<>€荳倶スソ逕?align-items: center<EFBFBD>€?
* 图片设置 object-fit: cover 防止变形。
* 检查图标与文字的垂直对齐方式flex 布局下使用 align-items: center)。
## **4\. 导航与顶部栏 (Navigation/Header)**
* **迥カ諤∵<EFBFBD><EFBFBD>/鬘カ驛ィ譬?**
* **髣ョ鬚<EFBFBD>:** 鬘カ驛ィ譬冗噪鬮伜コヲ蜿ッ閭ス荳崎カウ<EFBDB6><EFBFBD><EFBFBD>レ譎ッ濶イ荳手ョセ隶。遞ソ譛芽牡蟾ョ縲?
* **菫ョ謾ケ:** 譬。鬪碁。カ驛ィ譬城ォ伜コヲ<EFBDBA><EFBDA6>eight<68>会シ檎。ョ菫晄<E88FAB><E69984>「俶枚蟄怜惠蝙ら峩譁ケ蜷醍サ晏ッケ螻<EFBDB9>クュ縲?
* **状态栏/顶部栏:**
* **问题:** 顶部栏的高度可能不足,或者背景色与设计稿有色差。
* **修改:** 校验顶部栏高度Height确保标题文字在垂直方向绝对居中。
### **修改建议总结 (Action Items for Engineers)**
1. **CSS 蜿倬㍼蛹?** 蟒コ隶ョ蟆<EFBFBD>ョセ隶。遞ソ荳ュ逧<EFBFBD>**荳サ濶イ縲∬セ<E288AC>牡縲∝ュ怜捷譬<E68DB7>㊥縲∝怕隗貞€?*螳壻ケ我ク?CSS 蜿倬㍼<E580AC><E38DBC>ariables<65>会シ碁∩蜈咲。ャ郛也<E9839B><E4B99F><EFBFBD>ard-coding<6E>会シ碁亟豁「荳堺ク€閾エ縲?
2. **Flexbox 蟇ケ鮨<EFBFBD>:** €譟・謇€譛牙<EFBFBD>陦ィ鬘ケ<EFBFBD>檎。ョ菫昜スソ逕?display: flex 蟷カ豁」遑ョ隶セ鄂?align-items: center<EFBFBD>瑚ァ」蜀ウ蝗セ譬<EFBFBD>ク取枚蟄礼噪鬮倅ス主キョ髣ョ鬚倥€?
3. **逶貞ュ先ィ。蝙区」€譟?** 謇灘シ€豬剰ァ亥勣蠑€蜿題€<E9A18C>キ・蜈キ<E89C88>€蝉クェ譬ク蟇ケ Padding 蜥?Margin 蛟シ<EFBFBD>御ク崎ヲ∝<EFBFBD>諢溯ァ我シー邂励€
1. **CSS 变量化:** 建议将设计稿中的**主色、辅色、字号标准、圆角值**定义为 CSS 变量Variables避免硬编码Hard-coding防止不一致。
2. **Flexbox 对齐:** 检查所有列表项,确保使用 display: flex 并正确设置 align-items: center,解决图标与文字的高低差问题。
3. **盒子模型检查:** 打开浏览器开发者工具,逐个核对 Padding Margin 值,不要凭感觉估算。