node-resource-utils 0.0.0-stage → 1.1.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +35 -2
  3. package/lib/sync.js +121 -0
  4. package/package.json +14 -4
  5. package/resources/.cache/ref.b64 +1 -0
  6. package/resources/README.md +97 -0
  7. package/resources/_.env +6 -0
  8. package/resources/_.env.example +25 -0
  9. package/resources/_.gitignore +18 -0
  10. package/resources/_.lintstagedrc.json +9 -0
  11. package/resources/_.npmrc +5 -0
  12. package/resources/_.prettierrc +7 -0
  13. package/resources/commitlint.config.mjs +1 -0
  14. package/resources/content/docs/README.md +63 -0
  15. package/resources/content/docs/faq.md +107 -0
  16. package/resources/content/docs/features/_meta.json +5 -0
  17. package/resources/content/docs/features/ai.md +71 -0
  18. package/resources/content/docs/features/appearance.md +47 -0
  19. package/resources/content/docs/features/feedback.md +79 -0
  20. package/resources/content/docs/features/files.md +74 -0
  21. package/resources/content/docs/features/graph.md +66 -0
  22. package/resources/content/docs/features/inbox.md +61 -0
  23. package/resources/content/docs/guide/_meta.json +5 -0
  24. package/resources/content/docs/guide/account.md +76 -0
  25. package/resources/content/docs/guide/data.md +87 -0
  26. package/resources/content/docs/guide/navigation.md +81 -0
  27. package/resources/content/docs/guide/permissions.md +67 -0
  28. package/resources/content/docs/guide/system.md +92 -0
  29. package/resources/content/docs/quick-start.md +70 -0
  30. package/resources/content/docs/shortcuts.md +69 -0
  31. package/resources/eslint.config.mjs +17 -0
  32. package/resources/next-env.d.ts +6 -0
  33. package/resources/next.config.ts +13 -0
  34. package/resources/postcss.config.mjs +7 -0
  35. package/resources/prisma/org.config.ts +98 -0
  36. package/resources/prisma/schema.prisma +336 -0
  37. package/resources/prisma/seed.ts +721 -0
  38. package/resources/prisma/seedSafe.ts +347 -0
  39. package/resources/prisma.config.ts +14 -0
  40. package/resources/scripts/check-config.mjs +773 -0
  41. package/resources/scripts/lib/schema-graph.mjs +410 -0
  42. package/resources/scripts/patch-next-trace.mjs +86 -0
  43. package/resources/scripts/suggest-relations.mjs +105 -0
  44. package/resources/src/app/(admin)/ai/page.tsx +469 -0
  45. package/resources/src/app/(admin)/dashboard/page.tsx +260 -0
  46. package/resources/src/app/(admin)/demo/employees/page.tsx +508 -0
  47. package/resources/src/app/(admin)/demo/files/page.tsx +451 -0
  48. package/resources/src/app/(admin)/demo/loading/page.tsx +513 -0
  49. package/resources/src/app/(admin)/error.tsx +96 -0
  50. package/resources/src/app/(admin)/feedback/page.tsx +573 -0
  51. package/resources/src/app/(admin)/graph/page.tsx +1224 -0
  52. package/resources/src/app/(admin)/inbox/page.tsx +31 -0
  53. package/resources/src/app/(admin)/layout.tsx +58 -0
  54. package/resources/src/app/(admin)/loading.tsx +31 -0
  55. package/resources/src/app/(admin)/system/depts/page.tsx +415 -0
  56. package/resources/src/app/(admin)/system/logs/page.tsx +215 -0
  57. package/resources/src/app/(admin)/system/menus/page.tsx +403 -0
  58. package/resources/src/app/(admin)/system/roles/page.tsx +433 -0
  59. package/resources/src/app/(admin)/system/users/page.tsx +620 -0
  60. package/resources/src/app/api/account-recovery/route.ts +132 -0
  61. package/resources/src/app/api/ai/act/route.ts +70 -0
  62. package/resources/src/app/api/ai/ask/route.ts +82 -0
  63. package/resources/src/app/api/ai/chat/route.ts +404 -0
  64. package/resources/src/app/api/ai/report/route.ts +164 -0
  65. package/resources/src/app/api/auth/[...nextauth]/route.ts +3 -0
  66. package/resources/src/app/api/auth/change-password/route.ts +57 -0
  67. package/resources/src/app/api/auth/forgot/route.ts +98 -0
  68. package/resources/src/app/api/auth/register/route.ts +95 -0
  69. package/resources/src/app/api/auth/register-config/route.ts +51 -0
  70. package/resources/src/app/api/badges/route.ts +39 -0
  71. package/resources/src/app/api/depts/[id]/route.ts +145 -0
  72. package/resources/src/app/api/depts/route.ts +126 -0
  73. package/resources/src/app/api/docs/export/route.ts +87 -0
  74. package/resources/src/app/api/docs/parse/route.ts +57 -0
  75. package/resources/src/app/api/docs/search/route.ts +22 -0
  76. package/resources/src/app/api/employees/[id]/route.ts +147 -0
  77. package/resources/src/app/api/employees/export/route.ts +115 -0
  78. package/resources/src/app/api/employees/import/route.ts +205 -0
  79. package/resources/src/app/api/employees/route.ts +149 -0
  80. package/resources/src/app/api/export/route.ts +254 -0
  81. package/resources/src/app/api/favorites/route.ts +56 -0
  82. package/resources/src/app/api/feedback/ai/route.ts +31 -0
  83. package/resources/src/app/api/feedback/approve/route.ts +67 -0
  84. package/resources/src/app/api/feedback/report/route.ts +213 -0
  85. package/resources/src/app/api/feedback/route.ts +246 -0
  86. package/resources/src/app/api/files/[name]/route.ts +82 -0
  87. package/resources/src/app/api/graph/focus/route.ts +75 -0
  88. package/resources/src/app/api/graph/node/move/route.ts +48 -0
  89. package/resources/src/app/api/graph/node/route.ts +274 -0
  90. package/resources/src/app/api/graph/route.ts +272 -0
  91. package/resources/src/app/api/health/route.ts +11 -0
  92. package/resources/src/app/api/inbox/read/route.ts +36 -0
  93. package/resources/src/app/api/inbox/summary/route.ts +15 -0
  94. package/resources/src/app/api/logs/route.ts +82 -0
  95. package/resources/src/app/api/menus/[id]/route.ts +132 -0
  96. package/resources/src/app/api/menus/mine/route.ts +23 -0
  97. package/resources/src/app/api/menus/route.ts +89 -0
  98. package/resources/src/app/api/roles/[id]/menus/route.ts +73 -0
  99. package/resources/src/app/api/roles/[id]/route.ts +96 -0
  100. package/resources/src/app/api/roles/route.ts +114 -0
  101. package/resources/src/app/api/search/route.ts +22 -0
  102. package/resources/src/app/api/stats/route.ts +92 -0
  103. package/resources/src/app/api/upload/route.ts +38 -0
  104. package/resources/src/app/api/users/[id]/password/route.ts +55 -0
  105. package/resources/src/app/api/users/[id]/route.ts +145 -0
  106. package/resources/src/app/api/users/route.ts +153 -0
  107. package/resources/src/app/api/visits/route.ts +48 -0
  108. package/resources/src/app/change-password/ChangePasswordForm.tsx +174 -0
  109. package/resources/src/app/change-password/page.tsx +19 -0
  110. package/resources/src/app/docs/[[...slug]]/page.tsx +56 -0
  111. package/resources/src/app/docs/layout.tsx +34 -0
  112. package/resources/src/app/docs/loading.tsx +19 -0
  113. package/resources/src/app/docs/not-found.tsx +25 -0
  114. package/resources/src/app/forgot/page.tsx +392 -0
  115. package/resources/src/app/global-error.tsx +75 -0
  116. package/resources/src/app/globals.css +235 -0
  117. package/resources/src/app/layout.tsx +44 -0
  118. package/resources/src/app/login/page.tsx +267 -0
  119. package/resources/src/app/page.tsx +14 -0
  120. package/resources/src/app/register/page.tsx +237 -0
  121. package/resources/src/auth.ts +215 -0
  122. package/resources/src/components/AiPanel.tsx +970 -0
  123. package/resources/src/components/AuthContext.tsx +82 -0
  124. package/resources/src/components/DataTable.tsx +459 -0
  125. package/resources/src/components/EChart.tsx +140 -0
  126. package/resources/src/components/FeedbackAiModal.tsx +476 -0
  127. package/resources/src/components/FeedbackReportModal.tsx +479 -0
  128. package/resources/src/components/Markdown.tsx +532 -0
  129. package/resources/src/components/OntologyGraph.tsx +1196 -0
  130. package/resources/src/components/Providers.tsx +99 -0
  131. package/resources/src/components/VisitTracker.tsx +89 -0
  132. package/resources/src/components/admin/AdminShell.tsx +749 -0
  133. package/resources/src/components/admin/CountBadge.tsx +67 -0
  134. package/resources/src/components/admin/GlobalSearch.tsx +509 -0
  135. package/resources/src/components/admin/InboxBell.tsx +78 -0
  136. package/resources/src/components/admin/VisitStats.tsx +145 -0
  137. package/resources/src/components/admin/menu-icons.tsx +56 -0
  138. package/resources/src/components/ai/AiInputForm.tsx +351 -0
  139. package/resources/src/components/appearance/AppearanceDrawer.tsx +268 -0
  140. package/resources/src/components/appearance/AppearanceProvider.tsx +160 -0
  141. package/resources/src/components/docs/DocArticle.tsx +106 -0
  142. package/resources/src/components/docs/DocToc.tsx +100 -0
  143. package/resources/src/components/docs/DocsChrome.tsx +259 -0
  144. package/resources/src/components/docs/DocsHome.tsx +209 -0
  145. package/resources/src/components/docs/DocsSearch.tsx +365 -0
  146. package/resources/src/components/docs/docs.css +1458 -0
  147. package/resources/src/components/feedback/AsyncButton.tsx +108 -0
  148. package/resources/src/components/feedback/LoadingOverlay.tsx +125 -0
  149. package/resources/src/components/feedback/PressableCard.tsx +92 -0
  150. package/resources/src/components/feedback/README.md +97 -0
  151. package/resources/src/components/feedback/RouteProgress.tsx +108 -0
  152. package/resources/src/components/feedback/Skeleton.tsx +249 -0
  153. package/resources/src/components/feedback/StatCard.tsx +70 -0
  154. package/resources/src/components/feedback/TaskHint.tsx +153 -0
  155. package/resources/src/components/feedback/index.ts +93 -0
  156. package/resources/src/components/feedback/motion.css +204 -0
  157. package/resources/src/components/feedback/motion.ts +63 -0
  158. package/resources/src/components/feedback/useCountUp.ts +110 -0
  159. package/resources/src/components/feedback/usePending.ts +209 -0
  160. package/resources/src/components/feedback/useRowFlash.ts +40 -0
  161. package/resources/src/components/inbox/InboxView.tsx +409 -0
  162. package/resources/src/components/ui/button.tsx +35 -0
  163. package/resources/src/components/ui/card.tsx +37 -0
  164. package/resources/src/components/ui/input.tsx +19 -0
  165. package/resources/src/lib/ai.ts +310 -0
  166. package/resources/src/lib/aiContext.ts +357 -0
  167. package/resources/src/lib/aiForm.test.ts +191 -0
  168. package/resources/src/lib/aiForm.ts +532 -0
  169. package/resources/src/lib/aiFormTypes.ts +83 -0
  170. package/resources/src/lib/aiToken.ts +72 -0
  171. package/resources/src/lib/aiTools.ts +823 -0
  172. package/resources/src/lib/api.ts +160 -0
  173. package/resources/src/lib/appInfo.ts +128 -0
  174. package/resources/src/lib/appearance.ts +643 -0
  175. package/resources/src/lib/badge-count.ts +146 -0
  176. package/resources/src/lib/badges.test.ts +58 -0
  177. package/resources/src/lib/badges.ts +79 -0
  178. package/resources/src/lib/brand-mark.test.ts +87 -0
  179. package/resources/src/lib/brand-mark.ts +45 -0
  180. package/resources/src/lib/docs-shared.test.ts +148 -0
  181. package/resources/src/lib/docs-shared.ts +422 -0
  182. package/resources/src/lib/docs.ts +381 -0
  183. package/resources/src/lib/err-text.ts +21 -0
  184. package/resources/src/lib/excel.ts +152 -0
  185. package/resources/src/lib/favorite-path.ts +60 -0
  186. package/resources/src/lib/favorites.ts +59 -0
  187. package/resources/src/lib/features.ts +69 -0
  188. package/resources/src/lib/feedback-access.ts +17 -0
  189. package/resources/src/lib/feedbackAi.ts +1621 -0
  190. package/resources/src/lib/formRules.ts +76 -0
  191. package/resources/src/lib/format.ts +52 -0
  192. package/resources/src/lib/graph-cascade.ts +304 -0
  193. package/resources/src/lib/graph-focus.ts +301 -0
  194. package/resources/src/lib/graph-link.ts +17 -0
  195. package/resources/src/lib/graph-node-write.ts +150 -0
  196. package/resources/src/lib/graph-schema.ts +475 -0
  197. package/resources/src/lib/graph-scope.test.ts +46 -0
  198. package/resources/src/lib/graph-scope.ts +28 -0
  199. package/resources/src/lib/http.ts +157 -0
  200. package/resources/src/lib/inbox-types.ts +57 -0
  201. package/resources/src/lib/inbox.ts +55 -0
  202. package/resources/src/lib/menu-service.ts +204 -0
  203. package/resources/src/lib/notifications.ts +113 -0
  204. package/resources/src/lib/office.ts +531 -0
  205. package/resources/src/lib/ontology.ts +277 -0
  206. package/resources/src/lib/openaiCompat.ts +257 -0
  207. package/resources/src/lib/pending.ts +98 -0
  208. package/resources/src/lib/prisma.ts +30 -0
  209. package/resources/src/lib/rbac.test.ts +106 -0
  210. package/resources/src/lib/rbac.ts +185 -0
  211. package/resources/src/lib/search-data.ts +158 -0
  212. package/resources/src/lib/security-questions.ts +20 -0
  213. package/resources/src/lib/skin-theme.ts +155 -0
  214. package/resources/src/lib/system-config.ts +55 -0
  215. package/resources/src/lib/theme.ts +96 -0
  216. package/resources/src/lib/todos/feedback.ts +86 -0
  217. package/resources/src/lib/todos/index.ts +73 -0
  218. package/resources/src/lib/todos/types.ts +33 -0
  219. package/resources/src/lib/upload.ts +106 -0
  220. package/resources/src/lib/utils.test.ts +9 -0
  221. package/resources/src/lib/utils.ts +6 -0
  222. package/resources/src/lib/validation.test.ts +297 -0
  223. package/resources/src/lib/validation.ts +658 -0
  224. package/resources/src/lib/visit-stats.ts +109 -0
  225. package/resources/src/lib/visits.ts +111 -0
  226. package/resources/src/lib/zodField.ts +44 -0
  227. package/resources/tsconfig.json +41 -0
  228. package/resources/vitest.config.ts +16 -0
  229. package/resources/vitest.setup.ts +1 -0
@@ -0,0 +1,87 @@
1
+ ---
2
+ title: 数据浏览、导入与导出
3
+ description: 列表查询、增删改查、Excel 导入导出的通用规则。
4
+ order: 4
5
+ tags: [数据, 列表, Excel, 导入, 导出]
6
+ updated: 2026-10-21
7
+ ---
8
+
9
+ 业务模块的列表页遵循同一套交互约定。学会一个模块,其它模块基本可以直接上手。
10
+
11
+ ## 列表页
12
+
13
+ 列表页通常包含搜索栏、操作按钮、表格和分页四部分。
14
+
15
+ - **搜索**:输入关键词后按回车或点「查询」,支持按名称、编号等常用字段匹配。
16
+ - **筛选**:下拉框和日期范围可以组合使用,条件之间是「并且」关系。
17
+ - **排序**:点击带排序箭头的表头,在升序、降序之间切换。
18
+ - **分页**:在表格右下角切换页码或每页条数。筛选条件会跟着翻页保持。
19
+
20
+ 没有结果时,先清空筛选条件再试;仍然为空可能是当前账号的数据范围只覆盖了部分部门。
21
+
22
+ ## 新增与编辑
23
+
24
+ 点「新增」会打开表单。带星号的字段必填,保存前会做一次校验:
25
+
26
+ - 编号、用户名这类字段通常要求唯一,重复会给出明确提示。
27
+ - 部门、角色等关联字段只能选择当前账号有权限的范围。
28
+ - 日期和金额会按页面提示的格式校验。
29
+
30
+ 编辑使用同一套表单。保存成功后列表会刷新,操作会写入操作日志。
31
+
32
+ ## 删除
33
+
34
+ 删除通常采用逻辑删除:数据从列表消失,但仍保留在数据库中,管理员可以在必要时追溯。
35
+
36
+ 删除前注意:
37
+
38
+ - 确认没有下级数据或关联数据仍在使用。
39
+ - 删除是不可逆的业务动作,附件和关联记录可能一并失效。
40
+ - 批量删除会逐条校验权限和数据范围,部分失败时会说明原因。
41
+
42
+ ## Excel 导入
43
+
44
+ 带「导入」按钮的模块支持 Excel 批量录入。
45
+
46
+ 标准流程:
47
+
48
+ 1. 点「导入」→「下载模板」,先拿到带表头和示例的模板。
49
+ 2. 按模板填写数据,不要修改表头文字、列顺序和 sheet 名称。
50
+ 3. 上传文件,系统会逐行校验并返回结果。
51
+ 4. 有错误的行会列出行号和原因,修正后可以只重新导入失败部分。
52
+
53
+ 常见校验失败原因:
54
+
55
+ | 提示 | 处理方式 |
56
+ | --- | --- |
57
+ | 必填项为空 | 补齐模板中的必填列 |
58
+ | 编号已存在 | 改为新编号,或走编辑而不是导入 |
59
+ | 部门不存在 | 先在部门管理里创建,或改成已存在的部门名称 |
60
+ | 日期格式不正确 | 使用 `YYYY-MM-DD`,避免合并单元格 |
61
+
62
+ 导入会逐条记录结果,成功和失败数量都会显示。文件较大时请等待页面提示完成,不要重复提交。
63
+
64
+ ## Excel 导出
65
+
66
+ 点「导出」会按**当前筛选条件**生成 Excel 文件;清空筛选后再导出即为全量数据。
67
+
68
+ - 导出范围同样受数据范围限制,不会带出无权查看的记录。
69
+ - 文件生成需要一点时间,数据量大时请等待下载开始。
70
+ - 如果导出的中文出现乱码,请使用 Excel 或 WPS 打开,不要用纯文本编辑器另存。
71
+ - 导出的列以页面配置为准,敏感字段(如密码哈希、密保答案)不会出现在导出文件里。
72
+
73
+ ## 文件与附件
74
+
75
+ 部分表单支持上传附件。附件会保存在系统的上传目录中,下载时同样校验权限:
76
+
77
+ - 只能下载自己有权访问的记录所关联的附件。
78
+ - 文件名会做安全处理,避免路径穿越和特殊字符问题。
79
+ - 单个文件大小和类型以页面提示为准,超限会直接拒绝。
80
+
81
+ 更完整的文件说明见 [文件与文档处理](/docs/features/files)。
82
+
83
+ ## 操作日志
84
+
85
+ 所有新增、修改、删除、导入、导出都会写入操作日志。管理员可以在「系统管理 → 操作日志」按模块、操作人、时间和结果检索。
86
+
87
+ 日志只记录操作结果和摘要,不保存完整密码或敏感内容。发现数据异常时,日志通常是定位问题的第一手材料。
@@ -0,0 +1,81 @@
1
+ ---
2
+ title: 界面与导航
3
+ description: 侧边栏、面包屑、收藏、全局搜索与红点提示。
4
+ order: 2
5
+ tags: [界面, 导航, 搜索]
6
+ updated: 2026-10-21
7
+ ---
8
+
9
+ 后台采用「侧边栏 + 顶栏 + 内容区」的经典布局。熟悉下面几个入口,日常操作会快很多。
10
+
11
+ ## 侧边栏
12
+
13
+ 侧边栏按业务模块分组,只显示当前账号有权限访问的菜单。
14
+
15
+ - 点击顶栏左侧的折叠按钮可以收起侧边栏,只保留图标;鼠标悬停可查看菜单名。
16
+ - 当前所在页面会高亮,所在分组自动展开。
17
+ - 分组下的菜单全部不可见时,分组本身也不会显示。
18
+ - 菜单右侧的红点数字表示待处理或未读数量;折叠状态下数字会压到图标右上角。
19
+
20
+ ## 面包屑
21
+
22
+ 面包屑显示「工作台 / 分组 / 当前页面」。点击任意一级可以返回,适合从深层页面快速退回。
23
+
24
+ ## 我的常用
25
+
26
+ 每个页面右上角有一个星标:
27
+
28
+ 1. 进入页面后点击星标,页面会出现在侧边栏顶部的「我的常用」。
29
+ 2. 再次点击取消收藏。
30
+ 3. 最多收藏 8 个页面,超出时会提示先移除一个。
31
+
32
+ 收藏保存的是页面地址,不是菜单编号。因此菜单改名、权限收回或模块关闭后,收藏会自动跟随,不会出现点进去是空页面的情况。
33
+
34
+ ## 全局搜索
35
+
36
+ 按 `Ctrl K`(macOS 为 `⌘ K`)打开全局搜索,或在顶栏点击搜索框。
37
+
38
+ 搜索结果分两类:
39
+
40
+ - **功能**:来自菜单树,匹配菜单名、别名和路径。目录也能搜到,会跳到它的第一个页面。
41
+ - **数据**:在当前账号权限范围内检索业务记录,权限过滤在服务端完成。
42
+
43
+ 输入多个关键词时用空格分隔,系统按「全部命中」处理。例如「张三 请假」只返回同时匹配两个词的结果。
44
+
45
+ 支持键盘操作:
46
+
47
+ | 按键 | 作用 |
48
+ | --- | --- |
49
+ | `↑` / `↓` | 在结果之间移动 |
50
+ | `Enter` | 打开当前选中项 |
51
+ | `Esc` | 关闭搜索 |
52
+
53
+ 更多快捷键见 [快捷键与搜索](/docs/shortcuts)。
54
+
55
+ ## 顶栏待办与消息
56
+
57
+ 顶栏右侧的**铃铛**汇总所有模块的待办和未读消息,点开后进入「待办与消息」页:
58
+
59
+ - 待办来自各业务模块,处理完成后自动消失。
60
+ - 消息是站内通知,点击即标记已读,支持「全部已读」。
61
+ - 待办和消息都能深链到具体业务页面,不需要自己再找。
62
+
63
+ 详细说明见 [待办与消息](/docs/features/inbox)。
64
+
65
+ ## 顶栏外观入口
66
+
67
+ 顶栏右侧的**调色板**图标(或头像菜单里的「外观设置」)可以换皮肤、调字体大小,改完立即生效。三套皮肤(原版 / 简洁 / 炫酷)与四档字号只影响观感,不影响功能与权限;设置存在本机浏览器里,换设备不跟随。详见「功能模块 → 外观设置」。
68
+
69
+ ## 顶栏帮助入口
70
+
71
+ 顶栏右侧的「?」会打开独立的帮助文档站,新标签页展示,不会顶掉当前业务页面。文档站里有完整的操作说明、搜索和常见问题。
72
+
73
+ ## 功能开关与权限
74
+
75
+ 看不到某个模块时,按下面顺序排查:
76
+
77
+ 1. **角色权限**:管理员是否给你的角色勾选了该菜单。
78
+ 2. **功能开关**:该模块是否被管理员在系统配置中关闭。
79
+ 3. **直接地址**:部分模块关闭后不会出现在菜单里,直接输入地址也不应绕过权限设计。
80
+
81
+ 权限调整后通常需要重新登录才能生效,因为登录时会把权限集合写入会话。具体见 [角色与权限](/docs/guide/permissions)。
@@ -0,0 +1,67 @@
1
+ ---
2
+ title: 角色与权限
3
+ description: 菜单权限、按钮权限与数据范围,以及看不到菜单时怎么排查。
4
+ order: 3
5
+ tags: [权限, 角色, 数据范围]
6
+ updated: 2026-10-21
7
+ ---
8
+
9
+ 系统采用「用户 → 角色 → 权限」的 RBAC 模型,同时叠加一层「数据范围」控制能看见哪些行。
10
+
11
+ ## 三个概念
12
+
13
+ | 概念 | 作用 |
14
+ | --- | --- |
15
+ | 用户 | 登录系统的账号,一个用户可以拥有多个角色 |
16
+ | 角色 | 一组权限的集合,例如「系统管理员」「普通员工」 |
17
+ | 权限 | 菜单访问权、按钮操作权,以及数据范围 |
18
+
19
+ 超级管理员是特殊账号,不受菜单权限限制,始终拥有全部数据和全部功能。
20
+
21
+ ## 菜单权限
22
+
23
+ 管理员在「系统管理 → 角色管理」里为角色勾选菜单。勾选后:
24
+
25
+ - 该角色下的用户能在侧边栏看到并进入对应页面。
26
+ - 父目录会自动出现;只勾选子菜单、不勾选父目录也能正常显示。
27
+ - 取消勾选后,菜单、面包屑、全局搜索和收藏入口会一起消失。
28
+
29
+ 按钮级权限(新增、编辑、删除、重置密码等)与菜单权限一起配置。没有按钮权限时,页面上对应的按钮不会出现;即使绕过界面直接调用接口,服务端也会拒绝。
30
+
31
+ ## 数据范围
32
+
33
+ 菜单权限决定「能不能进这个页面」,数据范围决定「进去能看见哪些行」。系统提供四档:
34
+
35
+ | 档位 | 可见范围 | 典型场景 |
36
+ | --- | --- | --- |
37
+ | 全部 | 所有部门的数据 | 系统管理员、全局统计岗 |
38
+ | 本部门及下级 | 本人部门 + 全部下级部门 | 部门负责人 |
39
+ | 本部门 | 仅本人所在部门 | 科室主管 |
40
+ | 仅本人 | 仅自己创建或负责的数据 | 普通员工 |
41
+
42
+ 一个用户有多个角色时,数据范围取**最宽**的一档;超级管理员恒为「全部」。
43
+
44
+ 数据范围的过滤在服务端完成。全局搜索、列表、导出、统计和图谱都使用同一套规则,因此不会出现「列表看不到、搜索能搜到」的越权问题。
45
+
46
+ ## 功能开关
47
+
48
+ 部分模块有独立的功能开关,例如 AI 能力、知识图谱、文件中心、问题反馈和部门管理。开关关闭后:
49
+
50
+ - 模块从侧边栏、面包屑、全局搜索和统计中一起移除。
51
+ - 菜单管理里仍然保留配置,重新打开后自动恢复。
52
+ - 开关不是权限,不能代替角色授权。
53
+
54
+ ## 看不到菜单时的排查步骤
55
+
56
+ 1. 确认当前登录的是自己的账号,而不是浏览器里残留的其它账号。
57
+ 2. 联系管理员检查角色是否勾选了对应菜单和按钮。
58
+ 3. 确认该模块的功能开关是否开启。
59
+ 4. 权限调整后退出并重新登录,让新权限进入会话。
60
+ 5. 仍然看不到时,把菜单名、账号和页面地址一起提交到问题反馈。
61
+
62
+ ## 安全约定
63
+
64
+ - 所有写操作都会校验当前用户的权限和数据范围。
65
+ - 删除、导入、重置密码等敏感操作会写入操作日志。
66
+ - 导出文件同样受数据范围限制,不能通过导出拿到界面上看不到的数据。
67
+ - 管理员清理日志、修改角色等操作也会被记录,避免权限被滥用后无从追溯。
@@ -0,0 +1,92 @@
1
+ ---
2
+ title: 组织、用户与菜单维护
3
+ description: 管理员如何维护部门、账号、角色、菜单与操作日志。
4
+ order: 5
5
+ tags: [管理员, 组织, 用户, 菜单, 日志]
6
+ updated: 2026-10-23
7
+ ---
8
+
9
+ 这一章面向管理员。普通用户只需要了解 [角色与权限](/docs/guide/permissions) 中「为什么看不到菜单」的部分。
10
+
11
+ ## 部门管理
12
+
13
+ 部门是一棵树,支持多级。维护时注意:
14
+
15
+ - 部门编码必须唯一,建议使用简短的英文或数字编码。
16
+ - 上级部门决定层级关系;调整上级部门会连带影响该部门及下级的数据范围。
17
+ - 停用部门不会自动停用其下的账号,需要单独处理。
18
+ - 删除部门前先确认没有用户和业务数据仍关联,否则会提示冲突。
19
+
20
+ 人员通常分配在**叶子部门**(没有下级的部门)。中间层部门主要用于汇总统计。
21
+
22
+ ## 用户管理
23
+
24
+ 用户列表支持按用户名、姓名、部门和状态筛选。
25
+
26
+ 常用操作:
27
+
28
+ | 操作 | 说明 |
29
+ | --- | --- |
30
+ | 新增用户 | 设置用户名、姓名、初始密码、部门和角色;可同时设置密保问题 |
31
+ | 编辑 | 修改姓名、联系方式、部门和角色;用户名通常不允许随意修改 |
32
+ | 重置密码 | 生成临时密码,并要求用户下次登录时修改 |
33
+ | 停用 / 启用 | 停用后无法登录,历史数据保留 |
34
+ | 删除 | 逻辑删除,账号从列表消失,历史操作日志仍可追溯 |
35
+
36
+ 管理员无法查看用户密码明文,只能重置。密保答案同样只存哈希。
37
+
38
+ ### 注册开关(仅超级管理员)
39
+
40
+ 用户管理页顶部的「注册设置」控制访客能否自助注册:
41
+
42
+ - **关闭(默认)**:登录页不显示注册入口,账号只能由管理员在用户管理里创建。
43
+ - **开放**:登录页出现「注册账号」入口,任何人可自助开通账号;同一 IP 10 分钟内最多注册 5 个。
44
+
45
+ 自助注册的账号是「裸账号」:启用、无部门、无角色、非超管,需要管理员补配角色后才能使用功能。开关切换会记入操作日志;临时关闭注册不影响已注册账号的登录。
46
+
47
+ ## 角色管理
48
+
49
+ 一个角色由三部分组成:
50
+
51
+ 1. **菜单权限**:能进入哪些页面。
52
+ 2. **按钮权限**:在页面里能执行哪些动作。
53
+ 3. **数据范围**:能看见哪些部门、哪些人的数据。
54
+
55
+ 给角色授权时,建议按「最小可用」原则:只勾选完成工作必需的菜单和按钮,不要为了方便直接给全部权限。
56
+
57
+ 修改角色权限后,相关用户需要重新登录才会拿到新的权限集合。
58
+
59
+ ## 菜单管理
60
+
61
+ 菜单树同时承担三件事:侧边栏导航、全局搜索索引、角色授权清单。因此新增业务模块时,登记菜单是必须动作。
62
+
63
+ 一个菜单节点包含:
64
+
65
+ | 字段 | 说明 |
66
+ | --- | --- |
67
+ | 名称 | 侧边栏与搜索结果里的显示名 |
68
+ | 路径 | 页面地址,必须以 `/` 开头;目录可以为空 |
69
+ | 类型 | 目录 / 菜单 / 按钮;按钮不出现在侧边栏 |
70
+ | 权限码 | 用于服务端和前端按钮鉴权,建议按 `模块:资源:动作` 命名 |
71
+ | 关键词 | 全局搜索别名,用户口头怎么叫就写什么 |
72
+ | 排序 | 同级菜单从小到大的显示顺序 |
73
+ | 隐藏 | 勾选后菜单不显示,但页面仍可通过地址访问 |
74
+ | 徽标 | 绑定待办 / 未读计数源,在菜单右侧显示数字 |
75
+
76
+ 新增模块的正确顺序是:先建页面和接口,再登记菜单并授权,最后补充帮助文档。菜单登记后,侧边栏、面包屑、全局搜索和角色授权抽屉会自动出现,不需要再改其它代码。
77
+
78
+ ## 操作日志
79
+
80
+ 操作日志记录所有写操作,包括登录、增删改、导入导出、密码重置和权限调整。
81
+
82
+ - 支持按模块、操作人、动作、时间范围和结果筛选。
83
+ - 详情里保存操作摘要,例如修改前后变化、导入成功数量。
84
+ - 日志主要用于审计和排障,不建议作为业务报表使用。
85
+ - 清空日志是不可逆操作,只应在确认已备份后执行。
86
+
87
+ ## 维护建议
88
+
89
+ - 定期检查长期未登录的账号,及时停用。
90
+ - 角色数量保持精简,优先通过数据范围而不是复制角色来区分权限。
91
+ - 菜单改名时同步更新关键词,否则用户用旧叫法会搜不到。
92
+ - 新增或调整功能后,同步更新帮助文档对应页面。
@@ -0,0 +1,70 @@
1
+ ---
2
+ title: 快速开始
3
+ description: 三分钟完成登录、认识界面分区,并走通一次完整的业务操作。
4
+ order: 1
5
+ tags: [入门, 登录, 界面]
6
+ updated: 2026-10-21
7
+ ---
8
+
9
+ 第一次使用本系统,建议按下面的顺序走一遍。全部读完大约三分钟,之后就可以按菜单直接开始工作。
10
+
11
+ ## 第一步:登录系统
12
+
13
+ 打开系统地址后会进入登录页,使用管理员分配的账号和密码登录。
14
+
15
+ - 首次登录后建议立即修改初始密码,见 [账号与登录](/docs/guide/account)。
16
+ - 如果管理员重置过你的密码,系统会强制你先设置新密码,再进入后台。
17
+ - 忘记密码时,可以在登录页走「忘记密码」流程,通过密保问题或账号申诉找回。
18
+
19
+ 登录成功后默认进入**工作台**。工作台展示当前业务最关心的统计指标和最近操作,方便一眼判断今天要处理什么。
20
+
21
+ ## 第二步:认识主界面
22
+
23
+ 后台主界面分为四个区域:
24
+
25
+ | 区域 | 位置 | 主要用途 |
26
+ | --- | --- | --- |
27
+ | 侧边栏 | 左侧 | 按业务模块组织的功能入口,可折叠 |
28
+ | 顶栏 | 顶部 | 全局搜索、帮助文档、当前账号与退出 |
29
+ | 面包屑 | 顶栏左侧 | 显示当前位置,点击可回到上级 |
30
+ | 内容区 | 中央 | 当前页面的列表、表单或看板 |
31
+
32
+ 侧边栏里的分组就是功能分类。看不到某个菜单时,通常是角色权限没有勾选,或该模块被管理员关闭了功能开关,可以联系管理员确认。
33
+
34
+ ## 第三步:找到你要用的功能
35
+
36
+ 有四种方式可以快速到达目标页面:
37
+
38
+ 1. **全局搜索**:按 `Ctrl K`(macOS 为 `⌘ K`),输入功能名或口头叫法,例如「请假」「员工」「日志」。功能结果在前,业务数据在后。
39
+ 2. **我的常用**:进入任意页面后,点顶栏的星标即可收藏;收藏会固定在侧边栏顶部。
40
+ 3. **待办与消息**:点顶栏铃铛,集中查看各模块的待处理事项和站内消息。
41
+ 4. **帮助文档**:点顶栏的「?」或侧边栏的「帮助文档」,进入文档站查看操作说明。
42
+
43
+ 更多搜索技巧见 [快捷键与搜索](/docs/shortcuts)。
44
+
45
+ ## 第四步:走通一次典型操作
46
+
47
+ 以带增删改查的列表页为例,一次完整的操作通常是:
48
+
49
+ 1. 在左侧菜单进入列表页。
50
+ 2. 用搜索框、筛选条件或分页找到目标数据。
51
+ 3. 点「新增」填写表单,或点行内「编辑」修改已有记录。
52
+ 4. 需要批量处理时,使用页面提供的导入 / 导出按钮。
53
+ 5. 删除前确认影响范围,删除动作会写入操作日志。
54
+
55
+ 所有新增、修改、删除都会记入**操作日志**,管理员可以在「系统管理 → 操作日志」里按模块、操作人或时间检索。
56
+
57
+ ## 第五步:遇到问题时
58
+
59
+ - 先在本帮助中心搜索关键词,多数操作问题都能在 [使用指南](/docs/guide/navigation) 或 [常见问题](/docs/faq) 中找到答案。
60
+ - 文档没有覆盖的问题,到「问题反馈」提交,附上页面路径和截图,管理员处理后会在反馈页回复。
61
+ - 涉及账号锁定、权限缺失、数据异常这类需要管理员操作的问题,也可以在反馈中说明,处理会更集中。
62
+
63
+ ## 接下来读什么
64
+
65
+ - [账号与登录](/docs/guide/account):改密码、忘记密码、账号状态。
66
+ - [界面与导航](/docs/guide/navigation):菜单、收藏、搜索、徽标。
67
+ - [待办与消息](/docs/features/inbox):跨模块待办与站内通知。
68
+ - [角色与权限](/docs/guide/permissions):为什么有些菜单看不到。
69
+ - [数据浏览、导入与导出](/docs/guide/data):列表操作与 Excel 使用。
70
+ - [常见问题](/docs/faq):按现象快速定位。
@@ -0,0 +1,69 @@
1
+ ---
2
+ title: 快捷键与搜索技巧
3
+ description: 全局搜索、文档搜索与常用键盘操作。
4
+ order: 80
5
+ tags: [快捷键, 搜索, 效率]
6
+ updated: 2026-10-21
7
+ ---
8
+
9
+ ## 全局快捷键
10
+
11
+ | 快捷键 | 作用 | 适用范围 |
12
+ | --- | --- | --- |
13
+ | `Ctrl K` / `⌘ K` | 打开全局搜索(后台)或文档搜索(文档站) | 全站 |
14
+ | `↑` / `↓` | 在搜索结果中移动 | 搜索弹窗 |
15
+ | `Enter` | 打开当前选中结果 | 搜索弹窗 |
16
+ | `Esc` | 关闭搜索或弹窗 | 全站 |
17
+ | `Ctrl Shift K` | 清空当前输入框(部分浏览器) | 浏览器级 |
18
+
19
+ > 搜索弹窗打开后输入框自动获得焦点,不需要再用鼠标点击。
20
+
21
+ ## 全局搜索技巧
22
+
23
+ 搜索同时覆盖「功能」和「数据」两层:
24
+
25
+ 1. **功能层**:菜单名、别名、路径。搜「请假」「休假」「考勤」都能命中同一个模块。
26
+ 2. **数据层**:当前权限范围内的业务记录,按标题、编号、姓名等字段匹配。
27
+
28
+ 提高命中率的方法:
29
+
30
+ - 多个关键词用空格分隔,系统按全部命中处理。例如「张三 请假」。
31
+ - 中文、英文和数字都可以混用。
32
+ - 搜不到时换用更短的关键词,或改用列表页的筛选条件。
33
+ - 目录也能搜到,结果会跳到该目录下的第一个页面。
34
+
35
+ ## 文档站快捷键
36
+
37
+ | 快捷键 | 作用 |
38
+ | --- | --- |
39
+ | `Ctrl K` / `⌘ K` | 打开文档搜索 |
40
+ | `↑` / `↓` | 在搜索结果中移动 |
41
+ | `Enter` | 打开选中的文档 |
42
+ | `Esc` | 关闭搜索 |
43
+
44
+ 阅读文档时:
45
+
46
+ - 点击标题左侧的 `#` 可以复制该小节的锚点链接,直接分享给同事。
47
+ - 代码块右上角的「复制」按钮可以复制整段代码。
48
+ - 右侧目录会跟随滚动高亮当前小节。
49
+
50
+ ## 收藏
51
+
52
+ - 页面右上角的星标用于收藏 / 取消收藏。
53
+ - 收藏会出现在侧边栏顶部的「我的常用」,最多 8 个。
54
+ - 收藏跟随页面地址和权限,不会绕过菜单授权。
55
+
56
+ ## 侧边栏
57
+
58
+ | 操作 | 作用 |
59
+ | --- | --- |
60
+ | 点击顶栏左侧折叠按钮 | 收起 / 展开侧边栏 |
61
+ | 悬停折叠后的图标 | 查看菜单名称 |
62
+ | 点击分组标题 | 展开 / 收起分组 |
63
+ | 查看菜单右侧数字 | 待处理或未读数量 |
64
+
65
+ ## 浏览器建议
66
+
67
+ - 使用 Chrome、Edge 或 Firefox 的较新版本。
68
+ - 不要使用 IE 兼容模式或老旧内核浏览器,部分表格和图表可能无法正常显示。
69
+ - 在公共电脑上使用完毕后,点右上角头像 →「退出登录」。
@@ -0,0 +1,17 @@
1
+ import { dirname } from 'node:path';
2
+ import { fileURLToPath } from 'node:url';
3
+ import { FlatCompat } from '@eslint/eslintrc';
4
+
5
+ const __filename = fileURLToPath(import.meta.url);
6
+ const __dirname = dirname(__filename);
7
+ const compat = new FlatCompat({ baseDirectory: __dirname });
8
+
9
+ export default [
10
+ ...compat.extends('next/core-web-vitals', 'next/typescript'),
11
+ {
12
+ // next-env.d.ts 由 Next 每次构建时自动重写,里面的三斜线引用不归我们管。
13
+ // 不排除的话 `npm run lint` 会稳定报一条 triple-slash-reference 错误,
14
+ // 而这条错误谁都不该去"修"(改了下次构建又被覆盖)。
15
+ ignores: ['.next/**', 'node_modules/**', 'out/**', 'next-env.d.ts'],
16
+ },
17
+ ];
@@ -0,0 +1,6 @@
1
+ /// <reference types="next" />
2
+ /// <reference types="next/image-types/global" />
3
+ /// <reference path="./.next/types/routes.d.ts" />
4
+
5
+ // NOTE: This file should not be edited
6
+ // see https://nextjs.org/docs/app/api-reference/config/typescript for more information.
@@ -0,0 +1,13 @@
1
+ import type { NextConfig } from 'next';
2
+
3
+ const nextConfig: NextConfig = {
4
+ // 内网部署常用:允许局域网访问 dev server
5
+ // devIndicators: false,
6
+ eslint: { ignoreDuringBuilds: false },
7
+ typescript: { ignoreBuildErrors: false },
8
+ experimental: {
9
+ // 内网环境关闭遥测
10
+ },
11
+ };
12
+
13
+ export default nextConfig;
@@ -0,0 +1,7 @@
1
+ const config = {
2
+ plugins: {
3
+ '@tailwindcss/postcss': {},
4
+ },
5
+ };
6
+
7
+ export default config;
@@ -0,0 +1,98 @@
1
+ /**
2
+ * 组织架构配置 —— 比赛时**只改这个文件**。
3
+ *
4
+ * ## 为什么单独抽出来
5
+ *
6
+ * 题目里的**部门由题意决定,一个字都不能编**;而人员姓名可以随便造。
7
+ * 以前部门写死在 seed.ts 里(HQ / 技术部 / 市场部 / 人力资源部),
8
+ * 一跑 seed 就把这 4 个题目外部门塞进「部门管理」,人员也全被分到这三个部门,
9
+ * 题目要的部门里一个人都没有 —— 评委点开就能看出是模板数据。
10
+ *
11
+ * 现在把「部门」和「人员」解耦:
12
+ * - 部门树在本文件 ORG_TREE 里声明(唯一来源,改了重跑 seed 即生效)
13
+ * - 人员数量由 PEOPLE_TOTAL 决定,seed 自动按**叶子部门**均衡铺满
14
+ * - 人数不够时以「每部门保底 PEOPLE_MIN_PER_DEPT 人」为准自动扩容
15
+ *
16
+ * ## 两种工作流,二选一
17
+ *
18
+ * ### ① 配置驱动(默认,推荐)—— 部门写在下面
19
+ * 把 ORG_TREE 换成题目给的部门树,然后 `npm run db:reset`。
20
+ * code 是 upsert 主键,自己定,全库唯一、之后别改(业务表按它找部门)。
21
+ *
22
+ * ### ② 库里现有(ORG_SOURCE = 'existing')—— 部门已在界面里录好
23
+ * 如果你已经在「系统管理 → 部门管理」把题目部门手工建完了,
24
+ * 把 ORG_SOURCE 改成 'existing':seed **完全不碰部门表**,
25
+ * 只按库里现有的叶子部门铺人员。适合「先录组织、再补数据」的节奏。
26
+ *
27
+ * ## 注意
28
+ *
29
+ * - 改了部门树之后要 `npm run db:reset`(或先清空部门表)。
30
+ * `db:seed` 只 upsert、不删旧数据,旧的 HQ/TECH/SALES/HR 会残留在库里。
31
+ * - 业务单据里的部门字段一律引用这里建出来的部门 id,不要再手写部门名。
32
+ */
33
+
34
+ /* ============================ 1. 部门来源 ============================ */
35
+
36
+ /**
37
+ * 'config' —— 按 ORG_TREE 建部门(默认)
38
+ * 'existing' —— 不碰部门表,直接用库里已有的部门铺人员
39
+ */
40
+ export const ORG_SOURCE: 'config' | 'existing' = 'config';
41
+
42
+ /* ============================ 2. 部门树 ============================ */
43
+
44
+ /** 部门树节点:code 全库唯一且稳定,children 递归嵌套 */
45
+ export interface OrgNode {
46
+ /** 部门编码,upsert 主键。建议用拼音首字母或短英文,如 BGS / CWK / CGK */
47
+ code: string;
48
+ /** 部门名称,必须与题意完全一致 */
49
+ name: string;
50
+ children?: OrgNode[];
51
+ }
52
+
53
+ /**
54
+ * ★★ 比赛时改这里 ★★
55
+ *
56
+ * 下面是骨架自带的通用组织(4 个部门),只作开箱演示。
57
+ * 题目给了部门清单就整段替换掉,层级照题目写:
58
+ *
59
+ * ```ts
60
+ * export const ORG_TREE: OrgNode[] = [
61
+ * {
62
+ * code: 'ROOT', name: 'XX单位',
63
+ * children: [
64
+ * { code: 'BGS', name: '办公室' },
65
+ * { code: 'CWK', name: '财务科' },
66
+ * { code: 'CGK', name: '车管科' },
67
+ * { code: 'HQK', name: '后勤保障科' },
68
+ * ],
69
+ * },
70
+ * ];
71
+ * ```
72
+ *
73
+ * 人员会被铺到**叶子部门**(没有下级的那些)。所以想让某个部门有人,
74
+ * 就把它写成叶子 —— 别只写在中间层。
75
+ */
76
+ export const ORG_TREE: OrgNode[] = [
77
+ {
78
+ code: 'HQ',
79
+ name: '总公司',
80
+ children: [
81
+ { code: 'TECH', name: '技术部' },
82
+ { code: 'SALES', name: '市场部' },
83
+ { code: 'HR', name: '人力资源部' },
84
+ ],
85
+ },
86
+ ];
87
+
88
+ /* ============================ 3. 人员规模 ============================ */
89
+
90
+ /** 名册总人数(不含 admin / zhangsan)。调大重跑 seed 会补新账号。 */
91
+ export const PEOPLE_TOTAL = 20;
92
+
93
+ /**
94
+ * 每个叶子部门的保底人数。
95
+ * 实际人数 = max(PEOPLE_TOTAL, 叶子部门数 × 本值) —— 保证没有空部门。
96
+ * 设 1 表示「每个部门至少有 1 个人」,设 0 则完全按总数均分(可能有的部门没人)。
97
+ */
98
+ export const PEOPLE_MIN_PER_DEPT = 2;