Skip to content

Commit d143b32

Browse files
authored
v2.9.0Beta版本发布
- 优化了AI规则,更利于大家规范化使用VibeCoding - skills增加了在线板块,可以直接下载在线的skills。 - skill增加了一键打包能力 - 角色页面可以把角色可以直接分配给用户 - 菜单页面可以直接把菜单分配给角色 - API页面可以直接把API分配给角色 - 升级了AWS S3的版本 - 修复了富文本组件样式缺失的bug - dashboard页面样式调整 - 优化了插件市场的UI,增加了分享和点赞能力 - 优化了vite环境变量的使用规则
1 parent 556b443 commit d143b32

File tree

49 files changed

+2837
-292
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

49 files changed

+2837
-292
lines changed

.aone_copilot/rules/project_rules.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ web/
194194

195195
- 结构体应继承 `global.GVA_MODEL` 以包含 `ID`, `CreatedAt`, `UpdatedAt` 等基础字段。
196196

197+
- 以上三个字段返回给前端并未做驼峰处理,json内依然是 `ID`, `CreatedAt`, `UpdatedAt`
198+
197199
- 必须为字段添加清晰的 `json``gorm` 标签。
198200

199201
- **⚠️ 重要提醒:数据类型一致性**
@@ -495,6 +497,9 @@ API函数的Swagger注释不仅用于生成API文档,也是前端开发的重
495497
- **必须**进行响应式数据管理
496498
- **必须**处理加载状态和错误状态
497499
- **必须**遵循Element Plus组件规范
500+
- **必须**优先使用UnoCSS原子化类名进行样式设计
501+
- **必须**优先el-drawer组件进行编辑,新增,步骤等操作
502+
- **必须**使用el-drawer和el-dialog组件是后一定携带,destroy-on-close属性,确保组件销毁,避免内存泄漏和状态污染
498503

499504
#### **4. 状态管理 (`src/pinia/`)**
500505

@@ -622,6 +627,130 @@ src/plugin/[插件名]/
622627

623628
---
624629

630+
## **⚠️ 前端工具库使用规范(强制)**
631+
632+
> **核心原则:在开发任何前端功能时,必须优先检查并使用 `src/utils/` 目录下已封装好的工具函数,严禁重复造轮子。**
633+
634+
`src/utils/` 目录提供了项目级别的通用工具集,涵盖 HTTP 请求、日期处理、格式转换、字符串操作、图片处理等多个方面。以下是各工具文件的功能说明:
635+
636+
### **工具文件清单**
637+
638+
#### `request.js` — HTTP 请求封装(核心)
639+
- 基于 Axios 封装的统一 HTTP 请求实例,内置全局 Loading 状态管理、JWT Token 自动注入、统一错误处理和响应拦截
640+
- **所有 API 请求必须且只能通过此模块发送,禁止直接使用 axios**
641+
- 用法:`import service from '@/utils/request'`
642+
643+
#### `date.js` — 日期格式化
644+
- 扩展了 `Date.prototype.Format` 方法,支持自定义格式如 `yyyy-MM-dd hh:mm:ss`
645+
- 导出 `formatTimeToStr(times, pattern)` 将时间戳或日期对象格式化为字符串
646+
- **需要格式化日期时,优先使用此工具,禁止自行手写日期格式化逻辑**
647+
- 用法:`import { formatTimeToStr } from '@/utils/date'`
648+
649+
#### `format.js` — 数据展示格式化(综合工具)
650+
- `formatBoolean(bool)` — 将布尔值转为 "是"/"否" 中文展示
651+
- `formatDate(time)` — 将时间转为 `yyyy-MM-dd hh:mm:ss` 格式字符串
652+
- `filterDict(value, options)` — 在字典选项数组(支持多级树形)中根据 value 查找对应的 label
653+
- `filterDataSource(dataSource, value)` — 在数据源(支持多级树形)中根据 value 查找 label,支持数组批量查找
654+
- `getDictFunc(type)` — 异步获取指定类型的字典数据
655+
- `ReturnArrImg(arr)` — 将图片路径(单个或数组)转为完整 URL,自动补全服务器前缀
656+
- `onDownloadFile(url)` — 触发文件下载
657+
- `setBodyPrimaryColor(primaryColor, darkMode)` — 动态设置主题色相关的 CSS 变量(支持亮/暗模式)
658+
- `CreateUUID()` — 生成 UUID v4 字符串
659+
- `getBaseUrl()` — 获取当前环境的 API BaseURL
660+
- **以上所有格式化场景优先使用此文件中的工具函数**
661+
- 用法:`import { formatBoolean, formatDate, filterDict, CreateUUID, ... } from '@/utils/format'`
662+
663+
#### `dictionary.js` — 字典数据获取
664+
- `getDict(type, options)` — 异步获取字典数据,支持 `depth`(深度)和 `value`(指定节点)参数,内置 Pinia store 缓存,避免重复请求
665+
- **凡是需要字典下拉数据、字典树形数据的场景,必须使用此工具**
666+
- 用法:`import { getDict } from '@/utils/dictionary'`
667+
668+
#### `stringFun.js` — 字符串处理
669+
- `toUpperCase(str)` — 首字母转大写
670+
- `toLowerCase(str)` — 首字母转小写
671+
- `toSQLLine(str)` — 驼峰命名转下划线(snake_case),如 `userName``user_name`
672+
- `toHump(name)` — 下划线命名转驼峰,如 `user_name``userName`
673+
- **进行命名格式转换时必须使用此工具,禁止使用正则手写**
674+
- 用法:`import { toUpperCase, toSQLLine, toHump } from '@/utils/stringFun'`
675+
676+
#### `params.js` — 系统参数获取
677+
- `getParams(key)` — 异步从 Pinia store 中获取系统参数,内置缓存
678+
- **获取系统配置参数时,优先使用此工具**
679+
- 用法:`import { getParams } from '@/utils/params'`
680+
681+
#### `bus.js` — 全局事件总线
682+
- 基于 `mitt` 封装的全局事件总线实例 `emitter`,用于跨组件通信
683+
- **跨层级组件通信优先使用此事件总线,避免滥用 Pinia**
684+
- 用法:`import { emitter } from '@/utils/bus'`
685+
686+
#### `closeThisPage.js` — 关闭当前标签页
687+
- `closeThisPage()` — 触发关闭当前多标签页的操作(通过事件总线发送 `closeThisPage` 事件)
688+
- **在需要程序化关闭当前页面时,必须使用此工具**
689+
- 用法:`import { closeThisPage } from '@/utils/closeThisPage'`
690+
691+
#### `downloadImg.js` — 图片下载
692+
- `downloadImage(imgsrc, name)` — 通过 Canvas 将图片转为 base64 后触发下载,支持跨域
693+
- **需要下载图片时,优先使用此工具**
694+
- 用法:`import { downloadImage } from '@/utils/downloadImg'`
695+
696+
#### `image.js` — 图片压缩
697+
- 导出 `ImageCompress` 类,支持图片等比压缩至指定最大宽高,并可限制文件大小
698+
- **上传图片前需要做压缩处理时,使用此工具**
699+
- 用法:`import ImageCompress from '@/utils/image'`
700+
701+
#### `event.js` — DOM 事件监听管理
702+
- `addEventListen(target, event, handler, capture)` — 安全地添加 DOM 事件监听
703+
- `removeEventListen(target, event, handler, capture)` — 安全地移除 DOM 事件监听
704+
- **手动操作 DOM 事件时,使用此工具以确保安全性**
705+
- 用法:`import { addEventListen, removeEventListen } from '@/utils/event'`
706+
707+
#### `env.js` — 环境判断
708+
- `isDev` — 是否为开发环境(Boolean)
709+
- `isProd` — 是否为生产环境(Boolean)
710+
- **需要区分运行环境时,使用此工具,禁止直接读取 `import.meta.env`**
711+
- 用法:`import { isDev, isProd } from '@/utils/env'`
712+
713+
#### `doc.js` — 外部文档跳转
714+
- `toDoc(url)` — 在新标签页打开指定 URL
715+
- 用法:`import { toDoc } from '@/utils/doc'`
716+
717+
#### `fmtRouterTitle.js` — 路由标题格式化
718+
- `fmtTitle(title, route)` — 解析路由标题中的动态参数插值(如 `${id}` 替换为路由 params/query 值)
719+
- 用法:`import { fmtTitle } from '@/utils/fmtRouterTitle'`
720+
721+
#### `page.js` — 页面标题生成
722+
- `getPageTitle(pageTitle, route)` — 根据页面标题和路由生成完整的浏览器 Tab 标题(格式:`页面名 - 应用名`
723+
- 用法:`import getPageTitle from '@/utils/page'`
724+
725+
#### `asyncRouter.js` — 异步路由处理
726+
- `asyncRouterHandle(asyncRouter)` — 将后端返回的路由配置(字符串 component 路径)动态转换为 Vue 组件的 import 函数,支持 `view/``plugin/` 目录
727+
- **动态路由相关逻辑已由此工具处理,不需要也不应该手动实现**
728+
- 用法:`import { asyncRouterHandle } from '@/utils/asyncRouter'`
729+
730+
#### `btnAuth.js` — 按钮权限
731+
- `useBtnAuth()` — Composition API Hook,返回当前路由挂载的按钮权限对象(来自 `route.meta.btns`),用于控制操作按钮的显示
732+
- **实现按钮级别权限控制时,必须使用此 Hook**
733+
- 用法:`import { useBtnAuth } from '@/utils/btnAuth'`
734+
735+
### **使用强制要求**
736+
737+
| 场景 | 必须使用的工具 |
738+
|------|----------------|
739+
| 发送 HTTP 请求 | `@/utils/request` |
740+
| 格式化日期时间 | `@/utils/date``@/utils/format` 中的 `formatDate` |
741+
| 获取字典数据 | `@/utils/dictionary` 中的 `getDict` |
742+
| 布尔值/字典值展示转换 | `@/utils/format` 中的 `formatBoolean` / `filterDict` |
743+
| 生成 UUID | `@/utils/format` 中的 `CreateUUID` |
744+
| 驼峰/下划线命名转换 | `@/utils/stringFun` |
745+
| 获取系统参数 | `@/utils/params` 中的 `getParams` |
746+
| 按钮权限判断 | `@/utils/btnAuth` 中的 `useBtnAuth` |
747+
| 跨组件事件通信 | `@/utils/bus` 中的 `emitter` |
748+
| 图片下载 | `@/utils/downloadImg` 中的 `downloadImage` |
749+
| 图片上传压缩 | `@/utils/image` 中的 `ImageCompress` |
750+
| 关闭当前 Tab 页 | `@/utils/closeThisPage` 中的 `closeThisPage` |
751+
752+
---
753+
625754
## **前后端协作规范**
626755

627756
### **接口协作规范**

.claude/rules/project_rules.md

Lines changed: 129 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -194,6 +194,8 @@ web/
194194

195195
- 结构体应继承 `global.GVA_MODEL` 以包含 `ID`, `CreatedAt`, `UpdatedAt` 等基础字段。
196196

197+
- 以上三个字段返回给前端并未做驼峰处理,json内依然是 `ID`, `CreatedAt`, `UpdatedAt`
198+
197199
- 必须为字段添加清晰的 `json``gorm` 标签。
198200

199201
- **⚠️ 重要提醒:数据类型一致性**
@@ -495,6 +497,9 @@ API函数的Swagger注释不仅用于生成API文档,也是前端开发的重
495497
- **必须**进行响应式数据管理
496498
- **必须**处理加载状态和错误状态
497499
- **必须**遵循Element Plus组件规范
500+
- **必须**优先使用UnoCSS原子化类名进行样式设计
501+
- **必须**优先el-drawer组件进行编辑,新增,步骤等操作
502+
- **必须**使用el-drawer和el-dialog组件是后一定携带,destroy-on-close属性,确保组件销毁,避免内存泄漏和状态污染
498503

499504
#### **4. 状态管理 (`src/pinia/`)**
500505

@@ -622,6 +627,130 @@ src/plugin/[插件名]/
622627

623628
---
624629

630+
## **⚠️ 前端工具库使用规范(强制)**
631+
632+
> **核心原则:在开发任何前端功能时,必须优先检查并使用 `src/utils/` 目录下已封装好的工具函数,严禁重复造轮子。**
633+
634+
`src/utils/` 目录提供了项目级别的通用工具集,涵盖 HTTP 请求、日期处理、格式转换、字符串操作、图片处理等多个方面。以下是各工具文件的功能说明:
635+
636+
### **工具文件清单**
637+
638+
#### `request.js` — HTTP 请求封装(核心)
639+
- 基于 Axios 封装的统一 HTTP 请求实例,内置全局 Loading 状态管理、JWT Token 自动注入、统一错误处理和响应拦截
640+
- **所有 API 请求必须且只能通过此模块发送,禁止直接使用 axios**
641+
- 用法:`import service from '@/utils/request'`
642+
643+
#### `date.js` — 日期格式化
644+
- 扩展了 `Date.prototype.Format` 方法,支持自定义格式如 `yyyy-MM-dd hh:mm:ss`
645+
- 导出 `formatTimeToStr(times, pattern)` 将时间戳或日期对象格式化为字符串
646+
- **需要格式化日期时,优先使用此工具,禁止自行手写日期格式化逻辑**
647+
- 用法:`import { formatTimeToStr } from '@/utils/date'`
648+
649+
#### `format.js` — 数据展示格式化(综合工具)
650+
- `formatBoolean(bool)` — 将布尔值转为 "是"/"否" 中文展示
651+
- `formatDate(time)` — 将时间转为 `yyyy-MM-dd hh:mm:ss` 格式字符串
652+
- `filterDict(value, options)` — 在字典选项数组(支持多级树形)中根据 value 查找对应的 label
653+
- `filterDataSource(dataSource, value)` — 在数据源(支持多级树形)中根据 value 查找 label,支持数组批量查找
654+
- `getDictFunc(type)` — 异步获取指定类型的字典数据
655+
- `ReturnArrImg(arr)` — 将图片路径(单个或数组)转为完整 URL,自动补全服务器前缀
656+
- `onDownloadFile(url)` — 触发文件下载
657+
- `setBodyPrimaryColor(primaryColor, darkMode)` — 动态设置主题色相关的 CSS 变量(支持亮/暗模式)
658+
- `CreateUUID()` — 生成 UUID v4 字符串
659+
- `getBaseUrl()` — 获取当前环境的 API BaseURL
660+
- **以上所有格式化场景优先使用此文件中的工具函数**
661+
- 用法:`import { formatBoolean, formatDate, filterDict, CreateUUID, ... } from '@/utils/format'`
662+
663+
#### `dictionary.js` — 字典数据获取
664+
- `getDict(type, options)` — 异步获取字典数据,支持 `depth`(深度)和 `value`(指定节点)参数,内置 Pinia store 缓存,避免重复请求
665+
- **凡是需要字典下拉数据、字典树形数据的场景,必须使用此工具**
666+
- 用法:`import { getDict } from '@/utils/dictionary'`
667+
668+
#### `stringFun.js` — 字符串处理
669+
- `toUpperCase(str)` — 首字母转大写
670+
- `toLowerCase(str)` — 首字母转小写
671+
- `toSQLLine(str)` — 驼峰命名转下划线(snake_case),如 `userName``user_name`
672+
- `toHump(name)` — 下划线命名转驼峰,如 `user_name``userName`
673+
- **进行命名格式转换时必须使用此工具,禁止使用正则手写**
674+
- 用法:`import { toUpperCase, toSQLLine, toHump } from '@/utils/stringFun'`
675+
676+
#### `params.js` — 系统参数获取
677+
- `getParams(key)` — 异步从 Pinia store 中获取系统参数,内置缓存
678+
- **获取系统配置参数时,优先使用此工具**
679+
- 用法:`import { getParams } from '@/utils/params'`
680+
681+
#### `bus.js` — 全局事件总线
682+
- 基于 `mitt` 封装的全局事件总线实例 `emitter`,用于跨组件通信
683+
- **跨层级组件通信优先使用此事件总线,避免滥用 Pinia**
684+
- 用法:`import { emitter } from '@/utils/bus'`
685+
686+
#### `closeThisPage.js` — 关闭当前标签页
687+
- `closeThisPage()` — 触发关闭当前多标签页的操作(通过事件总线发送 `closeThisPage` 事件)
688+
- **在需要程序化关闭当前页面时,必须使用此工具**
689+
- 用法:`import { closeThisPage } from '@/utils/closeThisPage'`
690+
691+
#### `downloadImg.js` — 图片下载
692+
- `downloadImage(imgsrc, name)` — 通过 Canvas 将图片转为 base64 后触发下载,支持跨域
693+
- **需要下载图片时,优先使用此工具**
694+
- 用法:`import { downloadImage } from '@/utils/downloadImg'`
695+
696+
#### `image.js` — 图片压缩
697+
- 导出 `ImageCompress` 类,支持图片等比压缩至指定最大宽高,并可限制文件大小
698+
- **上传图片前需要做压缩处理时,使用此工具**
699+
- 用法:`import ImageCompress from '@/utils/image'`
700+
701+
#### `event.js` — DOM 事件监听管理
702+
- `addEventListen(target, event, handler, capture)` — 安全地添加 DOM 事件监听
703+
- `removeEventListen(target, event, handler, capture)` — 安全地移除 DOM 事件监听
704+
- **手动操作 DOM 事件时,使用此工具以确保安全性**
705+
- 用法:`import { addEventListen, removeEventListen } from '@/utils/event'`
706+
707+
#### `env.js` — 环境判断
708+
- `isDev` — 是否为开发环境(Boolean)
709+
- `isProd` — 是否为生产环境(Boolean)
710+
- **需要区分运行环境时,使用此工具,禁止直接读取 `import.meta.env`**
711+
- 用法:`import { isDev, isProd } from '@/utils/env'`
712+
713+
#### `doc.js` — 外部文档跳转
714+
- `toDoc(url)` — 在新标签页打开指定 URL
715+
- 用法:`import { toDoc } from '@/utils/doc'`
716+
717+
#### `fmtRouterTitle.js` — 路由标题格式化
718+
- `fmtTitle(title, route)` — 解析路由标题中的动态参数插值(如 `${id}` 替换为路由 params/query 值)
719+
- 用法:`import { fmtTitle } from '@/utils/fmtRouterTitle'`
720+
721+
#### `page.js` — 页面标题生成
722+
- `getPageTitle(pageTitle, route)` — 根据页面标题和路由生成完整的浏览器 Tab 标题(格式:`页面名 - 应用名`
723+
- 用法:`import getPageTitle from '@/utils/page'`
724+
725+
#### `asyncRouter.js` — 异步路由处理
726+
- `asyncRouterHandle(asyncRouter)` — 将后端返回的路由配置(字符串 component 路径)动态转换为 Vue 组件的 import 函数,支持 `view/``plugin/` 目录
727+
- **动态路由相关逻辑已由此工具处理,不需要也不应该手动实现**
728+
- 用法:`import { asyncRouterHandle } from '@/utils/asyncRouter'`
729+
730+
#### `btnAuth.js` — 按钮权限
731+
- `useBtnAuth()` — Composition API Hook,返回当前路由挂载的按钮权限对象(来自 `route.meta.btns`),用于控制操作按钮的显示
732+
- **实现按钮级别权限控制时,必须使用此 Hook**
733+
- 用法:`import { useBtnAuth } from '@/utils/btnAuth'`
734+
735+
### **使用强制要求**
736+
737+
| 场景 | 必须使用的工具 |
738+
|------|----------------|
739+
| 发送 HTTP 请求 | `@/utils/request` |
740+
| 格式化日期时间 | `@/utils/date``@/utils/format` 中的 `formatDate` |
741+
| 获取字典数据 | `@/utils/dictionary` 中的 `getDict` |
742+
| 布尔值/字典值展示转换 | `@/utils/format` 中的 `formatBoolean` / `filterDict` |
743+
| 生成 UUID | `@/utils/format` 中的 `CreateUUID` |
744+
| 驼峰/下划线命名转换 | `@/utils/stringFun` |
745+
| 获取系统参数 | `@/utils/params` 中的 `getParams` |
746+
| 按钮权限判断 | `@/utils/btnAuth` 中的 `useBtnAuth` |
747+
| 跨组件事件通信 | `@/utils/bus` 中的 `emitter` |
748+
| 图片下载 | `@/utils/downloadImg` 中的 `downloadImage` |
749+
| 图片上传压缩 | `@/utils/image` 中的 `ImageCompress` |
750+
| 关闭当前 Tab 页 | `@/utils/closeThisPage` 中的 `closeThisPage` |
751+
752+
---
753+
625754
## **前后端协作规范**
626755

627756
### **接口协作规范**

0 commit comments

Comments
 (0)