create-lumal-admin 0.0.4-beta → 0.0.6-beta

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 (185) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/README.md +98 -12
  3. package/dist/cli.d.ts +18 -1
  4. package/dist/cli.d.ts.map +1 -1
  5. package/dist/cli.js +308 -28
  6. package/dist/cli.js.map +1 -1
  7. package/dist/create.d.ts +11 -1
  8. package/dist/create.d.ts.map +1 -1
  9. package/dist/create.js +98 -2
  10. package/dist/create.js.map +1 -1
  11. package/dist/index.d.ts +2 -1
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +1 -0
  14. package/dist/index.js.map +1 -1
  15. package/dist/presets.d.ts +41 -0
  16. package/dist/presets.d.ts.map +1 -0
  17. package/dist/presets.js +58 -0
  18. package/dist/presets.js.map +1 -0
  19. package/dist/project-cli.d.ts +3 -0
  20. package/dist/project-cli.d.ts.map +1 -0
  21. package/dist/project-cli.js +13 -0
  22. package/dist/project-cli.js.map +1 -0
  23. package/dist/projects.d.ts +21 -0
  24. package/dist/projects.d.ts.map +1 -0
  25. package/dist/projects.js +124 -0
  26. package/dist/projects.js.map +1 -0
  27. package/dist/scaffold.d.ts +2 -11
  28. package/dist/scaffold.d.ts.map +1 -1
  29. package/dist/scaffold.js +2 -1602
  30. package/dist/scaffold.js.map +1 -1
  31. package/dist/templates.d.ts +7 -0
  32. package/dist/templates.d.ts.map +1 -0
  33. package/dist/templates.js +91 -0
  34. package/dist/templates.js.map +1 -0
  35. package/dist/types.d.ts +64 -0
  36. package/dist/types.d.ts.map +1 -0
  37. package/dist/types.js +2 -0
  38. package/dist/types.js.map +1 -0
  39. package/package.json +13 -4
  40. package/templates/base/.env.example +4 -0
  41. package/templates/base/API-CONTRACT.md +84 -0
  42. package/templates/base/README.md +59 -0
  43. package/templates/base/index.html +12 -0
  44. package/templates/base/package.json +38 -0
  45. package/templates/base/src/App.vue +206 -0
  46. package/templates/base/src/app/components/AppHeaderActions.vue +46 -0
  47. package/templates/base/src/app/components/AppSettingsDrawer.vue +37 -0
  48. package/templates/base/src/app/menu-policy.ts +163 -0
  49. package/templates/base/src/app/module.ts +46 -0
  50. package/templates/base/src/app/router/index.ts +107 -0
  51. package/templates/base/src/app/router/views.ts +12 -0
  52. package/templates/base/src/app/services/access.ts +2 -0
  53. package/templates/base/src/app/services/contracts.ts +54 -0
  54. package/templates/base/src/app/services/local-contracts.ts +18 -0
  55. package/templates/base/src/app/services/preferences.ts +41 -0
  56. package/templates/base/src/app/services/session-runtime.ts +186 -0
  57. package/templates/base/src/app/services/session.ts +14 -0
  58. package/templates/base/src/app/stored-menus.ts +72 -0
  59. package/templates/base/src/app/views/SafeIframeView.vue +34 -0
  60. package/templates/base/src/app/views/auth/LoginView.vue +75 -0
  61. package/templates/base/src/app/views/error/ForbiddenView.vue +20 -0
  62. package/templates/base/src/app/views/error/NotFoundView.vue +16 -0
  63. package/templates/base/src/main.ts +40 -0
  64. package/templates/base/src/modules/business/README.md +33 -0
  65. package/templates/base/src/modules/dashboard/DashboardView.vue +27 -0
  66. package/templates/base/src/modules/dashboard/module.ts +14 -0
  67. package/templates/base/src/shared/api.ts +53 -0
  68. package/templates/base/src/shared/components/BaseEntityDialog.vue +39 -0
  69. package/templates/base/src/shared/composables/use-async-data.ts +35 -0
  70. package/templates/base/src/shared/composables/use-entity-editor.ts +77 -0
  71. package/templates/base/src/shared/status.ts +4 -0
  72. package/templates/base/src/shared/tree.ts +41 -0
  73. package/templates/base/src/styles.scss +173 -0
  74. package/templates/base/tests/menu-policy.test.ts.template +89 -0
  75. package/templates/base/tests/session.test.ts.template +45 -0
  76. package/templates/base/vite.config.ts +54 -0
  77. package/templates/blank/README.md +6 -0
  78. package/templates/blank/src/App.vue +11 -0
  79. package/templates/common/AGENTS.md +13 -0
  80. package/templates/common/_editorconfig +15 -0
  81. package/templates/common/_gitattributes +6 -0
  82. package/templates/common/_gitignore +7 -0
  83. package/templates/common/_prettierignore +6 -0
  84. package/templates/common/docs/DEVELOPMENT.md +26 -0
  85. package/templates/common/eslint.config.mjs +60 -0
  86. package/templates/common/package.json +39 -0
  87. package/templates/common/prettier.config.mjs +8 -0
  88. package/templates/common/tsconfig.json +19 -0
  89. package/templates/common/vitest.config.ts +3 -0
  90. package/templates/features/examples/src/modules/examples/CrudExampleView.vue +51 -0
  91. package/templates/features/examples/src/modules/examples/FormExampleView.vue +32 -0
  92. package/templates/features/examples/src/modules/examples/module.ts +27 -0
  93. package/templates/features/system/src/modules/system/config/ConfigView.vue +104 -0
  94. package/templates/features/system/src/modules/system/config/api.ts +38 -0
  95. package/templates/features/system/src/modules/system/config/routes.ts +21 -0
  96. package/templates/features/system/src/modules/system/dictionary/DictionaryItemView.vue +141 -0
  97. package/templates/features/system/src/modules/system/dictionary/DictionaryTypeView.vue +107 -0
  98. package/templates/features/system/src/modules/system/dictionary/api.ts +61 -0
  99. package/templates/features/system/src/modules/system/dictionary/cache.ts +9 -0
  100. package/templates/features/system/src/modules/system/dictionary/routes.ts +32 -0
  101. package/templates/features/system/src/modules/system/dictionary/types.ts +22 -0
  102. package/templates/features/system/src/modules/system/local.ts +348 -0
  103. package/templates/features/system/src/modules/system/menu/MenuView.vue +133 -0
  104. package/templates/features/system/src/modules/system/menu/api.ts +73 -0
  105. package/templates/features/system/src/modules/system/menu/components/MenuEditorDialog.vue +106 -0
  106. package/templates/features/system/src/modules/system/menu/routes.ts +23 -0
  107. package/templates/features/system/src/modules/system/menu/types.ts +18 -0
  108. package/templates/features/system/src/modules/system/module.ts +22 -0
  109. package/templates/features/system/src/modules/system/organization/OrganizationView.vue +134 -0
  110. package/templates/features/system/src/modules/system/organization/api.ts +38 -0
  111. package/templates/features/system/src/modules/system/organization/routes.ts +23 -0
  112. package/templates/features/system/src/modules/system/organization/types.ts +17 -0
  113. package/templates/features/system/src/modules/system/role/RoleView.vue +90 -0
  114. package/templates/features/system/src/modules/system/role/api.ts +40 -0
  115. package/templates/features/system/src/modules/system/role/components/RoleAuthorizationDialog.vue +110 -0
  116. package/templates/features/system/src/modules/system/role/permission-tree.ts +31 -0
  117. package/templates/features/system/src/modules/system/role/routes.ts +24 -0
  118. package/templates/features/system/src/modules/system/role/types.ts +12 -0
  119. package/templates/features/system/src/modules/system/user/UserView.vue +297 -0
  120. package/templates/features/system/src/modules/system/user/api.ts +45 -0
  121. package/templates/features/system/src/modules/system/user/components/UserOrganizationFilter.vue +61 -0
  122. package/templates/features/system/src/modules/system/user/components/UserRoleDialog.vue +93 -0
  123. package/templates/features/system/src/modules/system/user/routes.ts +27 -0
  124. package/templates/features/system/src/modules/system/user/types.ts +28 -0
  125. package/templates/features/system/tests/system.test.ts.template +266 -0
  126. package/templates/modes/http/src/app/services/data-source.ts +124 -0
  127. package/templates/modes/http/src/app/services/http-adapter.ts +128 -0
  128. package/templates/modes/http/tests/http.test.ts.template +218 -0
  129. package/templates/modes/local/src/app/services/data-source.ts +113 -0
  130. package/templates/modes/local/src/app/services/local-database.ts +67 -0
  131. package/templates/modes/local/tests/local.test.ts.template +132 -0
  132. package/templates/presets/standard/src/modules/dashboard/DashboardView.vue +52 -0
  133. package/templates/presets/standard/src/modules/dashboard/components/DashboardSessionStatus.vue +41 -0
  134. package/templates/presets/standard/src/modules/dashboard/components/DashboardShortcuts.vue +51 -0
  135. package/templates/presets/standard/src/modules/profile/ProfileView.vue +109 -0
  136. package/templates/presets/standard/src/modules/profile/api.ts +49 -0
  137. package/templates/presets/standard/src/modules/profile/components/ProfilePasswordForm.vue +68 -0
  138. package/templates/presets/standard/src/modules/profile/local.ts +40 -0
  139. package/templates/presets/standard/src/modules/profile/module.ts +11 -0
  140. package/templates/presets/standard/tests/profile.test.ts.template +72 -0
  141. package/templates/screen/README.md +6 -0
  142. package/templates/screen/src/App.vue +7 -0
  143. package/templates/screen/src/screen/ScreenEntry.vue +18 -0
  144. package/templates/screen/src/screen/ScreenView.vue +48 -0
  145. package/templates/screen/src/screen/components/ScreenMetrics.vue +40 -0
  146. package/templates/screen-auth/src/screen/ScreenEntry.vue +52 -0
  147. package/templates/screen-auth/src/screen/components/ScreenLoginForm.vue +44 -0
  148. package/templates/screen-auth/src/services/session.ts +61 -0
  149. package/templates/screen-auth/tests/session.test.ts.template +54 -0
  150. package/templates/screen-auth-http/src/services/auth-adapter.ts +14 -0
  151. package/templates/screen-auth-http/tests/auth-adapter.test.ts.template +17 -0
  152. package/templates/screen-auth-local-demo/src/services/auth-adapter.ts +15 -0
  153. package/templates/screen-auth-local-demo/tests/auth-adapter.test.ts.template +18 -0
  154. package/templates/screen-data/src/screen/ScreenView.vue +69 -0
  155. package/templates/screen-data/src/services/metrics-types.ts +4 -0
  156. package/templates/screen-data-http/src/services/metrics.ts +20 -0
  157. package/templates/screen-data-http/src/services/request.ts +3 -0
  158. package/templates/screen-data-http/tests/metrics.test.ts.template +21 -0
  159. package/templates/screen-data-local/src/services/metrics.ts +11 -0
  160. package/templates/screen-data-local/tests/metrics.test.ts.template +9 -0
  161. package/templates/screen-http/API-CONTRACT.md +20 -0
  162. package/templates/screen-http/src/services/http.ts +17 -0
  163. package/templates/screen-request-auth/src/services/request.ts +15 -0
  164. package/templates/screen-router/src/App.vue +7 -0
  165. package/templates/screen-router/src/main.ts +13 -0
  166. package/templates/screen-router/src/router.ts +7 -0
  167. package/templates/screen-router/tests/app.test.ts.template +20 -0
  168. package/templates/screen-viewport/src/screen/ScreenViewport.vue +30 -0
  169. package/templates/screen-visualization-charts/src/screen/components/ScreenVisualization.vue +22 -0
  170. package/templates/screen-visualization-cockpit/src/screen/components/ScreenVisualization.vue +33 -0
  171. package/templates/screen-visualization-cockpit/src/screen/components/ScreenWidget.vue +10 -0
  172. package/templates/screen-visualization-datav/src/screen/components/ScreenVisualization.vue +11 -0
  173. package/templates/vben-compatible/MIGRATION.md +30 -0
  174. package/templates/vben-compatible/src/modules/vben-migration/VbenFormView.vue +11 -0
  175. package/templates/vben-compatible/src/modules/vben-migration/VbenUsersView.vue +12 -0
  176. package/templates/vben-compatible/src/modules/vben-migration/components/VbenFormExample.vue +64 -0
  177. package/templates/vben-compatible/src/modules/vben-migration/components/VbenUsers.vue +144 -0
  178. package/templates/vben-compatible/src/modules/vben-migration/local.ts +68 -0
  179. package/templates/vben-compatible/src/modules/vben-migration/module.ts +42 -0
  180. package/templates/vue/index.html +12 -0
  181. package/templates/vue/src/main.ts +5 -0
  182. package/templates/vue/src/styles.css +19 -0
  183. package/templates/vue/tests/app.test.ts.template +10 -0
  184. package/templates/vue/vite.config.ts +9 -0
  185. package/templates/vue/vitest.config.ts +4 -0
@@ -1 +1 @@
1
- {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"scaffold.js","sourceRoot":"","sources":["../src/scaffold.ts"],"names":[],"mappings":"AAAA,iCAAiC;AACjC,OAAO,EAAE,uBAAuB,EAAE,MAAM,aAAa,CAAA"}
@@ -0,0 +1,7 @@
1
+ import type { resolveOptions } from './presets.js';
2
+ import type { TemplateFile } from './types.js';
3
+ export declare function getVersion(): Promise<string>;
4
+ export declare function composeTemplates(options: ReturnType<typeof resolveOptions>): Promise<TemplateFile[]>;
5
+ /** 工程层只读合成,缺失资源在首次写入前失败。 */
6
+ export declare function readTemplateLayers(layers: string[]): Promise<Map<string, string>>;
7
+ //# sourceMappingURL=templates.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.d.ts","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAA;AAClD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,YAAY,CAAA;AAO9C,wBAAsB,UAAU,IAAI,OAAO,CAAC,MAAM,CAAC,CAGlD;AAsBD,wBAAsB,gBAAgB,CAAC,OAAO,EAAE,UAAU,CAAC,OAAO,cAAc,CAAC,GAAG,OAAO,CAAC,YAAY,EAAE,CAAC,CA6C1G;AAED,4BAA4B;AAC5B,wBAAsB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,GAAG,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAqBvF"}
@@ -0,0 +1,91 @@
1
+ import { readdir, readFile } from 'node:fs/promises';
2
+ import { join } from 'node:path';
3
+ import { fileURLToPath } from 'node:url';
4
+ const templateRoot = fileURLToPath(new URL('../templates/', import.meta.url));
5
+ export async function getVersion() {
6
+ const manifest = JSON.parse(await readFile(new URL('../package.json', import.meta.url), 'utf8'));
7
+ return manifest.version;
8
+ }
9
+ /***********************公共模板组合*********************/
10
+ async function readLayer(name, directory = '', result = []) {
11
+ const entries = await readdir(join(templateRoot, name, directory), { withFileTypes: true });
12
+ for (const entry of entries) {
13
+ if (entry.isSymbolicLink())
14
+ throw new Error(`模板资源不能是符号链接:${entry.name}`);
15
+ const path = directory ? `${directory}/${entry.name}` : entry.name;
16
+ if (entry.isDirectory()) {
17
+ await readLayer(name, path, result);
18
+ }
19
+ else {
20
+ result.push({
21
+ path: path.replace(/\.template$/, '').replace(/^_([^/]+)$/, '.$1'),
22
+ content: await readFile(join(templateRoot, name, path), 'utf8'),
23
+ });
24
+ }
25
+ }
26
+ return result;
27
+ }
28
+ export async function composeTemplates(options) {
29
+ const layers = ['base', 'common', `modes/${options.apiMode}`, ...options.features.map(feature => `features/${feature}`)];
30
+ if (options.preset !== 'minimal')
31
+ layers.push('presets/standard');
32
+ if (options.preset === 'vben-compatible')
33
+ layers.push('vben-compatible');
34
+ const files = await readTemplateLayers(layers);
35
+ const version = await getVersion();
36
+ const manifest = JSON.parse(files.get('package.json'));
37
+ manifest.name = options.name;
38
+ for (const name of ['@lumal/core', '@lumal/icons', '@lumal/icons-vue'])
39
+ manifest.dependencies[name] = version;
40
+ if (options.preset === 'vben-compatible')
41
+ manifest.dependencies['@lumal/vben-compat'] = version;
42
+ manifest.dependencies = Object.fromEntries(Object.entries(manifest.dependencies).sort(([left], [right]) => left.localeCompare(right)));
43
+ manifest.devDependencies = Object.fromEntries(Object.entries(manifest.devDependencies).sort(([left], [right]) => left.localeCompare(right)));
44
+ files.set('package.json', `${JSON.stringify(manifest, null, 2)}\n`);
45
+ files.set('.env.development', 'VITE_API_BASE_URL=\nVITE_API_ADAPTER=standard\n');
46
+ files.set('.env.production.example', 'VITE_API_BASE_URL=https://api.example.com\nVITE_API_ADAPTER=standard\n# Local 演示生产构建默认禁止登录;仅演示站点显式启用。\nVITE_ENABLE_LOCAL_DEMO=false\n');
47
+ files.set('docs/DEVELOPMENT.md', files.get('docs/DEVELOPMENT.md').replace('<!-- PROJECT_CONVENTIONS -->', `## Admin
48
+
49
+ 常规查询、分页、标准新增编辑优先使用 Lumal Schema/CRUD;地图、复杂交互和专用表单使用普通 Vue + Element Plus,不强行塞入 Schema。
50
+ 模块通过 module.ts 声明菜单、视图和权限,公共层不依赖业务模块。API 字段转换位于服务 Adapter。
51
+ HTTP 登录失败不得回退 Local。Local 仅供演示,生产默认禁用。修改权限、接口和模块时补充负向测试。
52
+ `.trimEnd()));
53
+ // 只注入小型配置;完整 SFC、服务和工程文件均保存在模板目录中。
54
+ files.set('src/app.config.ts', `export const appConfig: {
55
+ apiMode: 'http' | 'local';
56
+ features: string[];
57
+ preset: 'minimal' | 'standard' | 'vben-compatible';
58
+ routerMode: 'hash' | 'history';
59
+ title: string;
60
+ } = {
61
+ apiMode: '${options.apiMode}',
62
+ features: [${options.features.map(feature => `'${feature}'`).join(', ')}],
63
+ preset: '${options.preset}',
64
+ routerMode: '${options.routerMode}',
65
+ title: '${options.name}',
66
+ };\n`);
67
+ return [...files].map(([path, content]) => ({ path, content })).sort((a, b) => a.path.localeCompare(b.path));
68
+ }
69
+ /** 工程层只读合成,缺失资源在首次写入前失败。 */
70
+ export async function readTemplateLayers(layers) {
71
+ const files = new Map();
72
+ for (const layer of layers) {
73
+ for (const file of await readLayer(layer)) {
74
+ if (file.path === 'package.json' && files.has(file.path)) {
75
+ const previous = JSON.parse(files.get(file.path));
76
+ const current = JSON.parse(file.content);
77
+ files.set(file.path, JSON.stringify({
78
+ ...previous,
79
+ ...current,
80
+ dependencies: { ...previous.dependencies, ...current.dependencies },
81
+ devDependencies: { ...previous.devDependencies, ...current.devDependencies },
82
+ }));
83
+ }
84
+ else {
85
+ files.set(file.path, file.content);
86
+ }
87
+ }
88
+ }
89
+ return files;
90
+ }
91
+ //# sourceMappingURL=templates.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"templates.js","sourceRoot":"","sources":["../src/templates.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,64 @@
1
+ export type AdminPreset = 'minimal' | 'standard' | 'vben-compatible';
2
+ export type ApiMode = 'http' | 'local';
3
+ export type RouterMode = 'hash' | 'history';
4
+ export type AdminFeature = 'examples' | 'system';
5
+ export interface CreateLumalAdminProjectOptions {
6
+ apiMode?: ApiMode;
7
+ features?: AdminFeature[];
8
+ name: string;
9
+ preset?: AdminPreset;
10
+ routerMode?: RouterMode;
11
+ targetDir: string;
12
+ /** 取消创建时仅回滚本次拥有的文件。 */
13
+ signal?: AbortSignal;
14
+ }
15
+ export interface CreateLumalAdminProjectResult {
16
+ targetDir: string;
17
+ createdFiles: string[];
18
+ preset: AdminPreset;
19
+ apiMode: ApiMode;
20
+ routerMode: RouterMode;
21
+ features: AdminFeature[];
22
+ }
23
+ export interface TemplateFile {
24
+ path: string;
25
+ content: string;
26
+ }
27
+ /***********************通用项目生成协议*********************/
28
+ export type ProjectTemplate = 'admin' | 'blank' | 'screen';
29
+ export type ScreenAuth = 'none' | 'local-demo' | 'http';
30
+ export type ScreenData = 'none' | 'local' | 'http';
31
+ export type ScreenVisualization = 'none' | 'charts' | 'datav' | 'cockpit';
32
+ export type ScreenViewport = 'disabled' | 'responsive' | 'width' | 'contain' | 'scale' | 'vw';
33
+ export type ProjectRouterMode = RouterMode | 'none';
34
+ export interface CreateLumalProjectOptions {
35
+ targetDir: string;
36
+ name: string;
37
+ template?: ProjectTemplate;
38
+ preset?: AdminPreset;
39
+ apiMode?: ApiMode;
40
+ features?: AdminFeature[];
41
+ routerMode?: ProjectRouterMode;
42
+ auth?: ScreenAuth;
43
+ data?: ScreenData;
44
+ visualization?: ScreenVisualization;
45
+ viewport?: ScreenViewport;
46
+ signal?: AbortSignal;
47
+ }
48
+ export interface ResolvedScreenOptions {
49
+ template: 'blank' | 'screen';
50
+ name: string;
51
+ targetDir: string;
52
+ auth: ScreenAuth;
53
+ data: ScreenData;
54
+ routerMode: ProjectRouterMode;
55
+ visualization: ScreenVisualization;
56
+ viewport: ScreenViewport;
57
+ signal?: AbortSignal;
58
+ }
59
+ export type CreateLumalProjectResult = (ResolvedScreenOptions | (CreateLumalAdminProjectResult & {
60
+ template: 'admin';
61
+ })) & {
62
+ createdFiles: string[];
63
+ };
64
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,WAAW,GAAG,SAAS,GAAG,UAAU,GAAG,iBAAiB,CAAA;AACpE,MAAM,MAAM,OAAO,GAAG,MAAM,GAAG,OAAO,CAAA;AACtC,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,SAAS,CAAA;AAC3C,MAAM,MAAM,YAAY,GAAG,UAAU,GAAG,QAAQ,CAAA;AAEhD,MAAM,WAAW,8BAA8B;IAC7C,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,IAAI,EAAE,MAAM,CAAA;IACZ,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,UAAU,CAAC,EAAE,UAAU,CAAA;IACvB,SAAS,EAAE,MAAM,CAAA;IACjB,uBAAuB;IACvB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,6BAA6B;IAC5C,SAAS,EAAE,MAAM,CAAA;IACjB,YAAY,EAAE,MAAM,EAAE,CAAA;IACtB,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,EAAE,OAAO,CAAA;IAChB,UAAU,EAAE,UAAU,CAAA;IACtB,QAAQ,EAAE,YAAY,EAAE,CAAA;CACzB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,EAAE,MAAM,CAAA;IACZ,OAAO,EAAE,MAAM,CAAA;CAChB;AAED,sDAAsD;AACtD,MAAM,MAAM,eAAe,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,CAAA;AAC1D,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,YAAY,GAAG,MAAM,CAAA;AACvD,MAAM,MAAM,UAAU,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAA;AAClD,MAAM,MAAM,mBAAmB,GAAG,MAAM,GAAG,QAAQ,GAAG,OAAO,GAAG,SAAS,CAAA;AACzE,MAAM,MAAM,cAAc,GAAG,UAAU,GAAG,YAAY,GAAG,OAAO,GAAG,SAAS,GAAG,OAAO,GAAG,IAAI,CAAA;AAC7F,MAAM,MAAM,iBAAiB,GAAG,UAAU,GAAG,MAAM,CAAA;AAEnD,MAAM,WAAW,yBAAyB;IACxC,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,MAAM,CAAA;IACZ,QAAQ,CAAC,EAAE,eAAe,CAAA;IAC1B,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,OAAO,CAAC,EAAE,OAAO,CAAA;IACjB,QAAQ,CAAC,EAAE,YAAY,EAAE,CAAA;IACzB,UAAU,CAAC,EAAE,iBAAiB,CAAA;IAC9B,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,IAAI,CAAC,EAAE,UAAU,CAAA;IACjB,aAAa,CAAC,EAAE,mBAAmB,CAAA;IACnC,QAAQ,CAAC,EAAE,cAAc,CAAA;IACzB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,WAAW,qBAAqB;IACpC,QAAQ,EAAE,OAAO,GAAG,QAAQ,CAAA;IAC5B,IAAI,EAAE,MAAM,CAAA;IACZ,SAAS,EAAE,MAAM,CAAA;IACjB,IAAI,EAAE,UAAU,CAAA;IAChB,IAAI,EAAE,UAAU,CAAA;IAChB,UAAU,EAAE,iBAAiB,CAAA;IAC7B,aAAa,EAAE,mBAAmB,CAAA;IAClC,QAAQ,EAAE,cAAc,CAAA;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;CACrB;AAED,MAAM,MAAM,wBAAwB,GAAG,CAAC,qBAAqB,GAAG,CAAC,6BAA6B,GAAG;IAAE,QAAQ,EAAE,OAAO,CAAA;CAAE,CAAC,CAAC,GAAG;IACzH,YAAY,EAAE,MAAM,EAAE,CAAA;CACvB,CAAA"}
package/dist/types.js ADDED
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,13 +1,14 @@
1
1
  {
2
2
  "name": "create-lumal-admin",
3
3
  "type": "module",
4
- "version": "0.0.4-beta",
5
- "description": "Create a minimal Lumal admin application.",
4
+ "version": "0.0.6-beta",
5
+ "description": "Create lightweight Vue Blank, Screen or Lumal Admin projects with optional capabilities.",
6
6
  "license": "MIT",
7
7
  "keywords": [
8
8
  "lumal",
9
9
  "vue",
10
10
  "admin",
11
+ "screen",
11
12
  "scaffold",
12
13
  "create"
13
14
  ],
@@ -21,16 +22,24 @@
21
22
  }
22
23
  },
23
24
  "bin": {
25
+ "create-lumal": "./dist/project-cli.js",
24
26
  "create-lumal-admin": "./dist/cli.js"
25
27
  },
26
28
  "files": [
27
29
  "CHANGELOG.md",
28
30
  "README.md",
29
- "dist"
31
+ "dist",
32
+ "templates"
30
33
  ],
34
+ "dependencies": {
35
+ "@clack/prompts": "1.8.1"
36
+ },
37
+ "devDependencies": {
38
+ "@lydell/node-pty": "1.2.0-beta.15"
39
+ },
31
40
  "scripts": {
32
41
  "build": "tsc -p tsconfig.json && node ../../scripts/clean-package-dist.mjs dist && node ../../scripts/sync-create-lumal-admin-version.mjs",
33
42
  "typecheck": "tsc --noEmit -p tsconfig.json",
34
- "test": "vitest run --config ../../vitest.config.ts tests"
43
+ "test": "pnpm build && vitest run --config ../../vitest.config.ts tests"
35
44
  }
36
45
  }
@@ -0,0 +1,4 @@
1
+ VITE_API_BASE_URL=/api
2
+ VITE_API_ADAPTER=standard
3
+ # Local 演示仅开发环境默认启用,生产演示必须显式授权。
4
+ VITE_ENABLE_LOCAL_DEMO=false
@@ -0,0 +1,84 @@
1
+ # 应用 API 契约
2
+
3
+ 基础契约在 `src/app/services/contracts.ts`,业务入参和解析在各模块 `api.ts/types.ts`。
4
+ Local 与 HTTP 使用同一组页面及端点;Core 不包含业务协议。
5
+ 系统接口仅在选择 system 时调用,个人中心仅 standard / vben-compatible 启用。
6
+
7
+ | 方法 | 路径 | 标准 JSON 响应 |
8
+ | --------------- | ---------------------------------------------------------------------- | -------------------------------------------------------------------- |
9
+ | POST | `/auth/login`,body `{ username, password }` | `{ accessToken, refreshToken?, expiresAt? }` |
10
+ | POST | `/auth/refresh`,body `{ refreshToken }` | 同上 |
11
+ | GET | `/session/me` | `{ id, username, name }`,均为字符串 |
12
+ | GET | `/session/access` | `{ roles: string[], permissions: string[] }` |
13
+ | GET | `/menus` | `LumalMenuRecord[]` |
14
+ | POST | `/auth/logout` | 204 或 JSON |
15
+ | GET | `/system/users`、`/system/roles` | `{ items: User[] \| Role[], total }` |
16
+ | POST/PUT/DELETE | `/system/users[/:id]`、`/system/roles[/:id]` | 对应模块输入 / 记录;删除 204 或 JSON |
17
+ | PATCH | `/system/users/:id/status` | `{ status }` / `User` |
18
+ | PUT | `/system/users/:id/roles` | `{ roles: string[] }` / `User` |
19
+ | PATCH | `/system/users/batch/status` | `{ ids, status }` / `{ items, updated }` |
20
+ | PUT | `/system/users/batch/roles` | `{ ids, roles, mode: 'append' \| 'replace' }` / `{ items, updated }` |
21
+ | POST | `/system/users/:id/reset-password` | `{ temporaryPassword }` |
22
+ | GET | `/system/roles/options`、`/system/organizations/options` | `{ label, value, disabled?, children? }[]` |
23
+ | GET | `/system/permissions/tree` | `{ id, label, permission?, children? }[]` |
24
+ | GET/PUT | `/system/roles/:code/permissions` | PUT `{ permissions: string[] }`;响应 `string[]` |
25
+ | GET | `/system/menus`、`/system/organizations` | 对应树形记录数组,`children`;机构可带 `userCount` |
26
+ | POST/PUT/DELETE | `/system/menus[/:id]`、`/system/organizations[/:id]` | 对应模块输入 / 记录 |
27
+ | GET | `/system/dictionaries/types`、`/system/dictionaries/items?typeCode=` | 对应记录数组 |
28
+ | POST/PUT/DELETE | `/system/dictionaries/types[/:id]`、`/system/dictionaries/items[/:id]` | 对应模块输入 / 记录 |
29
+ | GET | `/system/dictionaries/options/:code` | `{ label, value, color? }[]` |
30
+ | GET/PUT | `/system/config` | `{ appName, colorPrimary, layout, tabbarEnable, transitionEnable }` |
31
+ | POST | `/system/config/restore` | 恢复默认,响应同上 |
32
+ | GET/PUT | `/profile` | GET `User`;PUT `{ nickname, phone }` / `User` |
33
+ | PUT | `/profile/password` | `{ currentPassword, newPassword }` / 204 或 JSON |
34
+
35
+ 用户查询支持 `page/pageSize/keyword/organizationId/roles/status`,角色支持
36
+ `page/pageSize/keyword/status`。分页默认第一页,页号和每页条数必须为正整数。
37
+ `UserInput` 为 `username/nickname/organizationId/roles/phone/status`;响应另有 `id/createdAt`。
38
+ `RoleInput` 为 `code/name/description/status`;响应另有 `id/builtIn`,不接收 permissions。
39
+
40
+ ## 业务约束与权限
41
+
42
+ - 用户操作对应 `system:user:list/create/update/delete/status/assign-roles/reset-password`。
43
+ - 角色对应 `system:role:list/create/update/delete/authorize`;资料和授权分别保存,不宣称两个请求是事务。
44
+ - 授权树来自真实接口,非叶访问权限独立回显;授权已写入但会话重读失败时明确提示部分成功,只重试重读。
45
+ - 菜单、机构、字典的权限前缀分别为 `system:menu`、`system:organization`、`system:dict`,操作是 `list/create/update/delete`。
46
+ - 配置读取需 `system:config:view`,写入需 `system:config:update`;无写权限显示只读表单,不是 key/value 记录列表。
47
+ - 服务端须保护内置管理员和角色、角色引用、机构关联用户和父子关系;批量写入应先校验全部目标。
48
+ - 字典同分类值唯一,删除分类级联处理字典项;修改后清理共享 `dictionaryStore`,业务表单应使用同一 Store。
49
+ - 个人中心由后端确认当前身份;密码必须经后端验证并持久化。接口不存在时展示真实错误,不伪造成功。
50
+
51
+ 完整字段以各模块 types.ts 为准。没有指标接口时工作台不请求或编造业务指标。
52
+
53
+ HTTP 模式必须配置 `VITE_API_BASE_URL`,未配置立即报错,绝不回退本地登录。
54
+ 默认直接消费标准 JSON。包装、字段及权限映射集中在应用 `http-adapter.ts`。
55
+ 需要 Cookie/CSRF、租户或 SSO 时在应用 transport 接入,不将密钥写到 `VITE_*`。
56
+ 默认凭据存于 localStorage,请按安全要求选择内存/HttpOnly Cookie 策略。
57
+
58
+ ## 菜单信任边界
59
+
60
+ 菜单组件使用 `src/app/router/views.ts` 汇集的本地白名单,键必须是自有函数加载器;
61
+ 拒绝 constructor、**proto**、prototype 和任意 import URL,递归子菜单同样校验。
62
+ HTTP 菜单替换本地菜单,不静默融合。子路由使用属于父路径的绝对地址;
63
+ 目录默认跳到当前身份可访问的首个子页,无子页时隐藏。路由守卫逐层检查父子权限,
64
+ 远程 ignoreAccess/requireLogin 不能关闭认证或权限。
65
+
66
+ 外链只接受无用户名密码的 HTTP(S) 绝对地址,禁止 javascript/data/vbscript、
67
+ 协议相对地址、反斜线和控制字符。iframe 只能使用 `app/iframe`,且完整来源必须
68
+ 注册在 `VITE_IFRAME_ORIGINS`(逗号分隔),使用独立 sandbox。
69
+
70
+ ## 接入仓库 Lumal Mock API
71
+
72
+ 启动独立的 `lumal-mock-api` 后,设置 `VITE_API_BASE_URL=http://127.0.0.1:5320/api`
73
+ 和 `VITE_API_ADAPTER=lumal-mock`。这是显式选择的演示后端,不是生产默认值。
74
+ 该 adapter 映射 `statusCode/result/resultMsg`、snake_case Token、`records/totalNum`;
75
+ 只选择本预设存在的菜单,其余示例页面不生成。
76
+ Mock 的配置字段与上表一致;历史写权限 `system:config:view` 显式映射到应用 update 权限。
77
+ 第三方后端应按真实协议调整 Adapter,不假定均兼容此演示协议。
78
+
79
+ 401 GET 自动单飞刷新并最多重放一次;写请求不自动重放,避免重复提交。
80
+ 初始化等待用户、权限和菜单全部就绪后注册路由。退出、Token 刷新失败和重新登录清理
81
+ 凭据、权限、菜单、动态路由、请求缓存和标签;旧会话请求会被取消。
82
+ 主动重读权限失败时清空旧授权及路由,保留凭据供显式重试。
83
+ 真实接口的 403、校验或网络错误保持可见,不转换成成功响应。
84
+ Local 存储可被浏览器用户修改,仅供开发,不能替代服务端鉴权。
@@ -0,0 +1,59 @@
1
+ # Lumal Admin
2
+
3
+ ## 开发
4
+
5
+ Node.js 22.12+,pnpm 10.33.0。
6
+
7
+ ```bash
8
+ pnpm install
9
+ pnpm dev
10
+ pnpm test
11
+ pnpm lint
12
+ pnpm typecheck
13
+ pnpm build
14
+ pnpm preview
15
+ ```
16
+
17
+ 预设、数据源、路由模式和可选模块见 `src/app.config.ts`。
18
+ 业务组件均显式导入,不依赖组件自动导入或 Monorepo 私有 alias。
19
+ `@` 指向 `src`,TS 与 Vite 使用相同映射。SCSS 编译使用 sass-embedded。
20
+
21
+ ## 接口与认证
22
+
23
+ HTTP 接入前配置 `.env.development`,完整接口见 [API 契约](./API-CONTRACT.md)。
24
+ Local 模式是明确的开发演示,账号 `admin/guest`,密码 `lumal123`;
25
+ 生产默认禁用,不应将演示模式当作生产认证。
26
+ 系统模块包含有明确关联的开发种子数据;示例数据与系统数据分离。
27
+
28
+ ## 部署
29
+
30
+ 以 `.env.production.example` 为参考创建生产配置,不提交密钥。
31
+ Vite 环境变量在构建时注入,预览前修改变量必须重新构建。
32
+ 推荐同域 `/api` 反向代理和 HTTPS。History 路由需要服务器将非文件路径回退到
33
+ `index.html`,Hash 不需要;子目录部署需配置 Vite `base`。
34
+ 不要将生产 API 请求回退到 HTML。上传文件限制和后端权限属于服务端职责。
35
+ localStorage Token 示例不是生产安全策略的唯一选择。
36
+
37
+ ## 模块
38
+
39
+ minimal 没有管理页面与兼容层;standard 的 system/examples 是可选模板层。
40
+ 系统页面的 CRUD 和 Schema 不进入 Core 的业务实现。图表、驾驶舱、富文本、
41
+ 国际化与 VXE 高级编辑均不默认安装。
42
+
43
+ ```text
44
+ src/app/ 路由、认证、请求、布局接线与异常页
45
+ src/modules/dashboard/ 工作台
46
+ src/modules/profile/ 个人中心(标准预设)
47
+ src/modules/system/ 系统父模块(可选)
48
+ user/ role/ menu/ organization/ dictionary/ config/
49
+ src/modules/examples/ 开发示例(可选)
50
+ src/modules/vben-migration/ 迁移示例(仅兼容预设)
51
+ src/modules/business/ 自有业务模块
52
+ src/shared/ 共享组件、类型与组合式函数
53
+ ```
54
+
55
+ 每个模块通过 `module.ts` 导出 menus/views/permissions,注册表只加载小型元数据,
56
+ 页面使用动态 import。在 business 中新增一个子目录及 module.ts 即可注册,不需要修改中心文件;
57
+ 完整接入示例见该目录 README。业务类型和强类型 API 放在模块内,不写入全局实体配置。
58
+ 系统、开发示例和迁移示例各有真实父路由,权限变化后目录重定向重新计算。
59
+ HTTP 菜单使用已生成页面的 component key,并由后端提供完整菜单;不会静默混入本地菜单。
@@ -0,0 +1,12 @@
1
+ <!doctype html>
2
+ <html lang="zh-CN">
3
+ <head>
4
+ <meta charset="UTF-8" />
5
+ <meta name="viewport" content="width=device-width, initial-scale=1.0" />
6
+ <title>Lumal Admin</title>
7
+ </head>
8
+ <body>
9
+ <div id="app"></div>
10
+ <script type="module" src="/src/main.ts"></script>
11
+ </body>
12
+ </html>
@@ -0,0 +1,38 @@
1
+ {
2
+ "name": "template-base",
3
+ "type": "module",
4
+ "version": "0.0.0",
5
+ "private": true,
6
+ "packageManager": "pnpm@10.33.0",
7
+ "engines": {
8
+ "node": ">=22.12.0"
9
+ },
10
+ "scripts": {
11
+ "dev": "vite --host 127.0.0.1",
12
+ "build": "pnpm typecheck && vite build",
13
+ "lint": "eslint .",
14
+ "preview": "vite preview --host 127.0.0.1",
15
+ "test": "vitest run",
16
+ "typecheck": "vue-tsc --noEmit -p tsconfig.json"
17
+ },
18
+ "dependencies": {
19
+ "@iconify/vue": "^5.0.0",
20
+ "@lumal/core": "^0.0.0",
21
+ "@lumal/icons": "^0.0.0",
22
+ "@lumal/icons-vue": "^0.0.0",
23
+ "element-plus": "^2.11.0",
24
+ "vue": "^3.5.0",
25
+ "vue-router": "^4.5.0"
26
+ },
27
+ "devDependencies": {
28
+ "@antfu/eslint-config": "^8.2.0",
29
+ "@types/node": "^24.6.1",
30
+ "@vitejs/plugin-vue": "^6.0.1",
31
+ "eslint": "^9.37.0",
32
+ "sass-embedded": "^1.95.1",
33
+ "typescript": "^6.0.0",
34
+ "vite": "^8.0.0",
35
+ "vitest": "^4.1.5",
36
+ "vue-tsc": "^3.1.1"
37
+ }
38
+ }