# dev-aims **Repository Path**: liangdandan/dev-aims ## Basic Information - **Project Name**: dev-aims - **Description**: aims - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-02-03 - **Last Updated**: 2026-02-04 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # AIMS 管理系统 > **基于 Vue2 + TypeScript + Pinia + UnoCSS + element-ui 的模块化管理系统框架** ## 🚀 快速开始 ```bash # 安装依赖 npm install # 启动开发服务器(默认端口 8080,HTTPS) npm run serve # 构建生产版本 npm run build # 分析打包体积 npm run analyze ``` ## 🎯 技术栈 - **Vue 2.7.16** - 主框架,支持 Composition API - **TypeScript 4.5.5** - 类型安全 - **Vue Router 3.5.1** - 路由管理 - **Pinia 2.2.6** - 状态管理(带持久化插件) - **UnoCSS 0.58.0** - 原子化 CSS 框架 - **element-ui 2.15.14** - UI 组件库(组件以 `el-` 开头,项目中以 `kc-` 开头) - **Axios 1.4.0** - HTTP 请求库 - **dayjs 1.11.9** - 日期处理 - **echarts** - 图表库(按需引用) ## 📁 项目结构 ``` src/ # 主应用(仅基础页面:登录/布局) ├── apiDefine/ # API 类型定义 ├── assets/images/ # 图片资源 + index.scss(ci-* 类定义) ├── components/ # 全局组件(自动注册) ├── router/ # 路由配置 ├── store/ # Pinia 状态管理 ├── styles/dark|light/var.scss # ⭐ 主题变量(7 个主题颜色 + 3 个背景边框变量) └── views/ # ❌ 登录页&导航栏(禁止新增页面) submodule/模块名/ # ✅ 所有新页面在此创建 ├── apiDefine/ # 模块API定义 ├── assets/images/ # 图片资源 + index.scss(ci-* 类定义) ├── router/ # 模块路由 ├── store/ # 模块状态 └── views/ # 模块页面 uno.config.ts # UnoCSS 配置(颜色变量注册) vue.config.js # Webpack 配置(px2rem 转换、代理等) ``` ## 📖 核心规范 ### 1️⃣ 页面生成位置 - ✅ **所有新页面必须在 `submodule/模块名/views/` 下创建** - ❌ **禁止在 `src/views/` 中生成新页面**(仅保留登录、导航栏等基础页面) ### 2️⃣ 样式规范(UnoCSS) **尺寸单位**: - ❌ 禁用 `px` 单位 - ✅ 换算规则:`1rem = 4×值 = 16px`(如 `w-60 = 15rem = 240px`) - ✅ 宽高相等时使用 `size-`(如 `size-full`、`size-16`) **颜色使用**: - ❌ 禁止直接使用颜色值(如 `bg-[#fff]`) - ✅ 必须使用主题颜色变量 - ✅ 7 个主题颜色:`primary`、`white`、`black`、`green`、`orange`、`red`、`blue` - ✅ 3 个背景边框变量:`bg`、`bc`、`bc-light` - ⚠️ **重要**:深色主题下 `--white` 与 `--black` 值是反转的,文字颜色不能使用 `c-white` **样式要求**: - ✅ 仅用 UnoCSS 原子类,禁止自定义 CSS - ✅ UI 组件宽度加 `!`:`` - ✅ 列表子项要有 `hover:bg-primary` 和选中时 `b-primary` 样式 ### 3️⃣ TypeScript 类型 - ✅ 必须用 `ResponseType` / `ResponseTypeFromArray` 从 `apiDefine` 推断类型 - ❌ 禁止用 `interface` 定义 API 响应类型 ```typescript import { ResponseType, ResponseTypeFromArray } from 'utils/ajax' type Summary = ResponseType<'/api/home/device/summary'> type TableList = ResponseType<'/api/demo/table/list', 'list'> type TableItem = ResponseTypeFromArray<'/api/demo/table/list', 'list'> ``` ### 4️⃣ 命名规范 | 类别 | 规则 | 示例 | | --------- | ---------------------- | --------------------------------------- | | 组件 name | `PascalCase` | `UserList` | | 加载状态 | `loading` / `*Loading` | `loading` `tableLoading` | | 表单数据 | `form` / `*Form` | `form` `searchForm` | | 表格数据 | `tableData` / `*List` | `tableData` `userList` | | 分页参数 | `pagination` | `{ pageNo: 1, pageSize: 10, total: 0 }` | | 弹窗状态 | `*Visible` | `dialogVisible` | | 初始化 | `init*` | `init()` `initChart()` | | 数据获取 | `fetch*` | `fetchList()` `fetchDetail()` | | 事件处理 | `handle*` | `handleSubmit()` `handleDelete()` | | 弹窗控制 | `open*/close*Dialog` | `openAddDialog()` `closeDialog()` | ### 5️⃣ API 请求 **流程**:在 `apiDefine/index.ts` 定义接口 → 组件中 `this.$ajax(url, params, method)` 调用 ```typescript // 1. 定义接口 '/api/meeting/list': { method: 'POST' as 'POST', request: { pageNo: 0, pageSize: 10 }, response: { list: [{ id: 0, name: '', status: 0, start_time: '' }], total: 0 } } // 2. 组件中调用 let res = await this.$ajax('/api/meeting/list', { pageNo: 1, pageSize: 10 }, 'POST') ``` ### 6️⃣ 组件使用 - **element-ui**(`el-` 前缀,项目中以 `kc-` 开头):`` `` `` 等 - **echarts**:`mounted()` 中 `this.$echarts.init()` + `setOption()`,`beforeDestroy()` 中 `dispose()` - **全局组件**:放入 `src/components/` 或 `submodule/xxx/components/` ### 7️⃣ 图片资源 图片放入 `submodule/xx/assets/images/` → 在 `submodule/xx/assets/index.scss` 定义 `ci-*` 类(使用 mask data:image/svg+xml 占位) → 组件中 `` ## ⚡ 快速参考 ### UnoCSS 常用类 | 类别 | 常用类 | 说明 | | ---- | ------------------------------------------------- | ------------------------------ | | 布局 | `flex` `flex-col` `flex-center` `flex-1` | 弹性布局 | | 对齐 | `items-center` `justify-between` `justify-center` | 对齐方式 | | 尺寸 | `size-full` `size-16` `w-60` `h-full` | `1rem = 4×值 = 16px` | | 间距 | `p-2` `m-2` `gap-2` `mb-2` | `p-2 = 0.5rem = 8px` | | 文本 | `text-ellipsis` `c-secondary` `text-4` | `text-4 = 1rem = 16px` | | 组合 | `card` `shadow` `pointer` `disabled` | `card` = b + rd + shadow + p-2 | ### 主题颜色变量 | 类别 | 示例 | 说明 | | -------- | --------------------------------------------------------------------- | ------------------------------------------ | | 主题 | `--primary` `--black` `--white` `--green` `--orange` `--red` `--blue` | 7 个核心颜色, 均支持透明度,如 bg-black/45 | | 背景边框 | `--bg` `--bc` | 默认背景/默认边框 | | 文字 | `c-primary` `c-black` `c-text-secondary` `c-text-gray` | 主要/默认/次要/置灰 | ## 🔧 路径别名 - `@` → `src/` - `submodule` → `submodule/` - `utils` → `utils/` ## 🌍 环境配置 项目启动时会从 `public/static/config/global-${NODE_ENV}.json` 加载配置: - `global-development.json` - 开发环境配置 - `global-production.json` - 生产环境配置 配置项: - `BASE_URL` - API 基础地址 - `CLOUD_RBAC_URL` - 权限服务地址 - `CUSTOM_CONFIG` - 自定义配置 ## ✨ 功能特性 - ✅ 模块化架构(子模块系统) - ✅ JWT 认证(自动管理 Token) - ✅ 路由守卫(自动检查认证) - ✅ 状态持久化(Pinia + persist) - ✅ 深色主题(科技蓝) - ✅ 组件自动注册 - ✅ TypeScript 类型支持 - ✅ px2rem 自动转换 ## 📚 相关文档 - **[CLAUDE.md](./CLAUDE.md)** - ⭐ 详细开发指南(专为 AI 代码生成工具设计,包含完整规范和工作流) - [uno.config.ts](./uno.config.ts) - UnoCSS 配置文件 ## 📝 注意事项 1. Vue2 的 computed 对 ts 支持不好,若要使用 this,先定义 `let _this: any = this` 2. 使用 `text-ellipsis` 样式时,请同步添加 `:title` 属性 3. 字体默认为 `text-3.5 c-black`,无需生成 `text-3.5` `c-black` 样式 4. 已有全局样式 `{ border: 0 solid var(--bc) }`,设置边框用 `b` 就可以了 5. uno.config.ts 中定义了两个 variants,其中`:`可针对子项进行样式设置,`dark-`可针对深色主题单独定制。如:`.el-input:c-primary`,`dark-c-black/70`, 使用 unoCss 插件后,如果样式没带下划虚线,请检查样式书写是否符合规范 6. Vue (Official) 3.0.8 为必装插件,兼容 vue2 下的 ts 语法(更高版本不支持 vue2 的 ts),使用 Vue.extend({...})即可应用 ts 语法识别 7. 添加路由时要写中文 name ## 🌐 浏览器支持 - Chrome >= 88 ## License Private