diff --git a/apps/web-antd/.env.production b/apps/web-antd/.env.production index 910fd64cc..a8f3d29a9 100644 --- a/apps/web-antd/.env.production +++ b/apps/web-antd/.env.production @@ -21,3 +21,6 @@ VITE_INJECT_APP_LOADING=true # 打包后是否生成dist.zip VITE_ARCHIVER=true + +# 验证码的开关 +VITE_APP_CAPTCHA_ENABLE=true \ No newline at end of file diff --git a/apps/web-antd/src/api/iot/device/device/index.ts b/apps/web-antd/src/api/iot/device/device/index.ts index a0d4659b0..5e7581274 100644 --- a/apps/web-antd/src/api/iot/device/device/index.ts +++ b/apps/web-antd/src/api/iot/device/device/index.ts @@ -3,39 +3,78 @@ import type { PageParam, PageResult } from '@vben/request'; import { requestClient } from '#/api/request'; export namespace IotDeviceApi { - // TODO @haohao:需要跟后端对齐,必要的 ReqVO、RespVO - /** 设备 */ - export interface Device { - id?: number; // 设备 ID,主键,自增 + /** 设备新增/修改 Request VO */ + // TODO @haohao:可以降低一些 VO 哈:DeviceSaveReqVO、DeviceRespVO 合并成 Device 就好,类似别的模块 + export interface DeviceSaveReqVO { + id?: number; // 设备编号 deviceName: string; // 设备名称 + nickname?: string; // 备注名称 + serialNumber?: string; // 设备序列号 + picUrl?: string; // 设备图片 + groupIds?: number[]; // 设备分组编号数组 + productId: number; // 产品编号(必填) + gatewayId?: number; // 网关设备 ID + config?: string; // 设备配置 + locationType: number; // 定位类型(必填) + latitude?: number; // 设备位置的纬度 + longitude?: number; // 设备位置的经度 + } + + /** 设备更新分组 Request VO */ + export interface DeviceUpdateGroupReqVO { + ids: number[]; // 设备编号列表(必填) + groupIds: number[]; // 分组编号列表(必填) + } + + /** 设备分页 Request VO */ + // TODO @haohao:可以不用 DevicePageReqVO,直接 PageParam 即可,简洁一点。这里的强类型,收益不大; + export interface DevicePageReqVO extends PageParam { + deviceName?: string; // 设备名称 + nickname?: string; // 备注名称 + productId?: number; // 产品编号 + deviceType?: number; // 设备类型 + status?: number; // 设备状态 + groupId?: number; // 设备分组编号 + gatewayId?: number; // 网关设备 ID + } + + /** 设备 Response VO */ + export interface DeviceRespVO { + id: number; // 设备编号 + deviceName: string; // 设备名称 + nickname?: string; // 设备备注名称 + serialNumber?: string; // 设备序列号 + picUrl?: string; // 设备图片 + groupIds?: number[]; // 设备分组编号数组 productId: number; // 产品编号 productKey?: string; // 产品标识 deviceType?: number; // 设备类型 - nickname?: string; // 设备备注名称 gatewayId?: number; // 网关设备 ID state?: number; // 设备状态 - status?: number; // 设备状态(兼容字段) onlineTime?: Date; // 最后上线时间 offlineTime?: Date; // 最后离线时间 activeTime?: Date; // 设备激活时间 - createTime?: Date; // 创建时间 - ip?: string; // 设备的 IP 地址 - firmwareVersion?: string; // 设备的固件版本 - deviceSecret?: string; // 设备密钥,用于设备认证,需安全存储 - mqttClientId?: string; // MQTT 客户端 ID - mqttUsername?: string; // MQTT 用户名 - mqttPassword?: string; // MQTT 密码 - authType?: string; // 认证类型 - locationType?: number; // 定位类型 + deviceSecret?: string; // 设备密钥,用于设备认证 + authType?: string; // 认证类型(如一机一密、动态注册) + config?: string; // 设备配置 + locationType?: number; // 定位方式 latitude?: number; // 设备位置的纬度 longitude?: number; // 设备位置的经度 - areaId?: number; // 地区编码 - address?: string; // 设备详细地址 - serialNumber?: string; // 设备序列号 - config?: string; // 设备配置 - groupIds?: number[]; // 添加分组 ID - picUrl?: string; // 设备图片 - location?: string; // 位置信息(格式:经度,纬度) + createTime?: Date; // 创建时间 + } + + /** 设备认证信息 Response VO */ + export interface DeviceAuthInfoRespVO { + clientId: string; // 客户端 ID + username: string; // 用户名 + password: string; // 密码 + } + + /** 设备导入 Response VO */ + export interface DeviceImportRespVO { + createDeviceNames?: string[]; // 创建成功的设备名称列表 + updateDeviceNames?: string[]; // 更新成功的设备名称列表 + failureDeviceNames?: Record; // 失败的设备名称及原因 } /** IoT 设备属性详细 VO */ @@ -56,30 +95,17 @@ export namespace IotDeviceApi { updateTime: Date; // 更新时间 } - /** 设备认证参数 VO */ - export interface DeviceAuthInfo { - clientId: string; // 客户端 ID - username: string; // 用户名 - password: string; // 密码 - } - /** 设备发送消息 Request VO */ export interface DeviceMessageSendReq { deviceId: number; // 设备编号 method: string; // 请求方法 params?: any; // 请求参数 } - - /** 设备分组更新请求 */ - export interface DeviceGroupUpdateReq { - ids: number[]; // 设备 ID 列表 - groupIds: number[]; // 分组 ID 列表 - } } /** 查询设备分页 */ -export function getDevicePage(params: PageParam) { - return requestClient.get>( +export function getDevicePage(params: IotDeviceApi.DevicePageReqVO) { + return requestClient.get>( '/iot/device/page', { params }, ); @@ -87,38 +113,40 @@ export function getDevicePage(params: PageParam) { /** 查询设备详情 */ export function getDevice(id: number) { - return requestClient.get(`/iot/device/get?id=${id}`); + return requestClient.get( + `/iot/device/get?id=${id}`, + ); } /** 新增设备 */ -export function createDevice(data: IotDeviceApi.Device) { - return requestClient.post('/iot/device/create', data); +export function createDevice(data: IotDeviceApi.DeviceSaveReqVO) { + return requestClient.post('/iot/device/create', data); } /** 修改设备 */ -export function updateDevice(data: IotDeviceApi.Device) { - return requestClient.put('/iot/device/update', data); +export function updateDevice(data: IotDeviceApi.DeviceSaveReqVO) { + return requestClient.put('/iot/device/update', data); } /** 修改设备分组 */ -export function updateDeviceGroup(data: IotDeviceApi.DeviceGroupUpdateReq) { - return requestClient.put('/iot/device/update-group', data); +export function updateDeviceGroup(data: IotDeviceApi.DeviceUpdateGroupReqVO) { + return requestClient.put('/iot/device/update-group', data); } /** 删除单个设备 */ export function deleteDevice(id: number) { - return requestClient.delete(`/iot/device/delete?id=${id}`); + return requestClient.delete(`/iot/device/delete?id=${id}`); } /** 删除多个设备 */ export function deleteDeviceList(ids: number[]) { - return requestClient.delete('/iot/device/delete-list', { + return requestClient.delete('/iot/device/delete-list', { params: { ids: ids.join(',') }, }); } /** 导出设备 */ -export function exportDeviceExcel(params: any) { +export function exportDeviceExcel(params: IotDeviceApi.DevicePageReqVO) { return requestClient.download('/iot/device/export-excel', { params }); } @@ -129,16 +157,22 @@ export function getDeviceCount(productId: number) { /** 获取设备的精简信息列表 */ export function getSimpleDeviceList(deviceType?: number, productId?: number) { - return requestClient.get('/iot/device/simple-list', { - params: { deviceType, productId }, - }); + return requestClient.get( + '/iot/device/simple-list', + { + params: { deviceType, productId }, + }, + ); } /** 根据产品编号,获取设备的精简信息列表 */ export function getDeviceListByProductId(productId: number) { - return requestClient.get('/iot/device/simple-list', { - params: { productId }, - }); + return requestClient.get( + '/iot/device/simple-list', + { + params: { productId }, + }, + ); } /** 获取导入模板 */ @@ -148,10 +182,13 @@ export function importDeviceTemplate() { /** 导入设备 */ export function importDevice(file: File, updateSupport: boolean) { - return requestClient.upload('/iot/device/import', { - file, - updateSupport, - }); + return requestClient.upload( + '/iot/device/import', + { + file, + updateSupport, + }, + ); } /** 获取设备属性最新数据 */ @@ -172,7 +209,7 @@ export function getHistoryDevicePropertyList(params: any) { /** 获取设备认证信息 */ export function getDeviceAuthInfo(id: number) { - return requestClient.get( + return requestClient.get( '/iot/device/get-auth-info', { params: { id } }, ); diff --git a/apps/web-antd/src/components/cropper/cropper-modal.vue b/apps/web-antd/src/components/cropper/cropper-modal.vue index 90c9dbc75..d4edd11c9 100644 --- a/apps/web-antd/src/components/cropper/cropper-modal.vue +++ b/apps/web-antd/src/components/cropper/cropper-modal.vue @@ -43,14 +43,6 @@ const [Modal, modalApi] = useVbenModal({ if (isOpen) { // 打开时,进行 loading 加载。后续 CropperImage 组件加载完毕,会自动关闭 loading(通过 handleReady) modalLoading(true); - const img = new Image(); - img.src = src.value; - img.addEventListener('load', () => { - modalLoading(false); - }); - img.addEventListener('error', () => { - modalLoading(false); - }); } else { // 关闭时,清空右侧预览 previewSource.value = ''; diff --git a/apps/web-antd/src/components/form-create/components/use-images-upload.tsx b/apps/web-antd/src/components/form-create/components/use-images-upload.tsx index a9d0572b5..a57cbaa4b 100644 --- a/apps/web-antd/src/components/form-create/components/use-images-upload.tsx +++ b/apps/web-antd/src/components/form-create/components/use-images-upload.tsx @@ -15,9 +15,8 @@ export function useImagesUpload() { default: 5, }, }, - setup() { - // TODO: @puhui999:@dhb52 其实还是靠 props 默认参数起作用,没能从 formCreate 传递 - return (props: { maxNumber?: number; multiple?: boolean }) => ( + setup(props) { + return () => ( ); }, diff --git a/apps/web-antd/src/components/form-create/rules/data.ts b/apps/web-antd/src/components/form-create/rules/data.ts index 3d34bf7af..edef44508 100644 --- a/apps/web-antd/src/components/form-create/rules/data.ts +++ b/apps/web-antd/src/components/form-create/rules/data.ts @@ -121,7 +121,7 @@ const apiSelectRule = [ field: 'data', title: '请求参数 JSON 格式', props: { - autoSize: true, + autoSize: true, // 特殊:ele 里是 autosize,antd 里是 autoSize type: 'textarea', placeholder: '{"type": 1}', }, @@ -155,7 +155,7 @@ const apiSelectRule = [ info: `data 为接口返回值,需要写一个匿名函数解析返回值为选择器 options 列表 (data: any)=>{ label: string; value: any }[]`, props: { - autoSize: true, + autoSize: true, // 特殊:ele 里是 autosize,antd 里是 autoSize rows: { minRows: 2, maxRows: 6 }, type: 'textarea', placeholder: ` diff --git a/apps/web-antd/src/components/form-create/rules/use-dict-select.ts b/apps/web-antd/src/components/form-create/rules/use-dict-select.ts index 0f041c87b..08171a24b 100644 --- a/apps/web-antd/src/components/form-create/rules/use-dict-select.ts +++ b/apps/web-antd/src/components/form-create/rules/use-dict-select.ts @@ -39,7 +39,7 @@ export function useDictSelectRule() { title: label, info: '', $required: false, - modelField: 'value', + modelField: 'value', // 特殊:ele 里是 model-value,antd 里是 value }; }, props(_: any, { t }: any) { diff --git a/apps/web-antd/src/components/operate-log/operate-log.vue b/apps/web-antd/src/components/operate-log/operate-log.vue index d1ae60112..8b49466ce 100644 --- a/apps/web-antd/src/components/operate-log/operate-log.vue +++ b/apps/web-antd/src/components/operate-log/operate-log.vue @@ -1,5 +1,4 @@ +