diff --git a/src/api/iot/device/index.ts b/src/api/iot/device/device/index.ts similarity index 54% rename from src/api/iot/device/index.ts rename to src/api/iot/device/device/index.ts index 903874b756f36b82a9827d285af6f920245cd232..ec80bfab3da385afaf365f54e9667131aea005c7 100644 --- a/src/api/iot/device/index.ts +++ b/src/api/iot/device/device/index.ts @@ -28,6 +28,7 @@ export interface DeviceVO { areaId: number // 地区编码 address: string // 设备详细地址 serialNumber: string // 设备序列号 + groupIds?: number[] // 添加分组 ID } export interface DeviceUpdateStatusVO { @@ -35,6 +36,33 @@ export interface DeviceUpdateStatusVO { status: number // 设备状态 } +// IoT 设备数据 VO +export interface DeviceDataVO { + deviceId: number // 设备编号 + thinkModelFunctionId: number // 物模型编号 + productKey: string // 产品标识 + deviceName: string // 设备名称 + identifier: string // 属性标识符 + name: string // 属性名称 + dataType: string // 数据类型 + updateTime: Date // 更新时间 + value: string // 最新值 +} + +// IoT 设备数据 VO +export interface DeviceHistoryDataVO { + time: number // 时间 + data: string // 数据 +} + +// IoT 设备状态枚举 +export enum DeviceStatusEnum { + INACTIVE = 0, // 未激活 + ONLINE = 1, // 在线 + OFFLINE = 2, // 离线 + DISABLED = 3 // 已禁用 +} + // 设备 API export const DeviceApi = { // 查询设备分页 @@ -62,13 +90,51 @@ export const DeviceApi = { return await request.put({ url: `/iot/device/update-status`, data }) }, - // 删除设备 + // 修改设备分组 + updateDeviceGroup: async (data: { + ids: number[] + groupIds: number[] + }) => { + return await request.put({ url: `/iot/device/update-group`, data }) + }, + + // 删除单个设备 deleteDevice: async (id: number) => { return await request.delete({ url: `/iot/device/delete?id=` + id }) }, + // 删除多个设备 + deleteDeviceList: async (ids: number[]) => { + return await request.delete({ url: `/iot/device/delete-list`, params: { ids: ids.join(',') } }) + }, + + // 导出设备 + exportDeviceExcel: async (params: any) => { + return await request.download({ url: `/iot/device/export-excel`, params }) + }, + // 获取设备数量 getDeviceCount: async (productId: number) => { return await request.get({ url: `/iot/device/count?productId=` + productId }) + }, + + // 获取设备的精简信息列表 + getSimpleDeviceList: async (deviceType?: number) => { + return await request.get({ url: `/iot/device/simple-list?`, params: { deviceType } }) + }, + + // 获取设备属性最���数据 + getDevicePropertiesLatestData: async (params: any) => { + return await request.get({ url: `/iot/device/data/latest`, params }) + }, + + // 获取设备属性历史数据 + getDevicePropertiesHistoryData: async (params: any) => { + return await request.get({ url: `/iot/device/data/history`, params }) + }, + + // 获取导入模板 + importDeviceTemplate: async () => { + return await request.download({ url: `/iot/device/get-import-template` }) } } diff --git a/src/api/iot/device/group/index.ts b/src/api/iot/device/group/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..02cca70b87f1efb7e6ad3d14e10fd517fb19d7d2 --- /dev/null +++ b/src/api/iot/device/group/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +// IoT 设备分组 VO +export interface DeviceGroupVO { + id: number // 分组 ID + name: string // 分组名字 + status: number // 分组状态 + description: string // 分组描述 + deviceCount?: number // 设备数量 +} + +// IoT 设备分组 API +export const DeviceGroupApi = { + // 查询IoT 设备分组分页 + getDeviceGroupPage: async (params: any) => { + return await request.get({ url: `/iot/device-group/page`, params }) + }, + + // 查询IoT 设备分组详情 + getDeviceGroup: async (id: number) => { + return await request.get({ url: `/iot/device-group/get?id=` + id }) + }, + + // 新增IoT 设备分组 + createDeviceGroup: async (data: DeviceGroupVO) => { + return await request.post({ url: `/iot/device-group/create`, data }) + }, + + // 修改IoT 设备分组 + updateDeviceGroup: async (data: DeviceGroupVO) => { + return await request.put({ url: `/iot/device-group/update`, data }) + }, + + // 删除IoT 设备分组 + deleteDeviceGroup: async (id: number) => { + return await request.delete({ url: `/iot/device-group/delete?id=` + id }) + }, + + // 获取设备分组的精简信息列表 + getSimpleDeviceGroupList: async () => { + return await request.get({ url: `/iot/device-group/simple-list` }) + } +} diff --git a/src/api/iot/plugininfo/index.ts b/src/api/iot/plugininfo/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..03229f70892b6ad74b6565722ff7ddbc2a4ab5ac --- /dev/null +++ b/src/api/iot/plugininfo/index.ts @@ -0,0 +1,51 @@ +import request from '@/config/axios' + +// IoT 插件信息 VO +export interface PluginInfoVO { + id: number // 主键ID + pluginId: string // 插件包id + name: string // 插件名称 + description: string // 描述 + deployType: number // 部署方式 + file: string // 插件包文件名 + version: string // 插件版本 + type: number // 插件类型 + protocol: string // 设备插件协议类型 + status: number // 状态 + configSchema: string // 插件配置项描述信息 + config: string // 插件配置信息 + script: string // 插件脚本 +} + +// IoT 插件信息 API +export const PluginInfoApi = { + // 查询IoT 插件信息分页 + getPluginInfoPage: async (params: any) => { + return await request.get({ url: `/iot/plugin-info/page`, params }) + }, + + // 查询IoT 插件信息详情 + getPluginInfo: async (id: number) => { + return await request.get({ url: `/iot/plugin-info/get?id=` + id }) + }, + + // 新增IoT 插件信息 + createPluginInfo: async (data: PluginInfoVO) => { + return await request.post({ url: `/iot/plugin-info/create`, data }) + }, + + // 修改IoT 插件信息 + updatePluginInfo: async (data: PluginInfoVO) => { + return await request.put({ url: `/iot/plugin-info/update`, data }) + }, + + // 删除IoT 插件信息 + deletePluginInfo: async (id: number) => { + return await request.delete({ url: `/iot/plugin-info/delete?id=` + id }) + }, + + // 导出IoT 插件信息 Excel + exportPluginInfo: async (params) => { + return await request.download({ url: `/iot/plugin-info/export-excel`, params }) + } +} diff --git a/src/api/iot/product/category/index.ts b/src/api/iot/product/category/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..cad17f5c529f51d9452f5964c6bf1f2cd2962fa9 --- /dev/null +++ b/src/api/iot/product/category/index.ts @@ -0,0 +1,43 @@ +import request from '@/config/axios' + +// IoT 产品分类 VO +export interface ProductCategoryVO { + id: number // 分类 ID + name: string // 分类名字 + sort: number // 分类排序 + status: number // 分类状态 + description: string // 分类描述 +} + +// IoT 产品分类 API +export const ProductCategoryApi = { + // 查询产品分类分页 + getProductCategoryPage: async (params: any) => { + return await request.get({ url: `/iot/product-category/page`, params }) + }, + + // 查询产品分类详情 + getProductCategory: async (id: number) => { + return await request.get({ url: `/iot/product-category/get?id=` + id }) + }, + + // 新增产品分类 + createProductCategory: async (data: ProductCategoryVO) => { + return await request.post({ url: `/iot/product-category/create`, data }) + }, + + // 修改产品分类 + updateProductCategory: async (data: ProductCategoryVO) => { + return await request.put({ url: `/iot/product-category/update`, data }) + }, + + // 删除产品分类 + deleteProductCategory: async (id: number) => { + return await request.delete({ url: `/iot/product-category/delete?id=` + id }) + }, + + /** 获取产品分类精简列表 */ + getSimpleProductCategoryList: () => { + return request.get({ url: '/iot/product-category/simple-list' }) + } +} diff --git a/src/api/iot/product/index.ts b/src/api/iot/product/product/index.ts similarity index 72% rename from src/api/iot/product/index.ts rename to src/api/iot/product/product/index.ts index 1ffa490d511ded6989fbe8cc3cd5dec467ac900d..496fb049b5e055879fdc6573e5948655e60ac446 100644 --- a/src/api/iot/product/index.ts +++ b/src/api/iot/product/product/index.ts @@ -7,6 +7,9 @@ export interface ProductVO { productKey: string // 产品标识 protocolId: number // 协议编号 categoryId: number // 产品所属品类标识符 + categoryName?: string // 产品所属品类名称 + icon: string // 产品图标 + picUrl: string // 产品图片 description: string // 产品描述 validateType: number // 数据校验级别 status: number // 产品状态 @@ -18,6 +21,23 @@ export interface ProductVO { createTime: Date // 创建时间 } +// IOT 数据校验级别枚举类 +export enum ValidateTypeEnum { + WEAK = 0, // 弱校验 + NONE = 1 // 免校验 +} +// IOT 产品设备类型枚举类 0: 直连设备, 1: 网关子设备, 2: 网关设备 +export enum DeviceTypeEnum { + DEVICE = 0, // 直连设备 + GATEWAY_SUB = 1, // 网关子设备 + GATEWAY = 2 // 网关设备 +} +// IOT 数据格式枚举类 +export enum DataFormatEnum { + JSON = 0, // 标准数据格式(JSON) + CUSTOMIZE = 1 // 透传/自定义 +} + // IoT 产品 API export const ProductApi = { // 查询产品分页 @@ -57,6 +77,6 @@ export const ProductApi = { // 查询产品(精简)列表 getSimpleProductList() { - return request.get({ url: '/iot/product/list-all-simple' }) + return request.get({ url: '/iot/product/simple-list' }) } } diff --git a/src/api/iot/thinkmodelfunction/index.ts b/src/api/iot/thinkmodelfunction/index.ts index bd2e2d0f0283325fe274159e0099f0db6e642f40..0117e7aac31f2f61dc4c7ddb18bdf6b279b9f996 100644 --- a/src/api/iot/thinkmodelfunction/index.ts +++ b/src/api/iot/thinkmodelfunction/index.ts @@ -1,55 +1,89 @@ import request from '@/config/axios' -// IoT 产品物模型 VO -export interface ThinkModelFunctionVO { - id: number // 物模型功能编号 - identifier: string // 功能标识 - name: string // 功能名称 - description: string // 功能描述 - productId: number // 产品编号 - productKey: string // 产品标识 - type: number // 功能类型 - property: string // 属性 - event: string // 事件 - service: string // 服务 +/** + * IoT 产品物模型 + */ +export interface ThingModelData { + id?: number // 物模型功能编号 + identifier?: string // 功能标识 + name?: string // 功能名称 + description?: string // 功能描述 + productId?: number // 产品编号 + productKey?: string // 产品标识 + dataType: string // 数据类型,与 dataSpecs 的 dataType 保持一致 + type: ProductFunctionTypeEnum // 功能类型 + property: ThingModelProperty // 属性 + event?: ThingModelEvent // 事件 + service?: ThingModelService // 服务 } +/** + * ThingModelProperty 类型 + */ +export interface ThingModelProperty { + [key: string]: any +} + +/** + * ThingModelEvent 类型 + */ +export interface ThingModelEvent { + [key: string]: any +} + +/** + * ThingModelService 类型 + */ +export interface ThingModelService { + [key: string]: any +} + +// IOT 产品功能(物模型)类型枚举类 +export enum ProductFunctionTypeEnum { + PROPERTY = 1, // 属性 + SERVICE = 2, // 服务 + EVENT = 3 // 事件 +} + +// IOT 产品功能(物模型)访问模式枚举类 +export enum ProductFunctionAccessModeEnum { + READ_WRITE = 'rw', // 读写 + READ_ONLY = 'r' // 只读 +} + +// TODO @puhui999:getProductThingModelPage => getThingModelPage 哈,不用带 product 前缀 // IoT 产品物模型 API export const ThinkModelFunctionApi = { // 查询产品物模型分页 - getThinkModelFunctionPage: async (params: any) => { - return await request.get({ url: `/iot/think-model-function/page`, params }) + getProductThingModelPage: async (params: any) => { + return await request.get({ url: `/iot/product-thing-model/page`, params }) }, + // 获得产品物模型 - getThinkModelFunctionListByProductId: async (params: any) => { + getProductThingModelListByProductId: async (params: any) => { return await request.get({ - url: `/iot/think-model-function/list-by-product-id`, + url: `/iot/product-thing-model/list-by-product-id`, params }) }, // 查询产品物模型详情 - getThinkModelFunction: async (id: number) => { - return await request.get({ url: `/iot/think-model-function/get?id=` + id }) + getProductThingModel: async (id: number) => { + return await request.get({ url: `/iot/product-thing-model/get?id=` + id }) }, // 新增产品物模型 - createThinkModelFunction: async (data: ThinkModelFunctionVO) => { - return await request.post({ url: `/iot/think-model-function/create`, data }) + createProductThingModel: async (data: ThingModelData) => { + return await request.post({ url: `/iot/product-thing-model/create`, data }) }, // 修改产品物模型 - updateThinkModelFunction: async (data: ThinkModelFunctionVO) => { - return await request.put({ url: `/iot/think-model-function/update`, data }) + updateProductThingModel: async (data: ThingModelData) => { + return await request.put({ url: `/iot/product-thing-model/update`, data }) }, // 删除产品物模型 - deleteThinkModelFunction: async (id: number) => { - return await request.delete({ url: `/iot/think-model-function/delete?id=` + id }) - }, - - // 导出产品物模型 Excel - exportThinkModelFunction: async (params) => { - return await request.download({ url: `/iot/think-model-function/export-excel`, params }) + deleteProductThingModel: async (id: number) => { + return await request.delete({ url: `/iot/product-thing-model/delete?id=` + id }) } } diff --git a/src/api/project/category/index.ts b/src/api/project/category/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..c59cde24098889245d6b3b1c86980c6b7e7c769a --- /dev/null +++ b/src/api/project/category/index.ts @@ -0,0 +1,41 @@ +import request from '@/config/axios' + +// 项目分类 VO +export interface CategoryVO { + id: number // 编号 + name: string // 名字 + parentId: number // 父级编号 +} + +// 项目分类 API +export const CategoryApi = { + // 查询项目分类列表 + getCategoryList: async (params) => { + return await request.get({ url: `/project/category/list`, params }) + }, + + // 查询项目分类详情 + getCategory: async (id: number) => { + return await request.get({ url: `/project/category/get?id=` + id }) + }, + + // 新增项目分类 + createCategory: async (data: CategoryVO) => { + return await request.post({ url: `/project/category/create`, data }) + }, + + // 修改项目分类 + updateCategory: async (data: CategoryVO) => { + return await request.put({ url: `/project/category/update`, data }) + }, + + // 删除项目分类 + deleteCategory: async (id: number) => { + return await request.delete({ url: `/project/category/delete?id=` + id }) + }, + + // 导出项目分类 Excel + exportCategory: async (params) => { + return await request.download({ url: `/project/category/export-excel`, params }) + }, +} \ No newline at end of file diff --git a/src/api/project/model/index.ts b/src/api/project/model/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..b85cd04bbcce31d7c23615c579f24860532b4154 --- /dev/null +++ b/src/api/project/model/index.ts @@ -0,0 +1,75 @@ +import request from '@/config/axios' + +// 项目模板 VO +export interface ModelVO { + id: number // id + number: string // 项目编号 + name: string // 项目名称 + scheduledStartTime: Date // 计划开始时间 + scheduledEndTime: Date // 计划结束时间 + actualStartTime: Date // 实际开始时间 + actualEndTime: Date // 实际结束时间 + planDuration: number // 计划工期 + actualDuration: number // 实际工期 + progress: number // 进度 + calendar: number // 日历 + projectManager: number // 项目经理 + projectTarget: string // 项目目标 + timeoutReason: string // 超时原因 + status: number // 状态 + phase: number // 生命周期阶段 + note: string // 备注 +} + +// 项目模板 API +export const ModelApi = { + + // 查询项目模板列表 + getModelList: async (params) => { + return await request.get({ url: `/project/model/list`, params }) + }, + + // 查询项目模板分页 + getModelPage: async (params: any) => { + return await request.get({ url: `/project/model/page`, params }) + }, + + // 查询项目模板详情 + getModel: async (id: number) => { + return await request.get({ url: `/project/model/get?id=` + id }) + }, + + // 新增项目模板 + createModel: async (data: ModelVO) => { + return await request.post({ url: `/project/model/create`, data }) + }, + + // 修改项目模板 + updateModel: async (data: ModelVO) => { + return await request.put({ url: `/project/model/update`, data }) + }, + + // 删除项目模板 + deleteModel: async (id: number) => { + return await request.delete({ url: `/project/model/delete?id=` + id }) + }, + + // 导出项目模板 Excel + exportModel: async (params) => { + return await request.download({ url: `/project/model/export-excel`, params }) + }, + +// ==================== 子表(项目输入文件) ==================== + + // 获得项目输入文件列表 + getModelInputListByModelId: async (modelId) => { + return await request.get({ url: `/project/model/model-input/list-by-model-id?modelId=` + modelId }) + }, + +// ==================== 子表(项目输出文件) ==================== + + // 获得项目输出文件列表 + getModelOutputListByModelId: async (modelId) => { + return await request.get({ url: `/project/model/model-output/list-by-model-id?modelId=` + modelId }) + }, +} diff --git a/src/assets/imgs/iot/device.png b/src/assets/imgs/iot/device.png new file mode 100644 index 0000000000000000000000000000000000000000..79339cdf486e64bff9f5c3f89f16a7c20a8aadeb Binary files /dev/null and b/src/assets/imgs/iot/device.png differ diff --git a/src/assets/svgs/iot/card-fill.svg b/src/assets/svgs/iot/card-fill.svg new file mode 100644 index 0000000000000000000000000000000000000000..4c74ecdc148aafeb318af6b11a5ae9d3651a93a8 --- /dev/null +++ b/src/assets/svgs/iot/card-fill.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/assets/svgs/iot/cube.svg b/src/assets/svgs/iot/cube.svg new file mode 100644 index 0000000000000000000000000000000000000000..200ac1b1c0ce4d456bab9b59403a8f2a4fcf19e0 --- /dev/null +++ b/src/assets/svgs/iot/cube.svg @@ -0,0 +1 @@ + \ No newline at end of file diff --git a/src/router/modules/remaining.ts b/src/router/modules/remaining.ts index f0ce322ee04125f10f2c5c9dd2ba1cf306fafc8c..69f82c41c0af84f764c510c857c12d2c7bd727c5 100644 --- a/src/router/modules/remaining.ts +++ b/src/router/modules/remaining.ts @@ -618,7 +618,7 @@ const remainingRouter: AppRouteRecordRaw[] = [ }, children: [ { - path: 'product/detail/:id', + path: 'product/product/detail/:id', name: 'IoTProductDetail', meta: { title: '产品详情', @@ -626,7 +626,7 @@ const remainingRouter: AppRouteRecordRaw[] = [ hidden: true, activeMenu: '/iot/product' }, - component: () => import('@/views/iot/product/detail/index.vue') + component: () => import('@/views/iot/product/product/detail/index.vue') }, { path: 'device/detail/:id', @@ -637,9 +637,31 @@ const remainingRouter: AppRouteRecordRaw[] = [ hidden: true, activeMenu: '/iot/device' }, - component: () => import('@/views/iot/device/detail/index.vue') + component: () => import('@/views/iot/device/device/detail/index.vue') } ] + }, + { + path: '/project', + component: Layout, + name: 'PROJECT', + meta: { + hidden: true + }, + children: [ + { + path: 'project/model/detail', + component: () => import('@/views/project/model/detail/index.vue'), + name: 'ProjectDetail', + meta: { + noCache: true, + hidden: true, + canTo: true, + title: '项目详情', + activeMenu: '/project/model' + } + }, + ] } ] diff --git a/src/utils/dict.ts b/src/utils/dict.ts index 1134152b69ffc40cf0ffb55682bff11f76b4babe..5538ed607a142d95195ea0894e15c2b0b203ba0e 100644 --- a/src/utils/dict.ts +++ b/src/utils/dict.ts @@ -239,5 +239,8 @@ export enum DICT_TYPE { IOT_PRODUCT_FUNCTION_TYPE = 'iot_product_function_type', // IOT 产品功能类型 IOT_DATA_TYPE = 'iot_data_type', // IOT 数据类型 IOT_UNIT_TYPE = 'iot_unit_type', // IOT 单位类型 - IOT_RW_TYPE = 'iot_rw_type' // IOT 读写类型 + IOT_RW_TYPE = 'iot_rw_type', // IOT 读写类型 + IOT_PLUGIN_DEPLOY_TYPE = 'iot_plugin_deploy_type', // IOT 插件部署类型 + IOT_PLUGIN_STATUS = 'iot_plugin_status', // IOT 插件状态 + IOT_PLUGIN_TYPE = 'iot_plugin_type' // IOT 插件类型 } diff --git a/src/utils/index.ts b/src/utils/index.ts index 2c2fbbd098b1ad9b8ceb33f05f87dbcd062b682c..059571e7becc83b118c195881d23d487831d9d21 100644 --- a/src/utils/index.ts +++ b/src/utils/index.ts @@ -116,6 +116,20 @@ export function toAnyString() { return str } +/** + * 生成指定长度的随机字符串 + * + * @param length 字符串长度 + */ +export function generateRandomStr(length: number): string { + const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789' + let result = '' + for (let i = 0; i < length; i++) { + result += chars.charAt(Math.floor(Math.random() * chars.length)) + } + return result +} + /** * 首字母大写 */ diff --git a/src/views/iot/device/DeviceForm.vue b/src/views/iot/device/device/DeviceForm.vue similarity index 49% rename from src/views/iot/device/DeviceForm.vue rename to src/views/iot/device/device/DeviceForm.vue index cb02601253de78b746297e4877c620e86e4fd5f9..be33c0c5fe4d595d8d3bef015aa5ffb4cf82aac4 100644 --- a/src/views/iot/device/DeviceForm.vue +++ b/src/views/iot/device/device/DeviceForm.vue @@ -13,6 +13,7 @@ placeholder="请选择产品" :disabled="formType === 'update'" clearable + @change="handleProductChange" > + + + + + 重新生成 + + + + - - + + + + + + + + + + + + + + + + + + + + + + + 确 定 @@ -40,14 +85,17 @@ diff --git a/src/views/iot/device/device/DeviceGroupForm.vue b/src/views/iot/device/device/DeviceGroupForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..322e8a73a61bdd630d946d7bd8107135b0ee0025 --- /dev/null +++ b/src/views/iot/device/device/DeviceGroupForm.vue @@ -0,0 +1,90 @@ + + + + + + + + + + + 确 定 + 取 消 + + + + + diff --git a/src/views/iot/device/device/DeviceImportForm.vue b/src/views/iot/device/device/DeviceImportForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..a6412f6a5f19203bfd0ee9a08e72ec4c5010c318 --- /dev/null +++ b/src/views/iot/device/device/DeviceImportForm.vue @@ -0,0 +1,139 @@ + + + + + 将文件拖到此处,或点击上传 + + + + + 是否更新已经存在的设备数据 + + 仅允许导入 xls、xlsx 格式文件。 + + 下载模板 + + + + + + 确 定 + 取 消 + + + + + diff --git a/src/views/iot/device/device/detail/DeviceDataDetail.vue b/src/views/iot/device/device/detail/DeviceDataDetail.vue new file mode 100644 index 0000000000000000000000000000000000000000..0c9ca9c37d5a438566d96ee59a6320fc16ca85bf --- /dev/null +++ b/src/views/iot/device/device/detail/DeviceDataDetail.vue @@ -0,0 +1,116 @@ + + + + + + + + + + + + 搜索 + + + + 重置 + + + + + + + + + + + + + + + diff --git a/src/views/iot/device/detail/DeviceDetailsHeader.vue b/src/views/iot/device/device/detail/DeviceDetailsHeader.vue similarity index 74% rename from src/views/iot/device/detail/DeviceDetailsHeader.vue rename to src/views/iot/device/device/detail/DeviceDetailsHeader.vue index 62960529d62127880f2801fbbf4f8431ca371f68..253fa97afe54279b3c436f9113dba99efe9bb332 100644 --- a/src/views/iot/device/detail/DeviceDetailsHeader.vue +++ b/src/views/iot/device/device/detail/DeviceDetailsHeader.vue @@ -35,41 +35,33 @@ diff --git a/src/views/iot/device/detail/index.vue b/src/views/iot/device/device/detail/index.vue similarity index 56% rename from src/views/iot/device/detail/index.vue rename to src/views/iot/device/device/detail/index.vue index d56859bd3ae9dc9990588502e0e3fdf6a9bd2d70..f67d6312c8afaf9e5948593d156981d8bd4cf39e 100644 --- a/src/views/iot/device/detail/index.vue +++ b/src/views/iot/device/device/detail/index.vue @@ -6,38 +6,42 @@ @refresh="getDeviceData(id)" /> - - - + + + - - + + + + + diff --git a/src/views/iot/device/device/index.vue b/src/views/iot/device/device/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..8525d67491c0fcac98f5fa9f1b8a48b5183e046e --- /dev/null +++ b/src/views/iot/device/device/index.vue @@ -0,0 +1,512 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 搜索 + + + + 重置 + + + + 新增 + + + 导出 + + + 导入 + + + 添加到分组 + + + 批量删除 + + + + + + + + + + + + + + + + + + + + + {{ item.deviceName }} + + + + + + {{ getDictLabel(DICT_TYPE.IOT_DEVICE_STATUS, item.status) }} + + + + + + + + + 所属产品 + {{ + products.find((p) => p.id === item.productId)?.name + }} + + + 设备类型 + + + + DeviceKey + {{ item.deviceKey }} + + + + + + + + + + + + + + + 编辑 + + + + 详情 + + + + 数据 + + + + + + + + + + + + + + + + + + {{ scope.row.deviceName }} + + + + + + {{ products.find((p) => p.id === scope.row.productId)?.name || '-' }} + + + + + + + + + + + + {{ deviceGroups.find((g) => g.id === id)?.name }} + + + + + + + + + + + + + + 查看 + + 日志 + + 编辑 + + + 删除 + + + + + + + + + + + + + + + + + + diff --git a/src/views/iot/device/group/DeviceGroupForm.vue b/src/views/iot/device/group/DeviceGroupForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..648725730e8b1cf37d889aafa63758c628dc6ae3 --- /dev/null +++ b/src/views/iot/device/group/DeviceGroupForm.vue @@ -0,0 +1,112 @@ + + + + + + + + + + {{ dict.label }} + + + + + + + + + 确 定 + 取 消 + + + + diff --git a/src/views/iot/product/index.vue b/src/views/iot/device/group/index.vue similarity index 59% rename from src/views/iot/product/index.vue rename to src/views/iot/device/group/index.vue index fa285819efb9eb50b9a72d46b7b5b3f917668d0d..ea2e4bea7f740f5b372f692efeee3cfb422671c7 100644 --- a/src/views/iot/product/index.vue +++ b/src/views/iot/device/group/index.vue @@ -8,22 +8,24 @@ :inline="true" label-width="68px" > - + - - + @@ -33,7 +35,7 @@ type="primary" plain @click="openForm('create')" - v-hasPermi="['iot:product:create']" + v-hasPermi="['iot:device-group:create']" > 新增 @@ -44,17 +46,14 @@ - - - {{ scope.row.name }} - - - - + + + - + + - - - - - - + + - 查看 + 编辑 删除 @@ -99,39 +93,29 @@ - + \ No newline at end of file diff --git a/src/views/iot/plugininfo/detail.vue b/src/views/iot/plugininfo/detail.vue new file mode 100644 index 0000000000000000000000000000000000000000..2f3f02f93bb07bc5967bb414179a417acbbf94c3 --- /dev/null +++ b/src/views/iot/plugininfo/detail.vue @@ -0,0 +1,44 @@ + + + + {{ pluginInfo.name }} + {{ pluginInfo.pluginId }} + {{ pluginInfo.file }} + {{ pluginInfo.version }} + + + + + + + + 返回 + + + + diff --git a/src/views/iot/device/index.vue b/src/views/iot/plugininfo/index.vue similarity index 44% rename from src/views/iot/device/index.vue rename to src/views/iot/plugininfo/index.vue index 784b14828168eb48baa9a9dac3a6ba585316fbab..5591cef49deadd7fd5120af27f25e8a638d82d8e 100644 --- a/src/views/iot/device/index.vue +++ b/src/views/iot/plugininfo/index.vue @@ -8,63 +8,25 @@ :inline="true" label-width="68px" > - - - - - - - - - + - - - - - - + - - - 搜索 - - - - 重置 - + 搜索 + 重置 - - 新增 + 新增 + + + + + + + + + + + - + - - - {{ scope.row.deviceName }} - - - - + + + + + - {{ productMap[scope.row.productId] }} + - + - - - - - - + - - 查看 - 编辑 @@ -146,10 +100,17 @@ link type="danger" @click="handleDelete(scope.row.id)" - v-hasPermi="['iot:device:delete']" + v-hasPermi="['iot:plugin-info:delete']" > 删除 + + 详情 + @@ -162,55 +123,92 @@ /> + + + + + + + {{ item.name }} + 组件ID: {{ item.pluginId }} + + + + Jar包: {{ item.file }} + 版本号: {{ item.version }} + 部署方式: + 状态: + + + + 编辑 + + + 删除 + + + + + + + + - + + \ No newline at end of file diff --git a/src/views/iot/product/category/ProductCategoryForm.vue b/src/views/iot/product/category/ProductCategoryForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..ff7219225115d29e48ffa0a9b9209f35e1edb610 --- /dev/null +++ b/src/views/iot/product/category/ProductCategoryForm.vue @@ -0,0 +1,119 @@ + + + + + + + + + + + + + {{ dict.label }} + + + + + + + + + 确 定 + 取 消 + + + + diff --git a/src/views/iot/product/category/index.vue b/src/views/iot/product/category/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..e78262217cd1d5d3ccde49b03d33545759d19871 --- /dev/null +++ b/src/views/iot/product/category/index.vue @@ -0,0 +1,170 @@ + + + + + + + + + + + + 搜索 + 重置 + + 新增 + + + + + + + + + + + + + + + + + + + + + + 编辑 + + + 删除 + + + + + + + + + + + + + diff --git a/src/views/iot/product/ProductForm.vue b/src/views/iot/product/product/ProductForm.vue similarity index 61% rename from src/views/iot/product/ProductForm.vue rename to src/views/iot/product/product/ProductForm.vue index 75d6efcc07c5cffefd781cc20e6c1d55a1cbafdf..e4eec67431627a056ebc45e41986ab7ca0e0cd8c 100644 --- a/src/views/iot/product/ProductForm.vue +++ b/src/views/iot/product/product/ProductForm.vue @@ -4,28 +4,46 @@ ref="formRef" :model="formData" :rules="formRules" - label-width="100px" + label-width="110px" v-loading="formLoading" > + + + + + 重新生成 + + + + - - - + + - + + + + {{ dict.label }} + + + - - - - + - + :label="dict.value" + > + {{ dict.label }} + + - - - - - + + + + + + + + + + + + + - 确 定 取 消 @@ -100,8 +120,11 @@ diff --git a/src/views/iot/product/detail/ProductDetailsHeader.vue b/src/views/iot/product/product/detail/ProductDetailsHeader.vue similarity index 80% rename from src/views/iot/product/detail/ProductDetailsHeader.vue rename to src/views/iot/product/product/detail/ProductDetailsHeader.vue index ba009516a22b03d1d28b37d1f91f6a10551b34fb..841aef9f0117816d8a4cda24ac8ce35a828b3b0a 100644 --- a/src/views/iot/product/detail/ProductDetailsHeader.vue +++ b/src/views/iot/product/product/detail/ProductDetailsHeader.vue @@ -45,8 +45,8 @@ - {{ product.deviceCount }} - 前往管理 + {{ product.deviceCount ?? '加载中...' }} + 前往管理 @@ -54,32 +54,37 @@ + + diff --git a/src/views/iot/product/detail/ThinkModelFunctionForm.vue b/src/views/iot/product/product/detail/ThingModel/ThingModelForm.vue similarity index 40% rename from src/views/iot/product/detail/ThinkModelFunctionForm.vue rename to src/views/iot/product/product/detail/ThingModel/ThingModelForm.vue index 895692e00a918ccd7ed8ec49af41b7741e670e7f..5820007287ee770de0b898e09684cb04f2f97028 100644 --- a/src/views/iot/product/detail/ThinkModelFunctionForm.vue +++ b/src/views/iot/product/product/detail/ThingModel/ThingModelForm.vue @@ -1,87 +1,58 @@ - + - 属性 - 服务 - 事件 + + 属性 + 服务 + 事件 - - - - - - - - - - - - - - - - - - ~ - - - - - - - - - - - 读写 - 只读 - - - - + + + - 确 定 + 确 定 取 消 - + + diff --git a/src/views/iot/product/product/detail/ThingModel/dataSpecs/ThingModelEnumTypeDataSpecs.vue b/src/views/iot/product/product/detail/ThingModel/dataSpecs/ThingModelEnumTypeDataSpecs.vue new file mode 100644 index 0000000000000000000000000000000000000000..af28e11edb9bfc3b34d3716403416adbef6f8333 --- /dev/null +++ b/src/views/iot/product/product/detail/ThingModel/dataSpecs/ThingModelEnumTypeDataSpecs.vue @@ -0,0 +1,57 @@ + + + + + 参数值 + 参数描述 + + + + ~ + + 删除 + + +添加枚举项 + + + + + + + diff --git a/src/views/iot/product/product/detail/ThingModel/dataSpecs/ThingModelNumberTypeDataSpecs.vue b/src/views/iot/product/product/detail/ThingModel/dataSpecs/ThingModelNumberTypeDataSpecs.vue new file mode 100644 index 0000000000000000000000000000000000000000..6dfff8ad7eafeedfe0c0b10ec70b7a2be010a981 --- /dev/null +++ b/src/views/iot/product/product/detail/ThingModel/dataSpecs/ThingModelNumberTypeDataSpecs.vue @@ -0,0 +1,50 @@ + + + + + ~ + + + + + + + + + + + + + + + + diff --git a/src/views/iot/product/product/detail/ThingModel/dataSpecs/index.ts b/src/views/iot/product/product/detail/ThingModel/dataSpecs/index.ts new file mode 100644 index 0000000000000000000000000000000000000000..f2e1daafaa996ea49c71e6786360340fcfc22b0e --- /dev/null +++ b/src/views/iot/product/product/detail/ThingModel/dataSpecs/index.ts @@ -0,0 +1,5 @@ +import ThingModelEnumTypeDataSpecs from './ThingModelEnumTypeDataSpecs.vue' +import ThingModelNumberTypeDataSpecs from './ThingModelNumberTypeDataSpecs.vue' +import ThingModelArrayTypeDataSpecs from './ThingModelArrayTypeDataSpecs.vue' + +export { ThingModelEnumTypeDataSpecs, ThingModelNumberTypeDataSpecs, ThingModelArrayTypeDataSpecs } diff --git a/src/views/iot/product/detail/ThinkModelFunction.vue b/src/views/iot/product/product/detail/ThingModel/index.vue similarity index 56% rename from src/views/iot/product/detail/ThinkModelFunction.vue rename to src/views/iot/product/product/detail/ThingModel/index.vue index 5a75d109fb8cc3f49a5c020a3276355bbf2b9a59..38bcd8fda4ef28e0d4ec017ef4f08d1ea15c5ba6 100644 --- a/src/views/iot/product/detail/ThinkModelFunction.vue +++ b/src/views/iot/product/product/detail/ThingModel/index.vue @@ -1,19 +1,20 @@ + - 搜索 - 重置 + + + 搜索 + + + + 重置 + - 添加功能 + + 添加功能 - - + + - - - + + + + + {{ dataTypeOptionsLabel(row.property.dataType) ?? '-' }} + + + + + + {{ row.property.dataSpecs ?? row.property.dataSpecsList }} + + + 编辑 删除 @@ -70,29 +89,31 @@ - + - diff --git a/src/views/iot/product/product/index.vue b/src/views/iot/product/product/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..db61ccfe73ebe16a42d50e644ccb168b24443fb4 --- /dev/null +++ b/src/views/iot/product/product/index.vue @@ -0,0 +1,353 @@ + + + + + + + + + + + + + + 搜索 + + + + 重置 + + + + 新增 + + + + 导出 + + + + + + + + + + + + + + + + + + + + + + + + + + + + + {{ item.name }} + + + + + + + 产品分类 + {{ item.categoryName }} + + + 产品类型 + + + + 产品标识 + {{ item.productKey }} + + + + + + + + + + + + + + + 编辑 + + + + 详情 + + + + 物模型 + + + + + + + + + + + + + + + + + + + + + + + + + - + + + + + + - + + + + + + + 查看 + + + 编辑 + + + 删除 + + + + + + + + + + + + + + diff --git a/src/views/iot/utils/constants.ts b/src/views/iot/utils/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..e6ef25a8178fe7f84af17c7e0dfa2ee3815fea5f --- /dev/null +++ b/src/views/iot/utils/constants.ts @@ -0,0 +1,535 @@ +/** iot 依赖注入 KEY */ +export const IOT_PROVIDE_KEY = { + PRODUCT: 'IOT_PRODUCT' +} +// TODO puhui999: 物模型数字数据类型单位类型,后面改成字典获取 +export const UnifyUnitSpecsDTO = [ + { + Symbol: 'L/min', + Name: '升每分钟' + }, + { + Symbol: 'mg/kg', + Name: '毫克每千克' + }, + { + Symbol: 'NTU', + Name: '浊度' + }, + { + Symbol: 'pH', + Name: 'PH值' + }, + { + Symbol: 'dS/m', + Name: '土壤EC值' + }, + { + Symbol: 'W/㎡', + Name: '太阳总辐射' + }, + { + Symbol: 'mm/hour', + Name: '降雨量' + }, + { + Symbol: 'var', + Name: '乏' + }, + { + Symbol: 'cP', + Name: '厘泊' + }, + { + Symbol: 'aw', + Name: '饱和度' + }, + { + Symbol: 'pcs', + Name: '个' + }, + { + Symbol: 'cst', + Name: '厘斯' + }, + { + Symbol: 'bar', + Name: '巴' + }, + { + Symbol: 'ppt', + Name: '纳克每升' + }, + { + Symbol: 'ppb', + Name: '微克每升' + }, + { + Symbol: 'uS/cm', + Name: '微西每厘米' + }, + { + Symbol: 'N/C', + Name: '牛顿每库仑' + }, + { + Symbol: 'V/m', + Name: '伏特每米' + }, + { + Symbol: 'ml/min', + Name: '滴速' + }, + { + Symbol: 'mmHg', + Name: '毫米汞柱' + }, + { + Symbol: 'mmol/L', + Name: '血糖' + }, + { + Symbol: 'mm/s', + Name: '毫米每秒' + }, + { + Symbol: 'turn/m', + Name: '转每分钟' + }, + { + Symbol: 'count', + Name: '次' + }, + { + Symbol: 'gear', + Name: '档' + }, + { + Symbol: 'stepCount', + Name: '步' + }, + { + Symbol: 'Nm3/h', + Name: '标准立方米每小时' + }, + { + Symbol: 'kV', + Name: '千伏' + }, + { + Symbol: 'kVA', + Name: '千伏安' + }, + { + Symbol: 'kVar', + Name: '千乏' + }, + { + Symbol: 'uw/cm2', + Name: '微瓦每平方厘米' + }, + { + Symbol: '只', + Name: '只' + }, + { + Symbol: '%RH', + Name: '相对湿度' + }, + { + Symbol: 'm³/s', + Name: '立方米每秒' + }, + { + Symbol: 'kg/s', + Name: '公斤每秒' + }, + { + Symbol: 'r/min', + Name: '转每分钟' + }, + { + Symbol: 't/h', + Name: '吨每小时' + }, + { + Symbol: 'KCL/h', + Name: '千卡每小时' + }, + { + Symbol: 'L/s', + Name: '升每秒' + }, + { + Symbol: 'Mpa', + Name: '兆帕' + }, + { + Symbol: 'm³/h', + Name: '立方米每小时' + }, + { + Symbol: 'kvarh', + Name: '千乏时' + }, + { + Symbol: 'μg/L', + Name: '微克每升' + }, + { + Symbol: 'kcal', + Name: '千卡路里' + }, + { + Symbol: 'GB', + Name: '吉字节' + }, + { + Symbol: 'MB', + Name: '兆字节' + }, + { + Symbol: 'KB', + Name: '千字节' + }, + { + Symbol: 'B', + Name: '字节' + }, + { + Symbol: 'μg/(d㎡·d)', + Name: '微克每平方分米每天' + }, + { + Symbol: '', + Name: '无' + }, + { + Symbol: 'ppm', + Name: '百万分率' + }, + { + Symbol: 'pixel', + Name: '像素' + }, + { + Symbol: 'Lux', + Name: '照度' + }, + { + Symbol: 'grav', + Name: '重力加速度' + }, + { + Symbol: 'dB', + Name: '分贝' + }, + { + Symbol: '%', + Name: '百分比' + }, + { + Symbol: 'lm', + Name: '流明' + }, + { + Symbol: 'bit', + Name: '比特' + }, + { + Symbol: 'g/mL', + Name: '克每毫升' + }, + { + Symbol: 'g/L', + Name: '克每升' + }, + { + Symbol: 'mg/L', + Name: '毫克每升' + }, + { + Symbol: 'μg/m³', + Name: '微克每立方米' + }, + { + Symbol: 'mg/m³', + Name: '毫克每立方米' + }, + { + Symbol: 'g/m³', + Name: '克每立方米' + }, + { + Symbol: 'kg/m³', + Name: '千克每立方米' + }, + { + Symbol: 'nF', + Name: '纳法' + }, + { + Symbol: 'pF', + Name: '皮法' + }, + { + Symbol: 'μF', + Name: '微法' + }, + { + Symbol: 'F', + Name: '法拉' + }, + { + Symbol: 'Ω', + Name: '欧姆' + }, + { + Symbol: 'μA', + Name: '微安' + }, + { + Symbol: 'mA', + Name: '毫安' + }, + { + Symbol: 'kA', + Name: '千安' + }, + { + Symbol: 'A', + Name: '安培' + }, + { + Symbol: 'mV', + Name: '毫伏' + }, + { + Symbol: 'V', + Name: '伏特' + }, + { + Symbol: 'ms', + Name: '毫秒' + }, + { + Symbol: 's', + Name: '秒' + }, + { + Symbol: 'min', + Name: '分钟' + }, + { + Symbol: 'h', + Name: '小时' + }, + { + Symbol: 'day', + Name: '日' + }, + { + Symbol: 'week', + Name: '周' + }, + { + Symbol: 'month', + Name: '月' + }, + { + Symbol: 'year', + Name: '年' + }, + { + Symbol: 'kn', + Name: '节' + }, + { + Symbol: 'km/h', + Name: '千米每小时' + }, + { + Symbol: 'm/s', + Name: '米每秒' + }, + { + Symbol: '″', + Name: '秒' + }, + { + Symbol: '′', + Name: '分' + }, + { + Symbol: '°', + Name: '度' + }, + { + Symbol: 'rad', + Name: '弧度' + }, + { + Symbol: 'Hz', + Name: '赫兹' + }, + { + Symbol: 'μW', + Name: '微瓦' + }, + { + Symbol: 'mW', + Name: '毫瓦' + }, + { + Symbol: 'kW', + Name: '千瓦特' + }, + { + Symbol: 'W', + Name: '瓦特' + }, + { + Symbol: 'cal', + Name: '卡路里' + }, + { + Symbol: 'kW·h', + Name: '千瓦时' + }, + { + Symbol: 'Wh', + Name: '瓦时' + }, + { + Symbol: 'eV', + Name: '电子伏' + }, + { + Symbol: 'kJ', + Name: '千焦' + }, + { + Symbol: 'J', + Name: '焦耳' + }, + { + Symbol: '℉', + Name: '华氏度' + }, + { + Symbol: 'K', + Name: '开尔文' + }, + { + Symbol: 't', + Name: '吨' + }, + { + Symbol: '°C', + Name: '摄氏度' + }, + { + Symbol: 'mPa', + Name: '毫帕' + }, + { + Symbol: 'hPa', + Name: '百帕' + }, + { + Symbol: 'kPa', + Name: '千帕' + }, + { + Symbol: 'Pa', + Name: '帕斯卡' + }, + { + Symbol: 'mg', + Name: '毫克' + }, + { + Symbol: 'g', + Name: '克' + }, + { + Symbol: 'kg', + Name: '千克' + }, + { + Symbol: 'N', + Name: '牛' + }, + { + Symbol: 'mL', + Name: '毫升' + }, + { + Symbol: 'L', + Name: '升' + }, + { + Symbol: 'mm³', + Name: '立方毫米' + }, + { + Symbol: 'cm³', + Name: '立方厘米' + }, + { + Symbol: 'km³', + Name: '立方千米' + }, + { + Symbol: 'm³', + Name: '立方米' + }, + { + Symbol: 'h㎡', + Name: '公顷' + }, + { + Symbol: 'c㎡', + Name: '平方厘米' + }, + { + Symbol: 'm㎡', + Name: '平方毫米' + }, + { + Symbol: 'k㎡', + Name: '平方千米' + }, + { + Symbol: '㎡', + Name: '平方米' + }, + { + Symbol: 'nm', + Name: '纳米' + }, + { + Symbol: 'μm', + Name: '微米' + }, + { + Symbol: 'mm', + Name: '毫米' + }, + { + Symbol: 'cm', + Name: '厘米' + }, + { + Symbol: 'dm', + Name: '分米' + }, + { + Symbol: 'km', + Name: '千米' + }, + { + Symbol: 'm', + Name: '米' + } +] diff --git a/src/views/project/category/CategoryForm.vue b/src/views/project/category/CategoryForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..0f0740d611b871732bc9b185815dac20c1166cf6 --- /dev/null +++ b/src/views/project/category/CategoryForm.vue @@ -0,0 +1,117 @@ + + + + + + + + + + + + 确 定 + 取 消 + + + + diff --git a/src/views/project/category/index.vue b/src/views/project/category/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..1bab3ffa3a0f87fad69ef6846b221d5ef6655a0b --- /dev/null +++ b/src/views/project/category/index.vue @@ -0,0 +1,226 @@ + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + 新增 + + + 导出 + + + 展开/折叠 + + + + + + + + + + + + + + + + 编辑 + + + 删除 + + + + + + + + + + + + + \ No newline at end of file diff --git a/src/views/project/model/CategoryTree.vue b/src/views/project/model/CategoryTree.vue new file mode 100644 index 0000000000000000000000000000000000000000..3caae95efe1f8c6086198d05351e5d7297be299e --- /dev/null +++ b/src/views/project/model/CategoryTree.vue @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + diff --git a/src/views/project/model/ModelForm.vue b/src/views/project/model/ModelForm.vue new file mode 100644 index 0000000000000000000000000000000000000000..c2f2beb22d522bfabbed34e96263b32f441c778a --- /dev/null +++ b/src/views/project/model/ModelForm.vue @@ -0,0 +1,142 @@ + + + + + + + + + + + + + + + + + + + + + 确 定 + 取 消 + + + + diff --git a/src/views/project/model/detail/ProjectTree.vue b/src/views/project/model/detail/ProjectTree.vue new file mode 100644 index 0000000000000000000000000000000000000000..75ac97c1ea3cdf7742b9528b8ba432d0b2602416 --- /dev/null +++ b/src/views/project/model/detail/ProjectTree.vue @@ -0,0 +1,63 @@ + + + + + + + + + + + + + + diff --git a/src/views/project/model/detail/index.vue b/src/views/project/model/detail/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..6448135b06ae7f9a06dc15c24b9419efa1f7fe65 --- /dev/null +++ b/src/views/project/model/detail/index.vue @@ -0,0 +1,150 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 设计 + + + 编辑 + + + 删除 + + + + + + + + + + + + + diff --git a/src/views/project/model/index.vue b/src/views/project/model/index.vue new file mode 100644 index 0000000000000000000000000000000000000000..fa52e152c9d24c7b425e393137a4e241cf6932e1 --- /dev/null +++ b/src/views/project/model/index.vue @@ -0,0 +1,274 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 搜索 + 重置 + + 新增 + + + 导出 + + + + + + + + + + + + + + + + + + + + + + + + + 设计 + + + 编辑 + + + 删除 + + + + + + + + + + + + + + + + + + diff --git a/vite.config.ts b/vite.config.ts index f55aa924147936fd9e9648cf6940d7497602d38f..7e15f84e21532a65fb1e1fb0caf18f711e809f39 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -44,7 +44,8 @@ export default ({command, mode}: ConfigEnv): UserConfig => { preprocessorOptions: { scss: { additionalData: '@use "@/styles/variables.scss" as *;', - // javascriptEnabled: true + javascriptEnabled: true, + silenceDeprecations: ["legacy-js-api"], // 参考自 https://stackoverflow.com/questions/78997907/the-legacy-js-api-is-deprecated-and-will-be-removed-in-dart-sass-2-0-0 } } },