# pure-admin-thin-backend **Repository Path**: jameswatt2008/pure-admin-thin-backend ## Basic Information - **Project Name**: pure-admin-thin-backend - **Description**: 这是一个OA项目的后端代码,由 NodeJS 构建 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 1 - **Created**: 2025-05-16 - **Last Updated**: 2025-05-16 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 后台管理系统 本系统借助 Node.js + MYSQL + VUE3 开发, 借助 JWT 进行用户认证, 借助 Redis 进行缓存, 在前端中,可接受静态路由和动态路由, 因此,借助后端判定登录账号的权限,从而返回对应的动态路由 ## 表格字段 员工表 Person: ``` sql Person ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '员工ID', `name` VARCHAR(20) NOT NULL COMMENT '员工姓名', `sex` VARCHAR(1) COMMENT '性别', `duty` VARCHAR(10) COMMENT '员工职务', `description` VARCHAR(30) COMMENT '员工描述', `org` VARCHAR(10) COMMENT '员工所属部门', `username` VARCHAR(20) NOT NULL UNIQUE COMMENT '员工账号', `password` TEXT NOT NULL COMMENT '员工密码' ) COMMENT '员工表'; ``` 部门表 Orgs: ```sql Orgs ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '部门ID', `name` VARCHAR(10) NOT NULL UNIQUE COMMENT '部门名称' ) COMMENT '部门表'; ``` 便签表 Notes: ```sql Notes ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '便签ID', `content` TEXT COMMENT '便签内容', `createTime` VARCHAR(20) COMMENT '创建时间', `personId` INT COMMENT '创建者' ) COMMENT '便签表'; ``` 任务表 Tasks: ```sql Tasks ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '任务ID', `content` TEXT COMMENT '任务内容', `createTime` VARCHAR(20) COMMENT '创建时间', `finishTime` VARCHAR(20) COMMENT '完成时间', `personId` INT COMMENT '创建者' ) COMMENT '任务表'; ``` 通讯录表 Contacts: (在获取通讯录信息接口部分,做表连接,将 Person 表和 Contacts 表的字段合并) ```sql Contacts ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '通讯录ID', `email` VARCHAR(20) COMMENT '联系人邮箱', `address` VARCHAR(50) COMMENT '联系人地址', `phone` VARCHAR(20) COMMENT '联系人电话', `personId` INT COMMENT '创建者' ) COMMENT '通讯录表'; ``` 公文表 Documents: ```sql Documents ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '公文ID', `title` VARCHAR(50) COMMENT '公文标题', `content` TEXT COMMENT '公文内容', `createTime` VARCHAR(20) COMMENT '创建时间', `type` VARCHAR(10) COMMENT '公文类型', `processed` VARCHAR(1) COMMENT '是否提交', `status` VARCHAR(10) COMMENT '审批状态', `reason` VARCHAR(30) COMMENT '拒绝原因', `personId` INT COMMENT '创建者' ) COMMENT '公文表'; ``` 新闻表 News: ```sql News ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '新闻ID', `title` VARCHAR(50) COMMENT '新闻标题', `content` TEXT COMMENT '新闻内容', `createTime` VARCHAR(20) COMMENT '创建时间', `personId` INT COMMENT '创建者' ) COMMENT '新闻表'; ``` 通知表 Notices: ```sql Notices ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '通知ID', `title` VARCHAR(50) COMMENT '通知标题', `content` TEXT COMMENT '通知内容', `createTime` VARCHAR(20) COMMENT '创建时间', `personId` INT COMMENT '创建者' ) COMMENT '通知表'; ``` 期刊表 Periodicals ```sql Periodicals ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '期刊ID', `title` VARCHAR(50) COMMENT '期刊标题', `content` TEXT COMMENT '期刊内容', `createTime` VARCHAR(20) COMMENT '创建时间', `personId` INT COMMENT '创建者' ) COMMENT '期刊表'; ``` 规章制度表 Regulations: ```sql Regulations ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '规章制度ID', `title` VARCHAR(50) COMMENT '规章制度标题', `content` TEXT COMMENT '规章制度内容', `createTime` VARCHAR(20) COMMENT '创建时间', `personId` INT COMMENT '创建者' ) COMMENT '规章制度表'; ``` 会议室表 MeetingRooms: ```sql MeetingRooms ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '会议室ID', `sn` VARCHAR(30) COMMENT '会议室名称', `position` VARCHAR(30) COMMENT '会议室位置', `description` VARCHAR(50) COMMENT '会议室描述' ) COMMENT '会议室表'; ``` 会议室申请表 MeetingRoomApply: ```sql MeetingRoomApply ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '会议室申请ID', `meetRoomId` INT COMMENT '会议室ID', `beginTime` VARCHAR(20) COMMENT '开始时间', `endTime` VARCHAR(20) COMMENT '结束时间', `applyReason` VARCHAR(50) COMMENT '申请原因', `status` VARCHAR(10) COMMENT '审批状态', `approvalReason` VARCHAR(50) COMMENT '审批原因', `personId` INT COMMENT '申请者' ) COMMENT '会议室申请表'; ``` 办公用品申请表 OfficeSuppliesApply: ```sql OfficeSuppliesApply ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '申请ID', `supplies` VARCHAR(30) COMMENT '申请用品', `num` INT COMMENT '申请数量', `applyReason` VARCHAR(50) COMMENT '申请原因', `status` VARCHAR(10) COMMENT '审批状态', `approvalReason` VARCHAR(50) COMMENT '审批原因', `personId` INT COMMENT '申请者' ) COMMENT '办公用品申请表'; ``` 图书表 Books: ```sql Books ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '图书ID', `name` VARCHAR(50) COMMENT '图书名称' ) COMMENT '图书表'; ``` 图书申请表 BooksApply: ```sql BooksApply ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '申请ID', `bookId` INT COMMENT '图书ID', `applyReason` VARCHAR(50) COMMENT '申请原因', `beginTime` VARCHAR(20) COMMENT '借用开始的时间点', `endTime` VARCHAR(20) COMMENT '归还时间点', `status` VARCHAR(10) COMMENT '审批状态', `approvalReason` VARCHAR(50) COMMENT '审批原因', `personId` INT COMMENT '申请者' ) COMMENT '图书申请表'; ``` 车辆表 Cars: ```sql Cars ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '车辆ID', `model` VARCHAR(50) COMMENT '车辆型号', `plateNumber` VARCHAR(20) COMMENT '车牌号' ) COMMENT '车辆表'; ``` 车辆申请表 CarsApply: ```sql CarsApply ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '申请ID', `carId` INT COMMENT '车辆ID', `applyReason` VARCHAR(50) COMMENT '申请原因', `beginTime` VARCHAR(20) COMMENT '借用开始的时间点', `endTime` VARCHAR(20) COMMENT '归还时间点', `status` VARCHAR(10) COMMENT '审批状态', `approvalReason` VARCHAR(50) COMMENT '审批原因', `personId` INT COMMENT '申请者' ) COMMENT '车辆申请表'; ``` 聊天记录表 ChatRecords: ```sql ChatRecords ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '聊天记录ID', `postId` INT COMMENT '发送者', `getId` INT COMMENT '接收者', `content` TEXT COMMENT '聊天内容', `createTime` VARCHAR(20) COMMENT '发送时间' ) COMMENT '聊天记录表'; ``` 邮箱表 Emails: ```sql Emails ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '邮件ID', `title` VARCHAR(50) COMMENT '邮件标题', `content` TEXT COMMENT '邮件内容', `postId` INT COMMENT '发送者', `getId` INT COMMENT '接收者', `isDelete` VARCHAR(10) COMMENT '是否删除', `createTime` VARCHAR(20) COMMENT '创建时间' ) COMMENT '邮箱表'; ``` 转正申请表 PositiveApply: ```sql PositiveApply ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '申请ID', `personId` INT COMMENT '申请者ID', `status` VARCHAR(10) COMMENT '审批状态', `createTime` VARCHAR(20) COMMENT '申请时间', `approvalReason` VARCHAR(50) COMMENT '审批原因' ) COMMENT '转正申请表'; ``` 离职申请表 RetireApply: ```sql RetireApply ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '申请ID', `personId` INT COMMENT '申请者ID', `status` VARCHAR(10) COMMENT '审批状态', `createTime` VARCHAR(20) COMMENT '申请时间', `approvalReason` VARCHAR(50) COMMENT '审批原因' ) COMMENT '离职申请表'; ``` 考勤表 Attendance: ```sql Attendance ( `id` int PRIMARY KEY AUTO_INCREMENT COMMENT '考勤ID', `personId` INT COMMENT '考勤者ID', `arriveTime` VARCHAR(20) COMMENT '到达时间', `leaveTime` VARCHAR(20) COMMENT '离开时间' ) COMMENT '考勤表'; ``` ## 接口文档 ### 登录部分 ```js // 登录接口 interface Route { path: "api/login"; method: POST; data: { username: string; password: string; }; response: { success: boolean; message: string; data?:{ accessToken, expires, ...user } }; } // 获取动态路由接口 interface Route { path: "api/getAsyncRoutes"; method: GET; response: { success: boolean; message: string; data?: Route[]; ; }; } ``` ### 个人办公模块部分 #### 我的便签 ```js // 新建便签 interface Route { path: "api/user/notes"; method: POST; data: { content: string; }; response: { success: boolean; message: string; data?: Note; } } // 获取所有便签 interface Route { path: "api/user/notes"; method: GET; response: { success: boolean; message: string; data?: Note[]; } } // 修改便签 interface Route { path: "api/user/notes/:id"; method: PUT; data: { content: string; }; response: { success: boolean; message: string; data?: Note; } } // 删除便签 interface Route { path: "api/user/notes/:id"; method: DELETE; response: { success: boolean; message: string; } } ``` #### 我的任务 ```js // 新建任务 interface Route { path: "api/user/tasks"; method: POST; data: { content: string; }; response: { success: boolean; message: string; data?: Task; } } // 获取所有任务 interface Route { path: "api/user/tasks"; method: GET; response: { success: boolean; message: string; data?: Task[]; } } // 删除任务 interface Route { path: "api/user/tasks/:id"; method: DELETE; response: { success: boolean; message: string; } } // 修改任务 interface Route { path: "api/user/tasks/:id"; method: PUT; data: { content: string; } response: { success: boolean; message: string; data?: Task; } } // 完成任务 interface Route { path: "api/user/tasks/finish/:id"; method: PUT; response: { success: boolean; message: string; data?: Task; } } ``` #### 通信录 通信录与员工是一对一的关系, 因此,我在登录时,就判断该用户是否拥有通信录, 如果没有,则自动创建一个空的通信录, 所以,没有新建通讯录的方法 ```js // 获取当前登录用户通讯录 interface Route { path: "api/user/contact"; method: GET; response: { success: boolean; message: string; data?: Contact; } } // 获取所有姓名不为空且不包含自己的用户的通讯录 interface Route { path: "api/user/contacts"; method: GET; response: { success: boolean; message: string; data?: Contact[]; } } // 修改自己的通讯录 // 会修改 Person 表对应属性 interface Route { path: "api/user/contact"; method: PUT; data: { name: string; phone: string; org: string; duty: string; email: string; } response: { success: boolean; message: string; data?: Contact; } } ``` ### 公文管理模块 该模块只有行政部门和管理员才会显示 #### 行政部门员工的公文维护 会判断权限 ```js // 新建公文 interface Route { path: "api/user/document"; method: POST; data: { title: string; content: string; type: ["通知", "批复", "请示", "其他"] }; response: { success: boolean; message: string; data?: Document; } } // 修改公文 interface Route { path: "api/user/document/:id"; method: PUT; data: { title: string; content: string; type: ["通知", "批复", "请示", "其他"] } response: { success: boolean; message: string; data?: Document; } } ``` #### 行政部门员工的归档处理 ```js // 审批三种状态为:已通过、未通过、待审批 // 获取所有待审批的公文 interface Route { path: "api/user/not_approved_documents"; method: GET; response: { success: boolean; message: string; data?: Document[]; } } // 获取所有未通过审批的公文 interface Route { path: "api/user/not_passed_documents"; method: GET; response: { success: boolean; message: string; data?: Document[]; } } // 获取所有已通过审批的公文 interface Route { path: "api/user/approved_documents"; method: GET; response: { success: boolean; message: string; data?: Document[]; } } // 删除公文 interface Route { path: "api/user/document/:id"; method: DELETE; response: { success: boolean; message: string; } } ``` #### 管理员员工的公文审批 ```js // 审批三种状态为:已通过、未通过、待审批 // 公文审批 interface Route { path: "api/user/document/:id"; method: PUT; data: { status: ["已通过", "未通过", "待审批"]; reason?: string; }; response: { success: boolean; message: string; data?: Document; } } ``` ### 公共信息模块 #### 行政部门员工的信息管理 后端动态给前端的公共信息模块路由中, 会带 `auths: ["btn_add"]`, 前端页面通过 `auths` 判断是否显示发布按钮 ```js // 发布新闻 interface Route { path: "api/user/news"; method: PUT; data: { title: string; content: string; }; response: { success: boolean; message: string; data?: News; } } // 发布通知 interface Route { path: "api/user/notice"; method: POST; data: { title: string; content: string; } response: { success: boolean; message: string; data?: Notice; } } // 发行期刊 interface Route { path: "api/user/periodical"; method: POST; data: { title: string; content: string; } response: { success: boolean; message: string; data?: Periodical; } } // 发布规章制度 interface Route { path: "api/user/regulation"; method: POST; data: { title: string; content: string; } response: { success: boolean; message: string; data?: Regulation; } } ``` #### 所有员工的信息管理 ```js // 获取所有新闻 interface Route { path: "api/user/news"; method: GET; response: { success: boolean; message: string; data?: News[]; } } // 获取所有通知 interface Route { path: "api/user/notices"; method: GET; response: { success: boolean; message: string; data?: Notice[]; } } // 获取所有期刊 interface Route { path: "api/user/periodicals"; method: GET; response: { success: boolean; message: string; data?: Periodical[]; } } // 获取所有规章制度 interface Route { path: "api/user/regulations"; method: GET; response: { success: boolean; message: string; data?: Regulation[]; } } ``` ### 行政办公模块 #### 所有员工 ```js // 会议室使用申请 interface Route { path: "api//user/meetingRoom"; method: POST; data: { meetRoomId: number; beginTime: number; // 时间戳 endTime: number; // 时间戳 applyReason: string; } response: { success: boolean; message: string; data?: Apply; } } // 获取所有会议室 interface Route { path: "api/user/meetingRooms"; method: GET; response: { success: boolean; message: string; data?: MeetingRoom[]; } } // 获取某个会议室申请记录 interface Route { path: "api/user/meetingRoom/:id"; method: GET; response: { success: boolean; message: string; } } // 获取登录用户的会议室使用申请记录 interface Route { path: "api/user/meetingRoom"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // 办公用品购买申请 interface Route { path: "api/user/supplies"; method: POST; data: { supplies: string; // 办公用品名称 num: number; // 数量 applyReason:string; // 申请理由 } response: { success: boolean; message: string; data?: Apply; } } // 获取当前用户的办公用品购买申请记录 interface Route { path: "api/user/supplies"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // 获取所有的图书 interface Route { path: "api/user/books"; method: GET; response: { success: boolean; message: string; data?: Book[]; } } // 按照书名模糊查询图书 interface Route { path: "/user/books/:name"; method: GET; response: { success: boolean; message: string; data?: Book[]; } } // 图书申请 interface Route { path: "api/user/books"; method: POST; data: { bookId: string; // 图书编号 applyReason: string;// 申请原因 } response: { success: boolean; message: string; data?: Apply; } } // 获取当前用户所有的图书申请 interface Route { path: "api/user/books/apply"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // 获取某个图书的所有申请 interface Route { path: "api/user/books/apply/:id"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // 获取所有车辆 interface Route { path: "api/user/cars"; method: GET; response: { success: boolean; message: string; data?: Car[]; } } // 车辆使用申请 interface Route { path: "api/user/cars"; method: POST; data: { carId: string; // 车辆编号 beginTime: number; // 开始时间戳 endTime: number; // 结束时间戳 applyReason: string;// 申请理由 } response: { success: boolean; message: string; data?: Apply; } } // 获取当前用户的车辆使用申请记录 interface Route { path: "api/user/cars/apply"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // 获取某个车辆的所有申请 interface Route { path: "api/user/cars/apply/:id"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // ``` #### 行政部门员工 ```js // 会议室使用审批 interface Route { path: "api/user/meetingRoom/:id"; method: PUT; data: { status: ["已通过", "未通过", "待审批"]; reason?: string; }; response: { success: boolean; message: string; data?: Apply; } } // 办公用品购买审批 interface Route { path: "api/user/supplies/:id"; method: PUT; data: { status: ["已通过", "未通过", "待审批"]; reason?: string; } response: { success: boolean; message: string; data?: Apply; } } // 图书申请审批 interface Route { path: "api/user/books/apply/:id; method: PUT; data: { status: ["已通过", "未通过", "待审批"]; reason?: string; // 审批未通过的理由 } response: { success: boolean; message: string; data?: Apply; } } // 车辆申请审批 interface Route { path: "api/user/cars/apply/:id"; method: PUT; data: { status: ["已通过", "未通过", "待审批"]; reason?: string; } response: { success: boolean; message: string; data?: Apply; } } ``` ### 消息管理模块 #### 聊天记录 ```js // 发送消息 interface Route { path: "api/user/chatRecord/:id"; method: POST; data: { content: string; } response: { success: boolean; message: string; data?: Message; } } // 获取除自己以外的所有用户 interface Route { path: "api/user/persons"; method: GET; response: { success: boolean; message: string; data?: Person[]; } } // 按照姓名模糊查询除自己以外的用户 interface Route { path: "api/user/persons/:name"; method: GET; response: { success: boolean; message: string; data?: Person[]; } } // 获取当前登录用户和某个用户的聊天记录 interface Route { path: "api/user/chatRecords/:id"; method: GET; response: { success: boolean; message: string; data?: Message[]; } } // 删除登录用户和某个用户的所有聊天记录 interface Route { path: "api/user/chatRecords/:id"; method: DELETE; response: { success: boolean; message: string; } } ``` #### 发件箱 ```js // 模糊查询通讯录中的邮箱账号 interface Route { path: "api/user/email/:email"; // 邮箱账号 method: GET; response: { success: boolean; message: string; data?: Contacts[]; } } // 发送邮件 interface Route { path: "api/user/email/:id"; method: POST; data: { title: string; content: string; } response: { success: boolean; message: string; data?: Email; } } // 获取所有 email 不为空且不包含自己的用户信息 interface Route { path: "api/user/getAllUsersWithEmail"; method: GET; response: { success: boolean; message: string; data?: Contacts[]; } } ``` #### 收件箱 ```js // 获取当前登录用户收到的所有未删除的邮件 interface Route { path: "api/user/getEmails"; method: GET; response: { success: boolean; message: string; data?: Email[]; } } // 获取当前登录用户发送的所有未删除的邮件 interface Route { path: "api/user/postEmails"; method: GET; response: { success: boolean; message: string; data?: Email[]; } } // 将登录用户的单个收件箱中的邮件放入垃圾箱 interface Route { path: "api/user/email/:id"; method: DELETE; response: { success: boolean; message: string; } } ``` #### 垃圾箱 ```js // 获取登录用户已放入垃圾箱的邮件 interface Route { path: "api/user/deleteEmails"; method: GET; response: { success: boolean; message: string; data?: Email[]; } } // 从垃圾箱中确认删除 interface Route { path: "api/user/deleteEmails/:id"; method: DELETE; response: { success: boolean; message: string; } } // 从垃圾箱中恢复 interface Route { path: "api/user/deleteEmails/:id"; method: PUT; response: { success: boolean; message: string; } } ``` ### 权限管理模块 ```js // 增加新用户 interface Route { path: "api/user/register"; method: POST; data: { name: string; sex:["男","女"]; duty: string; org: string; description: string; username: string; password: string; } response: { success: boolean; message: string; data?: Person; } } // 获取所有用户信息 (包括已离职和自己) interface Route { path: "api/user/allPerson"; method: GET; response: { success: boolean; message: string; data?: Person[]; } } // 获取所有部门 interface Route { path: "api/user/allOrgs"; method: GET; response: { success: boolean; message: string; data?: Org[]; } } // 删除用户 interface Route { path: "api/user/delete/:id"; method: DELETE; response: { success: boolean; message: string; } } // 获取某个用户的信息 interface Route { path: "api/user/getInfo/:id"; method: GET; response: { success: boolean; message: string; data?: Person; } } // 修改用户部门 interface Route { path: "api/user/changeOrg"; method: PUT; data: { org: string; } response: { success: boolean; message: string; data?: Person; } } // 修改自己的账号和密码 interface Route { path: "api/user/changeMyInfo"; method: PUT; data: { newUsername: string; oldPassword: string; newPassword: string; } response: { success: boolean; message: string; data?: Person; errors?: { newUsername?:string; oldPassword?:string; } } } ``` ### 人事档案模块 #### 人员履历 ```js // 获取某个用户的信息 // 人事部门可用 auths: ["btn_view"] interface Route { path: "api/user/getInfo/:id"; method: GET; response: { success: boolean; message: string; data?: Person; } } // 修改用户信息 interface Route { path: "api/user/changeInfo"; method: PUT; data: { name: string; sex:["男","女"]; duty: string; // 职务 org: string; // 部门 description: string; } response: { success: boolean; message: string; data?: Person; } } ``` #### 转正申请 ```js // 申请转正 interface Route { path: "api/user/positiveApply"; method: PUT; data: { reason: string; } response: { success: boolean; message: string; data?: Apply; } } // 获取当前登录用户的申请转正记录 interface Route { path: "api/user/positiveApply"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // 转正申请审批 // 管理层可用 auths: ["btn_approval"] interface Route { path: "api/user/positiveApply/:id"; method: PUT; data: { status: ["已通过","未通过"]; reason?: string; } response: { success: boolean; message: string; data?: Apply; } } ``` #### 离职申请 ```js // 离职申请 interface Route { path: "api/user/retireApply"; method: PUT; response: { success: boolean; message: string; data?: Apply; } } // 获取当前登录用户的离职申请记录 interface Route { path: "api/user/retireApply"; method: GET; response: { success: boolean; message: string; data?: Apply[]; } } // 离职申请审批 // 管理层可用 auths: ["btn_approval"] interface Route { path: "api/user/retireApply/:id"; method: PUT; data: { status: ["已通过","未通过"]; reason?: string; } response: { success: boolean; message: string; data?: Apply; } } ``` #### 员工考勤 ```js // 上班打卡 interface Route { path: "api/user/attendance/arrive"; method: PUT; response: { success: boolean; message: string; data?: Attendance; } } // 下班打卡 interface Route { path: "api/user/attendance/leave"; method: PUT; response: { success: boolean; message: string; data?: Attendance; } } // 获取当前登录用户的今日打卡记录 interface Route { path: "api/user/attendance"; method: GET; response: { success: boolean; message: string; data?: Attendance[]; } } // 查询所有员工的今日打卡情况 // 人事部门可用 auths: ["btn_view"] interface Route { path: "api/user/attendance/all"; method: GET; response: { success: boolean; message: string; data?: Attendance[]; } } ```