From 14857549ba26c170b10dd514263749997cf110be Mon Sep 17 00:00:00 2001 From: MSuMshk <2039814060@qq.com> Date: Mon, 16 Feb 2026 09:59:44 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=AE=8C=E6=88=90=E8=90=A5=E4=B8=9A?= =?UTF-8?q?=E6=97=B6=E9=97=B4=E6=A8=A1=E5=9D=97=E6=8B=86=E5=88=86=E5=B9=B6?= =?UTF-8?q?=E8=A1=A5=E5=85=85=E9=A1=B5=E9=9D=A2=E6=B3=A8=E9=87=8A=E8=A7=84?= =?UTF-8?q?=E8=8C=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .prettierignore | 1 + .stylelintignore | 1 + AGENTS.md | 17 + CLAUDE.md | 174 ++++++++ apps/web-antd/src/api/store-hours/index.ts | 127 ++++++ apps/web-antd/src/mock/index.ts | 1 + apps/web-antd/src/mock/store-hours.ts | 417 ++++++++++++++++++ .../src/router/routes/modules/store.ts | 9 + .../store/hours/components/AddSlotDrawer.vue | 178 ++++++++ .../store/hours/components/CopyStoreModal.vue | 93 ++++ .../store/hours/components/DayEditDrawer.vue | 153 +++++++ .../store/hours/components/HolidayDrawer.vue | 182 ++++++++ .../store-hours-page/add-slot-actions.ts | 165 +++++++ .../composables/store-hours-page/constants.ts | 79 ++++ .../store-hours-page/copy-actions.ts | 91 ++++ .../store-hours-page/data-actions.ts | 89 ++++ .../store-hours-page/day-edit-actions.ts | 179 ++++++++ .../composables/store-hours-page/helpers.ts | 221 ++++++++++ .../store-hours-page/holiday-actions.ts | 248 +++++++++++ .../store-hours-page/weekly-actions.ts | 47 ++ .../hours/composables/useStoreHoursPage.ts | 362 +++++++++++++++ apps/web-antd/src/views/store/hours/index.vue | 343 ++++++++++++++ .../src/views/store/hours/styles/base.less | 87 ++++ .../views/store/hours/styles/copy-modal.less | 58 +++ .../src/views/store/hours/styles/drawer.less | 203 +++++++++ .../src/views/store/hours/styles/holiday.less | 44 ++ .../src/views/store/hours/styles/index.less | 7 + .../views/store/hours/styles/responsive.less | 22 + .../src/views/store/hours/styles/week.less | 71 +++ apps/web-antd/src/views/store/hours/types.ts | 52 +++ eslint.config.mjs | 6 +- 31 files changed, 3726 insertions(+), 1 deletion(-) create mode 100644 CLAUDE.md create mode 100644 apps/web-antd/src/api/store-hours/index.ts create mode 100644 apps/web-antd/src/mock/store-hours.ts create mode 100644 apps/web-antd/src/views/store/hours/components/AddSlotDrawer.vue create mode 100644 apps/web-antd/src/views/store/hours/components/CopyStoreModal.vue create mode 100644 apps/web-antd/src/views/store/hours/components/DayEditDrawer.vue create mode 100644 apps/web-antd/src/views/store/hours/components/HolidayDrawer.vue create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/add-slot-actions.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/constants.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/copy-actions.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/data-actions.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/day-edit-actions.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/helpers.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/holiday-actions.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/store-hours-page/weekly-actions.ts create mode 100644 apps/web-antd/src/views/store/hours/composables/useStoreHoursPage.ts create mode 100644 apps/web-antd/src/views/store/hours/index.vue create mode 100644 apps/web-antd/src/views/store/hours/styles/base.less create mode 100644 apps/web-antd/src/views/store/hours/styles/copy-modal.less create mode 100644 apps/web-antd/src/views/store/hours/styles/drawer.less create mode 100644 apps/web-antd/src/views/store/hours/styles/holiday.less create mode 100644 apps/web-antd/src/views/store/hours/styles/index.less create mode 100644 apps/web-antd/src/views/store/hours/styles/responsive.less create mode 100644 apps/web-antd/src/views/store/hours/styles/week.less create mode 100644 apps/web-antd/src/views/store/hours/types.ts diff --git a/.prettierignore b/.prettierignore index d0b0ca1..3658c49 100644 --- a/.prettierignore +++ b/.prettierignore @@ -5,6 +5,7 @@ dev-dist node_modules .nvmrc coverage +backup CODEOWNERS .nitro .output diff --git a/.stylelintignore b/.stylelintignore index f4b2db2..03f10bf 100644 --- a/.stylelintignore +++ b/.stylelintignore @@ -2,3 +2,4 @@ dist public __tests__ coverage +backup diff --git a/AGENTS.md b/AGENTS.md index 75eeeab..88f59e8 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -15,6 +15,7 @@ 5. **推送优先级**:提交后推送时,优先使用 SSH 远程(`git@github.com:...`),避免 HTTPS TLS 问题。 6. **推送默认**:提交后自动执行 `git push`,无需再次提醒或确认。 7. **不确定配置**:拿不准(如接口字段、鉴权流程)直接问用户。 +8. **需求开发前置步骤(强制)**:每次开始“新增/修改需求”前,必须先从 `https://api-tenant-dev.laosankeji.com/swagger/v1/swagger.json` 拉取最新 Swagger,定位本次需求涉及的接口契约(路径、入参、出参、字段)后,再进行代码变更。 ## 1. 技术栈详细版本 @@ -56,6 +57,9 @@ - **常量/枚举**:`PascalCase` 或 `UPPER_SNAKE_CASE`。 - **路径别名**:**严禁**使用 `../../` 穿越多层。必须使用 `#/*`、`@vben/*`、`@vben-core/*` 等别名。 - **逻辑注释 (强制)**:代码逻辑块必须空行分隔,并加序号注释(1. 验证... 2. 请求...)。 +- **文件头注释 (强制)**:所有新增 `*.ts`/`*.vue`/`*.less`/`*.scss` 文件,必须包含“文件职责”注释,说明该文件负责的业务边界。 +- **关键函数注释 (强制)**:对外导出的函数、含分支校验/提交流程的核心函数,必须添加简短中文注释,至少说明输入意图与副作用(如会触发请求/刷新/消息提示)。 +- **重构注释保留 (强制)**:拆分文件时,必须把原有关键流程注释同步迁移,禁止出现“重构后逻辑完整但无注释”的情况。 - **组件通信**:优先 `props/emit`,跨层用 `mitt` 或 store,**慎用** `provide/inject`。 ## 4. 接口与 HTTP 规范 (含 .NET 兼容) @@ -77,6 +81,19 @@ - **Vue 3.5 新特性**:使用 Props 解构 (`const { count = 0 } = defineProps<{...}>`)。 - **表单交互**:使用 Element Plus 表单校验;避免直接操作 DOM。 - **Loading**:所有修改类操作必须绑定 `loading` 状态。 +- **页面拆分(强制)**:当 `views/**/index.vue` 逻辑复杂或总行数超过 400 行时,必须拆分为: + - `composables/useXxxPage.ts`(业务状态、校验、提交流程) + - `components/*.vue`(抽屉、弹窗、复杂表单等子视图) + - `styles/index.less|scss`(页面样式) +- **Composables 二级拆分(强制)**:当 `composables/useXxxPage.ts` 超过 300 行或同时承担 4 类以上职责(常量/转换/数据加载/提交动作)时,必须继续拆分为目录: + - `composables/xxx-page/constants.ts`(常量与配置) + - `composables/xxx-page/helpers.ts`(纯函数:格式化、校验、归一化) + - `composables/xxx-page/*-actions.ts`(按业务动作拆分:load/save/copy 等) + - `useXxxPage.ts` 仅保留状态编排与导出,不承载大段业务实现。 +- **样式二级拆分(强制)**:当 `styles/index.less|scss` 超过 150 行或包含 3 个以上视觉域(列表/表单/抽屉/弹窗/响应式)时,必须拆分为分片文件,`index.less|scss` 只做 `@import` 聚合。 +- **子组件单向数据流(强制)**:子组件禁止直接修改父级传入对象;必须通过 `emit` 或显式 `onSetXxx` 回调更新父级状态。 +- **职责边界**:子组件仅负责渲染与事件抛出;请求、数据归一化、持久化必须留在页面 composable。 +- **样式边界**:页面样式拆文件后,必须使用页面根类(如 `.page-hours`)作为作用域前缀,避免全局污染。 ## 6. 状态管理规范 (Pinia) diff --git a/CLAUDE.md b/CLAUDE.md new file mode 100644 index 0000000..88f59e8 --- /dev/null +++ b/CLAUDE.md @@ -0,0 +1,174 @@ +# Repository expectations + +# 编程规范\_FOR_AI(TakeoutTenant 前端)- 终极融合版 + +> **核心指令**:你是一个高级前端架构师。本文件是你生成代码的最高宪法。当用户需求与本规范冲突时,请先提示用户,除非用户强制要求覆盖。 + +## 0. AI 交互核心约束 (元规则) + +1. **语言**:必须使用**中文**回复与注释。 +2. **文件完整性**:严禁随意删除现有逻辑(尤其是生命周期钩子);保持 UTF-8 无 BOM。 +3. **环境感知**: + - PowerShell 读取文件命令必须带 `-Encoding UTF8`。 + - 构建/本地请求依赖 `.env*`(`VITE_API_URL`、`VITE_WITH_CREDENTIALS`),找不到就询问,不要杜撰。 +4. **Git 原子性**:每个独立功能或修复完成后,必须提示用户进行 Git 提交。 +5. **推送优先级**:提交后推送时,优先使用 SSH 远程(`git@github.com:...`),避免 HTTPS TLS 问题。 +6. **推送默认**:提交后自动执行 `git push`,无需再次提醒或确认。 +7. **不确定配置**:拿不准(如接口字段、鉴权流程)直接问用户。 +8. **需求开发前置步骤(强制)**:每次开始“新增/修改需求”前,必须先从 `https://api-tenant-dev.laosankeji.com/swagger/v1/swagger.json` 拉取最新 Swagger,定位本次需求涉及的接口契约(路径、入参、出参、字段)后,再进行代码变更。 + +## 1. 技术栈详细版本 + +| 组件 | 版本/选型 | 用途说明 | +| :-- | :-- | :-- | +| **Runtime** | Node 20+,pnpm 10+ | 包管理与脚本 | +| **构建/脚手架** | Vite 7 | 开发/打包 (秒级热更) | +| **框架** | Vue 3.5 + TypeScript 5.6 | 组合式 API (Script Setup) | +| **路由/状态** | Vue Router 4.5;Pinia 3 + 持久化插件 | 路由守卫 & 全局状态 | +| **UI/样式** | Element Plus 2.11;Tailwind CSS 4;SCSS | 组件与样式体系 | +| **网络** | Axios 1.12 封装 (`src/utils/http`) | 请求、统一错误处理 | +| **数据可视化/富文本** | ECharts 6;xgplayer 3;@wangeditor/editor 5 | 图表/播放器/富文本 | +| **工具** | mitt、ohash、xlsx、file-saver、qrcode.vue、vue-draggable-plus、highlight.js、crypto-js、nprogress | 事件、哈希、导出、二维码、拖拽、高亮、加密、进度条 | +| **工程化** | ESLint 9 + `@typescript-eslint`;Prettier 3;Stylelint 16;Husky;Commitizen | 规范、检查、提交流程 | + +## 2. 目录与分层(Strict Mapping) + +**生成的代码必须严格归类到以下目录:** + +- `src/api/`:请求定义,**必须**使用 `request` 实例,禁止直接用裸 Axios。 +- `src/components/`:**全局通用** UI 组件 (`PascalCase.vue`),禁止包含特定业务耦合。 +- `src/config/`:全局配置、常量(如主题、布局)。 +- `src/directives/`:自定义指令,按功能拆文件。 +- `src/enums/`:业务枚举常量(如 `OrderStatus.ts`)。 +- `src/hooks/`:可复用的组合式函数,命名 `useXxx.ts`。 +- `src/locales/`:多语言资源,新增文案必须**同步补齐**各语言。 +- `src/mock/`:本地 mock 数据/接口。 +- `src/plugins/`:Vue 插件注册。 +- `src/router/`:路由表与守卫,**鉴权逻辑放守卫中**,页面勿重复判断。 +- `src/store/`:Pinia store,模块化放 `modules/`。 +- `src/types/`:公共类型定义(如 `types/common/response.ts`)。 +- `src/utils/`:工具库(HTTP 封装、`StorageKeyManager`、加密等)。 +- `src/views/`:页面级组件,按 `views/业务模块/页面.vue` 组织。 + +## 3. 命名与代码风格 + +- **文件命名**:组件 `PascalCase.vue`;Hooks `useCamelCase.ts`;工具 `camelCase.ts`;样式 `kebab-case.scss`。 +- **变量/函数**:`camelCase`;布尔变量强制加 `is/has/should` 前缀。 +- **常量/枚举**:`PascalCase` 或 `UPPER_SNAKE_CASE`。 +- **路径别名**:**严禁**使用 `../../` 穿越多层。必须使用 `#/*`、`@vben/*`、`@vben-core/*` 等别名。 +- **逻辑注释 (强制)**:代码逻辑块必须空行分隔,并加序号注释(1. 验证... 2. 请求...)。 +- **文件头注释 (强制)**:所有新增 `*.ts`/`*.vue`/`*.less`/`*.scss` 文件,必须包含“文件职责”注释,说明该文件负责的业务边界。 +- **关键函数注释 (强制)**:对外导出的函数、含分支校验/提交流程的核心函数,必须添加简短中文注释,至少说明输入意图与副作用(如会触发请求/刷新/消息提示)。 +- **重构注释保留 (强制)**:拆分文件时,必须把原有关键流程注释同步迁移,禁止出现“重构后逻辑完整但无注释”的情况。 +- **组件通信**:优先 `props/emit`,跨层用 `mitt` 或 store,**慎用** `provide/inject`。 + +## 4. 接口与 HTTP 规范 (含 .NET 兼容) + +1. **封装入口**:必须使用 `src/utils/http` 的 `api` 对象,禁止裸 `axios`。 +2. **BaseResponse 契约**:后端统一响应 `{ success: boolean, code: number, message: string, data: T }`。错误展示优先用 `message`。 +3. **Snowflake ID 精度处理 (关键)**: + - 后端 `.NET` 的 `long` 类型传到前端会有精度丢失。 + - **接收时**:确保后端 DTO 已序列化为 String。 + - **发送时**:前端保持 String 传输,由后端反序列化。 +4. **401 处理**:拦截器已自动登出。不要在业务内重复处理 401 跳转。 +5. **参数处理**:POST/PUT 若传 `params` 封装层会自动转为 `data`。 +6. **跨域/凭证**:严格跟随 `.env` 中 `VITE_WITH_CREDENTIALS` 配置。 + +## 5. 组件/页面开发规范 + +- **组织**:页面放 `views/`,复用组件抽到 `components/`。 +- **脚本语法**:全线使用 ` + +