From 37052ed4fa6750b842969830c37993d01bdd4c59 Mon Sep 17 00:00:00 2001 From: cjy <2436221054@qq.com> Date: Tue, 29 Apr 2025 23:09:15 +0800 Subject: [PATCH 1/7] =?UTF-8?q?=E2=80=9C1.2=E2=80=9D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- client/src/apis/accident.ts | 42 +++- client/src/apis/depositRecharge.ts | 55 ++++- client/src/apis/elderRecord.ts | 73 +++++- client/src/apis/nurseGrade.ts | 91 ++++++-- client/src/apis/nurseReserve.ts | 86 ++++++- client/src/apis/outward.ts | 88 +++++++- client/src/apis/retreatApply.ts | 36 ++- client/src/apis/service.ts | 107 +++++++-- client/src/apis/staff.ts | 75 ++++++- client/src/apis/visit.ts | 86 ++++++- .../controller/AccidentController.java | 172 ++++++++++++-- .../controller/ActiveController.java | 154 +++++++++++-- .../controller/ActiveTypeController.java | 120 +++++++++- .../controller/ElderRecordController.java | 152 +++++++++++-- .../controller/NurseGradeController.java | 167 ++++++++++++-- .../controller/NurseReserveController.java | 139 ++++++++++-- .../controller/OutwardController.java | 212 ++++++++++++++++-- .../controller/ReserveController.java | 147 ++++++++++-- .../controller/RetreatApplyController.java | 77 ++++++- .../controller/ServiceProjectController.java | 194 ++++++++++++++-- .../controller/StaffController.java | 123 ++++++++-- .../controller/VisitController.java | 144 ++++++++++-- 22 files changed, 2259 insertions(+), 281 deletions(-) diff --git a/client/src/apis/accident.ts b/client/src/apis/accident.ts index 8e87112..1b446d9 100644 --- a/client/src/apis/accident.ts +++ b/client/src/apis/accident.ts @@ -1,35 +1,57 @@ +// 从 "@/utils" 模块中导入 http 对象,用于发起 HTTP 请求 import { http } from "@/utils"; +// 从 "@/apis/bookManage" 模块中导入 IPageSearchElderByKey 接口 import { IPageSearchElderByKey } from "@/apis/bookManage"; +// 定义一个名为 IPageAccidentByKey 的接口,用于分页查询事故登记时的数据结构 interface IPageAccidentByKey { + // 老人姓名 elderName: string; + // 护工姓名 staffName: string; } +// 定义一个名为 IAddAccident 的接口,用于新增事故登记时的数据结构 interface IAddAccident { + // 事故登记的 ID id: number; + // 老人的 ID elderId: number; + // 护工的 ID staffId: number; + // 事故发生日期 occurDate: string; + // 事故描述 description: string; + // 事故相关图片 picture: string; } +// 定义一个名为 IGetAccidentById 的接口,用于根据编号获取事故登记时的数据结构 interface IGetAccidentById { + // 事故登记的 ID accidentId: string; } +// 定义一个名为 IEditAccident 的接口,用于编辑事故登记时的数据结构 interface IEditAccident { + // 事故登记的 ID id: number; + // 姓名 name: string; + // 电话号码 phone: string; + // 关系 relation: string; + // 事故日期字符串 accidentDateStr: string; + // 事故编号 accidentNum: number; } -// 分页查询事故登记 +// 定义一个异步函数 pageAccidentByKey,用于分页查询事故登记 export async function pageAccidentByKey(data: IPageAccidentByKey) { + // 使用 http 对象发起 GET 请求,请求路径为 "/api/accident/pageAccidentByKey",并将 data 对象展开作为请求参数 return http.get("/api/accident/pageAccidentByKey", { params: { ...data @@ -37,8 +59,9 @@ export async function pageAccidentByKey(data: IPageAccidentByKey) { }); } -// 分页搜索老人 +// 定义一个异步函数 pageSearchElderByKey,用于分页搜索老人 export async function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用 http 对象发起 GET 请求,请求路径为 "/api/accident/pageSearchElderByKey",并将 data 对象展开作为请求参数 return http.get("/api/accident/pageSearchElderByKey", { params: { ...data @@ -46,18 +69,21 @@ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { }); } -// 获取护工列表 +// 定义一个异步函数 listAccidentStaff,用于获取护工列表 export async function listAccidentStaff() { + // 使用 http 对象发起 GET 请求,请求路径为 "/api/accident/listAccidentStaff" return http.get("/api/accident/listAccidentStaff"); } -// 新增事故登记 +// 定义一个函数 addAccident,用于新增事故登记 export function addAccident(data: IAddAccident) { + // 使用 http 对象发起 POST 请求,请求路径为 "/api/accident/addAccident",并将 data 对象作为请求体 return http.post("/api/accident/addAccident", data); } -// 根据编号获取事故登记 +// 定义一个异步函数 getAccidentById,用于根据编号获取事故登记 export async function getAccidentById(data: IGetAccidentById) { + // 使用 http 对象发起 GET 请求,请求路径为 "/api/accident/getAccidentById",并将 data 对象展开作为请求参数 return http.get("/api/accident/getAccidentById", { params: { ...data @@ -65,13 +91,15 @@ export async function getAccidentById(data: IGetAccidentById) { }); } -// 编辑事故登记 +// 定义一个函数 editAccident,用于编辑事故登记 export function editAccident(data: IEditAccident) { + // 使用 http 对象发起 PUT 请求,请求路径为 "/api/accident/editAccident",并将 data 对象作为请求体 return http.put("/api/accident/editAccident", data); } -// 删除事故登记 +// 定义一个异步函数 deleteAccident,用于删除事故登记 export async function deleteAccident(data: IGetAccidentById) { + // 使用 http 对象发起 DELETE 请求,请求路径为 "/api/accident/deleteAccident",并将 data 对象展开作为请求参数 return http.delete("/api/accident/deleteAccident", { params: { ...data diff --git a/client/src/apis/depositRecharge.ts b/client/src/apis/depositRecharge.ts index 4bb2d1d..ed6ef32 100644 --- a/client/src/apis/depositRecharge.ts +++ b/client/src/apis/depositRecharge.ts @@ -1,24 +1,47 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; + +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口, +// 用于描述分页搜索老人时的请求参数结构 import { IPageSearchElderByKey } from "@/apis/bookManage"; +// 定义一个接口 IPageDepositRechargeByKey,用于描述分页查询预存充值时的请求参数结构 interface IPageDepositRechargeByKey { - idNum:string; - name:string; - elderName:string; + // 身份证号码,用于筛选预存充值记录,类型为字符串 + idNum: string; + // 姓名,用于筛选预存充值记录,类型为字符串 + name: string; + // 老人姓名,用于筛选预存充值记录,类型为字符串 + elderName: string; + // 电话,用于筛选预存充值记录,类型为字符串 phone: string; + // 老人电话,用于筛选预存充值记录,类型为字符串 elderPhone: string; } +// 定义一个接口 IRecharge,用于描述入住老人账户充值时的请求参数结构 interface IRecharge { + // 老人 ID,用于指定要充值的老人账户,类型为字符串 elderId: string; + // 充值金额,用于指定充值的金额,类型为字符串 amount: string; } -// 分页查询预存充值 +/** + * 定义一个异步函数 pageDepositRechargeByKey,用于分页查询预存充值记录 + * @param data - 一个符合 IPageDepositRechargeByKey 接口的对象,包含查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询预存充值记录的响应结果 + */ export async function pageDepositRechargeByKey(data: IPageDepositRechargeByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, 'elderName') ? (data.name = data.elderName) : '' - Reflect.has(data, 'elderPhone') ? (data.phone = data.elderPhone) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以请求前增加一些这两个字段 + // 如果 data 对象中有 'elderName' 字段,则将其值赋给 'name' 字段 + Reflect.has(data, 'elderName')? (data.name = data.elderName) : ''; + // 如果 data 对象中有 'elderPhone' 字段,则将其值赋给 'phone' 字段 + Reflect.has(data, 'elderPhone')? (data.phone = data.elderPhone) : ''; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/depositRecharge/pageDepositRechargeByKey" + // 将处理后的 data 对象展开作为请求的参数 return http.get("/api/depositRecharge/pageDepositRechargeByKey", { params: { ...data @@ -26,16 +49,28 @@ export async function pageDepositRechargeByKey(data: IPageDepositRechargeByKey) }); } -// 分页搜索老人 +/** + * 定义一个函数 pageSearchElderByKey,用于分页搜索老人 + * @param data - 一个符合 IPageSearchElderByKey 接口的对象,包含搜索所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页搜索老人的响应结果 + */ export function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/depositRecharge/pageSearchElderByKey" + // 将 data 对象展开作为请求的参数 return http.get('/api/depositRecharge/pageSearchElderByKey', { params: { ...data } - }) + }); } -// 入住老人账户充值 +/** + * 定义一个函数 recharge,用于入住老人账户充值 + * @param data - 一个符合 IRecharge 接口的对象,包含充值所需的参数 + * @returns 一个 Promise 对象,解析后得到的是入住老人账户充值操作的响应结果 + */ export function recharge(data: IRecharge) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/depositRecharge/recharge" + // 将 data 对象作为请求的主体 return http.put("/api/depositRecharge/recharge", data); } diff --git a/client/src/apis/elderRecord.ts b/client/src/apis/elderRecord.ts index 6ae94ae..ead9262 100644 --- a/client/src/apis/elderRecord.ts +++ b/client/src/apis/elderRecord.ts @@ -1,43 +1,72 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可能是对 HTTP 请求库(如 axios)的封装,用于发起各种 HTTP 请求 import { http } from "@/utils"; +// 定义一个接口 IPageElderByKey,用于描述分页查询员工(这里可能是长者相关,名称可能有误)时的请求参数结构 interface IPageElderByKey { + // 姓名,用于筛选,类型为字符串 name: string; + // 长者姓名,用于筛选,类型为字符串 elderName: string; + // 身份证号码,用于筛选,类型为字符串 idNum: string; + // 性别,用于筛选,类型为字符串 sex: string; + // 长者性别,用于筛选,类型为字符串 elderSex: string; } +// 定义一个接口 IGetElderById,用于描述根据编号获取长者信息时的请求参数结构 interface IGetElderById { + // 长者 ID,类型为字符串 elderId: string; } +// 定义一个接口 IEditElder,用于描述编辑长者信息时的数据结构 interface IEditElder { + // 长者 ID,类型为数字 id: number; + // 姓名,类型为字符串 name: string; + // 身份证号码,类型为字符串 idNum: string; + // 年龄,类型为数字 age: number; + // 性别,类型为字符串 sex: string; + // 电话号码,类型为字符串 phone: string; + // 地址,类型为字符串 address: string; } -// 性别 +// 定义一个名为 sexList 的常量,是一个包含性别选项的数组,每个选项有标签和对应的值 export const sexList = [ { label: "男", value: "男" }, { label: "女", value: "女" } ]; -// 导出excel +/** + * 定义一个函数 exportExcel,用于导出 Excel 文件 + * @returns 一个 Promise 对象,解析后得到的是导出 Excel 文件操作的响应结果 + */ export function exportExcel() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/elderRecord/exportExcel" return http.get("/api/elderRecord/exportExcel"); } -// 分页查询员工 +/** + * 定义一个异步函数 pageElderByKey,用于分页查询员工(长者) + * @param data - 一个符合 IPageElderByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询的响应结果 + */ export async function pageElderByKey(data: IPageElderByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, "sex") ? (data.elderSex = data.sex) : ""; - Reflect.has(data, "name") ? (data.elderName = data.name) : ""; + // 因为后台返回的字段与前端表单数据的 prop 不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 + // 如果 data 对象中有 "sex" 字段,则将其值赋给 "elderSex" 字段 + Reflect.has(data, "sex")? (data.elderSex = data.sex) : ""; + // 如果 data 对象中有 "name" 字段,则将其值赋给 "elderName" 字段 + Reflect.has(data, "name")? (data.elderName = data.name) : ""; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/elderRecord/pageElderByKey" + // 将处理后的 data 对象展开作为请求的参数 return http.get("/api/elderRecord/pageElderByKey", { params: { ...data @@ -45,8 +74,14 @@ export async function pageElderByKey(data: IPageElderByKey) { }); } -// 根据编号获取长者信息 +/** + * 定义一个异步函数 getElderById,用于根据编号获取长者信息 + * @param data - 一个符合 IGetElderById 接口的对象,包含根据编号获取长者信息所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取长者信息的响应结果 + */ export async function getElderById(data: IGetElderById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/elderRecord/getElderById" + // 将 data 对象展开作为请求的参数 return http.get("/api/elderRecord/getElderById", { params: { ...data @@ -54,8 +89,14 @@ export async function getElderById(data: IGetElderById) { }); } -// 根据编号获取长者档案 +/** + * 定义一个异步函数 getElderRecordById,用于根据编号获取长者档案 + * @param data - 一个符合 IGetElderById 接口的对象,包含根据编号获取长者档案所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取长者档案的响应结果 + */ export async function getElderRecordById(data: IGetElderById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/elderRecord/getElderRecordById" + // 将 data 对象展开作为请求的参数 return http.get("/api/elderRecord/getElderRecordById", { params: { ...data @@ -63,13 +104,25 @@ export async function getElderRecordById(data: IGetElderById) { }); } -// 编辑长者 +/** + * 定义一个函数 editElder,用于编辑长者信息 + * @param data - 一个符合 IEditElder 接口的对象,包含编辑长者信息所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑长者信息操作的响应结果 + */ export function editElder(data: IEditElder) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/elderRecord/editElder" + // 将 data 对象作为请求的主体 return http.put("/api/elderRecord/editElder", data); } -// 删除长者 +/** + * 定义一个异步函数 deleteElder,用于删除长者 + * @param data - 一个符合 IGetElderById 接口的对象,包含删除长者所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除长者操作的响应结果 + */ export async function deleteElder(data: IGetElderById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/elderRecord/deleteElder" + // 将 data 对象展开作为请求的参数 return http.delete("/api/elderRecord/deleteElder", { params: { ...data diff --git a/client/src/apis/nurseGrade.ts b/client/src/apis/nurseGrade.ts index b215ea8..0bd92a7 100644 --- a/client/src/apis/nurseGrade.ts +++ b/client/src/apis/nurseGrade.ts @@ -1,37 +1,64 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; + +// 从 "@/apis/service" 模块导入 IPageServiceByKey 接口, +// 用于描述分页查询服务时的请求参数结构 import { IPageServiceByKey } from "@/apis/service"; +// 定义一个接口 IPageNurseGradeByKey,用于描述分页查询护理等级时的请求参数结构 interface IPageNurseGradeByKey { - name:string; + // 名称,用于筛选护理等级,类型为字符串 + name: string; + // 护理等级名称,用于筛选护理等级,类型为字符串 gradeName: string; - type:string; + // 类型,用于筛选护理等级,类型为字符串 + type: string; + // 护理类型,用于筛选护理等级,类型为字符串 nurseType: string; } +// 定义一个接口 IAddNurseGrade,用于描述新增护理等级时的数据结构 interface IAddNurseGrade { + // 护理等级的 ID,类型为数字 id: number; + // 护理等级的名称,类型为字符串 name: string; + // 护理等级的类型,类型为字符串 type: string; + // 护理等级的月价格,类型为数字 monthPrice: number; - serviceIdList: any ; + // 服务 ID 列表,类型为 any,需根据实际情况调整 + serviceIdList: any; } +// 定义一个接口 IGetNurseGradeById,用于描述根据编号查询护理等级时的请求参数结构 interface IGetNurseGradeById { - nurseGradeId: string + // 护理等级 ID,类型为字符串 + nurseGradeId: string; } -// 护理类型 +// 定义一个名为 INurseTypeList 的常量,是一个包含护理类型选项的数组,每个选项有标签和对应的值 export const INurseTypeList = [ { label: "自理", value: "自理" }, { label: "介护", value: "介护" }, { label: "全护", value: "全护" } ]; -// 分页查询护理等级 +/** + * 定义一个异步函数 pageNurseGradeByKey,用于分页查询护理等级 + * @param data - 一个符合 IPageNurseGradeByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询护理等级的响应结果 + */ export async function pageNurseGradeByKey(data: IPageNurseGradeByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, 'name') ? (data.gradeName = data.name) : '' - Reflect.has(data, 'type') ? (data.nurseType = data.type) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以请求前增加一些这两个字段 + // 如果 data 对象中有 'name' 字段,则将其值赋给 'gradeName' 字段 + Reflect.has(data, 'name')? (data.gradeName = data.name) : ''; + // 如果 data 对象中有 'type' 字段,则将其值赋给 'nurseType' 字段 + Reflect.has(data, 'type')? (data.nurseType = data.type) : ''; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseGrade/pageNurseGradeByKey" + // 将处理后的 data 对象展开作为请求的参数 return http.get("/api/nurseGrade/pageNurseGradeByKey", { params: { ...data @@ -39,13 +66,23 @@ export async function pageNurseGradeByKey(data: IPageNurseGradeByKey) { }); } -// 获取服务类型 +/** + * 定义一个函数 listServiceType,用于获取服务类型 + * @returns 一个 Promise 对象,解析后得到的是获取服务类型的响应结果 + */ export function listServiceType() { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/nurseGrade/listServiceType" return http.post("/api/nurseGrade/listServiceType"); } -// 分页查询服务 +/** + * 定义一个异步函数 pageServiceByKey,用于分页查询服务 + * @param data - 一个符合 IPageServiceByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询服务的响应结果 + */ export async function pageServiceByKey(data: IPageServiceByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseGrade/pageServiceByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/nurseGrade/pageServiceByKey", { params: { ...data @@ -53,13 +90,25 @@ export async function pageServiceByKey(data: IPageServiceByKey) { }); } -// 新增护理等级 +/** + * 定义一个函数 addNurseGrade,用于新增护理等级 + * @param data - 一个符合 IAddNurseGrade 接口的对象,包含新增护理等级所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增护理等级操作的响应结果 + */ export function addNurseGrade(data: IAddNurseGrade) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/nurseGrade/addNurseGrade" + // 将 data 对象作为请求的主体 return http.post("/api/nurseGrade/addNurseGrade", data); } -// 根据编号查询护理等级 +/** + * 定义一个异步函数 getNurseGradeById,用于根据编号查询护理等级 + * @param data - 一个符合 IGetNurseGradeById 接口的对象,包含根据编号查询护理等级所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询护理等级的响应结果 + */ export async function getNurseGradeById(data: IGetNurseGradeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseGrade/getNurseGradeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/nurseGrade/getNurseGradeById", { params: { ...data @@ -67,13 +116,25 @@ export async function getNurseGradeById(data: IGetNurseGradeById) { }); } -// 编辑护理等级 +/** + * 定义一个函数 editNurseGrade,用于编辑护理等级 + * @param data - 一个符合 IAddNurseGrade 接口的对象,包含编辑护理等级所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑护理等级操作的响应结果 + */ export function editNurseGrade(data: IAddNurseGrade) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/nurseGrade/editNurseGrade" + // 将 data 对象作为请求的主体 return http.put("/api/nurseGrade/editNurseGrade", data); } -// 删除护理等级 +/** + * 定义一个异步函数 deleteNurseGrade,用于删除护理等级 + * @param data - 一个符合 IGetNurseGradeById 接口的对象,包含删除护理等级所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除护理等级操作的响应结果 + */ export async function deleteNurseGrade(data: IGetNurseGradeById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/nurseGrade/deleteNurseGrade" + // 将 data 对象展开作为请求的参数 return http.delete("/api/nurseGrade/deleteNurseGrade", { params: { ...data diff --git a/client/src/apis/nurseReserve.ts b/client/src/apis/nurseReserve.ts index 93337fa..bb31b28 100644 --- a/client/src/apis/nurseReserve.ts +++ b/client/src/apis/nurseReserve.ts @@ -1,34 +1,64 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口, +// 用于描述分页搜索老人时的请求参数结构 import { IPageSearchElderByKey } from "@/apis/bookManage"; +// 从 "@/apis/service" 模块导入 IGetServiceById 接口, +// 用于描述根据编号查询服务时的请求参数结构 import { IGetServiceById } from "@/apis/service"; +// 定义一个接口 IPageNurseReserveByKey,用于描述分页查询护理预定时的请求参数结构 interface IPageNurseReserveByKey { + // 床位名称,用于筛选护理预定记录,类型为字符串 bedName: string; - elderName:string; + // 老人姓名,用于筛选护理预定记录,类型为字符串 + elderName: string; + // 服务名称,用于筛选护理预定记录,类型为字符串 serviceName: string; } +// 定义一个接口 IAddNurseReserve,用于描述新增护理预定时的数据结构 interface IAddNurseReserve { + // 老人 ID,类型为数字 elderId: number; + // 服务名称,类型为字符串 serviceName: string; + // 需要服务的日期(这里推测为时间戳等能表示日期的值,类型为数字) needDate: number; + // 服务价格,类型为数字 servicePrice: number; + // 收费方式,类型为字符串 chargeMethod: string; + // 频率,类型为数字 frequency: number; + // 支付金额,类型为数字 payAmount: number; } +// 定义一个接口 IExecuteNurseReserve,用于描述执行护理预定时的数据结构 interface IExecuteNurseReserve { + // 护理预定的 ID,类型为数字 id: number; + // 护理日期,类型为字符串 nurseDate: string; + // 护理人员 ID,类型为字符串 staffId: string; } -// 分页查询护理预定 +/** + * 定义一个异步函数 pageNurseReserveByKey,用于分页查询护理预定 + * @param data - 一个符合 IPageNurseReserveByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询护理预定的响应结果 + */ export async function pageNurseReserveByKey(data: IPageNurseReserveByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - // Reflect.has(data, 'name') ? (data.gradeName = data.name) : '' - // Reflect.has(data, 'type') ? (data.nurseType = data.type) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以原本计划请求前处理某些字段, + // 但这里代码被注释掉了,可能是暂不处理或有其他调整 + // Reflect.has(data, 'name')? (data.gradeName = data.name) : '' + // Reflect.has(data, 'type')? (data.nurseType = data.type) : '' + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseReserve/pageNurseReserveByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/nurseReserve/pageNurseReserveByKey", { params: { ...data @@ -36,27 +66,49 @@ export async function pageNurseReserveByKey(data: IPageNurseReserveByKey) { }); } -// 分页搜索老人 +/** + * 定义一个函数 pageSearchElderByKey,用于分页搜索老人 + * @param data - 一个符合 IPageSearchElderByKey 接口的对象,包含搜索所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页搜索老人的响应结果 + */ export function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseReserve/pageSearchElderByKey" + // 将 data 对象展开作为请求的参数 return http.get('/api/nurseReserve/pageSearchElderByKey', { params: { ...data } - }) + }); } -// 获取服务项目 +/** + * 定义一个异步函数 listService,用于获取服务项目 + * @returns 一个 Promise 对象,解析后得到的是获取服务项目的响应结果 + */ export async function listService() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseReserve/listService" return http.get("/api/nurseReserve/listService"); } -// 新增护理预定 +/** + * 定义一个函数 addNurseReserve,用于新增护理预定 + * @param data - 一个符合 IAddNurseReserve 接口的对象,包含新增护理预定所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增护理预定操作的响应结果 + */ export function addNurseReserve(data: IAddNurseReserve) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/nurseReserve/addNurseReserve" + // 将 data 对象作为请求的主体 return http.post("/api/nurseReserve/addNurseReserve", data); } -// 根据编号查询护理预定 +/** + * 定义一个异步函数 getServiceById,用于根据编号查询服务(这里实际是护理预定相关服务) + * @param data - 一个符合 IGetServiceById 接口的对象,包含根据编号查询服务所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询服务的响应结果 + */ export async function getServiceById(data: IGetServiceById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseReserve/getServiceById" + // 将 data 对象展开作为请求的参数 return http.get("/api/nurseReserve/getServiceById", { params: { ...data @@ -64,12 +116,22 @@ export async function getServiceById(data: IGetServiceById) { }); } -// 护理人员 +/** + * 定义一个异步函数 listNurseStaff,用于获取护理人员列表 + * @returns 一个 Promise 对象,解析后得到的是获取护理人员列表的响应结果 + */ export async function listNurseStaff() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/nurseReserve/listNurseStaff" return http.get("/api/nurseReserve/listNurseStaff"); } -// 执行护理预定 +/** + * 定义一个函数 executeNurseReserve,用于执行护理预定 + * @param data - 一个符合 IExecuteNurseReserve 接口的对象,包含执行护理预定所需的数据 + * @returns 一个 Promise 对象,解析后得到的是执行护理预定操作的响应结果 + */ export function executeNurseReserve(data: IExecuteNurseReserve) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/nurseReserve/executeNurseReserve" + // 将 data 对象作为请求的主体 return http.put("/api/nurseReserve/executeNurseReserve", data); } diff --git a/client/src/apis/outward.ts b/client/src/apis/outward.ts index 066b898..1d4e858 100644 --- a/client/src/apis/outward.ts +++ b/client/src/apis/outward.ts @@ -1,48 +1,77 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可用于发起 HTTP 请求,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口,此接口用于定义分页搜索老人时的请求参数结构 import { IPageSearchElderByKey } from "@/apis/bookManage"; +// 定义 IPageOutwardByKey 接口,用于描述分页查询外出登记时的请求参数结构 interface IPageOutwardByKey { + // 老人姓名,用于筛选外出登记记录,类型为字符串 elderName: string; + // 陪同人类型,用于筛选外出登记记录,类型为字符串 chaperoneType: string; + // 外出开始时间,用于筛选外出登记记录,类型为字符串 startTime: string; + // 外出结束时间,用于筛选外出登记记录,类型为字符串 endTime: string; } +// 定义 IListContactByElderId 接口,用于描述根据老人 ID 获取紧急联系人列表时的请求参数结构 interface IListContactByElderId { + // 老人 ID,类型为字符串 elderId: string; } +// 定义 IAddOutward 接口,用于描述新增外出登记时的数据结构 interface IAddOutward { + // 老人 ID,类型为数字 elderId: number; + // 陪同人姓名,类型为字符串 chaperoneName: string; + // 陪同人电话,类型为字符串 chaperonePhone: string; + // 陪同人类型,类型为字符串 chaperoneType: string; + // 外出日期,类型为字符串 outwardDate: string; + // 计划返回日期,类型为字符串 planReturnDate: string; } +// 定义 IGetOutwardById 接口,用于描述根据编号获取外出登记时的请求参数结构 interface IGetOutwardById { + // 外出登记 ID,类型为字符串 outwardId: string; } +// 定义 IDelayReturn 接口,用于描述延期返回操作时的数据结构 interface IDelayReturn { + // 外出登记 ID,类型为字符串 id: string; + // 新的计划返回日期,类型为字符串 planReturnDate: string; } +// 定义 IRecordReturn 接口,用于描述登记返回操作时的数据结构 interface IRecordReturn { + // 外出登记 ID,类型为字符串 id: string; + // 实际返回日期,类型为 any,具体类型需根据实际情况确定 realReturnDate: any; } -// 陪同人类型 +// 定义一个常量 typeList,包含陪同人类型的选项,每个选项有标签和对应的值 export const typeList = [ { label: "护工", value: "护工" }, { label: "家属", value: "家属" } ]; -// 分页查询外出登记 +/** + * 定义一个异步函数 pageOutwardByKey,用于分页查询外出登记 + * @param data - 一个符合 IPageOutwardByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询外出登记的响应结果 + */ export async function pageOutwardByKey(data: IPageOutwardByKey) { + // 使用 http 对象发起 GET 请求,请求地址为 "/api/outward/pageOutwardByKey",并将 data 对象展开作为请求参数 return http.get("/api/outward/pageOutwardByKey", { params: { ...data @@ -50,8 +79,13 @@ export async function pageOutwardByKey(data: IPageOutwardByKey) { }); } -// 分页搜索老人 +/** + * 定义一个异步函数 pageSearchElderByKey,用于分页搜索老人 + * @param data - 一个符合 IPageSearchElderByKey 接口的对象,包含搜索所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页搜索老人的响应结果 + */ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用 http 对象发起 GET 请求,请求地址为 "/api/outward/pageSearchElderByKey",并将 data 对象展开作为请求参数 return http.get("/api/outward/pageSearchElderByKey", { params: { ...data @@ -59,13 +93,22 @@ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { }); } -// 获取护工列表 +/** + * 定义一个异步函数 listOutwardStaff,用于获取护工列表 + * @returns 一个 Promise 对象,解析后得到的是获取护工列表的响应结果 + */ export async function listOutwardStaff() { + // 使用 http 对象发起 GET 请求,请求地址为 "/api/outward/listOutwardStaff" return http.get("/api/outward/listOutwardStaff"); } -// 获取紧急联系人列表 +/** + * 定义一个异步函数 listContactByElderId,用于根据老人 ID 获取紧急联系人列表 + * @param data - 一个符合 IListContactByElderId 接口的对象,包含所需的老人 ID + * @returns 一个 Promise 对象,解析后得到的是获取紧急联系人列表的响应结果 + */ export async function listContactByElderId(data: IListContactByElderId) { + // 使用 http 对象发起 GET 请求,请求地址为 "/api/outward/listContactByElderId",并将 data 对象展开作为请求参数 return http.get("/api/outward/listContactByElderId", { params: { ...data @@ -73,13 +116,23 @@ export async function listContactByElderId(data: IListContactByElderId) { }); } -// 新增外出登记 +/** + * 定义一个函数 addOutward,用于新增外出登记 + * @param data - 一个符合 IAddOutward 接口的对象,包含新增外出登记所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增外出登记操作的响应结果 + */ export function addOutward(data: IAddOutward) { + // 使用 http 对象发起 POST 请求,请求地址为 "/api/outward/addOutward",并将 data 对象作为请求体 return http.post("/api/outward/addOutward", data); } -// 根据编号获取外出登记 +/** + * 定义一个异步函数 getOutwardById,用于根据编号获取外出登记 + * @param data - 一个符合 IGetOutwardById 接口的对象,包含所需的外出登记 ID + * @returns 一个 Promise 对象,解析后得到的是根据编号获取外出登记的响应结果 + */ export async function getOutwardById(data: IGetOutwardById) { + // 使用 http 对象发起 GET 请求,请求地址为 "/api/outward/getOutwardById",并将 data 对象展开作为请求参数 return http.get("/api/outward/getOutwardById", { params: { ...data @@ -87,18 +140,33 @@ export async function getOutwardById(data: IGetOutwardById) { }); } -// 延期返回 +/** + * 定义一个函数 delayReturn,用于处理延期返回操作 + * @param data - 一个符合 IDelayReturn 接口的对象,包含延期返回所需的数据 + * @returns 一个 Promise 对象,解析后得到的是延期返回操作的响应结果 + */ export function delayReturn(data: IDelayReturn) { + // 使用 http 对象发起 PUT 请求,请求地址为 "/api/outward/delayReturn",并将 data 对象作为请求体 return http.put("/api/outward/delayReturn", data); } -// 登记返回 +/** + * 定义一个函数 recordReturn,用于处理登记返回操作 + * @param data - 一个符合 IRecordReturn 接口的对象,包含登记返回所需的数据 + * @returns 一个 Promise 对象,解析后得到的是登记返回操作的响应结果 + */ export function recordReturn(data: IRecordReturn) { + // 使用 http 对象发起 PUT 请求,请求地址为 "/api/outward/recordReturn",并将 data 对象作为请求体 return http.put("/api/outward/recordReturn", data); } -// 删除外出登记 +/** + * 定义一个异步函数 deleteOutward,用于删除外出登记 + * @param data - 一个符合 IGetOutwardById 接口的对象,包含要删除的外出登记 ID + * @returns 一个 Promise 对象,解析后得到的是删除外出登记操作的响应结果 + */ export async function deleteOutward(data: IGetOutwardById) { + // 使用 http 对象发起 DELETE 请求,请求地址为 "/api/outward/deleteOutward",并将 data 对象展开作为请求参数 return http.delete("/api/outward/deleteOutward", { params: { ...data diff --git a/client/src/apis/retreatApply.ts b/client/src/apis/retreatApply.ts index 5aed87a..ed1724a 100644 --- a/client/src/apis/retreatApply.ts +++ b/client/src/apis/retreatApply.ts @@ -1,19 +1,37 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; + +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口, +// 用于描述分页搜索老人时的请求参数结构 import { IPageSearchElderByKey } from "@/apis/bookManage"; +// 定义一个接口 IPageRetreatApplyByKey,用于描述分页查询退住申请时的请求参数结构 interface IPageRetreatApplyByKey { + // 床位名称,用于筛选退住申请记录,类型为字符串 bedName: string; + // 老人姓名,用于筛选退住申请记录,类型为字符串 elderName: string; + // 老人性别,用于筛选退住申请记录,类型为字符串 elderSex: string; + // 身份证号码,用于筛选退住申请记录,类型为字符串 idNum: string; } +// 定义一个接口 IAddRetreatApply,用于描述新增退住申请时的数据结构 interface IAddRetreatApply { + // 老人 ID,类型为数字,用于标识发起退住申请的老人 elderId: number; } -// 分页查询退住申请 +/** + * 定义一个异步函数 pageRetreatApplyByKey,用于分页查询退住申请 + * @param data - 一个符合 IPageRetreatApplyByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询退住申请的响应结果 + */ export async function pageRetreatApplyByKey(data: IPageRetreatApplyByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/retreatApply/pageRetreatApplyByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/retreatApply/pageRetreatApplyByKey", { params: { ...data @@ -21,8 +39,14 @@ export async function pageRetreatApplyByKey(data: IPageRetreatApplyByKey) { }); } -// 分页搜索老人 +/** + * 定义一个异步函数 pageSearchElderByKey,用于分页搜索老人 + * @param data - 一个符合 IPageSearchElderByKey 接口的对象,包含搜索所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页搜索老人的响应结果 + */ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/retreatApply/pageSearchElderByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/retreatApply/pageSearchElderByKey", { params: { ...data @@ -30,7 +54,13 @@ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { }); } -// 新增退住申请 +/** + * 定义一个函数 addRetreatApply,用于新增退住申请 + * @param data - 一个符合 IAddRetreatApply 接口的对象,包含新增退住申请所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增退住申请操作的响应结果 + */ export function addRetreatApply(data: IAddRetreatApply) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/retreatApply/addRetreatApply" + // 将 data 对象作为请求的主体 return http.post("/api/retreatApply/addRetreatApply", data); } diff --git a/client/src/apis/service.ts b/client/src/apis/service.ts index 067a33c..a115761 100644 --- a/client/src/apis/service.ts +++ b/client/src/apis/service.ts @@ -1,44 +1,70 @@ +// 从 "@/utils" 模块导入名为 http 的对象,推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IGetServiceType,用于描述获取服务类型时的请求参数结构 interface IGetServiceType { + // 服务类型名称,用于筛选服务类型,类型为字符串 serviceTypeName: string; } +// 导出一个接口 IPageServiceByKey,用于描述分页查询服务时的请求参数结构 export interface IPageServiceByKey { + // 名称,用于筛选服务,类型为字符串 name: string; + // 服务类型 ID,用于筛选属于特定类型的服务,类型为数字 typeId: number; } +// 定义一个接口 IAddServiceType,用于描述新增服务类型时的数据结构 interface IAddServiceType { + // 服务类型的 ID,类型为数字 id: number; + // 服务类型的名称,类型为字符串 name: string; } +// 定义一个接口 IGetServiceTypeById,用于描述根据编号获取服务类型时的请求参数结构 interface IGetServiceTypeById { + // 服务类型 ID,类型为字符串 serviceTypeId: string; } +// 定义一个接口 IAddService,用于描述新增服务时的数据结构 interface IAddService { + // 服务的 ID,类型为数字 id: number; + // 服务的名称,类型为字符串 name: string; + // 服务所需日期,类型为字符串 needDate: string; + // 服务价格,类型为字符串 price: string; + // 服务所属类型的 ID,类型为数字 typeId: number; + // 收费方式,类型为字符串 chargeMethod: string; } +// 导出一个接口 IGetServiceById,用于描述根据编号获取服务时的请求参数结构 export interface IGetServiceById { + // 服务 ID,类型为字符串 serviceId: string; } -// 收费方式 +// 定义一个名为 IChargeMethodList 的常量,是一个包含收费方式选项的数组,每个选项有标签和对应的值 export const IChargeMethodList = [ { label: "按次", value: "按次" }, { label: "按月", value: "按月" } ]; -// 获取服务类型列表 +/** + * 定义一个异步函数 getServiceType,用于获取服务类型列表 + * @param data - 一个符合 IGetServiceType 接口的对象,包含获取服务类型列表所需的参数 + * @returns 一个 Promise 对象,解析后得到的是获取服务类型列表的响应结果 + */ export async function getServiceType(data: IGetServiceType) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/service/getServiceType" + // 将 data 对象展开作为请求的参数 return http.get("/api/service/getServiceType", { params: { ...data @@ -46,10 +72,17 @@ export async function getServiceType(data: IGetServiceType) { }); } -// 分页查询服务 +/** + * 定义一个异步函数 pageServiceByKey,用于分页查询服务 + * @param data - 一个符合 IPageServiceByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询服务的响应结果 + */ export async function pageServiceByKey(data: IPageServiceByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - // Reflect.has(data, 'roleName') ? (data.roleId = data.roleName) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 + // 这里注释掉的代码可能是原本用于处理字段的逻辑,但当前未启用 + // Reflect.has(data, 'roleName')? (data.roleId = data.roleName) : '' + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/service/pageServiceByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/service/pageServiceByKey", { params: { ...data @@ -57,13 +90,25 @@ export async function pageServiceByKey(data: IPageServiceByKey) { }); } -// 新增服务类型 +/** + * 定义一个函数 addServiceType,用于新增服务类型 + * @param data - 一个符合 IAddServiceType 接口的对象,包含新增服务类型所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增服务类型操作的响应结果 + */ export function addServiceType(data: IAddServiceType) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/service/addServiceType" + // 将 data 对象作为请求的主体 return http.post("/api/service/addServiceType", data); } -// 根据编号获取服务类型 +/** + * 定义一个异步函数 getServiceTypeById,用于根据编号获取服务类型 + * @param data - 一个符合 IGetServiceTypeById 接口的对象,包含根据编号获取服务类型所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取服务类型的响应结果 + */ export async function getServiceTypeById(data: IGetServiceTypeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/service/getServiceTypeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/service/getServiceTypeById", { params: { ...data @@ -71,13 +116,25 @@ export async function getServiceTypeById(data: IGetServiceTypeById) { }); } -// 编辑服务类型 +/** + * 定义一个函数 editServiceType,用于编辑服务类型 + * @param data - 一个符合 IAddServiceType 接口的对象,包含编辑服务类型所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑服务类型操作的响应结果 + */ export function editServiceType(data: IAddServiceType) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/service/editServiceType" + // 将 data 对象作为请求的主体 return http.put("/api/service/editServiceType", data); } -// 删除服务类型 +/** + * 定义一个异步函数 deleteServiceType,用于删除服务类型 + * @param data - 一个符合 IGetServiceTypeById 接口的对象,包含删除服务类型所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除服务类型操作的响应结果 + */ export async function deleteServiceType(data: IGetServiceTypeById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/service/deleteServiceType" + // 将 data 对象展开作为请求的参数 return http.delete("/api/service/deleteServiceType", { params: { ...data @@ -85,13 +142,25 @@ export async function deleteServiceType(data: IGetServiceTypeById) { }); } -// 新增服务 +/** + * 定义一个函数 addService,用于新增服务 + * @param data - 一个符合 IAddService 接口的对象,包含新增服务所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增服务操作的响应结果 + */ export function addService(data: IAddService) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/service/addService" + // 将 data 对象作为请求的主体 return http.post("/api/service/addService", data); } -// 根据编号获取服务 +/** + * 定义一个异步函数 getServiceById,用于根据编号获取服务 + * @param data - 一个符合 IGetServiceById 接口的对象,包含根据编号获取服务所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取服务的响应结果 + */ export async function getServiceById(data: IGetServiceById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/service/getServiceById" + // 将 data 对象展开作为请求的参数 return http.get("/api/service/getServiceById", { params: { ...data @@ -99,13 +168,25 @@ export async function getServiceById(data: IGetServiceById) { }); } -// 编辑服务 +/** + * 定义一个函数 editService,用于编辑服务 + * @param data - 一个符合 IAddService 接口的对象,包含编辑服务所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑服务操作的响应结果 + */ export function editService(data: IAddService) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/service/editService" + // 将 data 对象作为请求的主体 return http.put("/api/service/editService", data); } -// 删除服务 +/** + * 定义一个异步函数 deleteService,用于删除服务 + * @param data - 一个符合 IGetServiceById 接口的对象,包含删除服务所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除服务操作的响应结果 + */ export async function deleteService(data: IGetServiceById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/service/deleteService" + // 将 data 对象展开作为请求的参数 return http.delete("/api/service/deleteService", { params: { ...data diff --git a/client/src/apis/staff.ts b/client/src/apis/staff.ts index 347b5ff..0dedaa6 100644 --- a/client/src/apis/staff.ts +++ b/client/src/apis/staff.ts @@ -1,38 +1,69 @@ +// 从 "@/utils" 模块导入名为 http 的对象,推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageStaffByKey,用于描述分页查询员工时的请求参数结构 interface IPageStaffByKey { + // 角色 ID,用于筛选员工,类型为数字 roleId: number; - roleName:number; + // 这里 roleName 的类型标注为 number 可能有误,通常角色名称应该是字符串类型,用于筛选员工 + roleName: number; + // 员工姓名,用于筛选员工,类型为字符串 name: string; + // 员工电话,用于筛选员工,类型为字符串 phone: string; } +// 定义一个接口 IAddStaff,用于描述新增员工时的数据结构 interface IAddStaff { + // 员工 ID,类型为数字 id: number; + // 员工角色 ID,类型为数字 roleId: number; + // 员工姓名,类型为字符串 name: string; + // 员工身份证号码,类型为字符串 idNum: string; + // 员工年龄,类型为数字 age: number; + // 员工性别,类型为字符串 sex: string; + // 员工电话,类型为字符串 phone: string; + // 员工邮箱,类型为字符串 email: string; + // 员工地址,类型为字符串 address: string; + // 员工头像地址,类型为字符串 avator: string; } +// 定义一个接口 IGetStaffById,用于描述根据员工编号查询员工时的请求参数结构 interface IGetStaffById { - staffId: string + // 员工 ID,类型为字符串 + staffId: string; } -// 获取角色列表 +/** + * 定义一个异步函数 getRole,用于获取角色列表 + * @returns 一个 Promise 对象,解析后得到的是获取角色列表的响应结果 + */ export async function getRole() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/staff/getRole" return http.get("/api/staff/getRole"); } -// 分页查询员工 +/** + * 定义一个异步函数 pageStaffByKey,用于分页查询员工 + * @param data - 一个符合 IPageStaffByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询员工的响应结果 + */ export async function pageStaffByKey(data: IPageStaffByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, 'roleName') ? (data.roleId = data.roleName) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以请求前增加一些这两个字段 + // 如果 data 对象中有 'roleName' 字段,则将其值赋给 'roleId' 字段,这里逻辑可能需要进一步确认合理性 + Reflect.has(data, 'roleName')? (data.roleId = data.roleName) : ''; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/staff/pageStaffByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/staff/pageStaffByKey", { params: { ...data @@ -40,13 +71,25 @@ export async function pageStaffByKey(data: IPageStaffByKey) { }); } -// 新增员工 +/** + * 定义一个函数 addStaff,用于新增员工 + * @param data - 一个符合 IAddStaff 接口的对象,包含新增员工所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增员工操作的响应结果 + */ export function addStaff(data: IAddStaff) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/staff/addStaff" + // 将 data 对象作为请求的主体 return http.post("/api/staff/addStaff", data); } -// 根据老人编号查询员工 +/** + * 定义一个异步函数 getStaffById,用于根据员工编号查询员工 + * @param data - 一个符合 IGetStaffById 接口的对象,包含根据员工编号查询员工所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据员工编号查询员工的响应结果 + */ export async function getStaffById(data: IGetStaffById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/staff/getStaffById" + // 将 data 对象展开作为请求的参数 return http.get("/api/staff/getStaffById", { params: { ...data @@ -54,13 +97,25 @@ export async function getStaffById(data: IGetStaffById) { }); } -// 编辑员工 +/** + * 定义一个函数 editStaff,用于编辑员工信息 + * @param data - 一个符合 IAddStaff 接口的对象,包含编辑员工所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑员工操作的响应结果 + */ export function editStaff(data: IAddStaff) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/staff/editStaff" + // 将 data 对象作为请求的主体 return http.put("/api/staff/editStaff", data); } -// 删除员工 +/** + * 定义一个异步函数 leaveStaff,用于删除员工 + * @param data - 一个符合 IGetStaffById 接口的对象,包含删除员工所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除员工操作的响应结果 + */ export async function leaveStaff(data: IGetStaffById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/staff/leaveStaff" + // 将 data 对象展开作为请求的参数 return http.delete("/api/staff/leaveStaff", { params: { ...data diff --git a/client/src/apis/visit.ts b/client/src/apis/visit.ts index 3300427..5cb5e96 100644 --- a/client/src/apis/visit.ts +++ b/client/src/apis/visit.ts @@ -1,49 +1,83 @@ +// 从 "@/utils" 模块导入名为 http 的对象,推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口, +// 用于描述分页搜索老人时的请求参数结构 import { IPageSearchElderByKey } from "@/apis/bookManage"; +// 定义一个接口 IPageVisitByKey,用于描述分页查询来访登记时的请求参数结构 interface IPageVisitByKey { + // 老人姓名,用于筛选来访登记记录,类型为字符串 elderName: string; + // 来访人姓名,用于筛选来访登记记录,类型为字符串 visitName: string; + // 来访人电话,用于筛选来访登记记录,类型为字符串 visitPhone: string; + // 来访状态标识,用于筛选来访登记记录,类型为字符串 visitFlag: string; } +// 定义一个接口 IAddVisit,用于描述新增来访登记时的数据结构 interface IAddVisit { + // 来访登记的 ID,类型为数字 id: number; + // 老人 ID,类型为数字 elderId: number; + // 来访人姓名,类型为字符串 name: string; + // 来访人电话,类型为字符串 phone: string; + // 与老人的关系,类型为字符串 relation: string; + // 来访日期,类型为字符串 visitDate: string; + // 来访次数,类型为数字 visitNum: number; } +// 定义一个接口 IGetVisitById,用于描述根据编号获取来访登记时的请求参数结构 interface IGetVisitById { + // 来访登记 ID,类型为字符串 visitId: string; } +// 定义一个接口 IEditVisit,用于描述编辑来访登记时的数据结构 interface IEditVisit { + // 来访登记的 ID,类型为数字 id: number; + // 来访人姓名,类型为字符串 name: string; + // 来访人电话,类型为字符串 phone: string; + // 与老人的关系,类型为字符串 relation: string; + // 来访日期字符串,类型为字符串 visitDateStr: string; + // 来访次数,类型为数字 visitNum: number; } +// 定义一个接口 IRecordLeave,用于描述登记离开时的数据结构 interface IRecordLeave { + // 来访登记 ID,类型为字符串 id: string; + // 离开日期,类型为 any(具体类型需根据实际情况确定) leaveDate: any; } -// 来访状态 +// 定义一个名为 typeList 的常量,是一个包含来访状态选项的数组,每个选项有标签和对应的值 export const typeList = [ { label: "待离开", value: "待离开" }, { label: "已离开", value: "已离开" } ]; -// 分页查询来访登记 +/** + * 定义一个异步函数 pageVisitByKey,用于分页查询来访登记 + * @param data - 一个符合 IPageVisitByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询来访登记的响应结果 + */ export async function pageVisitByKey(data: IPageVisitByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/visit/pageVisitByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/visit/pageVisitByKey", { params: { ...data @@ -51,8 +85,14 @@ export async function pageVisitByKey(data: IPageVisitByKey) { }); } -// 分页搜索老人 +/** + * 定义一个异步函数 pageSearchElderByKey,用于分页搜索老人 + * @param data - 一个符合 IPageSearchElderByKey 接口的对象,包含搜索所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页搜索老人的响应结果 + */ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/visit/pageSearchElderByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/visit/pageSearchElderByKey", { params: { ...data @@ -60,13 +100,25 @@ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { }); } -// 新增来访登记 +/** + * 定义一个函数 addVisit,用于新增来访登记 + * @param data - 一个符合 IAddVisit 接口的对象,包含新增来访登记所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增来访登记操作的响应结果 + */ export function addVisit(data: IAddVisit) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/visit/addVisit" + // 将 data 对象作为请求的主体 return http.post("/api/visit/addVisit", data); } -// 根据编号获取来访登记 +/** + * 定义一个异步函数 getVisitById,用于根据编号获取来访登记 + * @param data - 一个符合 IGetVisitById 接口的对象,包含根据编号获取来访登记所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取来访登记的响应结果 + */ export async function getVisitById(data: IGetVisitById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/visit/getVisitById" + // 将 data 对象展开作为请求的参数 return http.get("/api/visit/getVisitById", { params: { ...data @@ -74,18 +126,36 @@ export async function getVisitById(data: IGetVisitById) { }); } -// 编辑来访登记 +/** + * 定义一个函数 editVisit,用于编辑来访登记 + * @param data - 一个符合 IEditVisit 接口的对象,包含编辑来访登记所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑来访登记操作的响应结果 + */ export function editVisit(data: IEditVisit) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/visit/editVisit" + // 将 data 对象作为请求的主体 return http.put("/api/visit/editVisit", data); } -// 登记离开 +/** + * 定义一个函数 recordLeave,用于登记离开 + * @param data - 一个符合 IRecordLeave 接口的对象,包含登记离开所需的数据 + * @returns 一个 Promise 对象,解析后得到的是登记离开操作的响应结果 + */ export function recordLeave(data: IRecordLeave) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/visit/recordLeave" + // 将 data 对象作为请求的主体 return http.put("/api/visit/recordLeave", data); } -// 删除来访登记 +/** + * 定义一个异步函数 deleteVisit,用于删除来访登记 + * @param data - 一个符合 IGetVisitById 接口的对象,包含删除来访登记所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除来访登记操作的响应结果 + */ export async function deleteVisit(data: IGetVisitById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/visit/deleteVisit" + // 将 data 对象展开作为请求的参数 return http.delete("/api/visit/deleteVisit", { params: { ...data diff --git a/server/src/main/java/com/ew/gerocomium/controller/AccidentController.java b/server/src/main/java/com/ew/gerocomium/controller/AccidentController.java index 5452571..3d0457a 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/AccidentController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/AccidentController.java @@ -1,83 +1,221 @@ +// 声明该类所在的包名 package com.ew.gerocomium.controller; +// 导入项目中自定义的常量类 import com.ew.gerocomium.common.constant.Constant; +// 导入项目中自定义的统一结果返回类 import com.ew.gerocomium.dao.base.Result; +// 导入项目中自定义的各种查询实体类 import com.ew.gerocomium.dao.query.*; +// 导入项目中自定义的各种服务接口类 import com.ew.gerocomium.service.*; +// 导入 Swagger 用于标记 API 相关信息的注解 import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +// 导入 Spring Security 用于权限控制的注解 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 相关注解,用于处理 HTTP 请求 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 用于资源注入的注解 import javax.annotation.Resource; +/** + * 事故登记控制器类,处理与事故登记相关的 HTTP 请求 + * 用于实现对事故登记的增删改查以及相关的搜索和获取列表等操作 + */ +// 使用 Swagger 注解,标记该控制器的标签为“事故登记” @Api(tags = "事故登记") +// 标记该类为 RESTful 风格的控制器,处理 HTTP 请求并返回 JSON 等格式的响应 @RestController +// 定义该控制器的基础请求路径为 /accident @RequestMapping("/accident") +// 权限控制注解,检查用户是否具有指定权限 @PreAuthorize("@AuthorityAssert.hasAuthority('/check-in/accident')") public class AccidentController { + + // 注入事故登记相关的业务逻辑服务类 @Resource private AccidentService accidentService; + // 注入押金充值相关的业务逻辑服务类 @Resource private DepositRechargeService depositRechargeService; + // 注入护工预约相关的业务逻辑服务类 @Resource private NurseReserveService nurseReserveService; + // 注入外出相关的业务逻辑服务类 @Resource private OutwardService outwardService; + /** + * 分页查询事故登记的方法 + * + * @param pageAccidentByKeyQuery 分页查询事故登记的请求实体,包含查询条件和分页信息 + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含查询结果的 Result 对象,封装了操作结果和数据 + */ + // 处理 HTTP GET 请求,请求路径为 /accident/pageAccidentByKey @GetMapping("/pageAccidentByKey") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "分页查询事故登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageAccidentByKey(@ApiParam(value = "分页查询事故登记请求实体", required = true) PageAccidentByKeyQuery pageAccidentByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageAccidentByKey( + // 使用 Swagger 注解,描述该参数的作用并标记为必需 + @ApiParam(value = "分页查询事故登记请求实体", required = true) + PageAccidentByKeyQuery pageAccidentByKeyQuery, + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用事故登记服务类的分页查询方法,并返回结果 return accidentService.pageAccidentByKey(pageAccidentByKeyQuery); } + /** + * 分页搜索老人的方法 + * + * @param pageSearchElderByKeyQuery 分页搜索老人的请求实体,包含搜索条件和分页信息 + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含查询结果的 Result 对象,封装了操作结果和数据 + */ + // 处理 HTTP GET 请求,请求路径为 /accident/pageSearchElderByKey @GetMapping("/pageSearchElderByKey") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "分页搜索老人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchElderByKey(@ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchElderByKey( + // 使用 Swagger 注解,描述该参数的作用并标记为必需 + @ApiParam(value = "分页搜索老人请求实体", required = true) + PageSearchElderByKeyQuery pageSearchElderByKeyQuery, + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用押金充值服务类的分页搜索老人方法,并返回结果 return depositRechargeService.pageSearchElderByKey(pageSearchElderByKeyQuery); } + /** + * 分页搜索护工的方法 + * + * @param pageSearchStaffByKeyQuery 分页搜索护工的请求实体,包含搜索条件和分页信息 + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含查询结果的 Result 对象,封装了操作结果和数据 + */ + // 处理 HTTP GET 请求,请求路径为 /accident/pageSearchStaffByKey @GetMapping("/pageSearchStaffByKey") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "分页搜索护工", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchStaffByKey(@ApiParam(value = "分页搜索护工请求实体", required = true) PageSearchStaffByKeyQuery pageSearchStaffByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchStaffByKey( + // 使用 Swagger 注解,描述该参数的作用并标记为必需 + @ApiParam(value = "分页搜索护工请求实体", required = true) + PageSearchStaffByKeyQuery pageSearchStaffByKeyQuery, + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用外出服务类的分页搜索护工方法,并返回结果 return outwardService.pageSearchStaffByKey(pageSearchStaffByKeyQuery); } + /** + * 获取护工列表的方法 + * + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含护工列表的 Result 对象,封装了操作结果和数据 + */ + // 处理 HTTP GET 请求,请求路径为 /accident/listAccidentStaff @GetMapping("/listAccidentStaff") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "获取护工列表", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result listOutwardStaff(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result listOutwardStaff( + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用护工预约服务类的获取护工列表方法,并返回结果 return nurseReserveService.listNurseStaff(); } + /** + * 新增事故登记的方法 + * + * @param addAccidentQuery 新增事故登记的请求实体,包含要新增的事故登记信息 + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含操作结果的 Result 对象,封装了操作是否成功等信息 + */ + // 处理 HTTP POST 请求,请求路径为 /accident/addAccident @PostMapping("/addAccident") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "新增事故登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addOutward(@ApiParam(value = "新增事故登记请求实体", required = true) @RequestBody AddAccidentQuery addAccidentQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addOutward( + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求体中获取该参数 + @ApiParam(value = "新增事故登记请求实体", required = true) + @RequestBody AddAccidentQuery addAccidentQuery, + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用事故登记服务类的新增事故登记方法,并返回结果 return accidentService.addAccident(addAccidentQuery); } + /** + * 根据编号获取事故登记的方法 + * + * @param accidentId 要获取的事故登记的编号 + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含指定事故登记信息的 Result 对象,封装了操作结果和数据 + */ + // 处理 HTTP GET 请求,请求路径为 /accident/getAccidentById @GetMapping("/getAccidentById") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "根据编号获取事故登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getAccidentById(@ApiParam(value = "根据编号获取事故登记请求参数", required = true) @RequestParam Long accidentId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getAccidentById( + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求参数中获取该参数 + @ApiParam(value = "根据编号获取事故登记请求参数", required = true) + @RequestParam Long accidentId, + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用事故登记服务类的根据编号获取事故登记方法,并返回结果 return accidentService.getAccidentById(accidentId); } + /** + * 编辑事故登记的方法 + * + * @param editAccidentQuery 编辑事故登记的请求实体,包含要修改的事故登记信息 + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含操作结果的 Result 对象,封装了操作是否成功等信息 + */ + // 处理 HTTP PUT 请求,请求路径为 /accident/editAccident @PutMapping("/editAccident") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "编辑事故登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editAccident(@ApiParam(value = "编辑事故登记请求实体", required = true) @RequestBody EditAccidentQuery editAccidentQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editAccident( + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求体中获取该参数 + @ApiParam(value = "编辑事故登记请求实体", required = true) + @RequestBody EditAccidentQuery editAccidentQuery, + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用事故登记服务类的编辑事故登记方法,并返回结果 return accidentService.editAccident(editAccidentQuery); } + /** + * 删除事故登记的方法 + * + * @param accidentId 要删除的事故登记的编号 + * @param token 接口访问请求头中的令牌,用于身份验证和权限检查 + * @return 包含操作结果的 Result 对象,封装了操作是否成功等信息 + */ + // 处理 HTTP DELETE 请求,请求路径为 /accident/deleteAccident @DeleteMapping("/deleteAccident") + // 使用 Swagger 注解,描述该接口的功能和开发者信息 @ApiOperation(value = "删除事故登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteAccident(@ApiParam(value = "删除事故登记请求参数", required = true) @RequestParam Long accidentId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteAccident( + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求参数中获取该参数 + @ApiParam(value = "删除事故登记请求参数", required = true) + @RequestParam Long accidentId, + // 使用 Swagger 注解,描述该参数的作用并标记为必需,同时从请求头中获取该参数 + @ApiParam(value = "接口访问请求头", required = true) + @RequestHeader String token) { + // 调用事故登记服务类的删除事故登记方法,并返回结果 return accidentService.deleteAccident(accidentId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/ActiveController.java b/server/src/main/java/com/ew/gerocomium/controller/ActiveController.java index df8702f..6e5e35b 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/ActiveController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/ActiveController.java @@ -1,70 +1,194 @@ +// 声明该类所在的包名,用于组织代码结构 package com.ew.gerocomium.controller; +// 导入自定义的常量类,通常包含一些通用的常量信息,如开发者信息等 import com.ew.gerocomium.common.constant.Constant; +// 导入自定义的结果封装类,用于统一封装接口的返回结果,包含操作结果状态、消息和数据等 import com.ew.gerocomium.dao.base.Result; +// 导入自定义的查询类,用于封装不同业务操作的请求参数 import com.ew.gerocomium.dao.query.*; +// 导入活动管理业务逻辑的服务接口 import com.ew.gerocomium.service.ActiveService; +// 导入 Swagger 相关注解,用于生成接口文档,方便前后端开发人员进行对接 import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +// 导入 Spring Security 用于权限控制的注解 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 相关注解,用于处理 HTTP 请求和映射路由 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 的资源注入注解,用于依赖注入 import javax.annotation.Resource; +/** + * 活动管理控制器类,用于处理与活动相关的各种操作请求,如获取活动类型、分页查询活动、新增活动等。 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器的标签为“活动管理”,在生成的 API 文档中会以该标签分类展示接口 @Api(tags = "活动管理") +// 使用 Spring 的 @RestController 注解,标记该类为 RESTful 风格的控制器,会自动将返回结果转换为 JSON 格式 @RestController +// 使用 @RequestMapping 注解,定义该控制器的基础请求路径为 /active,所有该控制器下的接口请求路径都会以 /active 开头 @RequestMapping("/active") +// 使用 Spring Security 的 @PreAuthorize 注解进行权限控制,只有拥有 '/people/activity' 权限的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/people/activity')") public class ActiveController { + + // 使用 @Resource 注解进行依赖注入,将 ActiveService 接口的实现类实例注入到当前控制器中 @Resource private ActiveService activeService; + /** + * 获取活动类型的方法。 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含获取活动类型操作结果的 Result 对象,封装了操作是否成功以及获取到的活动类型数据等信息。 + */ + // 使用 @GetMapping 注解,指定该方法处理 HTTP GET 请求,请求路径为 /active/getActiveType @GetMapping("/getActiveType") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“获取活动类型”,并添加备注信息,备注信息包含开发者信息 @ApiOperation(value = "获取活动类型", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getActiveType(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getActiveType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveService 中的 getActiveType 方法处理获取活动类型的逻辑 + // 返回处理结果,结果会被封装在 Result 对象中 return activeService.getActiveType(); } + /** + * 分页查询活动的方法。 + * + * @param pageActiveByKeyQuery 分页查询活动的请求实体,包含查询条件(如活动名称等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页查询活动操作结果的 Result 对象,封装了操作是否成功以及查询到的活动数据列表等信息。 + */ + // 使用 @GetMapping 注解,指定该方法处理 HTTP GET 请求,请求路径为 /active/pageActiveByKey @GetMapping("/pageActiveByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“分页查询活动”,并添加备注信息 @ApiOperation(value = "分页查询活动", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageActiveByKey(@ApiParam(value = "分页查询活动请求实体", required = true) PageActiveByKeyQuery pageActiveByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageActiveByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“分页查询活动请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询活动请求实体", required = true) PageActiveByKeyQuery pageActiveByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveService 中的 pageActiveByKey 方法处理分页查询活动的逻辑,并将 PageActiveByKeyQuery 对象作为参数传入 + // 返回处理结果,结果会被封装在 Result 对象中 return activeService.pageActiveByKey(pageActiveByKeyQuery); } + /** + * 分页搜索老人的方法。 + * + * @param pageSearchElderByKeyQuery 分页搜索老人的请求实体,包含搜索条件(如老人姓名等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页搜索老人操作结果的 Result 对象,封装了操作是否成功以及搜索到的老人数据列表等信息。 + */ + // 使用 @GetMapping 注解,指定该方法处理 HTTP GET 请求,请求路径为 /active/pageSearchElderByKey @GetMapping("/pageSearchElderByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“分页搜索老人”,并添加备注信息 @ApiOperation(value = "分页搜索老人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchElderByKey(@ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchElderByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“分页搜索老人请求实体”,并标记为必需参数 + @ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveService 中的 pageSearchElderByKey 方法处理分页搜索老人的逻辑,并将 PageSearchElderByKeyQuery 对象作为参数传入 + // 返回处理结果,结果会被封装在 Result 对象中 return activeService.pageSearchElderByKey(pageSearchElderByKeyQuery); } + /** + * 新增活动的方法。 + * + * @param operateActiveQuery 新增活动的请求实体,包含要新增的活动的详细信息,如活动名称、时间、地点等。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含新增活动操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 @PostMapping 注解,指定该方法处理 HTTP POST 请求,请求路径为 /active/addActive @PostMapping("/addActive") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“新增活动”,并添加备注信息 @ApiOperation(value = "新增活动", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addActive(@ApiParam(value = "新增活动请求实体", required = true) @RequestBody OperateActiveQuery operateActiveQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addActive( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“新增活动请求实体”,并标记为必需参数 + // 使用 @RequestBody 注解,将 HTTP 请求体中的 JSON 数据映射到 OperateActiveQuery 对象中 + @ApiParam(value = "新增活动请求实体", required = true) @RequestBody OperateActiveQuery operateActiveQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveService 中的 addActive 方法处理新增活动的逻辑,并将 OperateActiveQuery 对象作为参数传入 + // 返回处理结果,结果会被封装在 Result 对象中 return activeService.addActive(operateActiveQuery); } + /** + * 根据编号查询活动的方法。 + * + * @param activeId 要查询的活动的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据编号查询活动操作结果的 Result 对象,封装了操作是否成功以及查询到的活动详细信息等。 + */ + // 使用 @GetMapping 注解,指定该方法处理 HTTP GET 请求,请求路径为 /active/getActiveById @GetMapping("/getActiveById") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“根据编号查询活动”,并添加备注信息 @ApiOperation(value = "根据编号查询活动", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getActiveById(@ApiParam(value = "根据编号查询活动请求参数", required = true) @RequestParam Long activeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getActiveById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“根据编号查询活动请求参数”,并标记为必需参数 + // 使用 @RequestParam 注解,从 HTTP 请求参数中获取名为 activeId 的值 + @ApiParam(value = "根据编号查询活动请求参数", required = true) @RequestParam Long activeId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveService 中的 getActiveById 方法处理根据编号查询活动的逻辑,并将 activeId 作为参数传入 + // 返回处理结果,结果会被封装在 Result 对象中 return activeService.getActiveById(activeId); } + /** + * 编辑活动的方法。 + * + * @param operateActiveQuery 编辑活动的请求实体,包含要修改的活动的详细信息,如活动名称、时间、地点等。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含编辑活动操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,请求路径为 /active/editActive @PutMapping("/editActive") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“编辑活动”,并添加备注信息 @ApiOperation(value = "编辑活动", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editActive(@ApiParam(value = "编辑活动请求实体", required = true) @RequestBody OperateActiveQuery operateActiveQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editActive( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“编辑活动请求实体”,并标记为必需参数 + // 使用 @RequestBody 注解,将 HTTP 请求体中的 JSON 数据映射到 OperateActiveQuery 对象中 + @ApiParam(value = "编辑活动请求实体", required = true) @RequestBody OperateActiveQuery operateActiveQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveService 中的 editActive 方法处理编辑活动的逻辑,并将 OperateActiveQuery 对象作为参数传入 + // 返回处理结果,结果会被封装在 Result 对象中 return activeService.editActive(operateActiveQuery); } + /** + * 删除活动的方法。 + * + * @param activeId 要删除的活动的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含删除活动操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 @DeleteMapping 注解,指定该方法处理 HTTP DELETE 请求,请求路径为 /active/deleteActive @DeleteMapping("/deleteActive") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“删除活动”,并添加备注信息 @ApiOperation(value = "删除活动", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteActive(@ApiParam(value = "删除活动请求参数", required = true) @RequestParam Long activeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteActive( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“删除活动请求参数”,并标记为必需参数 + // 使用 @RequestParam 注解,从 HTTP 请求参数中获取名为 activeId 的值 + @ApiParam(value = "删除活动请求参数", required = true) @RequestParam Long activeId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveService 中的 deleteActive 方法处理删除活动的逻辑,并将 activeId 作为参数传入 + // 返回处理结果,结果会被封装在 Result 对象中 return activeService.deleteActive(activeId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/ActiveTypeController.java b/server/src/main/java/com/ew/gerocomium/controller/ActiveTypeController.java index 00d747a..f648ddb 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/ActiveTypeController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/ActiveTypeController.java @@ -1,58 +1,154 @@ +// 声明该类所在的包路径,用于组织和管理代码结构 package com.ew.gerocomium.controller; +// 导入自定义的常量类,可能包含项目中通用的常量信息,如开发者标识等 import com.ew.gerocomium.common.constant.Constant; +// 导入自定义的结果封装类,用于统一处理接口返回结果,包含操作状态、消息和数据等 import com.ew.gerocomium.dao.base.Result; +// 导入自定义的查询实体类,用于封装与活动分类相关的操作请求参数 import com.ew.gerocomium.dao.query.OperateActiveTypeQuery; import com.ew.gerocomium.dao.query.PageActiveTypeByKeyQuery; +// 导入活动分类业务逻辑的服务接口 import com.ew.gerocomium.service.ActiveTypeService; +// 导入 Swagger 相关注解,用于生成接口文档,方便前后端开发人员理解和使用接口 import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +// 导入 Spring Security 用于权限控制的注解 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 相关注解,用于处理 HTTP 请求和路由映射 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 用于依赖注入的注解 import javax.annotation.Resource; +/** + * 活动分类控制器类,用于处理与活动分类相关的各种操作请求,如分页查询、新增、编辑、删除等。 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器的标签为“活动分类”,在生成 API 文档时会以此标签分类展示接口 @Api(tags = "活动分类") +// 使用 Spring 的 @RestController 注解,标记该类为 RESTful 风格的控制器,自动将返回结果转换为 JSON 格式 @RestController +// 使用 @RequestMapping 注解,定义该控制器的基础请求路径为 /activeType,后续该控制器下的所有请求路径都基于此路径 @RequestMapping("/activeType") +// 使用 Spring Security 的 @PreAuthorize 注解进行权限控制,只有拥有 '/base/activity' 权限的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/base/activity')") public class ActiveTypeController { + + // 使用 @Resource 注解进行依赖注入,将 ActiveTypeService 接口的实现类实例注入到当前控制器中 @Resource private ActiveTypeService activeTypeService; + /** + * 分页查询活动分类的方法。 + * + * @param pageActiveTypeByKeyQuery 分页查询活动分类的请求实体,包含查询条件(如分类名称等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页查询活动分类操作结果的 Result 对象,封装了操作是否成功以及查询到的活动分类数据列表等信息。 + */ + // 使用 @GetMapping 注解,指定该方法处理 HTTP GET 请求,请求路径为 /activeType/pageActiveTypeByKey @GetMapping("/pageActiveTypeByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“分页查询活动分类”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页查询活动分类", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageActiveTypeByKey(@ApiParam(value = "分页查询活动分类请求实体", required = true) PageActiveTypeByKeyQuery pageActiveTypeByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageActiveTypeByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“分页查询活动分类请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询活动分类请求实体", required = true) PageActiveTypeByKeyQuery pageActiveTypeByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveTypeService 中的 pageActiveTypeByKey 方法处理分页查询逻辑,并传入请求实体参数 + // 返回处理结果,结果封装在 Result 对象中 return activeTypeService.pageActiveTypeByKey(pageActiveTypeByKeyQuery); } + /** + * 新增活动分类的方法。 + * + * @param activeTypeName 要新增的活动分类名称。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含新增活动分类操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 @PostMapping 注解,指定该方法处理 HTTP POST 请求,请求路径为 /activeType/addActiveType @PostMapping("/addActiveType") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“新增活动分类”,并添加备注信息(包含开发者信息) @ApiOperation(value = "新增活动分类", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addActiveType(@ApiParam(value = "新增活动分类请求参数", required = true) @RequestParam String activeTypeName, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addActiveType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“新增活动分类请求参数”,并标记为必需参数 + // 使用 @RequestParam 注解,从 HTTP 请求参数中获取名为 activeTypeName 的值 + @ApiParam(value = "新增活动分类请求参数", required = true) @RequestParam String activeTypeName, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveTypeService 中的 addActiveType 方法处理新增逻辑,并传入活动分类名称参数 + // 返回处理结果,结果封装在 Result 对象中 return activeTypeService.addActiveType(activeTypeName); } + /** + * 根据编号获取活动分类的方法。 + * + * @param activeTypeId 要获取的活动分类的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据编号获取活动分类操作结果的 Result 对象,封装了操作是否成功以及获取到的活动分类详细信息等。 + */ + // 使用 @GetMapping 注解,指定该方法处理 HTTP GET 请求,请求路径为 /activeType/getActiveTypeById @GetMapping("/getActiveTypeById") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“根据编号获取活动分类”,并添加备注信息(包含开发者信息) @ApiOperation(value = "根据编号获取活动分类", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getActiveTypeById(@ApiParam(value = "根据编号获取活动分类请求参数", required = true) @RequestParam Long activeTypeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getActiveTypeById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“根据编号获取活动分类请求参数”,并标记为必需参数 + // 使用 @RequestParam 注解,从 HTTP 请求参数中获取名为 activeTypeId 的值 + @ApiParam(value = "根据编号获取活动分类请求参数", required = true) @RequestParam Long activeTypeId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveTypeService 中的 getActiveTypeById 方法处理获取逻辑,并传入活动分类编号参数 + // 返回处理结果,结果封装在 Result 对象中 return activeTypeService.getActiveTypeById(activeTypeId); } + /** + * 编辑活动分类的方法。 + * + * @param operateActiveTypeQuery 编辑活动分类的请求实体,包含要修改的活动分类的详细信息(如分类名称等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含编辑活动分类操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,请求路径为 /activeType/editActiveType @PutMapping("/editActiveType") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“编辑活动分类”,并添加备注信息(包含开发者信息) @ApiOperation(value = "编辑活动分类", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editActiveType(@ApiParam(value = "编辑活动分类请求实体", required = true) @RequestBody OperateActiveTypeQuery operateActiveTypeQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editActiveType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“编辑活动分类请求实体”,并标记为必需参数 + // 使用 @RequestBody 注解,将 HTTP 请求体中的 JSON 数据映射到 OperateActiveTypeQuery 对象中 + @ApiParam(value = "编辑活动分类请求实体", required = true) @RequestBody OperateActiveTypeQuery operateActiveTypeQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveTypeService 中的 editActiveType 方法处理编辑逻辑,并传入请求实体参数 + // 返回处理结果,结果封装在 Result 对象中 return activeTypeService.editActiveType(operateActiveTypeQuery); } + /** + * 删除活动分类的方法。 + * + * @param activeTypeId 要删除的活动分类的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含删除活动分类操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 @DeleteMapping 注解,指定该方法处理 HTTP DELETE 请求,请求路径为 /activeType/deleteActiveType @DeleteMapping("/deleteActiveType") + // 使用 Swagger 的 @ApiOperation 注解,描述该接口的功能为“删除活动分类”,并添加备注信息(包含开发者信息) @ApiOperation(value = "删除活动分类", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteActiveType(@ApiParam(value = "删除活动分类请求参数", required = true) @RequestParam Long activeTypeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteActiveType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“删除活动分类请求参数”,并标记为必需参数 + // 使用 @RequestParam 注解,从 HTTP 请求参数中获取名为 activeTypeId 的值 + @ApiParam(value = "删除活动分类请求参数", required = true) @RequestParam Long activeTypeId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数为“接口访问请求头”,并标记为必需参数 + // 使用 @RequestHeader 注解,从 HTTP 请求头中获取名为 token 的值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ActiveTypeService 中的 deleteActiveType 方法处理删除逻辑,并传入活动分类编号参数 + // 返回处理结果,结果封装在 Result 对象中 return activeTypeService.deleteActiveType(activeTypeId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/ElderRecordController.java b/server/src/main/java/com/ew/gerocomium/controller/ElderRecordController.java index facb0f0..673669a 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/ElderRecordController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/ElderRecordController.java @@ -1,71 +1,195 @@ +// 声明该类所属的包,表明该类在 com.ew.gerocomium.controller 包下 package com.ew.gerocomium.controller; +// 导入自定义的常量类,可能包含项目中固定不变的一些值,如开发者信息等 import com.ew.gerocomium.common.constant.Constant; +// 导入自定义的基础结果类,用于封装接口操作的结果,如操作是否成功、数据等 import com.ew.gerocomium.dao.base.Result; +// 导入操作意向的查询实体类,用于封装与意向操作相关的数据 import com.ew.gerocomium.dao.query.OperateIntentionQuery; +// 导入分页查询长者的请求实体类,用于封装分页查询长者时的查询条件和分页信息 import com.ew.gerocomium.dao.query.PageElderByKeyQuery; -import com.ew.gerocomium.service.CheckContractService; +// 导入长者档案业务逻辑服务类,用于处理与长者档案相关的业务操作 import com.ew.gerocomium.service.ElderRecordService; +// 导入意向业务逻辑服务类,用于处理与意向相关的业务操作 import com.ew.gerocomium.service.IntentionService; +// 导入入住签约业务逻辑服务类,用于处理与入住签约相关的业务操作 +import com.ew.gerocomium.service.CheckContractService; +// 导入 Swagger 相关注解,用于生成 API 文档,对接口进行描述和分类 import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +// 导入 Spring Security 的权限控制注解,用于对接口进行权限管理 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 相关注解,用于处理 HTTP 请求 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 的资源注入注解,用于实现依赖注入 import javax.annotation.Resource; +// 导入 IOException 异常类,用于处理可能的 I/O 异常情况 import java.io.IOException; +/** + * 长者档案控制器类,用于处理与长者档案相关的各种操作请求,如导出长者档案 Excel、分页查询长者、获取长者档案和信息、编辑和删除长者等。 + */ +// 使用 Swagger 注解,标记该控制器的标签为“长者档案”,方便在生成 API 文档时进行分类展示 @Api(tags = "长者档案") +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 等格式的响应 @RestController +// 定义该控制器的基础请求路径为 /elderRecord,该控制器下的所有请求都以此为前缀 @RequestMapping("/elderRecord") +// 权限控制注解,只有拥有指定权限('/people/old' 对应的权限)的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/people/old')") public class ElderRecordController { + + // 注入长者档案相关的业务逻辑服务类,通过依赖注入获取 ElderRecordService 的实例,以便调用其方法处理长者档案业务 @Resource private ElderRecordService elderRecordService; + + // 注入意向相关的业务逻辑服务类,通过依赖注入获取 IntentionService 的实例,用于处理与意向相关的业务 @Resource private IntentionService intentionService; + + // 注入入住签约相关的业务逻辑服务类,通过依赖注入获取 CheckContractService 的实例,用于处理入住签约相关业务 @Resource private CheckContractService checkContractService; + /** + * 导出长者档案 Excel 的方法。 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含导出 Excel 操作结果的 Result 对象,封装了操作是否成功以及可能的文件流等信息(如果成功)。 + * @throws IOException 如果在导出 Excel 过程中出现 I/O 错误(如文件写入失败等),则抛出该异常。 + */ + // 处理 HTTP GET 请求,路径为 /elderRecord/exportExcel,用于导出长者档案 Excel @GetMapping("/exportExcel") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "导出excel", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result exportExcel(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) throws IOException { + public Result exportExcel( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是接口访问请求头中的令牌 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) throws IOException { + // 调用长者档案服务类的导出 Excel 方法,并返回操作结果 return elderRecordService.exportExcel(); } + /** + * 分页查询长者信息的方法。 + * + * @param pageElderByKeyQuery 分页查询长者的请求实体,包含查询条件(如长者姓名、年龄范围等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页查询长者操作结果的 Result 对象,封装了操作是否成功以及查询到的长者数据列表等信息。 + */ + // 处理 HTTP GET 请求,路径为 /elderRecord/pageElderByKey,用于分页查询长者信息 @GetMapping("/pageElderByKey") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "分页查询长者", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageElderByKey(@ApiParam(value = "分页查询长者请求实体", required = true) PageElderByKeyQuery pageElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageElderByKey( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是分页查询长者的请求实体 + @ApiParam(value = "分页查询长者请求实体", required = true) + // 接收分页查询长者的请求实体 + PageElderByKeyQuery pageElderByKeyQuery, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是接口访问请求头中的令牌 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用长者档案服务类的分页查询长者方法,并返回操作结果 return elderRecordService.pageElderByKey(pageElderByKeyQuery); } + /** + * 根据编号获取长者档案信息的方法。 + * + * @param elderId 要获取档案的长者的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据编号获取长者档案操作结果的 Result 对象,封装了操作是否成功以及查询到的长者档案详细信息等。 + */ + // 处理 HTTP GET 请求,路径为 /elderRecord/getElderRecordById,用于根据编号获取长者档案信息 @GetMapping("/getElderRecordById") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "根据编号获取长者档案", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getElderRecordById(@ApiParam(value = "根据编号获取长者档案请求参数", required = true) @RequestParam Long elderId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getElderRecordById( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是要获取档案的长者编号 + @ApiParam(value = "根据编号获取长者档案请求参数", required = true) + // 从请求参数中获取长者编号 + @RequestParam Long elderId, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是接口访问请求头中的令牌 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用长者档案服务类的根据编号获取长者档案方法,并返回操作结果 return elderRecordService.getElderRecordById(elderId); } + /** + * 根据编号获取长者信息的方法(这里由意向服务类处理,可能是获取与意向相关的长者信息)。 + * + * @param elderId 要获取信息的长者的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据编号获取长者信息操作结果的 Result 对象,封装了操作是否成功以及查询到的长者相关信息等。 + */ + // 处理 HTTP GET 请求,路径为 /elderRecord/getElderById,用于根据编号获取长者信息 @GetMapping("/getElderById") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "根据编号获取长者信息", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getElderById(@ApiParam(value = "根据编号获取长者信息请求参数", required = true) @RequestParam Long elderId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getElderById( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是要获取信息的长者编号 + @ApiParam(value = "根据编号获取长者信息请求参数", required = true) + // 从请求参数中获取长者编号 + @RequestParam Long elderId, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是接口访问请求头中的令牌 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用意向服务类的根据编号获取意向(这里可能关联到长者信息)的方法,并返回操作结果 return intentionService.getIntentById(elderId); } + /** + * 编辑长者信息的方法(这里由意向服务类处理,可能是编辑与意向相关的长者信息)。 + * + * @param operateIntentionQuery 编辑长者的请求实体,包含要修改的长者的详细信息(与意向相关)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含编辑长者操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 处理 HTTP PUT 请求,路径为 /elderRecord/editElder,用于编辑长者信息 @PutMapping("/editElder") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "编辑长者", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editElder(@ApiParam(value = "编辑长者请求实体", required = true) @RequestBody OperateIntentionQuery operateIntentionQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editElder( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是编辑长者的请求实体 + @ApiParam(value = "编辑长者请求实体", required = true) + // 从请求体中接收编辑长者的请求实体 + @RequestBody OperateIntentionQuery operateIntentionQuery, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是接口访问请求头中的令牌 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用意向服务类的编辑意向(这里可能关联到长者信息编辑)的方法,并返回操作结果 return intentionService.editIntention(operateIntentionQuery); } + /** + * 删除长者(这里通过入住签约服务类处理,可能是删除与入住签约相关的长者信息)的方法。 + * + * @param elderId 要删除的长者的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含删除长者操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 处理 HTTP DELETE 请求,路径为 /elderRecord/deleteElder,用于删除长者 @DeleteMapping("/deleteElder") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "删除长者", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteCheckContract(@ApiParam(value = "删除长者请求参数", required = true) @RequestParam Long elderId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteCheckContract( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是要删除的长者编号 + @ApiParam(value = "删除长者请求参数", required = true) + // 从请求参数中获取长者编号 + @RequestParam Long elderId, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数,该参数是接口访问请求头中的令牌 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用入住签约服务类的删除入住签约(这里可能关联到删除长者相关信息)的方法,并返回操作结果 return checkContractService.deleteCheckContract(elderId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/NurseGradeController.java b/server/src/main/java/com/ew/gerocomium/controller/NurseGradeController.java index d5caafd..4ce58ab 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/NurseGradeController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/NurseGradeController.java @@ -1,73 +1,210 @@ +// 声明该类所在的包名 package com.ew.gerocomium.controller; +// 导入自定义常量类 import com.ew.gerocomium.common.constant.Constant; +// 导入自定义基础结果类 import com.ew.gerocomium.dao.base.Result; +// 导入分页查询护理等级的请求实体类 import com.ew.gerocomium.dao.query.*; +// 导入护理等级业务逻辑服务类 import com.ew.gerocomium.service.NurseGradeService; +// 导入服务项目业务逻辑服务类 import com.ew.gerocomium.service.ServiceProjectService; +// 导入 Swagger 注解,用于生成 API 文档时对接口进行描述 import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import io.swagger.annotations.ApiParam; +// 导入 Spring Security 权限控制注解 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 注解,用于处理 HTTP 请求 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 资源注入注解 import javax.annotation.Resource; +/** + * 护理等级控制器类,用于处理与护理等级相关的各种操作请求, + * 包括分页查询护理等级、获取服务类型、分页查询服务以及护理等级的增删改查等功能。 + */ +// 使用 Swagger 注解,标记该控制器的标签为“护理等级”,方便在生成 API 文档时进行分类展示 @Api(tags = "护理等级") +// 标记该类为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 等格式的响应 @RestController +// 定义该控制器的基础请求路径为 /nurseGrade,该控制器下的所有请求都以此为前缀 @RequestMapping("/nurseGrade") +// 权限控制注解,只有拥有指定权限的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/service/level')") public class NurseGradeController { + + // 注入护理等级相关的业务逻辑服务类,通过依赖注入的方式获取 NurseGradeService 的实例 @Resource private NurseGradeService nurseGradeService; + + // 注入服务项目相关的业务逻辑服务类,通过依赖注入的方式获取 ServiceProjectService 的实例 @Resource private ServiceProjectService serviceProjectService; + /** + * 分页查询护理等级信息的方法。 + * + * @param pageNurseGradeByKeyQuery 分页查询护理等级的请求实体,包含查询条件(如护理等级名称、等级描述等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页查询护理等级操作结果的 Result 对象,封装了操作是否成功以及查询到的护理等级数据列表等信息。 + */ + // 处理 HTTP GET 请求,请求路径为 /nurseGrade/pageNurseGradeByKey @GetMapping("/pageNurseGradeByKey") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "分页查询护理等级", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageNurseGradeByKey(@ApiParam(value = "分页查询护理等级请求实体", required = true) PageNurseGradeByKeyQuery pageNurseGradeByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageNurseGradeByKey( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "分页查询护理等级请求实体", required = true) + // 接收分页查询护理等级的请求实体 + PageNurseGradeByKeyQuery pageNurseGradeByKeyQuery, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用护理等级服务类的分页查询方法 return nurseGradeService.pageNurseGradeByKey(pageNurseGradeByKeyQuery); } + /** + * 获取服务类型的方法。 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含获取服务类型操作结果的 Result 对象,封装了操作是否成功以及获取到的服务类型数据列表等信息。 + * 这里调用 serviceProjectService.listServiceType(null) 方法,参数为 null 可能表示获取所有服务类型。 + */ + // 处理 HTTP GET 请求,请求路径为 /nurseGrade/listServiceType @GetMapping("/listServiceType") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "获取服务类型", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result listServiceType(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result listServiceType( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用服务项目服务类的获取服务类型方法,参数为 null 表示获取所有服务类型 return serviceProjectService.listServiceType(null); } + /** + * 分页查询服务信息的方法。 + * + * @param pageServiceByKeyQuery 分页查询服务的请求实体,包含查询条件(如服务名称、服务类型等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页查询服务操作结果的 Result 对象,封装了操作是否成功以及查询到的服务数据列表等信息。 + */ + // 处理 HTTP GET 请求,请求路径为 /nurseGrade/pageServiceByKey @GetMapping("/pageServiceByKey") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "分页查询服务", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageServiceByKey(@ApiParam(value = "分页查询服务请求实体", required = true) PageServiceByKeyQuery pageServiceByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageServiceByKey( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "分页查询服务请求实体", required = true) + // 接收分页查询服务的请求实体 + PageServiceByKeyQuery pageServiceByKeyQuery, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用护理等级服务类的分页查询服务方法 return nurseGradeService.pageServiceByKey(pageServiceByKeyQuery); } + /** + * 新增护理等级的方法。 + * + * @param operateNurseGradeQuery 新增护理等级的请求实体,包含要新增的护理等级的详细信息,如等级名称、等级描述、服务项目等。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含新增护理等级操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 处理 HTTP POST 请求,请求路径为 /nurseGrade/addNurseGrade @PostMapping("/addNurseGrade") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "新增护理等级", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addNurseGrade(@ApiParam(value = "新增护理等级请求实体", required = true) @RequestBody OperateNurseGradeQuery operateNurseGradeQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addNurseGrade( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "新增护理等级请求实体", required = true) + // 从请求体中接收新增护理等级的请求实体 + @RequestBody OperateNurseGradeQuery operateNurseGradeQuery, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用护理等级服务类的新增护理等级方法 return nurseGradeService.addNurseGrade(operateNurseGradeQuery); } + /** + * 根据编号查询护理等级信息的方法。 + * + * @param nurseGradeId 要查询的护理等级的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据编号查询护理等级操作结果的 Result 对象,封装了操作是否成功以及获取到的护理等级详细信息等。 + */ + // 处理 HTTP GET 请求,请求路径为 /nurseGrade/getNurseGradeById @GetMapping("/getNurseGradeById") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "根据编号查询护理等级", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getNurseGradeById(@ApiParam(value = "根据编号查询护理等级请求参数", required = true) @RequestParam Long nurseGradeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getNurseGradeById( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "根据编号查询护理等级请求参数", required = true) + // 从请求参数中获取护理等级编号 + @RequestParam Long nurseGradeId, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用护理等级服务类的根据编号查询护理等级方法 return nurseGradeService.getNurseGradeById(nurseGradeId); } + /** + * 编辑护理等级信息的方法。 + * + * @param operateNurseGradeQuery 编辑护理等级的请求实体,包含要修改的护理等级的详细信息。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含编辑护理等级操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 处理 HTTP PUT 请求,请求路径为 /nurseGrade/editNurseGrade @PutMapping("/editNurseGrade") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "编辑护理等级", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editNurseGrade(@ApiParam(value = "编辑护理等级请求实体", required = true) @RequestBody OperateNurseGradeQuery operateNurseGradeQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editNurseGrade( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "编辑护理等级请求实体", required = true) + // 从请求体中接收编辑护理等级的请求实体 + @RequestBody OperateNurseGradeQuery operateNurseGradeQuery, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用护理等级服务类的编辑护理等级方法 return nurseGradeService.editNurseGrade(operateNurseGradeQuery); } + /** + * 删除护理等级的方法。 + * + * @param nurseGradeId 要删除的护理等级的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含删除护理等级操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 处理 HTTP DELETE 请求,请求路径为 /nurseGrade/deleteNurseGrade @DeleteMapping("/deleteNurseGrade") + // 使用 Swagger 注解描述该接口的功能和开发者信息 @ApiOperation(value = "删除护理等级", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteNurseGrade(@ApiParam(value = "删除护理等级请求参数", required = true) @RequestParam Long nurseGradeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteNurseGrade( + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "删除护理等级请求参数", required = true) + // 从请求参数中获取要删除的护理等级编号 + @RequestParam Long nurseGradeId, + // 使用 Swagger 注解描述该参数的作用,并标记为必需参数 + @ApiParam(value = "接口访问请求头", required = true) + // 从请求头中获取令牌 + @RequestHeader String token) { + // 调用护理等级服务类的删除护理等级方法 return nurseGradeService.deleteNurseGrade(nurseGradeId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/NurseReserveController.java b/server/src/main/java/com/ew/gerocomium/controller/NurseReserveController.java index ae2800b..1aae105 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/NurseReserveController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/NurseReserveController.java @@ -1,75 +1,186 @@ +// 声明该类所属的包,方便代码的组织和管理,通常按功能模块划分包名 package com.ew.gerocomium.controller; +// 导入自定义的常量类,该类可能包含一些通用的、不可变的信息,如开发者信息、默认值等 import com.ew.gerocomium.common.constant.Constant; +// 导入自定义的基础结果类,用于封装接口返回的结果,一般包含状态码、消息和数据等,方便统一处理接口响应 import com.ew.gerocomium.dao.base.Result; +// 导入多个查询类,这些类通常用于封装不同业务操作的查询条件和参数,方便传递和处理 import com.ew.gerocomium.dao.query.*; +// 导入押金充值服务类,该类提供了与押金充值相关的业务逻辑,如查询老人信息可能会与押金充值业务有一定关联 import com.ew.gerocomium.service.DepositRechargeService; +// 导入护理预定服务类,该类处理与护理预定相关的核心业务逻辑,如查询预定信息、新增预定等 import com.ew.gerocomium.service.NurseReserveService; +// 导入服务项目服务类,该类负责与服务项目相关的业务逻辑,如查询服务项目信息等 import com.ew.gerocomium.service.ServiceProjectService; +// 导入 Swagger 的 @Api 注解,用于在生成 API 文档时对控制器进行分类和说明,方便开发者和使用者查看接口所属的功能模块 import io.swagger.annotations.Api; +// 导入 Swagger 的 @ApiOperation 注解,用于描述 API 操作的详细信息,如操作名称、备注等,有助于生成清晰的 API 文档 import io.swagger.annotations.ApiOperation; +// 导入 Swagger 的 @ApiParam 注解,用于描述 API 参数的详细信息,如参数名称、是否必填、参数描述等,方便在文档中展示参数的使用方法 import io.swagger.annotations.ApiParam; +// 导入 Spring Security 的 @PreAuthorize 注解,用于在方法执行前进行权限验证,确保只有具有指定权限的用户才能访问该接口 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 的注解,用于处理 HTTP 请求,@GetMapping 处理 GET 请求,@PostMapping 处理 POST 请求,@PutMapping 处理 PUT 请求 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 的 @Resource 注解,用于实现依赖注入,将所需的服务类实例注入到当前类中,方便调用其方法 import javax.annotation.Resource; +// 使用 Swagger 的 @Api 注解,标记该控制器的标签为“服务预定”,这样在生成的 API 文档中,该控制器下的所有接口都会归类到“服务预定”模块下 @Api(tags = "服务预定") +// 使用 Spring MVC 的 @RestController 注解,将该类标记为 RESTful 风格的控制器,它会自动将方法的返回值转换为 JSON 等格式的响应,方便前后端交互 @RestController +// 使用 Spring MVC 的 @RequestMapping 注解,定义该控制器处理的请求的基础路径为 /nurseReserve,该控制器下的所有接口路径都会基于此路径 @RequestMapping("/nurseReserve") +// 使用 Spring Security 的 @PreAuthorize 注解,进行权限验证,只有拥有 /service/book 权限的用户才能访问该控制器下的接口,确保系统的安全性 @PreAuthorize("@AuthorityAssert.hasAuthority('/service/book')") public class NurseReserveController { + // 使用 @Resource 注解,将 NurseReserveService 类型的实例注入到当前类中,用于调用该服务类的方法处理护理预定相关的业务逻辑 @Resource private NurseReserveService nurseReserveService; + // 使用 @Resource 注解,将 DepositRechargeService 类型的实例注入到当前类中,用于调用该服务类的方法处理押金充值和老人搜索等相关业务逻辑 @Resource private DepositRechargeService depositRechargeService; + // 使用 @Resource 注解,将 ServiceProjectService 类型的实例注入到当前类中,用于调用该服务类的方法处理服务项目相关的业务逻辑 @Resource private ServiceProjectService serviceProjectService; + /** + * 分页查询护理预定信息 + * + * @param PageNurseReserveByKeyQuery 分页查询护理预定的请求实体,包含查询条件(如预定时间范围、老人姓名等)和分页信息(如页码、每页数量) + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口 + * @return 包含分页查询结果的 Result 对象,封装了查询操作的状态(成功或失败)、消息和查询到的护理预定数据列表 + */ + // 使用 Spring MVC 的 @GetMapping 注解,处理 HTTP GET 请求,路径为 /nurseReserve/pageNurseReserveByKey @GetMapping("/pageNurseReserveByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页查询护理预定”,并添加备注信息,通常包含开发者等相关信息 @ApiOperation(value = "分页查询护理预定", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageNurseReserveByKey(@ApiParam(value = "分页查询护理预定请求实体", required = true) PageNurseReserveByKeyQuery PageNurseReserveByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageNurseReserveByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页查询护理预定请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询护理预定请求实体", required = true) + PageNurseReserveByKeyQuery PageNurseReserveByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 NurseReserveService 的 pageNurseReserveByKey 方法,传入分页查询请求实体,执行分页查询操作,并返回结果 return nurseReserveService.pageNurseReserveByKey(PageNurseReserveByKeyQuery); } + /** + * 分页搜索老人信息 + * + * @param pageSearchElderByKeyQuery 分页搜索老人的请求实体,包含搜索条件(如老人姓名、身份证号等)和分页信息(如页码、每页数量) + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口 + * @return 包含分页搜索结果的 Result 对象,封装了搜索操作的状态(成功或失败)、消息和搜索到的老人数据列表 + */ + // 使用 Spring MVC 的 @GetMapping 注解,处理 HTTP GET 请求,路径为 /nurseReserve/pageSearchElderByKey @GetMapping("/pageSearchElderByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页搜索老人”,并添加备注信息 @ApiOperation(value = "分页搜索老人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchElderByKey(@ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchElderByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页搜索老人请求实体”,并标记为必需参数 + @ApiParam(value = "分页搜索老人请求实体", required = true) + PageSearchElderByKeyQuery pageSearchElderByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 DepositRechargeService 的 pageSearchElderByKey 方法,传入分页搜索请求实体,执行分页搜索操作,并返回结果 return depositRechargeService.pageSearchElderByKey(pageSearchElderByKeyQuery); } + /** + * 获取服务项目列表 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口 + * @return 包含服务项目列表的 Result 对象,封装了获取操作的状态(成功或失败)、消息和获取到的服务项目数据列表 + */ + // 使用 Spring MVC 的 @GetMapping 注解,处理 HTTP GET 请求,路径为 /nurseReserve/listService @GetMapping("/listService") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“获取服务项目”,并添加备注信息 @ApiOperation(value = "获取服务项目", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result listService(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result listService( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 NurseReserveService 的 listService 方法,执行获取服务项目列表的操作,并返回结果 return nurseReserveService.listService(); } + /** + * 根据编号查询服务信息 + * + * @param serviceId 服务的编号,用于唯一标识一个服务项目 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口 + * @return 包含服务详细信息的 Result 对象,封装了查询操作的状态(成功或失败)、消息和查询到的服务详细数据 + */ + // 使用 Spring MVC 的 @GetMapping 注解,处理 HTTP GET 请求,路径为 /nurseReserve/getServiceById @GetMapping("/getServiceById") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“根据编号查询服务”,并添加备注信息 @ApiOperation(value = "根据编号查询服务", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getServiceById(@ApiParam(value = "根据编号查询服务请求参数", required = true) @RequestParam Long serviceId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getServiceById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据编号查询服务请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "根据编号查询服务请求参数", required = true) @RequestParam + Long serviceId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 ServiceProjectService 的 getServiceById 方法,传入服务编号,执行查询服务信息的操作,并返回结果 return serviceProjectService.getServiceById(serviceId); } + /** + * 新增护理预定 + * + * @param addNurseReserveQuery 新增护理预定的请求实体,包含预定的详细信息,如老人信息、服务项目、预定时间等 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口 + * @return 包含新增操作结果的 Result 对象,封装了新增操作的状态(成功或失败)、消息和可能的新增记录信息 + */ + // 使用 Spring MVC 的 @PostMapping 注解,处理 HTTP POST 请求,路径为 /nurseReserve/addNurseReserve @PostMapping("/addNurseReserve") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增护理预定”,并添加备注信息 @ApiOperation(value = "新增护理预定", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addNurseReserve(@ApiParam(value = "新增护理预定请求实体", required = true) @RequestBody AddNurseReserveQuery addNurseReserveQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addNurseReserve( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增护理预定请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增护理预定请求实体", required = true) @RequestBody + AddNurseReserveQuery addNurseReserveQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 NurseReserveService 的 addNurseReserve 方法,传入新增护理预定请求实体,执行新增操作,并返回结果 return nurseReserveService.addNurseReserve(addNurseReserveQuery); } + /** + * 获取护理人员列表 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口 + * @return 包含护理人员列表的 Result 对象,封装了获取操作的状态(成功或失败)、消息和获取到的护理人员数据列表 + */ + // 使用 Spring MVC 的 @GetMapping 注解,处理 HTTP GET 请求,路径为 /nurseReserve/listNurseStaff @GetMapping("/listNurseStaff") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“护理人员”,并添加备注信息 @ApiOperation(value = "护理人员", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result listNurseStaff(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result listNurseStaff( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 NurseReserveService 的 listNurseStaff 方法,执行获取护理人员列表的操作,并返回结果 return nurseReserveService.listNurseStaff(); } + /** + * 执行护理预定 + * + * @param executeNurseReserve 执行护理预定的请求实体,包含执行预定所需的信息,如预定编号、执行时间等 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口 + * @return 包含执行操作结果的 Result 对象,封装了执行操作的状态(成功或失败)、消息和可能的执行结果信息 + */ + // 使用 Spring MVC 的 @PutMapping 注解,处理 HTTP PUT 请求,路径为 /nurseReserve/executeNurseReserve @PutMapping("/executeNurseReserve") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“执行护理预定”,并添加备注信息 @ApiOperation(value = "执行护理预定", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result executeNurseReserve(@ApiParam(value = "执行护理预定请求实体", required = true) @RequestBody ExecuteNurseReserveQuery executeNurseReserve, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result executeNurseReserve( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“执行护理预定请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "执行护理预定请求实体", required = true) @RequestBody + ExecuteNurseReserveQuery executeNurseReserve, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用 NurseReserveService 的 executeNurseReserve 方法,传入执行护理预定请求实体,执行预定操作,并返回结果 return nurseReserveService.executeNurseReserve(executeNurseReserve); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/OutwardController.java b/server/src/main/java/com/ew/gerocomium/controller/OutwardController.java index c95f2bb..38a4cc2 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/OutwardController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/OutwardController.java @@ -1,99 +1,265 @@ +// 声明该类所在的包,包名遵循命名规范,用于组织和管理代码 package com.ew.gerocomium.controller; +// 导入自定义的常量类,该类可能包含一些全局通用的常量,如开发者信息等 import com.ew.gerocomium.common.constant.Constant; +// 导入自定义的基础结果类,用于封装接口返回的数据,通常包含状态码、消息和具体数据 import com.ew.gerocomium.dao.base.Result; +// 导入多个查询实体类,这些类用于封装不同业务操作的查询条件和参数 import com.ew.gerocomium.dao.query.*; +// 导入外出登记服务类,该类包含处理外出登记相关业务逻辑的方法 import com.ew.gerocomium.service.OutwardService; +// 导入退住申请服务类,虽然当前代码未直接使用该类,但可能在后续扩展或某些业务场景中会用到 import com.ew.gerocomium.service.RetreatApplyService; +// 导入 Swagger 注解,用于标记该控制器的 API 分组,方便在生成 API 文档时对接口进行分类展示 import io.swagger.annotations.Api; +// 导入 Swagger 注解,用于描述 API 操作的详细信息,如操作名称和备注 import io.swagger.annotations.ApiOperation; +// 导入 Swagger 注解,用于描述 API 参数的详细信息,如参数名称、是否必填等 import io.swagger.annotations.ApiParam; +// 导入 Spring Security 注解,用于在方法执行前进行权限验证,确保只有具有指定权限的用户才能访问接口 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 注解,用于处理 HTTP 请求,将类标记为 RESTful 风格的控制器 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 注解,用于实现依赖注入,将所需的服务类实例注入到当前类中 import javax.annotation.Resource; +/** + * 外出登记控制器类,负责处理与老人或护工外出登记相关的各种操作请求, + * 涵盖了外出登记的增删改查、搜索老人和护工、获取护工列表、紧急联系人相关操作等功能。 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器的 API 分组为“外出登记”,方便在 API 文档中展示 @Api(tags = "外出登记") +// 使用 Spring MVC 的 @RestController 注解,将该类标记为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的数据 @RestController +// 使用 Spring MVC 的 @RequestMapping 注解,指定该控制器处理的请求的基础路径为 "/outward" @RequestMapping("/outward") +// 使用 Spring Security 的 @PreAuthorize 注解,进行权限验证,只有拥有 '/check-in/leave' 权限的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/check-in/leave')") public class OutwardController { + + // 使用 @Resource 注解,将 OutwardService 类型的实例注入到当前类中,以便调用其方法处理外出登记相关业务逻辑 @Resource private OutwardService outwardService; + /** + * 分页查询外出登记记录的方法。 + * + * @param pageOutwardByKeyQuery 分页查询外出登记的请求实体,包含查询条件(如外出时间、外出人员等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页查询外出登记操作结果的 Result 对象,封装了操作是否成功以及查询到的外出登记数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/outward/pageOutwardByKey" @GetMapping("/pageOutwardByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页查询外出登记”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页查询外出登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageOutwardByKey(@ApiParam(value = "分页查询外出登记请求实体", required = true) PageOutwardByKeyQuery pageOutwardByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageOutwardByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页查询外出登记请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询外出登记请求实体", required = true) + PageOutwardByKeyQuery pageOutwardByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 pageOutwardByKey 方法,传入分页查询请求实体,获取分页查询结果并以 Result 对象形式返回 return outwardService.pageOutwardByKey(pageOutwardByKeyQuery); } + /** + * 分页搜索老人信息的方法。 + * + * @param pageSearchElderByKeyQuery 分页搜索老人的请求实体,包含搜索条件(如老人姓名、身份证号等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页搜索老人操作结果的 Result 对象,封装了操作是否成功以及搜索到的老人数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/outward/pageSearchElderByKey" @GetMapping("/pageSearchElderByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页搜索老人”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页搜索老人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchElderByKey(@ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchElderByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页搜索老人请求实体”,并标记为必需参数 + @ApiParam(value = "分页搜索老人请求实体", required = true) + PageSearchElderByKeyQuery pageSearchElderByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 pageSearchElderByKey 方法,传入分页搜索请求实体,获取分页搜索结果并以 Result 对象形式返回 return outwardService.pageSearchElderByKey(pageSearchElderByKeyQuery); } + /** + * 分页搜索护工信息的方法。 + * + * @param pageSearchStaffByKeyQuery 分页搜索护工的请求实体,包含搜索条件(如护工姓名、工号等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页搜索护工操作结果的 Result 对象,封装了操作是否成功以及搜索到的护工数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/outward/pageSearchStaffByKey" @GetMapping("/pageSearchStaffByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页搜索护工”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页搜索护工", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchStaffByKey(@ApiParam(value = "分页搜索护工请求实体", required = true) PageSearchStaffByKeyQuery pageSearchStaffByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchStaffByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页搜索护工请求实体”,并标记为必需参数 + @ApiParam(value = "分页搜索护工请求实体", required = true) + PageSearchStaffByKeyQuery pageSearchStaffByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 pageSearchStaffByKey 方法,传入分页搜索请求实体,获取分页搜索结果并以 Result 对象形式返回 return outwardService.pageSearchStaffByKey(pageSearchStaffByKeyQuery); } + /** + * 获取护工列表的方法。 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含获取护工列表操作结果的 Result 对象,封装了操作是否成功以及获取到的护工数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/outward/listOutwardStaff" @GetMapping("/listOutwardStaff") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“获取护工列表”,并添加备注信息(包含开发者信息) @ApiOperation(value = "获取护工列表", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result listOutwardStaff(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result listOutwardStaff( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 listOutwardStaff 方法获取护工列表,并以 Result 对象形式返回结果 return outwardService.listOutwardStaff(); } + /** + * 分页获取紧急联系人信息的方法。 + * + * @param pageSearchEmergencyContactQuery 分页获取紧急联系人的请求实体,包含查询条件(如联系人姓名、联系方式等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页获取紧急联系人操作结果的 Result 对象,封装了操作是否成功以及获取到的紧急联系人数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/outward/pageEmergencyContact" @GetMapping("/pageEmergencyContact") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页获取紧急联系人”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页获取紧急联系人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageEmergencyContact(@ApiParam(value = "分页获取紧急联系人请求实体", required = true) PageSearchEmergencyContactQuery pageSearchEmergencyContactQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageEmergencyContact( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页获取紧急联系人请求实体”,并标记为必需参数 + @ApiParam(value = "分页获取紧急联系人请求实体", required = true) + PageSearchEmergencyContactQuery pageSearchEmergencyContactQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 pageEmergencyContact 方法,传入分页获取请求实体,获取分页查询结果并以 Result 对象形式返回 return outwardService.pageEmergencyContact(pageSearchEmergencyContactQuery); } + /** + * 根据老人编号获取紧急联系人列表的方法。 + * + * @param elderId 要获取紧急联系人列表的老人的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据老人编号获取紧急联系人列表操作结果的 Result 对象,封装了操作是否成功以及获取到的紧急联系人数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/outward/listContactByElderId" @GetMapping("/listContactByElderId") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“获取紧急联系人列表”,并添加备注信息(包含开发者信息) @ApiOperation(value = "获取紧急联系人列表", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result listContact(@ApiParam(value = "根据编号获取外出登记请求参数", required = true) @RequestParam Long elderId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result listContact( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据编号获取外出登记请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "根据编号获取外出登记请求参数", required = true) @RequestParam Long elderId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 listContactByElderId 方法,传入老人编号,获取紧急联系人列表并以 Result 对象形式返回 return outwardService.listContactByElderId(elderId); } + /** + * 新增外出登记记录的方法。 + * + * @param addOutwardQuery 新增外出登记的请求实体,包含要新增的外出登记的详细信息,如外出人员、外出时间、返回时间等。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含新增外出登记操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 Spring MVC 的 @PostMapping 注解,指定该方法处理 HTTP POST 请求,路径为 "/outward/addOutward" @PostMapping("/addOutward") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增外出登记”,并添加备注信息(包含开发者信息) @ApiOperation(value = "新增外出登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addOutward(@ApiParam(value = "新增外出登记请求实体", required = true) @RequestBody AddOutwardQuery addOutwardQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addOutward( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增外出登记请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增外出登记请求实体", required = true) @RequestBody AddOutwardQuery addOutwardQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 addOutward 方法,传入新增外出登记请求实体,执行新增操作并以 Result 对象形式返回 return outwardService.addOutward(addOutwardQuery); } + /** + * 根据编号获取外出登记记录信息的方法。 + * + * @param outwardId 要获取信息的外出登记记录的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据编号获取外出登记记录操作结果的 Result 对象,封装了操作是否成功以及获取到的外出登记记录详细信息等。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/outward/getOutwardById" @GetMapping("/getOutwardById") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“根据编号获取外出登记”,并添加备注信息(包含开发者信息) @ApiOperation(value = "根据编号获取外出登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getOutwardById(@ApiParam(value = "根据编号获取外出登记请求参数", required = true) @RequestParam Long outwardId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getOutwardById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据编号获取外出登记请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "根据编号获取外出登记请求参数", required = true) @RequestParam Long outwardId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 getOutwardById 方法,传入外出登记记录编号,获取外出登记记录信息并以 Result 对象形式返回 return outwardService.getOutwardById(outwardId); } + /** + * 处理外出人员延期返回的方法。 + * + * @param delayReturnQuery 延期返回的请求实体,包含延期的相关信息,如延期原因、新的返回时间等。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含处理延期返回操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/outward/delayReturn" @PutMapping("/delayReturn") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“延期返回”,并添加备注信息(包含开发者信息) @ApiOperation(value = "延期返回", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result delayReturn(@ApiParam(value = "延期返回请求实体", required = true) @RequestBody DelayReturnQuery delayReturnQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result delayReturn( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“延期返回请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "延期返回请求实体", required = true) @RequestBody DelayReturnQuery delayReturnQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 delayReturn 方法,传入延期返回请求实体,执行延期返回操作并以 Result 对象形式返回 return outwardService.delayReturn(delayReturnQuery); } + /** + * 登记外出人员返回的方法。 + * + * @param recordReturnQuery 登记返回的请求实体,包含返回的相关信息,如实际返回时间、返回状态等。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含登记返回操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/outward/recordReturn" @PutMapping("/recordReturn") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“登记返回”,并添加备注信息(包含开发者信息) @ApiOperation(value = "登记返回", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result recordReturn(@ApiParam(value = "登记返回请求实体", required = true) @RequestBody RecordReturnQuery recordReturnQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result recordReturn( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“登记返回请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "登记返回请求实体", required = true) @RequestBody RecordReturnQuery recordReturnQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 recordReturn 方法,传入登记返回请求实体,执行登记返回操作并以 Result 对象形式返回 return outwardService.recordReturn(recordReturnQuery); } + /** + * 删除外出登记记录的方法。 + * + * @param outwardId 要删除的外出登记记录的编号。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含删除外出登记记录操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 Spring MVC 的 @DeleteMapping 注解,指定该方法处理 HTTP DELETE 请求,路径为 "/outward/deleteOutward" @DeleteMapping("/deleteOutward") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“删除外出登记”,并添加备注信息(包含开发者信息) @ApiOperation(value = "删除外出登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteOutward(@ApiParam(value = "删除外出登记请求参数", required = true) @RequestParam Long outwardId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteOutward( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“删除外出登记请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "删除外出登记请求参数", required = true) @RequestParam Long outwardId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用外出登记服务类的 deleteOutward 方法,传入外出登记记录编号,执行删除操作并以 Result 对象形式返回 return outwardService.deleteOutward(outwardId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/ReserveController.java b/server/src/main/java/com/ew/gerocomium/controller/ReserveController.java index 4da77d7..9a7bf68 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/ReserveController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/ReserveController.java @@ -1,72 +1,189 @@ +// 声明该类所在的包,用于组织项目中的类,这里表示是预定管理相关控制器类的包 package com.ew.gerocomium.controller; +// 导入项目自定义的常量类,可能包含项目通用的一些常量信息,如开发者标识等 import com.ew.gerocomium.common.constant.Constant; +// 导入项目自定义的基础结果类,用于封装接口返回的数据,通常包含状态码、消息和具体数据内容 import com.ew.gerocomium.dao.base.Result; +// 导入多个查询实体类,这些类用于封装不同业务操作的查询条件和参数 import com.ew.gerocomium.dao.query.*; -import com.ew.gerocomium.service.ConsultService; +// 导入预定服务类,该类包含处理预定相关业务逻辑的方法 import com.ew.gerocomium.service.ReserveService; +// 导入咨询服务类,该类包含处理咨询相关业务逻辑的方法 +import com.ew.gerocomium.service.ConsultService; +// 导入 Swagger 注解,用于标记 API 分组,方便在生成 API 文档时对接口进行分类展示 import io.swagger.annotations.Api; +// 导入 Swagger 注解,用于描述 API 操作的详细信息,如操作名称和备注 import io.swagger.annotations.ApiOperation; +// 导入 Swagger 注解,用于描述 API 参数的详细信息,如参数名称、是否必填等 import io.swagger.annotations.ApiParam; +// 导入 Spring Security 注解,用于在方法执行前进行权限验证,确保只有具有指定权限的用户才能访问接口 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 注解,用于处理 HTTP 请求,将类标记为 RESTful 风格的控制器 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 注解,用于实现依赖注入,将所需的服务类实例注入到当前类中 import javax.annotation.Resource; +/** + * 预定管理控制器类,用于处理与预定相关的各种操作请求, + * 包括获取营销人员列表、分页查询预定信息、搜索老人、获取楼栋树、 + * 新增预定、根据预定编号和老人编号获取预定信息以及退款等功能。 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器的 API 分组为“预定管理”,方便在 API 文档中展示 @Api(tags = "预定管理") +// 使用 Spring MVC 的 @RestController 注解,将该类标记为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的数据 @RestController +// 使用 Spring MVC 的 @RequestMapping 注解,指定该控制器处理的请求的基础路径为 "/reserve" @RequestMapping("/reserve") +// 使用 Spring Security 的 @PreAuthorize 注解,进行权限验证,只有拥有 '/soles/booking' 权限的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/soles/booking')") public class ReserveController { + + // 使用 @Resource 注解,将 ReserveService 类型的实例注入到当前类中,以便调用其方法处理预定相关业务逻辑 @Resource private ReserveService reserveService; + + // 使用 @Resource 注解,将 ConsultService 类型的实例注入到当前类中,以便调用其方法处理咨询相关业务逻辑 @Resource private ConsultService consultService; + /** + * 获取营销人员列表的方法。 + * 这里调用了 consultService 的 listConsultStaff 方法,可能是因为营销人员与咨询人员相关。 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含获取营销人员列表操作结果的 Result 对象,封装了操作是否成功以及获取到的营销人员数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/reserve/listReserveStaff" @GetMapping("/listReserveStaff") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“获取营销人员”,并添加备注信息(包含开发者信息) @ApiOperation(value = "获取营销人员", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result listReserveStaff(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result listReserveStaff( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用咨询服务类的 listConsultStaff 方法获取营销人员列表,并以 Result 对象形式返回结果 return consultService.listConsultStaff(); } + /** + * 分页查询预定信息的方法。 + * + * @param pageReserveByKeyQuery 分页查询预定的请求实体,包含查询条件(如预定时间、预定人员等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页查询预定操作结果的 Result 对象,封装了操作是否成功以及查询到的预定数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/reserve/pageReserveByKey" @GetMapping("/pageReserveByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页查询预定”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页查询预定", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageReserveByKey(@ApiParam(value = "分页查询预定请求实体", required = true) PageReserveByKeyQuery pageReserveByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageReserveByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页查询预定请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询预定请求实体", required = true) + PageReserveByKeyQuery pageReserveByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用预定服务类的 pageReserveByKey 方法,传入分页查询请求实体,获取分页查询结果并以 Result 对象形式返回 return reserveService.pageReserveByKey(pageReserveByKeyQuery); } + /** + * 分页搜索老人信息的方法。 + * + * @param pageSearchElderByKeyQuery 分页搜索老人的请求实体,包含搜索条件(如老人姓名、身份证号等)和分页信息(如页码、每页数量等)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含分页搜索老人操作结果的 Result 对象,封装了操作是否成功以及搜索到的老人数据列表等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/reserve/pageSearchElderByKey" @GetMapping("/pageSearchElderByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页搜索老人”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页搜索老人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchElderByKey(@ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchElderByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页搜索老人请求实体”,并标记为必需参数 + @ApiParam(value = "分页搜索老人请求实体", required = true) + PageSearchElderByKeyQuery pageSearchElderByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用预定服务类的 pageSearchElderByKey 方法,传入分页搜索请求实体,获取分页搜索结果并以 Result 对象形式返回 return reserveService.pageSearchElderByKey(pageSearchElderByKeyQuery); } + /** + * 获取楼栋树信息的方法。 + * + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含获取楼栋树操作结果的 Result 对象,封装了操作是否成功以及获取到的楼栋树相关数据等信息。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/reserve/getBuildTree" @GetMapping("/getBuildTree") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“获取楼栋树”,并添加备注信息(包含开发者信息) @ApiOperation(value = "获取楼栋树", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getBuildTree(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getBuildTree( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用预定服务类的 getBuildTree 方法获取楼栋树信息,并以 Result 对象形式返回结果 return reserveService.getBuildTree(); } + /** + * 新增预定记录的方法。 + * + * @param addReserveQuery 新增预定的请求实体,包含要新增的预定的详细信息,如预定人员、预定时间、预定房间等。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含新增预定操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 Spring MVC 的 @PostMapping 注解,指定该方法处理 HTTP POST 请求,路径为 "/reserve/addReserve" @PostMapping("/addReserve") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增预定”,并添加备注信息(包含开发者信息) @ApiOperation(value = "新增预定", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addReserve(@ApiParam(value = "新增预定请求实体", required = true) @RequestBody AddReserveQuery addReserveQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addReserve( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增预定请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增预定请求实体", required = true) @RequestBody AddReserveQuery addReserveQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用预定服务类的 addReserve 方法,传入新增预定请求实体,执行新增预定操作并以 Result 对象形式返回 return reserveService.addReserve(addReserveQuery); } + /** + * 根据预定编号和老人编号获取预定信息的方法。 + * + * @param getReserveByReserveIdAndElderIdQuery 包含预定编号和老人编号的请求实体。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含根据预定编号和老人编号获取预定信息操作结果的 Result 对象, + * 封装了操作是否成功以及获取到的预定详细信息等。 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/reserve/getReserveByReserveIdAndElderId" @GetMapping("/getReserveByReserveIdAndElderId") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“根据预定编号和老人编号获取预定信息”,并添加备注信息(包含开发者信息) @ApiOperation(value = "根据预定编号和老人编号获取预定信息", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getReserveByReserveIdAndElderId(@ApiParam(value = "根据预定编号和老人编号获取预定信息请求实体", required = true) GetReserveByReserveIdAndElderIdQuery getReserveByReserveIdAndElderIdQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getReserveByReserveIdAndElderId( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据预定编号和老人编号获取预定信息请求实体”,并标记为必需参数 + @ApiParam(value = "根据预定编号和老人编号获取预定信息请求实体", required = true) + GetReserveByReserveIdAndElderIdQuery getReserveByReserveIdAndElderIdQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用预定服务类的 getReserveByReserveIdAndElderId 方法,传入请求实体,获取预定信息并以 Result 对象形式返回 return reserveService.getReserveByReserveIdAndElderId(getReserveByReserveIdAndElderIdQuery); } + /** + * 处理退款操作的方法。 + * 从请求实体中获取预定编号,调用 reserveService 的 refund 方法进行退款操作。 + * + * @param getReserveByReserveIdAndElderIdQuery 包含预定编号的请求实体(这里可能只用到预定编号进行退款)。 + * @param token 接口访问请求头中的令牌,用于身份验证,确保只有合法用户才能访问该接口。 + * @return 包含退款操作结果的 Result 对象,封装了操作是否成功以及可能的错误信息等。 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/reserve/refund" @PutMapping("/refund") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“退款”,并添加备注信息(包含开发者信息) @ApiOperation(value = "退款", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result refund(@ApiParam(value = "退款请求参数", required = true) @RequestBody GetReserveByReserveIdAndElderIdQuery getReserveByReserveIdAndElderIdQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result refund( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“退款请求参数”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "退款请求参数", required = true) @RequestBody GetReserveByReserveIdAndElderIdQuery getReserveByReserveIdAndElderIdQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 从请求实体中获取预定编号,调用预定服务类的 refund 方法进行退款操作,并以 Result 对象形式返回结果 return reserveService.refund(getReserveByReserveIdAndElderIdQuery.getReserveId()); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/RetreatApplyController.java b/server/src/main/java/com/ew/gerocomium/controller/RetreatApplyController.java index 5e9fb98..5232173 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/RetreatApplyController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/RetreatApplyController.java @@ -1,45 +1,106 @@ +// 声明该类所在的包,用于组织和管理代码,这里表示该类属于 com.ew.gerocomium.controller 包 package com.ew.gerocomium.controller; +// 导入项目自定义的常量类,可能包含一些通用的常量信息,如开发者信息等 import com.ew.gerocomium.common.constant.Constant; +// 导入项目自定义的基础结果类,用于封装接口返回的数据,一般包含状态码、消息和具体数据 import com.ew.gerocomium.dao.base.Result; +// 导入根据预订 ID 和老人 ID 获取预订信息的查询实体类,这里用于新增退住申请时获取相关信息 import com.ew.gerocomium.dao.query.GetReserveByReserveIdAndElderIdQuery; +// 导入分页查询退住申请的查询实体类,用于封装分页查询退住申请的条件和分页信息 import com.ew.gerocomium.dao.query.PageRetreatApplyQuery; +// 导入分页搜索老人的查询实体类,用于封装分页搜索老人的条件和分页信息 import com.ew.gerocomium.dao.query.PageSearchElderByKeyQuery; +// 导入退住申请服务类,该类包含处理退住申请相关业务逻辑的方法 import com.ew.gerocomium.service.RetreatApplyService; +// 导入 Swagger 注解,用于标记 API 分组,方便在生成 API 文档时对接口进行分类展示 import io.swagger.annotations.Api; +// 导入 Swagger 注解,用于描述 API 操作的详细信息,如操作名称和备注 import io.swagger.annotations.ApiOperation; +// 导入 Swagger 注解,用于描述 API 参数的详细信息,如参数名称、是否必填等 import io.swagger.annotations.ApiParam; +// 导入 Spring Security 注解,用于在方法执行前进行权限验证,确保只有具有指定权限的用户才能访问接口 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 注解,用于处理 HTTP 请求,将类标记为 RESTful 风格的控制器 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 注解,用于实现依赖注入,将所需的服务类实例注入到当前类中 import javax.annotation.Resource; +/** + * 退住申请控制器,处理与退住申请相关的 HTTP 请求。 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器的 API 分组为“退住申请”,方便在 API 文档中展示 @Api(tags = "退住申请") +// 使用 Spring MVC 的 @RestController 注解,将该类标记为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的数据 @RestController +// 使用 Spring MVC 的 @RequestMapping 注解,指定该控制器处理的请求的基础路径为 "/retreatApply" @RequestMapping("/retreatApply") +// 使用 Spring Security 的 @PreAuthorize 注解,进行权限验证,只有拥有 '/check-in/check-out' 权限的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/check-in/check-out')") public class RetreatApplyController { + // 使用 @Resource 注解,将 RetreatApplyService 类型的实例注入到当前类中,以便调用其方法处理业务逻辑 @Resource private RetreatApplyService retreatApplyService; + /** + * 分页查询退住申请。 + * + * @param pageRetreatApplyQuery 分页查询退住申请的请求实体,包含查询条件和分页信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含分页查询结果的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/retreatApply/pageRetreatApplyByKey" @GetMapping("/pageRetreatApplyByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页查询退住申请”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页查询退住申请", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageRetreatApplyByKey(@ApiParam(value = "分页查询退住申请请求实体", required = true) PageRetreatApplyQuery pageRetreatApplyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageRetreatApplyByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页查询退住申请请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询退住申请请求实体", required = true) + PageRetreatApplyQuery pageRetreatApplyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用退住申请服务类的 pageRetreatApplyByKey 方法,传入分页查询请求实体,获取分页查询结果并以 Result 对象形式返回 return retreatApplyService.pageRetreatApplyByKey(pageRetreatApplyQuery); } + /** + * 分页搜索老人信息。 + * + * @param pageSearchElderByKeyQuery 分页搜索老人的请求实体,包含搜索条件和分页信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含分页搜索结果的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/retreatApply/pageSearchElderByKey" @GetMapping("/pageSearchElderByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页搜索老人”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页搜索老人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchElderByKey(@ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchElderByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页搜索老人请求实体”,并标记为必需参数 + @ApiParam(value = "分页搜索老人请求实体", required = true) + PageSearchElderByKeyQuery pageSearchElderByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用退住申请服务类的 pageSearchElderByKey 方法,传入分页搜索请求实体,获取分页搜索结果并以 Result 对象形式返回 return retreatApplyService.pageSearchElderByKey(pageSearchElderByKeyQuery); } + /** + * 新增退住申请。 + * + * @param getReserveByReserveIdAndElderIdQuery 新增退住申请的请求参数,包含老人编号等信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含新增操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PostMapping 注解,指定该方法处理 HTTP POST 请求,路径为 "/retreatApply/addRetreatApply" @PostMapping("/addRetreatApply") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增退住申请”,并添加备注信息(包含开发者信息) @ApiOperation(value = "新增退住申请", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addRetreatApply(@ApiParam(value = "新增退住申请请求参数", required = true) @RequestBody GetReserveByReserveIdAndElderIdQuery getReserveByReserveIdAndElderIdQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addRetreatApply( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增退住申请请求参数”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增退住申请请求参数", required = true) @RequestBody GetReserveByReserveIdAndElderIdQuery getReserveByReserveIdAndElderIdQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 从请求参数中获取老人编号,并调用退住申请服务类的 addRetreatApply 方法,传入老人编号,执行新增退住申请操作并以 Result 对象形式返回 return retreatApplyService.addRetreatApply(getReserveByReserveIdAndElderIdQuery.getElderId()); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/ServiceProjectController.java b/server/src/main/java/com/ew/gerocomium/controller/ServiceProjectController.java index 84aafbf..1e6d483 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/ServiceProjectController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/ServiceProjectController.java @@ -1,92 +1,242 @@ +// 声明该类所在的包,用于组织和管理项目中的类,这里表明该类是控制器相关的类 package com.ew.gerocomium.controller; +// 导入项目自定义的常量类,通常包含一些通用的常量信息,如开发者信息等 import com.ew.gerocomium.common.constant.Constant; +// 导入项目自定义的基础结果类,用于封装接口返回的数据,一般包含状态码、消息和具体的数据内容 import com.ew.gerocomium.dao.base.Result; +// 导入多个查询实体类,这些类用于封装不同业务操作的查询条件和参数 import com.ew.gerocomium.dao.query.*; +// 导入服务项目的服务类,该类包含了处理服务项目和服务类型相关业务逻辑的方法 import com.ew.gerocomium.service.ServiceProjectService; +// 导入 Swagger 注解,用于标记 API 分组,方便在生成 API 文档时对接口进行分类展示 import io.swagger.annotations.Api; +// 导入 Swagger 注解,用于描述 API 操作的详细信息,如操作名称和备注 import io.swagger.annotations.ApiOperation; +// 导入 Swagger 注解,用于描述 API 参数的详细信息,如参数名称、是否必填等 import io.swagger.annotations.ApiParam; +// 导入 Spring Security 注解,用于在方法执行前进行权限验证,确保只有具有指定权限的用户才能访问接口 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 注解,用于处理 HTTP 请求,将类标记为 RESTful 风格的控制器 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 注解,用于实现依赖注入,将所需的服务类实例注入到当前类中 import javax.annotation.Resource; +/** + * 服务项目控制器,处理与服务项目和服务类型相关的 HTTP 请求。 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器的 API 分组为“服务项目”,方便在 API 文档中展示 @Api(tags = "服务项目") +// 使用 Spring MVC 的 @RestController 注解,将该类标记为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的数据 @RestController +// 使用 Spring MVC 的 @RequestMapping 注解,指定该控制器处理的请求的基础路径为 "/service" @RequestMapping("/service") +// 使用 Spring Security 的 @PreAuthorize 注解,进行权限验证,只有拥有 '/service/project' 权限的用户才能访问该控制器的方法 @PreAuthorize("@AuthorityAssert.hasAuthority('/service/project')") public class ServiceProjectController { + // 使用 @Resource 注解,将 ServiceProjectService 类型的实例注入到当前类中,以便调用其方法处理业务逻辑 @Resource private ServiceProjectService serviceProjectService; + /** + * 获取服务类型列表。 + * + * @param serviceTypeName 可选的服务类型名称,用于过滤服务类型列表 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含服务类型列表的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/service/getServiceType" @GetMapping("/getServiceType") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“获取服务类型”,并添加备注信息(包含开发者信息) @ApiOperation(value = "获取服务类型", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getServiceType(@ApiParam(value = "获取服务类型请求参数", required = false) String serviceTypeName, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getServiceType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“获取服务类型请求参数”,并标记为非必需参数 + @ApiParam(value = "获取服务类型请求参数", required = false) + String serviceTypeName, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 listServiceType 方法,传入服务类型名称,获取服务类型列表并以 Result 对象形式返回 return serviceProjectService.listServiceType(serviceTypeName); } + /** + * 分页查询服务信息。 + * + * @param pageServiceByKeyQuery 分页查询服务的请求实体,包含查询条件和分页信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含分页查询结果的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/service/pageServiceByKey" @GetMapping("/pageServiceByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页查询服务”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页查询服务", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageServiceByKey(@ApiParam(value = "分页查询服务请求实体", required = true) PageServiceByKeyQuery pageServiceByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageServiceByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页查询服务请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询服务请求实体", required = true) + PageServiceByKeyQuery pageServiceByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 pageServiceByKey 方法,传入分页查询请求实体,获取分页查询结果并以 Result 对象形式返回 return serviceProjectService.pageServiceByKey(pageServiceByKeyQuery); } + /** + * 新增服务类型。 + * + * @param operateServiceTypeQuery 新增服务类型的请求实体,包含服务类型的详细信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含新增操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PostMapping 注解,指定该方法处理 HTTP POST 请求,路径为 "/service/addServiceType" @PostMapping("/addServiceType") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增服务类型”,并添加备注信息(包含开发者信息) @ApiOperation(value = "新增服务类型", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addServiceType(@ApiParam(value = "新增服务类型请求实体", required = true) @RequestBody OperateServiceTypeQuery operateServiceTypeQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addServiceType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增服务类型请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增服务类型请求实体", required = true) @RequestBody OperateServiceTypeQuery operateServiceTypeQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 addServiceType 方法,传入新增服务类型请求实体,执行新增操作并将结果以 Result 对象形式返回 return serviceProjectService.addServiceType(operateServiceTypeQuery); } + /** + * 根据编号查询服务类型。 + * + * @param serviceTypeId 服务类型的编号 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含服务类型详细信息的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/service/getServiceTypeById" @GetMapping("/getServiceTypeById") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“根据编号查询服务类型”,并添加备注信息(包含开发者信息) @ApiOperation(value = "根据编号查询服务类型", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getServiceTypeById(@ApiParam(value = "根据编号查询服务类型请求参数", required = true) @RequestParam Long serviceTypeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getServiceTypeById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据编号查询服务类型请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "根据编号查询服务类型请求参数", required = true) @RequestParam Long serviceTypeId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 getServiceTypeById 方法,传入服务类型编号,获取指定编号的服务类型详细信息并以 Result 对象形式返回 return serviceProjectService.getServiceTypeById(serviceTypeId); } + /** + * 编辑服务类型。 + * + * @param operateServiceTypeQuery 编辑服务类型的请求实体,包含要更新的服务类型信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含编辑操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/service/editServiceType" @PutMapping("/editServiceType") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“编辑服务类型”,并添加备注信息(包含开发者信息) @ApiOperation(value = "编辑服务类型", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editServiceType(@ApiParam(value = "编辑服务类型请求实体", required = true) @RequestBody OperateServiceTypeQuery operateServiceTypeQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editServiceType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“编辑服务类型请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "编辑服务类型请求实体", required = true) @RequestBody OperateServiceTypeQuery operateServiceTypeQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 editServiceType 方法,传入编辑服务类型请求实体,执行编辑操作并将结果以 Result 对象形式返回 return serviceProjectService.editServiceType(operateServiceTypeQuery); } + /** + * 删除服务类型。 + * + * @param serviceTypeId 要删除的服务类型的编号 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含删除操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @DeleteMapping 注解,指定该方法处理 HTTP DELETE 请求,路径为 "/service/deleteServiceType" @DeleteMapping("/deleteServiceType") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“删除服务类型”,并添加备注信息(包含开发者信息) @ApiOperation(value = "删除服务类型", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteServiceType(@ApiParam(value = "删除服务类型请求参数", required = true) @RequestParam Long serviceTypeId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteServiceType( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“删除服务类型请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "删除服务类型请求参数", required = true) @RequestParam Long serviceTypeId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 deleteServiceType 方法,传入服务类型编号,执行删除操作并将结果以 Result 对象形式返回 return serviceProjectService.deleteServiceType(serviceTypeId); } + /** + * 新增服务。 + * + * @param operateServiceQuery 新增服务的请求实体,包含服务的详细信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含新增操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PostMapping 注解,指定该方法处理 HTTP POST 请求,路径为 "/service/addService" @PostMapping("/addService") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增服务”,并添加备注信息(包含开发者信息) @ApiOperation(value = "新增服务", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addService(@ApiParam(value = "新增服务请求实体", required = true) @RequestBody OperateServiceQuery operateServiceQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addService( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增服务请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增服务请求实体", required = true) @RequestBody OperateServiceQuery operateServiceQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 addService 方法,传入新增服务请求实体,执行新增操作并将结果以 Result 对象形式返回 return serviceProjectService.addService(operateServiceQuery); } + /** + * 根据编号查询服务。 + * + * @param serviceId 服务的编号 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含服务详细信息的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/service/getServiceById" @GetMapping("/getServiceById") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“根据编号查询服务”,并添加备注信息(包含开发者信息) @ApiOperation(value = "根据编号查询服务", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getServiceById(@ApiParam(value = "根据编号查询服务请求参数", required = true) @RequestParam Long serviceId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getServiceById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据编号查询服务请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "根据编号查询服务请求参数", required = true) @RequestParam Long serviceId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 getServiceById 方法,传入服务编号,获取指定编号的服务详细信息并以 Result 对象形式返回 return serviceProjectService.getServiceById(serviceId); } + /** + * 编辑服务。 + * + * @param operateServiceQuery 编辑服务的请求实体,包含要更新的服务信息 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含编辑操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/service/editService" @PutMapping("/editService") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“编辑服务”,并添加备注信息(包含开发者信息) @ApiOperation(value = "编辑服务", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editService(@ApiParam(value = "编辑服务请求实体", required = true) @RequestBody OperateServiceQuery operateServiceQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editService( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“编辑服务请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "编辑服务请求实体", required = true) @RequestBody OperateServiceQuery operateServiceQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 editService 方法,传入编辑服务请求实体,执行编辑操作并将结果以 Result 对象形式返回 return serviceProjectService.editService(operateServiceQuery); } + /** + * 删除服务。 + * + * @param serviceId 要删除的服务的编号 + * @param token 接口访问请求头中的令牌,用于身份验证 + * @return 包含删除操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @DeleteMapping 注解,指定该方法处理 HTTP DELETE 请求,路径为 "/service/deleteService" @DeleteMapping("/deleteService") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“删除服务”,并添加备注信息(包含开发者信息) @ApiOperation(value = "删除服务", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteService(@ApiParam(value = "删除服务请求参数", required = true) @RequestParam Long serviceId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteService( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“删除服务请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "删除服务请求参数", required = true) @RequestParam Long serviceId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用服务项目服务类的 deleteService 方法,传入服务编号,执行删除操作并将结果以 Result 对象形式返回 return serviceProjectService.deleteService(serviceId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/StaffController.java b/server/src/main/java/com/ew/gerocomium/controller/StaffController.java index 9e6aa1a..82becc8 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/StaffController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/StaffController.java @@ -1,65 +1,162 @@ +// 声明当前类所在的包,表明这是员工管理相关控制器类所在的包 package com.ew.gerocomium.controller; +// 导入项目自定义的常量类,可能包含一些通用的开发相关常量等信息 import com.ew.gerocomium.common.constant.Constant; +// 导入项目自定义的基础结果类,用于封装接口返回的各种数据结果,一般包含状态码、消息和具体数据等 import com.ew.gerocomium.dao.base.Result; +// 导入操作员工的查询实体类,用于封装新增、编辑员工等操作时的相关数据 import com.ew.gerocomium.dao.query.OperateStaffQuery; +// 导入分页查询员工离职申请的查询实体类,这里在当前代码中暂未使用到 import com.ew.gerocomium.dao.query.PageRetreatApplyQuery; +// 导入分页查询员工的查询实体类,用于封装分页和查询条件等相关数据 import com.ew.gerocomium.dao.query.PageStaffByKeyQuery; +// 导入员工服务类,该类包含了处理员工相关业务逻辑的具体方法 import com.ew.gerocomium.service.StaffService; +// 导入 Swagger 的注解,用于标记 API 的分组,方便在生成 API 文档时分类展示 import io.swagger.annotations.Api; +// 导入 Swagger 的注解,用于描述 API 操作的具体信息,如操作名称和备注等 import io.swagger.annotations.ApiOperation; +// 导入 Swagger 的注解,用于描述 API 参数的相关信息,如参数名称、是否必填等 import io.swagger.annotations.ApiParam; +// 导入 Spring Security 的注解,用于在方法执行前进行权限验证,确保只有具备相应权限的用户才能访问接口 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 的注解,用于处理 HTTP 请求,将类标记为 RESTful 风格的控制器 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 的注解,用于实现依赖注入,将所需的服务类实例注入到当前类中 import javax.annotation.Resource; +/** + * 员工管理相关的控制器类,处理与员工管理相关的 HTTP 请求 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器所属的 API 分组为“员工管理” @Api(tags = "员工管理") +// 使用 Spring MVC 的 @RestController 注解,将该类标记为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的数据 @RestController +// 使用 Spring MVC 的 @RequestMapping 注解,指定该控制器处理的请求路径前缀为 "/staff" @RequestMapping("/staff") +// 使用 Spring Security 的 @PreAuthorize 注解,进行权限验证,只有拥有 '/people/staff' 权限的用户才能访问该控制器中的接口 @PreAuthorize("@AuthorityAssert.hasAuthority('/people/staff')") public class StaffController { + // 使用 @Resource 注解,将 StaffService 类型的实例注入到当前类中,以便在当前类中调用员工服务类的方法处理业务逻辑 @Resource private StaffService staffService; + /** + * 获取角色的接口 + * + * @param token 接口访问请求头,用于身份验证等 + * @return 返回包含角色信息的结果对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/staff/getRole" @GetMapping("/getRole") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“获取角色”,并添加备注信息(包含开发者信息) @ApiOperation(value = "获取角色", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getRole(@ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getRole( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用员工服务类的 getRole 方法,获取角色信息,并将结果以 Result 对象形式返回 return staffService.getRole(); } + /** + * 分页查询员工的接口 + * + * @param pageStaffByKeyQuery 分页查询员工请求实体,包含分页和查询条件等信息 + * @param token 接口访问请求头,用于身份验证等 + * @return 返回包含分页查询员工结果的结果对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/staff/pageStaffByKey" @GetMapping("/pageStaffByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页查询员工”,并添加备注信息(包含开发者信息) @ApiOperation(value = "分页查询员工", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageStaffByKey(@ApiParam(value = "分页查询员工请求实体", required = true) PageStaffByKeyQuery pageStaffByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageStaffByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页查询员工请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询员工请求实体", required = true) + PageStaffByKeyQuery pageStaffByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用员工服务类的 pageStaffByKey 方法,传入分页查询员工请求实体,获取分页查询员工的结果,并以 Result 对象形式返回 return staffService.pageStaffByKey(pageStaffByKeyQuery); } + /** + * 新增员工的接口 + * + * @param operateStaffQuery 新增员工请求实体,包含员工的相关信息 + * @param token 接口访问请求头,用于身份验证等 + * @return 返回包含新增员工操作结果的结果对象 + */ + // 使用 Spring MVC 的 @PostMapping 注解,指定该方法处理 HTTP POST 请求,路径为 "/staff/addStaff" @PostMapping("/addStaff") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增员工”,并添加备注信息(包含开发者信息) @ApiOperation(value = "新增员工", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addStaff(@ApiParam(value = "新增员工请求实体", required = true) @RequestBody OperateStaffQuery operateStaffQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addStaff( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增员工请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增员工请求实体", required = true) @RequestBody OperateStaffQuery operateStaffQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用员工服务类的 addStaff 方法,传入新增员工请求实体,执行新增员工操作,并将操作结果以 Result 对象形式返回 return staffService.addStaff(operateStaffQuery); } + /** + * 根据编号查询员工的接口 + * + * @param staffId 员工编号,用于指定要查询的员工 + * @param token 接口访问请求头,用于身份验证等 + * @return 返回包含指定编号员工信息的结果对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/staff/getStaffById" @GetMapping("/getStaffById") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“根据编号查询员工”,并添加备注信息(包含开发者信息) @ApiOperation(value = "根据编号查询员工", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getStaffById(@ApiParam(value = "根据编号查询员工请求参数", required = true) @RequestParam Long staffId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getStaffById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据编号查询员工请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "根据编号查询员工请求参数", required = true) @RequestParam Long staffId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用员工服务类的 getStaffById 方法,传入员工编号,查询指定编号的员工信息,并将结果以 Result 对象形式返回 return staffService.getStaffById(staffId); } + /** + * 编辑员工的接口 + * + * @param operateStaffQuery 编辑员工请求实体,包含要编辑的员工的相关信息 + * @param token 接口访问请求头,用于身份验证等 + * @return 返回包含编辑员工操作结果的结果对象 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/staff/editStaff" @PutMapping("/editStaff") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“编辑员工”,并添加备注信息(包含开发者信息) @ApiOperation(value = "编辑员工", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editStaff(@ApiParam(value = "编辑员工请求实体", required = true) @RequestBody OperateStaffQuery operateStaffQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editStaff( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“编辑员工请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "编辑员工请求实体", required = true) @RequestBody OperateStaffQuery operateStaffQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用员工服务类的 editStaff 方法,传入编辑员工请求实体,执行编辑员工操作,并将操作结果以 Result 对象形式返回 return staffService.editStaff(operateStaffQuery); } + /** + * 离职员工的接口 + * + * @param staffId 员工编号,用于指定要处理离职的员工 + * @param token 接口访问请求头,用于身份验证等 + * @return 返回包含员工离职操作结果的结果对象 + */ + // 使用 Spring MVC 的 @DeleteMapping 注解,指定该方法处理 HTTP DELETE 请求,路径为 "/staff/leaveStaff" @DeleteMapping("/leaveStaff") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“离职员工”,并添加备注信息(包含开发者信息) @ApiOperation(value = "离职员工", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result leaveStaff(@ApiParam(value = "离职员工请求参数", required = true) @RequestParam Long staffId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result leaveStaff( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“离职员工请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "离职员工请求参数", required = true) @RequestParam Long staffId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用员工服务类的 leaveStaff 方法,传入员工编号,执行员工离职操作,并将操作结果以 Result 对象形式返回 return staffService.leaveStaff(staffId); } -} +} \ No newline at end of file diff --git a/server/src/main/java/com/ew/gerocomium/controller/VisitController.java b/server/src/main/java/com/ew/gerocomium/controller/VisitController.java index d628a9a..2c3ed93 100644 --- a/server/src/main/java/com/ew/gerocomium/controller/VisitController.java +++ b/server/src/main/java/com/ew/gerocomium/controller/VisitController.java @@ -1,74 +1,188 @@ +// 声明该类所在的包,用于组织和管理代码 package com.ew.gerocomium.controller; +// 导入项目中自定义的常量类,可能包含一些通用的常量值,如开发者信息等 import com.ew.gerocomium.common.constant.Constant; +// 导入项目中自定义的通用结果类,用于封装接口返回的数据,一般包含状态码、消息和数据等信息 import com.ew.gerocomium.dao.base.Result; +// 导入多个查询相关的实体类,这些类用于封装不同业务的查询参数和条件 import com.ew.gerocomium.dao.query.*; +// 导入押金充值服务类,用于处理与押金充值相关的业务逻辑 import com.ew.gerocomium.service.DepositRechargeService; +// 导入来访服务类,用于处理来访登记相关的业务逻辑 import com.ew.gerocomium.service.VisitService; +// 导入 Swagger 注解,用于标记 API 分组,方便在生成的 API 文档中分类展示 import io.swagger.annotations.Api; +// 导入 Swagger 注解,用于描述 API 操作的详细信息,如操作名称、备注等 import io.swagger.annotations.ApiOperation; +// 导入 Swagger 注解,用于描述 API 参数的详细信息,如参数名称、是否必填等 import io.swagger.annotations.ApiParam; +// 导入 Spring Security 注解,用于在方法执行前进行权限检查,确保用户具有相应权限才能访问接口 import org.springframework.security.access.prepost.PreAuthorize; +// 导入 Spring MVC 注解,用于处理 HTTP 请求,将类标记为 RESTful 风格的控制器 import org.springframework.web.bind.annotation.*; - +// 导入 Spring 注解,用于实现依赖注入,将所需的服务类实例注入到当前类中 import javax.annotation.Resource; +/** + * 来访登记相关的控制器类,负责处理与来访登记业务相关的 HTTP 请求。 + * 该控制器需要用户具有 '/check-in/visit' 权限才能访问其接口。 + */ +// 使用 Swagger 的 @Api 注解,标记该控制器的 API 分组为“来访登记” @Api(tags = "来访登记") +// 使用 Spring MVC 的 @RestController 注解,将该类标记为 RESTful 风格的控制器,用于处理 HTTP 请求并返回 JSON 格式的数据 @RestController +// 使用 Spring MVC 的 @RequestMapping 注解,指定该控制器处理的请求路径前缀为 "/visit" @RequestMapping("/visit") +// 使用 Spring Security 的 @PreAuthorize 注解,要求用户具有 '/check-in/visit' 权限才能访问该控制器的接口 @PreAuthorize("@AuthorityAssert.hasAuthority('/check-in/visit')") public class VisitController { + // 使用 @Resource 注解,将 VisitService 类型的实例注入到当前类中,用于处理来访登记的核心业务逻辑 @Resource private VisitService visitService; + // 使用 @Resource 注解,将 DepositRechargeService 类型的实例注入到当前类中,虽然注释说用于处理与老人搜索相关业务逻辑,但从方法名看可能存在一些不一致,这里按代码注释理解 @Resource private DepositRechargeService depositRechargeService; + /** + * 分页查询来访登记信息 + * + * @param pageVisitByKeyQuery 分页查询来访登记的请求实体,包含分页和查询条件等信息 + * @param token 接口访问请求头,用于身份验证等操作 + * @return 返回包含分页查询结果的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/visit/pageVisitByKey" @GetMapping("/pageVisitByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页查询来访登记”,并添加备注信息 @ApiOperation(value = "分页查询来访登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageVisitByKey(@ApiParam(value = "分页查询来访登记请求实体", required = true) PageVisitByKeyQuery pageVisitByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageVisitByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页查询来访登记请求实体”,并标记为必需参数 + @ApiParam(value = "分页查询来访登记请求实体", required = true) + PageVisitByKeyQuery pageVisitByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用来访服务类的 pageVisitByKey 方法,传入请求实体,获取分页查询结果并返回 return visitService.pageVisitByKey(pageVisitByKeyQuery); } + /** + * 分页搜索老人信息 + * + * @param pageSearchElderByKeyQuery 分页搜索老人的请求实体,包含分页和搜索条件等信息 + * @param token 接口访问请求头,用于身份验证等操作 + * @return 返回包含分页搜索结果的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/visit/pageSearchElderByKey" @GetMapping("/pageSearchElderByKey") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“分页搜索老人”,并添加备注信息 @ApiOperation(value = "分页搜索老人", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result pageSearchElderByKey(@ApiParam(value = "分页搜索老人请求实体", required = true) PageSearchElderByKeyQuery pageSearchElderByKeyQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result pageSearchElderByKey( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“分页搜索老人请求实体”,并标记为必需参数 + @ApiParam(value = "分页搜索老人请求实体", required = true) + PageSearchElderByKeyQuery pageSearchElderByKeyQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用押金充值服务类的 pageSearchElderByKey 方法,传入请求实体,获取分页搜索结果并返回 return depositRechargeService.pageSearchElderByKey(pageSearchElderByKeyQuery); } + /** + * 新增来访登记信息 + * + * @param addVisitQuery 新增来访登记的请求实体,包含来访登记的详细信息 + * @param token 接口访问请求头,用于身份验证等操作 + * @return 返回包含新增操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PostMapping 注解,指定该方法处理 HTTP POST 请求,路径为 "/visit/addVisit" @PostMapping("/addVisit") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“新增来访登记”,并添加备注信息 @ApiOperation(value = "新增来访登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result addOutward(@ApiParam(value = "新增来访登记请求实体", required = true) @RequestBody AddVisitQuery addVisitQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result addOutward( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“新增来访登记请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "新增来访登记请求实体", required = true) @RequestBody AddVisitQuery addVisitQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用来访服务类的 addVisit 方法,传入请求实体,获取新增操作结果并返回 return visitService.addVisit(addVisitQuery); } + /** + * 根据编号获取来访登记信息 + * + * @param visitId 来访登记的编号,用于唯一标识一条来访登记记录 + * @param token 接口访问请求头,用于身份验证等操作 + * @return 返回包含指定编号来访登记信息的 Result 对象 + */ + // 使用 Spring MVC 的 @GetMapping 注解,指定该方法处理 HTTP GET 请求,路径为 "/visit/getVisitById" @GetMapping("/getVisitById") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“根据编号获取来访登记”,并添加备注信息 @ApiOperation(value = "根据编号获取来访登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result getVisitById(@ApiParam(value = "根据编号获取来访登记请求参数", required = true) @RequestParam Long visitId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result getVisitById( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“根据编号获取来访登记请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "根据编号获取来访登记请求参数", required = true) @RequestParam Long visitId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用来访服务类的 getVisitById 方法,传入来访登记编号,获取指定编号的来访登记信息并返回 return visitService.getVisitById(visitId); } + /** + * 编辑来访登记信息 + * + * @param editVisitQuery 编辑来访登记的请求实体,包含要修改的来访登记详细信息 + * @param token 接口访问请求头,用于身份验证等操作 + * @return 返回包含编辑操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/visit/editVisit" @PutMapping("/editVisit") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“编辑来访登记”,并添加备注信息 @ApiOperation(value = "编辑来访登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result editVisit(@ApiParam(value = "编辑来访登记请求实体", required = true) @RequestBody EditVisitQuery editVisitQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result editVisit( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“编辑来访登记请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "编辑来访登记请求实体", required = true) @RequestBody EditVisitQuery editVisitQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用来访服务类的 editVisit 方法,传入请求实体,获取编辑操作结果并返回 return visitService.editVisit(editVisitQuery); } + /** + * 登记来访人员离开信息 + * + * @param recordLeaveQuery 登记离开的请求实体,包含离开登记的相关信息 + * @param token 接口访问请求头,用于身份验证等操作 + * @return 返回包含登记离开操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @PutMapping 注解,指定该方法处理 HTTP PUT 请求,路径为 "/visit/recordLeave" @PutMapping("/recordLeave") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“登记离开”,并添加备注信息 @ApiOperation(value = "登记离开", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result recordLeave(@ApiParam(value = "登记离开请求实体", required = true) @RequestBody RecordLeaveQuery recordLeaveQuery, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result recordLeave( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“登记离开请求实体”,并标记为必需参数,同时使用 @RequestBody 注解从请求体中获取该参数值 + @ApiParam(value = "登记离开请求实体", required = true) @RequestBody RecordLeaveQuery recordLeaveQuery, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用来访服务类的 recordLeave 方法,传入请求实体,获取登记离开操作结果并返回 return visitService.recordLeave(recordLeaveQuery); } + /** + * 删除来访登记信息 + * + * @param visitId 要删除的来访登记的编号 + * @param token 接口访问请求头,用于身份验证等操作 + * @return 返回包含删除操作结果的 Result 对象 + */ + // 使用 Spring MVC 的 @DeleteMapping 注解,指定该方法处理 HTTP DELETE 请求,路径为 "/visit/deleteVisit" @DeleteMapping("/deleteVisit") + // 使用 Swagger 的 @ApiOperation 注解,描述该 API 操作的名称为“删除来访登记”,并添加备注信息 @ApiOperation(value = "删除来访登记", notes = Constant.DEVELOPER + Constant.EMPEROR_WEN) - public Result deleteVisit(@ApiParam(value = "删除来访登记请求参数", required = true) @RequestParam Long visitId, - @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + public Result deleteVisit( + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“删除来访登记请求参数”,并标记为必需参数,同时使用 @RequestParam 注解从请求参数中获取该参数值 + @ApiParam(value = "删除来访登记请求参数", required = true) @RequestParam Long visitId, + // 使用 Swagger 的 @ApiParam 注解,描述该参数的作用为“接口访问请求头”,并标记为必需参数,同时使用 @RequestHeader 注解从请求头中获取该参数值 + @ApiParam(value = "接口访问请求头", required = true) @RequestHeader String token) { + // 调用来访服务类的 deleteVisit 方法,传入来访登记编号,获取删除操作结果并返回 return visitService.deleteVisit(visitId); } } From ea50457f515dd5c4b4f75497ec35fed6a79a01eb Mon Sep 17 00:00:00 2001 From: zgj <2913248995@qq.com> Date: Wed, 30 Apr 2025 00:35:57 +0800 Subject: [PATCH 2/7] v1.5 --- .../components/Grid/components/GridItem.vue | 51 ++- client/src/components/Grid/index.vue | 77 +++- client/src/components/Grid/interface/index.ts | 14 +- client/src/components/IconPark/index.vue | 22 +- .../ProTable/Grid/components/GridItem.vue | 109 +++++ client/src/components/ProTable/Grid/index.vue | 207 +++++++++ .../ProTable/Grid/interface/index.ts | 12 + .../components/ProTable/IconPark/index.vue | 45 ++ .../ProTable/components/ColSetting.vue | 88 ++++ .../ProTable/components/Pagination.vue | 47 +++ .../ProTable/components/TableColumn.vue | 103 +++++ .../src/components/ProTable/ProTable/index.md | 87 ++++ .../components/ProTable/ProTable/index.vue | 397 ++++++++++++++++++ .../ProTable/ProTable/interface/index.ts | 84 ++++ .../ProTable/ReImageVerify/index.ts | 12 + .../ProTable/ReImageVerify/src/hooks.ts | 133 ++++++ .../ProTable/ReImageVerify/src/index.vue | 55 +++ .../SearchForm/components/SearchFormItem.vue | 117 ++++++ .../components/ProTable/SearchForm/index.vue | 142 +++++++ .../src/components/ProTable/SvgIcon/index.vue | 49 +++ .../ProTable/components/ColSetting.vue | 32 +- .../ProTable/components/Pagination.vue | 20 +- .../ProTable/components/TableColumn.vue | 45 +- .../ProTable/elderListDialog/index.vue | 118 ++++++ client/src/components/ProTable/index.vue | 182 +++++--- .../components/ProTable/interface/index.ts | 83 ++-- .../components/ProTable/my-card/my-card.vue | 30 ++ .../components/ProTable/treeDialog/index.vue | 90 ++++ .../ProTable/upload/image/index.vue | 189 +++++++++ .../wen-test/DynamicAdditionComponent.vue | 47 +++ client/src/components/ReImageVerify/index.ts | 6 + .../src/components/ReImageVerify/src/hooks.ts | 48 +++ .../components/ReImageVerify/src/index.vue | 19 +- .../SearchForm/components/SearchFormItem.vue | 92 ++-- client/src/components/SearchForm/index.vue | 73 +++- client/src/components/SvgIcon/index.vue | 13 + .../src/components/elderListDialog/index.vue | 50 ++- client/src/components/my-card/my-card.vue | 10 + client/src/components/treeDialog/index.vue | 38 +- client/src/components/upload/image/index.vue | 77 +++- .../wen-test/DynamicAdditionComponent.vue | 19 +- client/src/mock/getters.ts | 15 +- client/src/mock/index.ts | 4 + client/src/mock/routes.ts | 87 +++- client/src/mock/users.ts | 7 + .../controller/CateringSetController.java | 172 +++++++- .../controller/ConsumeController.java | 42 +- .../controller/DepositRechargeController.java | 80 +++- .../controller/DishesController.java | 232 +++++++++- .../controller/OrderController.java | 173 +++++++- .../controller/RetreatAuditController.java | 75 +++- 51 files changed, 3692 insertions(+), 327 deletions(-) create mode 100644 client/src/components/ProTable/Grid/components/GridItem.vue create mode 100644 client/src/components/ProTable/Grid/index.vue create mode 100644 client/src/components/ProTable/Grid/interface/index.ts create mode 100644 client/src/components/ProTable/IconPark/index.vue create mode 100644 client/src/components/ProTable/ProTable/components/ColSetting.vue create mode 100644 client/src/components/ProTable/ProTable/components/Pagination.vue create mode 100644 client/src/components/ProTable/ProTable/components/TableColumn.vue create mode 100644 client/src/components/ProTable/ProTable/index.md create mode 100644 client/src/components/ProTable/ProTable/index.vue create mode 100644 client/src/components/ProTable/ProTable/interface/index.ts create mode 100644 client/src/components/ProTable/ReImageVerify/index.ts create mode 100644 client/src/components/ProTable/ReImageVerify/src/hooks.ts create mode 100644 client/src/components/ProTable/ReImageVerify/src/index.vue create mode 100644 client/src/components/ProTable/SearchForm/components/SearchFormItem.vue create mode 100644 client/src/components/ProTable/SearchForm/index.vue create mode 100644 client/src/components/ProTable/SvgIcon/index.vue create mode 100644 client/src/components/ProTable/elderListDialog/index.vue create mode 100644 client/src/components/ProTable/my-card/my-card.vue create mode 100644 client/src/components/ProTable/treeDialog/index.vue create mode 100644 client/src/components/ProTable/upload/image/index.vue create mode 100644 client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue diff --git a/client/src/components/Grid/components/GridItem.vue b/client/src/components/Grid/components/GridItem.vue index 6492076..7e5389e 100644 --- a/client/src/components/Grid/components/GridItem.vue +++ b/client/src/components/Grid/components/GridItem.vue @@ -1,23 +1,38 @@ + + + diff --git a/client/src/components/Grid/interface/index.ts b/client/src/components/Grid/interface/index.ts index b062bef..a3ff77d 100644 --- a/client/src/components/Grid/interface/index.ts +++ b/client/src/components/Grid/interface/index.ts @@ -1,6 +1,12 @@ -export type BreakPoint = 'xs' | 'sm' | 'md' | 'lg' | 'xl' +// 定义一个类型别名 BreakPoint,它的值只能是 'xs'、'sm'、'md'、'lg' 或 'xl' 中的一个, +// 通常用于表示响应式布局中的不同屏幕断点 +export type BreakPoint = 'xs' |'sm' |'md' | 'lg' | 'xl'; +// 定义一个类型别名 Responsive,它是一个对象类型,包含两个可选属性 span 和 offset。 +// span 用于表示在响应式布局中元素所占的列数,类型为 number 类型的可选值。 +// offset 用于表示在响应式布局中元素的偏移量,类型为 number 类型的可选值。 +// 这个类型通常用于描述在不同屏幕断点下元素的布局属性 export type Responsive = { - span?: number - offset?: number -} + span?: number; + offset?: number; +}; diff --git a/client/src/components/IconPark/index.vue b/client/src/components/IconPark/index.vue index 59e6480..9ca92a5 100644 --- a/client/src/components/IconPark/index.vue +++ b/client/src/components/IconPark/index.vue @@ -1,4 +1,12 @@ + + + + + + + + diff --git a/client/src/components/ProTable/Grid/components/GridItem.vue b/client/src/components/ProTable/Grid/components/GridItem.vue new file mode 100644 index 0000000..7e5389e --- /dev/null +++ b/client/src/components/ProTable/Grid/components/GridItem.vue @@ -0,0 +1,109 @@ + + + + + + + + + diff --git a/client/src/components/ProTable/Grid/index.vue b/client/src/components/ProTable/Grid/index.vue new file mode 100644 index 0000000..fa2858b --- /dev/null +++ b/client/src/components/ProTable/Grid/index.vue @@ -0,0 +1,207 @@ + + + + + + + + + diff --git a/client/src/components/ProTable/Grid/interface/index.ts b/client/src/components/ProTable/Grid/interface/index.ts new file mode 100644 index 0000000..a3ff77d --- /dev/null +++ b/client/src/components/ProTable/Grid/interface/index.ts @@ -0,0 +1,12 @@ +// 定义一个类型别名 BreakPoint,它的值只能是 'xs'、'sm'、'md'、'lg' 或 'xl' 中的一个, +// 通常用于表示响应式布局中的不同屏幕断点 +export type BreakPoint = 'xs' |'sm' |'md' | 'lg' | 'xl'; + +// 定义一个类型别名 Responsive,它是一个对象类型,包含两个可选属性 span 和 offset。 +// span 用于表示在响应式布局中元素所占的列数,类型为 number 类型的可选值。 +// offset 用于表示在响应式布局中元素的偏移量,类型为 number 类型的可选值。 +// 这个类型通常用于描述在不同屏幕断点下元素的布局属性 +export type Responsive = { + span?: number; + offset?: number; +}; diff --git a/client/src/components/ProTable/IconPark/index.vue b/client/src/components/ProTable/IconPark/index.vue new file mode 100644 index 0000000..9ca92a5 --- /dev/null +++ b/client/src/components/ProTable/IconPark/index.vue @@ -0,0 +1,45 @@ + + + + + + + + + + + + + diff --git a/client/src/components/ProTable/ProTable/components/ColSetting.vue b/client/src/components/ProTable/ProTable/components/ColSetting.vue new file mode 100644 index 0000000..12323c8 --- /dev/null +++ b/client/src/components/ProTable/ProTable/components/ColSetting.vue @@ -0,0 +1,88 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 暂无可配置列 + + + + + + + + + + diff --git a/client/src/components/ProTable/ProTable/components/Pagination.vue b/client/src/components/ProTable/ProTable/components/Pagination.vue new file mode 100644 index 0000000..7109b8f --- /dev/null +++ b/client/src/components/ProTable/ProTable/components/Pagination.vue @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + diff --git a/client/src/components/ProTable/ProTable/components/TableColumn.vue b/client/src/components/ProTable/ProTable/components/TableColumn.vue new file mode 100644 index 0000000..233dbf7 --- /dev/null +++ b/client/src/components/ProTable/ProTable/components/TableColumn.vue @@ -0,0 +1,103 @@ + + + + + + diff --git a/client/src/components/ProTable/ProTable/index.md b/client/src/components/ProTable/ProTable/index.md new file mode 100644 index 0000000..1a70ec4 --- /dev/null +++ b/client/src/components/ProTable/ProTable/index.md @@ -0,0 +1,87 @@ +## ProTable 文档 📚 + +### 1、ProTable 属性(ProTableProps): + +> 使用 `v-bind="$attrs"` 通过属性透传将 **ProTable** 组件属性全部透传到 **el-table** 上,所以我们支持 **el-table** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** + +| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | +| :----------: | :---------: | :------: | :-----------------------------------: | :--------------------------------------------------------------------------------------------------: | +| columns | ColumnProps | ✅ | — | ProTable 组件会根据此字段渲染搜索表单与表格列,详情见 ColumnProps | +| requestApi | Function | ✅ | — | 获取表格数据的请求 API | +| requestAuto | Boolean | ❌ | true | 表格初始化是否自动执行请求 API | +| dataCallback | Function | ❌ | — | 后台返回数据的回调函数,可对后台返回数据进行处理 | +| title | String | ❌ | — | 表格标题,目前只在打印的时候用到 | +| pagination | Boolean | ❌ | true | 是否显示分页组件:pagination 为 false 后台返回数据应该没有分页信息 和 list 字段,data 就是 list 数据 | +| initParam | Object | ❌ | {} | 表格请求的初始化参数,该值变化会自动请求表格数据 | +| toolButton | Boolean | ❌ | true | 是否显示表格功能按钮 | +| rowKey | String | ❌ | 'id' | 当表格数据多选时,所指定的 id | +| searchCol | Object | ❌ | { xs: 1, sm: 2, md: 2, lg: 3, xl: 4 } | 表格搜索项每列占比配置 | + +### 2、Column 配置(ColumnProps): + +> 使用 `v-bind="column"` 通过属性透传将每一项 **column** 属性全部透传到 **el-table-column** 上,所以我们支持 **el-table-column** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** + +| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | +| :----------: | :----------------: | :------: | :----: | :---------------------------------------------------------------------------------------------: | +| tag | Boolean | ❌ | false | 当前单元格值是否为标签展示,可通过 enum 数据中 tagType 字段指定 tag 类型 | +| isShow | Boolean | ❌ | true | 当前列是否显示在表格内(只对 prop 列生效) | +| search | SearchProps | ❌ | — | 搜索项配置,详情见 SearchProps | +| enum | Object \| Function | ❌ | — | 字典,可格式化单元格内容,还可以作为搜索框的下拉选项(字典可以为 API 请求函数,内部会自动执行) | +| isFilterEnum | Boolean | ❌ | true | 当前单元格值是否根据 enum 格式化(例如 enum 只作为搜索项数据,不参与内容格式化) | +| fieldNames | Object | ❌ | — | 指定字典 label && value 的 key 值 | +| headerRender | Function | ❌ | — | 自定义表头内容渲染(tsx 语法、h 语法) | +| render | Function | ❌ | — | 自定义单元格内容渲染(tsx 语法、h 语法) | +| \_children | ColumnProps | ❌ | — | 多级表头 | + +### 3、搜索项 配置(SearchProps): + +> 使用 `v-bind="column.search.props“` 通过属性透传将 **search.props** 属性全部透传到每一项搜索组件上,所以我们支持 **input、select、tree-select、date-packer、time-picker、time-select、switch** 大部分属性,并在其基础上还扩展了以下 **Props:** + +| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | +| :----------: | :----: | :------: | :----: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| el | String | ✅ | — | 当前项搜索框的类型,支持:input、input-number、select、select-v2、tree-select、cascader、date-packer、time-picker、time-select、switch、slider | +| props | Object | ❌ | — | 根据 element plus 官方文档来传递,该属性所有值会透传到组件 | +| defaultValue | Any | ❌ | — | 搜索项默认值 | +| key | String | ❌ | — | 当搜索项 key 不为 prop 属性时,可通过 key 指定 | +| order | Number | ❌ | — | 搜索项排序(从小到大) | +| span | Number | ❌ | 1 | 搜索项所占用的列数,默认为 1 列 | +| offset | Number | ❌ | — | 搜索字段左侧偏移列数 | + +### 4、ProTable 事件: + +> 根据 **ElementPlus Table** 文档在 **ProTable** 组件上绑定事件即可,组件会通过 **$attrs** 透传给 **el-table**。 +> +> [el-table 事件文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E4%BA%8B%E4%BB%B6) + +### 5、ProTable 方法: + +> **ProTable** 组件暴露了 **el-table** 实例和一些组件内部的参数和方法: +> +> [el-table 方法文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E6%96%B9%E6%B3%95) + +| 方法名 | 描述 | +| :-------------: | :-------------------------------------------------------------------: | +| element | `el-table` 实例,可以通过`element.方法名`来调用 `el-table` 的所有方法 | +| tableData | 当前页面所展示的数据 | +| searchParam | 所有的搜索参数,不包含分页 | +| pageable | 当前表格的分页数据 | +| getTableList | 获取、刷新表格数据的方法(携带所有参数) | +| reset | 重置表格查询参数,相当于点击重置搜索按钮 | +| clearSelection | 清空表格所选择的数据,除此方法之外还可使用 `element.clearSelection()` | +| enumMap | 当前表格使用的所有字典数据(Map 数据结构) | +| isSelected | 表格是否选中数据 | +| selectedList | 表格选中的数据列表 | +| selectedListIds | 表格选中的数据列表的 id | + +### 6、ProTable 插槽: + +| 插槽名 | 描述 | +| :----------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | +| — | 默认插槽,支持直接在 ProTable 中写 el-table-column 标签 | +| tableHeader | 自定义表格头部左侧区域的插槽,一般情况该区域放操作按钮 | +| toolButton | 自定义表格头部左右侧侧功能区域的插槽 | +| append | 插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。 | +| empty | 当表格数据为空时自定义的内容 | +| pagination | 分页组件插槽 | +| `column.prop` | 单元格的作用域插槽 | +| `column.prop` + "Header" | 表头的作用域插槽 | diff --git a/client/src/components/ProTable/ProTable/index.vue b/client/src/components/ProTable/ProTable/index.vue new file mode 100644 index 0000000..912cb40 --- /dev/null +++ b/client/src/components/ProTable/ProTable/index.vue @@ -0,0 +1,397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 暂无数据 + + + + + + + + + + + + + + + + + + + + + diff --git a/client/src/components/ProTable/ProTable/interface/index.ts b/client/src/components/ProTable/ProTable/interface/index.ts new file mode 100644 index 0000000..8d9e597 --- /dev/null +++ b/client/src/components/ProTable/ProTable/interface/index.ts @@ -0,0 +1,84 @@ +// 从 "element-plus/es/components/table/src/table-column/defaults" 导入 TableColumnCtx 类型 +// TableColumnCtx 可能是 Element Plus 中表格列的上下文类型,包含了表格列的一些默认属性和方法 +import { TableColumnCtx } from "element-plus/es/components/table/src/table-column/defaults"; +// 从 "@/components/Grid/interface" 导入 BreakPoint 和 Responsive 类型 +// BreakPoint 可能表示响应式布局中的不同断点(如 xs, sm, md, lg, xl 等) +// Responsive 可能用于描述在不同断点下的响应式配置 +import { BreakPoint, Responsive } from "@/components/Grid/interface"; + +// 定义一个接口 EnumProps,用于描述枚举属性 +export interface EnumProps { + // 选项框显示的文字,类型为字符串 + label: string; + // 选项框值,可以是任意类型 + value: any; + // 是否禁用此选项,可选,默认为 undefined,类型为布尔值 + disabled?: boolean; + // 当 tag 为 true 时,此选择会指定 tag 显示类型,可选,默认为 undefined,类型为字符串 + tagType?: string; + // 为树形选择时,可以通过 children 属性指定子选项,可选,默认为 undefined,类型为 EnumProps 数组 + children?: EnumProps[]; + // 允许添加任意其他属性,属性名和值的类型都为任意类型 + [key: string]: any; +} + +// 定义一个类型别名 TypeProp,其值只能是 "index"、"selection" 或 "expand" 中的一个 +export type TypeProp = "index" | "selection" | "expand"; + +// 定义一个类型别名 SearchType,用于表示搜索框的类型 +// 可以是 "input"、"input-number" 等多种 Element Plus 组件类型 +export type SearchType = + | "input" + | "input-number" + | "select" + | "select-v2" + | "tree-select" + | "cascader" + | "date-picker" + | "time-picker" + | "time-select" + | "switch" + | "slider"; + +// 定义一个接口 SearchProps,用于描述搜索项的属性 +export type SearchProps = { + // 当前项搜索框的类型,类型为 SearchType + el: SearchType; + // 搜索项参数,根据 element plus 官方文档来传递,该属性所有值会透传到组件,可选,默认为 undefined + props?: any; + // 当搜索项 key 不为 prop 属性时,可通过 key 指定,可选,默认为 undefined,类型为字符串 + key?: string; + // 搜索项排序(从大到小),可选,默认为 undefined,类型为数字 + order?: number; + // 搜索项所占用的列数,默认为 1 列,可选,默认为 undefined,类型为数字 + span?: number; + // 搜索字段左侧偏移列数,可选,默认为 undefined,类型为数字 + offset?: number; + // 搜索项默认值,可以是字符串、数字、布尔值或任意类型的数组,可选,默认为 undefined + defaultValue?: string | number | boolean | any[]; + // 扩展为包含 BreakPoint 类型的键和 Responsive 类型的值的部分记录,用于实现响应式配置 +} & Partial>; + +// 定义一个接口 ColumnProps,用于描述表格列的属性 +// 扩展自 Partial, "children" | "renderHeader" | "renderCell">>,表示部分继承 TableColumnCtx 类型并去除 "children"、"renderHeader" 和 "renderCell" 属性 +export interface ColumnProps + extends Partial, "children" | "renderHeader" | "renderCell">> { + // 是否是标签展示,可选,默认为 undefined,类型为布尔值 + tag?: boolean; + // 是否显示在表格当中,可选,默认为 undefined,类型为布尔值 + isShow?: boolean; + // 搜索项配置,可选,默认为 undefined,类型为 SearchProps 或 undefined + search?: SearchProps | undefined; + // 枚举类型(渲染值的字典),可以是 EnumProps 数组或一个返回 Promise 的函数,可选,默认为 undefined + enum?: EnumProps[] | ((params?: any) => Promise); + // 当前单元格值是否根据 enum 格式化(示例:enum 只作为搜索项数据),可选,默认为 undefined,类型为布尔值 + isFilterEnum?: boolean; + // 指定 label && value 的 key 值,可选,默认为 undefined,类型为包含 label 和 value 键的对象 + fieldNames?: { label: string; value: string }; + // 自定义表头内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受 ColumnProps 类型参数并返回任意类型的函数 + headerRender?: (row: ColumnProps) => any; + // 自定义单元格内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受包含 row 属性且类型为 T 的对象并返回任意类型的函数 + render?: (scope: { row: T }) => any; + // 多级表头,可选,默认为 undefined,类型为 ColumnProps 数组 + _children?: ColumnProps[]; +} diff --git a/client/src/components/ProTable/ReImageVerify/index.ts b/client/src/components/ProTable/ReImageVerify/index.ts new file mode 100644 index 0000000..6b4eca3 --- /dev/null +++ b/client/src/components/ProTable/ReImageVerify/index.ts @@ -0,0 +1,12 @@ +// 从当前目录下的 src 文件夹中的 index.vue 文件导入组件 +// 这里将导入的组件命名为 reImageVerify,它应该是一个 Vue 组件 +import reImageVerify from './src/index.vue' + +/** 图形验证码组件 */ +// 使用具名导出的方式,将导入的组件以 ReImageVerify 这个名称导出 +// 具名导出允许在导入时指定具体要导入的内容,方便在其他文件中使用 +export const ReImageVerify = reImageVerify + +// 使用默认导出的方式,将导入的组件作为默认导出 +// 默认导出允许在导入时可以使用任意名称来接收该组件,通常一个文件只能有一个默认导出 +export default ReImageVerify diff --git a/client/src/components/ProTable/ReImageVerify/src/hooks.ts b/client/src/components/ProTable/ReImageVerify/src/hooks.ts new file mode 100644 index 0000000..898eb05 --- /dev/null +++ b/client/src/components/ProTable/ReImageVerify/src/hooks.ts @@ -0,0 +1,133 @@ +import { ref, onMounted } from 'vue' + +/** + * 绘制图形验证码 + * @param width - 图形宽度 + * @param height - 图形高度 + */ +// 定义一个名为 useImageVerify 的函数,用于生成和管理图形验证码,接受图形宽度和高度作为参数,有默认值 +export const useImageVerify = (width = 120, height = 40) => { + // 创建一个响应式引用 domRef,用于存储 元素的引用 + const domRef = ref() + // 创建一个响应式变量 imgCode,用于存储生成的图形验证码字符串 + const imgCode = ref('') + + // 定义一个函数 setImgCode,用于设置 imgCode 的值 + function setImgCode(code: string) { + imgCode.value = code + } + + // 定义一个函数 getImgCode,用于在 上绘制验证码并获取生成的验证码字符串 + function getImgCode() { + // 如果 domRef 没有值(即 元素未挂载),则直接返回 + if (!domRef.value) return + // 调用 draw 函数绘制验证码,并将返回的验证码字符串赋值给 imgCode + imgCode.value = draw(domRef.value, width, height) + } + + // 在组件挂载后执行的钩子函数,调用 getImgCode 函数生成验证码 + onMounted(() => { + getImgCode() + }) + + // 返回一个包含 domRef、imgCode、setImgCode 和 getImgCode 的对象,以便在其他地方使用这些变量和函数 + return { + domRef, + imgCode, + setImgCode, + getImgCode + } +} + +// 定义一个函数 randomNum,用于生成指定范围内的随机整数 +function randomNum(min: number, max: number) { + // 使用 Math.random() 生成一个 0 到 1 之间的随机小数,然后通过计算得到指定范围内的整数 + const num = Math.floor(Math.random() * (max - min) + min) + return num +} + +// 定义一个函数 randomColor,用于生成指定范围内的随机颜色(RGB 格式) +function randomColor(min: number, max: number) { + // 分别生成随机的红(r)、绿(g)、蓝(b)分量值 + const r = randomNum(min, max) + const g = randomNum(min, max) + const b = randomNum(min, max) + // 返回 RGB 格式的颜色字符串 + return `rgb(${r},${g},${b})` +} + +// 定义一个函数 draw,用于在 元素上绘制图形验证码 +function draw(dom: HTMLCanvasElement, width: number, height: number) { + // 初始化一个空字符串 imgCode,用于存储生成的验证码 + let imgCode = '' + + // 定义一个字符串 NUMBER_STRING,包含数字 0 到 9,用于生成验证码字符 + const NUMBER_STRING = '0123456789' + + // 获取 元素的 2D 绘图上下文 ctx + const ctx = dom.getContext('2d') + // 如果获取上下文失败(ctx 为 null),则直接返回空的验证码字符串 + if (!ctx) return imgCode + + // 设置绘图上下文的填充样式为随机颜色(背景色) + ctx.fillStyle = randomColor(180, 230) + // 使用填充样式绘制一个矩形,覆盖整个 区域,作为验证码的背景 + ctx.fillRect(0, 0, width, height) + // 循环 4 次,生成 4 个验证码字符 + for (let i = 0; i < 4; i += 1) { + // 从 NUMBER_STRING 中随机选取一个字符作为验证码字符 + const text = NUMBER_STRING[randomNum(0, NUMBER_STRING.length)] + // 将选取的字符添加到 imgCode 字符串中 + imgCode += text + // 随机生成字体大小 + const fontSize = randomNum(18, 41) + // 随机生成字符的旋转角度 + const deg = randomNum(-30, 30) + // 设置绘图上下文的字体样式 + ctx.font = `${fontSize}px Simhei` + // 设置文本基线为顶部 + ctx.textBaseline = 'top' + // 设置绘图上下文的填充样式为随机颜色(字符颜色) + ctx.fillStyle = randomColor(80, 150) + // 保存当前绘图上下文的状态 + ctx.save() + // 平移绘图上下文的原点到指定位置(每个字符的起始位置) + ctx.translate(30 * i + 15, 15) + // 旋转绘图上下文指定的角度 + ctx.rotate((deg * Math.PI) / 180) + // 在指定位置绘制字符 + ctx.fillText(text, -15 + 5, -15) + // 恢复之前保存的绘图上下文状态 + ctx.restore() + } + // 循环 5 次,绘制 5 条随机直线 + for (let i = 0; i < 5; i += 1) { + // 开始绘制路径 + ctx.beginPath() + // 设置路径的起始点为随机位置 + ctx.moveTo(randomNum(0, width), randomNum(0, height)) + // 设置路径的终点为随机位置 + ctx.lineTo(randomNum(0, width), randomNum(0, height)) + // 设置绘图上下文的描边样式为随机颜色 + ctx.strokeStyle = randomColor(180, 230) + // 关闭路径 + ctx.closePath() + // 绘制路径(直线) + ctx.stroke() + } + // 循环 41 次,绘制 41 个随机圆形 + for (let i = 0; i < 41; i += 1) { + // 开始绘制路径 + ctx.beginPath() + // 绘制一个圆形,圆心为随机位置,半径为 1 + ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI) + // 关闭路径 + ctx.closePath() + // 设置绘图上下文的填充样式为随机颜色 + ctx.fillStyle = randomColor(150, 200) + // 填充圆形 + ctx.fill() + } + // 返回生成的验证码字符串 + return imgCode +} diff --git a/client/src/components/ProTable/ReImageVerify/src/index.vue b/client/src/components/ProTable/ReImageVerify/src/index.vue new file mode 100644 index 0000000..b8548ec --- /dev/null +++ b/client/src/components/ProTable/ReImageVerify/src/index.vue @@ -0,0 +1,55 @@ + + + + + + diff --git a/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue b/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue new file mode 100644 index 0000000..7e966ba --- /dev/null +++ b/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue @@ -0,0 +1,117 @@ + + + + :is="`el-${column.search.el}`" + v-bind="handleSearchProps" + v-model.trim="searchParam[column.search.key?? handleProp(column.prop!)]" + :data="column.search?.el === 'tree-select'? columnEnum : []" + :options=" + ['cascader','select-v2'].includes(column.search?.el)? columnEnum : [] + " + :placeholder="placeholder" + :clearable="clearable" + range-separator="至" + start-placeholder="开始时间" + end-placeholder="结束时间" + > + + + {{ data[fieldNames.label] }} + + + + + v-for="(col, index) in columnEnum" + :key="index" + :label="col[fieldNames.label]" + :value="col[fieldNames.value]" + > + + + + + + + diff --git a/client/src/components/ProTable/SearchForm/index.vue b/client/src/components/ProTable/SearchForm/index.vue new file mode 100644 index 0000000..e587851 --- /dev/null +++ b/client/src/components/ProTable/SearchForm/index.vue @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + 搜索 + + + 重置 + + + {{ collapsed? '展开' : '合并' }} + + + + + + + + + + + + + diff --git a/client/src/components/ProTable/SvgIcon/index.vue b/client/src/components/ProTable/SvgIcon/index.vue new file mode 100644 index 0000000..e25234e --- /dev/null +++ b/client/src/components/ProTable/SvgIcon/index.vue @@ -0,0 +1,49 @@ + + + + + + + + + + + diff --git a/client/src/components/ProTable/components/ColSetting.vue b/client/src/components/ProTable/components/ColSetting.vue index 9099cba..12323c8 100644 --- a/client/src/components/ProTable/components/ColSetting.vue +++ b/client/src/components/ProTable/components/ColSetting.vue @@ -1,7 +1,18 @@ - + + + + + + + + + + + + + + + + + + + + + + + 暂无可配置列 @@ -37,23 +59,29 @@ diff --git a/client/src/components/ProTable/index.vue b/client/src/components/ProTable/index.vue index b1935ad..912cb40 100644 --- a/client/src/components/ProTable/index.vue +++ b/client/src/components/ProTable/index.vue @@ -2,6 +2,14 @@ + + + + + + + + - + + + + + + + + + + + + + + + - + - + + + - + + @@ -100,9 +124,10 @@ - + + - + + + + + + + diff --git a/client/src/components/ProTable/treeDialog/index.vue b/client/src/components/ProTable/treeDialog/index.vue new file mode 100644 index 0000000..c4d327e --- /dev/null +++ b/client/src/components/ProTable/treeDialog/index.vue @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/src/components/ProTable/upload/image/index.vue b/client/src/components/ProTable/upload/image/index.vue new file mode 100644 index 0000000..e739333 --- /dev/null +++ b/client/src/components/ProTable/upload/image/index.vue @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue b/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue new file mode 100644 index 0000000..c13ef16 --- /dev/null +++ b/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue @@ -0,0 +1,47 @@ + + + + 添加组件 + + + + + + + + + + + diff --git a/client/src/components/ReImageVerify/index.ts b/client/src/components/ReImageVerify/index.ts index c5a9f19..6b4eca3 100644 --- a/client/src/components/ReImageVerify/index.ts +++ b/client/src/components/ReImageVerify/index.ts @@ -1,6 +1,12 @@ +// 从当前目录下的 src 文件夹中的 index.vue 文件导入组件 +// 这里将导入的组件命名为 reImageVerify,它应该是一个 Vue 组件 import reImageVerify from './src/index.vue' /** 图形验证码组件 */ +// 使用具名导出的方式,将导入的组件以 ReImageVerify 这个名称导出 +// 具名导出允许在导入时指定具体要导入的内容,方便在其他文件中使用 export const ReImageVerify = reImageVerify +// 使用默认导出的方式,将导入的组件作为默认导出 +// 默认导出允许在导入时可以使用任意名称来接收该组件,通常一个文件只能有一个默认导出 export default ReImageVerify diff --git a/client/src/components/ReImageVerify/src/hooks.ts b/client/src/components/ReImageVerify/src/hooks.ts index c10d7d1..898eb05 100644 --- a/client/src/components/ReImageVerify/src/hooks.ts +++ b/client/src/components/ReImageVerify/src/hooks.ts @@ -5,23 +5,32 @@ import { ref, onMounted } from 'vue' * @param width - 图形宽度 * @param height - 图形高度 */ +// 定义一个名为 useImageVerify 的函数,用于生成和管理图形验证码,接受图形宽度和高度作为参数,有默认值 export const useImageVerify = (width = 120, height = 40) => { + // 创建一个响应式引用 domRef,用于存储 元素的引用 const domRef = ref() + // 创建一个响应式变量 imgCode,用于存储生成的图形验证码字符串 const imgCode = ref('') + // 定义一个函数 setImgCode,用于设置 imgCode 的值 function setImgCode(code: string) { imgCode.value = code } + // 定义一个函数 getImgCode,用于在 上绘制验证码并获取生成的验证码字符串 function getImgCode() { + // 如果 domRef 没有值(即 元素未挂载),则直接返回 if (!domRef.value) return + // 调用 draw 函数绘制验证码,并将返回的验证码字符串赋值给 imgCode imgCode.value = draw(domRef.value, width, height) } + // 在组件挂载后执行的钩子函数,调用 getImgCode 函数生成验证码 onMounted(() => { getImgCode() }) + // 返回一个包含 domRef、imgCode、setImgCode 和 getImgCode 的对象,以便在其他地方使用这些变量和函数 return { domRef, imgCode, @@ -30,56 +39,95 @@ export const useImageVerify = (width = 120, height = 40) => { } } +// 定义一个函数 randomNum,用于生成指定范围内的随机整数 function randomNum(min: number, max: number) { + // 使用 Math.random() 生成一个 0 到 1 之间的随机小数,然后通过计算得到指定范围内的整数 const num = Math.floor(Math.random() * (max - min) + min) return num } +// 定义一个函数 randomColor,用于生成指定范围内的随机颜色(RGB 格式) function randomColor(min: number, max: number) { + // 分别生成随机的红(r)、绿(g)、蓝(b)分量值 const r = randomNum(min, max) const g = randomNum(min, max) const b = randomNum(min, max) + // 返回 RGB 格式的颜色字符串 return `rgb(${r},${g},${b})` } +// 定义一个函数 draw,用于在 元素上绘制图形验证码 function draw(dom: HTMLCanvasElement, width: number, height: number) { + // 初始化一个空字符串 imgCode,用于存储生成的验证码 let imgCode = '' + // 定义一个字符串 NUMBER_STRING,包含数字 0 到 9,用于生成验证码字符 const NUMBER_STRING = '0123456789' + // 获取 元素的 2D 绘图上下文 ctx const ctx = dom.getContext('2d') + // 如果获取上下文失败(ctx 为 null),则直接返回空的验证码字符串 if (!ctx) return imgCode + // 设置绘图上下文的填充样式为随机颜色(背景色) ctx.fillStyle = randomColor(180, 230) + // 使用填充样式绘制一个矩形,覆盖整个 区域,作为验证码的背景 ctx.fillRect(0, 0, width, height) + // 循环 4 次,生成 4 个验证码字符 for (let i = 0; i < 4; i += 1) { + // 从 NUMBER_STRING 中随机选取一个字符作为验证码字符 const text = NUMBER_STRING[randomNum(0, NUMBER_STRING.length)] + // 将选取的字符添加到 imgCode 字符串中 imgCode += text + // 随机生成字体大小 const fontSize = randomNum(18, 41) + // 随机生成字符的旋转角度 const deg = randomNum(-30, 30) + // 设置绘图上下文的字体样式 ctx.font = `${fontSize}px Simhei` + // 设置文本基线为顶部 ctx.textBaseline = 'top' + // 设置绘图上下文的填充样式为随机颜色(字符颜色) ctx.fillStyle = randomColor(80, 150) + // 保存当前绘图上下文的状态 ctx.save() + // 平移绘图上下文的原点到指定位置(每个字符的起始位置) ctx.translate(30 * i + 15, 15) + // 旋转绘图上下文指定的角度 ctx.rotate((deg * Math.PI) / 180) + // 在指定位置绘制字符 ctx.fillText(text, -15 + 5, -15) + // 恢复之前保存的绘图上下文状态 ctx.restore() } + // 循环 5 次,绘制 5 条随机直线 for (let i = 0; i < 5; i += 1) { + // 开始绘制路径 ctx.beginPath() + // 设置路径的起始点为随机位置 ctx.moveTo(randomNum(0, width), randomNum(0, height)) + // 设置路径的终点为随机位置 ctx.lineTo(randomNum(0, width), randomNum(0, height)) + // 设置绘图上下文的描边样式为随机颜色 ctx.strokeStyle = randomColor(180, 230) + // 关闭路径 ctx.closePath() + // 绘制路径(直线) ctx.stroke() } + // 循环 41 次,绘制 41 个随机圆形 for (let i = 0; i < 41; i += 1) { + // 开始绘制路径 ctx.beginPath() + // 绘制一个圆形,圆心为随机位置,半径为 1 ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI) + // 关闭路径 ctx.closePath() + // 设置绘图上下文的填充样式为随机颜色 ctx.fillStyle = randomColor(150, 200) + // 填充圆形 ctx.fill() } + // 返回生成的验证码字符串 return imgCode } diff --git a/client/src/components/ReImageVerify/src/index.vue b/client/src/components/ReImageVerify/src/index.vue index 7d6dd6c..b8548ec 100644 --- a/client/src/components/ReImageVerify/src/index.vue +++ b/client/src/components/ReImageVerify/src/index.vue @@ -1,37 +1,50 @@ + + + :is="`el-${column.search.el}`" + v-bind="handleSearchProps" + v-model.trim="searchParam[column.search.key?? handleProp(column.prop!)]" + :data="column.search?.el === 'tree-select'? columnEnum : []" + :options=" + ['cascader','select-v2'].includes(column.search?.el)? columnEnum : [] + " + :placeholder="placeholder" + :clearable="clearable" + range-separator="至" + start-placeholder="开始时间" + end-placeholder="结束时间" > - - {{ data[fieldNames.label] }} - - - - - + + + {{ data[fieldNames.label] }} + + + + + v-for="(col, index) in columnEnum" + :key="index" + :label="col[fieldNames.label]" + :value="col[fieldNames.value]" + > + + + diff --git a/client/src/components/SearchForm/index.vue b/client/src/components/SearchForm/index.vue index 37f50f6..e587851 100644 --- a/client/src/components/SearchForm/index.vue +++ b/client/src/components/SearchForm/index.vue @@ -1,25 +1,34 @@ - + + + + + + + + + + + 搜索 + 重置 + - {{ collapsed ? '展开' : '合并' }} + {{ collapsed? '展开' : '合并' }} - + - + + + + diff --git a/client/src/components/elderListDialog/index.vue b/client/src/components/elderListDialog/index.vue index d5a8ee0..172f22c 100644 --- a/client/src/components/elderListDialog/index.vue +++ b/client/src/components/elderListDialog/index.vue @@ -1,26 +1,47 @@ + + + + + + + + + + + - + + + + + + - 选择 + + + + + + 选择 @@ -30,27 +51,36 @@ diff --git a/client/src/layout/components/ProTable/components/Pagination.vue b/client/src/layout/components/ProTable/components/Pagination.vue new file mode 100644 index 0000000..7109b8f --- /dev/null +++ b/client/src/layout/components/ProTable/components/Pagination.vue @@ -0,0 +1,47 @@ + + + + + + + + + + + + + + + diff --git a/client/src/layout/components/ProTable/components/TableColumn.vue b/client/src/layout/components/ProTable/components/TableColumn.vue new file mode 100644 index 0000000..233dbf7 --- /dev/null +++ b/client/src/layout/components/ProTable/components/TableColumn.vue @@ -0,0 +1,103 @@ + + + + + + diff --git a/client/src/layout/components/ProTable/index.md b/client/src/layout/components/ProTable/index.md new file mode 100644 index 0000000..1a70ec4 --- /dev/null +++ b/client/src/layout/components/ProTable/index.md @@ -0,0 +1,87 @@ +## ProTable 文档 📚 + +### 1、ProTable 属性(ProTableProps): + +> 使用 `v-bind="$attrs"` 通过属性透传将 **ProTable** 组件属性全部透传到 **el-table** 上,所以我们支持 **el-table** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** + +| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | +| :----------: | :---------: | :------: | :-----------------------------------: | :--------------------------------------------------------------------------------------------------: | +| columns | ColumnProps | ✅ | — | ProTable 组件会根据此字段渲染搜索表单与表格列,详情见 ColumnProps | +| requestApi | Function | ✅ | — | 获取表格数据的请求 API | +| requestAuto | Boolean | ❌ | true | 表格初始化是否自动执行请求 API | +| dataCallback | Function | ❌ | — | 后台返回数据的回调函数,可对后台返回数据进行处理 | +| title | String | ❌ | — | 表格标题,目前只在打印的时候用到 | +| pagination | Boolean | ❌ | true | 是否显示分页组件:pagination 为 false 后台返回数据应该没有分页信息 和 list 字段,data 就是 list 数据 | +| initParam | Object | ❌ | {} | 表格请求的初始化参数,该值变化会自动请求表格数据 | +| toolButton | Boolean | ❌ | true | 是否显示表格功能按钮 | +| rowKey | String | ❌ | 'id' | 当表格数据多选时,所指定的 id | +| searchCol | Object | ❌ | { xs: 1, sm: 2, md: 2, lg: 3, xl: 4 } | 表格搜索项每列占比配置 | + +### 2、Column 配置(ColumnProps): + +> 使用 `v-bind="column"` 通过属性透传将每一项 **column** 属性全部透传到 **el-table-column** 上,所以我们支持 **el-table-column** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** + +| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | +| :----------: | :----------------: | :------: | :----: | :---------------------------------------------------------------------------------------------: | +| tag | Boolean | ❌ | false | 当前单元格值是否为标签展示,可通过 enum 数据中 tagType 字段指定 tag 类型 | +| isShow | Boolean | ❌ | true | 当前列是否显示在表格内(只对 prop 列生效) | +| search | SearchProps | ❌ | — | 搜索项配置,详情见 SearchProps | +| enum | Object \| Function | ❌ | — | 字典,可格式化单元格内容,还可以作为搜索框的下拉选项(字典可以为 API 请求函数,内部会自动执行) | +| isFilterEnum | Boolean | ❌ | true | 当前单元格值是否根据 enum 格式化(例如 enum 只作为搜索项数据,不参与内容格式化) | +| fieldNames | Object | ❌ | — | 指定字典 label && value 的 key 值 | +| headerRender | Function | ❌ | — | 自定义表头内容渲染(tsx 语法、h 语法) | +| render | Function | ❌ | — | 自定义单元格内容渲染(tsx 语法、h 语法) | +| \_children | ColumnProps | ❌ | — | 多级表头 | + +### 3、搜索项 配置(SearchProps): + +> 使用 `v-bind="column.search.props“` 通过属性透传将 **search.props** 属性全部透传到每一项搜索组件上,所以我们支持 **input、select、tree-select、date-packer、time-picker、time-select、switch** 大部分属性,并在其基础上还扩展了以下 **Props:** + +| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | +| :----------: | :----: | :------: | :----: | :--------------------------------------------------------------------------------------------------------------------------------------------: | +| el | String | ✅ | — | 当前项搜索框的类型,支持:input、input-number、select、select-v2、tree-select、cascader、date-packer、time-picker、time-select、switch、slider | +| props | Object | ❌ | — | 根据 element plus 官方文档来传递,该属性所有值会透传到组件 | +| defaultValue | Any | ❌ | — | 搜索项默认值 | +| key | String | ❌ | — | 当搜索项 key 不为 prop 属性时,可通过 key 指定 | +| order | Number | ❌ | — | 搜索项排序(从小到大) | +| span | Number | ❌ | 1 | 搜索项所占用的列数,默认为 1 列 | +| offset | Number | ❌ | — | 搜索字段左侧偏移列数 | + +### 4、ProTable 事件: + +> 根据 **ElementPlus Table** 文档在 **ProTable** 组件上绑定事件即可,组件会通过 **$attrs** 透传给 **el-table**。 +> +> [el-table 事件文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E4%BA%8B%E4%BB%B6) + +### 5、ProTable 方法: + +> **ProTable** 组件暴露了 **el-table** 实例和一些组件内部的参数和方法: +> +> [el-table 方法文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E6%96%B9%E6%B3%95) + +| 方法名 | 描述 | +| :-------------: | :-------------------------------------------------------------------: | +| element | `el-table` 实例,可以通过`element.方法名`来调用 `el-table` 的所有方法 | +| tableData | 当前页面所展示的数据 | +| searchParam | 所有的搜索参数,不包含分页 | +| pageable | 当前表格的分页数据 | +| getTableList | 获取、刷新表格数据的方法(携带所有参数) | +| reset | 重置表格查询参数,相当于点击重置搜索按钮 | +| clearSelection | 清空表格所选择的数据,除此方法之外还可使用 `element.clearSelection()` | +| enumMap | 当前表格使用的所有字典数据(Map 数据结构) | +| isSelected | 表格是否选中数据 | +| selectedList | 表格选中的数据列表 | +| selectedListIds | 表格选中的数据列表的 id | + +### 6、ProTable 插槽: + +| 插槽名 | 描述 | +| :----------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | +| — | 默认插槽,支持直接在 ProTable 中写 el-table-column 标签 | +| tableHeader | 自定义表格头部左侧区域的插槽,一般情况该区域放操作按钮 | +| toolButton | 自定义表格头部左右侧侧功能区域的插槽 | +| append | 插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。 | +| empty | 当表格数据为空时自定义的内容 | +| pagination | 分页组件插槽 | +| `column.prop` | 单元格的作用域插槽 | +| `column.prop` + "Header" | 表头的作用域插槽 | diff --git a/client/src/layout/components/ProTable/index.vue b/client/src/layout/components/ProTable/index.vue new file mode 100644 index 0000000..912cb40 --- /dev/null +++ b/client/src/layout/components/ProTable/index.vue @@ -0,0 +1,397 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 暂无数据 + + + + + + + + + + + + + + + + + + + + + diff --git a/client/src/layout/components/ProTable/interface/index.ts b/client/src/layout/components/ProTable/interface/index.ts new file mode 100644 index 0000000..8d9e597 --- /dev/null +++ b/client/src/layout/components/ProTable/interface/index.ts @@ -0,0 +1,84 @@ +// 从 "element-plus/es/components/table/src/table-column/defaults" 导入 TableColumnCtx 类型 +// TableColumnCtx 可能是 Element Plus 中表格列的上下文类型,包含了表格列的一些默认属性和方法 +import { TableColumnCtx } from "element-plus/es/components/table/src/table-column/defaults"; +// 从 "@/components/Grid/interface" 导入 BreakPoint 和 Responsive 类型 +// BreakPoint 可能表示响应式布局中的不同断点(如 xs, sm, md, lg, xl 等) +// Responsive 可能用于描述在不同断点下的响应式配置 +import { BreakPoint, Responsive } from "@/components/Grid/interface"; + +// 定义一个接口 EnumProps,用于描述枚举属性 +export interface EnumProps { + // 选项框显示的文字,类型为字符串 + label: string; + // 选项框值,可以是任意类型 + value: any; + // 是否禁用此选项,可选,默认为 undefined,类型为布尔值 + disabled?: boolean; + // 当 tag 为 true 时,此选择会指定 tag 显示类型,可选,默认为 undefined,类型为字符串 + tagType?: string; + // 为树形选择时,可以通过 children 属性指定子选项,可选,默认为 undefined,类型为 EnumProps 数组 + children?: EnumProps[]; + // 允许添加任意其他属性,属性名和值的类型都为任意类型 + [key: string]: any; +} + +// 定义一个类型别名 TypeProp,其值只能是 "index"、"selection" 或 "expand" 中的一个 +export type TypeProp = "index" | "selection" | "expand"; + +// 定义一个类型别名 SearchType,用于表示搜索框的类型 +// 可以是 "input"、"input-number" 等多种 Element Plus 组件类型 +export type SearchType = + | "input" + | "input-number" + | "select" + | "select-v2" + | "tree-select" + | "cascader" + | "date-picker" + | "time-picker" + | "time-select" + | "switch" + | "slider"; + +// 定义一个接口 SearchProps,用于描述搜索项的属性 +export type SearchProps = { + // 当前项搜索框的类型,类型为 SearchType + el: SearchType; + // 搜索项参数,根据 element plus 官方文档来传递,该属性所有值会透传到组件,可选,默认为 undefined + props?: any; + // 当搜索项 key 不为 prop 属性时,可通过 key 指定,可选,默认为 undefined,类型为字符串 + key?: string; + // 搜索项排序(从大到小),可选,默认为 undefined,类型为数字 + order?: number; + // 搜索项所占用的列数,默认为 1 列,可选,默认为 undefined,类型为数字 + span?: number; + // 搜索字段左侧偏移列数,可选,默认为 undefined,类型为数字 + offset?: number; + // 搜索项默认值,可以是字符串、数字、布尔值或任意类型的数组,可选,默认为 undefined + defaultValue?: string | number | boolean | any[]; + // 扩展为包含 BreakPoint 类型的键和 Responsive 类型的值的部分记录,用于实现响应式配置 +} & Partial>; + +// 定义一个接口 ColumnProps,用于描述表格列的属性 +// 扩展自 Partial, "children" | "renderHeader" | "renderCell">>,表示部分继承 TableColumnCtx 类型并去除 "children"、"renderHeader" 和 "renderCell" 属性 +export interface ColumnProps + extends Partial, "children" | "renderHeader" | "renderCell">> { + // 是否是标签展示,可选,默认为 undefined,类型为布尔值 + tag?: boolean; + // 是否显示在表格当中,可选,默认为 undefined,类型为布尔值 + isShow?: boolean; + // 搜索项配置,可选,默认为 undefined,类型为 SearchProps 或 undefined + search?: SearchProps | undefined; + // 枚举类型(渲染值的字典),可以是 EnumProps 数组或一个返回 Promise 的函数,可选,默认为 undefined + enum?: EnumProps[] | ((params?: any) => Promise); + // 当前单元格值是否根据 enum 格式化(示例:enum 只作为搜索项数据),可选,默认为 undefined,类型为布尔值 + isFilterEnum?: boolean; + // 指定 label && value 的 key 值,可选,默认为 undefined,类型为包含 label 和 value 键的对象 + fieldNames?: { label: string; value: string }; + // 自定义表头内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受 ColumnProps 类型参数并返回任意类型的函数 + headerRender?: (row: ColumnProps) => any; + // 自定义单元格内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受包含 row 属性且类型为 T 的对象并返回任意类型的函数 + render?: (scope: { row: T }) => any; + // 多级表头,可选,默认为 undefined,类型为 ColumnProps 数组 + _children?: ColumnProps[]; +} diff --git a/client/src/layout/components/ReImageVerify/index.ts b/client/src/layout/components/ReImageVerify/index.ts new file mode 100644 index 0000000..6b4eca3 --- /dev/null +++ b/client/src/layout/components/ReImageVerify/index.ts @@ -0,0 +1,12 @@ +// 从当前目录下的 src 文件夹中的 index.vue 文件导入组件 +// 这里将导入的组件命名为 reImageVerify,它应该是一个 Vue 组件 +import reImageVerify from './src/index.vue' + +/** 图形验证码组件 */ +// 使用具名导出的方式,将导入的组件以 ReImageVerify 这个名称导出 +// 具名导出允许在导入时指定具体要导入的内容,方便在其他文件中使用 +export const ReImageVerify = reImageVerify + +// 使用默认导出的方式,将导入的组件作为默认导出 +// 默认导出允许在导入时可以使用任意名称来接收该组件,通常一个文件只能有一个默认导出 +export default ReImageVerify diff --git a/client/src/layout/components/ReImageVerify/src/hooks.ts b/client/src/layout/components/ReImageVerify/src/hooks.ts new file mode 100644 index 0000000..898eb05 --- /dev/null +++ b/client/src/layout/components/ReImageVerify/src/hooks.ts @@ -0,0 +1,133 @@ +import { ref, onMounted } from 'vue' + +/** + * 绘制图形验证码 + * @param width - 图形宽度 + * @param height - 图形高度 + */ +// 定义一个名为 useImageVerify 的函数,用于生成和管理图形验证码,接受图形宽度和高度作为参数,有默认值 +export const useImageVerify = (width = 120, height = 40) => { + // 创建一个响应式引用 domRef,用于存储 元素的引用 + const domRef = ref() + // 创建一个响应式变量 imgCode,用于存储生成的图形验证码字符串 + const imgCode = ref('') + + // 定义一个函数 setImgCode,用于设置 imgCode 的值 + function setImgCode(code: string) { + imgCode.value = code + } + + // 定义一个函数 getImgCode,用于在 上绘制验证码并获取生成的验证码字符串 + function getImgCode() { + // 如果 domRef 没有值(即 元素未挂载),则直接返回 + if (!domRef.value) return + // 调用 draw 函数绘制验证码,并将返回的验证码字符串赋值给 imgCode + imgCode.value = draw(domRef.value, width, height) + } + + // 在组件挂载后执行的钩子函数,调用 getImgCode 函数生成验证码 + onMounted(() => { + getImgCode() + }) + + // 返回一个包含 domRef、imgCode、setImgCode 和 getImgCode 的对象,以便在其他地方使用这些变量和函数 + return { + domRef, + imgCode, + setImgCode, + getImgCode + } +} + +// 定义一个函数 randomNum,用于生成指定范围内的随机整数 +function randomNum(min: number, max: number) { + // 使用 Math.random() 生成一个 0 到 1 之间的随机小数,然后通过计算得到指定范围内的整数 + const num = Math.floor(Math.random() * (max - min) + min) + return num +} + +// 定义一个函数 randomColor,用于生成指定范围内的随机颜色(RGB 格式) +function randomColor(min: number, max: number) { + // 分别生成随机的红(r)、绿(g)、蓝(b)分量值 + const r = randomNum(min, max) + const g = randomNum(min, max) + const b = randomNum(min, max) + // 返回 RGB 格式的颜色字符串 + return `rgb(${r},${g},${b})` +} + +// 定义一个函数 draw,用于在 元素上绘制图形验证码 +function draw(dom: HTMLCanvasElement, width: number, height: number) { + // 初始化一个空字符串 imgCode,用于存储生成的验证码 + let imgCode = '' + + // 定义一个字符串 NUMBER_STRING,包含数字 0 到 9,用于生成验证码字符 + const NUMBER_STRING = '0123456789' + + // 获取 元素的 2D 绘图上下文 ctx + const ctx = dom.getContext('2d') + // 如果获取上下文失败(ctx 为 null),则直接返回空的验证码字符串 + if (!ctx) return imgCode + + // 设置绘图上下文的填充样式为随机颜色(背景色) + ctx.fillStyle = randomColor(180, 230) + // 使用填充样式绘制一个矩形,覆盖整个 区域,作为验证码的背景 + ctx.fillRect(0, 0, width, height) + // 循环 4 次,生成 4 个验证码字符 + for (let i = 0; i < 4; i += 1) { + // 从 NUMBER_STRING 中随机选取一个字符作为验证码字符 + const text = NUMBER_STRING[randomNum(0, NUMBER_STRING.length)] + // 将选取的字符添加到 imgCode 字符串中 + imgCode += text + // 随机生成字体大小 + const fontSize = randomNum(18, 41) + // 随机生成字符的旋转角度 + const deg = randomNum(-30, 30) + // 设置绘图上下文的字体样式 + ctx.font = `${fontSize}px Simhei` + // 设置文本基线为顶部 + ctx.textBaseline = 'top' + // 设置绘图上下文的填充样式为随机颜色(字符颜色) + ctx.fillStyle = randomColor(80, 150) + // 保存当前绘图上下文的状态 + ctx.save() + // 平移绘图上下文的原点到指定位置(每个字符的起始位置) + ctx.translate(30 * i + 15, 15) + // 旋转绘图上下文指定的角度 + ctx.rotate((deg * Math.PI) / 180) + // 在指定位置绘制字符 + ctx.fillText(text, -15 + 5, -15) + // 恢复之前保存的绘图上下文状态 + ctx.restore() + } + // 循环 5 次,绘制 5 条随机直线 + for (let i = 0; i < 5; i += 1) { + // 开始绘制路径 + ctx.beginPath() + // 设置路径的起始点为随机位置 + ctx.moveTo(randomNum(0, width), randomNum(0, height)) + // 设置路径的终点为随机位置 + ctx.lineTo(randomNum(0, width), randomNum(0, height)) + // 设置绘图上下文的描边样式为随机颜色 + ctx.strokeStyle = randomColor(180, 230) + // 关闭路径 + ctx.closePath() + // 绘制路径(直线) + ctx.stroke() + } + // 循环 41 次,绘制 41 个随机圆形 + for (let i = 0; i < 41; i += 1) { + // 开始绘制路径 + ctx.beginPath() + // 绘制一个圆形,圆心为随机位置,半径为 1 + ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI) + // 关闭路径 + ctx.closePath() + // 设置绘图上下文的填充样式为随机颜色 + ctx.fillStyle = randomColor(150, 200) + // 填充圆形 + ctx.fill() + } + // 返回生成的验证码字符串 + return imgCode +} diff --git a/client/src/layout/components/ReImageVerify/src/index.vue b/client/src/layout/components/ReImageVerify/src/index.vue new file mode 100644 index 0000000..b8548ec --- /dev/null +++ b/client/src/layout/components/ReImageVerify/src/index.vue @@ -0,0 +1,55 @@ + + + + + + diff --git a/client/src/layout/components/SearchForm/components/SearchFormItem.vue b/client/src/layout/components/SearchForm/components/SearchFormItem.vue new file mode 100644 index 0000000..7e966ba --- /dev/null +++ b/client/src/layout/components/SearchForm/components/SearchFormItem.vue @@ -0,0 +1,117 @@ + + + + :is="`el-${column.search.el}`" + v-bind="handleSearchProps" + v-model.trim="searchParam[column.search.key?? handleProp(column.prop!)]" + :data="column.search?.el === 'tree-select'? columnEnum : []" + :options=" + ['cascader','select-v2'].includes(column.search?.el)? columnEnum : [] + " + :placeholder="placeholder" + :clearable="clearable" + range-separator="至" + start-placeholder="开始时间" + end-placeholder="结束时间" + > + + + {{ data[fieldNames.label] }} + + + + + v-for="(col, index) in columnEnum" + :key="index" + :label="col[fieldNames.label]" + :value="col[fieldNames.value]" + > + + + + + + + diff --git a/client/src/layout/components/SearchForm/index.vue b/client/src/layout/components/SearchForm/index.vue new file mode 100644 index 0000000..e587851 --- /dev/null +++ b/client/src/layout/components/SearchForm/index.vue @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + + + 搜索 + + + 重置 + + + {{ collapsed? '展开' : '合并' }} + + + + + + + + + + + + + diff --git a/client/src/layout/components/SvgIcon/index.vue b/client/src/layout/components/SvgIcon/index.vue new file mode 100644 index 0000000..e25234e --- /dev/null +++ b/client/src/layout/components/SvgIcon/index.vue @@ -0,0 +1,49 @@ + + + + + + + + + + + diff --git a/client/src/layout/components/elderListDialog/index.vue b/client/src/layout/components/elderListDialog/index.vue new file mode 100644 index 0000000..172f22c --- /dev/null +++ b/client/src/layout/components/elderListDialog/index.vue @@ -0,0 +1,118 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 选择 + + + + + + + + + + + diff --git a/client/src/layout/components/my-card/my-card.vue b/client/src/layout/components/my-card/my-card.vue new file mode 100644 index 0000000..d050f98 --- /dev/null +++ b/client/src/layout/components/my-card/my-card.vue @@ -0,0 +1,30 @@ + + + + + + + + {{ title }} + + + + + + + + diff --git a/client/src/layout/components/treeDialog/index.vue b/client/src/layout/components/treeDialog/index.vue new file mode 100644 index 0000000..c4d327e --- /dev/null +++ b/client/src/layout/components/treeDialog/index.vue @@ -0,0 +1,90 @@ + + + + + + + + + + + + + + + + + + + diff --git a/client/src/layout/components/upload/image/index.vue b/client/src/layout/components/upload/image/index.vue new file mode 100644 index 0000000..e739333 --- /dev/null +++ b/client/src/layout/components/upload/image/index.vue @@ -0,0 +1,189 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/client/src/layout/components/wen-test/DynamicAdditionComponent.vue b/client/src/layout/components/wen-test/DynamicAdditionComponent.vue new file mode 100644 index 0000000..c13ef16 --- /dev/null +++ b/client/src/layout/components/wen-test/DynamicAdditionComponent.vue @@ -0,0 +1,47 @@ + + + + 添加组件 + + + + + + + + + + + diff --git a/client/src/layout/hooks/interface/index.ts b/client/src/layout/hooks/interface/index.ts new file mode 100644 index 0000000..05cfd4d --- /dev/null +++ b/client/src/layout/hooks/interface/index.ts @@ -0,0 +1,42 @@ +// 定义一个名为 Table 的命名空间 +export namespace Table { + // 在 Table 命名空间内,定义一个接口 Pageable,用于描述分页相关的属性 + export interface Pageable { + // 当前页码,类型为数字 + pageNum: number + // 每页显示的数量,类型为数字 + pageSize: number + // 数据的总数量,类型为数字 + total: number + } + // 在 Table 命名空间内,定义一个接口 TableStateProps,用于描述表格相关的状态属性 + export interface TableStateProps { + // 表格数据,是一个任意类型的数组 + tableData: any[] + // 分页相关的属性,类型为 Pageable 接口 + pageable: Pageable + // 搜索参数,是一个键值对对象,键为字符串,值为任意类型 + searchParam: { + [key: string]: any + } + // 初始化的搜索参数,是一个键值对对象,键为字符串,值为任意类型 + searchInitParam: { + [key: string]: any + } + // 用于获取总数的参数,是一个键值对对象,键为字符串,值为任意类型 + totalParam: { + [key: string]: any + } + // 可选的图标相关属性,是一个键值对对象,键为字符串,值为任意类型,默认为 undefined + icon?: { + [key: string]: any + } + } +} + +// 定义一个名为 HandleData 的命名空间 +export namespace HandleData { + // 在 HandleData 命名空间内,定义一个类型别名 MessageType + // MessageType 的值可以是空字符串,或者是'success'、'warning'、'info'、'error' 中的一个 + export type MessageType = '' |'success' | 'warning' | 'info' | 'error' +} diff --git a/client/src/layout/hooks/useHandleData.ts b/client/src/layout/hooks/useHandleData.ts new file mode 100644 index 0000000..f4a917a --- /dev/null +++ b/client/src/layout/hooks/useHandleData.ts @@ -0,0 +1,52 @@ +// 从 element-plus 库中导入 ElMessageBox 和 ElMessage 组件,分别用于显示确认框和提示消息 +import { ElMessageBox, ElMessage } from 'element-plus' +// 从 './interface' 文件中导入 HandleData 命名空间,用于获取其中定义的类型 +import { HandleData } from './interface' + +/** + * @description 操作单条数据信息(二次确认【删除、禁用、启用、重置密码】) + * @param {Function} api 操作数据接口的api方法(必传) + * @param {Object} params 携带的操作数据参数 {id,params}(必传) + * @param {String} message 提示信息(必传) + * @param {String} confirmType icon类型(不必传,默认为 warning) + * @return Promise + */ +// 定义一个泛型函数 useHandleData,P 表示 api 函数参数的类型,R 表示 api 函数返回值的类型 +export const useHandleData = ( + // api 是一个函数,接收类型为 P 的参数并返回一个 Promise,Promise 的解析值类型为 R + api: (params: P) => Promise, + // params 是 api 函数的参数,类型与 api 函数的参数类型一致 + params: Parameters[0], + // message 是一个字符串,用于显示确认框中的提示信息 + message: string, + // confirmType 是一个字符串,类型为 HandleData.MessageType,默认值为 'warning' + confirmType: HandleData.MessageType = 'warning' +) => { + // 返回一个 Promise + return new Promise((resolve, reject) => { + // 显示一个确认框 + ElMessageBox.confirm(`是否${message}?`, '温馨提示', { + // 确认按钮的文本 + confirmButtonText: '确定', + // 取消按钮的文本 + cancelButtonText: '取消', + // 确认框的图标类型 + type: confirmType, + // 是否可拖动 + draggable: true + }) + .then(async () => { + // 调用 api 函数并等待其返回结果 + const res = await api(params) + // 如果结果为 falsy 值,则 reject 该 Promise + if (!res) return reject(false) + // 显示一个成功提示消息 + ElMessage({ + type:'success', + message: `${message}成功!` + }) + // resolve 该 Promise,表示操作成功 + resolve(true) + }) + }) +} diff --git a/client/src/layout/hooks/useIcons.ts b/client/src/layout/hooks/useIcons.ts new file mode 100644 index 0000000..a99fbba --- /dev/null +++ b/client/src/layout/hooks/useIcons.ts @@ -0,0 +1,25 @@ +// 从 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 +import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 导入 h 函数和 defineComponent 函数 +import { h, defineComponent } from 'vue' + +// 定义一个名为 useRenderIcon 的函数,它接受两个参数:iconName(字符串类型)和 attrs(可选的任意类型) +export function useRenderIcon(iconName: string, attrs?: any) { + // 使用 defineComponent 函数定义一个新的组件 + return defineComponent({ + // 新组件的名称为 'SvgIcon' + name: 'SvgIcon', + // 定义组件的渲染函数 + render() { + // 使用 h 函数创建一个 SvgIcon 组件的虚拟节点 + // 第一个参数是要创建的组件(这里是 SvgIcon) + // 第二个参数是一个对象,包含要传递给 SvgIcon 组件的属性 + // 'icon' 属性的值是传入的 iconName + // '...attrs' 表示将 attrs 对象中的所有属性也传递给 SvgIcon 组件 + return h(SvgIcon, { + icon: iconName, + ...attrs + }) + } + }) +} diff --git a/client/src/layout/hooks/useSelection.ts b/client/src/layout/hooks/useSelection.ts new file mode 100644 index 0000000..b3df20a --- /dev/null +++ b/client/src/layout/hooks/useSelection.ts @@ -0,0 +1,51 @@ +import { ref, computed } from 'vue' + +/** + * @description 表格多选数据操作 + * @param {String} rowKey 当表格可以多选时,所指定的 id + * */ +// 定义一个名为 useSelection 的函数,用于处理表格多选数据的操作 +// 接受一个可选参数 rowKey,默认值为 'id',表示行数据中用于唯一标识的键名 +export const useSelection = (rowKey = 'id') => { + // 创建一个响应式变量 isSelected,用于表示是否选中了数据 + // 初始值为 false,类型为 boolean + const isSelected = ref(false) + // 创建一个响应式变量 selectedList,用于存储选中的数据列表 + // 初始值为空数组,类型为 any[] + const selectedList = ref([]) + + // 创建一个计算属性 selectedListIds,用于获取当前选中的所有数据的 id 数组 + // 计算属性会根据依赖项(这里是 selectedList)的变化而自动更新 + const selectedListIds = computed((): string[] => { + // 初始化一个空数组 ids 用于存储 id + const ids: string[] = [] + // 遍历 selectedList 中的每一项数据 + selectedList.value.forEach(item => ids.push(item[rowKey])) + // 返回包含所有 id 的数组 + return ids + }) + + /** + * @description 多选操作 + * @param {Array} rowArr 当前选择的所有数据 + * @return void + */ + // 定义一个函数 selectionChange,用于处理表格多选数据的变化事件 + // 接受一个参数 rowArr,类型为 any[],表示当前选中的所有数据 + const selectionChange = (rowArr: any) => { + // 如果选中的数据列表为空,则将 isSelected 设置为 false + // 否则将 isSelected 设置为 true + rowArr.length === 0? (isSelected.value = false) : (isSelected.value = true) + // 更新 selectedList 为当前选中的数据列表 + selectedList.value = rowArr + } + + // 返回一个包含 isSelected、selectedList、selectedListIds 和 selectionChange 的对象 + // 以便在其他地方使用这些变量和函数来处理表格多选数据 + return { + isSelected, + selectedList, + selectedListIds, + selectionChange + } +} diff --git a/client/src/layout/hooks/useTabList.ts b/client/src/layout/hooks/useTabList.ts new file mode 100644 index 0000000..f9a7847 --- /dev/null +++ b/client/src/layout/hooks/useTabList.ts @@ -0,0 +1,98 @@ +// import { ref } from 'vue' +// import { useRoute, onBeforeRouteUpdate } from 'vue-router' +// import { useCookies } from '@vueuse/integrations/useCookies' +// import { router } from '~/router' + +// export function useTabList() { +// const route = useRoute() +// const cookie = useCookies() + +// const activeTab = ref(route.path) +// const tabList = ref([ +// { +// title: '后台首页', +// path: '/' +// } +// ]) + +// // 添加标签导航 +// function addTab(tab) { +// let noTab = tabList.value.findIndex((t) => t.path == tab.path) == -1 +// if (noTab) { +// tabList.value.push(tab) +// } + +// cookie.set('tabList', tabList.value) +// } + +// // 初始化标签导航列表 +// function initTabList() { +// let tbs = cookie.get('tabList') +// if (tbs) { +// tabList.value = tbs +// } +// } + +// initTabList() + +// onBeforeRouteUpdate((to, from) => { +// activeTab.value = to.path +// addTab({ +// title: to.meta.title, +// path: to.path +// }) +// }) + +// const changeTab = (t) => { +// activeTab.value = t +// router.push(t) +// } + +// const removeTab = (t) => { +// let tabs = tabList.value +// let a = activeTab.value +// if (a == t) { +// tabs.forEach((tab, index) => { +// if (tab.path == t) { +// const nextTab = tabs[index + 1] || tabs[index - 1] +// if (nextTab) { +// a = nextTab.path +// } +// } +// }) +// } + +// activeTab.value = a +// tabList.value = tabList.value.filter((tab) => tab.path != t) + +// cookie.set('tabList', tabList.value) +// } + +// const handleClose = (c) => { +// if (c == 'clearAll') { +// // 切换回首页 +// activeTab.value = '/' +// // 过滤只剩下首页 +// tabList.value = [ +// { +// title: '后台首页', +// path: '/' +// } +// ] +// } else if (c == 'clearOther') { +// // 过滤只剩下首页和当前激活 +// tabList.value = tabList.value.filter( +// (tab) => tab.path == '/' || tab.path == activeTab.value +// ) +// } +// cookie.set('tabList', tabList.value) +// } + +// return { +// activeTab, +// tabList, +// changeTab, +// removeTab, +// handleClose +// } +// } diff --git a/client/src/layout/hooks/useTable.ts b/client/src/layout/hooks/useTable.ts new file mode 100644 index 0000000..d9d5e6e --- /dev/null +++ b/client/src/layout/hooks/useTable.ts @@ -0,0 +1,210 @@ +import { Table } from './interface' +import { reactive, computed, toRefs } from 'vue' + +/** + * @description table 页面操作方法封装 + * @param {Function} api 获取表格数据 api 方法(必传) + * @param {Object} initParam 获取数据初始化参数(非必传,默认为{}) + * @param {Boolean} isPageable 是否有分页(非必传,默认为true) + * @param {Function} dataCallBack 对后台返回的数据进行处理的方法(非必传) + * */ +// 定义一个名为 useTable 的函数,用于封装表格页面的操作方法 +// api 是获取表格数据的 API 方法,是必传参数 +// initParam 是获取数据的初始化参数,非必传,默认值为空对象 +// isPageable 表示是否有分页功能,非必传,默认值为 true +// dataCallBack 是对后台返回的数据进行处理的方法,非必传 +export const useTable = ( + api: (params: any) => Promise, + initParam: object = {}, + isPageable = true, + dataCallBack?: (data: any) => any +) => { + // 使用 reactive 创建一个响应式的 state 对象,包含表格数据、分页数据、查询参数等 + const state = reactive({ + // 表格数据,初始值为空数组 + tableData: [], + // 分页数据,包含当前页数、每页显示条数和总条数 + pageable: { + // 当前页数,初始值为 1 + pageNum: 1, + // 每页显示条数,初始值为 10 + pageSize: 10, + // 总条数,初始值为 0 + total: 0 + }, + // 查询参数,只包括查询条件,初始值为空对象 + searchParam: {}, + // 初始化默认的查询参数,初始值为空对象 + searchInitParam: {}, + // 总参数,包含分页和查询参数,初始值为空对象 + totalParam: {} + }) + + /** + * @description 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置) + * */ + // 定义一个计算属性 pageParam,用于获取和设置分页查询参数 + const pageParam = computed({ + // 获取分页查询参数 + get: () => { + return { + pageNum: state.pageable.pageNum, + pageSize: state.pageable.pageSize + } + }, + // 设置分页查询参数,这里暂时为空,可根据需要实现 + set: (newVal: any) => { // 我是分页更新之后的值 + } + }) + + /** + * @description 获取表格数据 + * @return void + * */ + // 定义一个异步函数 getTableList,用于获取表格数据 + const getTableList = async () => { + try { + // 先把初始化参数和分页参数放到总参数里面 + Object.assign( + state.totalParam, + initParam, + isPageable? pageParam.value : {} + ) + // 请求前格式化数据,如果总参数中有 consultDate 字段,则进行处理 + if (state.totalParam.consultDate) { + state.totalParam.startTime = state.totalParam.consultDate[0] + state.totalParam.endTime = state.totalParam.consultDate[1] + delete state.totalParam.consultDate + } + // 调用 API 方法获取数据 + let { data } = await api({ + ...state.searchInitParam, + ...state.totalParam + }) + // 如果有数据处理回调函数,则对数据进行处理 + dataCallBack && (data = dataCallBack(data)) + // 获取当前表格数据,如果有分页,则取 data.list,否则取 data + state.tableData = isPageable? data.list : data + + // 从返回的数据中获取分页信息 + const { pageNum, pageSize, total } = data + // 如果有分页,则更新分页信息 + isPageable && updatePageable({ pageNum, pageSize, total }) + } catch (error) { + // 如果发生错误,打印错误信息 + console.log(error) + } + } + + /** + * @description 更新查询参数 + * @return void + * */ + // 定义一个函数 updatedTotalParam,用于更新总参数 + const updatedTotalParam = () => { + state.totalParam = {} + // 处理查询参数,可以给查询参数加自定义前缀操作 + const nowSearchParam: { [key: string]: any } = {} + // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) + for (const key in state.searchParam) { + // * 某些情况下参数为 false/0 也应该携带参数 + if ( + state.searchParam[key] || + state.searchParam[key] === false || + state.searchParam[key] === 0 + ) { + nowSearchParam[key] = state.searchParam[key] + } + } + // 将处理后的查询参数和分页参数合并到总参数中 + Object.assign( + state.totalParam, + nowSearchParam, + isPageable? pageParam.value : {} + ) + } + + /** + * @description 更新分页信息 + * @param {Object} resPageable 后台返回的分页数据 + * @return void + * */ + // 定义一个函数 updatePageable,用于更新分页信息 + const updatePageable = (resPageable: Table.Pageable) => { + // 使用 Object.assign 方法将后台返回的分页数据合并到 state.pageable 中 + Object.assign(state.pageable, resPageable) + } + + /** + * @description 表格数据查询 + * @return void + * */ + // 定义一个函数 search,用于进行表格数据查询 + const search = () => { + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } + + /** + * @description 表格数据重置 + * @return void + * */ + // 定义一个函数 reset,用于重置表格数据 + const reset = () => { + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 清空搜索参数 + state.searchParam = {} + // 重置搜索表单时,如果有默认搜索参数,则重置为默认值 + Object.keys(state.searchInitParam).forEach(key => { + state.searchParam[key] = state.searchInitParam[key] + }) + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } + + /** + * @description 每页条数改变 + * @param {Number} val 当前条数 + * @return void + * */ + // 定义一个函数 handleSizeChange,用于处理每页条数改变的事件 + const handleSizeChange = (val: number) => { + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新每页显示条数 + state.pageable.pageSize = val + // 获取表格数据 + getTableList() + } + + /** + * @description 当前页改变 + * @param {Number} val 当前页 + * @return void + * */ + // 定义一个函数 handleCurrentChange,用于处理当前页改变的事件 + const handleCurrentChange = (val: number) => { + // 更新当前页数 + state.pageable.pageNum = val + // 获取表格数据 + getTableList() + } + + // 返回一个包含 state 的响应式引用、获取表格数据的函数、查询函数、重置函数、处理每页条数改变和当前页改变的函数以及更新总参数的函数 + return { + ...toRefs(state), + getTableList, + search, + reset, + handleSizeChange, + handleCurrentChange, + updatedTotalParam + } +} From bf65be69a70076781d136779f535b9a85704018d Mon Sep 17 00:00:00 2001 From: zgj <2913248995@qq.com> Date: Wed, 30 Apr 2025 14:02:07 +0800 Subject: [PATCH 4/7] zgj --- client/src/icons/index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/src/icons/index.ts b/client/src/icons/index.ts index e4cd5fc..3ae6e10 100644 --- a/client/src/icons/index.ts +++ b/client/src/icons/index.ts @@ -1,15 +1,21 @@ +// 从项目路径 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 中导入 App 类型,用于表示 Vue 应用实例 import { App } from 'vue' // 获取上下文 require.context(检索的目录,是否检索子文件夹,正则表达式) // 返回值是一个函数(传入路径可以导入文件) // 通过静态方法keys可以检索所有文件路径 // 通过.prototype可以查看所有静态方法 - +// 这里指定检索当前目录下的 './svg' 文件夹,不检索子文件夹,匹配所有以.svg 结尾的文件 const svgRequired = require.context('./svg', false, /\.svg$/) +// 遍历所有匹配的 SVG 文件路径 svgRequired.keys().forEach(item => svgRequired(item)) +// 导出一个默认函数,该函数接收一个 Vue 应用实例 app 作为参数 export default (app: App) => { + // 使用 app.component 方法将 SvgIcon 组件注册为全局组件,别名为'svg-icon' + // 这样在整个 Vue 应用中都可以使用 标签来使用该组件 app.component('svg-icon', SvgIcon) } From 132f7f3ffe56ee4752dc6e965525e94ab096c00e Mon Sep 17 00:00:00 2001 From: lxf <2974586501@qq.com> Date: Wed, 30 Apr 2025 14:11:09 +0800 Subject: [PATCH 5/7] lxf --- 代码行数.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 代码行数.txt diff --git a/代码行数.txt b/代码行数.txt new file mode 100644 index 0000000..055dcc8 --- /dev/null +++ b/代码行数.txt @@ -0,0 +1,4 @@ +代码注释行数 +李宵锋 3131行 +张功军 3123行 +操舰洋 3112行 \ No newline at end of file From 8855636e8abc953d1b16c1fb311c56e2696938ae Mon Sep 17 00:00:00 2001 From: lxf <2974586501@qq.com> Date: Wed, 30 Apr 2025 14:26:23 +0800 Subject: [PATCH 6/7] v2.6 --- client/src/icons/index.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/client/src/icons/index.ts b/client/src/icons/index.ts index 3ae6e10..e4cd5fc 100644 --- a/client/src/icons/index.ts +++ b/client/src/icons/index.ts @@ -1,21 +1,15 @@ -// 从项目路径 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' -// 从 'vue' 中导入 App 类型,用于表示 Vue 应用实例 import { App } from 'vue' // 获取上下文 require.context(检索的目录,是否检索子文件夹,正则表达式) // 返回值是一个函数(传入路径可以导入文件) // 通过静态方法keys可以检索所有文件路径 // 通过.prototype可以查看所有静态方法 -// 这里指定检索当前目录下的 './svg' 文件夹,不检索子文件夹,匹配所有以.svg 结尾的文件 + const svgRequired = require.context('./svg', false, /\.svg$/) -// 遍历所有匹配的 SVG 文件路径 svgRequired.keys().forEach(item => svgRequired(item)) -// 导出一个默认函数,该函数接收一个 Vue 应用实例 app 作为参数 export default (app: App) => { - // 使用 app.component 方法将 SvgIcon 组件注册为全局组件,别名为'svg-icon' - // 这样在整个 Vue 应用中都可以使用 标签来使用该组件 app.component('svg-icon', SvgIcon) } From 9d499cce67fcc77366116e5eaed43effa710d590 Mon Sep 17 00:00:00 2001 From: lxf <2974586501@qq.com> Date: Wed, 30 Apr 2025 14:55:27 +0800 Subject: [PATCH 7/7] 11 --- .idea/workspace.xml | 19 +- client/package-lock.json | 81 +++- client/src/apis/bedPanorama.ts | 25 +- client/src/apis/bookManage.ts | 78 +++- client/src/apis/build.ts | 158 ++++++- client/src/apis/cateringSet.ts | 77 +++- client/src/apis/checkContract.ts | 127 +++++- client/src/apis/consume.ts | 14 +- client/src/apis/dishes.ts | 98 ++++- client/src/apis/home.ts | 43 +- client/src/apis/index.ts | 13 + client/src/apis/order.ts | 94 ++++- client/src/apis/retreatAudit.ts | 37 +- client/src/apis/roomType.ts | 56 ++- client/src/apis/soldManage.ts | 322 ++++++++++---- client/src/apis/source.ts | 55 ++- client/src/apis/user.ts | 94 +++-- .../ProTable/Grid/components/GridItem.vue | 109 ----- client/src/components/ProTable/Grid/index.vue | 207 --------- .../ProTable/Grid/interface/index.ts | 12 - .../components/ProTable/IconPark/index.vue | 45 -- .../ProTable/components/ColSetting.vue | 88 ---- .../ProTable/components/Pagination.vue | 47 --- .../ProTable/components/TableColumn.vue | 103 ----- .../src/components/ProTable/ProTable/index.md | 87 ---- .../components/ProTable/ProTable/index.vue | 397 ------------------ .../ProTable/ProTable/interface/index.ts | 84 ---- .../ProTable/ReImageVerify/index.ts | 12 - .../ProTable/ReImageVerify/src/hooks.ts | 133 ------ .../ProTable/ReImageVerify/src/index.vue | 55 --- .../SearchForm/components/SearchFormItem.vue | 117 ------ .../components/ProTable/SearchForm/index.vue | 142 ------- .../src/components/ProTable/SvgIcon/index.vue | 49 --- .../ProTable/elderListDialog/index.vue | 118 ------ .../components/ProTable/my-card/my-card.vue | 30 -- .../components/ProTable/treeDialog/index.vue | 90 ---- .../ProTable/upload/image/index.vue | 189 --------- .../wen-test/DynamicAdditionComponent.vue | 47 --- client/src/hooks/interface/index.ts | 17 +- client/src/hooks/useHandleData.ts | 34 +- client/src/hooks/useIcons.ts | 11 + client/src/hooks/useSelection.ts | 27 +- client/src/hooks/useTable.ts | 198 +++++---- client/src/icons/index.ts | 8 +- .../components/NavBar/components/Avatar.vue | 79 +++- .../NavBar/components/Breadcrumb.vue | 33 +- client/src/layout/components/NavBar/index.vue | 18 + .../SideBar/components/MenuFold.vue | 27 +- .../SideBar/components/MenuItem.vue | 53 ++- .../src/layout/components/SideBar/index.vue | 59 ++- client/src/layout/components/Tags/index.vue | 13 + client/src/layout/index.vue | 35 +- client/src/plugins/element-plus/index.ts | 8 +- client/src/plugins/index.ts | 3 + client/src/router/index.ts | 39 +- client/src/router/types.ts | 11 + client/src/router/utils.ts | 56 ++- client/src/store/index.ts | 19 +- client/src/store/modules/app/index.ts | 52 ++- client/src/store/modules/app/types.ts | 9 + client/src/store/modules/soldManage/index.ts | 7 + client/src/store/types.ts | 6 + client/src/store/utils.ts | 18 +- client/src/styles/element.scss | 70 ++- client/src/styles/index.scss | 25 +- client/src/styles/login.scss | 48 ++- client/src/styles/mixin.scss | 8 + client/src/styles/navbar.scss | 30 +- client/src/styles/reset.scss | 40 +- client/src/styles/sidebar.scss | 168 +++++++- client/src/styles/theme.scss | 10 +- client/src/styles/transition.scss | 16 +- client/src/styles/variables.module.scss | 21 +- client/src/styles/variables.module.scss.d.ts | 13 + client/src/types/global.d.ts | 12 + client/src/types/vuex.d.ts | 11 +- client/src/utils/commonUtil.ts | 35 +- client/src/utils/formRules.ts | 50 ++- client/src/utils/http/index.ts | 29 +- client/src/utils/index.ts | 4 + client/src/utils/is/index.ts | 193 +++++++-- client/src/utils/util.ts | 48 ++- client/src/views/base/activity/index.vue | 13 +- client/src/views/base/index.vue | 19 +- .../src/views/base/live/flat/dialog/bed.vue | 143 ++++--- .../src/views/base/live/flat/dialog/build.vue | 153 ++++--- .../src/views/base/live/flat/dialog/floor.vue | 158 ++++--- .../src/views/base/live/flat/dialog/room.vue | 222 ++++++---- client/src/views/base/live/flat/index.vue | 325 +++++++------- client/src/views/base/live/index.vue | 14 +- client/src/views/base/live/room/index.vue | 159 ++++--- .../views/base/live/room/roomDialog/index.vue | 154 ++++--- client/src/views/base/sale/index.vue | 16 +- client/src/views/base/sale/origin/index.vue | 84 ++-- .../base/sale/origin/originDialog/index.vue | 138 +++--- client/src/views/base/sale/tag/index.vue | 14 +- .../views/charge/audit/auditDialog/index.vue | 314 ++++++++------ client/src/views/charge/audit/index.vue | 103 +++-- client/src/views/charge/index.vue | 24 +- client/src/views/charge/prestore/index.vue | 100 +++-- .../charge/prestore/prestoreDialog/index.vue | 135 +++--- client/src/views/charge/record/index.vue | 74 ++-- .../exception/BusinessRuntimeException.java | 16 +- .../BusinessRuntimeExceptionAdvice.java | 89 +++- .../common/config/file/FileTempPath.java | 74 +++- .../file/FileUploadConfigPropertity.java | 15 +- .../mybatisplus/MetaObjectHandlerImpl.java | 59 ++- .../common/config/quartz/QuartzConfig.java | 64 ++- .../common/config/quartz/QuartzJob.java | 23 +- .../config/redis/FastJsonRedisSerializer.java | 44 +- .../common/config/redis/RedisConfig.java | 27 +- .../security/config/SecurityConfig.java | 57 ++- .../security/entity/LoginUserDetails.java | 35 +- .../filter/JwtAuthenticationTokenFilter.java | 72 +++- .../handler/AccessDeniedHandlerImpl.java | 17 +- .../handler/AuthenticationEntryPointImpl.java | 17 +- .../security/handler/AuthorityAssert.java | 24 +- .../security/handler/PasswordEncoderImpl.java | 14 +- .../service/UserDetailsServiceImpl.java | 39 +- .../common/config/swagger/SwaggerConfig.java | 44 +- .../common/config/web/IgnoreConfig.java | 11 + .../common/config/web/WebMvcConfig.java | 42 +- .../gerocomium/common/constant/AuditEnum.java | 32 +- .../gerocomium/common/constant/BedEnum.java | 29 +- .../common/constant/ChargeEnum.java | 26 +- .../gerocomium/common/constant/CheckEnum.java | 38 +- .../gerocomium/common/constant/CodeEnum.java | 27 +- .../common/constant/ConsumeEnum.java | 25 +- .../common/constant/ExceptionEnum.java | 9 + .../gerocomium/common/constant/MarkEnum.java | 29 +- .../common/constant/RecipientEnum.java | 25 +- .../gerocomium/common/constant/VisitEnum.java | 25 +- .../gerocomium/common/constant/YesNoEnum.java | 17 +- .../ew/gerocomium/common/util/AesUtil.java | 45 +- .../ew/gerocomium/common/util/AssertUtil.java | 76 +++- .../common/util/ClassJavaToTSUtil.java | 72 +++- .../gerocomium/common/util/DateUtilWen.java | 167 ++++++-- .../common/util/EntityCodeGeneratorUtil.java | 101 +++-- .../ew/gerocomium/common/util/ExcelUtil.java | 109 +++-- .../common/util/JavaToTsConverter.java | 101 ++++- .../ew/gerocomium/common/util/JwtUtil.java | 42 +- .../ew/gerocomium/common/util/PageUtil.java | 52 ++- .../gerocomium/common/util/ResponseUtil.java | 42 +- .../gerocomium/common/util/SendEmailUtil.java | 35 +- .../controller/AccountController.java | 98 ++++- .../controller/BedPanoramaController.java | 75 +++- .../controller/BuildController.java | 373 ++++++++++++++-- .../controller/CheckContractController.java | 288 +++++++++++-- .../controller/ConsultController.java | 178 +++++++- .../gerocomium/controller/FileController.java | 55 ++- .../gerocomium/controller/HomeController.java | 105 ++++- .../controller/IntentionController.java | 368 ++++++++++++++-- .../controller/InventoryController.java | 60 ++- .../controller/LabelController.java | 182 +++++++- .../controller/MaterialController.java | 86 +++- .../controller/OutboundRecordController.java | 200 ++++++++- .../controller/RoomTypeController.java | 111 ++++- .../controller/SourceController.java | 110 ++++- .../controller/WarehouseController.java | 123 +++++- .../controller/WarehouseRecordController.java | 157 ++++++- .../ew/gerocomium/dao/base/BaseEntity.java | 21 +- .../ew/gerocomium/dao/base/BuildingVo.java | 55 ++- .../GerocomiumApplicationTests.java | 12 +- server/target/classes/application-dev.yml | 6 +- .../exception/BusinessRuntimeException.class | Bin 1241 -> 1241 bytes .../BusinessRuntimeExceptionAdvice.class | Bin 4183 -> 4183 bytes .../common/config/file/FileTempPath.class | Bin 4980 -> 4984 bytes .../file/FileUploadConfigPropertity.class | Bin 3505 -> 3505 bytes .../mybatisplus/MetaObjectHandlerImpl.class | Bin 2928 -> 2928 bytes .../common/config/quartz/QuartzConfig.class | Bin 3048 -> 3056 bytes .../quartz/QuartzJob$ContractExpireJob.class | Bin 1365 -> 1365 bytes .../quartz/QuartzJob$ReserveExpireJob.class | Bin 1359 -> 1359 bytes .../common/config/quartz/QuartzJob.class | Bin 1198 -> 1198 bytes .../redis/FastJsonRedisSerializer.class | Bin 2903 -> 2903 bytes .../common/config/redis/RedisConfig.class | Bin 1949 -> 1949 bytes .../security/config/SecurityConfig.class | Bin 5974 -> 5974 bytes .../security/entity/LoginUserDetails.class | Bin 2641 -> 2641 bytes .../filter/JwtAuthenticationTokenFilter.class | Bin 5926 -> 5926 bytes .../handler/AccessDeniedHandlerImpl.class | Bin 1391 -> 1391 bytes .../AuthenticationEntryPointImpl.class | Bin 1427 -> 1427 bytes .../security/handler/AuthorityAssert.class | Bin 2069 -> 2073 bytes .../handler/PasswordEncoderImpl.class | Bin 1229 -> 1229 bytes .../service/UserDetailsServiceImpl.class | Bin 2984 -> 2984 bytes .../common/config/swagger/SwaggerConfig.class | Bin 2950 -> 2958 bytes .../common/config/web/IgnoreConfig.class | Bin 2474 -> 2474 bytes .../common/config/web/WebMvcConfig.class | Bin 3299 -> 3299 bytes .../common/constant/AuditEnum.class | Bin 1614 -> 1614 bytes .../gerocomium/common/constant/BedEnum.class | Bin 1521 -> 1521 bytes .../common/constant/ChargeEnum.class | Bin 1461 -> 1461 bytes .../common/constant/CheckEnum.class | Bin 1759 -> 1759 bytes .../gerocomium/common/constant/CodeEnum.class | Bin 1662 -> 1662 bytes .../common/constant/ConsumeEnum.class | Bin 1402 -> 1402 bytes .../common/constant/ExceptionEnum.class | Bin 9340 -> 9340 bytes .../gerocomium/common/constant/MarkEnum.class | Bin 1448 -> 1448 bytes .../common/constant/RecipientEnum.class | Bin 1415 -> 1415 bytes .../common/constant/VisitEnum.class | Bin 1410 -> 1410 bytes .../common/constant/YesNoEnum.class | Bin 1539 -> 1539 bytes .../ew/gerocomium/common/util/AesUtil.class | Bin 2283 -> 2283 bytes .../gerocomium/common/util/AssertUtil.class | Bin 2363 -> 2363 bytes .../common/util/ClassJavaToTSUtil.class | Bin 3184 -> 3188 bytes .../gerocomium/common/util/DateUtilWen.class | Bin 4871 -> 4883 bytes .../common/util/EntityCodeGeneratorUtil.class | Bin 6323 -> 6323 bytes .../common/util/ExcelUtil$Test.class | Bin 2738 -> 2738 bytes .../ew/gerocomium/common/util/ExcelUtil.class | Bin 8667 -> 8667 bytes .../common/util/JavaToTsConverter.class | Bin 3173 -> 3173 bytes .../ew/gerocomium/common/util/JwtUtil.class | Bin 2404 -> 2412 bytes .../ew/gerocomium/common/util/PageUtil.class | Bin 5074 -> 5082 bytes .../gerocomium/common/util/ResponseUtil.class | Bin 2260 -> 2260 bytes .../common/util/SendEmailUtil.class | Bin 1966 -> 1966 bytes .../controller/AccidentController.class | Bin 5880 -> 5880 bytes .../controller/AccountController.class | Bin 3129 -> 3129 bytes .../controller/ActiveController.class | Bin 4446 -> 4446 bytes .../controller/ActiveTypeController.class | Bin 3865 -> 3865 bytes .../controller/BedPanoramaController.class | Bin 2551 -> 2551 bytes .../controller/BuildController.class | Bin 7819 -> 7819 bytes .../controller/CateringSetController.class | Bin 4851 -> 4851 bytes .../controller/CheckContractController.class | Bin 6751 -> 6751 bytes .../controller/ConsultController.class | Bin 4809 -> 4809 bytes .../controller/ConsumeController.class | Bin 1784 -> 1784 bytes .../DepositRechargeController.class | Bin 3108 -> 3108 bytes .../controller/DishesController.class | Bin 5437 -> 5437 bytes .../controller/ElderRecordController.class | Bin 4278 -> 4278 bytes .../controller/FileController.class | Bin 1897 -> 1897 bytes .../controller/HomeController.class | Bin 2727 -> 2760 bytes .../controller/IntentionController.class | Bin 9604 -> 9604 bytes .../controller/InventoryController.class | Bin 2275 -> 2275 bytes .../controller/LabelController.class | Bin 4752 -> 4752 bytes .../controller/MaterialController.class | Bin 5523 -> 5523 bytes .../controller/NurseGradeController.class | Bin 4708 -> 4708 bytes .../controller/NurseReserveController.class | Bin 5062 -> 5062 bytes .../controller/OrderController.class | Bin 5685 -> 5685 bytes .../controller/OutboundRecordController.class | Bin 6892 -> 6892 bytes .../controller/OutwardController.class | Bin 6799 -> 6799 bytes .../controller/ReserveController.class | Bin 4855 -> 4855 bytes .../controller/RetreatApplyController.class | Bin 3222 -> 3222 bytes .../controller/RetreatAuditController.class | Bin 3033 -> 3033 bytes .../controller/RoomTypeController.class | Bin 3667 -> 3667 bytes .../controller/ServiceProjectController.class | Bin 5543 -> 5543 bytes .../controller/SourceController.class | Bin 3774 -> 3774 bytes .../controller/StaffController.class | Bin 3813 -> 3813 bytes .../controller/VisitController.class | Bin 5100 -> 5100 bytes .../controller/WarehouseController.class | Bin 3944 -> 3944 bytes .../WarehouseRecordController.class | Bin 5505 -> 5505 bytes .../ew/gerocomium/dao/base/BaseEntity.class | Bin 3739 -> 3739 bytes ...ngVo$BuildingItem$FloorItem$RoomItem.class | Bin 4559 -> 4559 bytes .../BuildingVo$BuildingItem$FloorItem.class | Bin 4013 -> 4013 bytes .../dao/base/BuildingVo$BuildingItem.class | Bin 3881 -> 3881 bytes .../ew/gerocomium/dao/base/BuildingVo.class | Bin 3748 -> 3748 bytes .../gerocomium/service/common/BedFunc.class | Bin 12773 -> 12781 bytes .../service/common/ConsultFunc.class | Bin 6823 -> 6827 bytes .../service/common/ContractFunc.class | Bin 6823 -> 6827 bytes .../gerocomium/service/common/RoomFunc.class | Bin 13820 -> 13824 bytes .../service/common/VisitPlanFunc.class | Bin 8345 -> 8361 bytes 253 files changed, 7975 insertions(+), 4180 deletions(-) delete mode 100644 client/src/components/ProTable/Grid/components/GridItem.vue delete mode 100644 client/src/components/ProTable/Grid/index.vue delete mode 100644 client/src/components/ProTable/Grid/interface/index.ts delete mode 100644 client/src/components/ProTable/IconPark/index.vue delete mode 100644 client/src/components/ProTable/ProTable/components/ColSetting.vue delete mode 100644 client/src/components/ProTable/ProTable/components/Pagination.vue delete mode 100644 client/src/components/ProTable/ProTable/components/TableColumn.vue delete mode 100644 client/src/components/ProTable/ProTable/index.md delete mode 100644 client/src/components/ProTable/ProTable/index.vue delete mode 100644 client/src/components/ProTable/ProTable/interface/index.ts delete mode 100644 client/src/components/ProTable/ReImageVerify/index.ts delete mode 100644 client/src/components/ProTable/ReImageVerify/src/hooks.ts delete mode 100644 client/src/components/ProTable/ReImageVerify/src/index.vue delete mode 100644 client/src/components/ProTable/SearchForm/components/SearchFormItem.vue delete mode 100644 client/src/components/ProTable/SearchForm/index.vue delete mode 100644 client/src/components/ProTable/SvgIcon/index.vue delete mode 100644 client/src/components/ProTable/elderListDialog/index.vue delete mode 100644 client/src/components/ProTable/my-card/my-card.vue delete mode 100644 client/src/components/ProTable/treeDialog/index.vue delete mode 100644 client/src/components/ProTable/upload/image/index.vue delete mode 100644 client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c3a830d..481517b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,12 @@ + + + - + + + @@ -15,10 +20,10 @@ - + { + "customColor": "", + "associatedIndex": 1 +} @@ -28,7 +33,7 @@ "keyToString": { "RunOnceActivity.ShowReadmeOnStart": "true", "RunOnceActivity.git.unshallow": "true", - "git-widget-placeholder": "feature/lxf", + "git-widget-placeholder": "develop", "kotlin-language-version-configured": "true", "last_opened_file_path": "D:/SC/Nursing-home-management-system", "node.js.detected.package.eslint": "true", @@ -37,6 +42,7 @@ "node.js.selected.package.tslint": "(autodetect)", "nodejs_package_manager_path": "npm", "settings.editor.selected.configurable": "MavenSettings", + "ts.external.directory.path": "D:\\xx\\Nursing-home-management-system\\client\\node_modules\\typescript\\lib", "vue.rearranger.settings.migration": "true" } }]]> @@ -57,6 +63,7 @@ 1742217574434 + diff --git a/client/package-lock.json b/client/package-lock.json index ef537ad..cf67628 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -18,6 +18,7 @@ "cz-customizable": "^7.0.0", "echarts": "^5.4.1", "element-plus": "^2.2.28", + "file-saver": "^2.0.5", "global": "^4.4.0", "husky": "^8.0.2", "screenfull": "^6.0.2", @@ -26,11 +27,13 @@ "unplugin-vue-components": "^0.22.12", "vue": "^3.2.13", "vue-i18n": "^9.2.2", + "vue-property-decorator": "^9.1.2", "vue-router": "^4.0.3", "vuex": "^4.0.0", "vuex-persistedstate": "^4.1.0" }, "devDependencies": { + "@types/file-saver": "^2.0.5", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "@vue/cli-plugin-babel": "~5.0.0", @@ -2982,6 +2985,13 @@ "@types/range-parser": "*" } }, + "node_modules/@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -4940,18 +4950,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-jsx/node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -8299,6 +8297,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", @@ -15708,6 +15712,16 @@ "@vue/shared": "3.2.45" } }, + "node_modules/vue-class-component": { + "version": "7.2.6", + "resolved": "https://registry.npmmirror.com/vue-class-component/-/vue-class-component-7.2.6.tgz", + "integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "vue": "^2.0.0" + } + }, "node_modules/vue-demi": { "version": "0.13.11", "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", @@ -15861,6 +15875,16 @@ "node": ">=8.9.0" } }, + "node_modules/vue-property-decorator": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz", + "integrity": "sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==", + "license": "MIT", + "peerDependencies": { + "vue": "*", + "vue-class-component": "*" + } + }, "node_modules/vue-router": { "version": "4.1.6", "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz", @@ -18548,6 +18572,12 @@ "@types/range-parser": "*" } }, + "@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -19967,14 +19997,7 @@ "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "requires": {}, - "dependencies": { - "acorn": { - "version": "7.4.1", - "dev": true, - "peer": true - } - } + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -22289,6 +22312,11 @@ "flat-cache": "^3.0.4" } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", @@ -27373,6 +27401,13 @@ } } }, + "vue-class-component": { + "version": "7.2.6", + "resolved": "https://registry.npmmirror.com/vue-class-component/-/vue-class-component-7.2.6.tgz", + "integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==", + "peer": true, + "requires": {} + }, "vue-demi": { "version": "0.13.11", "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", @@ -27464,6 +27499,12 @@ } } }, + "vue-property-decorator": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz", + "integrity": "sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==", + "requires": {} + }, "vue-router": { "version": "4.1.6", "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz", diff --git a/client/src/apis/bedPanorama.ts b/client/src/apis/bedPanorama.ts index 80e8fab..1474293 100644 --- a/client/src/apis/bedPanorama.ts +++ b/client/src/apis/bedPanorama.ts @@ -1,18 +1,32 @@ +// 从 "@/utils" 模块导入 http 对象,该对象可能封装了 HTTP 请求方法 import { http } from "@/utils"; +// 定义一个名为 IListRoomByKey 的接口,用于描述获取房间列表时请求参数的数据结构 interface IListRoomByKey { + // 楼栋 ID,类型为字符串 buildingId: string; + // 楼层 ID,类型为字符串 floorId: string; + // 老人姓名,类型为字符串 elderName: string; } -// 获取楼栋列表 +/** + * 获取楼栋列表 + * @returns 一个 Promise,解析为包含楼栋列表的响应 + */ export async function listBuilding() { + // 发起一个 GET 请求到指定的 API 端点,用于获取楼栋列表 return http.get("/api/bedPanorama/listBuilding"); } -// 获取楼层列表 +/** + * 根据楼栋 ID 获取楼层列表 + * @param buildingId - 用于筛选楼层列表的楼栋 ID + * @returns 一个 Promise,解析为包含楼层列表的响应 + */ export function listFloorByBuildingId(buildingId: string) { + // 发起一个 GET 请求到指定的 API 端点,携带楼栋 ID 作为参数,用于获取对应楼栋的楼层列表 return http.get("/api/bedPanorama/listFloorByBuildingId", { params: { buildingId @@ -20,8 +34,13 @@ export function listFloorByBuildingId(buildingId: string) { }); } -// 获取房间列表 +/** + * 根据条件获取房间列表 + * @param data - 包含筛选条件的对象,符合 IListRoomByKey 接口的结构 + * @returns 一个 Promise,解析为包含房间列表的响应 + */ export function listRoomByKey(data: IListRoomByKey) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数,用于获取符合条件的房间列表 return http.get("/api/bedPanorama/listRoomByKey", { params: { ...data diff --git a/client/src/apis/bookManage.ts b/client/src/apis/bookManage.ts index 171a1d8..46c4db0 100644 --- a/client/src/apis/bookManage.ts +++ b/client/src/apis/bookManage.ts @@ -1,45 +1,79 @@ +// 从 '@/utils' 模块导入 http 对象,该对象可能封装了 HTTP 请求的方法,用于后续发起网络请求 import { http } from '@/utils' +// 定义一个接口 ISearchFormReserveByKey,用于描述分页查询预定时请求参数的数据结构 interface ISearchFormReserveByKey { + // 当前页码,类型为数字 pageNum: number + // 每页显示的数量,类型为数字 pageSize: number + // 老人姓名,可选参数,类型为字符串 elderName?: string + // 付款人电话,可选参数,类型为字符串 payerPhone?: string } +// 定义一个导出的接口 IPageSearchElderByKey,用于描述分页搜索老人时请求参数的数据结构 export interface IPageSearchElderByKey { + // 当前页码,类型为数字 pageNum: number + // 每页显示的数量,类型为数字 pageSize: number + // 老人姓名,可选参数,类型为字符串 elderName?: string + // 老人电话,可选参数,类型为字符串 elderPhone?: string } +// 定义一个接口 IAddReserve,用于描述新增预定时请求体的数据结构 interface IAddReserve { + // 床位 ID,类型为字符串 bedId: string + // 定金,类型为字符串 deposit: string + // 截止日期,类型为字符串 dueDate: string + // 老人地址,类型为字符串 elderAddress: string + // 老人年龄,类型为字符串 elderAge: string + // 老人姓名,类型为字符串 elderName: string + // 老人电话,类型为字符串 elderPhone: string + // 老人性别,类型为字符串 elderSex: string + // 身份证号码,类型为字符串 idNum: string + // 付款人姓名,类型为字符串 payerName: string + // 付款人电话,类型为字符串 payerPhone: string + // 工作人员 ID,类型为字符串 staffId: string } +// 定义一个接口 IGetReserveById,用于描述根据预定编号和老人编号获取预定信息时请求参数的数据结构 interface IGetReserveById { + // 老人 ID,类型为字符串 elderId: string + // 预定 ID,类型为字符串 reserveId: string } +// 定义一个接口 IRefund,用于描述退款时请求体的数据结构 interface IRefund { + // 预定 ID,类型为字符串 reserveId: string } -// 分页查询预定 +/** + * 分页查询预定信息 + * @param data - 包含分页和查询条件的对象,符合 ISearchFormReserveByKey 接口 + * @returns 一个 Promise,解析为包含分页查询预定结果的响应 + */ export async function pageReserveByKey(data: ISearchFormReserveByKey) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数 return http.get('/api/reserve/pageReserveByKey', { params: { ...data @@ -47,8 +81,13 @@ export async function pageReserveByKey(data: ISearchFormReserveByKey) { }) } -// 分页搜索老人 +/** + * 分页搜索老人信息 + * @param data - 包含分页和查询条件的对象,符合 IPageSearchElderByKey 接口 + * @returns 一个 Promise,解析为包含分页搜索老人结果的响应 + */ export function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数 return http.get('/api/reserve/pageSearchElderByKey', { params: { ...data @@ -56,23 +95,41 @@ export function pageSearchElderByKey(data: IPageSearchElderByKey) { }) } -// 获取营销人员 +/** + * 获取营销人员列表 + * @returns 一个 Promise,解析为包含营销人员列表的响应 + */ export function listReserveStaff() { + // 发起一个 GET 请求到指定的 API 端点,用于获取营销人员列表 return http.get('/api/reserve/listReserveStaff') } -// 获取楼栋树 +/** + * 获取楼栋树信息 + * @returns 一个 Promise,解析为包含楼栋树信息的响应 + */ export function getBuildTree() { + // 发起一个 GET 请求到指定的 API 端点,用于获取楼栋树信息 return http.get('/api/reserve/getBuildTree') } -// 新增预定 +/** + * 新增预定信息 + * @param data - 包含新增预定所需信息的对象,符合 IAddReserve 接口 + * @returns 一个 Promise,解析为新增预定操作的响应 + */ export function addReserve(data: IAddReserve) { + // 发起一个 POST 请求到指定的 API 端点,将 data 对象作为请求体 return http.post('/api/reserve/addReserve', data) } -// 根据预定编号和老人编号获取预定信息 +/** + * 根据预定编号和老人编号获取预定信息 + * @param data - 包含预定编号和老人编号的对象,符合 IGetReserveById 接口 + * @returns 一个 Promise,解析为包含指定预定信息的响应 + */ export function getReserveById(data: IGetReserveById) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数 return http.get('/api/reserve/getReserveByReserveIdAndElderId', { params: { ...data @@ -80,7 +137,12 @@ export function getReserveById(data: IGetReserveById) { }) } -// 退款 +/** + * 进行退款操作 + * @param data - 包含退款所需预定 ID 的对象,符合 IRefund 接口 + * @returns 一个 Promise,解析为退款操作的响应 + */ export function refund(data: IRefund) { - return http.put('/api/reserve/refund',data) + // 发起一个 PUT 请求到指定的 API 端点,将 data 对象作为请求体 + return http.put('/api/reserve/refund', data) } diff --git a/client/src/apis/build.ts b/client/src/apis/build.ts index 925cfac..eb5871f 100644 --- a/client/src/apis/build.ts +++ b/client/src/apis/build.ts @@ -1,64 +1,103 @@ +// 从 "@/utils" 模块导入 http 对象,用于发起 HTTP 请求 import { http } from "@/utils"; +// 定义 IPageBedByKey 接口,用于分页查询床位时的参数结构 interface IPageBedByKey { + // 楼栋 ID buildId: string; + // 楼层 ID floorId: string; + // 房间 ID roomId: string; + // 床位状态标识 bedFlag: string; } +// 定义 IAddBuilding 接口,用于新增楼栋时的请求数据结构 interface IAddBuilding { + // 楼栋 ID id: string; + // 楼栋名称 name: string; + // 楼层数量 floorNum: string; } +// 定义 IGetBuildingById 接口,用于根据编号获取楼栋时的参数结构 interface IGetBuildingById { + // 楼栋 ID buildingId: string; } +// 定义 IAddFloor 接口,用于新增楼层时的请求数据结构 interface IAddFloor { + // 楼层 ID id: string; + // 楼层名称 name: string; + // 房间数量 roomNum: string; + // 所属楼栋 ID buildingId: string; + // 楼层限制相关信息 floorLimit: string; } +// 定义 IGetFloorById 接口,用于根据编号获取楼层时的参数结构 interface IGetFloorById { + // 楼层 ID floorId: string; } +// 定义 IAddRoom 接口,用于新增房间时的请求数据结构 interface IAddRoom { + // 房间 ID id: string; + // 房间名称 name: string; + // 房间类型 ID typeId: string; + // 床位数量 bedNum: string; + // 所属楼层 ID floorId: string; + // 房间限制相关信息 roomLimit: string; } +// 定义 IGetRoomById 接口,用于根据编号获取房间时的参数结构 interface IGetRoomById { + // 房间 ID roomId: string; } +// 定义 IDeleteNode 接口,用于删除节点时的参数结构 interface IDeleteNode { + // 节点 ID id: string; + // 节点标识 mark: string; } +// 定义 IAddBed 接口,用于新增床位时的请求数据结构 interface IAddBed { + // 床位 ID id: string; + // 床位名称 name: string; + // 所属房间 ID roomId: string; + // 床位限制相关信息 bedLimit: string; } +// 定义 IGetBedById 接口,用于根据编号获取床位时的参数结构 interface IGetBedById { + // 床位 ID bedId: string; } -// 床位状态 +// 定义床位状态列表,包含每个状态的标签和对应的值 export const IBedFlagList = [ { label: "空闲", value: "空闲" }, { label: "预定", value: "预定" }, @@ -66,13 +105,22 @@ export const IBedFlagList = [ { label: "退住审核", value: "退住审核" } ]; -// 获取楼栋-楼层-房间树 +/** + * 获取楼栋 - 楼层 - 房间树 + * @returns 一个 Promise,解析为包含楼栋 - 楼层 - 房间树数据的响应 + */ export async function getNoBedTree() { + // 发起 GET 请求到 /api/build/getNoBedTree 接口获取数据 return http.get("/api/build/getNoBedTree"); } -// 分页查询床位 +/** + * 分页查询床位 + * @param data - 包含分页查询床位所需参数的对象,符合 IPageBedByKey 接口 + * @returns 一个 Promise,解析为包含分页查询床位结果的响应 + */ export async function pageBedByKey(data: IPageBedByKey) { + // 发起 GET 请求到 /api/build/pageBedByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/build/pageBedByKey", { params: { ...data @@ -80,13 +128,23 @@ export async function pageBedByKey(data: IPageBedByKey) { }); } -// 新增楼栋 +/** + * 新增楼栋 + * @param data - 包含新增楼栋所需信息的对象,符合 IAddBuilding 接口 + * @returns 一个 Promise,解析为新增楼栋操作的响应 + */ export function addBuilding(data: IAddBuilding) { + // 发起 POST 请求到 /api/build/addBuilding 接口,将 data 作为请求体 return http.post("/api/build/addBuilding", data); } -// 根据编号获取楼栋 +/** + * 根据编号获取楼栋 + * @param data - 包含要获取的楼栋编号的对象,符合 IGetBuildingById 接口 + * @returns 一个 Promise,解析为包含指定楼栋信息的响应 + */ export async function getBuildingById(data: IGetBuildingById) { + // 发起 GET 请求到 /api/build/getBuildingById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getBuildingById", { params: { ...data @@ -94,18 +152,33 @@ export async function getBuildingById(data: IGetBuildingById) { }); } -// 编辑楼栋 +/** + * 编辑楼栋 + * @param data - 包含要编辑的楼栋信息的对象,符合 IAddBuilding 接口 + * @returns 一个 Promise,解析为编辑楼栋操作的响应 + */ export function editBuilding(data: IAddBuilding) { + // 发起 PUT 请求到 /api/build/editBuilding 接口,将 data 作为请求体 return http.put("/api/build/editBuilding", data); } -// 新增楼层 +/** + * 新增楼层 + * @param data - 包含新增楼层所需信息的对象,符合 IAddFloor 接口 + * @returns 一个 Promise,解析为新增楼层操作的响应 + */ export function addFloor(data: IAddFloor) { + // 发起 POST 请求到 /api/build/addFloor 接口,将 data 作为请求体 return http.post("/api/build/addFloor", data); } -// 根据编号获取楼层 +/** + * 根据编号获取楼层 + * @param data - 包含要获取的楼层编号的对象,符合 IGetFloorById 接口 + * @returns 一个 Promise,解析为包含指定楼层信息的响应 + */ export async function getFloorById(data: IGetFloorById) { + // 发起 GET 请求到 /api/build/getFloorById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getFloorById", { params: { ...data @@ -113,23 +186,42 @@ export async function getFloorById(data: IGetFloorById) { }); } -// 编辑楼层 +/** + * 编辑楼层 + * @param data - 包含要编辑的楼层信息的对象,符合 IAddFloor 接口 + * @returns 一个 Promise,解析为编辑楼层操作的响应 + */ export function editFloor(data: IAddFloor) { + // 发起 PUT 请求到 /api/build/editFloor 接口,将 data 作为请求体 return http.put("/api/build/editFloor", data); } -// 获取房间类型列表 +/** + * 获取房间类型列表 + * @returns 一个 Promise,解析为包含房间类型列表数据的响应 + */ export async function listRoomType() { + // 发起 GET 请求到 /api/build/listRoomType 接口获取数据 return http.get("/api/build/listRoomType"); } -// 新增房间 +/** + * 新增房间 + * @param data - 包含新增房间所需信息的对象,符合 IAddRoom 接口 + * @returns 一个 Promise,解析为新增房间操作的响应 + */ export function addRoom(data: IAddRoom) { + // 发起 POST 请求到 /api/build/addRoom 接口,将 data 作为请求体 return http.post("/api/build/addRoom", data); } -// 根据编号获取房间 +/** + * 根据编号获取房间 + * @param data - 包含要获取的房间编号的对象,符合 IGetRoomById 接口 + * @returns 一个 Promise,解析为包含指定房间信息的响应 + */ export async function getRoomById(data: IGetRoomById) { + // 发起 GET 请求到 /api/build/getRoomById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getRoomById", { params: { ...data @@ -137,13 +229,23 @@ export async function getRoomById(data: IGetRoomById) { }); } -// 编辑房间 +/** + * 编辑房间 + * @param data - 包含要编辑的房间信息的对象,符合 IAddRoom 接口 + * @returns 一个 Promise,解析为编辑房间操作的响应 + */ export function editRoom(data: IAddRoom) { + // 发起 PUT 请求到 /api/build/editRoom 接口,将 data 作为请求体 return http.put("/api/build/editRoom", data); } -// 删除节点 +/** + * 删除节点 + * @param data - 包含要删除的节点信息的对象,符合 IDeleteNode 接口 + * @returns 一个 Promise,解析为删除节点操作的响应 + */ export async function deleteNode(data: IDeleteNode) { + // 发起 DELETE 请求到 /api/build/deleteNode 接口,将 data 对象展开作为请求参数 return http.delete("/api/build/deleteNode", { params: { ...data @@ -151,13 +253,23 @@ export async function deleteNode(data: IDeleteNode) { }); } -// 新增床位 +/** + * 新增床位 + * @param data - 包含新增床位所需信息的对象,符合 IAddBed 接口 + * @returns 一个 Promise,解析为新增床位操作的响应 + */ export function addBed(data: IAddBed) { + // 发起 POST 请求到 /api/build/addBed 接口,将 data 作为请求体 return http.post("/api/build/addBed", data); } -// 根据编号获取床位 +/** + * 根据编号获取床位 + * @param data - 包含要获取的床位编号的对象,符合 IGetBedById 接口 + * @returns 一个 Promise,解析为包含指定床位信息的响应 + */ export async function getBedById(data: IGetBedById) { + // 发起 GET 请求到 /api/build/getBedById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getBedById", { params: { ...data @@ -165,13 +277,23 @@ export async function getBedById(data: IGetBedById) { }); } -// 编辑床位 +/** + * 编辑床位 + * @param data - 包含要编辑的床位信息的对象,符合 IAddBed 接口 + * @returns 一个 Promise,解析为编辑床位操作的响应 + */ export function editBed(data: IAddBed) { + // 发起 PUT 请求到 /api/build/editBed 接口,将 data 作为请求体 return http.put("/api/build/editBed", data); } -// 删除床位 +/** + * 删除床位 + * @param data - 包含要删除的床位编号的对象,符合 IGetBedById 接口 + * @returns 一个 Promise,解析为删除床位操作的响应 + */ export async function deleteBed(data: IGetBedById) { + // 发起 DELETE 请求到 /api/build/deleteBed 接口,将 data 对象展开作为请求参数 return http.delete("/api/build/deleteBed", { params: { ...data diff --git a/client/src/apis/cateringSet.ts b/client/src/apis/cateringSet.ts index 9135182..1d4ae24 100644 --- a/client/src/apis/cateringSet.ts +++ b/client/src/apis/cateringSet.ts @@ -1,26 +1,50 @@ +// 从 "@/utils" 模块导入 http 对象,用于发起 HTTP 请求 import { http } from "@/utils"; +// 从 "@/apis/dishes" 模块导入 IPageDishesByKey 接口,用于分页查询菜品时的参数类型定义 import { IPageDishesByKey } from "@/apis/dishes"; +/** + * 定义 IPageCateringSetByKey 接口,用于分页查询餐饮套餐时的参数结构 + */ interface IPageCateringSetByKey { - name:string; + // 名称,用于筛选餐饮套餐 + name: string; + // 套餐名称,由于后台与前端组件封装要求,该字段与 name 可能存在关联 setName: string; } +/** + * 定义 IAddCateringSet 接口,用于新增餐饮套餐时的请求数据结构 + */ interface IAddCateringSet { + // 餐饮套餐的 ID id: number; + // 餐饮套餐的名称 name: string; + // 餐饮套餐的月价格 monthPrice: number; - dishesIdList: any ; + // 菜品 ID 列表,类型为 any,需根据实际情况调整 + dishesIdList: any; } +/** + * 定义 IGetCateringSetById 接口,用于根据编号查询餐饮套餐时的参数结构 + */ interface IGetCateringSetById { - setId: string + // 餐饮套餐的 ID + setId: string; } -// 分页查询餐饮套餐 +/** + * 分页查询餐饮套餐 + * @param data - 包含分页查询餐饮套餐所需参数的对象,符合 IPageCateringSetByKey 接口 + * @returns 一个 Promise,解析为包含分页查询餐饮套餐结果的响应 + */ export async function pageCateringSetByKey(data: IPageCateringSetByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, 'name') ? (data.setName = data.name) : '' + // 由于后台返回的字段与前端表单数据的 prop 不一样,而组件封装要求字段一致 + // 所以如果 data 对象中有 'name' 字段,则将其值赋给 'setName' 字段 + Reflect.has(data, 'name') ? (data.setName = data.name) : ''; + // 发起 GET 请求到 /api/cateringSet/pageCateringSetByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/cateringSet/pageCateringSetByKey", { params: { ...data @@ -28,13 +52,22 @@ export async function pageCateringSetByKey(data: IPageCateringSetByKey) { }); } -// 获取菜品分类 +/** + * 获取菜品分类 + * @returns 一个 Promise,解析为包含菜品分类列表的响应 + */ export function listDishesType() { + // 发起 POST 请求到 /api/cateringSet/listDishesType 接口获取菜品分类数据 return http.post("/api/cateringSet/listDishesType"); } -// 分页查询菜品 +/** + * 分页查询菜品 + * @param data - 包含分页查询菜品所需参数的对象,符合 IPageDishesByKey 接口 + * @returns 一个 Promise,解析为包含分页查询菜品结果的响应 + */ export async function pageDishesByKey(data: IPageDishesByKey) { + // 发起 GET 请求到 /api/cateringSet/pageDishesByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/cateringSet/pageDishesByKey", { params: { ...data @@ -42,13 +75,23 @@ export async function pageDishesByKey(data: IPageDishesByKey) { }); } -// 新增餐饮套餐 +/** + * 新增餐饮套餐 + * @param data - 包含新增餐饮套餐所需信息的对象,符合 IAddCateringSet 接口 + * @returns 一个 Promise,解析为新增餐饮套餐操作的响应 + */ export function addCateringSet(data: IAddCateringSet) { + // 发起 POST 请求到 /api/cateringSet/addCateringSet 接口,将 data 作为请求体 return http.post("/api/cateringSet/addCateringSet", data); } -// 根据编号查询餐饮套餐 +/** + * 根据编号查询餐饮套餐 + * @param data - 包含要查询的餐饮套餐编号的对象,符合 IGetCateringSetById 接口 + * @returns 一个 Promise,解析为包含指定餐饮套餐信息的响应 + */ export async function getCateringSetById(data: IGetCateringSetById) { + // 发起 GET 请求到 /api/cateringSet/getCateringSetById 接口,将 data 对象展开作为请求参数 return http.get("/api/cateringSet/getCateringSetById", { params: { ...data @@ -56,13 +99,23 @@ export async function getCateringSetById(data: IGetCateringSetById) { }); } -// 编辑餐饮套餐 +/** + * 编辑餐饮套餐 + * @param data - 包含要编辑的餐饮套餐信息的对象,符合 IAddCateringSet 接口 + * @returns 一个 Promise,解析为编辑餐饮套餐操作的响应 + */ export function editCateringSet(data: IAddCateringSet) { + // 发起 PUT 请求到 /api/cateringSet/editCateringSet 接口,将 data 作为请求体 return http.put("/api/cateringSet/editCateringSet", data); } -// 删除餐饮套餐 +/** + * 删除餐饮套餐 + * @param data - 包含要删除的餐饮套餐编号的对象,符合 IGetCateringSetById 接口 + * @returns 一个 Promise,解析为删除餐饮套餐操作的响应 + */ export async function deleteCateringSet(data: IGetCateringSetById) { + // 发起 DELETE 请求到 /api/cateringSet/deleteCateringSet 接口,将 data 对象展开作为请求参数 return http.delete("/api/cateringSet/deleteCateringSet", { params: { ...data diff --git a/client/src/apis/checkContract.ts b/client/src/apis/checkContract.ts index c658840..c5a2b1e 100644 --- a/client/src/apis/checkContract.ts +++ b/client/src/apis/checkContract.ts @@ -1,44 +1,87 @@ +// 从 "@/utils" 模块导入 http 对象,用于发起 HTTP 请求 import { http } from "@/utils"; +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口,用于分页搜索老人时的参数类型定义 import { IPageSearchElderByKey } from "@/apis/bookManage"; +/** + * 定义 IPageCheckContractByKey 接口,用于分页查询入住签约时的参数结构 + */ interface IPageCheckContractByKey { + // 姓名,用于筛选入住签约记录 name: string; + // 性别,用于筛选入住签约记录 sex: string; + // 身份证号码,用于筛选入住签约记录 idNum: string; } +/** + * 定义 IAddCheckContract 接口,用于新增入住签约时的请求数据结构 + */ interface IAddCheckContract { + // 入住签约的 ID id: string; + // 护理等级 ID nursingGradeId: string; + // 餐饮套餐 ID cateringSetId: string; + // 床位 ID bedId: string; + // 姓名 name: string; + // 身份证号码 idNum: string; + // 年龄 age: string; + // 性别 sex: string; + // 电话 phone: string; + // 地址 address: string; + // 工作人员 ID staffId: string; + // 签约日期 signDate: string; + // 开始日期 startDate: string; + // 结束日期 endDate: string; + // 紧急联系人查询列表,包含多个紧急联系人信息 operateEmergencyContactQueryList: IEmergencyContact[]; } +/** + * 定义 IEmergencyContact 接口,用于表示紧急联系人的信息结构 + */ interface IEmergencyContact { + // 姓名 name: string; + // 电话 phone: string; + // 邮箱 email: string; + // 关系 relation: string; + // 接收标志 receiveFlag: string; } +/** + * 定义 IGetCheckContractById 接口,用于根据老人编号查询入住签约时的参数结构 + */ interface IGetCheckContractById { - elderId: string + // 老人 ID + elderId: string; } -// 分页查询入住签约 +/** + * 分页查询入住签约 + * @param data - 包含分页查询入住签约所需参数的对象,符合 IPageCheckContractByKey 接口 + * @returns 一个 Promise,解析为包含分页查询入住签约结果的响应 + */ export async function pageCheckContractByKey(data: IPageCheckContractByKey) { + // 发起 GET 请求到 /api/checkContract/pageCheckContractByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/checkContract/pageCheckContractByKey", { params: { ...data @@ -46,8 +89,13 @@ export async function pageCheckContractByKey(data: IPageCheckContractByKey) { }); } -// 分页搜索老人 +/** + * 分页搜索老人 + * @param data - 包含分页搜索老人所需参数的对象,符合 IPageSearchElderByKey 接口 + * @returns 一个 Promise,解析为包含分页搜索老人结果的响应 + */ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 发起 GET 请求到 /api/checkContract/pageSearchElderByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/checkContract/pageSearchElderByKey", { params: { ...data @@ -55,13 +103,22 @@ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { }); } -// 获取护理等级列表 +/** + * 获取护理等级列表 + * @returns 一个 Promise,解析为包含护理等级列表的响应 + */ export async function listNurseGrade() { + // 发起 GET 请求到 /api/checkContract/listNurseGrade 接口获取护理等级数据 return http.get("/api/checkContract/listNurseGrade"); } -// 根据编号查询护理等级 +/** + * 根据编号查询护理等级 + * @param nurseGradeId - 要查询的护理等级 ID + * @returns 一个 Promise,解析为包含指定护理等级信息的响应 + */ export async function getNurseGradeById(nurseGradeId: string) { + // 发起 GET 请求到 /api/checkContract/getNurseGradeById 接口,将 nurseGradeId 作为请求参数 return http.get("/api/checkContract/getNurseGradeById", { params: { nurseGradeId @@ -69,13 +126,22 @@ export async function getNurseGradeById(nurseGradeId: string) { }); } -// 获取餐饮套餐列表 +/** + * 获取餐饮套餐列表 + * @returns 一个 Promise,解析为包含餐饮套餐列表的响应 + */ export async function listCateringSet() { + // 发起 GET 请求到 /api/checkContract/listCateringSet 接口获取餐饮套餐数据 return http.get("/api/checkContract/listCateringSet"); } -// 根据编号查询餐饮套餐 +/** + * 根据编号查询餐饮套餐 + * @param cateringSetId - 要查询的餐饮套餐 ID + * @returns 一个 Promise,解析为包含指定餐饮套餐信息的响应 + */ export async function getCateringSetById(cateringSetId: string) { + // 发起 GET 请求到 /api/checkContract/getCateringSetById 接口,将 cateringSetId 作为请求参数 return http.get("/api/checkContract/getCateringSetById", { params: { cateringSetId @@ -83,13 +149,22 @@ export async function getCateringSetById(cateringSetId: string) { }); } -// 获取楼栋树 +/** + * 获取楼栋树 + * @returns 一个 Promise,解析为包含楼栋树信息的响应 + */ export async function getBuildTree() { + // 发起 GET 请求到 /api/checkContract/getBuildTree 接口获取楼栋树数据 return http.get("/api/checkContract/getBuildTree"); } -// 根据编号查询床位 +/** + * 根据编号查询床位 + * @param bedId - 要查询的床位 ID + * @returns 一个 Promise,解析为包含指定床位信息的响应 + */ export async function getBedById(bedId: string) { + // 发起 GET 请求到 /api/checkContract/getBedById 接口,将 bedId 作为请求参数 return http.get("/api/checkContract/getBedById", { params: { bedId @@ -97,18 +172,32 @@ export async function getBedById(bedId: string) { }); } -// 获取营销人员 +/** + * 获取营销人员 + * @returns 一个 Promise,解析为包含营销人员列表的响应 + */ export async function listReserveStaff() { + // 发起 GET 请求到 /api/checkContract/listReserveStaff 接口获取营销人员数据 return http.get("/api/checkContract/listReserveStaff"); } -// 新增入住签约 +/** + * 新增入住签约 + * @param data - 包含新增入住签约所需信息的对象,符合 IAddCheckContract 接口 + * @returns 一个 Promise,解析为新增入住签约操作的响应 + */ export function addCheckContract(data: IAddCheckContract) { + // 发起 POST 请求到 /api/checkContract/addCheckContract 接口,将 data 作为请求体 return http.post("/api/checkContract/addCheckContract", data); } -// 根据老人编号查询入住签约 +/** + * 根据老人编号查询入住签约 + * @param data - 包含要查询的老人编号的对象,符合 IGetCheckContractById 接口 + * @returns 一个 Promise,解析为包含指定入住签约信息的响应 + */ export async function getCheckContractById(data: IGetCheckContractById) { + // 发起 GET 请求到 /api/checkContract/getCheckContractById 接口,将 data 对象展开作为请求参数 return http.get("/api/checkContract/getCheckContractById", { params: { ...data @@ -116,13 +205,23 @@ export async function getCheckContractById(data: IGetCheckContractById) { }); } -// 编辑入住签约 +/** + * 编辑入住签约 + * @param data - 包含要编辑的入住签约信息的对象,符合 IAddCheckContract 接口 + * @returns 一个 Promise,解析为编辑入住签约操作的响应 + */ export function editCheckContract(data: IAddCheckContract) { + // 发起 PUT 请求到 /api/checkContract/editCheckContract 接口,将 data 作为请求体 return http.put("/api/checkContract/editCheckContract", data); } -// 删除入住签约 +/** + * 删除入住签约 + * @param data - 包含要删除的入住签约编号的对象,符合 IGetCheckContractById 接口 + * @returns 一个 Promise,解析为删除入住签约操作的响应 + */ export async function deleteCheckContract(data: IGetCheckContractById) { + // 发起 DELETE 请求到 /api/checkContract/deleteCheckContract 接口,将 data 对象展开作为请求参数 return http.delete("/api/checkContract/deleteCheckContract", { params: { ...data diff --git a/client/src/apis/consume.ts b/client/src/apis/consume.ts index 2f2a005..69bb33b 100644 --- a/client/src/apis/consume.ts +++ b/client/src/apis/consume.ts @@ -1,13 +1,25 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageConsumeByKey,用于描述分页查询消费记录时的请求参数结构 interface IPageConsumeByKey { + // 老人姓名,用于筛选消费记录,类型为字符串 elderName: string; + // 开始时间,用于筛选消费记录的时间范围,类型为字符串 startTime: string; + // 结束时间,用于筛选消费记录的时间范围,类型为字符串 endTime: string; } -// 分页查询消费记录 +/** + * 定义一个异步函数 pageConsumeByKey,用于分页查询消费记录 + * @param data - 一个符合 IPageConsumeByKey 接口的对象,包含查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询消费记录的响应结果 + */ export async function pageConsumeByKey(data: IPageConsumeByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/consume/pageConsumeByKey" + // 将传入的 data 对象展开作为请求的参数 return http.get("/api/consume/pageConsumeByKey", { params: { ...data diff --git a/client/src/apis/dishes.ts b/client/src/apis/dishes.ts index accd0c3..f647a4a 100644 --- a/client/src/apis/dishes.ts +++ b/client/src/apis/dishes.ts @@ -1,36 +1,60 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IListDishesType,用于描述获取菜品分类列表时的请求参数结构 interface IListDishesType { + // 菜品分类名称,用于筛选菜品分类列表,类型为字符串 dishesTypeName: string; } +// 导出一个接口 IPageDishesByKey,用于描述分页查询菜品时的请求参数结构 export interface IPageDishesByKey { + // 菜品名称,用于筛选菜品,类型为字符串 dishesName: string; + // 菜品类型 ID,用于筛选属于特定类型的菜品,类型为数字 typeId: number; } +// 定义一个接口 IAddDishesType,用于描述新增菜品分类时的数据结构 interface IAddDishesType { + // 菜品分类的 ID,类型为数字 id: number; + // 菜品分类的名称,类型为字符串 name: string; } +// 定义一个接口 IGetDishesTypeById,用于描述根据编号获取菜品分类时的请求参数结构 interface IGetDishesTypeById { + // 菜品分类 ID,类型为字符串 dishesTypeId: string; } +// 定义一个接口 IAddDishes,用于描述新增菜品时的数据结构 interface IAddDishes { + // 菜品的 ID,类型为数字 id: number; + // 菜品的名称,类型为字符串 name: string; + // 菜品的价格,类型为字符串 price: string; + // 菜品所属类型的 ID,类型为数字 typeId: number; } +// 导出一个接口 IGetDishesById,用于描述根据编号获取菜品时的请求参数结构 export interface IGetDishesById { + // 菜品 ID,类型为字符串 dishesId: string; } -// 获取菜品分类列表 +/** + * 定义一个异步函数 listDishesType,用于获取菜品分类列表 + * @param data - 一个符合 IListDishesType 接口的对象,包含获取菜品分类列表所需的参数 + * @returns 一个 Promise 对象,解析后得到的是获取菜品分类列表的响应结果 + */ export async function listDishesType(data: IListDishesType) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/listDishesType" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/listDishesType", { params: { ...data @@ -38,8 +62,14 @@ export async function listDishesType(data: IListDishesType) { }); } -// 分页查询菜品 +/** + * 定义一个异步函数 pageDishesByKey,用于分页查询菜品 + * @param data - 一个符合 IPageDishesByKey 接口的对象,包含分页查询菜品所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询菜品的响应结果 + */ export async function pageDishesByKey(data: IPageDishesByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/pageDishesByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/pageDishesByKey", { params: { ...data @@ -47,13 +77,25 @@ export async function pageDishesByKey(data: IPageDishesByKey) { }); } -// 新增菜品分类 +/** + * 定义一个函数 addDishesType,用于新增菜品分类 + * @param data - 一个符合 IAddDishesType 接口的对象,包含新增菜品分类所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增菜品分类操作的响应结果 + */ export function addDishesType(data: IAddDishesType) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/dishes/addDishesType" + // 将 data 对象作为请求的主体 return http.post("/api/dishes/addDishesType", data); } -// 根据编号获取菜品分类 +/** + * 定义一个异步函数 getDishesTypeById,用于根据编号获取菜品分类 + * @param data - 一个符合 IGetDishesTypeById 接口的对象,包含根据编号获取菜品分类所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取菜品分类的响应结果 + */ export async function getDishesTypeById(data: IGetDishesTypeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/getDishesTypeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/getDishesTypeById", { params: { ...data @@ -61,13 +103,25 @@ export async function getDishesTypeById(data: IGetDishesTypeById) { }); } -// 编辑菜品分类 +/** + * 定义一个函数 editDishesType,用于编辑菜品分类 + * @param data - 一个符合 IAddDishesType 接口的对象,包含编辑菜品分类所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑菜品分类操作的响应结果 + */ export function editDishesType(data: IAddDishesType) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/dishes/editDishesType" + // 将 data 对象作为请求的主体 return http.put("/api/dishes/editDishesType", data); } -// 删除菜品分类 +/** + * 定义一个异步函数 deleteDishesType,用于删除菜品分类 + * @param data - 一个符合 IGetDishesTypeById 接口的对象,包含删除菜品分类所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除菜品分类操作的响应结果 + */ export async function deleteDishesType(data: IGetDishesTypeById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/dishes/deleteDishesType" + // 将 data 对象展开作为请求的参数 return http.delete("/api/dishes/deleteDishesType", { params: { ...data @@ -75,13 +129,25 @@ export async function deleteDishesType(data: IGetDishesTypeById) { }); } -// 新增菜品 +/** + * 定义一个函数 addDishes,用于新增菜品 + * @param data - 一个符合 IAddDishes 接口的对象,包含新增菜品所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增菜品操作的响应结果 + */ export function addDishes(data: IAddDishes) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/dishes/addDishes" + // 将 data 对象作为请求的主体 return http.post("/api/dishes/addDishes", data); } -// 根据编号获取菜品 +/** + * 定义一个异步函数 getDishesById,用于根据编号获取菜品 + * @param data - 一个符合 IGetDishesById 接口的对象,包含根据编号获取菜品所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取菜品的响应结果 + */ export async function getDishesById(data: IGetDishesById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/getDishesById" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/getDishesById", { params: { ...data @@ -89,13 +155,25 @@ export async function getDishesById(data: IGetDishesById) { }); } -// 编辑菜品 +/** + * 定义一个函数 editDishes,用于编辑菜品 + * @param data - 一个符合 IAddDishes 接口的对象,包含编辑菜品所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑菜品操作的响应结果 + */ export function editDishes(data: IAddDishes) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/dishes/editDishes" + // 将 data 对象作为请求的主体 return http.put("/api/dishes/editDishes", data); } -// 删除菜品 +/** + * 定义一个异步函数 deleteDishes,用于删除菜品 + * @param data - 一个符合 IGetDishesById 接口的对象,包含删除菜品所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除菜品操作的响应结果 + */ export async function deleteDishes(data: IGetDishesById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/dishes/deleteDishes" + // 将 data 对象展开作为请求的参数 return http.delete("/api/dishes/deleteDishes", { params: { ...data diff --git a/client/src/apis/home.ts b/client/src/apis/home.ts index 501dc4e..bdd99c2 100644 --- a/client/src/apis/home.ts +++ b/client/src/apis/home.ts @@ -1,25 +1,56 @@ +// 从 '@/utils' 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from '@/utils' -// 可售床位 + +/** + * 定义一个异步函数 getAvailableBed,用于获取可售床位信息 + * @returns 一个 Promise 对象,解析后得到的是获取可售床位信息的响应结果 + */ export async function getAvailableBed() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/availableBed' return http.get('/api/home/availableBed') } -// 业务趋势 + +/** + * 定义一个异步函数 getBusinessTrend,用于获取业务趋势信息 + * @returns 一个 Promise 对象,解析后得到的是获取业务趋势信息的响应结果 + */ export async function getBusinessTrend() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/businessTrend' return http.get('/api/home/businessTrend') } -// 客户来源渠道 + +/** + * 定义一个异步函数 getClientSource,用于获取客户来源渠道信息 + * @returns 一个 Promise 对象,解析后得到的是获取客户来源渠道信息的响应结果 + */ export async function getClientSource() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/clientSource' return http.get('/api/home/clientSource') } -// 本月业绩排行 + +/** + * 定义一个异步函数 getMonthPerformanceRank,用于获取本月业绩排行信息 + * @returns 一个 Promise 对象,解析后得到的是获取本月业绩排行信息的响应结果 + */ export async function getMonthPerformanceRank() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/monthPerformanceRank' return http.get('/api/home/monthPerformanceRank') } -// 今日概览 + +/** + * 定义一个异步函数 getTodayOverview,用于获取今日概览信息 + * @returns 一个 Promise 对象,解析后得到的是获取今日概览信息的响应结果 + */ export async function getTodayOverview() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/todayOverview' return http.get('/api/home/todayOverview') } -// 今日销售跟进 + +/** + * 定义一个异步函数 getTodaySaleFollow,用于获取今日销售跟进信息 + * @returns 一个 Promise 对象,解析后得到的是获取今日销售跟进信息的响应结果 + */ export async function getTodaySaleFollow() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/todaySaleFollow' return http.get('/api/home/todaySaleFollow') } diff --git a/client/src/apis/index.ts b/client/src/apis/index.ts index 067f355..9c44323 100644 --- a/client/src/apis/index.ts +++ b/client/src/apis/index.ts @@ -1,16 +1,29 @@ +// 注释说明这是动态路由的假数据,并且提示该部分代码可以删除 // 动态路由的假数据 可删除 +// 从 '@/utils' 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from '@/utils' +// 注释说明发起请求的时机:在动态设置路由的时候(data => 树形结构 => 路由列表) // 问题:何时发起请求? 在动态设置路由的时候(data => 树形结构 => 路由列表) +/** + * 定义一个函数 getUserRouteList,用于获取用户的路由列表 + * @param uid - 用户 ID,类型为数字,用于作为请求参数来获取对应用户的路由列表 + * @returns 一个 Promise 对象,解析后得到的是获取到的用户路由列表数据(成功时),或者在失败时抛出错误 + */ function getUserRouteList(uid: number) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/user_router_list',请求体包含用户 ID return http .post('/api/user_router_list', { uid }) + // 处理请求成功的情况,直接返回请求得到的数据 .then((data) => data) + // 处理请求失败的情况,捕获错误并重新抛出,以便上层调用者处理 .catch((err) => { throw err }) } +// 导出 getUserRouteList 函数,以便在其他模块中可以导入和使用该函数 export { getUserRouteList } diff --git a/client/src/apis/order.ts b/client/src/apis/order.ts index 5c3a7a5..e98f9dd 100644 --- a/client/src/apis/order.ts +++ b/client/src/apis/order.ts @@ -1,40 +1,70 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; + +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口, +// 用于描述分页搜索老人时的请求参数结构 import { IPageSearchElderByKey } from "@/apis/bookManage"; + +// 从 "@/apis/dishes" 模块导入 IPageDishesByKey 接口, +// 用于描述分页查询菜品时的请求参数结构 import { IPageDishesByKey } from "@/apis/dishes"; +// 定义一个接口 IPageOrderByKey,用于描述分页查询点餐时的请求参数结构 interface IPageOrderByKey { - elderName:string; + // 老人姓名,用于筛选点餐记录,类型为字符串 + elderName: string; + // 老人电话,用于筛选点餐记录,类型为字符串 elderPhone: string; } +// 定义一个接口 IAddOrder,用于描述新增点餐时的数据结构 interface IAddOrder { + // 老人 ID,类型为字符串 elderId: string; + // 就餐方式,类型为字符串 dineType: string; + // 就餐日期,类型为字符串 dineDate: string; + // 点的菜品列表,类型为 any,需根据实际情况调整 orderDishesList: any; } +// 定义一个接口 IGetOrderById,用于描述根据编号查询点餐时的请求参数结构 interface IGetOrderById { + // 菜品 ID,这里可能是点餐记录中的菜品 ID,用于查询特定点餐记录,类型为字符串 dishesId: string; } +// 定义一个接口 ISendOrder,用于描述送餐时的数据结构 interface ISendOrder { + // 订单 ID,类型为字符串 id: string; + // 送餐日期,类型为字符串 deliverDishesDate: string; + // 送餐人员 ID,类型为字符串 staffId: string; } -// 就餐方式 +// 定义一个名为 IDineTypeList 的常量,是一个包含就餐方式选项的数组,每个选项有标签和对应的值 export const IDineTypeList = [ { label: "送餐", value: "送餐" }, { label: "堂食", value: "堂食" } ]; -// 分页查询点餐 +/** + * 定义一个异步函数 pageOrderByKey,用于分页查询点餐 + * @param data - 一个符合 IPageOrderByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询点餐的响应结果 + */ export async function pageOrderByKey(data: IPageOrderByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - // Reflect.has(data, 'name') ? (data.gradeName = data.name) : '' - // Reflect.has(data, 'type') ? (data.nurseType = data.type) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以原本计划请求前处理某些字段, + // 但这里代码被注释掉了,可能是暂不处理或有其他调整 + // Reflect.has(data, 'name')? (data.gradeName = data.name) : '' + // Reflect.has(data, 'type')? (data.nurseType = data.type) : '' + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/pageOrderByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/order/pageOrderByKey", { params: { ...data @@ -42,31 +72,55 @@ export async function pageOrderByKey(data: IPageOrderByKey) { }); } -// 分页搜索老人 +/** + * 定义一个函数 pageSearchElderByKey,用于分页搜索老人 + * @param data - 一个符合 IPageSearchElderByKey 接口的对象,包含搜索所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页搜索老人的响应结果 + */ export function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/pageSearchElderByKey" + // 将 data 对象展开作为请求的参数 return http.get('/api/order/pageSearchElderByKey', { params: { ...data } - }) + }); } -// 分页查询菜品 +/** + * 定义一个异步函数 pageDishesByKey,用于分页查询菜品(这里是在点餐相关模块中查询菜品) + * @param data - 一个符合 IPageDishesByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询菜品的响应结果 + */ export async function pageDishesByKey(data: IPageDishesByKey) { - return http.get("/api/order/pageDishesByKey",{ - params:{ + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/pageDishesByKey" + // 将 data 对象展开作为请求的参数 + return http.get("/api/order/pageDishesByKey", { + params: { ...data } }); } -// 新增点餐 +/** + * 定义一个函数 addOrder,用于新增点餐 + * @param data - 一个符合 IAddOrder 接口的对象,包含新增点餐所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增点餐操作的响应结果 + */ export function addOrder(data: IAddOrder) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/order/addOrder" + // 将 data 对象作为请求的主体 return http.post("/api/order/addOrder", data); } -// 根据编号查询点餐 +/** + * 定义一个异步函数 getOrderById,用于根据编号查询点餐 + * @param data - 一个符合 IGetOrderById 接口的对象,包含根据编号查询点餐所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询点餐的响应结果 + */ export async function getOrderById(data: IGetOrderById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/getOrderById" + // 将 data 对象展开作为请求的参数 return http.get("/api/order/getOrderById", { params: { ...data @@ -74,12 +128,22 @@ export async function getOrderById(data: IGetOrderById) { }); } -// 护理人员 +/** + * 定义一个异步函数 listNurseStaff,用于获取护理人员列表(这里在点餐模块中获取护理人员列表,可能与业务逻辑有关) + * @returns 一个 Promise 对象,解析后得到的是获取护理人员列表的响应结果 + */ export async function listNurseStaff() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/listNurseStaff" return http.get("/api/order/listNurseStaff"); } -// 送餐 +/** + * 定义一个函数 sendOrder,用于送餐 + * @param data - 一个符合 ISendOrder 接口的对象,包含送餐所需的数据 + * @returns 一个 Promise 对象,解析后得到的是送餐操作的响应结果 + */ export function sendOrder(data: ISendOrder) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/order/sendOrder" + // 将 data 对象作为请求的主体 return http.put("/api/order/sendOrder", data); } diff --git a/client/src/apis/retreatAudit.ts b/client/src/apis/retreatAudit.ts index 2abb61d..79fe3ee 100644 --- a/client/src/apis/retreatAudit.ts +++ b/client/src/apis/retreatAudit.ts @@ -1,29 +1,46 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可能用于发起 HTTP 请求,例如对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageRetreatAuditByKey,用于描述分页查询退住审核时的请求参数结构 interface IPageRetreatAuditByKey { + // 老人姓名,用于筛选退住审核记录,类型为字符串 elderName: string; + // 老人性别,用于筛选退住审核记录,类型为字符串 elderSex: string; + // 身份证号码,用于筛选退住审核记录,类型为字符串 idNum: string; } +// 定义一个接口 IGetElderFeeById,用于描述根据编号获取老人费用详情时的请求参数结构 interface IGetElderFeeById { + // 老人 ID,类型为数字,用于指定获取费用详情的老人 elderId: number; } +// 定义一个接口 IAuditElderFee,用于描述审核老人费用详情时的数据结构 interface IAuditElderFee { + // 申请 ID,类型为数字,用于标识退住申请 applyId: number; + // 老人 ID,类型为数字,用于关联老人 elderId: number; + // 审核结果,类型为数字,可能是枚举值(如 0 表示不通过,1 表示通过等) auditResult: number; } -// 审核结果 +// 定义一个常量 IAuditResultList,包含审核结果的选项,每个选项有标签和对应的值 export const IAuditResultList = [ { label: "通过", value: "通过" }, { label: "不通过", value: "不通过" } ]; -// 分页查询退住审核 +/** + * 定义一个异步函数 pageRetreatAuditByKey,用于分页查询退住审核 + * @param data - 一个符合 IPageRetreatAuditByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询退住审核的响应结果 + */ export async function pageRetreatAuditByKey(data: IPageRetreatAuditByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/retreatAudit/pageRetreatAuditByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/retreatAudit/pageRetreatAuditByKey", { params: { ...data @@ -31,8 +48,14 @@ export async function pageRetreatAuditByKey(data: IPageRetreatAuditByKey) { }); } -// 根据编号获取老人费用详情 +/** + * 定义一个异步函数 getElderFeeById,用于根据编号获取老人费用详情 + * @param data - 一个符合 IGetElderFeeById 接口的对象,包含根据编号获取老人费用详情所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取老人费用详情的响应结果 + */ export async function getElderFeeById(data: IGetElderFeeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/retreatAudit/getElderFeeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/retreatAudit/getElderFeeById", { params: { ...data @@ -40,7 +63,13 @@ export async function getElderFeeById(data: IGetElderFeeById) { }); } -// 审核老人费用详情 +/** + * 定义一个函数 auditElderFee,用于审核老人费用详情 + * @param data - 一个符合 IAuditElderFee 接口的对象,包含审核老人费用详情所需的数据 + * @returns 一个 Promise 对象,解析后得到的是审核老人费用详情操作的响应结果 + */ export function auditElderFee(data: IAuditElderFee) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/retreatAudit/auditElderFee" + // 将 data 对象作为请求的主体 return http.put("/api/retreatAudit/auditElderFee", data); } diff --git a/client/src/apis/roomType.ts b/client/src/apis/roomType.ts index 738f889..0458f2a 100644 --- a/client/src/apis/roomType.ts +++ b/client/src/apis/roomType.ts @@ -1,24 +1,42 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageRoomTypeByKey,用于描述分页查询房间类型时的请求参数结构 interface IPageRoomTypeByKey { + // 名称,用于筛选房间类型,类型为字符串 name: string; + // 房间类型名称,用于筛选房间类型,类型为字符串 roomTypeName: string; } +// 定义一个接口 IAddRoomType,用于描述新增房间类型时的数据结构 interface IAddRoomType { + // 房间类型的 ID,类型为字符串 id: string; + // 房间类型的名称,类型为字符串 name: string; + // 房间类型的月价格,类型为字符串 monthPrice: string; } +// 定义一个接口 IGetRoomTypeById,用于描述根据编号查询房间类型时的请求参数结构 interface IGetRoomTypeById { + // 房间类型 ID,类型为字符串 roomTypeId: string; } -// 分页查询房间类型 +/** + * 定义一个异步函数 pageRoomTypeByKey,用于分页查询房间类型 + * @param data - 一个符合 IPageRoomTypeByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询房间类型的响应结果 + */ export async function pageRoomTypeByKey(data: IPageRoomTypeByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, "name") ? (data.roomTypeName = data.name) : ""; + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以请求前增加一些这两个字段 + // 如果 data 对象中有 "name" 字段,则将其值赋给 "roomTypeName" 字段 + Reflect.has(data, "name")? (data.roomTypeName = data.name) : ""; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/roomType/pageRoomTypeByKey" + // 将处理后的 data 对象展开作为请求的参数 return http.get("/api/roomType/pageRoomTypeByKey", { params: { ...data @@ -26,13 +44,25 @@ export async function pageRoomTypeByKey(data: IPageRoomTypeByKey) { }); } -// 新增房间类型 +/** + * 定义一个函数 addRoomType,用于新增房间类型 + * @param data - 一个符合 IAddRoomType 接口的对象,包含新增房间类型所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增房间类型操作的响应结果 + */ export function addRoomType(data: IAddRoomType) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/roomType/addRoomType" + // 将 data 对象作为请求的主体 return http.post("/api/roomType/addRoomType", data); } -// 根据编号查询房间类型 +/** + * 定义一个异步函数 getRoomTypeById,用于根据编号查询房间类型 + * @param data - 一个符合 IGetRoomTypeById 接口的对象,包含根据编号查询房间类型所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询房间类型的响应结果 + */ export async function getRoomTypeById(data: IGetRoomTypeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/roomType/getRoomTypeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/roomType/getRoomTypeById", { params: { ...data @@ -40,13 +70,25 @@ export async function getRoomTypeById(data: IGetRoomTypeById) { }); } -// 编辑房间类型 +/** + * 定义一个函数 editRoomType,用于编辑房间类型 + * @param data - 一个符合 IAddRoomType 接口的对象,包含编辑房间类型所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑房间类型操作的响应结果 + */ export function editRoomType(data: IAddRoomType) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/roomType/editRoomType" + // 将 data 对象作为请求的主体 return http.put("/api/roomType/editRoomType", data); } -// 删除房间类型 +/** + * 定义一个异步函数 deleteRoomType,用于删除房间类型 + * @param data - 一个符合 IGetRoomTypeById 接口的对象,包含删除房间类型所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除房间类型操作的响应结果 + */ export async function deleteRoomType(data: IGetRoomTypeById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/roomType/deleteRoomType" + // 将 data 对象展开作为请求的参数 return http.delete("/api/roomType/deleteRoomType", { params: { ...data diff --git a/client/src/apis/soldManage.ts b/client/src/apis/soldManage.ts index 36d9117..96a0ee5 100644 --- a/client/src/apis/soldManage.ts +++ b/client/src/apis/soldManage.ts @@ -1,58 +1,110 @@ +// 从 '@/utils' 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from '@/utils' +// 定义一个接口 IAddConsult,用于描述新增咨询时的数据结构 interface IAddConsult { - address: string - age: string - consultContent: string - consultDate: string - consultName: string - consultPhone: string - elderName: string - elderPhone: string - idNum: string - relation: string - sex: string - sourceId: string | number - staffId: string | number - consultId?: string | number - elderId?: string | number + // 地址,类型为字符串 + address: string; + // 年龄,类型为字符串 + age: string; + // 咨询内容,类型为字符串 + consultContent: string; + // 咨询日期,类型为字符串 + consultDate: string; + // 咨询人姓名,类型为字符串 + consultName: string; + // 咨询人电话,类型为字符串 + consultPhone: string; + // 老人姓名,类型为字符串 + elderName: string; + // 老人电话,类型为字符串 + elderPhone: string; + // 身份证号码,类型为字符串 + idNum: string; + // 关系,类型为字符串 + relation: string; + // 性别,类型为字符串 + sex: string; + // 来源 ID,可以是字符串或数字 + sourceId: string | number; + // 接待人 ID,可以是字符串或数字 + staffId: string | number; + // 咨询 ID,可选,类型可以是字符串或数字 + consultId?: string | number; + // 老人 ID,可选,类型可以是字符串或数字 + elderId?: string | number; } +// 定义一个接口 ISearhFormConsultByKey,用于描述分页查询咨询时的请求参数结构 interface ISearhFormConsultByKey { - pageNum: number - pageSize: number - consultName?: string - consultPhone?: string - elderName?: string - elderPhone?: string - endTime?: string - sourceId?: string - staffId?: string - startTime?: string - sourceName?: string - staffName?: string + // 页码,类型为数字 + pageNum: number; + // 每页数量,类型为数字 + pageSize: number; + // 咨询人姓名,可选,类型为字符串 + consultName?: string; + // 咨询人电话,可选,类型为字符串 + consultPhone?: string; + // 老人姓名,可选,类型为字符串 + elderName?: string; + // 老人电话,可选,类型为字符串 + elderPhone?: string; + // 结束时间,可选,类型为字符串 + endTime?: string; + // 来源 ID,可选,类型为字符串 + sourceId?: string; + // 接待人 ID,可选,类型为字符串 + staffId?: string; + // 开始时间,可选,类型为字符串 + startTime?: string; + // 来源名称,可选,类型为字符串 + sourceName?: string; + // 接待人名称,可选,类型为字符串 + staffName?: string; } +// 定义一个接口 IConsultByForm,用于描述根据咨询人编号和老人编号获取咨询信息时的请求参数结构 interface IConsultByForm { - consultId: string | number - elderId: string | number + // 咨询 ID,可以是字符串或数字 + consultId: string | number; + // 老人 ID,可以是字符串或数字 + elderId: string | number; } -// 获取咨询管理表格数据 根据咨询人编号和老人编号获取咨询信息 +/** + * 定义一个异步函数 getConsultByForm,用于根据咨询人编号和老人编号获取咨询信息 + * @param data - 一个符合 IConsultByForm 接口的对象,包含获取咨询信息所需的参数 + * @returns 一个 Promise 对象,解析后得到的是获取咨询信息的响应结果 + */ export async function getConsultByForm(data: IConsultByForm) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/getConsultByConsultIdAndElderId' + // 将 data 对象展开作为请求的参数 return http.get('/api/consult/getConsultByConsultIdAndElderId', { params: { ...data } }) } -//新增资询 + +/** + * 定义一个函数 addConsult,用于新增咨询 + * @param data - 一个符合 IAddConsult 接口的对象,包含新增咨询所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增咨询操作的响应结果 + */ export function addConsult(data: IAddConsult) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/consult/addConsult' + // 将 data 对象作为请求的主体 return http.post('/api/consult/addConsult', data) } -// 删除咨询 +/** + * 定义一个函数 delConsult,用于删除咨询 + * @param elderId - 老人 ID,可以是字符串或数字,用于标识要删除的咨询关联的老人 + * @returns 一个 Promise 对象,解析后得到的是删除咨询操作的响应结果 + */ export function delConsult(elderId: string | number) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/consult/deleteConsult' + // 将 elderId 作为请求的参数 return http.delete('/api/consult/deleteConsult', { params: { elderId @@ -60,13 +112,25 @@ export function delConsult(elderId: string | number) { }) } -//编辑咨询 +/** + * 定义一个函数 editConsult,用于编辑咨询 + * @param data - 一个符合 IAddConsult 接口的对象,包含编辑咨询所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑咨询操作的响应结果 + */ export function editConsult(data: IAddConsult) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/consult/editConsult' + // 将 data 对象作为请求的主体 return http.put('/api/consult/editConsult', data) } -// 转为意向客户 +/** + * 定义一个函数 intentionConsult,用于将咨询转为意向客户 + * @param elderId - 老人 ID,可以是字符串或数字,用于标识要转为意向客户的咨询关联的老人 + * @returns 一个 Promise 对象,解析后得到的是将咨询转为意向客户操作的响应结果 + */ export function intentionConsult(elderId: string | number) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/consult/intentionConsult' + // 将包含 elderId 的对象作为请求的主体 return http.put('/api/consult/intentionConsult', { data: { elderId @@ -74,21 +138,37 @@ export function intentionConsult(elderId: string | number) { }) } -// 来源渠道 +/** + * 定义一个函数 listConsultSource,用于获取来源渠道 + * @returns 一个 Promise 对象,解析后得到的是获取来源渠道的响应结果 + */ export function listConsultSource() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/listConsultSource' return http.get('/api/consult/listConsultSource') } -// 接待人 +/** + * 定义一个函数 listConsultStaff,用于获取接待人 + * @returns 一个 Promise 对象,解析后得到的是获取接待人的响应结果 + */ export function listConsultStaff() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/listConsultStaff' return http.get('/api/consult/listConsultStaff') } -// 分页查询咨询 +/** + * 定义一个异步函数 pageConsultByKey,用于分页查询咨询 + * @param data - 一个符合 ISearhFormConsultByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询咨询的响应结果 + */ export async function pageConsultByKey(data: ISearhFormConsultByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, 'sourceName') ? (data.sourceId = data.sourceName) : '' - Reflect.has(data, 'staffName') ? (data.staffId = data.staffName) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 + // 如果 data 对象中有'sourceName' 字段,则将其值赋给'sourceId' 字段 + Reflect.has(data,'sourceName')? (data.sourceId = data.sourceName) : ''; + // 如果 data 对象中有'staffName' 字段,则将其值赋给'staffId' 字段 + Reflect.has(data,'staffName')? (data.staffId = data.staffName) : ''; + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/pageConsultByKey' + // 将处理后的 data 对象展开作为请求的参数 const res = await http.get('/api/consult/pageConsultByKey', { params: { ...data @@ -97,17 +177,28 @@ export async function pageConsultByKey(data: ISearhFormConsultByKey) { return res } -//意向用户接口 +// 定义一个接口 ISearhFormIntentionByKey,用于描述分页查询意向客户时的请求参数结构 interface ISearhFormIntentionByKey { - pageNum: number - pageSize: number - elderName?: string - elderPhone?: string | number - labelId?: number + // 页码,类型为数字 + pageNum: number; + // 每页数量,类型为数字 + pageSize: number; + // 老人姓名,可选,类型为字符串 + elderName?: string; + // 老人电话,可选,可以是字符串或数字 + elderPhone?: string | number; + // 标签 ID,可选,类型为数字 + labelId?: number; } -//分页查询意向客户 +/** + * 定义一个异步函数 pageIntentionByKey,用于分页查询意向客户 + * @param data - 一个符合 ISearhFormIntentionByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询意向客户的响应结果 + */ export async function pageIntentionByKey(data: ISearhFormIntentionByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/pageIntentionByKey' + // 将 data 对象展开作为请求的参数 const res = await http.get('/api/intention/pageIntentionByKey', { params: { ...data @@ -116,23 +207,47 @@ export async function pageIntentionByKey(data: ISearhFormIntentionByKey) { return res } -// 新增沟通记录 +/** + * 定义一个函数 addCommunicationRecord,用于新增沟通记录 + * @param data - 包含新增沟通记录所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是新增沟通记录操作的响应结果 + */ export function addCommunicationRecord(data: any) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/intention/addCommunicationRecord' + // 将 data 对象作为请求的主体 return http.post('/api/intention/addCommunicationRecord', data) } -// 新增意向客户 +/** + * 定义一个函数 addIntention,用于新增意向客户 + * @param data - 包含新增意向客户所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是新增意向客户操作的响应结果 + */ export function addIntention(data: any) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/intention/addIntention' + // 将 data 对象作为请求的主体 return http.post('/api/intention/addIntention', data) } -// 新增回访计划 +/** + * 定义一个函数 addVisitPlan,用于新增回访计划 + * @param data - 包含新增回访计划所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是新增回访计划操作的响应结果 + */ export function addVisitPlan(data: any) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/intention/addVisitPlan' + // 将 data 对象作为请求的主体 return http.post('/api/intention/addVisitPlan', data) } -// 新增沟通记录 +/** + * 定义一个函数 deleteCommunicationRecord,用于删除沟通记录 + * @param communicationRecordId - 沟通记录 ID,类型为 any(具体类型需根据实际情况确定),用于标识要删除的沟通记录 + * @returns 一个 Promise 对象,解析后得到的是删除沟通记录操作的响应结果 + */ export function deleteCommunicationRecord(communicationRecordId: any) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/intention/deleteCommunicationRecord' + // 将 communicationRecordId 作为请求的参数 return http.delete('/api/intention/deleteCommunicationRecord', { params: { communicationRecordId @@ -140,8 +255,14 @@ export function deleteCommunicationRecord(communicationRecordId: any) { }) } -// 删除回访计划 +/** + * 定义一个函数 deleteVisitPlan,用于删除回访计划 + * @param visitPlanId - 回访计划 ID,类型为 any(具体类型需根据实际情况确定),用于标识要删除的回访计划 + * @returns 一个 Promise 对象,解析后得到的是删除回访计划操作的响应结果 + */ export function deleteVisitPlan(visitPlanId: any) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/intention/deleteVisitPlan' + // 将 visitPlanId 作为请求的参数 return http.delete('/api/intention/deleteVisitPlan', { params: { visitPlanId @@ -149,28 +270,58 @@ export function deleteVisitPlan(visitPlanId: any) { }) } -// 编辑沟通记录 +/** + * 定义一个函数 editCommunicationRecord,用于编辑沟通记录 + * @param data - 包含编辑沟通记录所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是编辑沟通记录操作的响应结果 + */ export function editCommunicationRecord(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/editCommunicationRecord' + //将 data 对象作为请求的主体 return http.put('/api/intention/editCommunicationRecord', data) } -// 编辑意向客户 +/** + * 定义一个函数 editIntention,用于编辑意向客户 + * @param data - 包含编辑意向客户所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是编辑意向客户操作的响应结果 + */ export function editIntention(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/editIntention' + // 将 data 对象作为请求的主体 return http.put('/api/intention/editIntention', data) } -// 编辑老人标签 +/** + * 定义一个函数 editElderLabel,用于编辑老人标签 + * @param data - 包含编辑老人标签所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是编辑老人标签操作的响应结果 + */ export function editElderLabel(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/editElderLabel' + // 将 data 对象作为请求的主体 return http.put('/api/intention/editElderLabel', data) } -// 执行回访计划 +/** + * 定义一个函数 executeVisitPlan,用于执行回访计划 + * @param data - 包含执行回访计划所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是执行回访计划操作的响应结果 + */ export function executeVisitPlan(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/executeVisitPlan' + // 将 data 对象作为请求的主体 return http.put('/api/intention/executeVisitPlan', data) } -// 根据编号获取编辑意向客户标签 +/** + * 定义一个函数 getEditElderLabelById,用于根据编号获取编辑意向客户标签 + * @param data - 包含获取编辑意向客户标签所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是根据编号获取编辑意向客户标签的响应结果 + */ export function getEditElderLabelById(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/getEditElderLabelById' + // 将 data 对象展开作为请求的参数 return http.get('/api/intention/getEditElderLabelById', { params: { ...data @@ -178,8 +329,14 @@ export function getEditElderLabelById(data: any) { }) } -// 根据编号获取意向客户标签 +/** + * 定义一个函数 getElderLabelById,用于根据编号获取意向客户标签 + * @param data - 包含获取意向客户标签所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是根据编号获取意向客户标签的响应结果 + */ export function getElderLabelById(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/getElderLabelById' + // 将 data 对象展开作为请求的参数 return http.get('/api/intention/getElderLabelById', { params: { ...data @@ -187,8 +344,14 @@ export function getElderLabelById(data: any) { }) } -// 根据编号获取意向客户 +/** + * 定义一个函数 getIntentById,用于根据编号获取意向客户 + * @param data - 包含获取意向客户所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是根据编号获取意向客户的响应结果 + */ export function getIntentById(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/getIntentById' + // 将 data 对象展开作为请求的参数 return http.get('/api/intention/getIntentById', { params: { ...data @@ -196,8 +359,14 @@ export function getIntentById(data: any) { }) } -//客户标签 +/** + * 定义一个函数 listLabel,用于获取客户标签 + * @param data - 包含获取客户标签所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是获取客户标签的响应结果 + */ export function listLabel(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/intention/listLabel' + // 将 data 对象展开作为请求的参数 return http.get('/intention/listLabel', { params: { ...data @@ -205,29 +374,12 @@ export function listLabel(data: any) { }) } -// 分页查询沟通记录 +/** + * 定义一个函数 pageCommunicationRecord,用于分页查询沟通记录 + * @param data - 包含分页查询沟通记录所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是分页查询沟通记录的响应结果 + */ export function pageCommunicationRecord(data: any) { - return http.get('/intention/pageCommunicationRecord', { - params: { - ...data - } - }) -} - -// 分页搜索老人 -export function pageSearchElderByKey(data: any) { - return http.get('/intention/pageSearchElderByKey', { - params: { - ...data - } - }) -} - -// 分页查询回访计划 -export function pageVisitPlan(data: any) { - return http.get('/intention/pageVisitPlan', { - params: { - ...data - } - }) -} + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/intention/pageCommunicationRecord' + // 将 data 对象展开作为请求的参数 + return http.get diff --git a/client/src/apis/source.ts b/client/src/apis/source.ts index 8b54d01..58128b1 100644 --- a/client/src/apis/source.ts +++ b/client/src/apis/source.ts @@ -1,23 +1,40 @@ +// 从 "@/utils" 模块导入名为 http 的对象,推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageSourceByKey,用于描述分页查询来源渠道时的请求参数结构 interface IPageSourceByKey { + // 名称,用于筛选来源渠道,类型为字符串 name: string; + // 来源渠道名称,用于筛选来源渠道,类型为字符串 sourceName: string; } +// 定义一个接口 IAddSource,用于描述新增来源渠道时的数据结构 interface IAddSource { + // 来源渠道的 ID,类型为字符串 id: string; + // 来源渠道的名称,类型为字符串 name: string; } +// 定义一个接口 IGetSourceById,用于描述根据编号查询来源渠道时的请求参数结构 interface IGetSourceById { + // 来源渠道 ID,类型为字符串 sourceId: string; } -// 分页查询来源渠道 +/** + * 定义一个异步函数 pageSourceByKey,用于分页查询来源渠道 + * @param data - 一个符合 IPageSourceByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询来源渠道的响应结果 + */ export async function pageSourceByKey(data: IPageSourceByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, "name") ? (data.sourceName = data.name) : ""; + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以请求前增加一些这两个字段 + // 如果 data 对象中有 "name" 字段,则将其值赋给 "sourceName" 字段 + Reflect.has(data, "name")? (data.sourceName = data.name) : ""; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/source/pageSourceByKey" + // 将处理后的 data 对象展开作为请求的参数 return http.get("/api/source/pageSourceByKey", { params: { ...data @@ -25,13 +42,25 @@ export async function pageSourceByKey(data: IPageSourceByKey) { }); } -// 新增来源渠道 +/** + * 定义一个函数 addSource,用于新增来源渠道 + * @param data - 一个符合 IAddSource 接口的对象,包含新增来源渠道所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增来源渠道操作的响应结果 + */ export function addSource(data: IAddSource) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/source/addSource" + // 将 data 对象作为请求的主体 return http.post("/api/source/addSource", data); } -// 根据编号查询来源渠道 +/** + * 定义一个异步函数 getSourceById,用于根据编号查询来源渠道 + * @param data - 一个符合 IGetSourceById 接口的对象,包含根据编号查询来源渠道所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询来源渠道的响应结果 + */ export async function getSourceById(data: IGetSourceById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/source/getSourceById" + // 将 data 对象展开作为请求的参数 return http.get("/api/source/getSourceById", { params: { ...data @@ -39,13 +68,25 @@ export async function getSourceById(data: IGetSourceById) { }); } -// 编辑来源渠道 +/** + * 定义一个函数 editSource,用于编辑来源渠道 + * @param data - 一个符合 IAddSource 接口的对象,包含编辑来源渠道所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑来源渠道操作的响应结果 + */ export function editSource(data: IAddSource) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/source/editSource" + // 将 data 对象作为请求的主体 return http.put("/api/source/editSource", data); } -// 删除来源渠道 +/** + * 定义一个异步函数 deleteSource,用于删除来源渠道 + * @param data - 一个符合 IGetSourceById 接口的对象,包含删除来源渠道所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除来源渠道操作的响应结果 + */ export async function deleteSource(data: IGetSourceById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/source/deleteSource" + // 将 data 对象展开作为请求的参数 return http.delete("/api/source/deleteSource", { params: { ...data diff --git a/client/src/apis/user.ts b/client/src/apis/user.ts index 93eba6e..2317095 100644 --- a/client/src/apis/user.ts +++ b/client/src/apis/user.ts @@ -1,60 +1,106 @@ -import { http } from '@/utils' +// 从 '@/utils' 模块导入名为 http 的对象,推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 +import { http } from '@/utils'; +// 定义一个接口 ILoginForm,用于描述登录表单的数据结构 interface ILoginForm { - pass: string - phone: string + // 密码,类型为字符串 + pass: string; + // 电话号码,类型为字符串 + phone: string; } +// 定义一个接口 ISendCodeForm,用于描述发送验证码表单的数据结构 interface ISendCodeForm { - pass: string - account: string + // 密码,类型为字符串 + pass: string; + // 账号,类型为字符串 + account: string; } +// 定义一个接口 IForgetPass,用于描述忘记密码时的数据结构 interface IForgetPass { - code: string - pass: string - account: string + // 验证码,类型为字符串 + code: string; + // 新密码,类型为字符串 + pass: string; + // 账号,类型为字符串 + account: string; } +// 定义一个接口 IEditPass,用于描述修改密码时的数据结构 interface IEditPass { - newPass: string - oldPass: string + // 新密码,类型为字符串 + newPass: string; + // 旧密码,类型为字符串 + oldPass: string; } +// 定义一个类 IEditPassImpl,实现了 IEditPass 接口,用于表示修改密码的数据实体 export class IEditPassImpl implements IEditPass { - newPass: string - oldPass: string + // 新密码属性 + newPass: string; + // 旧密码属性 + oldPass: string; + // 构造函数,接收新密码和旧密码作为参数,并赋值给对应的属性 constructor(newPass: string, oldPass: string) { - this.newPass = newPass - this.oldPass = oldPass + this.newPass = newPass; + this.oldPass = oldPass; } } -// 登录 +/** + * 定义一个函数 getLogin,用于处理登录操作 + * @param data - 一个符合 ILoginForm 接口的对象,包含登录所需的数据 + * @returns 一个 Promise 对象,解析后得到的是登录操作的响应结果 + */ export function getLogin(data: ILoginForm) { - return http.post('/api/account/login', data) + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/account/login' + // 将 data 对象作为请求的主体 + return http.post('/api/account/login', data); } -// 发送验证码 +/** + * 定义一个异步函数 sendCode,用于发送验证码 + * @param data - 一个符合 ISendCodeForm 接口的对象,包含发送验证码所需的数据 + * @returns 一个 Promise 对象,解析后得到的是发送验证码操作的响应结果 + */ export async function sendCode(data: ISendCodeForm) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/account/sendCode' + // 将 data 对象展开作为请求的参数 return http.get('/api/account/sendCode', { params: { ...data } - }) + }); } -// 忘记密码 +/** + * 定义一个异步函数 forgetPass,用于处理忘记密码的操作 + * @param data - 一个符合 IForgetPass 接口的对象,包含忘记密码操作所需的数据 + * @returns 一个 Promise 对象,解析后得到的是忘记密码操作的响应结果 + */ export async function forgetPass(data: IForgetPass) { - return http.put('/api/account/forget', data) + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/account/forget' + // 将 data 对象作为请求的主体 + return http.put('/api/account/forget', data); } -// 修改密码 +/** + * 定义一个异步函数 editPass,用于处理修改密码的操作 + * @param data - 一个符合 IEditPass 接口的对象,包含修改密码操作所需的数据 + * @returns 一个 Promise 对象,解析后得到的是修改密码操作的响应结果 + */ export async function editPass(data: IEditPass) { - return http.put('/api/account/edit', data) + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/account/edit' + // 将 data 对象作为请求的主体 + return http.put('/api/account/edit', data); } -// 退出登录 +/** + * 定义一个异步函数 getLogout,用于处理退出登录的操作 + * @returns 一个 Promise 对象,解析后得到的是退出登录操作的响应结果 + */ export async function getLogout() { - return http.delete('/api/account/logout') + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/account/logout' + return http.delete('/api/account/logout'); } diff --git a/client/src/components/ProTable/Grid/components/GridItem.vue b/client/src/components/ProTable/Grid/components/GridItem.vue deleted file mode 100644 index 7e5389e..0000000 --- a/client/src/components/ProTable/Grid/components/GridItem.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - diff --git a/client/src/components/ProTable/Grid/index.vue b/client/src/components/ProTable/Grid/index.vue deleted file mode 100644 index fa2858b..0000000 --- a/client/src/components/ProTable/Grid/index.vue +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - diff --git a/client/src/components/ProTable/Grid/interface/index.ts b/client/src/components/ProTable/Grid/interface/index.ts deleted file mode 100644 index a3ff77d..0000000 --- a/client/src/components/ProTable/Grid/interface/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// 定义一个类型别名 BreakPoint,它的值只能是 'xs'、'sm'、'md'、'lg' 或 'xl' 中的一个, -// 通常用于表示响应式布局中的不同屏幕断点 -export type BreakPoint = 'xs' |'sm' |'md' | 'lg' | 'xl'; - -// 定义一个类型别名 Responsive,它是一个对象类型,包含两个可选属性 span 和 offset。 -// span 用于表示在响应式布局中元素所占的列数,类型为 number 类型的可选值。 -// offset 用于表示在响应式布局中元素的偏移量,类型为 number 类型的可选值。 -// 这个类型通常用于描述在不同屏幕断点下元素的布局属性 -export type Responsive = { - span?: number; - offset?: number; -}; diff --git a/client/src/components/ProTable/IconPark/index.vue b/client/src/components/ProTable/IconPark/index.vue deleted file mode 100644 index 9ca92a5..0000000 --- a/client/src/components/ProTable/IconPark/index.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/components/ColSetting.vue b/client/src/components/ProTable/ProTable/components/ColSetting.vue deleted file mode 100644 index 12323c8..0000000 --- a/client/src/components/ProTable/ProTable/components/ColSetting.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 暂无可配置列 - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/components/Pagination.vue b/client/src/components/ProTable/ProTable/components/Pagination.vue deleted file mode 100644 index 7109b8f..0000000 --- a/client/src/components/ProTable/ProTable/components/Pagination.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/components/TableColumn.vue b/client/src/components/ProTable/ProTable/components/TableColumn.vue deleted file mode 100644 index 233dbf7..0000000 --- a/client/src/components/ProTable/ProTable/components/TableColumn.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - diff --git a/client/src/components/ProTable/ProTable/index.md b/client/src/components/ProTable/ProTable/index.md deleted file mode 100644 index 1a70ec4..0000000 --- a/client/src/components/ProTable/ProTable/index.md +++ /dev/null @@ -1,87 +0,0 @@ -## ProTable 文档 📚 - -### 1、ProTable 属性(ProTableProps): - -> 使用 `v-bind="$attrs"` 通过属性透传将 **ProTable** 组件属性全部透传到 **el-table** 上,所以我们支持 **el-table** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** - -| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | -| :----------: | :---------: | :------: | :-----------------------------------: | :--------------------------------------------------------------------------------------------------: | -| columns | ColumnProps | ✅ | — | ProTable 组件会根据此字段渲染搜索表单与表格列,详情见 ColumnProps | -| requestApi | Function | ✅ | — | 获取表格数据的请求 API | -| requestAuto | Boolean | ❌ | true | 表格初始化是否自动执行请求 API | -| dataCallback | Function | ❌ | — | 后台返回数据的回调函数,可对后台返回数据进行处理 | -| title | String | ❌ | — | 表格标题,目前只在打印的时候用到 | -| pagination | Boolean | ❌ | true | 是否显示分页组件:pagination 为 false 后台返回数据应该没有分页信息 和 list 字段,data 就是 list 数据 | -| initParam | Object | ❌ | {} | 表格请求的初始化参数,该值变化会自动请求表格数据 | -| toolButton | Boolean | ❌ | true | 是否显示表格功能按钮 | -| rowKey | String | ❌ | 'id' | 当表格数据多选时,所指定的 id | -| searchCol | Object | ❌ | { xs: 1, sm: 2, md: 2, lg: 3, xl: 4 } | 表格搜索项每列占比配置 | - -### 2、Column 配置(ColumnProps): - -> 使用 `v-bind="column"` 通过属性透传将每一项 **column** 属性全部透传到 **el-table-column** 上,所以我们支持 **el-table-column** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** - -| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | -| :----------: | :----------------: | :------: | :----: | :---------------------------------------------------------------------------------------------: | -| tag | Boolean | ❌ | false | 当前单元格值是否为标签展示,可通过 enum 数据中 tagType 字段指定 tag 类型 | -| isShow | Boolean | ❌ | true | 当前列是否显示在表格内(只对 prop 列生效) | -| search | SearchProps | ❌ | — | 搜索项配置,详情见 SearchProps | -| enum | Object \| Function | ❌ | — | 字典,可格式化单元格内容,还可以作为搜索框的下拉选项(字典可以为 API 请求函数,内部会自动执行) | -| isFilterEnum | Boolean | ❌ | true | 当前单元格值是否根据 enum 格式化(例如 enum 只作为搜索项数据,不参与内容格式化) | -| fieldNames | Object | ❌ | — | 指定字典 label && value 的 key 值 | -| headerRender | Function | ❌ | — | 自定义表头内容渲染(tsx 语法、h 语法) | -| render | Function | ❌ | — | 自定义单元格内容渲染(tsx 语法、h 语法) | -| \_children | ColumnProps | ❌ | — | 多级表头 | - -### 3、搜索项 配置(SearchProps): - -> 使用 `v-bind="column.search.props“` 通过属性透传将 **search.props** 属性全部透传到每一项搜索组件上,所以我们支持 **input、select、tree-select、date-packer、time-picker、time-select、switch** 大部分属性,并在其基础上还扩展了以下 **Props:** - -| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | -| :----------: | :----: | :------: | :----: | :--------------------------------------------------------------------------------------------------------------------------------------------: | -| el | String | ✅ | — | 当前项搜索框的类型,支持:input、input-number、select、select-v2、tree-select、cascader、date-packer、time-picker、time-select、switch、slider | -| props | Object | ❌ | — | 根据 element plus 官方文档来传递,该属性所有值会透传到组件 | -| defaultValue | Any | ❌ | — | 搜索项默认值 | -| key | String | ❌ | — | 当搜索项 key 不为 prop 属性时,可通过 key 指定 | -| order | Number | ❌ | — | 搜索项排序(从小到大) | -| span | Number | ❌ | 1 | 搜索项所占用的列数,默认为 1 列 | -| offset | Number | ❌ | — | 搜索字段左侧偏移列数 | - -### 4、ProTable 事件: - -> 根据 **ElementPlus Table** 文档在 **ProTable** 组件上绑定事件即可,组件会通过 **$attrs** 透传给 **el-table**。 -> -> [el-table 事件文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E4%BA%8B%E4%BB%B6) - -### 5、ProTable 方法: - -> **ProTable** 组件暴露了 **el-table** 实例和一些组件内部的参数和方法: -> -> [el-table 方法文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E6%96%B9%E6%B3%95) - -| 方法名 | 描述 | -| :-------------: | :-------------------------------------------------------------------: | -| element | `el-table` 实例,可以通过`element.方法名`来调用 `el-table` 的所有方法 | -| tableData | 当前页面所展示的数据 | -| searchParam | 所有的搜索参数,不包含分页 | -| pageable | 当前表格的分页数据 | -| getTableList | 获取、刷新表格数据的方法(携带所有参数) | -| reset | 重置表格查询参数,相当于点击重置搜索按钮 | -| clearSelection | 清空表格所选择的数据,除此方法之外还可使用 `element.clearSelection()` | -| enumMap | 当前表格使用的所有字典数据(Map 数据结构) | -| isSelected | 表格是否选中数据 | -| selectedList | 表格选中的数据列表 | -| selectedListIds | 表格选中的数据列表的 id | - -### 6、ProTable 插槽: - -| 插槽名 | 描述 | -| :----------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | -| — | 默认插槽,支持直接在 ProTable 中写 el-table-column 标签 | -| tableHeader | 自定义表格头部左侧区域的插槽,一般情况该区域放操作按钮 | -| toolButton | 自定义表格头部左右侧侧功能区域的插槽 | -| append | 插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。 | -| empty | 当表格数据为空时自定义的内容 | -| pagination | 分页组件插槽 | -| `column.prop` | 单元格的作用域插槽 | -| `column.prop` + "Header" | 表头的作用域插槽 | diff --git a/client/src/components/ProTable/ProTable/index.vue b/client/src/components/ProTable/ProTable/index.vue deleted file mode 100644 index 912cb40..0000000 --- a/client/src/components/ProTable/ProTable/index.vue +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 暂无数据 - - - - - - - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/interface/index.ts b/client/src/components/ProTable/ProTable/interface/index.ts deleted file mode 100644 index 8d9e597..0000000 --- a/client/src/components/ProTable/ProTable/interface/index.ts +++ /dev/null @@ -1,84 +0,0 @@ -// 从 "element-plus/es/components/table/src/table-column/defaults" 导入 TableColumnCtx 类型 -// TableColumnCtx 可能是 Element Plus 中表格列的上下文类型,包含了表格列的一些默认属性和方法 -import { TableColumnCtx } from "element-plus/es/components/table/src/table-column/defaults"; -// 从 "@/components/Grid/interface" 导入 BreakPoint 和 Responsive 类型 -// BreakPoint 可能表示响应式布局中的不同断点(如 xs, sm, md, lg, xl 等) -// Responsive 可能用于描述在不同断点下的响应式配置 -import { BreakPoint, Responsive } from "@/components/Grid/interface"; - -// 定义一个接口 EnumProps,用于描述枚举属性 -export interface EnumProps { - // 选项框显示的文字,类型为字符串 - label: string; - // 选项框值,可以是任意类型 - value: any; - // 是否禁用此选项,可选,默认为 undefined,类型为布尔值 - disabled?: boolean; - // 当 tag 为 true 时,此选择会指定 tag 显示类型,可选,默认为 undefined,类型为字符串 - tagType?: string; - // 为树形选择时,可以通过 children 属性指定子选项,可选,默认为 undefined,类型为 EnumProps 数组 - children?: EnumProps[]; - // 允许添加任意其他属性,属性名和值的类型都为任意类型 - [key: string]: any; -} - -// 定义一个类型别名 TypeProp,其值只能是 "index"、"selection" 或 "expand" 中的一个 -export type TypeProp = "index" | "selection" | "expand"; - -// 定义一个类型别名 SearchType,用于表示搜索框的类型 -// 可以是 "input"、"input-number" 等多种 Element Plus 组件类型 -export type SearchType = - | "input" - | "input-number" - | "select" - | "select-v2" - | "tree-select" - | "cascader" - | "date-picker" - | "time-picker" - | "time-select" - | "switch" - | "slider"; - -// 定义一个接口 SearchProps,用于描述搜索项的属性 -export type SearchProps = { - // 当前项搜索框的类型,类型为 SearchType - el: SearchType; - // 搜索项参数,根据 element plus 官方文档来传递,该属性所有值会透传到组件,可选,默认为 undefined - props?: any; - // 当搜索项 key 不为 prop 属性时,可通过 key 指定,可选,默认为 undefined,类型为字符串 - key?: string; - // 搜索项排序(从大到小),可选,默认为 undefined,类型为数字 - order?: number; - // 搜索项所占用的列数,默认为 1 列,可选,默认为 undefined,类型为数字 - span?: number; - // 搜索字段左侧偏移列数,可选,默认为 undefined,类型为数字 - offset?: number; - // 搜索项默认值,可以是字符串、数字、布尔值或任意类型的数组,可选,默认为 undefined - defaultValue?: string | number | boolean | any[]; - // 扩展为包含 BreakPoint 类型的键和 Responsive 类型的值的部分记录,用于实现响应式配置 -} & Partial>; - -// 定义一个接口 ColumnProps,用于描述表格列的属性 -// 扩展自 Partial, "children" | "renderHeader" | "renderCell">>,表示部分继承 TableColumnCtx 类型并去除 "children"、"renderHeader" 和 "renderCell" 属性 -export interface ColumnProps - extends Partial, "children" | "renderHeader" | "renderCell">> { - // 是否是标签展示,可选,默认为 undefined,类型为布尔值 - tag?: boolean; - // 是否显示在表格当中,可选,默认为 undefined,类型为布尔值 - isShow?: boolean; - // 搜索项配置,可选,默认为 undefined,类型为 SearchProps 或 undefined - search?: SearchProps | undefined; - // 枚举类型(渲染值的字典),可以是 EnumProps 数组或一个返回 Promise 的函数,可选,默认为 undefined - enum?: EnumProps[] | ((params?: any) => Promise); - // 当前单元格值是否根据 enum 格式化(示例:enum 只作为搜索项数据),可选,默认为 undefined,类型为布尔值 - isFilterEnum?: boolean; - // 指定 label && value 的 key 值,可选,默认为 undefined,类型为包含 label 和 value 键的对象 - fieldNames?: { label: string; value: string }; - // 自定义表头内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受 ColumnProps 类型参数并返回任意类型的函数 - headerRender?: (row: ColumnProps) => any; - // 自定义单元格内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受包含 row 属性且类型为 T 的对象并返回任意类型的函数 - render?: (scope: { row: T }) => any; - // 多级表头,可选,默认为 undefined,类型为 ColumnProps 数组 - _children?: ColumnProps[]; -} diff --git a/client/src/components/ProTable/ReImageVerify/index.ts b/client/src/components/ProTable/ReImageVerify/index.ts deleted file mode 100644 index 6b4eca3..0000000 --- a/client/src/components/ProTable/ReImageVerify/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// 从当前目录下的 src 文件夹中的 index.vue 文件导入组件 -// 这里将导入的组件命名为 reImageVerify,它应该是一个 Vue 组件 -import reImageVerify from './src/index.vue' - -/** 图形验证码组件 */ -// 使用具名导出的方式,将导入的组件以 ReImageVerify 这个名称导出 -// 具名导出允许在导入时指定具体要导入的内容,方便在其他文件中使用 -export const ReImageVerify = reImageVerify - -// 使用默认导出的方式,将导入的组件作为默认导出 -// 默认导出允许在导入时可以使用任意名称来接收该组件,通常一个文件只能有一个默认导出 -export default ReImageVerify diff --git a/client/src/components/ProTable/ReImageVerify/src/hooks.ts b/client/src/components/ProTable/ReImageVerify/src/hooks.ts deleted file mode 100644 index 898eb05..0000000 --- a/client/src/components/ProTable/ReImageVerify/src/hooks.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { ref, onMounted } from 'vue' - -/** - * 绘制图形验证码 - * @param width - 图形宽度 - * @param height - 图形高度 - */ -// 定义一个名为 useImageVerify 的函数,用于生成和管理图形验证码,接受图形宽度和高度作为参数,有默认值 -export const useImageVerify = (width = 120, height = 40) => { - // 创建一个响应式引用 domRef,用于存储 元素的引用 - const domRef = ref() - // 创建一个响应式变量 imgCode,用于存储生成的图形验证码字符串 - const imgCode = ref('') - - // 定义一个函数 setImgCode,用于设置 imgCode 的值 - function setImgCode(code: string) { - imgCode.value = code - } - - // 定义一个函数 getImgCode,用于在 上绘制验证码并获取生成的验证码字符串 - function getImgCode() { - // 如果 domRef 没有值(即 元素未挂载),则直接返回 - if (!domRef.value) return - // 调用 draw 函数绘制验证码,并将返回的验证码字符串赋值给 imgCode - imgCode.value = draw(domRef.value, width, height) - } - - // 在组件挂载后执行的钩子函数,调用 getImgCode 函数生成验证码 - onMounted(() => { - getImgCode() - }) - - // 返回一个包含 domRef、imgCode、setImgCode 和 getImgCode 的对象,以便在其他地方使用这些变量和函数 - return { - domRef, - imgCode, - setImgCode, - getImgCode - } -} - -// 定义一个函数 randomNum,用于生成指定范围内的随机整数 -function randomNum(min: number, max: number) { - // 使用 Math.random() 生成一个 0 到 1 之间的随机小数,然后通过计算得到指定范围内的整数 - const num = Math.floor(Math.random() * (max - min) + min) - return num -} - -// 定义一个函数 randomColor,用于生成指定范围内的随机颜色(RGB 格式) -function randomColor(min: number, max: number) { - // 分别生成随机的红(r)、绿(g)、蓝(b)分量值 - const r = randomNum(min, max) - const g = randomNum(min, max) - const b = randomNum(min, max) - // 返回 RGB 格式的颜色字符串 - return `rgb(${r},${g},${b})` -} - -// 定义一个函数 draw,用于在 元素上绘制图形验证码 -function draw(dom: HTMLCanvasElement, width: number, height: number) { - // 初始化一个空字符串 imgCode,用于存储生成的验证码 - let imgCode = '' - - // 定义一个字符串 NUMBER_STRING,包含数字 0 到 9,用于生成验证码字符 - const NUMBER_STRING = '0123456789' - - // 获取 元素的 2D 绘图上下文 ctx - const ctx = dom.getContext('2d') - // 如果获取上下文失败(ctx 为 null),则直接返回空的验证码字符串 - if (!ctx) return imgCode - - // 设置绘图上下文的填充样式为随机颜色(背景色) - ctx.fillStyle = randomColor(180, 230) - // 使用填充样式绘制一个矩形,覆盖整个 区域,作为验证码的背景 - ctx.fillRect(0, 0, width, height) - // 循环 4 次,生成 4 个验证码字符 - for (let i = 0; i < 4; i += 1) { - // 从 NUMBER_STRING 中随机选取一个字符作为验证码字符 - const text = NUMBER_STRING[randomNum(0, NUMBER_STRING.length)] - // 将选取的字符添加到 imgCode 字符串中 - imgCode += text - // 随机生成字体大小 - const fontSize = randomNum(18, 41) - // 随机生成字符的旋转角度 - const deg = randomNum(-30, 30) - // 设置绘图上下文的字体样式 - ctx.font = `${fontSize}px Simhei` - // 设置文本基线为顶部 - ctx.textBaseline = 'top' - // 设置绘图上下文的填充样式为随机颜色(字符颜色) - ctx.fillStyle = randomColor(80, 150) - // 保存当前绘图上下文的状态 - ctx.save() - // 平移绘图上下文的原点到指定位置(每个字符的起始位置) - ctx.translate(30 * i + 15, 15) - // 旋转绘图上下文指定的角度 - ctx.rotate((deg * Math.PI) / 180) - // 在指定位置绘制字符 - ctx.fillText(text, -15 + 5, -15) - // 恢复之前保存的绘图上下文状态 - ctx.restore() - } - // 循环 5 次,绘制 5 条随机直线 - for (let i = 0; i < 5; i += 1) { - // 开始绘制路径 - ctx.beginPath() - // 设置路径的起始点为随机位置 - ctx.moveTo(randomNum(0, width), randomNum(0, height)) - // 设置路径的终点为随机位置 - ctx.lineTo(randomNum(0, width), randomNum(0, height)) - // 设置绘图上下文的描边样式为随机颜色 - ctx.strokeStyle = randomColor(180, 230) - // 关闭路径 - ctx.closePath() - // 绘制路径(直线) - ctx.stroke() - } - // 循环 41 次,绘制 41 个随机圆形 - for (let i = 0; i < 41; i += 1) { - // 开始绘制路径 - ctx.beginPath() - // 绘制一个圆形,圆心为随机位置,半径为 1 - ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI) - // 关闭路径 - ctx.closePath() - // 设置绘图上下文的填充样式为随机颜色 - ctx.fillStyle = randomColor(150, 200) - // 填充圆形 - ctx.fill() - } - // 返回生成的验证码字符串 - return imgCode -} diff --git a/client/src/components/ProTable/ReImageVerify/src/index.vue b/client/src/components/ProTable/ReImageVerify/src/index.vue deleted file mode 100644 index b8548ec..0000000 --- a/client/src/components/ProTable/ReImageVerify/src/index.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue b/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue deleted file mode 100644 index 7e966ba..0000000 --- a/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - - :is="`el-${column.search.el}`" - v-bind="handleSearchProps" - v-model.trim="searchParam[column.search.key?? handleProp(column.prop!)]" - :data="column.search?.el === 'tree-select'? columnEnum : []" - :options=" - ['cascader','select-v2'].includes(column.search?.el)? columnEnum : [] - " - :placeholder="placeholder" - :clearable="clearable" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - > - - - {{ data[fieldNames.label] }} - - - - - v-for="(col, index) in columnEnum" - :key="index" - :label="col[fieldNames.label]" - :value="col[fieldNames.value]" - > - - - - - - - diff --git a/client/src/components/ProTable/SearchForm/index.vue b/client/src/components/ProTable/SearchForm/index.vue deleted file mode 100644 index e587851..0000000 --- a/client/src/components/ProTable/SearchForm/index.vue +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - 搜索 - - - 重置 - - - {{ collapsed? '展开' : '合并' }} - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/SvgIcon/index.vue b/client/src/components/ProTable/SvgIcon/index.vue deleted file mode 100644 index e25234e..0000000 --- a/client/src/components/ProTable/SvgIcon/index.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - diff --git a/client/src/components/ProTable/elderListDialog/index.vue b/client/src/components/ProTable/elderListDialog/index.vue deleted file mode 100644 index 172f22c..0000000 --- a/client/src/components/ProTable/elderListDialog/index.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 选择 - - - - - - - - - - - diff --git a/client/src/components/ProTable/my-card/my-card.vue b/client/src/components/ProTable/my-card/my-card.vue deleted file mode 100644 index d050f98..0000000 --- a/client/src/components/ProTable/my-card/my-card.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - {{ title }} - - - - - - - - diff --git a/client/src/components/ProTable/treeDialog/index.vue b/client/src/components/ProTable/treeDialog/index.vue deleted file mode 100644 index c4d327e..0000000 --- a/client/src/components/ProTable/treeDialog/index.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/upload/image/index.vue b/client/src/components/ProTable/upload/image/index.vue deleted file mode 100644 index e739333..0000000 --- a/client/src/components/ProTable/upload/image/index.vue +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue b/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue deleted file mode 100644 index c13ef16..0000000 --- a/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - 添加组件 - - - - - - - - - - - diff --git a/client/src/hooks/interface/index.ts b/client/src/hooks/interface/index.ts index e26a422..05cfd4d 100644 --- a/client/src/hooks/interface/index.ts +++ b/client/src/hooks/interface/index.ts @@ -1,27 +1,42 @@ +// 定义一个名为 Table 的命名空间 export namespace Table { + // 在 Table 命名空间内,定义一个接口 Pageable,用于描述分页相关的属性 export interface Pageable { + // 当前页码,类型为数字 pageNum: number + // 每页显示的数量,类型为数字 pageSize: number + // 数据的总数量,类型为数字 total: number } + // 在 Table 命名空间内,定义一个接口 TableStateProps,用于描述表格相关的状态属性 export interface TableStateProps { + // 表格数据,是一个任意类型的数组 tableData: any[] + // 分页相关的属性,类型为 Pageable 接口 pageable: Pageable + // 搜索参数,是一个键值对对象,键为字符串,值为任意类型 searchParam: { [key: string]: any } + // 初始化的搜索参数,是一个键值对对象,键为字符串,值为任意类型 searchInitParam: { [key: string]: any } + // 用于获取总数的参数,是一个键值对对象,键为字符串,值为任意类型 totalParam: { [key: string]: any } + // 可选的图标相关属性,是一个键值对对象,键为字符串,值为任意类型,默认为 undefined icon?: { [key: string]: any } } } +// 定义一个名为 HandleData 的命名空间 export namespace HandleData { - export type MessageType = '' | 'success' | 'warning' | 'info' | 'error' + // 在 HandleData 命名空间内,定义一个类型别名 MessageType + // MessageType 的值可以是空字符串,或者是'success'、'warning'、'info'、'error' 中的一个 + export type MessageType = '' |'success' | 'warning' | 'info' | 'error' } diff --git a/client/src/hooks/useHandleData.ts b/client/src/hooks/useHandleData.ts index 5984785..f4a917a 100644 --- a/client/src/hooks/useHandleData.ts +++ b/client/src/hooks/useHandleData.ts @@ -1,4 +1,6 @@ +// 从 element-plus 库中导入 ElMessageBox 和 ElMessage 组件,分别用于显示确认框和提示消息 import { ElMessageBox, ElMessage } from 'element-plus' +// 从 './interface' 文件中导入 HandleData 命名空间,用于获取其中定义的类型 import { HandleData } from './interface' /** @@ -9,26 +11,42 @@ import { HandleData } from './interface' * @param {String} confirmType icon类型(不必传,默认为 warning) * @return Promise */ +// 定义一个泛型函数 useHandleData,P 表示 api 函数参数的类型,R 表示 api 函数返回值的类型 export const useHandleData = ( + // api 是一个函数,接收类型为 P 的参数并返回一个 Promise,Promise 的解析值类型为 R api: (params: P) => Promise, + // params 是 api 函数的参数,类型与 api 函数的参数类型一致 params: Parameters[0], + // message 是一个字符串,用于显示确认框中的提示信息 message: string, + // confirmType 是一个字符串,类型为 HandleData.MessageType,默认值为 'warning' confirmType: HandleData.MessageType = 'warning' ) => { + // 返回一个 Promise return new Promise((resolve, reject) => { + // 显示一个确认框 ElMessageBox.confirm(`是否${message}?`, '温馨提示', { + // 确认按钮的文本 confirmButtonText: '确定', + // 取消按钮的文本 cancelButtonText: '取消', + // 确认框的图标类型 type: confirmType, + // 是否可拖动 draggable: true - }).then(async () => { - const res = await api(params) - if (!res) return reject(false) - ElMessage({ - type: 'success', - message: `${message}成功!` - }) - resolve(true) }) + .then(async () => { + // 调用 api 函数并等待其返回结果 + const res = await api(params) + // 如果结果为 falsy 值,则 reject 该 Promise + if (!res) return reject(false) + // 显示一个成功提示消息 + ElMessage({ + type:'success', + message: `${message}成功!` + }) + // resolve 该 Promise,表示操作成功 + resolve(true) + }) }) } diff --git a/client/src/hooks/useIcons.ts b/client/src/hooks/useIcons.ts index 3c8fb3b..a99fbba 100644 --- a/client/src/hooks/useIcons.ts +++ b/client/src/hooks/useIcons.ts @@ -1,10 +1,21 @@ +// 从 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 导入 h 函数和 defineComponent 函数 import { h, defineComponent } from 'vue' +// 定义一个名为 useRenderIcon 的函数,它接受两个参数:iconName(字符串类型)和 attrs(可选的任意类型) export function useRenderIcon(iconName: string, attrs?: any) { + // 使用 defineComponent 函数定义一个新的组件 return defineComponent({ + // 新组件的名称为 'SvgIcon' name: 'SvgIcon', + // 定义组件的渲染函数 render() { + // 使用 h 函数创建一个 SvgIcon 组件的虚拟节点 + // 第一个参数是要创建的组件(这里是 SvgIcon) + // 第二个参数是一个对象,包含要传递给 SvgIcon 组件的属性 + // 'icon' 属性的值是传入的 iconName + // '...attrs' 表示将 attrs 对象中的所有属性也传递给 SvgIcon 组件 return h(SvgIcon, { icon: iconName, ...attrs diff --git a/client/src/hooks/useSelection.ts b/client/src/hooks/useSelection.ts index 3c4a8ad..b3df20a 100644 --- a/client/src/hooks/useSelection.ts +++ b/client/src/hooks/useSelection.ts @@ -4,16 +4,24 @@ import { ref, computed } from 'vue' * @description 表格多选数据操作 * @param {String} rowKey 当表格可以多选时,所指定的 id * */ +// 定义一个名为 useSelection 的函数,用于处理表格多选数据的操作 +// 接受一个可选参数 rowKey,默认值为 'id',表示行数据中用于唯一标识的键名 export const useSelection = (rowKey = 'id') => { - // 是否选中数据 + // 创建一个响应式变量 isSelected,用于表示是否选中了数据 + // 初始值为 false,类型为 boolean const isSelected = ref(false) - // 选中的数据列表 + // 创建一个响应式变量 selectedList,用于存储选中的数据列表 + // 初始值为空数组,类型为 any[] const selectedList = ref([]) - // 当前选中的所有ids(数组),可根据项目自行配置id字段 + // 创建一个计算属性 selectedListIds,用于获取当前选中的所有数据的 id 数组 + // 计算属性会根据依赖项(这里是 selectedList)的变化而自动更新 const selectedListIds = computed((): string[] => { + // 初始化一个空数组 ids 用于存储 id const ids: string[] = [] + // 遍历 selectedList 中的每一项数据 selectedList.value.forEach(item => ids.push(item[rowKey])) + // 返回包含所有 id 的数组 return ids }) @@ -22,11 +30,18 @@ export const useSelection = (rowKey = 'id') => { * @param {Array} rowArr 当前选择的所有数据 * @return void */ + // 定义一个函数 selectionChange,用于处理表格多选数据的变化事件 + // 接受一个参数 rowArr,类型为 any[],表示当前选中的所有数据 const selectionChange = (rowArr: any) => { - rowArr.length === 0 ? (isSelected.value = false) : (isSelected.value = true) - selectedList.value = rowArr - } + // 如果选中的数据列表为空,则将 isSelected 设置为 false + // 否则将 isSelected 设置为 true + rowArr.length === 0? (isSelected.value = false) : (isSelected.value = true) + // 更新 selectedList 为当前选中的数据列表 + selectedList.value = rowArr + } + // 返回一个包含 isSelected、selectedList、selectedListIds 和 selectionChange 的对象 + // 以便在其他地方使用这些变量和函数来处理表格多选数据 return { isSelected, selectedList, diff --git a/client/src/hooks/useTable.ts b/client/src/hooks/useTable.ts index f102ced..d9d5e6e 100644 --- a/client/src/hooks/useTable.ts +++ b/client/src/hooks/useTable.ts @@ -8,160 +8,196 @@ import { reactive, computed, toRefs } from 'vue' * @param {Boolean} isPageable 是否有分页(非必传,默认为true) * @param {Function} dataCallBack 对后台返回的数据进行处理的方法(非必传) * */ +// 定义一个名为 useTable 的函数,用于封装表格页面的操作方法 +// api 是获取表格数据的 API 方法,是必传参数 +// initParam 是获取数据的初始化参数,非必传,默认值为空对象 +// isPageable 表示是否有分页功能,非必传,默认值为 true +// dataCallBack 是对后台返回的数据进行处理的方法,非必传 export const useTable = ( api: (params: any) => Promise, initParam: object = {}, isPageable = true, dataCallBack?: (data: any) => any ) => { + // 使用 reactive 创建一个响应式的 state 对象,包含表格数据、分页数据、查询参数等 const state = reactive({ - // 表格数据 + // 表格数据,初始值为空数组 tableData: [], - // 分页数据 + // 分页数据,包含当前页数、每页显示条数和总条数 pageable: { - // 当前页数 + // 当前页数,初始值为 1 pageNum: 1, - // 每页显示条数 + // 每页显示条数,初始值为 10 pageSize: 10, - // 总条数 + // 总条数,初始值为 0 total: 0 }, - // 查询参数(只包括查询) + // 查询参数,只包括查询条件,初始值为空对象 searchParam: {}, - // 初始化默认的查询参数 + // 初始化默认的查询参数,初始值为空对象 searchInitParam: {}, - // 总参数(包含分页和查询参数) + // 总参数,包含分页和查询参数,初始值为空对象 totalParam: {} }) /** * @description 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置) * */ + // 定义一个计算属性 pageParam,用于获取和设置分页查询参数 const pageParam = computed({ - get: () => { - return { - pageNum: state.pageable.pageNum, - pageSize: state.pageable.pageSize + // 获取分页查询参数 + get: () => { + return { + pageNum: state.pageable.pageNum, + pageSize: state.pageable.pageSize + } + }, + // 设置分页查询参数,这里暂时为空,可根据需要实现 + set: (newVal: any) => { // 我是分页更新之后的值 } - }, - set: (newVal: any) => { // 我是分页更新之后的值 - } - }) + }) /** * @description 获取表格数据 * @return void * */ + // 定义一个异步函数 getTableList,用于获取表格数据 const getTableList = async () => { - try { - // 先把初始化参数和分页参数放到总参数里面 - Object.assign( - state.totalParam, - initParam, - isPageable ? pageParam.value : {} - ) - //请求前格式化数据 - if (state.totalParam.consultDate) { - state.totalParam.startTime = state.totalParam.consultDate[0] - state.totalParam.endTime = state.totalParam.consultDate[1] - delete state.totalParam.consultDate - } - let { data } = await api({ - ...state.searchInitParam, - ...state.totalParam - }) - dataCallBack && (data = dataCallBack(data)) - // 获取当前表格数据 - state.tableData = isPageable ? data.list : data + try { + // 先把初始化参数和分页参数放到总参数里面 + Object.assign( + state.totalParam, + initParam, + isPageable? pageParam.value : {} + ) + // 请求前格式化数据,如果总参数中有 consultDate 字段,则进行处理 + if (state.totalParam.consultDate) { + state.totalParam.startTime = state.totalParam.consultDate[0] + state.totalParam.endTime = state.totalParam.consultDate[1] + delete state.totalParam.consultDate + } + // 调用 API 方法获取数据 + let { data } = await api({ + ...state.searchInitParam, + ...state.totalParam + }) + // 如果有数据处理回调函数,则对数据进行处理 + dataCallBack && (data = dataCallBack(data)) + // 获取当前表格数据,如果有分页,则取 data.list,否则取 data + state.tableData = isPageable? data.list : data - const { pageNum, pageSize, total } = data - isPageable && updatePageable({ pageNum, pageSize, total }) - } catch (error) { - console.log(error) + // 从返回的数据中获取分页信息 + const { pageNum, pageSize, total } = data + // 如果有分页,则更新分页信息 + isPageable && updatePageable({ pageNum, pageSize, total }) + } catch (error) { + // 如果发生错误,打印错误信息 + console.log(error) + } } - } /** * @description 更新查询参数 * @return void * */ + // 定义一个函数 updatedTotalParam,用于更新总参数 const updatedTotalParam = () => { - state.totalParam = {} - // 处理查询参数,可以给查询参数加自定义前缀操作 - const nowSearchParam: { [key: string]: any } = {} - // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) - for (const key in state.searchParam) { - // * 某些情况下参数为 false/0 也应该携带参数 - if ( - state.searchParam[key] || - state.searchParam[key] === false || - state.searchParam[key] === 0 - ) { - nowSearchParam[key] = state.searchParam[key] + state.totalParam = {} + // 处理查询参数,可以给查询参数加自定义前缀操作 + const nowSearchParam: { [key: string]: any } = {} + // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) + for (const key in state.searchParam) { + // * 某些情况下参数为 false/0 也应该携带参数 + if ( + state.searchParam[key] || + state.searchParam[key] === false || + state.searchParam[key] === 0 + ) { + nowSearchParam[key] = state.searchParam[key] + } } + // 将处理后的查询参数和分页参数合并到总参数中 + Object.assign( + state.totalParam, + nowSearchParam, + isPageable? pageParam.value : {} + ) } - Object.assign( - state.totalParam, - nowSearchParam, - isPageable ? pageParam.value : {} - ) - } /** * @description 更新分页信息 * @param {Object} resPageable 后台返回的分页数据 * @return void * */ + // 定义一个函数 updatePageable,用于更新分页信息 const updatePageable = (resPageable: Table.Pageable) => { - Object.assign(state.pageable, resPageable) - } + // 使用 Object.assign 方法将后台返回的分页数据合并到 state.pageable 中 + Object.assign(state.pageable, resPageable) + } /** * @description 表格数据查询 * @return void * */ + // 定义一个函数 search,用于进行表格数据查询 const search = () => { - state.pageable.pageNum = 1 - updatedTotalParam() - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } /** * @description 表格数据重置 * @return void * */ + // 定义一个函数 reset,用于重置表格数据 const reset = () => { - state.pageable.pageNum = 1 - state.searchParam = {} - // 重置搜索表单的时,如果有默认搜索参数,则重置默认的搜索参数 - Object.keys(state.searchInitParam).forEach(key => { - state.searchParam[key] = state.searchInitParam[key] - }) - updatedTotalParam() - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 清空搜索参数 + state.searchParam = {} + // 重置搜索表单时,如果有默认搜索参数,则重置为默认值 + Object.keys(state.searchInitParam).forEach(key => { + state.searchParam[key] = state.searchInitParam[key] + }) + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } /** * @description 每页条数改变 * @param {Number} val 当前条数 * @return void * */ + // 定义一个函数 handleSizeChange,用于处理每页条数改变的事件 const handleSizeChange = (val: number) => { - state.pageable.pageNum = 1 - state.pageable.pageSize = val - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新每页显示条数 + state.pageable.pageSize = val + // 获取表格数据 + getTableList() + } /** * @description 当前页改变 * @param {Number} val 当前页 * @return void * */ + // 定义一个函数 handleCurrentChange,用于处理当前页改变的事件 const handleCurrentChange = (val: number) => { - state.pageable.pageNum = val - getTableList() - } + // 更新当前页数 + state.pageable.pageNum = val + // 获取表格数据 + getTableList() + } + // 返回一个包含 state 的响应式引用、获取表格数据的函数、查询函数、重置函数、处理每页条数改变和当前页改变的函数以及更新总参数的函数 return { ...toRefs(state), getTableList, diff --git a/client/src/icons/index.ts b/client/src/icons/index.ts index e4cd5fc..3ae6e10 100644 --- a/client/src/icons/index.ts +++ b/client/src/icons/index.ts @@ -1,15 +1,21 @@ +// 从项目路径 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 中导入 App 类型,用于表示 Vue 应用实例 import { App } from 'vue' // 获取上下文 require.context(检索的目录,是否检索子文件夹,正则表达式) // 返回值是一个函数(传入路径可以导入文件) // 通过静态方法keys可以检索所有文件路径 // 通过.prototype可以查看所有静态方法 - +// 这里指定检索当前目录下的 './svg' 文件夹,不检索子文件夹,匹配所有以.svg 结尾的文件 const svgRequired = require.context('./svg', false, /\.svg$/) +// 遍历所有匹配的 SVG 文件路径 svgRequired.keys().forEach(item => svgRequired(item)) +// 导出一个默认函数,该函数接收一个 Vue 应用实例 app 作为参数 export default (app: App) => { + // 使用 app.component 方法将 SvgIcon 组件注册为全局组件,别名为'svg-icon' + // 这样在整个 Vue 应用中都可以使用 标签来使用该组件 app.component('svg-icon', SvgIcon) } diff --git a/client/src/layout/components/NavBar/components/Avatar.vue b/client/src/layout/components/NavBar/components/Avatar.vue index f7e079b..961d375 100644 --- a/client/src/layout/components/NavBar/components/Avatar.vue +++ b/client/src/layout/components/NavBar/components/Avatar.vue @@ -1,34 +1,49 @@ + + + + {{ username }} + + + + + 修改密码 + + + 退出登录 + + + + + - + + - + + +
( + // api 是一个函数,接收类型为 P 的参数并返回一个 Promise,Promise 的解析值类型为 R + api: (params: P) => Promise, + // params 是 api 函数的参数,类型与 api 函数的参数类型一致 + params: Parameters[0], + // message 是一个字符串,用于显示确认框中的提示信息 + message: string, + // confirmType 是一个字符串,类型为 HandleData.MessageType,默认值为 'warning' + confirmType: HandleData.MessageType = 'warning' +) => { + // 返回一个 Promise + return new Promise((resolve, reject) => { + // 显示一个确认框 + ElMessageBox.confirm(`是否${message}?`, '温馨提示', { + // 确认按钮的文本 + confirmButtonText: '确定', + // 取消按钮的文本 + cancelButtonText: '取消', + // 确认框的图标类型 + type: confirmType, + // 是否可拖动 + draggable: true + }) + .then(async () => { + // 调用 api 函数并等待其返回结果 + const res = await api(params) + // 如果结果为 falsy 值,则 reject 该 Promise + if (!res) return reject(false) + // 显示一个成功提示消息 + ElMessage({ + type:'success', + message: `${message}成功!` + }) + // resolve 该 Promise,表示操作成功 + resolve(true) + }) + }) +} diff --git a/client/src/layout/hooks/useIcons.ts b/client/src/layout/hooks/useIcons.ts new file mode 100644 index 0000000..a99fbba --- /dev/null +++ b/client/src/layout/hooks/useIcons.ts @@ -0,0 +1,25 @@ +// 从 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 +import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 导入 h 函数和 defineComponent 函数 +import { h, defineComponent } from 'vue' + +// 定义一个名为 useRenderIcon 的函数,它接受两个参数:iconName(字符串类型)和 attrs(可选的任意类型) +export function useRenderIcon(iconName: string, attrs?: any) { + // 使用 defineComponent 函数定义一个新的组件 + return defineComponent({ + // 新组件的名称为 'SvgIcon' + name: 'SvgIcon', + // 定义组件的渲染函数 + render() { + // 使用 h 函数创建一个 SvgIcon 组件的虚拟节点 + // 第一个参数是要创建的组件(这里是 SvgIcon) + // 第二个参数是一个对象,包含要传递给 SvgIcon 组件的属性 + // 'icon' 属性的值是传入的 iconName + // '...attrs' 表示将 attrs 对象中的所有属性也传递给 SvgIcon 组件 + return h(SvgIcon, { + icon: iconName, + ...attrs + }) + } + }) +} diff --git a/client/src/layout/hooks/useSelection.ts b/client/src/layout/hooks/useSelection.ts new file mode 100644 index 0000000..b3df20a --- /dev/null +++ b/client/src/layout/hooks/useSelection.ts @@ -0,0 +1,51 @@ +import { ref, computed } from 'vue' + +/** + * @description 表格多选数据操作 + * @param {String} rowKey 当表格可以多选时,所指定的 id + * */ +// 定义一个名为 useSelection 的函数,用于处理表格多选数据的操作 +// 接受一个可选参数 rowKey,默认值为 'id',表示行数据中用于唯一标识的键名 +export const useSelection = (rowKey = 'id') => { + // 创建一个响应式变量 isSelected,用于表示是否选中了数据 + // 初始值为 false,类型为 boolean + const isSelected = ref(false) + // 创建一个响应式变量 selectedList,用于存储选中的数据列表 + // 初始值为空数组,类型为 any[] + const selectedList = ref([]) + + // 创建一个计算属性 selectedListIds,用于获取当前选中的所有数据的 id 数组 + // 计算属性会根据依赖项(这里是 selectedList)的变化而自动更新 + const selectedListIds = computed((): string[] => { + // 初始化一个空数组 ids 用于存储 id + const ids: string[] = [] + // 遍历 selectedList 中的每一项数据 + selectedList.value.forEach(item => ids.push(item[rowKey])) + // 返回包含所有 id 的数组 + return ids + }) + + /** + * @description 多选操作 + * @param {Array} rowArr 当前选择的所有数据 + * @return void + */ + // 定义一个函数 selectionChange,用于处理表格多选数据的变化事件 + // 接受一个参数 rowArr,类型为 any[],表示当前选中的所有数据 + const selectionChange = (rowArr: any) => { + // 如果选中的数据列表为空,则将 isSelected 设置为 false + // 否则将 isSelected 设置为 true + rowArr.length === 0? (isSelected.value = false) : (isSelected.value = true) + // 更新 selectedList 为当前选中的数据列表 + selectedList.value = rowArr + } + + // 返回一个包含 isSelected、selectedList、selectedListIds 和 selectionChange 的对象 + // 以便在其他地方使用这些变量和函数来处理表格多选数据 + return { + isSelected, + selectedList, + selectedListIds, + selectionChange + } +} diff --git a/client/src/layout/hooks/useTabList.ts b/client/src/layout/hooks/useTabList.ts new file mode 100644 index 0000000..f9a7847 --- /dev/null +++ b/client/src/layout/hooks/useTabList.ts @@ -0,0 +1,98 @@ +// import { ref } from 'vue' +// import { useRoute, onBeforeRouteUpdate } from 'vue-router' +// import { useCookies } from '@vueuse/integrations/useCookies' +// import { router } from '~/router' + +// export function useTabList() { +// const route = useRoute() +// const cookie = useCookies() + +// const activeTab = ref(route.path) +// const tabList = ref([ +// { +// title: '后台首页', +// path: '/' +// } +// ]) + +// // 添加标签导航 +// function addTab(tab) { +// let noTab = tabList.value.findIndex((t) => t.path == tab.path) == -1 +// if (noTab) { +// tabList.value.push(tab) +// } + +// cookie.set('tabList', tabList.value) +// } + +// // 初始化标签导航列表 +// function initTabList() { +// let tbs = cookie.get('tabList') +// if (tbs) { +// tabList.value = tbs +// } +// } + +// initTabList() + +// onBeforeRouteUpdate((to, from) => { +// activeTab.value = to.path +// addTab({ +// title: to.meta.title, +// path: to.path +// }) +// }) + +// const changeTab = (t) => { +// activeTab.value = t +// router.push(t) +// } + +// const removeTab = (t) => { +// let tabs = tabList.value +// let a = activeTab.value +// if (a == t) { +// tabs.forEach((tab, index) => { +// if (tab.path == t) { +// const nextTab = tabs[index + 1] || tabs[index - 1] +// if (nextTab) { +// a = nextTab.path +// } +// } +// }) +// } + +// activeTab.value = a +// tabList.value = tabList.value.filter((tab) => tab.path != t) + +// cookie.set('tabList', tabList.value) +// } + +// const handleClose = (c) => { +// if (c == 'clearAll') { +// // 切换回首页 +// activeTab.value = '/' +// // 过滤只剩下首页 +// tabList.value = [ +// { +// title: '后台首页', +// path: '/' +// } +// ] +// } else if (c == 'clearOther') { +// // 过滤只剩下首页和当前激活 +// tabList.value = tabList.value.filter( +// (tab) => tab.path == '/' || tab.path == activeTab.value +// ) +// } +// cookie.set('tabList', tabList.value) +// } + +// return { +// activeTab, +// tabList, +// changeTab, +// removeTab, +// handleClose +// } +// } diff --git a/client/src/layout/hooks/useTable.ts b/client/src/layout/hooks/useTable.ts new file mode 100644 index 0000000..d9d5e6e --- /dev/null +++ b/client/src/layout/hooks/useTable.ts @@ -0,0 +1,210 @@ +import { Table } from './interface' +import { reactive, computed, toRefs } from 'vue' + +/** + * @description table 页面操作方法封装 + * @param {Function} api 获取表格数据 api 方法(必传) + * @param {Object} initParam 获取数据初始化参数(非必传,默认为{}) + * @param {Boolean} isPageable 是否有分页(非必传,默认为true) + * @param {Function} dataCallBack 对后台返回的数据进行处理的方法(非必传) + * */ +// 定义一个名为 useTable 的函数,用于封装表格页面的操作方法 +// api 是获取表格数据的 API 方法,是必传参数 +// initParam 是获取数据的初始化参数,非必传,默认值为空对象 +// isPageable 表示是否有分页功能,非必传,默认值为 true +// dataCallBack 是对后台返回的数据进行处理的方法,非必传 +export const useTable = ( + api: (params: any) => Promise, + initParam: object = {}, + isPageable = true, + dataCallBack?: (data: any) => any +) => { + // 使用 reactive 创建一个响应式的 state 对象,包含表格数据、分页数据、查询参数等 + const state = reactive({ + // 表格数据,初始值为空数组 + tableData: [], + // 分页数据,包含当前页数、每页显示条数和总条数 + pageable: { + // 当前页数,初始值为 1 + pageNum: 1, + // 每页显示条数,初始值为 10 + pageSize: 10, + // 总条数,初始值为 0 + total: 0 + }, + // 查询参数,只包括查询条件,初始值为空对象 + searchParam: {}, + // 初始化默认的查询参数,初始值为空对象 + searchInitParam: {}, + // 总参数,包含分页和查询参数,初始值为空对象 + totalParam: {} + }) + + /** + * @description 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置) + * */ + // 定义一个计算属性 pageParam,用于获取和设置分页查询参数 + const pageParam = computed({ + // 获取分页查询参数 + get: () => { + return { + pageNum: state.pageable.pageNum, + pageSize: state.pageable.pageSize + } + }, + // 设置分页查询参数,这里暂时为空,可根据需要实现 + set: (newVal: any) => { // 我是分页更新之后的值 + } + }) + + /** + * @description 获取表格数据 + * @return void + * */ + // 定义一个异步函数 getTableList,用于获取表格数据 + const getTableList = async () => { + try { + // 先把初始化参数和分页参数放到总参数里面 + Object.assign( + state.totalParam, + initParam, + isPageable? pageParam.value : {} + ) + // 请求前格式化数据,如果总参数中有 consultDate 字段,则进行处理 + if (state.totalParam.consultDate) { + state.totalParam.startTime = state.totalParam.consultDate[0] + state.totalParam.endTime = state.totalParam.consultDate[1] + delete state.totalParam.consultDate + } + // 调用 API 方法获取数据 + let { data } = await api({ + ...state.searchInitParam, + ...state.totalParam + }) + // 如果有数据处理回调函数,则对数据进行处理 + dataCallBack && (data = dataCallBack(data)) + // 获取当前表格数据,如果有分页,则取 data.list,否则取 data + state.tableData = isPageable? data.list : data + + // 从返回的数据中获取分页信息 + const { pageNum, pageSize, total } = data + // 如果有分页,则更新分页信息 + isPageable && updatePageable({ pageNum, pageSize, total }) + } catch (error) { + // 如果发生错误,打印错误信息 + console.log(error) + } + } + + /** + * @description 更新查询参数 + * @return void + * */ + // 定义一个函数 updatedTotalParam,用于更新总参数 + const updatedTotalParam = () => { + state.totalParam = {} + // 处理查询参数,可以给查询参数加自定义前缀操作 + const nowSearchParam: { [key: string]: any } = {} + // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) + for (const key in state.searchParam) { + // * 某些情况下参数为 false/0 也应该携带参数 + if ( + state.searchParam[key] || + state.searchParam[key] === false || + state.searchParam[key] === 0 + ) { + nowSearchParam[key] = state.searchParam[key] + } + } + // 将处理后的查询参数和分页参数合并到总参数中 + Object.assign( + state.totalParam, + nowSearchParam, + isPageable? pageParam.value : {} + ) + } + + /** + * @description 更新分页信息 + * @param {Object} resPageable 后台返回的分页数据 + * @return void + * */ + // 定义一个函数 updatePageable,用于更新分页信息 + const updatePageable = (resPageable: Table.Pageable) => { + // 使用 Object.assign 方法将后台返回的分页数据合并到 state.pageable 中 + Object.assign(state.pageable, resPageable) + } + + /** + * @description 表格数据查询 + * @return void + * */ + // 定义一个函数 search,用于进行表格数据查询 + const search = () => { + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } + + /** + * @description 表格数据重置 + * @return void + * */ + // 定义一个函数 reset,用于重置表格数据 + const reset = () => { + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 清空搜索参数 + state.searchParam = {} + // 重置搜索表单时,如果有默认搜索参数,则重置为默认值 + Object.keys(state.searchInitParam).forEach(key => { + state.searchParam[key] = state.searchInitParam[key] + }) + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } + + /** + * @description 每页条数改变 + * @param {Number} val 当前条数 + * @return void + * */ + // 定义一个函数 handleSizeChange,用于处理每页条数改变的事件 + const handleSizeChange = (val: number) => { + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新每页显示条数 + state.pageable.pageSize = val + // 获取表格数据 + getTableList() + } + + /** + * @description 当前页改变 + * @param {Number} val 当前页 + * @return void + * */ + // 定义一个函数 handleCurrentChange,用于处理当前页改变的事件 + const handleCurrentChange = (val: number) => { + // 更新当前页数 + state.pageable.pageNum = val + // 获取表格数据 + getTableList() + } + + // 返回一个包含 state 的响应式引用、获取表格数据的函数、查询函数、重置函数、处理每页条数改变和当前页改变的函数以及更新总参数的函数 + return { + ...toRefs(state), + getTableList, + search, + reset, + handleSizeChange, + handleCurrentChange, + updatedTotalParam + } +} From bf65be69a70076781d136779f535b9a85704018d Mon Sep 17 00:00:00 2001 From: zgj <2913248995@qq.com> Date: Wed, 30 Apr 2025 14:02:07 +0800 Subject: [PATCH 4/7] zgj --- client/src/icons/index.ts | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/client/src/icons/index.ts b/client/src/icons/index.ts index e4cd5fc..3ae6e10 100644 --- a/client/src/icons/index.ts +++ b/client/src/icons/index.ts @@ -1,15 +1,21 @@ +// 从项目路径 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 中导入 App 类型,用于表示 Vue 应用实例 import { App } from 'vue' // 获取上下文 require.context(检索的目录,是否检索子文件夹,正则表达式) // 返回值是一个函数(传入路径可以导入文件) // 通过静态方法keys可以检索所有文件路径 // 通过.prototype可以查看所有静态方法 - +// 这里指定检索当前目录下的 './svg' 文件夹,不检索子文件夹,匹配所有以.svg 结尾的文件 const svgRequired = require.context('./svg', false, /\.svg$/) +// 遍历所有匹配的 SVG 文件路径 svgRequired.keys().forEach(item => svgRequired(item)) +// 导出一个默认函数,该函数接收一个 Vue 应用实例 app 作为参数 export default (app: App) => { + // 使用 app.component 方法将 SvgIcon 组件注册为全局组件,别名为'svg-icon' + // 这样在整个 Vue 应用中都可以使用 标签来使用该组件 app.component('svg-icon', SvgIcon) } From 132f7f3ffe56ee4752dc6e965525e94ab096c00e Mon Sep 17 00:00:00 2001 From: lxf <2974586501@qq.com> Date: Wed, 30 Apr 2025 14:11:09 +0800 Subject: [PATCH 5/7] lxf --- 代码行数.txt | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 代码行数.txt diff --git a/代码行数.txt b/代码行数.txt new file mode 100644 index 0000000..055dcc8 --- /dev/null +++ b/代码行数.txt @@ -0,0 +1,4 @@ +代码注释行数 +李宵锋 3131行 +张功军 3123行 +操舰洋 3112行 \ No newline at end of file From 8855636e8abc953d1b16c1fb311c56e2696938ae Mon Sep 17 00:00:00 2001 From: lxf <2974586501@qq.com> Date: Wed, 30 Apr 2025 14:26:23 +0800 Subject: [PATCH 6/7] v2.6 --- client/src/icons/index.ts | 8 +------- 1 file changed, 1 insertion(+), 7 deletions(-) diff --git a/client/src/icons/index.ts b/client/src/icons/index.ts index 3ae6e10..e4cd5fc 100644 --- a/client/src/icons/index.ts +++ b/client/src/icons/index.ts @@ -1,21 +1,15 @@ -// 从项目路径 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' -// 从 'vue' 中导入 App 类型,用于表示 Vue 应用实例 import { App } from 'vue' // 获取上下文 require.context(检索的目录,是否检索子文件夹,正则表达式) // 返回值是一个函数(传入路径可以导入文件) // 通过静态方法keys可以检索所有文件路径 // 通过.prototype可以查看所有静态方法 -// 这里指定检索当前目录下的 './svg' 文件夹,不检索子文件夹,匹配所有以.svg 结尾的文件 + const svgRequired = require.context('./svg', false, /\.svg$/) -// 遍历所有匹配的 SVG 文件路径 svgRequired.keys().forEach(item => svgRequired(item)) -// 导出一个默认函数,该函数接收一个 Vue 应用实例 app 作为参数 export default (app: App) => { - // 使用 app.component 方法将 SvgIcon 组件注册为全局组件,别名为'svg-icon' - // 这样在整个 Vue 应用中都可以使用 标签来使用该组件 app.component('svg-icon', SvgIcon) } From 9d499cce67fcc77366116e5eaed43effa710d590 Mon Sep 17 00:00:00 2001 From: lxf <2974586501@qq.com> Date: Wed, 30 Apr 2025 14:55:27 +0800 Subject: [PATCH 7/7] 11 --- .idea/workspace.xml | 19 +- client/package-lock.json | 81 +++- client/src/apis/bedPanorama.ts | 25 +- client/src/apis/bookManage.ts | 78 +++- client/src/apis/build.ts | 158 ++++++- client/src/apis/cateringSet.ts | 77 +++- client/src/apis/checkContract.ts | 127 +++++- client/src/apis/consume.ts | 14 +- client/src/apis/dishes.ts | 98 ++++- client/src/apis/home.ts | 43 +- client/src/apis/index.ts | 13 + client/src/apis/order.ts | 94 ++++- client/src/apis/retreatAudit.ts | 37 +- client/src/apis/roomType.ts | 56 ++- client/src/apis/soldManage.ts | 322 ++++++++++---- client/src/apis/source.ts | 55 ++- client/src/apis/user.ts | 94 +++-- .../ProTable/Grid/components/GridItem.vue | 109 ----- client/src/components/ProTable/Grid/index.vue | 207 --------- .../ProTable/Grid/interface/index.ts | 12 - .../components/ProTable/IconPark/index.vue | 45 -- .../ProTable/components/ColSetting.vue | 88 ---- .../ProTable/components/Pagination.vue | 47 --- .../ProTable/components/TableColumn.vue | 103 ----- .../src/components/ProTable/ProTable/index.md | 87 ---- .../components/ProTable/ProTable/index.vue | 397 ------------------ .../ProTable/ProTable/interface/index.ts | 84 ---- .../ProTable/ReImageVerify/index.ts | 12 - .../ProTable/ReImageVerify/src/hooks.ts | 133 ------ .../ProTable/ReImageVerify/src/index.vue | 55 --- .../SearchForm/components/SearchFormItem.vue | 117 ------ .../components/ProTable/SearchForm/index.vue | 142 ------- .../src/components/ProTable/SvgIcon/index.vue | 49 --- .../ProTable/elderListDialog/index.vue | 118 ------ .../components/ProTable/my-card/my-card.vue | 30 -- .../components/ProTable/treeDialog/index.vue | 90 ---- .../ProTable/upload/image/index.vue | 189 --------- .../wen-test/DynamicAdditionComponent.vue | 47 --- client/src/hooks/interface/index.ts | 17 +- client/src/hooks/useHandleData.ts | 34 +- client/src/hooks/useIcons.ts | 11 + client/src/hooks/useSelection.ts | 27 +- client/src/hooks/useTable.ts | 198 +++++---- client/src/icons/index.ts | 8 +- .../components/NavBar/components/Avatar.vue | 79 +++- .../NavBar/components/Breadcrumb.vue | 33 +- client/src/layout/components/NavBar/index.vue | 18 + .../SideBar/components/MenuFold.vue | 27 +- .../SideBar/components/MenuItem.vue | 53 ++- .../src/layout/components/SideBar/index.vue | 59 ++- client/src/layout/components/Tags/index.vue | 13 + client/src/layout/index.vue | 35 +- client/src/plugins/element-plus/index.ts | 8 +- client/src/plugins/index.ts | 3 + client/src/router/index.ts | 39 +- client/src/router/types.ts | 11 + client/src/router/utils.ts | 56 ++- client/src/store/index.ts | 19 +- client/src/store/modules/app/index.ts | 52 ++- client/src/store/modules/app/types.ts | 9 + client/src/store/modules/soldManage/index.ts | 7 + client/src/store/types.ts | 6 + client/src/store/utils.ts | 18 +- client/src/styles/element.scss | 70 ++- client/src/styles/index.scss | 25 +- client/src/styles/login.scss | 48 ++- client/src/styles/mixin.scss | 8 + client/src/styles/navbar.scss | 30 +- client/src/styles/reset.scss | 40 +- client/src/styles/sidebar.scss | 168 +++++++- client/src/styles/theme.scss | 10 +- client/src/styles/transition.scss | 16 +- client/src/styles/variables.module.scss | 21 +- client/src/styles/variables.module.scss.d.ts | 13 + client/src/types/global.d.ts | 12 + client/src/types/vuex.d.ts | 11 +- client/src/utils/commonUtil.ts | 35 +- client/src/utils/formRules.ts | 50 ++- client/src/utils/http/index.ts | 29 +- client/src/utils/index.ts | 4 + client/src/utils/is/index.ts | 193 +++++++-- client/src/utils/util.ts | 48 ++- client/src/views/base/activity/index.vue | 13 +- client/src/views/base/index.vue | 19 +- .../src/views/base/live/flat/dialog/bed.vue | 143 ++++--- .../src/views/base/live/flat/dialog/build.vue | 153 ++++--- .../src/views/base/live/flat/dialog/floor.vue | 158 ++++--- .../src/views/base/live/flat/dialog/room.vue | 222 ++++++---- client/src/views/base/live/flat/index.vue | 325 +++++++------- client/src/views/base/live/index.vue | 14 +- client/src/views/base/live/room/index.vue | 159 ++++--- .../views/base/live/room/roomDialog/index.vue | 154 ++++--- client/src/views/base/sale/index.vue | 16 +- client/src/views/base/sale/origin/index.vue | 84 ++-- .../base/sale/origin/originDialog/index.vue | 138 +++--- client/src/views/base/sale/tag/index.vue | 14 +- .../views/charge/audit/auditDialog/index.vue | 314 ++++++++------ client/src/views/charge/audit/index.vue | 103 +++-- client/src/views/charge/index.vue | 24 +- client/src/views/charge/prestore/index.vue | 100 +++-- .../charge/prestore/prestoreDialog/index.vue | 135 +++--- client/src/views/charge/record/index.vue | 74 ++-- .../exception/BusinessRuntimeException.java | 16 +- .../BusinessRuntimeExceptionAdvice.java | 89 +++- .../common/config/file/FileTempPath.java | 74 +++- .../file/FileUploadConfigPropertity.java | 15 +- .../mybatisplus/MetaObjectHandlerImpl.java | 59 ++- .../common/config/quartz/QuartzConfig.java | 64 ++- .../common/config/quartz/QuartzJob.java | 23 +- .../config/redis/FastJsonRedisSerializer.java | 44 +- .../common/config/redis/RedisConfig.java | 27 +- .../security/config/SecurityConfig.java | 57 ++- .../security/entity/LoginUserDetails.java | 35 +- .../filter/JwtAuthenticationTokenFilter.java | 72 +++- .../handler/AccessDeniedHandlerImpl.java | 17 +- .../handler/AuthenticationEntryPointImpl.java | 17 +- .../security/handler/AuthorityAssert.java | 24 +- .../security/handler/PasswordEncoderImpl.java | 14 +- .../service/UserDetailsServiceImpl.java | 39 +- .../common/config/swagger/SwaggerConfig.java | 44 +- .../common/config/web/IgnoreConfig.java | 11 + .../common/config/web/WebMvcConfig.java | 42 +- .../gerocomium/common/constant/AuditEnum.java | 32 +- .../gerocomium/common/constant/BedEnum.java | 29 +- .../common/constant/ChargeEnum.java | 26 +- .../gerocomium/common/constant/CheckEnum.java | 38 +- .../gerocomium/common/constant/CodeEnum.java | 27 +- .../common/constant/ConsumeEnum.java | 25 +- .../common/constant/ExceptionEnum.java | 9 + .../gerocomium/common/constant/MarkEnum.java | 29 +- .../common/constant/RecipientEnum.java | 25 +- .../gerocomium/common/constant/VisitEnum.java | 25 +- .../gerocomium/common/constant/YesNoEnum.java | 17 +- .../ew/gerocomium/common/util/AesUtil.java | 45 +- .../ew/gerocomium/common/util/AssertUtil.java | 76 +++- .../common/util/ClassJavaToTSUtil.java | 72 +++- .../gerocomium/common/util/DateUtilWen.java | 167 ++++++-- .../common/util/EntityCodeGeneratorUtil.java | 101 +++-- .../ew/gerocomium/common/util/ExcelUtil.java | 109 +++-- .../common/util/JavaToTsConverter.java | 101 ++++- .../ew/gerocomium/common/util/JwtUtil.java | 42 +- .../ew/gerocomium/common/util/PageUtil.java | 52 ++- .../gerocomium/common/util/ResponseUtil.java | 42 +- .../gerocomium/common/util/SendEmailUtil.java | 35 +- .../controller/AccountController.java | 98 ++++- .../controller/BedPanoramaController.java | 75 +++- .../controller/BuildController.java | 373 ++++++++++++++-- .../controller/CheckContractController.java | 288 +++++++++++-- .../controller/ConsultController.java | 178 +++++++- .../gerocomium/controller/FileController.java | 55 ++- .../gerocomium/controller/HomeController.java | 105 ++++- .../controller/IntentionController.java | 368 ++++++++++++++-- .../controller/InventoryController.java | 60 ++- .../controller/LabelController.java | 182 +++++++- .../controller/MaterialController.java | 86 +++- .../controller/OutboundRecordController.java | 200 ++++++++- .../controller/RoomTypeController.java | 111 ++++- .../controller/SourceController.java | 110 ++++- .../controller/WarehouseController.java | 123 +++++- .../controller/WarehouseRecordController.java | 157 ++++++- .../ew/gerocomium/dao/base/BaseEntity.java | 21 +- .../ew/gerocomium/dao/base/BuildingVo.java | 55 ++- .../GerocomiumApplicationTests.java | 12 +- server/target/classes/application-dev.yml | 6 +- .../exception/BusinessRuntimeException.class | Bin 1241 -> 1241 bytes .../BusinessRuntimeExceptionAdvice.class | Bin 4183 -> 4183 bytes .../common/config/file/FileTempPath.class | Bin 4980 -> 4984 bytes .../file/FileUploadConfigPropertity.class | Bin 3505 -> 3505 bytes .../mybatisplus/MetaObjectHandlerImpl.class | Bin 2928 -> 2928 bytes .../common/config/quartz/QuartzConfig.class | Bin 3048 -> 3056 bytes .../quartz/QuartzJob$ContractExpireJob.class | Bin 1365 -> 1365 bytes .../quartz/QuartzJob$ReserveExpireJob.class | Bin 1359 -> 1359 bytes .../common/config/quartz/QuartzJob.class | Bin 1198 -> 1198 bytes .../redis/FastJsonRedisSerializer.class | Bin 2903 -> 2903 bytes .../common/config/redis/RedisConfig.class | Bin 1949 -> 1949 bytes .../security/config/SecurityConfig.class | Bin 5974 -> 5974 bytes .../security/entity/LoginUserDetails.class | Bin 2641 -> 2641 bytes .../filter/JwtAuthenticationTokenFilter.class | Bin 5926 -> 5926 bytes .../handler/AccessDeniedHandlerImpl.class | Bin 1391 -> 1391 bytes .../AuthenticationEntryPointImpl.class | Bin 1427 -> 1427 bytes .../security/handler/AuthorityAssert.class | Bin 2069 -> 2073 bytes .../handler/PasswordEncoderImpl.class | Bin 1229 -> 1229 bytes .../service/UserDetailsServiceImpl.class | Bin 2984 -> 2984 bytes .../common/config/swagger/SwaggerConfig.class | Bin 2950 -> 2958 bytes .../common/config/web/IgnoreConfig.class | Bin 2474 -> 2474 bytes .../common/config/web/WebMvcConfig.class | Bin 3299 -> 3299 bytes .../common/constant/AuditEnum.class | Bin 1614 -> 1614 bytes .../gerocomium/common/constant/BedEnum.class | Bin 1521 -> 1521 bytes .../common/constant/ChargeEnum.class | Bin 1461 -> 1461 bytes .../common/constant/CheckEnum.class | Bin 1759 -> 1759 bytes .../gerocomium/common/constant/CodeEnum.class | Bin 1662 -> 1662 bytes .../common/constant/ConsumeEnum.class | Bin 1402 -> 1402 bytes .../common/constant/ExceptionEnum.class | Bin 9340 -> 9340 bytes .../gerocomium/common/constant/MarkEnum.class | Bin 1448 -> 1448 bytes .../common/constant/RecipientEnum.class | Bin 1415 -> 1415 bytes .../common/constant/VisitEnum.class | Bin 1410 -> 1410 bytes .../common/constant/YesNoEnum.class | Bin 1539 -> 1539 bytes .../ew/gerocomium/common/util/AesUtil.class | Bin 2283 -> 2283 bytes .../gerocomium/common/util/AssertUtil.class | Bin 2363 -> 2363 bytes .../common/util/ClassJavaToTSUtil.class | Bin 3184 -> 3188 bytes .../gerocomium/common/util/DateUtilWen.class | Bin 4871 -> 4883 bytes .../common/util/EntityCodeGeneratorUtil.class | Bin 6323 -> 6323 bytes .../common/util/ExcelUtil$Test.class | Bin 2738 -> 2738 bytes .../ew/gerocomium/common/util/ExcelUtil.class | Bin 8667 -> 8667 bytes .../common/util/JavaToTsConverter.class | Bin 3173 -> 3173 bytes .../ew/gerocomium/common/util/JwtUtil.class | Bin 2404 -> 2412 bytes .../ew/gerocomium/common/util/PageUtil.class | Bin 5074 -> 5082 bytes .../gerocomium/common/util/ResponseUtil.class | Bin 2260 -> 2260 bytes .../common/util/SendEmailUtil.class | Bin 1966 -> 1966 bytes .../controller/AccidentController.class | Bin 5880 -> 5880 bytes .../controller/AccountController.class | Bin 3129 -> 3129 bytes .../controller/ActiveController.class | Bin 4446 -> 4446 bytes .../controller/ActiveTypeController.class | Bin 3865 -> 3865 bytes .../controller/BedPanoramaController.class | Bin 2551 -> 2551 bytes .../controller/BuildController.class | Bin 7819 -> 7819 bytes .../controller/CateringSetController.class | Bin 4851 -> 4851 bytes .../controller/CheckContractController.class | Bin 6751 -> 6751 bytes .../controller/ConsultController.class | Bin 4809 -> 4809 bytes .../controller/ConsumeController.class | Bin 1784 -> 1784 bytes .../DepositRechargeController.class | Bin 3108 -> 3108 bytes .../controller/DishesController.class | Bin 5437 -> 5437 bytes .../controller/ElderRecordController.class | Bin 4278 -> 4278 bytes .../controller/FileController.class | Bin 1897 -> 1897 bytes .../controller/HomeController.class | Bin 2727 -> 2760 bytes .../controller/IntentionController.class | Bin 9604 -> 9604 bytes .../controller/InventoryController.class | Bin 2275 -> 2275 bytes .../controller/LabelController.class | Bin 4752 -> 4752 bytes .../controller/MaterialController.class | Bin 5523 -> 5523 bytes .../controller/NurseGradeController.class | Bin 4708 -> 4708 bytes .../controller/NurseReserveController.class | Bin 5062 -> 5062 bytes .../controller/OrderController.class | Bin 5685 -> 5685 bytes .../controller/OutboundRecordController.class | Bin 6892 -> 6892 bytes .../controller/OutwardController.class | Bin 6799 -> 6799 bytes .../controller/ReserveController.class | Bin 4855 -> 4855 bytes .../controller/RetreatApplyController.class | Bin 3222 -> 3222 bytes .../controller/RetreatAuditController.class | Bin 3033 -> 3033 bytes .../controller/RoomTypeController.class | Bin 3667 -> 3667 bytes .../controller/ServiceProjectController.class | Bin 5543 -> 5543 bytes .../controller/SourceController.class | Bin 3774 -> 3774 bytes .../controller/StaffController.class | Bin 3813 -> 3813 bytes .../controller/VisitController.class | Bin 5100 -> 5100 bytes .../controller/WarehouseController.class | Bin 3944 -> 3944 bytes .../WarehouseRecordController.class | Bin 5505 -> 5505 bytes .../ew/gerocomium/dao/base/BaseEntity.class | Bin 3739 -> 3739 bytes ...ngVo$BuildingItem$FloorItem$RoomItem.class | Bin 4559 -> 4559 bytes .../BuildingVo$BuildingItem$FloorItem.class | Bin 4013 -> 4013 bytes .../dao/base/BuildingVo$BuildingItem.class | Bin 3881 -> 3881 bytes .../ew/gerocomium/dao/base/BuildingVo.class | Bin 3748 -> 3748 bytes .../gerocomium/service/common/BedFunc.class | Bin 12773 -> 12781 bytes .../service/common/ConsultFunc.class | Bin 6823 -> 6827 bytes .../service/common/ContractFunc.class | Bin 6823 -> 6827 bytes .../gerocomium/service/common/RoomFunc.class | Bin 13820 -> 13824 bytes .../service/common/VisitPlanFunc.class | Bin 8345 -> 8361 bytes 253 files changed, 7975 insertions(+), 4180 deletions(-) delete mode 100644 client/src/components/ProTable/Grid/components/GridItem.vue delete mode 100644 client/src/components/ProTable/Grid/index.vue delete mode 100644 client/src/components/ProTable/Grid/interface/index.ts delete mode 100644 client/src/components/ProTable/IconPark/index.vue delete mode 100644 client/src/components/ProTable/ProTable/components/ColSetting.vue delete mode 100644 client/src/components/ProTable/ProTable/components/Pagination.vue delete mode 100644 client/src/components/ProTable/ProTable/components/TableColumn.vue delete mode 100644 client/src/components/ProTable/ProTable/index.md delete mode 100644 client/src/components/ProTable/ProTable/index.vue delete mode 100644 client/src/components/ProTable/ProTable/interface/index.ts delete mode 100644 client/src/components/ProTable/ReImageVerify/index.ts delete mode 100644 client/src/components/ProTable/ReImageVerify/src/hooks.ts delete mode 100644 client/src/components/ProTable/ReImageVerify/src/index.vue delete mode 100644 client/src/components/ProTable/SearchForm/components/SearchFormItem.vue delete mode 100644 client/src/components/ProTable/SearchForm/index.vue delete mode 100644 client/src/components/ProTable/SvgIcon/index.vue delete mode 100644 client/src/components/ProTable/elderListDialog/index.vue delete mode 100644 client/src/components/ProTable/my-card/my-card.vue delete mode 100644 client/src/components/ProTable/treeDialog/index.vue delete mode 100644 client/src/components/ProTable/upload/image/index.vue delete mode 100644 client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue diff --git a/.idea/workspace.xml b/.idea/workspace.xml index c3a830d..481517b 100644 --- a/.idea/workspace.xml +++ b/.idea/workspace.xml @@ -1,7 +1,12 @@ + + + - + + + @@ -15,10 +20,10 @@ - + { + "customColor": "", + "associatedIndex": 1 +} @@ -28,7 +33,7 @@ "keyToString": { "RunOnceActivity.ShowReadmeOnStart": "true", "RunOnceActivity.git.unshallow": "true", - "git-widget-placeholder": "feature/lxf", + "git-widget-placeholder": "develop", "kotlin-language-version-configured": "true", "last_opened_file_path": "D:/SC/Nursing-home-management-system", "node.js.detected.package.eslint": "true", @@ -37,6 +42,7 @@ "node.js.selected.package.tslint": "(autodetect)", "nodejs_package_manager_path": "npm", "settings.editor.selected.configurable": "MavenSettings", + "ts.external.directory.path": "D:\\xx\\Nursing-home-management-system\\client\\node_modules\\typescript\\lib", "vue.rearranger.settings.migration": "true" } }]]> @@ -57,6 +63,7 @@ 1742217574434 + diff --git a/client/package-lock.json b/client/package-lock.json index ef537ad..cf67628 100644 --- a/client/package-lock.json +++ b/client/package-lock.json @@ -18,6 +18,7 @@ "cz-customizable": "^7.0.0", "echarts": "^5.4.1", "element-plus": "^2.2.28", + "file-saver": "^2.0.5", "global": "^4.4.0", "husky": "^8.0.2", "screenfull": "^6.0.2", @@ -26,11 +27,13 @@ "unplugin-vue-components": "^0.22.12", "vue": "^3.2.13", "vue-i18n": "^9.2.2", + "vue-property-decorator": "^9.1.2", "vue-router": "^4.0.3", "vuex": "^4.0.0", "vuex-persistedstate": "^4.1.0" }, "devDependencies": { + "@types/file-saver": "^2.0.5", "@typescript-eslint/eslint-plugin": "^5.4.0", "@typescript-eslint/parser": "^5.4.0", "@vue/cli-plugin-babel": "~5.0.0", @@ -2982,6 +2985,13 @@ "@types/range-parser": "*" } }, + "node_modules/@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true, + "license": "MIT" + }, "node_modules/@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -4940,18 +4950,6 @@ "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } }, - "node_modules/acorn-jsx/node_modules/acorn": { - "version": "7.4.1", - "dev": true, - "license": "MIT", - "peer": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/acorn-node": { "version": "1.8.2", "resolved": "https://registry.npmjs.org/acorn-node/-/acorn-node-1.8.2.tgz", @@ -8299,6 +8297,12 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==", + "license": "MIT" + }, "node_modules/fill-range": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", @@ -15708,6 +15712,16 @@ "@vue/shared": "3.2.45" } }, + "node_modules/vue-class-component": { + "version": "7.2.6", + "resolved": "https://registry.npmmirror.com/vue-class-component/-/vue-class-component-7.2.6.tgz", + "integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==", + "license": "MIT", + "peer": true, + "peerDependencies": { + "vue": "^2.0.0" + } + }, "node_modules/vue-demi": { "version": "0.13.11", "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", @@ -15861,6 +15875,16 @@ "node": ">=8.9.0" } }, + "node_modules/vue-property-decorator": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz", + "integrity": "sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==", + "license": "MIT", + "peerDependencies": { + "vue": "*", + "vue-class-component": "*" + } + }, "node_modules/vue-router": { "version": "4.1.6", "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz", @@ -18548,6 +18572,12 @@ "@types/range-parser": "*" } }, + "@types/file-saver": { + "version": "2.0.7", + "resolved": "https://registry.npmmirror.com/@types/file-saver/-/file-saver-2.0.7.tgz", + "integrity": "sha512-dNKVfHd/jk0SkR/exKGj2ggkB45MAkzvWCaqLUUgkyjITkGNzH8H+yUwr+BLJUBjZOe9w8X3wgmXhZDRg1ED6A==", + "dev": true + }, "@types/html-minifier-terser": { "version": "6.1.0", "resolved": "https://registry.npmmirror.com/@types/html-minifier-terser/-/html-minifier-terser-6.1.0.tgz", @@ -19967,14 +19997,7 @@ "resolved": "https://registry.npmmirror.com/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", "dev": true, - "requires": {}, - "dependencies": { - "acorn": { - "version": "7.4.1", - "dev": true, - "peer": true - } - } + "requires": {} }, "acorn-node": { "version": "1.8.2", @@ -22289,6 +22312,11 @@ "flat-cache": "^3.0.4" } }, + "file-saver": { + "version": "2.0.5", + "resolved": "https://registry.npmmirror.com/file-saver/-/file-saver-2.0.5.tgz", + "integrity": "sha512-P9bmyZ3h/PRG+Nzga+rbdI4OEpNDzAVyy74uVO9ATgzLK6VtAsYybF/+TOCvrc0MO793d6+42lLyZTw7/ArVzA==" + }, "fill-range": { "version": "7.0.1", "resolved": "https://registry.npmmirror.com/fill-range/-/fill-range-7.0.1.tgz", @@ -27373,6 +27401,13 @@ } } }, + "vue-class-component": { + "version": "7.2.6", + "resolved": "https://registry.npmmirror.com/vue-class-component/-/vue-class-component-7.2.6.tgz", + "integrity": "sha512-+eaQXVrAm/LldalI272PpDe3+i4mPis0ORiMYxF6Ae4hyuCh15W8Idet7wPUEs4N4YptgFHGys4UrgNQOMyO6w==", + "peer": true, + "requires": {} + }, "vue-demi": { "version": "0.13.11", "resolved": "https://registry.npmmirror.com/vue-demi/-/vue-demi-0.13.11.tgz", @@ -27464,6 +27499,12 @@ } } }, + "vue-property-decorator": { + "version": "9.1.2", + "resolved": "https://registry.npmmirror.com/vue-property-decorator/-/vue-property-decorator-9.1.2.tgz", + "integrity": "sha512-xYA8MkZynPBGd/w5QFJ2d/NM0z/YeegMqYTphy7NJQXbZcuU6FC6AOdUAcy4SXP+YnkerC6AfH+ldg7PDk9ESQ==", + "requires": {} + }, "vue-router": { "version": "4.1.6", "resolved": "https://registry.npmmirror.com/vue-router/-/vue-router-4.1.6.tgz", diff --git a/client/src/apis/bedPanorama.ts b/client/src/apis/bedPanorama.ts index 80e8fab..1474293 100644 --- a/client/src/apis/bedPanorama.ts +++ b/client/src/apis/bedPanorama.ts @@ -1,18 +1,32 @@ +// 从 "@/utils" 模块导入 http 对象,该对象可能封装了 HTTP 请求方法 import { http } from "@/utils"; +// 定义一个名为 IListRoomByKey 的接口,用于描述获取房间列表时请求参数的数据结构 interface IListRoomByKey { + // 楼栋 ID,类型为字符串 buildingId: string; + // 楼层 ID,类型为字符串 floorId: string; + // 老人姓名,类型为字符串 elderName: string; } -// 获取楼栋列表 +/** + * 获取楼栋列表 + * @returns 一个 Promise,解析为包含楼栋列表的响应 + */ export async function listBuilding() { + // 发起一个 GET 请求到指定的 API 端点,用于获取楼栋列表 return http.get("/api/bedPanorama/listBuilding"); } -// 获取楼层列表 +/** + * 根据楼栋 ID 获取楼层列表 + * @param buildingId - 用于筛选楼层列表的楼栋 ID + * @returns 一个 Promise,解析为包含楼层列表的响应 + */ export function listFloorByBuildingId(buildingId: string) { + // 发起一个 GET 请求到指定的 API 端点,携带楼栋 ID 作为参数,用于获取对应楼栋的楼层列表 return http.get("/api/bedPanorama/listFloorByBuildingId", { params: { buildingId @@ -20,8 +34,13 @@ export function listFloorByBuildingId(buildingId: string) { }); } -// 获取房间列表 +/** + * 根据条件获取房间列表 + * @param data - 包含筛选条件的对象,符合 IListRoomByKey 接口的结构 + * @returns 一个 Promise,解析为包含房间列表的响应 + */ export function listRoomByKey(data: IListRoomByKey) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数,用于获取符合条件的房间列表 return http.get("/api/bedPanorama/listRoomByKey", { params: { ...data diff --git a/client/src/apis/bookManage.ts b/client/src/apis/bookManage.ts index 171a1d8..46c4db0 100644 --- a/client/src/apis/bookManage.ts +++ b/client/src/apis/bookManage.ts @@ -1,45 +1,79 @@ +// 从 '@/utils' 模块导入 http 对象,该对象可能封装了 HTTP 请求的方法,用于后续发起网络请求 import { http } from '@/utils' +// 定义一个接口 ISearchFormReserveByKey,用于描述分页查询预定时请求参数的数据结构 interface ISearchFormReserveByKey { + // 当前页码,类型为数字 pageNum: number + // 每页显示的数量,类型为数字 pageSize: number + // 老人姓名,可选参数,类型为字符串 elderName?: string + // 付款人电话,可选参数,类型为字符串 payerPhone?: string } +// 定义一个导出的接口 IPageSearchElderByKey,用于描述分页搜索老人时请求参数的数据结构 export interface IPageSearchElderByKey { + // 当前页码,类型为数字 pageNum: number + // 每页显示的数量,类型为数字 pageSize: number + // 老人姓名,可选参数,类型为字符串 elderName?: string + // 老人电话,可选参数,类型为字符串 elderPhone?: string } +// 定义一个接口 IAddReserve,用于描述新增预定时请求体的数据结构 interface IAddReserve { + // 床位 ID,类型为字符串 bedId: string + // 定金,类型为字符串 deposit: string + // 截止日期,类型为字符串 dueDate: string + // 老人地址,类型为字符串 elderAddress: string + // 老人年龄,类型为字符串 elderAge: string + // 老人姓名,类型为字符串 elderName: string + // 老人电话,类型为字符串 elderPhone: string + // 老人性别,类型为字符串 elderSex: string + // 身份证号码,类型为字符串 idNum: string + // 付款人姓名,类型为字符串 payerName: string + // 付款人电话,类型为字符串 payerPhone: string + // 工作人员 ID,类型为字符串 staffId: string } +// 定义一个接口 IGetReserveById,用于描述根据预定编号和老人编号获取预定信息时请求参数的数据结构 interface IGetReserveById { + // 老人 ID,类型为字符串 elderId: string + // 预定 ID,类型为字符串 reserveId: string } +// 定义一个接口 IRefund,用于描述退款时请求体的数据结构 interface IRefund { + // 预定 ID,类型为字符串 reserveId: string } -// 分页查询预定 +/** + * 分页查询预定信息 + * @param data - 包含分页和查询条件的对象,符合 ISearchFormReserveByKey 接口 + * @returns 一个 Promise,解析为包含分页查询预定结果的响应 + */ export async function pageReserveByKey(data: ISearchFormReserveByKey) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数 return http.get('/api/reserve/pageReserveByKey', { params: { ...data @@ -47,8 +81,13 @@ export async function pageReserveByKey(data: ISearchFormReserveByKey) { }) } -// 分页搜索老人 +/** + * 分页搜索老人信息 + * @param data - 包含分页和查询条件的对象,符合 IPageSearchElderByKey 接口 + * @returns 一个 Promise,解析为包含分页搜索老人结果的响应 + */ export function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数 return http.get('/api/reserve/pageSearchElderByKey', { params: { ...data @@ -56,23 +95,41 @@ export function pageSearchElderByKey(data: IPageSearchElderByKey) { }) } -// 获取营销人员 +/** + * 获取营销人员列表 + * @returns 一个 Promise,解析为包含营销人员列表的响应 + */ export function listReserveStaff() { + // 发起一个 GET 请求到指定的 API 端点,用于获取营销人员列表 return http.get('/api/reserve/listReserveStaff') } -// 获取楼栋树 +/** + * 获取楼栋树信息 + * @returns 一个 Promise,解析为包含楼栋树信息的响应 + */ export function getBuildTree() { + // 发起一个 GET 请求到指定的 API 端点,用于获取楼栋树信息 return http.get('/api/reserve/getBuildTree') } -// 新增预定 +/** + * 新增预定信息 + * @param data - 包含新增预定所需信息的对象,符合 IAddReserve 接口 + * @returns 一个 Promise,解析为新增预定操作的响应 + */ export function addReserve(data: IAddReserve) { + // 发起一个 POST 请求到指定的 API 端点,将 data 对象作为请求体 return http.post('/api/reserve/addReserve', data) } -// 根据预定编号和老人编号获取预定信息 +/** + * 根据预定编号和老人编号获取预定信息 + * @param data - 包含预定编号和老人编号的对象,符合 IGetReserveById 接口 + * @returns 一个 Promise,解析为包含指定预定信息的响应 + */ export function getReserveById(data: IGetReserveById) { + // 发起一个 GET 请求到指定的 API 端点,将 data 对象中的属性展开作为请求参数 return http.get('/api/reserve/getReserveByReserveIdAndElderId', { params: { ...data @@ -80,7 +137,12 @@ export function getReserveById(data: IGetReserveById) { }) } -// 退款 +/** + * 进行退款操作 + * @param data - 包含退款所需预定 ID 的对象,符合 IRefund 接口 + * @returns 一个 Promise,解析为退款操作的响应 + */ export function refund(data: IRefund) { - return http.put('/api/reserve/refund',data) + // 发起一个 PUT 请求到指定的 API 端点,将 data 对象作为请求体 + return http.put('/api/reserve/refund', data) } diff --git a/client/src/apis/build.ts b/client/src/apis/build.ts index 925cfac..eb5871f 100644 --- a/client/src/apis/build.ts +++ b/client/src/apis/build.ts @@ -1,64 +1,103 @@ +// 从 "@/utils" 模块导入 http 对象,用于发起 HTTP 请求 import { http } from "@/utils"; +// 定义 IPageBedByKey 接口,用于分页查询床位时的参数结构 interface IPageBedByKey { + // 楼栋 ID buildId: string; + // 楼层 ID floorId: string; + // 房间 ID roomId: string; + // 床位状态标识 bedFlag: string; } +// 定义 IAddBuilding 接口,用于新增楼栋时的请求数据结构 interface IAddBuilding { + // 楼栋 ID id: string; + // 楼栋名称 name: string; + // 楼层数量 floorNum: string; } +// 定义 IGetBuildingById 接口,用于根据编号获取楼栋时的参数结构 interface IGetBuildingById { + // 楼栋 ID buildingId: string; } +// 定义 IAddFloor 接口,用于新增楼层时的请求数据结构 interface IAddFloor { + // 楼层 ID id: string; + // 楼层名称 name: string; + // 房间数量 roomNum: string; + // 所属楼栋 ID buildingId: string; + // 楼层限制相关信息 floorLimit: string; } +// 定义 IGetFloorById 接口,用于根据编号获取楼层时的参数结构 interface IGetFloorById { + // 楼层 ID floorId: string; } +// 定义 IAddRoom 接口,用于新增房间时的请求数据结构 interface IAddRoom { + // 房间 ID id: string; + // 房间名称 name: string; + // 房间类型 ID typeId: string; + // 床位数量 bedNum: string; + // 所属楼层 ID floorId: string; + // 房间限制相关信息 roomLimit: string; } +// 定义 IGetRoomById 接口,用于根据编号获取房间时的参数结构 interface IGetRoomById { + // 房间 ID roomId: string; } +// 定义 IDeleteNode 接口,用于删除节点时的参数结构 interface IDeleteNode { + // 节点 ID id: string; + // 节点标识 mark: string; } +// 定义 IAddBed 接口,用于新增床位时的请求数据结构 interface IAddBed { + // 床位 ID id: string; + // 床位名称 name: string; + // 所属房间 ID roomId: string; + // 床位限制相关信息 bedLimit: string; } +// 定义 IGetBedById 接口,用于根据编号获取床位时的参数结构 interface IGetBedById { + // 床位 ID bedId: string; } -// 床位状态 +// 定义床位状态列表,包含每个状态的标签和对应的值 export const IBedFlagList = [ { label: "空闲", value: "空闲" }, { label: "预定", value: "预定" }, @@ -66,13 +105,22 @@ export const IBedFlagList = [ { label: "退住审核", value: "退住审核" } ]; -// 获取楼栋-楼层-房间树 +/** + * 获取楼栋 - 楼层 - 房间树 + * @returns 一个 Promise,解析为包含楼栋 - 楼层 - 房间树数据的响应 + */ export async function getNoBedTree() { + // 发起 GET 请求到 /api/build/getNoBedTree 接口获取数据 return http.get("/api/build/getNoBedTree"); } -// 分页查询床位 +/** + * 分页查询床位 + * @param data - 包含分页查询床位所需参数的对象,符合 IPageBedByKey 接口 + * @returns 一个 Promise,解析为包含分页查询床位结果的响应 + */ export async function pageBedByKey(data: IPageBedByKey) { + // 发起 GET 请求到 /api/build/pageBedByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/build/pageBedByKey", { params: { ...data @@ -80,13 +128,23 @@ export async function pageBedByKey(data: IPageBedByKey) { }); } -// 新增楼栋 +/** + * 新增楼栋 + * @param data - 包含新增楼栋所需信息的对象,符合 IAddBuilding 接口 + * @returns 一个 Promise,解析为新增楼栋操作的响应 + */ export function addBuilding(data: IAddBuilding) { + // 发起 POST 请求到 /api/build/addBuilding 接口,将 data 作为请求体 return http.post("/api/build/addBuilding", data); } -// 根据编号获取楼栋 +/** + * 根据编号获取楼栋 + * @param data - 包含要获取的楼栋编号的对象,符合 IGetBuildingById 接口 + * @returns 一个 Promise,解析为包含指定楼栋信息的响应 + */ export async function getBuildingById(data: IGetBuildingById) { + // 发起 GET 请求到 /api/build/getBuildingById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getBuildingById", { params: { ...data @@ -94,18 +152,33 @@ export async function getBuildingById(data: IGetBuildingById) { }); } -// 编辑楼栋 +/** + * 编辑楼栋 + * @param data - 包含要编辑的楼栋信息的对象,符合 IAddBuilding 接口 + * @returns 一个 Promise,解析为编辑楼栋操作的响应 + */ export function editBuilding(data: IAddBuilding) { + // 发起 PUT 请求到 /api/build/editBuilding 接口,将 data 作为请求体 return http.put("/api/build/editBuilding", data); } -// 新增楼层 +/** + * 新增楼层 + * @param data - 包含新增楼层所需信息的对象,符合 IAddFloor 接口 + * @returns 一个 Promise,解析为新增楼层操作的响应 + */ export function addFloor(data: IAddFloor) { + // 发起 POST 请求到 /api/build/addFloor 接口,将 data 作为请求体 return http.post("/api/build/addFloor", data); } -// 根据编号获取楼层 +/** + * 根据编号获取楼层 + * @param data - 包含要获取的楼层编号的对象,符合 IGetFloorById 接口 + * @returns 一个 Promise,解析为包含指定楼层信息的响应 + */ export async function getFloorById(data: IGetFloorById) { + // 发起 GET 请求到 /api/build/getFloorById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getFloorById", { params: { ...data @@ -113,23 +186,42 @@ export async function getFloorById(data: IGetFloorById) { }); } -// 编辑楼层 +/** + * 编辑楼层 + * @param data - 包含要编辑的楼层信息的对象,符合 IAddFloor 接口 + * @returns 一个 Promise,解析为编辑楼层操作的响应 + */ export function editFloor(data: IAddFloor) { + // 发起 PUT 请求到 /api/build/editFloor 接口,将 data 作为请求体 return http.put("/api/build/editFloor", data); } -// 获取房间类型列表 +/** + * 获取房间类型列表 + * @returns 一个 Promise,解析为包含房间类型列表数据的响应 + */ export async function listRoomType() { + // 发起 GET 请求到 /api/build/listRoomType 接口获取数据 return http.get("/api/build/listRoomType"); } -// 新增房间 +/** + * 新增房间 + * @param data - 包含新增房间所需信息的对象,符合 IAddRoom 接口 + * @returns 一个 Promise,解析为新增房间操作的响应 + */ export function addRoom(data: IAddRoom) { + // 发起 POST 请求到 /api/build/addRoom 接口,将 data 作为请求体 return http.post("/api/build/addRoom", data); } -// 根据编号获取房间 +/** + * 根据编号获取房间 + * @param data - 包含要获取的房间编号的对象,符合 IGetRoomById 接口 + * @returns 一个 Promise,解析为包含指定房间信息的响应 + */ export async function getRoomById(data: IGetRoomById) { + // 发起 GET 请求到 /api/build/getRoomById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getRoomById", { params: { ...data @@ -137,13 +229,23 @@ export async function getRoomById(data: IGetRoomById) { }); } -// 编辑房间 +/** + * 编辑房间 + * @param data - 包含要编辑的房间信息的对象,符合 IAddRoom 接口 + * @returns 一个 Promise,解析为编辑房间操作的响应 + */ export function editRoom(data: IAddRoom) { + // 发起 PUT 请求到 /api/build/editRoom 接口,将 data 作为请求体 return http.put("/api/build/editRoom", data); } -// 删除节点 +/** + * 删除节点 + * @param data - 包含要删除的节点信息的对象,符合 IDeleteNode 接口 + * @returns 一个 Promise,解析为删除节点操作的响应 + */ export async function deleteNode(data: IDeleteNode) { + // 发起 DELETE 请求到 /api/build/deleteNode 接口,将 data 对象展开作为请求参数 return http.delete("/api/build/deleteNode", { params: { ...data @@ -151,13 +253,23 @@ export async function deleteNode(data: IDeleteNode) { }); } -// 新增床位 +/** + * 新增床位 + * @param data - 包含新增床位所需信息的对象,符合 IAddBed 接口 + * @returns 一个 Promise,解析为新增床位操作的响应 + */ export function addBed(data: IAddBed) { + // 发起 POST 请求到 /api/build/addBed 接口,将 data 作为请求体 return http.post("/api/build/addBed", data); } -// 根据编号获取床位 +/** + * 根据编号获取床位 + * @param data - 包含要获取的床位编号的对象,符合 IGetBedById 接口 + * @returns 一个 Promise,解析为包含指定床位信息的响应 + */ export async function getBedById(data: IGetBedById) { + // 发起 GET 请求到 /api/build/getBedById 接口,将 data 对象展开作为请求参数 return http.get("/api/build/getBedById", { params: { ...data @@ -165,13 +277,23 @@ export async function getBedById(data: IGetBedById) { }); } -// 编辑床位 +/** + * 编辑床位 + * @param data - 包含要编辑的床位信息的对象,符合 IAddBed 接口 + * @returns 一个 Promise,解析为编辑床位操作的响应 + */ export function editBed(data: IAddBed) { + // 发起 PUT 请求到 /api/build/editBed 接口,将 data 作为请求体 return http.put("/api/build/editBed", data); } -// 删除床位 +/** + * 删除床位 + * @param data - 包含要删除的床位编号的对象,符合 IGetBedById 接口 + * @returns 一个 Promise,解析为删除床位操作的响应 + */ export async function deleteBed(data: IGetBedById) { + // 发起 DELETE 请求到 /api/build/deleteBed 接口,将 data 对象展开作为请求参数 return http.delete("/api/build/deleteBed", { params: { ...data diff --git a/client/src/apis/cateringSet.ts b/client/src/apis/cateringSet.ts index 9135182..1d4ae24 100644 --- a/client/src/apis/cateringSet.ts +++ b/client/src/apis/cateringSet.ts @@ -1,26 +1,50 @@ +// 从 "@/utils" 模块导入 http 对象,用于发起 HTTP 请求 import { http } from "@/utils"; +// 从 "@/apis/dishes" 模块导入 IPageDishesByKey 接口,用于分页查询菜品时的参数类型定义 import { IPageDishesByKey } from "@/apis/dishes"; +/** + * 定义 IPageCateringSetByKey 接口,用于分页查询餐饮套餐时的参数结构 + */ interface IPageCateringSetByKey { - name:string; + // 名称,用于筛选餐饮套餐 + name: string; + // 套餐名称,由于后台与前端组件封装要求,该字段与 name 可能存在关联 setName: string; } +/** + * 定义 IAddCateringSet 接口,用于新增餐饮套餐时的请求数据结构 + */ interface IAddCateringSet { + // 餐饮套餐的 ID id: number; + // 餐饮套餐的名称 name: string; + // 餐饮套餐的月价格 monthPrice: number; - dishesIdList: any ; + // 菜品 ID 列表,类型为 any,需根据实际情况调整 + dishesIdList: any; } +/** + * 定义 IGetCateringSetById 接口,用于根据编号查询餐饮套餐时的参数结构 + */ interface IGetCateringSetById { - setId: string + // 餐饮套餐的 ID + setId: string; } -// 分页查询餐饮套餐 +/** + * 分页查询餐饮套餐 + * @param data - 包含分页查询餐饮套餐所需参数的对象,符合 IPageCateringSetByKey 接口 + * @returns 一个 Promise,解析为包含分页查询餐饮套餐结果的响应 + */ export async function pageCateringSetByKey(data: IPageCateringSetByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, 'name') ? (data.setName = data.name) : '' + // 由于后台返回的字段与前端表单数据的 prop 不一样,而组件封装要求字段一致 + // 所以如果 data 对象中有 'name' 字段,则将其值赋给 'setName' 字段 + Reflect.has(data, 'name') ? (data.setName = data.name) : ''; + // 发起 GET 请求到 /api/cateringSet/pageCateringSetByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/cateringSet/pageCateringSetByKey", { params: { ...data @@ -28,13 +52,22 @@ export async function pageCateringSetByKey(data: IPageCateringSetByKey) { }); } -// 获取菜品分类 +/** + * 获取菜品分类 + * @returns 一个 Promise,解析为包含菜品分类列表的响应 + */ export function listDishesType() { + // 发起 POST 请求到 /api/cateringSet/listDishesType 接口获取菜品分类数据 return http.post("/api/cateringSet/listDishesType"); } -// 分页查询菜品 +/** + * 分页查询菜品 + * @param data - 包含分页查询菜品所需参数的对象,符合 IPageDishesByKey 接口 + * @returns 一个 Promise,解析为包含分页查询菜品结果的响应 + */ export async function pageDishesByKey(data: IPageDishesByKey) { + // 发起 GET 请求到 /api/cateringSet/pageDishesByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/cateringSet/pageDishesByKey", { params: { ...data @@ -42,13 +75,23 @@ export async function pageDishesByKey(data: IPageDishesByKey) { }); } -// 新增餐饮套餐 +/** + * 新增餐饮套餐 + * @param data - 包含新增餐饮套餐所需信息的对象,符合 IAddCateringSet 接口 + * @returns 一个 Promise,解析为新增餐饮套餐操作的响应 + */ export function addCateringSet(data: IAddCateringSet) { + // 发起 POST 请求到 /api/cateringSet/addCateringSet 接口,将 data 作为请求体 return http.post("/api/cateringSet/addCateringSet", data); } -// 根据编号查询餐饮套餐 +/** + * 根据编号查询餐饮套餐 + * @param data - 包含要查询的餐饮套餐编号的对象,符合 IGetCateringSetById 接口 + * @returns 一个 Promise,解析为包含指定餐饮套餐信息的响应 + */ export async function getCateringSetById(data: IGetCateringSetById) { + // 发起 GET 请求到 /api/cateringSet/getCateringSetById 接口,将 data 对象展开作为请求参数 return http.get("/api/cateringSet/getCateringSetById", { params: { ...data @@ -56,13 +99,23 @@ export async function getCateringSetById(data: IGetCateringSetById) { }); } -// 编辑餐饮套餐 +/** + * 编辑餐饮套餐 + * @param data - 包含要编辑的餐饮套餐信息的对象,符合 IAddCateringSet 接口 + * @returns 一个 Promise,解析为编辑餐饮套餐操作的响应 + */ export function editCateringSet(data: IAddCateringSet) { + // 发起 PUT 请求到 /api/cateringSet/editCateringSet 接口,将 data 作为请求体 return http.put("/api/cateringSet/editCateringSet", data); } -// 删除餐饮套餐 +/** + * 删除餐饮套餐 + * @param data - 包含要删除的餐饮套餐编号的对象,符合 IGetCateringSetById 接口 + * @returns 一个 Promise,解析为删除餐饮套餐操作的响应 + */ export async function deleteCateringSet(data: IGetCateringSetById) { + // 发起 DELETE 请求到 /api/cateringSet/deleteCateringSet 接口,将 data 对象展开作为请求参数 return http.delete("/api/cateringSet/deleteCateringSet", { params: { ...data diff --git a/client/src/apis/checkContract.ts b/client/src/apis/checkContract.ts index c658840..c5a2b1e 100644 --- a/client/src/apis/checkContract.ts +++ b/client/src/apis/checkContract.ts @@ -1,44 +1,87 @@ +// 从 "@/utils" 模块导入 http 对象,用于发起 HTTP 请求 import { http } from "@/utils"; +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口,用于分页搜索老人时的参数类型定义 import { IPageSearchElderByKey } from "@/apis/bookManage"; +/** + * 定义 IPageCheckContractByKey 接口,用于分页查询入住签约时的参数结构 + */ interface IPageCheckContractByKey { + // 姓名,用于筛选入住签约记录 name: string; + // 性别,用于筛选入住签约记录 sex: string; + // 身份证号码,用于筛选入住签约记录 idNum: string; } +/** + * 定义 IAddCheckContract 接口,用于新增入住签约时的请求数据结构 + */ interface IAddCheckContract { + // 入住签约的 ID id: string; + // 护理等级 ID nursingGradeId: string; + // 餐饮套餐 ID cateringSetId: string; + // 床位 ID bedId: string; + // 姓名 name: string; + // 身份证号码 idNum: string; + // 年龄 age: string; + // 性别 sex: string; + // 电话 phone: string; + // 地址 address: string; + // 工作人员 ID staffId: string; + // 签约日期 signDate: string; + // 开始日期 startDate: string; + // 结束日期 endDate: string; + // 紧急联系人查询列表,包含多个紧急联系人信息 operateEmergencyContactQueryList: IEmergencyContact[]; } +/** + * 定义 IEmergencyContact 接口,用于表示紧急联系人的信息结构 + */ interface IEmergencyContact { + // 姓名 name: string; + // 电话 phone: string; + // 邮箱 email: string; + // 关系 relation: string; + // 接收标志 receiveFlag: string; } +/** + * 定义 IGetCheckContractById 接口,用于根据老人编号查询入住签约时的参数结构 + */ interface IGetCheckContractById { - elderId: string + // 老人 ID + elderId: string; } -// 分页查询入住签约 +/** + * 分页查询入住签约 + * @param data - 包含分页查询入住签约所需参数的对象,符合 IPageCheckContractByKey 接口 + * @returns 一个 Promise,解析为包含分页查询入住签约结果的响应 + */ export async function pageCheckContractByKey(data: IPageCheckContractByKey) { + // 发起 GET 请求到 /api/checkContract/pageCheckContractByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/checkContract/pageCheckContractByKey", { params: { ...data @@ -46,8 +89,13 @@ export async function pageCheckContractByKey(data: IPageCheckContractByKey) { }); } -// 分页搜索老人 +/** + * 分页搜索老人 + * @param data - 包含分页搜索老人所需参数的对象,符合 IPageSearchElderByKey 接口 + * @returns 一个 Promise,解析为包含分页搜索老人结果的响应 + */ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 发起 GET 请求到 /api/checkContract/pageSearchElderByKey 接口,将 data 对象展开作为请求参数 return http.get("/api/checkContract/pageSearchElderByKey", { params: { ...data @@ -55,13 +103,22 @@ export async function pageSearchElderByKey(data: IPageSearchElderByKey) { }); } -// 获取护理等级列表 +/** + * 获取护理等级列表 + * @returns 一个 Promise,解析为包含护理等级列表的响应 + */ export async function listNurseGrade() { + // 发起 GET 请求到 /api/checkContract/listNurseGrade 接口获取护理等级数据 return http.get("/api/checkContract/listNurseGrade"); } -// 根据编号查询护理等级 +/** + * 根据编号查询护理等级 + * @param nurseGradeId - 要查询的护理等级 ID + * @returns 一个 Promise,解析为包含指定护理等级信息的响应 + */ export async function getNurseGradeById(nurseGradeId: string) { + // 发起 GET 请求到 /api/checkContract/getNurseGradeById 接口,将 nurseGradeId 作为请求参数 return http.get("/api/checkContract/getNurseGradeById", { params: { nurseGradeId @@ -69,13 +126,22 @@ export async function getNurseGradeById(nurseGradeId: string) { }); } -// 获取餐饮套餐列表 +/** + * 获取餐饮套餐列表 + * @returns 一个 Promise,解析为包含餐饮套餐列表的响应 + */ export async function listCateringSet() { + // 发起 GET 请求到 /api/checkContract/listCateringSet 接口获取餐饮套餐数据 return http.get("/api/checkContract/listCateringSet"); } -// 根据编号查询餐饮套餐 +/** + * 根据编号查询餐饮套餐 + * @param cateringSetId - 要查询的餐饮套餐 ID + * @returns 一个 Promise,解析为包含指定餐饮套餐信息的响应 + */ export async function getCateringSetById(cateringSetId: string) { + // 发起 GET 请求到 /api/checkContract/getCateringSetById 接口,将 cateringSetId 作为请求参数 return http.get("/api/checkContract/getCateringSetById", { params: { cateringSetId @@ -83,13 +149,22 @@ export async function getCateringSetById(cateringSetId: string) { }); } -// 获取楼栋树 +/** + * 获取楼栋树 + * @returns 一个 Promise,解析为包含楼栋树信息的响应 + */ export async function getBuildTree() { + // 发起 GET 请求到 /api/checkContract/getBuildTree 接口获取楼栋树数据 return http.get("/api/checkContract/getBuildTree"); } -// 根据编号查询床位 +/** + * 根据编号查询床位 + * @param bedId - 要查询的床位 ID + * @returns 一个 Promise,解析为包含指定床位信息的响应 + */ export async function getBedById(bedId: string) { + // 发起 GET 请求到 /api/checkContract/getBedById 接口,将 bedId 作为请求参数 return http.get("/api/checkContract/getBedById", { params: { bedId @@ -97,18 +172,32 @@ export async function getBedById(bedId: string) { }); } -// 获取营销人员 +/** + * 获取营销人员 + * @returns 一个 Promise,解析为包含营销人员列表的响应 + */ export async function listReserveStaff() { + // 发起 GET 请求到 /api/checkContract/listReserveStaff 接口获取营销人员数据 return http.get("/api/checkContract/listReserveStaff"); } -// 新增入住签约 +/** + * 新增入住签约 + * @param data - 包含新增入住签约所需信息的对象,符合 IAddCheckContract 接口 + * @returns 一个 Promise,解析为新增入住签约操作的响应 + */ export function addCheckContract(data: IAddCheckContract) { + // 发起 POST 请求到 /api/checkContract/addCheckContract 接口,将 data 作为请求体 return http.post("/api/checkContract/addCheckContract", data); } -// 根据老人编号查询入住签约 +/** + * 根据老人编号查询入住签约 + * @param data - 包含要查询的老人编号的对象,符合 IGetCheckContractById 接口 + * @returns 一个 Promise,解析为包含指定入住签约信息的响应 + */ export async function getCheckContractById(data: IGetCheckContractById) { + // 发起 GET 请求到 /api/checkContract/getCheckContractById 接口,将 data 对象展开作为请求参数 return http.get("/api/checkContract/getCheckContractById", { params: { ...data @@ -116,13 +205,23 @@ export async function getCheckContractById(data: IGetCheckContractById) { }); } -// 编辑入住签约 +/** + * 编辑入住签约 + * @param data - 包含要编辑的入住签约信息的对象,符合 IAddCheckContract 接口 + * @returns 一个 Promise,解析为编辑入住签约操作的响应 + */ export function editCheckContract(data: IAddCheckContract) { + // 发起 PUT 请求到 /api/checkContract/editCheckContract 接口,将 data 作为请求体 return http.put("/api/checkContract/editCheckContract", data); } -// 删除入住签约 +/** + * 删除入住签约 + * @param data - 包含要删除的入住签约编号的对象,符合 IGetCheckContractById 接口 + * @returns 一个 Promise,解析为删除入住签约操作的响应 + */ export async function deleteCheckContract(data: IGetCheckContractById) { + // 发起 DELETE 请求到 /api/checkContract/deleteCheckContract 接口,将 data 对象展开作为请求参数 return http.delete("/api/checkContract/deleteCheckContract", { params: { ...data diff --git a/client/src/apis/consume.ts b/client/src/apis/consume.ts index 2f2a005..69bb33b 100644 --- a/client/src/apis/consume.ts +++ b/client/src/apis/consume.ts @@ -1,13 +1,25 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageConsumeByKey,用于描述分页查询消费记录时的请求参数结构 interface IPageConsumeByKey { + // 老人姓名,用于筛选消费记录,类型为字符串 elderName: string; + // 开始时间,用于筛选消费记录的时间范围,类型为字符串 startTime: string; + // 结束时间,用于筛选消费记录的时间范围,类型为字符串 endTime: string; } -// 分页查询消费记录 +/** + * 定义一个异步函数 pageConsumeByKey,用于分页查询消费记录 + * @param data - 一个符合 IPageConsumeByKey 接口的对象,包含查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询消费记录的响应结果 + */ export async function pageConsumeByKey(data: IPageConsumeByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/consume/pageConsumeByKey" + // 将传入的 data 对象展开作为请求的参数 return http.get("/api/consume/pageConsumeByKey", { params: { ...data diff --git a/client/src/apis/dishes.ts b/client/src/apis/dishes.ts index accd0c3..f647a4a 100644 --- a/client/src/apis/dishes.ts +++ b/client/src/apis/dishes.ts @@ -1,36 +1,60 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IListDishesType,用于描述获取菜品分类列表时的请求参数结构 interface IListDishesType { + // 菜品分类名称,用于筛选菜品分类列表,类型为字符串 dishesTypeName: string; } +// 导出一个接口 IPageDishesByKey,用于描述分页查询菜品时的请求参数结构 export interface IPageDishesByKey { + // 菜品名称,用于筛选菜品,类型为字符串 dishesName: string; + // 菜品类型 ID,用于筛选属于特定类型的菜品,类型为数字 typeId: number; } +// 定义一个接口 IAddDishesType,用于描述新增菜品分类时的数据结构 interface IAddDishesType { + // 菜品分类的 ID,类型为数字 id: number; + // 菜品分类的名称,类型为字符串 name: string; } +// 定义一个接口 IGetDishesTypeById,用于描述根据编号获取菜品分类时的请求参数结构 interface IGetDishesTypeById { + // 菜品分类 ID,类型为字符串 dishesTypeId: string; } +// 定义一个接口 IAddDishes,用于描述新增菜品时的数据结构 interface IAddDishes { + // 菜品的 ID,类型为数字 id: number; + // 菜品的名称,类型为字符串 name: string; + // 菜品的价格,类型为字符串 price: string; + // 菜品所属类型的 ID,类型为数字 typeId: number; } +// 导出一个接口 IGetDishesById,用于描述根据编号获取菜品时的请求参数结构 export interface IGetDishesById { + // 菜品 ID,类型为字符串 dishesId: string; } -// 获取菜品分类列表 +/** + * 定义一个异步函数 listDishesType,用于获取菜品分类列表 + * @param data - 一个符合 IListDishesType 接口的对象,包含获取菜品分类列表所需的参数 + * @returns 一个 Promise 对象,解析后得到的是获取菜品分类列表的响应结果 + */ export async function listDishesType(data: IListDishesType) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/listDishesType" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/listDishesType", { params: { ...data @@ -38,8 +62,14 @@ export async function listDishesType(data: IListDishesType) { }); } -// 分页查询菜品 +/** + * 定义一个异步函数 pageDishesByKey,用于分页查询菜品 + * @param data - 一个符合 IPageDishesByKey 接口的对象,包含分页查询菜品所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询菜品的响应结果 + */ export async function pageDishesByKey(data: IPageDishesByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/pageDishesByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/pageDishesByKey", { params: { ...data @@ -47,13 +77,25 @@ export async function pageDishesByKey(data: IPageDishesByKey) { }); } -// 新增菜品分类 +/** + * 定义一个函数 addDishesType,用于新增菜品分类 + * @param data - 一个符合 IAddDishesType 接口的对象,包含新增菜品分类所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增菜品分类操作的响应结果 + */ export function addDishesType(data: IAddDishesType) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/dishes/addDishesType" + // 将 data 对象作为请求的主体 return http.post("/api/dishes/addDishesType", data); } -// 根据编号获取菜品分类 +/** + * 定义一个异步函数 getDishesTypeById,用于根据编号获取菜品分类 + * @param data - 一个符合 IGetDishesTypeById 接口的对象,包含根据编号获取菜品分类所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取菜品分类的响应结果 + */ export async function getDishesTypeById(data: IGetDishesTypeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/getDishesTypeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/getDishesTypeById", { params: { ...data @@ -61,13 +103,25 @@ export async function getDishesTypeById(data: IGetDishesTypeById) { }); } -// 编辑菜品分类 +/** + * 定义一个函数 editDishesType,用于编辑菜品分类 + * @param data - 一个符合 IAddDishesType 接口的对象,包含编辑菜品分类所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑菜品分类操作的响应结果 + */ export function editDishesType(data: IAddDishesType) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/dishes/editDishesType" + // 将 data 对象作为请求的主体 return http.put("/api/dishes/editDishesType", data); } -// 删除菜品分类 +/** + * 定义一个异步函数 deleteDishesType,用于删除菜品分类 + * @param data - 一个符合 IGetDishesTypeById 接口的对象,包含删除菜品分类所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除菜品分类操作的响应结果 + */ export async function deleteDishesType(data: IGetDishesTypeById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/dishes/deleteDishesType" + // 将 data 对象展开作为请求的参数 return http.delete("/api/dishes/deleteDishesType", { params: { ...data @@ -75,13 +129,25 @@ export async function deleteDishesType(data: IGetDishesTypeById) { }); } -// 新增菜品 +/** + * 定义一个函数 addDishes,用于新增菜品 + * @param data - 一个符合 IAddDishes 接口的对象,包含新增菜品所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增菜品操作的响应结果 + */ export function addDishes(data: IAddDishes) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/dishes/addDishes" + // 将 data 对象作为请求的主体 return http.post("/api/dishes/addDishes", data); } -// 根据编号获取菜品 +/** + * 定义一个异步函数 getDishesById,用于根据编号获取菜品 + * @param data - 一个符合 IGetDishesById 接口的对象,包含根据编号获取菜品所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取菜品的响应结果 + */ export async function getDishesById(data: IGetDishesById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/dishes/getDishesById" + // 将 data 对象展开作为请求的参数 return http.get("/api/dishes/getDishesById", { params: { ...data @@ -89,13 +155,25 @@ export async function getDishesById(data: IGetDishesById) { }); } -// 编辑菜品 +/** + * 定义一个函数 editDishes,用于编辑菜品 + * @param data - 一个符合 IAddDishes 接口的对象,包含编辑菜品所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑菜品操作的响应结果 + */ export function editDishes(data: IAddDishes) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/dishes/editDishes" + // 将 data 对象作为请求的主体 return http.put("/api/dishes/editDishes", data); } -// 删除菜品 +/** + * 定义一个异步函数 deleteDishes,用于删除菜品 + * @param data - 一个符合 IGetDishesById 接口的对象,包含删除菜品所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除菜品操作的响应结果 + */ export async function deleteDishes(data: IGetDishesById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/dishes/deleteDishes" + // 将 data 对象展开作为请求的参数 return http.delete("/api/dishes/deleteDishes", { params: { ...data diff --git a/client/src/apis/home.ts b/client/src/apis/home.ts index 501dc4e..bdd99c2 100644 --- a/client/src/apis/home.ts +++ b/client/src/apis/home.ts @@ -1,25 +1,56 @@ +// 从 '@/utils' 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from '@/utils' -// 可售床位 + +/** + * 定义一个异步函数 getAvailableBed,用于获取可售床位信息 + * @returns 一个 Promise 对象,解析后得到的是获取可售床位信息的响应结果 + */ export async function getAvailableBed() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/availableBed' return http.get('/api/home/availableBed') } -// 业务趋势 + +/** + * 定义一个异步函数 getBusinessTrend,用于获取业务趋势信息 + * @returns 一个 Promise 对象,解析后得到的是获取业务趋势信息的响应结果 + */ export async function getBusinessTrend() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/businessTrend' return http.get('/api/home/businessTrend') } -// 客户来源渠道 + +/** + * 定义一个异步函数 getClientSource,用于获取客户来源渠道信息 + * @returns 一个 Promise 对象,解析后得到的是获取客户来源渠道信息的响应结果 + */ export async function getClientSource() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/clientSource' return http.get('/api/home/clientSource') } -// 本月业绩排行 + +/** + * 定义一个异步函数 getMonthPerformanceRank,用于获取本月业绩排行信息 + * @returns 一个 Promise 对象,解析后得到的是获取本月业绩排行信息的响应结果 + */ export async function getMonthPerformanceRank() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/monthPerformanceRank' return http.get('/api/home/monthPerformanceRank') } -// 今日概览 + +/** + * 定义一个异步函数 getTodayOverview,用于获取今日概览信息 + * @returns 一个 Promise 对象,解析后得到的是获取今日概览信息的响应结果 + */ export async function getTodayOverview() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/todayOverview' return http.get('/api/home/todayOverview') } -// 今日销售跟进 + +/** + * 定义一个异步函数 getTodaySaleFollow,用于获取今日销售跟进信息 + * @returns 一个 Promise 对象,解析后得到的是获取今日销售跟进信息的响应结果 + */ export async function getTodaySaleFollow() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/home/todaySaleFollow' return http.get('/api/home/todaySaleFollow') } diff --git a/client/src/apis/index.ts b/client/src/apis/index.ts index 067f355..9c44323 100644 --- a/client/src/apis/index.ts +++ b/client/src/apis/index.ts @@ -1,16 +1,29 @@ +// 注释说明这是动态路由的假数据,并且提示该部分代码可以删除 // 动态路由的假数据 可删除 +// 从 '@/utils' 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from '@/utils' +// 注释说明发起请求的时机:在动态设置路由的时候(data => 树形结构 => 路由列表) // 问题:何时发起请求? 在动态设置路由的时候(data => 树形结构 => 路由列表) +/** + * 定义一个函数 getUserRouteList,用于获取用户的路由列表 + * @param uid - 用户 ID,类型为数字,用于作为请求参数来获取对应用户的路由列表 + * @returns 一个 Promise 对象,解析后得到的是获取到的用户路由列表数据(成功时),或者在失败时抛出错误 + */ function getUserRouteList(uid: number) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/user_router_list',请求体包含用户 ID return http .post('/api/user_router_list', { uid }) + // 处理请求成功的情况,直接返回请求得到的数据 .then((data) => data) + // 处理请求失败的情况,捕获错误并重新抛出,以便上层调用者处理 .catch((err) => { throw err }) } +// 导出 getUserRouteList 函数,以便在其他模块中可以导入和使用该函数 export { getUserRouteList } diff --git a/client/src/apis/order.ts b/client/src/apis/order.ts index 5c3a7a5..e98f9dd 100644 --- a/client/src/apis/order.ts +++ b/client/src/apis/order.ts @@ -1,40 +1,70 @@ +// 从 "@/utils" 模块导入名为 http 的对象, +// 推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; + +// 从 "@/apis/bookManage" 模块导入 IPageSearchElderByKey 接口, +// 用于描述分页搜索老人时的请求参数结构 import { IPageSearchElderByKey } from "@/apis/bookManage"; + +// 从 "@/apis/dishes" 模块导入 IPageDishesByKey 接口, +// 用于描述分页查询菜品时的请求参数结构 import { IPageDishesByKey } from "@/apis/dishes"; +// 定义一个接口 IPageOrderByKey,用于描述分页查询点餐时的请求参数结构 interface IPageOrderByKey { - elderName:string; + // 老人姓名,用于筛选点餐记录,类型为字符串 + elderName: string; + // 老人电话,用于筛选点餐记录,类型为字符串 elderPhone: string; } +// 定义一个接口 IAddOrder,用于描述新增点餐时的数据结构 interface IAddOrder { + // 老人 ID,类型为字符串 elderId: string; + // 就餐方式,类型为字符串 dineType: string; + // 就餐日期,类型为字符串 dineDate: string; + // 点的菜品列表,类型为 any,需根据实际情况调整 orderDishesList: any; } +// 定义一个接口 IGetOrderById,用于描述根据编号查询点餐时的请求参数结构 interface IGetOrderById { + // 菜品 ID,这里可能是点餐记录中的菜品 ID,用于查询特定点餐记录,类型为字符串 dishesId: string; } +// 定义一个接口 ISendOrder,用于描述送餐时的数据结构 interface ISendOrder { + // 订单 ID,类型为字符串 id: string; + // 送餐日期,类型为字符串 deliverDishesDate: string; + // 送餐人员 ID,类型为字符串 staffId: string; } -// 就餐方式 +// 定义一个名为 IDineTypeList 的常量,是一个包含就餐方式选项的数组,每个选项有标签和对应的值 export const IDineTypeList = [ { label: "送餐", value: "送餐" }, { label: "堂食", value: "堂食" } ]; -// 分页查询点餐 +/** + * 定义一个异步函数 pageOrderByKey,用于分页查询点餐 + * @param data - 一个符合 IPageOrderByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询点餐的响应结果 + */ export async function pageOrderByKey(data: IPageOrderByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - // Reflect.has(data, 'name') ? (data.gradeName = data.name) : '' - // Reflect.has(data, 'type') ? (data.nurseType = data.type) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以原本计划请求前处理某些字段, + // 但这里代码被注释掉了,可能是暂不处理或有其他调整 + // Reflect.has(data, 'name')? (data.gradeName = data.name) : '' + // Reflect.has(data, 'type')? (data.nurseType = data.type) : '' + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/pageOrderByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/order/pageOrderByKey", { params: { ...data @@ -42,31 +72,55 @@ export async function pageOrderByKey(data: IPageOrderByKey) { }); } -// 分页搜索老人 +/** + * 定义一个函数 pageSearchElderByKey,用于分页搜索老人 + * @param data - 一个符合 IPageSearchElderByKey 接口的对象,包含搜索所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页搜索老人的响应结果 + */ export function pageSearchElderByKey(data: IPageSearchElderByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/pageSearchElderByKey" + // 将 data 对象展开作为请求的参数 return http.get('/api/order/pageSearchElderByKey', { params: { ...data } - }) + }); } -// 分页查询菜品 +/** + * 定义一个异步函数 pageDishesByKey,用于分页查询菜品(这里是在点餐相关模块中查询菜品) + * @param data - 一个符合 IPageDishesByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询菜品的响应结果 + */ export async function pageDishesByKey(data: IPageDishesByKey) { - return http.get("/api/order/pageDishesByKey",{ - params:{ + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/pageDishesByKey" + // 将 data 对象展开作为请求的参数 + return http.get("/api/order/pageDishesByKey", { + params: { ...data } }); } -// 新增点餐 +/** + * 定义一个函数 addOrder,用于新增点餐 + * @param data - 一个符合 IAddOrder 接口的对象,包含新增点餐所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增点餐操作的响应结果 + */ export function addOrder(data: IAddOrder) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/order/addOrder" + // 将 data 对象作为请求的主体 return http.post("/api/order/addOrder", data); } -// 根据编号查询点餐 +/** + * 定义一个异步函数 getOrderById,用于根据编号查询点餐 + * @param data - 一个符合 IGetOrderById 接口的对象,包含根据编号查询点餐所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询点餐的响应结果 + */ export async function getOrderById(data: IGetOrderById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/getOrderById" + // 将 data 对象展开作为请求的参数 return http.get("/api/order/getOrderById", { params: { ...data @@ -74,12 +128,22 @@ export async function getOrderById(data: IGetOrderById) { }); } -// 护理人员 +/** + * 定义一个异步函数 listNurseStaff,用于获取护理人员列表(这里在点餐模块中获取护理人员列表,可能与业务逻辑有关) + * @returns 一个 Promise 对象,解析后得到的是获取护理人员列表的响应结果 + */ export async function listNurseStaff() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/order/listNurseStaff" return http.get("/api/order/listNurseStaff"); } -// 送餐 +/** + * 定义一个函数 sendOrder,用于送餐 + * @param data - 一个符合 ISendOrder 接口的对象,包含送餐所需的数据 + * @returns 一个 Promise 对象,解析后得到的是送餐操作的响应结果 + */ export function sendOrder(data: ISendOrder) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/order/sendOrder" + // 将 data 对象作为请求的主体 return http.put("/api/order/sendOrder", data); } diff --git a/client/src/apis/retreatAudit.ts b/client/src/apis/retreatAudit.ts index 2abb61d..79fe3ee 100644 --- a/client/src/apis/retreatAudit.ts +++ b/client/src/apis/retreatAudit.ts @@ -1,29 +1,46 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可能用于发起 HTTP 请求,例如对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageRetreatAuditByKey,用于描述分页查询退住审核时的请求参数结构 interface IPageRetreatAuditByKey { + // 老人姓名,用于筛选退住审核记录,类型为字符串 elderName: string; + // 老人性别,用于筛选退住审核记录,类型为字符串 elderSex: string; + // 身份证号码,用于筛选退住审核记录,类型为字符串 idNum: string; } +// 定义一个接口 IGetElderFeeById,用于描述根据编号获取老人费用详情时的请求参数结构 interface IGetElderFeeById { + // 老人 ID,类型为数字,用于指定获取费用详情的老人 elderId: number; } +// 定义一个接口 IAuditElderFee,用于描述审核老人费用详情时的数据结构 interface IAuditElderFee { + // 申请 ID,类型为数字,用于标识退住申请 applyId: number; + // 老人 ID,类型为数字,用于关联老人 elderId: number; + // 审核结果,类型为数字,可能是枚举值(如 0 表示不通过,1 表示通过等) auditResult: number; } -// 审核结果 +// 定义一个常量 IAuditResultList,包含审核结果的选项,每个选项有标签和对应的值 export const IAuditResultList = [ { label: "通过", value: "通过" }, { label: "不通过", value: "不通过" } ]; -// 分页查询退住审核 +/** + * 定义一个异步函数 pageRetreatAuditByKey,用于分页查询退住审核 + * @param data - 一个符合 IPageRetreatAuditByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询退住审核的响应结果 + */ export async function pageRetreatAuditByKey(data: IPageRetreatAuditByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/retreatAudit/pageRetreatAuditByKey" + // 将 data 对象展开作为请求的参数 return http.get("/api/retreatAudit/pageRetreatAuditByKey", { params: { ...data @@ -31,8 +48,14 @@ export async function pageRetreatAuditByKey(data: IPageRetreatAuditByKey) { }); } -// 根据编号获取老人费用详情 +/** + * 定义一个异步函数 getElderFeeById,用于根据编号获取老人费用详情 + * @param data - 一个符合 IGetElderFeeById 接口的对象,包含根据编号获取老人费用详情所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号获取老人费用详情的响应结果 + */ export async function getElderFeeById(data: IGetElderFeeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/retreatAudit/getElderFeeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/retreatAudit/getElderFeeById", { params: { ...data @@ -40,7 +63,13 @@ export async function getElderFeeById(data: IGetElderFeeById) { }); } -// 审核老人费用详情 +/** + * 定义一个函数 auditElderFee,用于审核老人费用详情 + * @param data - 一个符合 IAuditElderFee 接口的对象,包含审核老人费用详情所需的数据 + * @returns 一个 Promise 对象,解析后得到的是审核老人费用详情操作的响应结果 + */ export function auditElderFee(data: IAuditElderFee) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/retreatAudit/auditElderFee" + // 将 data 对象作为请求的主体 return http.put("/api/retreatAudit/auditElderFee", data); } diff --git a/client/src/apis/roomType.ts b/client/src/apis/roomType.ts index 738f889..0458f2a 100644 --- a/client/src/apis/roomType.ts +++ b/client/src/apis/roomType.ts @@ -1,24 +1,42 @@ +// 从 "@/utils" 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageRoomTypeByKey,用于描述分页查询房间类型时的请求参数结构 interface IPageRoomTypeByKey { + // 名称,用于筛选房间类型,类型为字符串 name: string; + // 房间类型名称,用于筛选房间类型,类型为字符串 roomTypeName: string; } +// 定义一个接口 IAddRoomType,用于描述新增房间类型时的数据结构 interface IAddRoomType { + // 房间类型的 ID,类型为字符串 id: string; + // 房间类型的名称,类型为字符串 name: string; + // 房间类型的月价格,类型为字符串 monthPrice: string; } +// 定义一个接口 IGetRoomTypeById,用于描述根据编号查询房间类型时的请求参数结构 interface IGetRoomTypeById { + // 房间类型 ID,类型为字符串 roomTypeId: string; } -// 分页查询房间类型 +/** + * 定义一个异步函数 pageRoomTypeByKey,用于分页查询房间类型 + * @param data - 一个符合 IPageRoomTypeByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询房间类型的响应结果 + */ export async function pageRoomTypeByKey(data: IPageRoomTypeByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, "name") ? (data.roomTypeName = data.name) : ""; + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以请求前增加一些这两个字段 + // 如果 data 对象中有 "name" 字段,则将其值赋给 "roomTypeName" 字段 + Reflect.has(data, "name")? (data.roomTypeName = data.name) : ""; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/roomType/pageRoomTypeByKey" + // 将处理后的 data 对象展开作为请求的参数 return http.get("/api/roomType/pageRoomTypeByKey", { params: { ...data @@ -26,13 +44,25 @@ export async function pageRoomTypeByKey(data: IPageRoomTypeByKey) { }); } -// 新增房间类型 +/** + * 定义一个函数 addRoomType,用于新增房间类型 + * @param data - 一个符合 IAddRoomType 接口的对象,包含新增房间类型所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增房间类型操作的响应结果 + */ export function addRoomType(data: IAddRoomType) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/roomType/addRoomType" + // 将 data 对象作为请求的主体 return http.post("/api/roomType/addRoomType", data); } -// 根据编号查询房间类型 +/** + * 定义一个异步函数 getRoomTypeById,用于根据编号查询房间类型 + * @param data - 一个符合 IGetRoomTypeById 接口的对象,包含根据编号查询房间类型所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询房间类型的响应结果 + */ export async function getRoomTypeById(data: IGetRoomTypeById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/roomType/getRoomTypeById" + // 将 data 对象展开作为请求的参数 return http.get("/api/roomType/getRoomTypeById", { params: { ...data @@ -40,13 +70,25 @@ export async function getRoomTypeById(data: IGetRoomTypeById) { }); } -// 编辑房间类型 +/** + * 定义一个函数 editRoomType,用于编辑房间类型 + * @param data - 一个符合 IAddRoomType 接口的对象,包含编辑房间类型所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑房间类型操作的响应结果 + */ export function editRoomType(data: IAddRoomType) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/roomType/editRoomType" + // 将 data 对象作为请求的主体 return http.put("/api/roomType/editRoomType", data); } -// 删除房间类型 +/** + * 定义一个异步函数 deleteRoomType,用于删除房间类型 + * @param data - 一个符合 IGetRoomTypeById 接口的对象,包含删除房间类型所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除房间类型操作的响应结果 + */ export async function deleteRoomType(data: IGetRoomTypeById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/roomType/deleteRoomType" + // 将 data 对象展开作为请求的参数 return http.delete("/api/roomType/deleteRoomType", { params: { ...data diff --git a/client/src/apis/soldManage.ts b/client/src/apis/soldManage.ts index 36d9117..96a0ee5 100644 --- a/client/src/apis/soldManage.ts +++ b/client/src/apis/soldManage.ts @@ -1,58 +1,110 @@ +// 从 '@/utils' 模块导入名为 http 的对象,该对象可能是用于发起 HTTP 请求的工具,比如对 axios 等请求库的封装 import { http } from '@/utils' +// 定义一个接口 IAddConsult,用于描述新增咨询时的数据结构 interface IAddConsult { - address: string - age: string - consultContent: string - consultDate: string - consultName: string - consultPhone: string - elderName: string - elderPhone: string - idNum: string - relation: string - sex: string - sourceId: string | number - staffId: string | number - consultId?: string | number - elderId?: string | number + // 地址,类型为字符串 + address: string; + // 年龄,类型为字符串 + age: string; + // 咨询内容,类型为字符串 + consultContent: string; + // 咨询日期,类型为字符串 + consultDate: string; + // 咨询人姓名,类型为字符串 + consultName: string; + // 咨询人电话,类型为字符串 + consultPhone: string; + // 老人姓名,类型为字符串 + elderName: string; + // 老人电话,类型为字符串 + elderPhone: string; + // 身份证号码,类型为字符串 + idNum: string; + // 关系,类型为字符串 + relation: string; + // 性别,类型为字符串 + sex: string; + // 来源 ID,可以是字符串或数字 + sourceId: string | number; + // 接待人 ID,可以是字符串或数字 + staffId: string | number; + // 咨询 ID,可选,类型可以是字符串或数字 + consultId?: string | number; + // 老人 ID,可选,类型可以是字符串或数字 + elderId?: string | number; } +// 定义一个接口 ISearhFormConsultByKey,用于描述分页查询咨询时的请求参数结构 interface ISearhFormConsultByKey { - pageNum: number - pageSize: number - consultName?: string - consultPhone?: string - elderName?: string - elderPhone?: string - endTime?: string - sourceId?: string - staffId?: string - startTime?: string - sourceName?: string - staffName?: string + // 页码,类型为数字 + pageNum: number; + // 每页数量,类型为数字 + pageSize: number; + // 咨询人姓名,可选,类型为字符串 + consultName?: string; + // 咨询人电话,可选,类型为字符串 + consultPhone?: string; + // 老人姓名,可选,类型为字符串 + elderName?: string; + // 老人电话,可选,类型为字符串 + elderPhone?: string; + // 结束时间,可选,类型为字符串 + endTime?: string; + // 来源 ID,可选,类型为字符串 + sourceId?: string; + // 接待人 ID,可选,类型为字符串 + staffId?: string; + // 开始时间,可选,类型为字符串 + startTime?: string; + // 来源名称,可选,类型为字符串 + sourceName?: string; + // 接待人名称,可选,类型为字符串 + staffName?: string; } +// 定义一个接口 IConsultByForm,用于描述根据咨询人编号和老人编号获取咨询信息时的请求参数结构 interface IConsultByForm { - consultId: string | number - elderId: string | number + // 咨询 ID,可以是字符串或数字 + consultId: string | number; + // 老人 ID,可以是字符串或数字 + elderId: string | number; } -// 获取咨询管理表格数据 根据咨询人编号和老人编号获取咨询信息 +/** + * 定义一个异步函数 getConsultByForm,用于根据咨询人编号和老人编号获取咨询信息 + * @param data - 一个符合 IConsultByForm 接口的对象,包含获取咨询信息所需的参数 + * @returns 一个 Promise 对象,解析后得到的是获取咨询信息的响应结果 + */ export async function getConsultByForm(data: IConsultByForm) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/getConsultByConsultIdAndElderId' + // 将 data 对象展开作为请求的参数 return http.get('/api/consult/getConsultByConsultIdAndElderId', { params: { ...data } }) } -//新增资询 + +/** + * 定义一个函数 addConsult,用于新增咨询 + * @param data - 一个符合 IAddConsult 接口的对象,包含新增咨询所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增咨询操作的响应结果 + */ export function addConsult(data: IAddConsult) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/consult/addConsult' + // 将 data 对象作为请求的主体 return http.post('/api/consult/addConsult', data) } -// 删除咨询 +/** + * 定义一个函数 delConsult,用于删除咨询 + * @param elderId - 老人 ID,可以是字符串或数字,用于标识要删除的咨询关联的老人 + * @returns 一个 Promise 对象,解析后得到的是删除咨询操作的响应结果 + */ export function delConsult(elderId: string | number) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/consult/deleteConsult' + // 将 elderId 作为请求的参数 return http.delete('/api/consult/deleteConsult', { params: { elderId @@ -60,13 +112,25 @@ export function delConsult(elderId: string | number) { }) } -//编辑咨询 +/** + * 定义一个函数 editConsult,用于编辑咨询 + * @param data - 一个符合 IAddConsult 接口的对象,包含编辑咨询所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑咨询操作的响应结果 + */ export function editConsult(data: IAddConsult) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/consult/editConsult' + // 将 data 对象作为请求的主体 return http.put('/api/consult/editConsult', data) } -// 转为意向客户 +/** + * 定义一个函数 intentionConsult,用于将咨询转为意向客户 + * @param elderId - 老人 ID,可以是字符串或数字,用于标识要转为意向客户的咨询关联的老人 + * @returns 一个 Promise 对象,解析后得到的是将咨询转为意向客户操作的响应结果 + */ export function intentionConsult(elderId: string | number) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/consult/intentionConsult' + // 将包含 elderId 的对象作为请求的主体 return http.put('/api/consult/intentionConsult', { data: { elderId @@ -74,21 +138,37 @@ export function intentionConsult(elderId: string | number) { }) } -// 来源渠道 +/** + * 定义一个函数 listConsultSource,用于获取来源渠道 + * @returns 一个 Promise 对象,解析后得到的是获取来源渠道的响应结果 + */ export function listConsultSource() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/listConsultSource' return http.get('/api/consult/listConsultSource') } -// 接待人 +/** + * 定义一个函数 listConsultStaff,用于获取接待人 + * @returns 一个 Promise 对象,解析后得到的是获取接待人的响应结果 + */ export function listConsultStaff() { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/listConsultStaff' return http.get('/api/consult/listConsultStaff') } -// 分页查询咨询 +/** + * 定义一个异步函数 pageConsultByKey,用于分页查询咨询 + * @param data - 一个符合 ISearhFormConsultByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询咨询的响应结果 + */ export async function pageConsultByKey(data: ISearhFormConsultByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, 'sourceName') ? (data.sourceId = data.sourceName) : '' - Reflect.has(data, 'staffName') ? (data.staffId = data.staffName) : '' + // 因为后台返回的字段与前端表单数据的 prop 不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 + // 如果 data 对象中有'sourceName' 字段,则将其值赋给'sourceId' 字段 + Reflect.has(data,'sourceName')? (data.sourceId = data.sourceName) : ''; + // 如果 data 对象中有'staffName' 字段,则将其值赋给'staffId' 字段 + Reflect.has(data,'staffName')? (data.staffId = data.staffName) : ''; + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/consult/pageConsultByKey' + // 将处理后的 data 对象展开作为请求的参数 const res = await http.get('/api/consult/pageConsultByKey', { params: { ...data @@ -97,17 +177,28 @@ export async function pageConsultByKey(data: ISearhFormConsultByKey) { return res } -//意向用户接口 +// 定义一个接口 ISearhFormIntentionByKey,用于描述分页查询意向客户时的请求参数结构 interface ISearhFormIntentionByKey { - pageNum: number - pageSize: number - elderName?: string - elderPhone?: string | number - labelId?: number + // 页码,类型为数字 + pageNum: number; + // 每页数量,类型为数字 + pageSize: number; + // 老人姓名,可选,类型为字符串 + elderName?: string; + // 老人电话,可选,可以是字符串或数字 + elderPhone?: string | number; + // 标签 ID,可选,类型为数字 + labelId?: number; } -//分页查询意向客户 +/** + * 定义一个异步函数 pageIntentionByKey,用于分页查询意向客户 + * @param data - 一个符合 ISearhFormIntentionByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询意向客户的响应结果 + */ export async function pageIntentionByKey(data: ISearhFormIntentionByKey) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/pageIntentionByKey' + // 将 data 对象展开作为请求的参数 const res = await http.get('/api/intention/pageIntentionByKey', { params: { ...data @@ -116,23 +207,47 @@ export async function pageIntentionByKey(data: ISearhFormIntentionByKey) { return res } -// 新增沟通记录 +/** + * 定义一个函数 addCommunicationRecord,用于新增沟通记录 + * @param data - 包含新增沟通记录所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是新增沟通记录操作的响应结果 + */ export function addCommunicationRecord(data: any) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/intention/addCommunicationRecord' + // 将 data 对象作为请求的主体 return http.post('/api/intention/addCommunicationRecord', data) } -// 新增意向客户 +/** + * 定义一个函数 addIntention,用于新增意向客户 + * @param data - 包含新增意向客户所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是新增意向客户操作的响应结果 + */ export function addIntention(data: any) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/intention/addIntention' + // 将 data 对象作为请求的主体 return http.post('/api/intention/addIntention', data) } -// 新增回访计划 +/** + * 定义一个函数 addVisitPlan,用于新增回访计划 + * @param data - 包含新增回访计划所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是新增回访计划操作的响应结果 + */ export function addVisitPlan(data: any) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/intention/addVisitPlan' + // 将 data 对象作为请求的主体 return http.post('/api/intention/addVisitPlan', data) } -// 新增沟通记录 +/** + * 定义一个函数 deleteCommunicationRecord,用于删除沟通记录 + * @param communicationRecordId - 沟通记录 ID,类型为 any(具体类型需根据实际情况确定),用于标识要删除的沟通记录 + * @returns 一个 Promise 对象,解析后得到的是删除沟通记录操作的响应结果 + */ export function deleteCommunicationRecord(communicationRecordId: any) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/intention/deleteCommunicationRecord' + // 将 communicationRecordId 作为请求的参数 return http.delete('/api/intention/deleteCommunicationRecord', { params: { communicationRecordId @@ -140,8 +255,14 @@ export function deleteCommunicationRecord(communicationRecordId: any) { }) } -// 删除回访计划 +/** + * 定义一个函数 deleteVisitPlan,用于删除回访计划 + * @param visitPlanId - 回访计划 ID,类型为 any(具体类型需根据实际情况确定),用于标识要删除的回访计划 + * @returns 一个 Promise 对象,解析后得到的是删除回访计划操作的响应结果 + */ export function deleteVisitPlan(visitPlanId: any) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/intention/deleteVisitPlan' + // 将 visitPlanId 作为请求的参数 return http.delete('/api/intention/deleteVisitPlan', { params: { visitPlanId @@ -149,28 +270,58 @@ export function deleteVisitPlan(visitPlanId: any) { }) } -// 编辑沟通记录 +/** + * 定义一个函数 editCommunicationRecord,用于编辑沟通记录 + * @param data - 包含编辑沟通记录所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是编辑沟通记录操作的响应结果 + */ export function editCommunicationRecord(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/editCommunicationRecord' + //将 data 对象作为请求的主体 return http.put('/api/intention/editCommunicationRecord', data) } -// 编辑意向客户 +/** + * 定义一个函数 editIntention,用于编辑意向客户 + * @param data - 包含编辑意向客户所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是编辑意向客户操作的响应结果 + */ export function editIntention(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/editIntention' + // 将 data 对象作为请求的主体 return http.put('/api/intention/editIntention', data) } -// 编辑老人标签 +/** + * 定义一个函数 editElderLabel,用于编辑老人标签 + * @param data - 包含编辑老人标签所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是编辑老人标签操作的响应结果 + */ export function editElderLabel(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/editElderLabel' + // 将 data 对象作为请求的主体 return http.put('/api/intention/editElderLabel', data) } -// 执行回访计划 +/** + * 定义一个函数 executeVisitPlan,用于执行回访计划 + * @param data - 包含执行回访计划所需数据的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是执行回访计划操作的响应结果 + */ export function executeVisitPlan(data: any) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/intention/executeVisitPlan' + // 将 data 对象作为请求的主体 return http.put('/api/intention/executeVisitPlan', data) } -// 根据编号获取编辑意向客户标签 +/** + * 定义一个函数 getEditElderLabelById,用于根据编号获取编辑意向客户标签 + * @param data - 包含获取编辑意向客户标签所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是根据编号获取编辑意向客户标签的响应结果 + */ export function getEditElderLabelById(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/getEditElderLabelById' + // 将 data 对象展开作为请求的参数 return http.get('/api/intention/getEditElderLabelById', { params: { ...data @@ -178,8 +329,14 @@ export function getEditElderLabelById(data: any) { }) } -// 根据编号获取意向客户标签 +/** + * 定义一个函数 getElderLabelById,用于根据编号获取意向客户标签 + * @param data - 包含获取意向客户标签所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是根据编号获取意向客户标签的响应结果 + */ export function getElderLabelById(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/getElderLabelById' + // 将 data 对象展开作为请求的参数 return http.get('/api/intention/getElderLabelById', { params: { ...data @@ -187,8 +344,14 @@ export function getElderLabelById(data: any) { }) } -// 根据编号获取意向客户 +/** + * 定义一个函数 getIntentById,用于根据编号获取意向客户 + * @param data - 包含获取意向客户所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是根据编号获取意向客户的响应结果 + */ export function getIntentById(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/intention/getIntentById' + // 将 data 对象展开作为请求的参数 return http.get('/api/intention/getIntentById', { params: { ...data @@ -196,8 +359,14 @@ export function getIntentById(data: any) { }) } -//客户标签 +/** + * 定义一个函数 listLabel,用于获取客户标签 + * @param data - 包含获取客户标签所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是获取客户标签的响应结果 + */ export function listLabel(data: any) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/intention/listLabel' + // 将 data 对象展开作为请求的参数 return http.get('/intention/listLabel', { params: { ...data @@ -205,29 +374,12 @@ export function listLabel(data: any) { }) } -// 分页查询沟通记录 +/** + * 定义一个函数 pageCommunicationRecord,用于分页查询沟通记录 + * @param data - 包含分页查询沟通记录所需参数的对象,类型为 any(具体结构需根据实际情况确定) + * @returns 一个 Promise 对象,解析后得到的是分页查询沟通记录的响应结果 + */ export function pageCommunicationRecord(data: any) { - return http.get('/intention/pageCommunicationRecord', { - params: { - ...data - } - }) -} - -// 分页搜索老人 -export function pageSearchElderByKey(data: any) { - return http.get('/intention/pageSearchElderByKey', { - params: { - ...data - } - }) -} - -// 分页查询回访计划 -export function pageVisitPlan(data: any) { - return http.get('/intention/pageVisitPlan', { - params: { - ...data - } - }) -} + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/intention/pageCommunicationRecord' + // 将 data 对象展开作为请求的参数 + return http.get diff --git a/client/src/apis/source.ts b/client/src/apis/source.ts index 8b54d01..58128b1 100644 --- a/client/src/apis/source.ts +++ b/client/src/apis/source.ts @@ -1,23 +1,40 @@ +// 从 "@/utils" 模块导入名为 http 的对象,推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 import { http } from "@/utils"; +// 定义一个接口 IPageSourceByKey,用于描述分页查询来源渠道时的请求参数结构 interface IPageSourceByKey { + // 名称,用于筛选来源渠道,类型为字符串 name: string; + // 来源渠道名称,用于筛选来源渠道,类型为字符串 sourceName: string; } +// 定义一个接口 IAddSource,用于描述新增来源渠道时的数据结构 interface IAddSource { + // 来源渠道的 ID,类型为字符串 id: string; + // 来源渠道的名称,类型为字符串 name: string; } +// 定义一个接口 IGetSourceById,用于描述根据编号查询来源渠道时的请求参数结构 interface IGetSourceById { + // 来源渠道 ID,类型为字符串 sourceId: string; } -// 分页查询来源渠道 +/** + * 定义一个异步函数 pageSourceByKey,用于分页查询来源渠道 + * @param data - 一个符合 IPageSourceByKey 接口的对象,包含分页查询所需的参数 + * @returns 一个 Promise 对象,解析后得到的是分页查询来源渠道的响应结果 + */ export async function pageSourceByKey(data: IPageSourceByKey) { - // 因为后台返回的字段与前端表单数据的prop不一样,但是组件封装是需要一样的,所以请求前增加一些这两个字段 - Reflect.has(data, "name") ? (data.sourceName = data.name) : ""; + // 因为后台返回的字段与前端表单数据的 prop 不一样, + // 但是组件封装需要一样,所以请求前增加一些这两个字段 + // 如果 data 对象中有 "name" 字段,则将其值赋给 "sourceName" 字段 + Reflect.has(data, "name")? (data.sourceName = data.name) : ""; + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/source/pageSourceByKey" + // 将处理后的 data 对象展开作为请求的参数 return http.get("/api/source/pageSourceByKey", { params: { ...data @@ -25,13 +42,25 @@ export async function pageSourceByKey(data: IPageSourceByKey) { }); } -// 新增来源渠道 +/** + * 定义一个函数 addSource,用于新增来源渠道 + * @param data - 一个符合 IAddSource 接口的对象,包含新增来源渠道所需的数据 + * @returns 一个 Promise 对象,解析后得到的是新增来源渠道操作的响应结果 + */ export function addSource(data: IAddSource) { + // 使用导入的 http 对象发起 POST 请求,请求地址为 "/api/source/addSource" + // 将 data 对象作为请求的主体 return http.post("/api/source/addSource", data); } -// 根据编号查询来源渠道 +/** + * 定义一个异步函数 getSourceById,用于根据编号查询来源渠道 + * @param data - 一个符合 IGetSourceById 接口的对象,包含根据编号查询来源渠道所需的参数 + * @returns 一个 Promise 对象,解析后得到的是根据编号查询来源渠道的响应结果 + */ export async function getSourceById(data: IGetSourceById) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 "/api/source/getSourceById" + // 将 data 对象展开作为请求的参数 return http.get("/api/source/getSourceById", { params: { ...data @@ -39,13 +68,25 @@ export async function getSourceById(data: IGetSourceById) { }); } -// 编辑来源渠道 +/** + * 定义一个函数 editSource,用于编辑来源渠道 + * @param data - 一个符合 IAddSource 接口的对象,包含编辑来源渠道所需的数据 + * @returns 一个 Promise 对象,解析后得到的是编辑来源渠道操作的响应结果 + */ export function editSource(data: IAddSource) { + // 使用导入的 http 对象发起 PUT 请求,请求地址为 "/api/source/editSource" + // 将 data 对象作为请求的主体 return http.put("/api/source/editSource", data); } -// 删除来源渠道 +/** + * 定义一个异步函数 deleteSource,用于删除来源渠道 + * @param data - 一个符合 IGetSourceById 接口的对象,包含删除来源渠道所需的参数 + * @returns 一个 Promise 对象,解析后得到的是删除来源渠道操作的响应结果 + */ export async function deleteSource(data: IGetSourceById) { + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 "/api/source/deleteSource" + // 将 data 对象展开作为请求的参数 return http.delete("/api/source/deleteSource", { params: { ...data diff --git a/client/src/apis/user.ts b/client/src/apis/user.ts index 93eba6e..2317095 100644 --- a/client/src/apis/user.ts +++ b/client/src/apis/user.ts @@ -1,60 +1,106 @@ -import { http } from '@/utils' +// 从 '@/utils' 模块导入名为 http 的对象,推测该对象是用于发起 HTTP 请求的工具,可能是对 axios 等请求库的封装 +import { http } from '@/utils'; +// 定义一个接口 ILoginForm,用于描述登录表单的数据结构 interface ILoginForm { - pass: string - phone: string + // 密码,类型为字符串 + pass: string; + // 电话号码,类型为字符串 + phone: string; } +// 定义一个接口 ISendCodeForm,用于描述发送验证码表单的数据结构 interface ISendCodeForm { - pass: string - account: string + // 密码,类型为字符串 + pass: string; + // 账号,类型为字符串 + account: string; } +// 定义一个接口 IForgetPass,用于描述忘记密码时的数据结构 interface IForgetPass { - code: string - pass: string - account: string + // 验证码,类型为字符串 + code: string; + // 新密码,类型为字符串 + pass: string; + // 账号,类型为字符串 + account: string; } +// 定义一个接口 IEditPass,用于描述修改密码时的数据结构 interface IEditPass { - newPass: string - oldPass: string + // 新密码,类型为字符串 + newPass: string; + // 旧密码,类型为字符串 + oldPass: string; } +// 定义一个类 IEditPassImpl,实现了 IEditPass 接口,用于表示修改密码的数据实体 export class IEditPassImpl implements IEditPass { - newPass: string - oldPass: string + // 新密码属性 + newPass: string; + // 旧密码属性 + oldPass: string; + // 构造函数,接收新密码和旧密码作为参数,并赋值给对应的属性 constructor(newPass: string, oldPass: string) { - this.newPass = newPass - this.oldPass = oldPass + this.newPass = newPass; + this.oldPass = oldPass; } } -// 登录 +/** + * 定义一个函数 getLogin,用于处理登录操作 + * @param data - 一个符合 ILoginForm 接口的对象,包含登录所需的数据 + * @returns 一个 Promise 对象,解析后得到的是登录操作的响应结果 + */ export function getLogin(data: ILoginForm) { - return http.post('/api/account/login', data) + // 使用导入的 http 对象发起 POST 请求,请求地址为 '/api/account/login' + // 将 data 对象作为请求的主体 + return http.post('/api/account/login', data); } -// 发送验证码 +/** + * 定义一个异步函数 sendCode,用于发送验证码 + * @param data - 一个符合 ISendCodeForm 接口的对象,包含发送验证码所需的数据 + * @returns 一个 Promise 对象,解析后得到的是发送验证码操作的响应结果 + */ export async function sendCode(data: ISendCodeForm) { + // 使用导入的 http 对象发起 GET 请求,请求地址为 '/api/account/sendCode' + // 将 data 对象展开作为请求的参数 return http.get('/api/account/sendCode', { params: { ...data } - }) + }); } -// 忘记密码 +/** + * 定义一个异步函数 forgetPass,用于处理忘记密码的操作 + * @param data - 一个符合 IForgetPass 接口的对象,包含忘记密码操作所需的数据 + * @returns 一个 Promise 对象,解析后得到的是忘记密码操作的响应结果 + */ export async function forgetPass(data: IForgetPass) { - return http.put('/api/account/forget', data) + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/account/forget' + // 将 data 对象作为请求的主体 + return http.put('/api/account/forget', data); } -// 修改密码 +/** + * 定义一个异步函数 editPass,用于处理修改密码的操作 + * @param data - 一个符合 IEditPass 接口的对象,包含修改密码操作所需的数据 + * @returns 一个 Promise 对象,解析后得到的是修改密码操作的响应结果 + */ export async function editPass(data: IEditPass) { - return http.put('/api/account/edit', data) + // 使用导入的 http 对象发起 PUT 请求,请求地址为 '/api/account/edit' + // 将 data 对象作为请求的主体 + return http.put('/api/account/edit', data); } -// 退出登录 +/** + * 定义一个异步函数 getLogout,用于处理退出登录的操作 + * @returns 一个 Promise 对象,解析后得到的是退出登录操作的响应结果 + */ export async function getLogout() { - return http.delete('/api/account/logout') + // 使用导入的 http 对象发起 DELETE 请求,请求地址为 '/api/account/logout' + return http.delete('/api/account/logout'); } diff --git a/client/src/components/ProTable/Grid/components/GridItem.vue b/client/src/components/ProTable/Grid/components/GridItem.vue deleted file mode 100644 index 7e5389e..0000000 --- a/client/src/components/ProTable/Grid/components/GridItem.vue +++ /dev/null @@ -1,109 +0,0 @@ - - - - - - - - - diff --git a/client/src/components/ProTable/Grid/index.vue b/client/src/components/ProTable/Grid/index.vue deleted file mode 100644 index fa2858b..0000000 --- a/client/src/components/ProTable/Grid/index.vue +++ /dev/null @@ -1,207 +0,0 @@ - - - - - - - - - diff --git a/client/src/components/ProTable/Grid/interface/index.ts b/client/src/components/ProTable/Grid/interface/index.ts deleted file mode 100644 index a3ff77d..0000000 --- a/client/src/components/ProTable/Grid/interface/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// 定义一个类型别名 BreakPoint,它的值只能是 'xs'、'sm'、'md'、'lg' 或 'xl' 中的一个, -// 通常用于表示响应式布局中的不同屏幕断点 -export type BreakPoint = 'xs' |'sm' |'md' | 'lg' | 'xl'; - -// 定义一个类型别名 Responsive,它是一个对象类型,包含两个可选属性 span 和 offset。 -// span 用于表示在响应式布局中元素所占的列数,类型为 number 类型的可选值。 -// offset 用于表示在响应式布局中元素的偏移量,类型为 number 类型的可选值。 -// 这个类型通常用于描述在不同屏幕断点下元素的布局属性 -export type Responsive = { - span?: number; - offset?: number; -}; diff --git a/client/src/components/ProTable/IconPark/index.vue b/client/src/components/ProTable/IconPark/index.vue deleted file mode 100644 index 9ca92a5..0000000 --- a/client/src/components/ProTable/IconPark/index.vue +++ /dev/null @@ -1,45 +0,0 @@ - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/components/ColSetting.vue b/client/src/components/ProTable/ProTable/components/ColSetting.vue deleted file mode 100644 index 12323c8..0000000 --- a/client/src/components/ProTable/ProTable/components/ColSetting.vue +++ /dev/null @@ -1,88 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 暂无可配置列 - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/components/Pagination.vue b/client/src/components/ProTable/ProTable/components/Pagination.vue deleted file mode 100644 index 7109b8f..0000000 --- a/client/src/components/ProTable/ProTable/components/Pagination.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/components/TableColumn.vue b/client/src/components/ProTable/ProTable/components/TableColumn.vue deleted file mode 100644 index 233dbf7..0000000 --- a/client/src/components/ProTable/ProTable/components/TableColumn.vue +++ /dev/null @@ -1,103 +0,0 @@ - - - - - - diff --git a/client/src/components/ProTable/ProTable/index.md b/client/src/components/ProTable/ProTable/index.md deleted file mode 100644 index 1a70ec4..0000000 --- a/client/src/components/ProTable/ProTable/index.md +++ /dev/null @@ -1,87 +0,0 @@ -## ProTable 文档 📚 - -### 1、ProTable 属性(ProTableProps): - -> 使用 `v-bind="$attrs"` 通过属性透传将 **ProTable** 组件属性全部透传到 **el-table** 上,所以我们支持 **el-table** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** - -| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | -| :----------: | :---------: | :------: | :-----------------------------------: | :--------------------------------------------------------------------------------------------------: | -| columns | ColumnProps | ✅ | — | ProTable 组件会根据此字段渲染搜索表单与表格列,详情见 ColumnProps | -| requestApi | Function | ✅ | — | 获取表格数据的请求 API | -| requestAuto | Boolean | ❌ | true | 表格初始化是否自动执行请求 API | -| dataCallback | Function | ❌ | — | 后台返回数据的回调函数,可对后台返回数据进行处理 | -| title | String | ❌ | — | 表格标题,目前只在打印的时候用到 | -| pagination | Boolean | ❌ | true | 是否显示分页组件:pagination 为 false 后台返回数据应该没有分页信息 和 list 字段,data 就是 list 数据 | -| initParam | Object | ❌ | {} | 表格请求的初始化参数,该值变化会自动请求表格数据 | -| toolButton | Boolean | ❌ | true | 是否显示表格功能按钮 | -| rowKey | String | ❌ | 'id' | 当表格数据多选时,所指定的 id | -| searchCol | Object | ❌ | { xs: 1, sm: 2, md: 2, lg: 3, xl: 4 } | 表格搜索项每列占比配置 | - -### 2、Column 配置(ColumnProps): - -> 使用 `v-bind="column"` 通过属性透传将每一项 **column** 属性全部透传到 **el-table-column** 上,所以我们支持 **el-table-column** 的所有 **Props** 属性。在此基础上,还扩展了以下 **Props:** - -| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | -| :----------: | :----------------: | :------: | :----: | :---------------------------------------------------------------------------------------------: | -| tag | Boolean | ❌ | false | 当前单元格值是否为标签展示,可通过 enum 数据中 tagType 字段指定 tag 类型 | -| isShow | Boolean | ❌ | true | 当前列是否显示在表格内(只对 prop 列生效) | -| search | SearchProps | ❌ | — | 搜索项配置,详情见 SearchProps | -| enum | Object \| Function | ❌ | — | 字典,可格式化单元格内容,还可以作为搜索框的下拉选项(字典可以为 API 请求函数,内部会自动执行) | -| isFilterEnum | Boolean | ❌ | true | 当前单元格值是否根据 enum 格式化(例如 enum 只作为搜索项数据,不参与内容格式化) | -| fieldNames | Object | ❌ | — | 指定字典 label && value 的 key 值 | -| headerRender | Function | ❌ | — | 自定义表头内容渲染(tsx 语法、h 语法) | -| render | Function | ❌ | — | 自定义单元格内容渲染(tsx 语法、h 语法) | -| \_children | ColumnProps | ❌ | — | 多级表头 | - -### 3、搜索项 配置(SearchProps): - -> 使用 `v-bind="column.search.props“` 通过属性透传将 **search.props** 属性全部透传到每一项搜索组件上,所以我们支持 **input、select、tree-select、date-packer、time-picker、time-select、switch** 大部分属性,并在其基础上还扩展了以下 **Props:** - -| 属性名 | 类型 | 是否必传 | 默认值 | 属性描述 | -| :----------: | :----: | :------: | :----: | :--------------------------------------------------------------------------------------------------------------------------------------------: | -| el | String | ✅ | — | 当前项搜索框的类型,支持:input、input-number、select、select-v2、tree-select、cascader、date-packer、time-picker、time-select、switch、slider | -| props | Object | ❌ | — | 根据 element plus 官方文档来传递,该属性所有值会透传到组件 | -| defaultValue | Any | ❌ | — | 搜索项默认值 | -| key | String | ❌ | — | 当搜索项 key 不为 prop 属性时,可通过 key 指定 | -| order | Number | ❌ | — | 搜索项排序(从小到大) | -| span | Number | ❌ | 1 | 搜索项所占用的列数,默认为 1 列 | -| offset | Number | ❌ | — | 搜索字段左侧偏移列数 | - -### 4、ProTable 事件: - -> 根据 **ElementPlus Table** 文档在 **ProTable** 组件上绑定事件即可,组件会通过 **$attrs** 透传给 **el-table**。 -> -> [el-table 事件文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E4%BA%8B%E4%BB%B6) - -### 5、ProTable 方法: - -> **ProTable** 组件暴露了 **el-table** 实例和一些组件内部的参数和方法: -> -> [el-table 方法文档链接](https://element-plus.org/zh-CN/component/table.html#table-%E6%96%B9%E6%B3%95) - -| 方法名 | 描述 | -| :-------------: | :-------------------------------------------------------------------: | -| element | `el-table` 实例,可以通过`element.方法名`来调用 `el-table` 的所有方法 | -| tableData | 当前页面所展示的数据 | -| searchParam | 所有的搜索参数,不包含分页 | -| pageable | 当前表格的分页数据 | -| getTableList | 获取、刷新表格数据的方法(携带所有参数) | -| reset | 重置表格查询参数,相当于点击重置搜索按钮 | -| clearSelection | 清空表格所选择的数据,除此方法之外还可使用 `element.clearSelection()` | -| enumMap | 当前表格使用的所有字典数据(Map 数据结构) | -| isSelected | 表格是否选中数据 | -| selectedList | 表格选中的数据列表 | -| selectedListIds | 表格选中的数据列表的 id | - -### 6、ProTable 插槽: - -| 插槽名 | 描述 | -| :----------------------: | :-------------------------------------------------------------------------------------------------------------------------------------: | -| — | 默认插槽,支持直接在 ProTable 中写 el-table-column 标签 | -| tableHeader | 自定义表格头部左侧区域的插槽,一般情况该区域放操作按钮 | -| toolButton | 自定义表格头部左右侧侧功能区域的插槽 | -| append | 插入至表格最后一行之后的内容, 如果需要对表格的内容进行无限滚动操作,可能需要用到这个 slot。 若表格有合计行,该 slot 会位于合计行之上。 | -| empty | 当表格数据为空时自定义的内容 | -| pagination | 分页组件插槽 | -| `column.prop` | 单元格的作用域插槽 | -| `column.prop` + "Header" | 表头的作用域插槽 | diff --git a/client/src/components/ProTable/ProTable/index.vue b/client/src/components/ProTable/ProTable/index.vue deleted file mode 100644 index 912cb40..0000000 --- a/client/src/components/ProTable/ProTable/index.vue +++ /dev/null @@ -1,397 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 暂无数据 - - - - - - - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/ProTable/interface/index.ts b/client/src/components/ProTable/ProTable/interface/index.ts deleted file mode 100644 index 8d9e597..0000000 --- a/client/src/components/ProTable/ProTable/interface/index.ts +++ /dev/null @@ -1,84 +0,0 @@ -// 从 "element-plus/es/components/table/src/table-column/defaults" 导入 TableColumnCtx 类型 -// TableColumnCtx 可能是 Element Plus 中表格列的上下文类型,包含了表格列的一些默认属性和方法 -import { TableColumnCtx } from "element-plus/es/components/table/src/table-column/defaults"; -// 从 "@/components/Grid/interface" 导入 BreakPoint 和 Responsive 类型 -// BreakPoint 可能表示响应式布局中的不同断点(如 xs, sm, md, lg, xl 等) -// Responsive 可能用于描述在不同断点下的响应式配置 -import { BreakPoint, Responsive } from "@/components/Grid/interface"; - -// 定义一个接口 EnumProps,用于描述枚举属性 -export interface EnumProps { - // 选项框显示的文字,类型为字符串 - label: string; - // 选项框值,可以是任意类型 - value: any; - // 是否禁用此选项,可选,默认为 undefined,类型为布尔值 - disabled?: boolean; - // 当 tag 为 true 时,此选择会指定 tag 显示类型,可选,默认为 undefined,类型为字符串 - tagType?: string; - // 为树形选择时,可以通过 children 属性指定子选项,可选,默认为 undefined,类型为 EnumProps 数组 - children?: EnumProps[]; - // 允许添加任意其他属性,属性名和值的类型都为任意类型 - [key: string]: any; -} - -// 定义一个类型别名 TypeProp,其值只能是 "index"、"selection" 或 "expand" 中的一个 -export type TypeProp = "index" | "selection" | "expand"; - -// 定义一个类型别名 SearchType,用于表示搜索框的类型 -// 可以是 "input"、"input-number" 等多种 Element Plus 组件类型 -export type SearchType = - | "input" - | "input-number" - | "select" - | "select-v2" - | "tree-select" - | "cascader" - | "date-picker" - | "time-picker" - | "time-select" - | "switch" - | "slider"; - -// 定义一个接口 SearchProps,用于描述搜索项的属性 -export type SearchProps = { - // 当前项搜索框的类型,类型为 SearchType - el: SearchType; - // 搜索项参数,根据 element plus 官方文档来传递,该属性所有值会透传到组件,可选,默认为 undefined - props?: any; - // 当搜索项 key 不为 prop 属性时,可通过 key 指定,可选,默认为 undefined,类型为字符串 - key?: string; - // 搜索项排序(从大到小),可选,默认为 undefined,类型为数字 - order?: number; - // 搜索项所占用的列数,默认为 1 列,可选,默认为 undefined,类型为数字 - span?: number; - // 搜索字段左侧偏移列数,可选,默认为 undefined,类型为数字 - offset?: number; - // 搜索项默认值,可以是字符串、数字、布尔值或任意类型的数组,可选,默认为 undefined - defaultValue?: string | number | boolean | any[]; - // 扩展为包含 BreakPoint 类型的键和 Responsive 类型的值的部分记录,用于实现响应式配置 -} & Partial>; - -// 定义一个接口 ColumnProps,用于描述表格列的属性 -// 扩展自 Partial, "children" | "renderHeader" | "renderCell">>,表示部分继承 TableColumnCtx 类型并去除 "children"、"renderHeader" 和 "renderCell" 属性 -export interface ColumnProps - extends Partial, "children" | "renderHeader" | "renderCell">> { - // 是否是标签展示,可选,默认为 undefined,类型为布尔值 - tag?: boolean; - // 是否显示在表格当中,可选,默认为 undefined,类型为布尔值 - isShow?: boolean; - // 搜索项配置,可选,默认为 undefined,类型为 SearchProps 或 undefined - search?: SearchProps | undefined; - // 枚举类型(渲染值的字典),可以是 EnumProps 数组或一个返回 Promise 的函数,可选,默认为 undefined - enum?: EnumProps[] | ((params?: any) => Promise); - // 当前单元格值是否根据 enum 格式化(示例:enum 只作为搜索项数据),可选,默认为 undefined,类型为布尔值 - isFilterEnum?: boolean; - // 指定 label && value 的 key 值,可选,默认为 undefined,类型为包含 label 和 value 键的对象 - fieldNames?: { label: string; value: string }; - // 自定义表头内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受 ColumnProps 类型参数并返回任意类型的函数 - headerRender?: (row: ColumnProps) => any; - // 自定义单元格内容渲染(tsx语法),可选,默认为 undefined,类型为一个接受包含 row 属性且类型为 T 的对象并返回任意类型的函数 - render?: (scope: { row: T }) => any; - // 多级表头,可选,默认为 undefined,类型为 ColumnProps 数组 - _children?: ColumnProps[]; -} diff --git a/client/src/components/ProTable/ReImageVerify/index.ts b/client/src/components/ProTable/ReImageVerify/index.ts deleted file mode 100644 index 6b4eca3..0000000 --- a/client/src/components/ProTable/ReImageVerify/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// 从当前目录下的 src 文件夹中的 index.vue 文件导入组件 -// 这里将导入的组件命名为 reImageVerify,它应该是一个 Vue 组件 -import reImageVerify from './src/index.vue' - -/** 图形验证码组件 */ -// 使用具名导出的方式,将导入的组件以 ReImageVerify 这个名称导出 -// 具名导出允许在导入时指定具体要导入的内容,方便在其他文件中使用 -export const ReImageVerify = reImageVerify - -// 使用默认导出的方式,将导入的组件作为默认导出 -// 默认导出允许在导入时可以使用任意名称来接收该组件,通常一个文件只能有一个默认导出 -export default ReImageVerify diff --git a/client/src/components/ProTable/ReImageVerify/src/hooks.ts b/client/src/components/ProTable/ReImageVerify/src/hooks.ts deleted file mode 100644 index 898eb05..0000000 --- a/client/src/components/ProTable/ReImageVerify/src/hooks.ts +++ /dev/null @@ -1,133 +0,0 @@ -import { ref, onMounted } from 'vue' - -/** - * 绘制图形验证码 - * @param width - 图形宽度 - * @param height - 图形高度 - */ -// 定义一个名为 useImageVerify 的函数,用于生成和管理图形验证码,接受图形宽度和高度作为参数,有默认值 -export const useImageVerify = (width = 120, height = 40) => { - // 创建一个响应式引用 domRef,用于存储 元素的引用 - const domRef = ref() - // 创建一个响应式变量 imgCode,用于存储生成的图形验证码字符串 - const imgCode = ref('') - - // 定义一个函数 setImgCode,用于设置 imgCode 的值 - function setImgCode(code: string) { - imgCode.value = code - } - - // 定义一个函数 getImgCode,用于在 上绘制验证码并获取生成的验证码字符串 - function getImgCode() { - // 如果 domRef 没有值(即 元素未挂载),则直接返回 - if (!domRef.value) return - // 调用 draw 函数绘制验证码,并将返回的验证码字符串赋值给 imgCode - imgCode.value = draw(domRef.value, width, height) - } - - // 在组件挂载后执行的钩子函数,调用 getImgCode 函数生成验证码 - onMounted(() => { - getImgCode() - }) - - // 返回一个包含 domRef、imgCode、setImgCode 和 getImgCode 的对象,以便在其他地方使用这些变量和函数 - return { - domRef, - imgCode, - setImgCode, - getImgCode - } -} - -// 定义一个函数 randomNum,用于生成指定范围内的随机整数 -function randomNum(min: number, max: number) { - // 使用 Math.random() 生成一个 0 到 1 之间的随机小数,然后通过计算得到指定范围内的整数 - const num = Math.floor(Math.random() * (max - min) + min) - return num -} - -// 定义一个函数 randomColor,用于生成指定范围内的随机颜色(RGB 格式) -function randomColor(min: number, max: number) { - // 分别生成随机的红(r)、绿(g)、蓝(b)分量值 - const r = randomNum(min, max) - const g = randomNum(min, max) - const b = randomNum(min, max) - // 返回 RGB 格式的颜色字符串 - return `rgb(${r},${g},${b})` -} - -// 定义一个函数 draw,用于在 元素上绘制图形验证码 -function draw(dom: HTMLCanvasElement, width: number, height: number) { - // 初始化一个空字符串 imgCode,用于存储生成的验证码 - let imgCode = '' - - // 定义一个字符串 NUMBER_STRING,包含数字 0 到 9,用于生成验证码字符 - const NUMBER_STRING = '0123456789' - - // 获取 元素的 2D 绘图上下文 ctx - const ctx = dom.getContext('2d') - // 如果获取上下文失败(ctx 为 null),则直接返回空的验证码字符串 - if (!ctx) return imgCode - - // 设置绘图上下文的填充样式为随机颜色(背景色) - ctx.fillStyle = randomColor(180, 230) - // 使用填充样式绘制一个矩形,覆盖整个 区域,作为验证码的背景 - ctx.fillRect(0, 0, width, height) - // 循环 4 次,生成 4 个验证码字符 - for (let i = 0; i < 4; i += 1) { - // 从 NUMBER_STRING 中随机选取一个字符作为验证码字符 - const text = NUMBER_STRING[randomNum(0, NUMBER_STRING.length)] - // 将选取的字符添加到 imgCode 字符串中 - imgCode += text - // 随机生成字体大小 - const fontSize = randomNum(18, 41) - // 随机生成字符的旋转角度 - const deg = randomNum(-30, 30) - // 设置绘图上下文的字体样式 - ctx.font = `${fontSize}px Simhei` - // 设置文本基线为顶部 - ctx.textBaseline = 'top' - // 设置绘图上下文的填充样式为随机颜色(字符颜色) - ctx.fillStyle = randomColor(80, 150) - // 保存当前绘图上下文的状态 - ctx.save() - // 平移绘图上下文的原点到指定位置(每个字符的起始位置) - ctx.translate(30 * i + 15, 15) - // 旋转绘图上下文指定的角度 - ctx.rotate((deg * Math.PI) / 180) - // 在指定位置绘制字符 - ctx.fillText(text, -15 + 5, -15) - // 恢复之前保存的绘图上下文状态 - ctx.restore() - } - // 循环 5 次,绘制 5 条随机直线 - for (let i = 0; i < 5; i += 1) { - // 开始绘制路径 - ctx.beginPath() - // 设置路径的起始点为随机位置 - ctx.moveTo(randomNum(0, width), randomNum(0, height)) - // 设置路径的终点为随机位置 - ctx.lineTo(randomNum(0, width), randomNum(0, height)) - // 设置绘图上下文的描边样式为随机颜色 - ctx.strokeStyle = randomColor(180, 230) - // 关闭路径 - ctx.closePath() - // 绘制路径(直线) - ctx.stroke() - } - // 循环 41 次,绘制 41 个随机圆形 - for (let i = 0; i < 41; i += 1) { - // 开始绘制路径 - ctx.beginPath() - // 绘制一个圆形,圆心为随机位置,半径为 1 - ctx.arc(randomNum(0, width), randomNum(0, height), 1, 0, 2 * Math.PI) - // 关闭路径 - ctx.closePath() - // 设置绘图上下文的填充样式为随机颜色 - ctx.fillStyle = randomColor(150, 200) - // 填充圆形 - ctx.fill() - } - // 返回生成的验证码字符串 - return imgCode -} diff --git a/client/src/components/ProTable/ReImageVerify/src/index.vue b/client/src/components/ProTable/ReImageVerify/src/index.vue deleted file mode 100644 index b8548ec..0000000 --- a/client/src/components/ProTable/ReImageVerify/src/index.vue +++ /dev/null @@ -1,55 +0,0 @@ - - - - - - diff --git a/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue b/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue deleted file mode 100644 index 7e966ba..0000000 --- a/client/src/components/ProTable/SearchForm/components/SearchFormItem.vue +++ /dev/null @@ -1,117 +0,0 @@ - - - - :is="`el-${column.search.el}`" - v-bind="handleSearchProps" - v-model.trim="searchParam[column.search.key?? handleProp(column.prop!)]" - :data="column.search?.el === 'tree-select'? columnEnum : []" - :options=" - ['cascader','select-v2'].includes(column.search?.el)? columnEnum : [] - " - :placeholder="placeholder" - :clearable="clearable" - range-separator="至" - start-placeholder="开始时间" - end-placeholder="结束时间" - > - - - {{ data[fieldNames.label] }} - - - - - v-for="(col, index) in columnEnum" - :key="index" - :label="col[fieldNames.label]" - :value="col[fieldNames.value]" - > - - - - - - - diff --git a/client/src/components/ProTable/SearchForm/index.vue b/client/src/components/ProTable/SearchForm/index.vue deleted file mode 100644 index e587851..0000000 --- a/client/src/components/ProTable/SearchForm/index.vue +++ /dev/null @@ -1,142 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - 搜索 - - - 重置 - - - {{ collapsed? '展开' : '合并' }} - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/SvgIcon/index.vue b/client/src/components/ProTable/SvgIcon/index.vue deleted file mode 100644 index e25234e..0000000 --- a/client/src/components/ProTable/SvgIcon/index.vue +++ /dev/null @@ -1,49 +0,0 @@ - - - - - - - - - - - diff --git a/client/src/components/ProTable/elderListDialog/index.vue b/client/src/components/ProTable/elderListDialog/index.vue deleted file mode 100644 index 172f22c..0000000 --- a/client/src/components/ProTable/elderListDialog/index.vue +++ /dev/null @@ -1,118 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 选择 - - - - - - - - - - - diff --git a/client/src/components/ProTable/my-card/my-card.vue b/client/src/components/ProTable/my-card/my-card.vue deleted file mode 100644 index d050f98..0000000 --- a/client/src/components/ProTable/my-card/my-card.vue +++ /dev/null @@ -1,30 +0,0 @@ - - - - - - - - {{ title }} - - - - - - - - diff --git a/client/src/components/ProTable/treeDialog/index.vue b/client/src/components/ProTable/treeDialog/index.vue deleted file mode 100644 index c4d327e..0000000 --- a/client/src/components/ProTable/treeDialog/index.vue +++ /dev/null @@ -1,90 +0,0 @@ - - - - - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/upload/image/index.vue b/client/src/components/ProTable/upload/image/index.vue deleted file mode 100644 index e739333..0000000 --- a/client/src/components/ProTable/upload/image/index.vue +++ /dev/null @@ -1,189 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue b/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue deleted file mode 100644 index c13ef16..0000000 --- a/client/src/components/ProTable/wen-test/DynamicAdditionComponent.vue +++ /dev/null @@ -1,47 +0,0 @@ - - - - 添加组件 - - - - - - - - - - - diff --git a/client/src/hooks/interface/index.ts b/client/src/hooks/interface/index.ts index e26a422..05cfd4d 100644 --- a/client/src/hooks/interface/index.ts +++ b/client/src/hooks/interface/index.ts @@ -1,27 +1,42 @@ +// 定义一个名为 Table 的命名空间 export namespace Table { + // 在 Table 命名空间内,定义一个接口 Pageable,用于描述分页相关的属性 export interface Pageable { + // 当前页码,类型为数字 pageNum: number + // 每页显示的数量,类型为数字 pageSize: number + // 数据的总数量,类型为数字 total: number } + // 在 Table 命名空间内,定义一个接口 TableStateProps,用于描述表格相关的状态属性 export interface TableStateProps { + // 表格数据,是一个任意类型的数组 tableData: any[] + // 分页相关的属性,类型为 Pageable 接口 pageable: Pageable + // 搜索参数,是一个键值对对象,键为字符串,值为任意类型 searchParam: { [key: string]: any } + // 初始化的搜索参数,是一个键值对对象,键为字符串,值为任意类型 searchInitParam: { [key: string]: any } + // 用于获取总数的参数,是一个键值对对象,键为字符串,值为任意类型 totalParam: { [key: string]: any } + // 可选的图标相关属性,是一个键值对对象,键为字符串,值为任意类型,默认为 undefined icon?: { [key: string]: any } } } +// 定义一个名为 HandleData 的命名空间 export namespace HandleData { - export type MessageType = '' | 'success' | 'warning' | 'info' | 'error' + // 在 HandleData 命名空间内,定义一个类型别名 MessageType + // MessageType 的值可以是空字符串,或者是'success'、'warning'、'info'、'error' 中的一个 + export type MessageType = '' |'success' | 'warning' | 'info' | 'error' } diff --git a/client/src/hooks/useHandleData.ts b/client/src/hooks/useHandleData.ts index 5984785..f4a917a 100644 --- a/client/src/hooks/useHandleData.ts +++ b/client/src/hooks/useHandleData.ts @@ -1,4 +1,6 @@ +// 从 element-plus 库中导入 ElMessageBox 和 ElMessage 组件,分别用于显示确认框和提示消息 import { ElMessageBox, ElMessage } from 'element-plus' +// 从 './interface' 文件中导入 HandleData 命名空间,用于获取其中定义的类型 import { HandleData } from './interface' /** @@ -9,26 +11,42 @@ import { HandleData } from './interface' * @param {String} confirmType icon类型(不必传,默认为 warning) * @return Promise */ +// 定义一个泛型函数 useHandleData,P 表示 api 函数参数的类型,R 表示 api 函数返回值的类型 export const useHandleData = ( + // api 是一个函数,接收类型为 P 的参数并返回一个 Promise,Promise 的解析值类型为 R api: (params: P) => Promise, + // params 是 api 函数的参数,类型与 api 函数的参数类型一致 params: Parameters[0], + // message 是一个字符串,用于显示确认框中的提示信息 message: string, + // confirmType 是一个字符串,类型为 HandleData.MessageType,默认值为 'warning' confirmType: HandleData.MessageType = 'warning' ) => { + // 返回一个 Promise return new Promise((resolve, reject) => { + // 显示一个确认框 ElMessageBox.confirm(`是否${message}?`, '温馨提示', { + // 确认按钮的文本 confirmButtonText: '确定', + // 取消按钮的文本 cancelButtonText: '取消', + // 确认框的图标类型 type: confirmType, + // 是否可拖动 draggable: true - }).then(async () => { - const res = await api(params) - if (!res) return reject(false) - ElMessage({ - type: 'success', - message: `${message}成功!` - }) - resolve(true) }) + .then(async () => { + // 调用 api 函数并等待其返回结果 + const res = await api(params) + // 如果结果为 falsy 值,则 reject 该 Promise + if (!res) return reject(false) + // 显示一个成功提示消息 + ElMessage({ + type:'success', + message: `${message}成功!` + }) + // resolve 该 Promise,表示操作成功 + resolve(true) + }) }) } diff --git a/client/src/hooks/useIcons.ts b/client/src/hooks/useIcons.ts index 3c8fb3b..a99fbba 100644 --- a/client/src/hooks/useIcons.ts +++ b/client/src/hooks/useIcons.ts @@ -1,10 +1,21 @@ +// 从 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 导入 h 函数和 defineComponent 函数 import { h, defineComponent } from 'vue' +// 定义一个名为 useRenderIcon 的函数,它接受两个参数:iconName(字符串类型)和 attrs(可选的任意类型) export function useRenderIcon(iconName: string, attrs?: any) { + // 使用 defineComponent 函数定义一个新的组件 return defineComponent({ + // 新组件的名称为 'SvgIcon' name: 'SvgIcon', + // 定义组件的渲染函数 render() { + // 使用 h 函数创建一个 SvgIcon 组件的虚拟节点 + // 第一个参数是要创建的组件(这里是 SvgIcon) + // 第二个参数是一个对象,包含要传递给 SvgIcon 组件的属性 + // 'icon' 属性的值是传入的 iconName + // '...attrs' 表示将 attrs 对象中的所有属性也传递给 SvgIcon 组件 return h(SvgIcon, { icon: iconName, ...attrs diff --git a/client/src/hooks/useSelection.ts b/client/src/hooks/useSelection.ts index 3c4a8ad..b3df20a 100644 --- a/client/src/hooks/useSelection.ts +++ b/client/src/hooks/useSelection.ts @@ -4,16 +4,24 @@ import { ref, computed } from 'vue' * @description 表格多选数据操作 * @param {String} rowKey 当表格可以多选时,所指定的 id * */ +// 定义一个名为 useSelection 的函数,用于处理表格多选数据的操作 +// 接受一个可选参数 rowKey,默认值为 'id',表示行数据中用于唯一标识的键名 export const useSelection = (rowKey = 'id') => { - // 是否选中数据 + // 创建一个响应式变量 isSelected,用于表示是否选中了数据 + // 初始值为 false,类型为 boolean const isSelected = ref(false) - // 选中的数据列表 + // 创建一个响应式变量 selectedList,用于存储选中的数据列表 + // 初始值为空数组,类型为 any[] const selectedList = ref([]) - // 当前选中的所有ids(数组),可根据项目自行配置id字段 + // 创建一个计算属性 selectedListIds,用于获取当前选中的所有数据的 id 数组 + // 计算属性会根据依赖项(这里是 selectedList)的变化而自动更新 const selectedListIds = computed((): string[] => { + // 初始化一个空数组 ids 用于存储 id const ids: string[] = [] + // 遍历 selectedList 中的每一项数据 selectedList.value.forEach(item => ids.push(item[rowKey])) + // 返回包含所有 id 的数组 return ids }) @@ -22,11 +30,18 @@ export const useSelection = (rowKey = 'id') => { * @param {Array} rowArr 当前选择的所有数据 * @return void */ + // 定义一个函数 selectionChange,用于处理表格多选数据的变化事件 + // 接受一个参数 rowArr,类型为 any[],表示当前选中的所有数据 const selectionChange = (rowArr: any) => { - rowArr.length === 0 ? (isSelected.value = false) : (isSelected.value = true) - selectedList.value = rowArr - } + // 如果选中的数据列表为空,则将 isSelected 设置为 false + // 否则将 isSelected 设置为 true + rowArr.length === 0? (isSelected.value = false) : (isSelected.value = true) + // 更新 selectedList 为当前选中的数据列表 + selectedList.value = rowArr + } + // 返回一个包含 isSelected、selectedList、selectedListIds 和 selectionChange 的对象 + // 以便在其他地方使用这些变量和函数来处理表格多选数据 return { isSelected, selectedList, diff --git a/client/src/hooks/useTable.ts b/client/src/hooks/useTable.ts index f102ced..d9d5e6e 100644 --- a/client/src/hooks/useTable.ts +++ b/client/src/hooks/useTable.ts @@ -8,160 +8,196 @@ import { reactive, computed, toRefs } from 'vue' * @param {Boolean} isPageable 是否有分页(非必传,默认为true) * @param {Function} dataCallBack 对后台返回的数据进行处理的方法(非必传) * */ +// 定义一个名为 useTable 的函数,用于封装表格页面的操作方法 +// api 是获取表格数据的 API 方法,是必传参数 +// initParam 是获取数据的初始化参数,非必传,默认值为空对象 +// isPageable 表示是否有分页功能,非必传,默认值为 true +// dataCallBack 是对后台返回的数据进行处理的方法,非必传 export const useTable = ( api: (params: any) => Promise, initParam: object = {}, isPageable = true, dataCallBack?: (data: any) => any ) => { + // 使用 reactive 创建一个响应式的 state 对象,包含表格数据、分页数据、查询参数等 const state = reactive({ - // 表格数据 + // 表格数据,初始值为空数组 tableData: [], - // 分页数据 + // 分页数据,包含当前页数、每页显示条数和总条数 pageable: { - // 当前页数 + // 当前页数,初始值为 1 pageNum: 1, - // 每页显示条数 + // 每页显示条数,初始值为 10 pageSize: 10, - // 总条数 + // 总条数,初始值为 0 total: 0 }, - // 查询参数(只包括查询) + // 查询参数,只包括查询条件,初始值为空对象 searchParam: {}, - // 初始化默认的查询参数 + // 初始化默认的查询参数,初始值为空对象 searchInitParam: {}, - // 总参数(包含分页和查询参数) + // 总参数,包含分页和查询参数,初始值为空对象 totalParam: {} }) /** * @description 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置) * */ + // 定义一个计算属性 pageParam,用于获取和设置分页查询参数 const pageParam = computed({ - get: () => { - return { - pageNum: state.pageable.pageNum, - pageSize: state.pageable.pageSize + // 获取分页查询参数 + get: () => { + return { + pageNum: state.pageable.pageNum, + pageSize: state.pageable.pageSize + } + }, + // 设置分页查询参数,这里暂时为空,可根据需要实现 + set: (newVal: any) => { // 我是分页更新之后的值 } - }, - set: (newVal: any) => { // 我是分页更新之后的值 - } - }) + }) /** * @description 获取表格数据 * @return void * */ + // 定义一个异步函数 getTableList,用于获取表格数据 const getTableList = async () => { - try { - // 先把初始化参数和分页参数放到总参数里面 - Object.assign( - state.totalParam, - initParam, - isPageable ? pageParam.value : {} - ) - //请求前格式化数据 - if (state.totalParam.consultDate) { - state.totalParam.startTime = state.totalParam.consultDate[0] - state.totalParam.endTime = state.totalParam.consultDate[1] - delete state.totalParam.consultDate - } - let { data } = await api({ - ...state.searchInitParam, - ...state.totalParam - }) - dataCallBack && (data = dataCallBack(data)) - // 获取当前表格数据 - state.tableData = isPageable ? data.list : data + try { + // 先把初始化参数和分页参数放到总参数里面 + Object.assign( + state.totalParam, + initParam, + isPageable? pageParam.value : {} + ) + // 请求前格式化数据,如果总参数中有 consultDate 字段,则进行处理 + if (state.totalParam.consultDate) { + state.totalParam.startTime = state.totalParam.consultDate[0] + state.totalParam.endTime = state.totalParam.consultDate[1] + delete state.totalParam.consultDate + } + // 调用 API 方法获取数据 + let { data } = await api({ + ...state.searchInitParam, + ...state.totalParam + }) + // 如果有数据处理回调函数,则对数据进行处理 + dataCallBack && (data = dataCallBack(data)) + // 获取当前表格数据,如果有分页,则取 data.list,否则取 data + state.tableData = isPageable? data.list : data - const { pageNum, pageSize, total } = data - isPageable && updatePageable({ pageNum, pageSize, total }) - } catch (error) { - console.log(error) + // 从返回的数据中获取分页信息 + const { pageNum, pageSize, total } = data + // 如果有分页,则更新分页信息 + isPageable && updatePageable({ pageNum, pageSize, total }) + } catch (error) { + // 如果发生错误,打印错误信息 + console.log(error) + } } - } /** * @description 更新查询参数 * @return void * */ + // 定义一个函数 updatedTotalParam,用于更新总参数 const updatedTotalParam = () => { - state.totalParam = {} - // 处理查询参数,可以给查询参数加自定义前缀操作 - const nowSearchParam: { [key: string]: any } = {} - // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) - for (const key in state.searchParam) { - // * 某些情况下参数为 false/0 也应该携带参数 - if ( - state.searchParam[key] || - state.searchParam[key] === false || - state.searchParam[key] === 0 - ) { - nowSearchParam[key] = state.searchParam[key] + state.totalParam = {} + // 处理查询参数,可以给查询参数加自定义前缀操作 + const nowSearchParam: { [key: string]: any } = {} + // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) + for (const key in state.searchParam) { + // * 某些情况下参数为 false/0 也应该携带参数 + if ( + state.searchParam[key] || + state.searchParam[key] === false || + state.searchParam[key] === 0 + ) { + nowSearchParam[key] = state.searchParam[key] + } } + // 将处理后的查询参数和分页参数合并到总参数中 + Object.assign( + state.totalParam, + nowSearchParam, + isPageable? pageParam.value : {} + ) } - Object.assign( - state.totalParam, - nowSearchParam, - isPageable ? pageParam.value : {} - ) - } /** * @description 更新分页信息 * @param {Object} resPageable 后台返回的分页数据 * @return void * */ + // 定义一个函数 updatePageable,用于更新分页信息 const updatePageable = (resPageable: Table.Pageable) => { - Object.assign(state.pageable, resPageable) - } + // 使用 Object.assign 方法将后台返回的分页数据合并到 state.pageable 中 + Object.assign(state.pageable, resPageable) + } /** * @description 表格数据查询 * @return void * */ + // 定义一个函数 search,用于进行表格数据查询 const search = () => { - state.pageable.pageNum = 1 - updatedTotalParam() - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } /** * @description 表格数据重置 * @return void * */ + // 定义一个函数 reset,用于重置表格数据 const reset = () => { - state.pageable.pageNum = 1 - state.searchParam = {} - // 重置搜索表单的时,如果有默认搜索参数,则重置默认的搜索参数 - Object.keys(state.searchInitParam).forEach(key => { - state.searchParam[key] = state.searchInitParam[key] - }) - updatedTotalParam() - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 清空搜索参数 + state.searchParam = {} + // 重置搜索表单时,如果有默认搜索参数,则重置为默认值 + Object.keys(state.searchInitParam).forEach(key => { + state.searchParam[key] = state.searchInitParam[key] + }) + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } /** * @description 每页条数改变 * @param {Number} val 当前条数 * @return void * */ + // 定义一个函数 handleSizeChange,用于处理每页条数改变的事件 const handleSizeChange = (val: number) => { - state.pageable.pageNum = 1 - state.pageable.pageSize = val - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新每页显示条数 + state.pageable.pageSize = val + // 获取表格数据 + getTableList() + } /** * @description 当前页改变 * @param {Number} val 当前页 * @return void * */ + // 定义一个函数 handleCurrentChange,用于处理当前页改变的事件 const handleCurrentChange = (val: number) => { - state.pageable.pageNum = val - getTableList() - } + // 更新当前页数 + state.pageable.pageNum = val + // 获取表格数据 + getTableList() + } + // 返回一个包含 state 的响应式引用、获取表格数据的函数、查询函数、重置函数、处理每页条数改变和当前页改变的函数以及更新总参数的函数 return { ...toRefs(state), getTableList, diff --git a/client/src/icons/index.ts b/client/src/icons/index.ts index e4cd5fc..3ae6e10 100644 --- a/client/src/icons/index.ts +++ b/client/src/icons/index.ts @@ -1,15 +1,21 @@ +// 从项目路径 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 中导入 App 类型,用于表示 Vue 应用实例 import { App } from 'vue' // 获取上下文 require.context(检索的目录,是否检索子文件夹,正则表达式) // 返回值是一个函数(传入路径可以导入文件) // 通过静态方法keys可以检索所有文件路径 // 通过.prototype可以查看所有静态方法 - +// 这里指定检索当前目录下的 './svg' 文件夹,不检索子文件夹,匹配所有以.svg 结尾的文件 const svgRequired = require.context('./svg', false, /\.svg$/) +// 遍历所有匹配的 SVG 文件路径 svgRequired.keys().forEach(item => svgRequired(item)) +// 导出一个默认函数,该函数接收一个 Vue 应用实例 app 作为参数 export default (app: App) => { + // 使用 app.component 方法将 SvgIcon 组件注册为全局组件,别名为'svg-icon' + // 这样在整个 Vue 应用中都可以使用 标签来使用该组件 app.component('svg-icon', SvgIcon) } diff --git a/client/src/layout/components/NavBar/components/Avatar.vue b/client/src/layout/components/NavBar/components/Avatar.vue index f7e079b..961d375 100644 --- a/client/src/layout/components/NavBar/components/Avatar.vue +++ b/client/src/layout/components/NavBar/components/Avatar.vue @@ -1,34 +1,49 @@ + + + + {{ username }} + + + + + 修改密码 + + + 退出登录 + + + + + - + + - + + +
( + // api 是一个函数,接收类型为 P 的参数并返回一个 Promise,Promise 的解析值类型为 R api: (params: P) => Promise, + // params 是 api 函数的参数,类型与 api 函数的参数类型一致 params: Parameters[0], + // message 是一个字符串,用于显示确认框中的提示信息 message: string, + // confirmType 是一个字符串,类型为 HandleData.MessageType,默认值为 'warning' confirmType: HandleData.MessageType = 'warning' ) => { + // 返回一个 Promise return new Promise((resolve, reject) => { + // 显示一个确认框 ElMessageBox.confirm(`是否${message}?`, '温馨提示', { + // 确认按钮的文本 confirmButtonText: '确定', + // 取消按钮的文本 cancelButtonText: '取消', + // 确认框的图标类型 type: confirmType, + // 是否可拖动 draggable: true - }).then(async () => { - const res = await api(params) - if (!res) return reject(false) - ElMessage({ - type: 'success', - message: `${message}成功!` - }) - resolve(true) }) + .then(async () => { + // 调用 api 函数并等待其返回结果 + const res = await api(params) + // 如果结果为 falsy 值,则 reject 该 Promise + if (!res) return reject(false) + // 显示一个成功提示消息 + ElMessage({ + type:'success', + message: `${message}成功!` + }) + // resolve 该 Promise,表示操作成功 + resolve(true) + }) }) } diff --git a/client/src/hooks/useIcons.ts b/client/src/hooks/useIcons.ts index 3c8fb3b..a99fbba 100644 --- a/client/src/hooks/useIcons.ts +++ b/client/src/hooks/useIcons.ts @@ -1,10 +1,21 @@ +// 从 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 导入 h 函数和 defineComponent 函数 import { h, defineComponent } from 'vue' +// 定义一个名为 useRenderIcon 的函数,它接受两个参数:iconName(字符串类型)和 attrs(可选的任意类型) export function useRenderIcon(iconName: string, attrs?: any) { + // 使用 defineComponent 函数定义一个新的组件 return defineComponent({ + // 新组件的名称为 'SvgIcon' name: 'SvgIcon', + // 定义组件的渲染函数 render() { + // 使用 h 函数创建一个 SvgIcon 组件的虚拟节点 + // 第一个参数是要创建的组件(这里是 SvgIcon) + // 第二个参数是一个对象,包含要传递给 SvgIcon 组件的属性 + // 'icon' 属性的值是传入的 iconName + // '...attrs' 表示将 attrs 对象中的所有属性也传递给 SvgIcon 组件 return h(SvgIcon, { icon: iconName, ...attrs diff --git a/client/src/hooks/useSelection.ts b/client/src/hooks/useSelection.ts index 3c4a8ad..b3df20a 100644 --- a/client/src/hooks/useSelection.ts +++ b/client/src/hooks/useSelection.ts @@ -4,16 +4,24 @@ import { ref, computed } from 'vue' * @description 表格多选数据操作 * @param {String} rowKey 当表格可以多选时,所指定的 id * */ +// 定义一个名为 useSelection 的函数,用于处理表格多选数据的操作 +// 接受一个可选参数 rowKey,默认值为 'id',表示行数据中用于唯一标识的键名 export const useSelection = (rowKey = 'id') => { - // 是否选中数据 + // 创建一个响应式变量 isSelected,用于表示是否选中了数据 + // 初始值为 false,类型为 boolean const isSelected = ref(false) - // 选中的数据列表 + // 创建一个响应式变量 selectedList,用于存储选中的数据列表 + // 初始值为空数组,类型为 any[] const selectedList = ref([]) - // 当前选中的所有ids(数组),可根据项目自行配置id字段 + // 创建一个计算属性 selectedListIds,用于获取当前选中的所有数据的 id 数组 + // 计算属性会根据依赖项(这里是 selectedList)的变化而自动更新 const selectedListIds = computed((): string[] => { + // 初始化一个空数组 ids 用于存储 id const ids: string[] = [] + // 遍历 selectedList 中的每一项数据 selectedList.value.forEach(item => ids.push(item[rowKey])) + // 返回包含所有 id 的数组 return ids }) @@ -22,11 +30,18 @@ export const useSelection = (rowKey = 'id') => { * @param {Array} rowArr 当前选择的所有数据 * @return void */ + // 定义一个函数 selectionChange,用于处理表格多选数据的变化事件 + // 接受一个参数 rowArr,类型为 any[],表示当前选中的所有数据 const selectionChange = (rowArr: any) => { - rowArr.length === 0 ? (isSelected.value = false) : (isSelected.value = true) - selectedList.value = rowArr - } + // 如果选中的数据列表为空,则将 isSelected 设置为 false + // 否则将 isSelected 设置为 true + rowArr.length === 0? (isSelected.value = false) : (isSelected.value = true) + // 更新 selectedList 为当前选中的数据列表 + selectedList.value = rowArr + } + // 返回一个包含 isSelected、selectedList、selectedListIds 和 selectionChange 的对象 + // 以便在其他地方使用这些变量和函数来处理表格多选数据 return { isSelected, selectedList, diff --git a/client/src/hooks/useTable.ts b/client/src/hooks/useTable.ts index f102ced..d9d5e6e 100644 --- a/client/src/hooks/useTable.ts +++ b/client/src/hooks/useTable.ts @@ -8,160 +8,196 @@ import { reactive, computed, toRefs } from 'vue' * @param {Boolean} isPageable 是否有分页(非必传,默认为true) * @param {Function} dataCallBack 对后台返回的数据进行处理的方法(非必传) * */ +// 定义一个名为 useTable 的函数,用于封装表格页面的操作方法 +// api 是获取表格数据的 API 方法,是必传参数 +// initParam 是获取数据的初始化参数,非必传,默认值为空对象 +// isPageable 表示是否有分页功能,非必传,默认值为 true +// dataCallBack 是对后台返回的数据进行处理的方法,非必传 export const useTable = ( api: (params: any) => Promise, initParam: object = {}, isPageable = true, dataCallBack?: (data: any) => any ) => { + // 使用 reactive 创建一个响应式的 state 对象,包含表格数据、分页数据、查询参数等 const state = reactive({ - // 表格数据 + // 表格数据,初始值为空数组 tableData: [], - // 分页数据 + // 分页数据,包含当前页数、每页显示条数和总条数 pageable: { - // 当前页数 + // 当前页数,初始值为 1 pageNum: 1, - // 每页显示条数 + // 每页显示条数,初始值为 10 pageSize: 10, - // 总条数 + // 总条数,初始值为 0 total: 0 }, - // 查询参数(只包括查询) + // 查询参数,只包括查询条件,初始值为空对象 searchParam: {}, - // 初始化默认的查询参数 + // 初始化默认的查询参数,初始值为空对象 searchInitParam: {}, - // 总参数(包含分页和查询参数) + // 总参数,包含分页和查询参数,初始值为空对象 totalParam: {} }) /** * @description 分页查询参数(只包括分页和表格字段排序,其他排序方式可自行配置) * */ + // 定义一个计算属性 pageParam,用于获取和设置分页查询参数 const pageParam = computed({ - get: () => { - return { - pageNum: state.pageable.pageNum, - pageSize: state.pageable.pageSize + // 获取分页查询参数 + get: () => { + return { + pageNum: state.pageable.pageNum, + pageSize: state.pageable.pageSize + } + }, + // 设置分页查询参数,这里暂时为空,可根据需要实现 + set: (newVal: any) => { // 我是分页更新之后的值 } - }, - set: (newVal: any) => { // 我是分页更新之后的值 - } - }) + }) /** * @description 获取表格数据 * @return void * */ + // 定义一个异步函数 getTableList,用于获取表格数据 const getTableList = async () => { - try { - // 先把初始化参数和分页参数放到总参数里面 - Object.assign( - state.totalParam, - initParam, - isPageable ? pageParam.value : {} - ) - //请求前格式化数据 - if (state.totalParam.consultDate) { - state.totalParam.startTime = state.totalParam.consultDate[0] - state.totalParam.endTime = state.totalParam.consultDate[1] - delete state.totalParam.consultDate - } - let { data } = await api({ - ...state.searchInitParam, - ...state.totalParam - }) - dataCallBack && (data = dataCallBack(data)) - // 获取当前表格数据 - state.tableData = isPageable ? data.list : data + try { + // 先把初始化参数和分页参数放到总参数里面 + Object.assign( + state.totalParam, + initParam, + isPageable? pageParam.value : {} + ) + // 请求前格式化数据,如果总参数中有 consultDate 字段,则进行处理 + if (state.totalParam.consultDate) { + state.totalParam.startTime = state.totalParam.consultDate[0] + state.totalParam.endTime = state.totalParam.consultDate[1] + delete state.totalParam.consultDate + } + // 调用 API 方法获取数据 + let { data } = await api({ + ...state.searchInitParam, + ...state.totalParam + }) + // 如果有数据处理回调函数,则对数据进行处理 + dataCallBack && (data = dataCallBack(data)) + // 获取当前表格数据,如果有分页,则取 data.list,否则取 data + state.tableData = isPageable? data.list : data - const { pageNum, pageSize, total } = data - isPageable && updatePageable({ pageNum, pageSize, total }) - } catch (error) { - console.log(error) + // 从返回的数据中获取分页信息 + const { pageNum, pageSize, total } = data + // 如果有分页,则更新分页信息 + isPageable && updatePageable({ pageNum, pageSize, total }) + } catch (error) { + // 如果发生错误,打印错误信息 + console.log(error) + } } - } /** * @description 更新查询参数 * @return void * */ + // 定义一个函数 updatedTotalParam,用于更新总参数 const updatedTotalParam = () => { - state.totalParam = {} - // 处理查询参数,可以给查询参数加自定义前缀操作 - const nowSearchParam: { [key: string]: any } = {} - // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) - for (const key in state.searchParam) { - // * 某些情况下参数为 false/0 也应该携带参数 - if ( - state.searchParam[key] || - state.searchParam[key] === false || - state.searchParam[key] === 0 - ) { - nowSearchParam[key] = state.searchParam[key] + state.totalParam = {} + // 处理查询参数,可以给查询参数加自定义前缀操作 + const nowSearchParam: { [key: string]: any } = {} + // 防止手动清空输入框携带参数(这里可以自定义查询参数前缀) + for (const key in state.searchParam) { + // * 某些情况下参数为 false/0 也应该携带参数 + if ( + state.searchParam[key] || + state.searchParam[key] === false || + state.searchParam[key] === 0 + ) { + nowSearchParam[key] = state.searchParam[key] + } } + // 将处理后的查询参数和分页参数合并到总参数中 + Object.assign( + state.totalParam, + nowSearchParam, + isPageable? pageParam.value : {} + ) } - Object.assign( - state.totalParam, - nowSearchParam, - isPageable ? pageParam.value : {} - ) - } /** * @description 更新分页信息 * @param {Object} resPageable 后台返回的分页数据 * @return void * */ + // 定义一个函数 updatePageable,用于更新分页信息 const updatePageable = (resPageable: Table.Pageable) => { - Object.assign(state.pageable, resPageable) - } + // 使用 Object.assign 方法将后台返回的分页数据合并到 state.pageable 中 + Object.assign(state.pageable, resPageable) + } /** * @description 表格数据查询 * @return void * */ + // 定义一个函数 search,用于进行表格数据查询 const search = () => { - state.pageable.pageNum = 1 - updatedTotalParam() - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } /** * @description 表格数据重置 * @return void * */ + // 定义一个函数 reset,用于重置表格数据 const reset = () => { - state.pageable.pageNum = 1 - state.searchParam = {} - // 重置搜索表单的时,如果有默认搜索参数,则重置默认的搜索参数 - Object.keys(state.searchInitParam).forEach(key => { - state.searchParam[key] = state.searchInitParam[key] - }) - updatedTotalParam() - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 清空搜索参数 + state.searchParam = {} + // 重置搜索表单时,如果有默认搜索参数,则重置为默认值 + Object.keys(state.searchInitParam).forEach(key => { + state.searchParam[key] = state.searchInitParam[key] + }) + // 更新总参数 + updatedTotalParam() + // 获取表格数据 + getTableList() + } /** * @description 每页条数改变 * @param {Number} val 当前条数 * @return void * */ + // 定义一个函数 handleSizeChange,用于处理每页条数改变的事件 const handleSizeChange = (val: number) => { - state.pageable.pageNum = 1 - state.pageable.pageSize = val - getTableList() - } + // 将当前页数设置为 1 + state.pageable.pageNum = 1 + // 更新每页显示条数 + state.pageable.pageSize = val + // 获取表格数据 + getTableList() + } /** * @description 当前页改变 * @param {Number} val 当前页 * @return void * */ + // 定义一个函数 handleCurrentChange,用于处理当前页改变的事件 const handleCurrentChange = (val: number) => { - state.pageable.pageNum = val - getTableList() - } + // 更新当前页数 + state.pageable.pageNum = val + // 获取表格数据 + getTableList() + } + // 返回一个包含 state 的响应式引用、获取表格数据的函数、查询函数、重置函数、处理每页条数改变和当前页改变的函数以及更新总参数的函数 return { ...toRefs(state), getTableList, diff --git a/client/src/icons/index.ts b/client/src/icons/index.ts index e4cd5fc..3ae6e10 100644 --- a/client/src/icons/index.ts +++ b/client/src/icons/index.ts @@ -1,15 +1,21 @@ +// 从项目路径 '@/components/SvgIcon/index.vue' 导入 SvgIcon 组件 import SvgIcon from '@/components/SvgIcon/index.vue' +// 从 'vue' 中导入 App 类型,用于表示 Vue 应用实例 import { App } from 'vue' // 获取上下文 require.context(检索的目录,是否检索子文件夹,正则表达式) // 返回值是一个函数(传入路径可以导入文件) // 通过静态方法keys可以检索所有文件路径 // 通过.prototype可以查看所有静态方法 - +// 这里指定检索当前目录下的 './svg' 文件夹,不检索子文件夹,匹配所有以.svg 结尾的文件 const svgRequired = require.context('./svg', false, /\.svg$/) +// 遍历所有匹配的 SVG 文件路径 svgRequired.keys().forEach(item => svgRequired(item)) +// 导出一个默认函数,该函数接收一个 Vue 应用实例 app 作为参数 export default (app: App) => { + // 使用 app.component 方法将 SvgIcon 组件注册为全局组件,别名为'svg-icon' + // 这样在整个 Vue 应用中都可以使用 标签来使用该组件 app.component('svg-icon', SvgIcon) } diff --git a/client/src/layout/components/NavBar/components/Avatar.vue b/client/src/layout/components/NavBar/components/Avatar.vue index f7e079b..961d375 100644 --- a/client/src/layout/components/NavBar/components/Avatar.vue +++ b/client/src/layout/components/NavBar/components/Avatar.vue @@ -1,34 +1,49 @@ + + + + {{ username }} + + + + + 修改密码 + + + 退出登录 + + + + + - + + - + + +
{{ username }}