create-jnrs-vue 1.2.37 → 2.0.1

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.
package/README.md CHANGED
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## ✨ 介绍
4
4
 
5
- 巨能前端工程化开发,Vue 项目模板脚手架
5
+ 巨能(JNRS)前端工程化开发,Vue 项目模板脚手架
6
6
 
7
7
  ## 💻 技术栈
8
8
 
package/bin/create.mjs CHANGED
@@ -114,15 +114,23 @@ async function main() {
114
114
  await fs.cp(templateDir, root, { recursive: true })
115
115
 
116
116
  // 定义可选的内部模块
117
- const allWorkspaceDeps = ['@jnrs/shared', '@jnrs/vue-core', '@jnrs/lingshu-smart']
118
- const defaultSelected = ['@jnrs/shared', '@jnrs/vue-core']
117
+ const allWorkspaceDeps = ['@jnrs/shared', '@jnrs/vue-core', '@jnrs/lingshu-smart', '@jnrs/skills-biz']
118
+ const defaultSelected = ['@jnrs/shared', '@jnrs/vue-core', '@jnrs/skills-biz']
119
+
120
+ // 依赖备注
121
+ const depNotes = {
122
+ '@jnrs/shared': '【必选】通用工具库',
123
+ '@jnrs/vue-core': '【必选】Vue 专用核心功能包',
124
+ '@jnrs/lingshu-smart': '【可选】2D数字孪生系统(灵枢智造)',
125
+ '@jnrs/skills-biz': '【可选】AI Agent 业务技能库(service/views/script/menu 生成器)'
126
+ }
119
127
 
120
128
  const { selected: selectedWorkspaceDeps } = await prompts({
121
129
  type: 'multiselect',
122
130
  name: 'selected',
123
131
  message: '请选择要包含的内部依赖模块(默认已选中必要模块):',
124
132
  choices: allWorkspaceDeps.map((dep) => ({
125
- title: dep,
133
+ title: `${dep} ${depNotes[dep] || ''}`,
126
134
  value: dep,
127
135
  selected: defaultSelected.includes(dep)
128
136
  })),
@@ -0,0 +1,78 @@
1
+ # jnrs-vue 工程 AI 开发指南
2
+
3
+ 本文档面向在 jnrs-vue 工程中进行业务开发的开发者,说明如何使用 `@jnrs/skills-biz` 技能库加速开发。
4
+
5
+ ## 技能库配置
6
+
7
+ `@jnrs/skills-biz` 随项目依赖安装,位于 `node_modules/@jnrs/skills-biz/`。**使用前需将技能目录配置到 AI IDE 的 skills 目录中**(如 Trae 的 `.trae/skills/`),供 AI Agent 自动加载调用。
8
+
9
+ ## 技能清单
10
+
11
+ | 技能 | 作用 | 依赖 |
12
+ | ----------------- | ------------------------------------------------- | -------------------- |
13
+ | service-generator | 生成接口服务层代码(TS 类型 + API 函数) | OAS 文档或 mock 模式 |
14
+ | views-generator | 生成视图显示层及部分脚本控制层代码( .vue 文件(`<template>` + `<script setup>`)) | 接口服务层 |
15
+ | script-generator | 生成完整控制层代码 `<script setup>` patterns 参考 | 接口服务层 |
16
+ | menu-generator | 生成 `public/system/menu.json` 菜单配置代码 | 视图层 |
17
+
18
+ ## 开发流程
19
+
20
+ ```
21
+ 1. service-generator → 生成 src/api/<module>/*.ts
22
+ 2. views-generator → 生成 src/views/<module>/*.vue(含 template + script setup)
23
+ ↑ 生成 script setup 时参考 script-generator 的 patterns
24
+ 3. menu-generator → 在 public/system/menu.json 中追加菜单项
25
+ ```
26
+
27
+ ### 各技能使用方式
28
+
29
+ | 技能 | 触发方式 |
30
+ | ----------------- | ------------------------------------------------------------------------------------------------------ |
31
+ | service-generator | 向 AI 描述:**"生成 <模块名> 的服务层"** 或 **"生成 <模块名> 的 API"**。OAS 模式需确保 `OAS/` 目录存在 |
32
+ | views-generator | 向 AI 描述:**"生成 <模块名> 的页面"**。自动检测多栏布局,内部参考 script-generator 生成控制层代码 |
33
+ | script-generator | 通常由 views-generator 自动查阅。也可单独向 AI 描述:**"查看 <模块名> 的脚本模式"** |
34
+ | menu-generator | 向 AI 描述:**"生成菜单"** 或 **"新增菜单项"**。列出待生成菜单项供确认后写入 |
35
+
36
+ ### 约束
37
+
38
+ - **必须**按 service → views → menu 顺序生成
39
+ - **禁止**跳过接口服务层直接生成视图
40
+ - 菜单生成前必须列出清单供用户确认
41
+
42
+ ## 架构说明
43
+
44
+ 业务模块采用三层架构(逻辑分离,非物理文件分离):
45
+
46
+ | 层级 | 物理位置 | 职责 | 生成器 |
47
+ | ---------- | ------------------------------------------- | ---------------------------- | ----------------- |
48
+ | 接口服务层 | `src/api/<module>/*.ts` | TS 类型定义 + API 请求函数 | service-generator |
49
+ | 控制层 | `src/views/<module>/*.vue` `<script setup>` | 状态管理、数据获取、事件处理 | views-generator |
50
+ | 视图层 | `src/views/<module>/*.vue` `<template>` | 模板代码、组件引用 | views-generator |
51
+
52
+ ## 命名规范
53
+
54
+ | 类型 | 规范 | 示例 |
55
+ | --------- | ------------ | ------------------------------ |
56
+ | 目录 | kebab-case | `project-management/` |
57
+ | .vue 文件 | camelCase | `editDialog.vue`、`index.vue` |
58
+ | TS 文件 | kebab-case | `project-management.ts` |
59
+ | API 函数 | `*Api`小驼峰 | `projectTableApi` |
60
+ | 路由 name | 小驼峰 | `examplesProjectManagement` |
61
+ | 路由 path | kebab-case | `/examples/project-management` |
62
+ | 权限 | 两段式 | `module:view`、`module:edit` |
63
+
64
+ ## 术语
65
+
66
+ - **OAS**:OpenAPI Specification,由接口管理工具(如 ApiFox)导出,存放于 `OAS/` 目录
67
+ - **JSDoc Tags**:自定义注签(`@dict`、`@enumValues`、`@independentModification`、`@useSelectComponent`、`@fileField`、`@foreignKey`),在服务层代码中标记字段特性,供视图生成时识别处理
68
+ - 后端 api 中所说的 `列表、分页列表` 即为前端的 `表格`
69
+
70
+ ## 常用 @jnrs/ 库参考
71
+
72
+ | 导入 | 来源 | 文档 |
73
+ | ----------------------------------------------------- | --------------------------- | --------------------------------------- |
74
+ | `JnTable`, `JnPagination`, `JnDialog`, `JnFileUpload` | `@jnrs/vue-core/components` | `node_modules/@jnrs/vue-core/AGENTS.md` |
75
+ | `useRouter`, `useRoute` | `@jnrs/vue-core/router` | `node_modules/@jnrs/vue-core/AGENTS.md` |
76
+ | `useSystemStore`, `useMenuStore` | `@jnrs/vue-core/pinia` | `node_modules/@jnrs/vue-core/AGENTS.md` |
77
+ | `debounce` | `@jnrs/shared/lodash` | `node_modules/@jnrs/shared/AGENTS.md` |
78
+ | `objectMatchAssign`, `dateFormatsToObject` | `@jnrs/shared` | `node_modules/@jnrs/shared/AGENTS.md` |
@@ -2,7 +2,7 @@
2
2
 
3
3
  ## ✨ 介绍
4
4
 
5
- 巨能前端工程化开发,Vue 项目信息化管理系统
5
+ 巨能(JNRS)前端工程化开发,Vue 项目信息化管理系统
6
6
 
7
7
  ## 💻 技术栈
8
8
 
@@ -18,15 +18,18 @@ pnpm build
18
18
 
19
19
  ## 🤖 AI Agent 使用说明
20
20
 
21
+ 本脚手架模板现支持自动化生成业务模块前端代码。
22
+
21
23
  - 前置准备
22
- - 必须:从接口管理工具(如 ApiFox)中导出 OAS 文件(如 openapi.json)放入 skills 目录下
24
+ - 重要:从接口管理工具(如 ApiFox)中导出 OAS 文件(如 openapi.json)放入 `skills-biz/OAS/` 目录下
23
25
  - 可选:将业务功能原型图作为生成前端代码的参考文件,调用多模态能力
24
26
 
27
+ 详细说明及提示词请参考[AGENTS.md](./AGENTS.md)
28
+
25
29
  #### 项目结构
26
30
 
27
31
  ```Text
28
32
  jnrs-vue/
29
- ├── skills/ # AI Agent 项目级技能目录
30
33
  ├── viteMockServe/ # Mock 服务配置目录
31
34
  ├── public/ # 静态资源目录
32
35
  ├── src/ # 源码目录
@@ -48,8 +51,8 @@ jnrs-vue/
48
51
  ├── tsconfig.json # TypeScript 配置
49
52
  ├── auto-imports.d.ts # 自动导入类型声明
50
53
  ├── components.d.ts # 全局组件类型声明
51
- ├── README.md # 项目文档
52
- ├── AGENTS.md # AI Agent 规则与提示词
54
+ ├── README.md # 项目使用说明
55
+ ├── AGENTS.md # AI Agent 使用说明
53
56
  ├── .env.development # 开发环境变量
54
57
  ├── .env.production # 生产环境变量
55
58
  ├── .gitignore # Git 忽略规则
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "jnrs-vue",
3
- "version": "1.2.37",
3
+ "version": "1.2.38",
4
4
  "description": "JNRS 信息化管理系统",
5
5
  "author": "talia_tan",
6
6
  "private": true,
@@ -19,9 +19,9 @@
19
19
  },
20
20
  "dependencies": {
21
21
  "@element-plus/icons-vue": "^2.3.2",
22
- "@jnrs/lingshu-smart": "2.2.30",
23
- "@jnrs/shared": "1.1.31",
24
- "@jnrs/vue-core": "1.2.25",
22
+ "@jnrs/lingshu-smart": "2.2.31",
23
+ "@jnrs/shared": "1.1.32",
24
+ "@jnrs/vue-core": "1.2.26",
25
25
  "@vueuse/core": "^14.1.0",
26
26
  "element-plus": "^2.13.3",
27
27
  "pinia": "^3.0.4",
@@ -30,7 +30,7 @@
30
30
  "vue-i18n": "^11.2.8"
31
31
  },
32
32
  "devDependencies": {
33
- "@jnrs/skills": "1.0.2",
33
+ "@jnrs/skills-biz": "*",
34
34
  "@tsconfig/node22": "^22.0.5",
35
35
  "@types/node": "^22.19.1",
36
36
  "@typescript-eslint/parser": "^8.48.1",
@@ -14,5 +14,5 @@
14
14
 
15
15
  .el-message-box,
16
16
  .el-dialog {
17
- border: 1px solid var(--jnrs-font-primary-06);
17
+ border: 1px solid var(--jnrs-font-primary-05);
18
18
  }
@@ -223,7 +223,7 @@ onUnmounted(() => {
223
223
  height: var(--jnrs-routerTabs-height);
224
224
  }
225
225
  :deep(.el-tabs__item) {
226
- color: var(--jnrs-font-primary-06);
226
+ color: var(--jnrs-font-primary-05);
227
227
  font-size: 12px;
228
228
  height: var(--jnrs-routerTabs-height);
229
229
  transition: all 0.3s ease;
@@ -264,7 +264,7 @@ onUnmounted(() => {
264
264
  padding: 8px 16px;
265
265
  cursor: pointer;
266
266
  font-size: 13px;
267
- color: var(--jnrs-font-primary-08);
267
+ color: var(--jnrs-font-primary-07);
268
268
  transition: all 0.2s;
269
269
 
270
270
  &:hover {
@@ -164,7 +164,7 @@ $topHoverSize: 35px;
164
164
  background: var(--jnrs-background-head);
165
165
  }
166
166
  .userMenu_icon {
167
- color: var(--jnrs-font-primary-06);
167
+ color: var(--jnrs-font-primary-05);
168
168
  }
169
169
  }
170
170
  .userMenu_dropdown {
@@ -190,7 +190,7 @@ $topHoverSize: 35px;
190
190
  color: var(--jnrs-font-primary);
191
191
  }
192
192
  .loginDateTime {
193
- color: var(--jnrs-font-primary-06);
193
+ color: var(--jnrs-font-primary-05);
194
194
  }
195
195
  .userMenu_dropdown_btn {
196
196
  .el-button {
@@ -109,13 +109,7 @@ onActivated(() => {
109
109
  <template #header>
110
110
  <div class="jn-flex-between-center">
111
111
  <span class="jn-card-title">子项目</span>
112
- <el-button
113
- type="primary"
114
- size="small"
115
- :icon="Plus"
116
- :disabled="!props.programId"
117
- @click="handleEdit()"
118
- >
112
+ <el-button type="primary" size="small" :icon="Plus" :disabled="!props.programId" @click="handleEdit()">
119
113
  新增
120
114
  </el-button>
121
115
  </div>
@@ -130,7 +124,7 @@ onActivated(() => {
130
124
  :showIndexColumn="false"
131
125
  :showSelectionColumn="false"
132
126
  :autoHeightOptions="{
133
- bottomGap: 0
127
+ bottomGap: 80
134
128
  }"
135
129
  >
136
130
  <el-table-column prop="code" label="子项目编码" min-width="180" sortable show-overflow-tooltip />
@@ -170,17 +170,17 @@ onDeactivated(() => {
170
170
  }
171
171
 
172
172
  .greeting {
173
- color: var(--jnrs-font-primary-08);
173
+ color: var(--jnrs-font-primary-07);
174
174
  }
175
175
  }
176
176
 
177
177
  .welcome-meta {
178
178
  font-size: 13px;
179
- color: var(--jnrs-font-primary-06);
179
+ color: var(--jnrs-font-primary-05);
180
180
 
181
181
  .divider {
182
182
  margin: 0 12px;
183
- color: var(--jnrs-font-primary-02);
183
+ color: var(--jnrs-font-primary-01);
184
184
  }
185
185
  }
186
186
  }
@@ -200,7 +200,7 @@ onDeactivated(() => {
200
200
  .date-info {
201
201
  margin-top: 4px;
202
202
  font-size: 14px;
203
- color: var(--jnrs-font-primary-06);
203
+ color: var(--jnrs-font-primary-05);
204
204
 
205
205
  .date {
206
206
  margin-right: 12px;
@@ -253,7 +253,7 @@ onDeactivated(() => {
253
253
 
254
254
  .stat-label {
255
255
  font-size: 14px;
256
- color: var(--jnrs-font-primary-06);
256
+ color: var(--jnrs-font-primary-05);
257
257
  margin-top: 4px;
258
258
  }
259
259
  }
@@ -310,7 +310,7 @@ onDeactivated(() => {
310
310
 
311
311
  .entry-title {
312
312
  font-size: 14px;
313
- color: var(--jnrs-font-primary-08);
313
+ color: var(--jnrs-font-primary-07);
314
314
  text-align: center;
315
315
  }
316
316
  }
@@ -299,7 +299,7 @@ const submitForm = async () => {
299
299
  .light {
300
300
  .card_right {
301
301
  &::after {
302
- background: var(--jnrs-card-primary-06);
302
+ background: var(--jnrs-card-primary-05);
303
303
  }
304
304
  }
305
305
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "create-jnrs-vue",
3
- "version": "1.2.37",
4
- "description": "巨能前端工程化开发,Vue 项目模板脚手架",
3
+ "version": "2.0.1",
4
+ "description": "巨能(JNRS)前端工程化开发,Vue 项目模板脚手架",
5
5
  "keywords": [
6
6
  "vue",
7
7
  "vite",