diff --git a/.env.development b/.env.development index 3737274..9d6112d 100644 --- a/.env.development +++ b/.env.development @@ -1,6 +1,6 @@ # 页面标题 -VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统 -VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus +VITE_APP_TITLE = 防御机管理系统 +VITE_APP_LOGO_TITLE = 防御机管理系统 # 开发环境配置 VITE_APP_ENV = 'development' @@ -12,19 +12,21 @@ VITE_APP_BASE_API = '/dev-api' VITE_APP_CONTEXT_PATH = '/' # 监控地址 -VITE_APP_MONITOR_ADMIN = 'http://localhost:9090/admin/applications' +VITE_APP_MONITOR_ADMIN = 'http://localhost:9001/admin/applications' # SnailJob 控制台地址 -VITE_APP_SNAILJOB_ADMIN = 'http://localhost:8800/snail-job' +VITE_APP_SNAILJOB_ADMIN = 'http://localhost:9002/snail-job' VITE_APP_PORT = 80 # 接口加密功能开关(如需关闭 后端也必须对应关闭) -VITE_APP_ENCRYPT = true +VITE_APP_ENCRYPT = false # 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换 -VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' +#VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' +VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAJJA9FRt24dkoEqTRBdm9yx6MQ5+f+rDIrLdCAXFUtpGcsT+kea/iGzk50OfSzSYxQYF8g/iksanB9XN0Ab6anECAwEAAQ==' # 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换 -VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=' +#VITE_APP_RSA_PRIVATE_KEY = 'MIIBVAIBADANBgkqhkiG9w0BAQEFAASCAT4wggE6AgEAAkEAmc3CuPiGL/LcIIm7zryCEIbl1SPzBkr75E2VMtxegyZ1lYRD+7TZGAPkvIsBcaMs6Nsy0L78n2qh+lIZMpLH8wIDAQABAkEAk82Mhz0tlv6IVCyIcw/s3f0E+WLmtPFyR9/WtV3Y5aaejUkU60JpX4m5xNR2VaqOLTZAYjW8Wy0aXr3zYIhhQQIhAMfqR9oFdYw1J9SsNc+CrhugAvKTi0+BF6VoL6psWhvbAiEAxPPNTmrkmrXwdm/pQQu3UOQmc2vCZ5tiKpW10CgJi8kCIFGkL6utxw93Ncj4exE/gPLvKcT+1Emnoox+O9kRXss5AiAMtYLJDaLEzPrAWcZeeSgSIzbL+ecokmFKSDDcRske6QIgSMkHedwND1olF8vlKsJUGK3BcdtM8w4Xq7BpSBwsloE=' +VITE_APP_RSA_PRIVATE_KEY = 'MIIBOgIBAAJBAIHPXmO+vf9u33iXv97aYeuPsJ7Ut+GdBjpT7JOIEE1rIEIfaKK268uPwAHW+/fNOKQiTBuunI4PAiL7CAQoVeECAwEAAQJACS6S3aP9/9W8MY/XqZAcQbOjPvOK94bKNvv9YvN1O785/2U5z7hUHvF8O8qIttlMNqhJ60JO9x58EUE51/dZ1QIhAISwFmIah9HoOLR5M+sBsUb5dIAm1mg0hj7T/5LyMTO7AiEA+nKebopGVz7LVkX53m29975r3T+DYu9n24eIqNwTDRMCIHn6xxj4+tNlgHuo0KnCrI5q1UbabVDuuFsZ2WHldIXxAiEAx6BA5H9XHgexcC0Kw97ZgvXHaG1NvrhxIizgIyh4Dv0CIB+VslCqTQTr9idyfVuURAiDdzg/9tm07GhWLDn6I6+E' # 客户端id VITE_APP_CLIENT_ID = 'e5cd7e4891bf95d1d19206ce24a7b32e' diff --git a/.env.production b/.env.production index 883c8f1..5871788 100644 --- a/.env.production +++ b/.env.production @@ -1,6 +1,6 @@ # 页面标题 -VITE_APP_TITLE = RuoYi-Vue-Plus多租户管理系统 -VITE_APP_LOGO_TITLE = RuoYi-Vue-Plus +VITE_APP_TITLE = 防御机管理系统 +VITE_APP_LOGO_TITLE = 防御机管理系统 # 生产环境配置 VITE_APP_ENV = 'production' @@ -23,7 +23,8 @@ VITE_BUILD_COMPRESS = gzip VITE_APP_PORT = 80 # 接口加密功能开关(如需关闭 后端也必须对应关闭) -VITE_APP_ENCRYPT = true +# defensive_machine 后端 api-decrypt.enabled = false +VITE_APP_ENCRYPT = false # 接口加密传输 RSA 公钥与后端解密私钥对应 如更换需前后端一同更换 VITE_APP_RSA_PUBLIC_KEY = 'MFwwDQYJKoZIhvcNAQEBBQADSwAwSAJBAKoR8mX0rGKLqzcWmOzbfj64K8ZIgOdHnzkXSOVOZbFu/TJhZ7rFAN+eaGkl3C4buccQd/EjEsj9ir7ijT7h96MCAwEAAQ==' # 接口响应解密 RSA 私钥与后端加密公钥对应 如更换需前后端一同更换 diff --git a/dm-ui-dist.zip b/dm-ui-dist.zip new file mode 100644 index 0000000..4520444 Binary files /dev/null and b/dm-ui-dist.zip differ diff --git a/package.json b/package.json index cf44b03..f561243 100644 --- a/package.json +++ b/package.json @@ -44,7 +44,9 @@ "vue-json-pretty": "2.6.0", "vue-router": "5.0.3", "vue-types": "6.0.0", - "vxe-table": "4.18.1" + "vxe-table": "4.18.1", + "xgplayer": "^3.0.24", + "xgplayer-flv": "^3.0.24" }, "devDependencies": { "@iconify/json": "^2.2.448", diff --git a/script/bt/nginx-dm-ui.conf b/script/bt/nginx-dm-ui.conf new file mode 100644 index 0000000..b16f613 --- /dev/null +++ b/script/bt/nginx-dm-ui.conf @@ -0,0 +1,90 @@ +# Put this server block in the BaoTa site's Nginx config. +# Replace server_name with your domain, or keep _ for IP-based access. +server { + listen 8000; + server_name _; + + root /www/wwwroot/dm-ui/dist; + index index.html; + + client_max_body_size 20m; + + gzip on; + gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss image/svg+xml; + + location / { + try_files $uri $uri/ /index.html; + } + + location ^~ /assets/ { + try_files $uri =404; + expires 30d; + add_header Cache-Control "public, immutable"; + } + + location ^~ /prod-api/resource/sse { + rewrite ^/prod-api/(.*)$ /$1 break; + proxy_pass http://127.0.0.1:8080; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_buffering off; + proxy_cache off; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + } + + location ^~ /prod-api/resource/websocket { + rewrite ^/prod-api/(.*)$ /$1 break; + proxy_pass http://127.0.0.1:8080; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_set_header Upgrade $http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_read_timeout 3600s; + proxy_send_timeout 3600s; + } + + location ^~ /prod-api/ { + rewrite ^/prod-api/(.*)$ /$1 break; + proxy_pass http://127.0.0.1:8080; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + proxy_read_timeout 300s; + proxy_send_timeout 300s; + } + + location = /admin { + return 301 /admin/; + } + + location ^~ /admin/ { + proxy_pass http://127.0.0.1:9001/admin/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } + + location = /snail-job { + return 301 /snail-job/; + } + + location ^~ /snail-job/ { + proxy_pass http://127.0.0.1:9002/snail-job/; + proxy_http_version 1.1; + proxy_set_header Host $host; + proxy_set_header X-Real-IP $remote_addr; + proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; + proxy_set_header X-Forwarded-Proto $scheme; + } +} diff --git a/src/api/app/device/index.ts b/src/api/app/device/index.ts new file mode 100644 index 0000000..205e991 --- /dev/null +++ b/src/api/app/device/index.ts @@ -0,0 +1,68 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DeviceVO, DeviceForm, DeviceQuery } from '@/api/app/device/types'; + +/** + * 查询设备信息 +列表 + * @param query + * @returns {*} + */ + +export const listDevice = (query?: DeviceQuery): AxiosPromise => { + return request({ + url: '/app/device/list', + method: 'get', + params: query + }); +}; + +/** + * 查询设备信息 +详细 + * @param id + */ +export const getDevice = (id: string | number): AxiosPromise => { + return request({ + url: '/app/device/' + id, + method: 'get' + }); +}; + +/** + * 新增设备信息 + + * @param data + */ +export const addDevice = (data: DeviceForm) => { + return request({ + url: '/app/device', + method: 'post', + data: data + }); +}; + +/** + * 修改设备信息 + + * @param data + */ +export const updateDevice = (data: DeviceForm) => { + return request({ + url: '/app/device', + method: 'put', + data: data + }); +}; + +/** + * 删除设备信息 + + * @param id + */ +export const delDevice = (id: string | number | Array) => { + return request({ + url: '/app/device/' + id, + method: 'delete' + }); +}; diff --git a/src/api/app/device/types.ts b/src/api/app/device/types.ts new file mode 100644 index 0000000..bfcc137 --- /dev/null +++ b/src/api/app/device/types.ts @@ -0,0 +1,306 @@ +export interface DeviceVO { + /** + * + */ + id: string | number; + + /** + * 设备编号 + */ + deviceNo: string; + + /** + * 设备名称 + */ + deviceName: string; + + /** + * 状态 1-在线 0-离线 2-故障 3-到期 + */ + status: string; + + /** + * WiFi名称 + */ + wifiName: string; + + /** + * WiFi密码 + */ + wifiPassword: string; + + /** + * 强光开启 + */ + light: string; + + /** + * 告警播放 + */ + alertAudio: string; + + /** + * 告警内容 + */ + audioContet: string; + + /** + * 打击距离 + */ + strikeRange: string; + + /** + * 打击间隔 + */ + strikeInterval: string; + + /** + * 容器数量 + */ + container: string; + + /** + * 打击位置 + */ + strikePosition: string; + + /** + * 自动布放开始时间 + */ + startTime: string; + + /** + * 自动布放结束时间 + */ + endTime: string; + + /** + * 工作模式 0-自动 1-半自动 + */ + workMode: string; + + /** + * 设备型号 + */ + deviceEm: string; + + /** + * 设备序列号 + */ + deviceSn: string; + + /** + * 固件版本 + */ + fwVer: string; + + /** + * 识别模式 0-蓝牙 1-蓝牙+人脸 + */ + patternPerception?: string; + +} + +export interface DeviceForm extends BaseEntity { + /** + * + */ + id?: string | number; + + /** + * 设备编号 + */ + deviceNo?: string; + + /** + * 设备名称 + */ + deviceName?: string; + + /** + * 状态 1-在线 0-离线 2-故障 3-到期 + */ + status?: string; + + /** + * WiFi名称 + */ + wifiName?: string; + + /** + * WiFi密码 + */ + wifiPassword?: string; + + /** + * 强光开启 + */ + light?: string; + + /** + * 告警播放 + */ + alertAudio?: string; + + /** + * 告警内容 + */ + audioContet?: string; + + /** + * 打击距离 + */ + strikeRange?: string; + + /** + * 打击间隔 + */ + strikeInterval?: string; + + /** + * 容器数量 + */ + container?: string; + + /** + * 打击位置 + */ + strikePosition?: string; + + /** + * 自动布放开始时间 + */ + startTime?: string; + + /** + * 自动布放结束时间 + */ + endTime?: string; + + /** + * 工作模式 0-自动 1-半自动 + */ + workMode?: string; + + /** + * 设备型号 + */ + deviceEm?: string; + + /** + * 设备序列号 + */ + deviceSn?: string; + + /** + * 固件版本 + */ + fwVer?: string; + + /** + * 识别模式 0-蓝牙 1-蓝牙+人脸 + */ + patternPerception?: string; +} + +export interface DeviceQuery extends PageQuery { + /** + * 设备编号 + */ + deviceNo?: string; + + /** + * 设备名称 + */ + deviceName?: string; + + /** + * 状态 1-在线 0-离线 2-故障 3-到期 + */ + status?: string; + + /** + * WiFi名称 + */ + wifiName?: string; + + /** + * WiFi密码 + */ + wifiPassword?: string; + + /** + * 强光开启 + */ + light?: string; + + /** + * 告警播放 + */ + alertAudio?: string; + + /** + * 告警内容 + */ + audioContet?: string; + + /** + * 打击距离 + */ + strikeRange?: string; + + /** + * 打击间隔 + */ + strikeInterval?: string; + + /** + * 容器数量 + */ + container?: string; + + /** + * 打击位置 + */ + strikePosition?: string; + + /** + * 自动布放开始时间 + */ + startTime?: string; + + /** + * 自动布放结束时间 + */ + endTime?: string; + + /** + * 工作模式 0-自动 1-半自动 + */ + workMode?: string; + + /** + * 设备型号 + */ + deviceEm?: string; + + /** + * 设备序列号 + */ + deviceSn?: string; + + /** + * 固件版本 + */ + fwVer?: string; + + /** + * 识别模式 0-蓝牙 1-蓝牙+人脸 + */ + patternPerception?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/app/deviceUser/index.ts b/src/api/app/deviceUser/index.ts new file mode 100644 index 0000000..1344c8e --- /dev/null +++ b/src/api/app/deviceUser/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DeviceUserVO, DeviceUserForm, DeviceUserQuery } from '@/api/app/deviceUser/types'; + +/** + * 查询设备成员关联列表 + * @param query + * @returns {*} + */ + +export const listDeviceUser = (query?: DeviceUserQuery): AxiosPromise => { + return request({ + url: '/app/deviceUser/list', + method: 'get', + params: query + }); +}; + +/** + * 查询设备成员关联详细 + * @param deviceId + */ +export const getDeviceUser = (deviceId: string | number): AxiosPromise => { + return request({ + url: '/app/deviceUser/' + deviceId, + method: 'get' + }); +}; + +/** + * 新增设备成员关联 + * @param data + */ +export const addDeviceUser = (data: DeviceUserForm) => { + return request({ + url: '/app/deviceUser', + method: 'post', + data: data + }); +}; + +/** + * 修改设备成员关联 + * @param data + */ +export const updateDeviceUser = (data: DeviceUserForm) => { + return request({ + url: '/app/deviceUser', + method: 'put', + data: data + }); +}; + +/** + * 删除设备成员关联 + * @param deviceId + */ +export const delDeviceUser = (deviceId: string | number | Array) => { + return request({ + url: '/app/deviceUser/' + deviceId, + method: 'delete' + }); +}; diff --git a/src/api/app/deviceUser/types.ts b/src/api/app/deviceUser/types.ts new file mode 100644 index 0000000..df40943 --- /dev/null +++ b/src/api/app/deviceUser/types.ts @@ -0,0 +1,78 @@ +export interface DeviceUserVO { + /** + * + */ + deviceId: string | number; + + /** + * 设备编号 + */ + deviceNo: string; + + /** + * 设备名称 + */ + deviceName: string; + + /** + * 用户ID + */ + userId: string | number; + + /** + * 用户昵称 + */ + nickName: string; + +} + +export interface DeviceUserForm extends BaseEntity { + /** + * + */ + deviceId?: string | number; + + /** + * 设备编号 + */ + deviceNo?: string; + + /** + * 设备名称 + */ + deviceName?: string; + + /** + * 用户ID + */ + userId?: string | number; + + /** + * 用户昵称 + */ + nickName?: string; + +} + +export interface DeviceUserQuery extends PageQuery { + + /** + * 设备编号 + */ + deviceNo?: string; + + /** + * 设备名称 + */ + deviceName?: string; + + /** + * 用户昵称 + */ + nickName?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/app/family/index.ts b/src/api/app/family/index.ts new file mode 100644 index 0000000..9bc0fcb --- /dev/null +++ b/src/api/app/family/index.ts @@ -0,0 +1,80 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { FamilyVO, FamilyForm, FamilyQuery } from '@/api/app/family/types'; + +/** + * 查询家庭成员列表 + * @param query + * @returns {*} + */ + +export const listFamily = (query?: FamilyQuery): AxiosPromise => { + return request({ + url: '/app/family/list', + method: 'get', + params: query + }); +}; + +/** + * 查询家庭成员详细 + * @param id + */ +export const getFamily = (id: string | number): AxiosPromise => { + return request({ + url: '/app/family/' + id, + method: 'get' + }); +}; + +/** + * 新增家庭成员 + * @param data + */ +export const addFamily = (data: FamilyForm) => { + return request({ + url: '/app/family', + method: 'post', + data: data + }); +}; + +/** + * 修改家庭成员 + * @param data + */ +export const updateFamily = (data: FamilyForm) => { + return request({ + url: '/app/family', + method: 'put', + data: data + }); +}; + +/** + * 删除家庭成员 + * @param id + */ +export const delFamily = (id: string | number | Array) => { + return request({ + url: '/app/family/' + id, + method: 'delete' + }); +}; + +/** + * 家庭成员状态修改 + * @param id 家庭成员ID + * @param status 状态 + */ +export const changeFamilyStatus = (id: string | number, status: string) => { + const data = { + id, + status + }; + return request({ + url: '/app/family/changeStatus', + method: 'put', + data: data + }); +}; diff --git a/src/api/app/family/types.ts b/src/api/app/family/types.ts new file mode 100644 index 0000000..cd06861 --- /dev/null +++ b/src/api/app/family/types.ts @@ -0,0 +1,83 @@ +export interface FamilyVO { + /** + * + */ + id: string | number; + + /** + * 家长id + */ + parentId: string | number; + + /** + * 家长昵称 + */ + parentName: string; + + /** + * 成员id + */ + userId: string | number; + + /** + * 账号状态(0正常 1停用) + */ + status: string; + +} + +export interface FamilyForm extends BaseEntity { + /** + * + */ + id?: string | number; + + /** + * 家长id + */ + parentId?: string | number; + + /** + * 家长昵称 + */ + parentName?: string; + + /** + * 成员id + */ + userId?: string | number; + + /** + * 账号状态(0正常 1停用) + */ + status?: string; + +} + +export interface FamilyQuery extends PageQuery { + + /** + * 家长id + */ + parentId?: string | number; + + /** + * 家长昵称 + */ + parentName?: string; + + /** + * 成员id + */ + userId?: string | number; + + /** + * 账号状态(0正常 1停用) + */ + status?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/app/familyDevice/index.ts b/src/api/app/familyDevice/index.ts new file mode 100644 index 0000000..8f441ed --- /dev/null +++ b/src/api/app/familyDevice/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { FamilyDeviceVO, FamilyDeviceForm, FamilyDeviceQuery } from '@/api/app/familyDevice/types'; + +/** + * 查询家庭设备关联列表 + * @param query + * @returns {*} + */ + +export const listFamilyDevice = (query?: FamilyDeviceQuery): AxiosPromise => { + return request({ + url: '/app/familyDevice/list', + method: 'get', + params: query + }); +}; + +/** + * 查询家庭设备关联详细 + * @param userId + */ +export const getFamilyDevice = (userId: string | number): AxiosPromise => { + return request({ + url: '/app/familyDevice/' + userId, + method: 'get' + }); +}; + +/** + * 新增家庭设备关联 + * @param data + */ +export const addFamilyDevice = (data: FamilyDeviceForm) => { + return request({ + url: '/app/familyDevice', + method: 'post', + data: data + }); +}; + +/** + * 修改家庭设备关联 + * @param data + */ +export const updateFamilyDevice = (data: FamilyDeviceForm) => { + return request({ + url: '/app/familyDevice', + method: 'put', + data: data + }); +}; + +/** + * 删除家庭设备关联 + * @param userId + */ +export const delFamilyDevice = (userId: string | number | Array) => { + return request({ + url: '/app/familyDevice/' + userId, + method: 'delete' + }); +}; diff --git a/src/api/app/familyDevice/types.ts b/src/api/app/familyDevice/types.ts new file mode 100644 index 0000000..280fdb7 --- /dev/null +++ b/src/api/app/familyDevice/types.ts @@ -0,0 +1,78 @@ +export interface FamilyDeviceVO { + /** + * 用户ID + */ + userId: string | number; + + /** + * 用户昵称 + */ + nickName: string; + + /** + * + */ + deviceId: string | number; + + /** + * 设备编号 + */ + deviceNo: string; + + /** + * 设备名称 + */ + deviceName: string; + +} + +export interface FamilyDeviceForm extends BaseEntity { + /** + * 用户ID + */ + userId?: string | number; + + /** + * 用户昵称 + */ + nickName?: string; + + /** + * + */ + deviceId?: string | number; + + /** + * 设备编号 + */ + deviceNo?: string; + + /** + * 设备名称 + */ + deviceName?: string; + +} + +export interface FamilyDeviceQuery extends PageQuery { + + /** + * 用户昵称 + */ + nickName?: string; + + /** + * 设备编号 + */ + deviceNo?: string; + + /** + * 设备名称 + */ + deviceName?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/app/message/index.ts b/src/api/app/message/index.ts new file mode 100644 index 0000000..37eb83e --- /dev/null +++ b/src/api/app/message/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { MessageVO, MessageForm, MessageQuery } from '@/api/app/message/types'; + +/** + * 查询告警消息列列表 + * @param query + * @returns {*} + */ + +export const listMessage = (query?: MessageQuery): AxiosPromise => { + return request({ + url: '/app/message/list', + method: 'get', + params: query + }); +}; + +/** + * 查询告警消息列详细 + * @param id + */ +export const getMessage = (id: string | number): AxiosPromise => { + return request({ + url: '/app/message/' + id, + method: 'get' + }); +}; + +/** + * 新增告警消息列 + * @param data + */ +export const addMessage = (data: MessageForm) => { + return request({ + url: '/app/message', + method: 'post', + data: data + }); +}; + +/** + * 修改告警消息列 + * @param data + */ +export const updateMessage = (data: MessageForm) => { + return request({ + url: '/app/message', + method: 'put', + data: data + }); +}; + +/** + * 删除告警消息列 + * @param id + */ +export const delMessage = (id: string | number | Array) => { + return request({ + url: '/app/message/' + id, + method: 'delete' + }); +}; diff --git a/src/api/app/message/types.ts b/src/api/app/message/types.ts new file mode 100644 index 0000000..4fce71b --- /dev/null +++ b/src/api/app/message/types.ts @@ -0,0 +1,87 @@ +export interface MessageVO { + /** + * + */ + id: string | number; + + /** + * 类型 + */ + category: number; + + /** + * 告警类型 + */ + categoryName: string; + + /** + * 图片地址 + */ + image: string; + + /** + * 图片地址Url + */ + imageUrl: string; + /** + * 视频地址 + */ + video: string | number; + +} + +export interface MessageForm extends BaseEntity { + /** + * + */ + id?: string | number; + + /** + * 类型 + */ + category?: number; + + /** + * 告警类型 + */ + categoryName?: string; + + /** + * 图片地址 + */ + image?: string; + + /** + * 视频地址 + */ + video?: string | number; + +} + +export interface MessageQuery extends PageQuery { + + /** + * 类型 + */ + category?: number; + + /** + * 告警类型 + */ + categoryName?: string; + + /** + * 图片地址 + */ + image?: string; + + /** + * 视频地址 + */ + video?: string | number; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/app/user/index.ts b/src/api/app/user/index.ts new file mode 100644 index 0000000..91048f9 --- /dev/null +++ b/src/api/app/user/index.ts @@ -0,0 +1,101 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { UserVO, UserForm, UserQuery } from '@/api/app/user/types'; + +/** + * 查询app用户信息列表 + * @param query + * @returns {*} + */ + +export const listUser = (query?: UserQuery): AxiosPromise => { + return request({ + url: '/app/user/list', + method: 'get', + params: query + }); +}; + +/** + * 查询app用户信息详细 + * @param userId + */ +export const getUser = (userId: string | number): AxiosPromise => { + return request({ + url: '/app/user/' + userId, + method: 'get' + }); +}; + +/** + * 新增app用户信息 + * @param data + */ +export const addUser = (data: UserForm) => { + return request({ + url: '/app/user', + method: 'post', + data: data + }); +}; + +/** + * 修改app用户信息 + * @param data + */ +export const updateUser = (data: UserForm) => { + return request({ + url: '/app/user', + method: 'put', + data: data + }); +}; + +/** + * 删除app用户信息 + * @param userId + */ +export const delUser = (userId: string | number | Array) => { + return request({ + url: '/app/user/' + userId, + method: 'delete' + }); +}; + +/** + * 用户状态修改 + * @param userId 用户ID + * @param status 用户状态 + */ +export const changeUserStatus = (userId: string | number, status: string) => { + const data = { + userId, + status + }; + return request({ + url: '/app/user/changeStatus', + method: 'put', + data: data + }); +}; + +/** + * 重置用户密码 + * @param userId 用户ID + * @param password 新密码 + */ +export const resetUserPwd = (userId: string | number, password: string) => { + const data = { + userId, + password + }; + return request({ + url: '/app/user/resetPwd', + method: 'put', + headers: { + isEncrypt: true, + repeatSubmit: false + }, + data: data + }); +}; diff --git a/src/api/app/user/types.ts b/src/api/app/user/types.ts new file mode 100644 index 0000000..eb3fbf1 --- /dev/null +++ b/src/api/app/user/types.ts @@ -0,0 +1,273 @@ +export interface UserVO { + /** + * 用户ID + */ + userId: string | number; + + /** + * 用户账号 + */ + userName: string; + + /** + * 用户昵称 + */ + nickName: string; + + /** + * 身份证号 + */ + idCard: string | number; + + /** + * 用户类型(sys_user系统用户) + */ + userType: string; + + /** + * 用户邮箱 + */ + email: string; + + /** + * 手机号码 + */ + phonenumber: string; + + /** + * 用户性别(0男 1女 2未知) + */ + sex: string; + + /** + * 头像地址 + */ + avatar: number; + + /** + * 密码 + */ + password: string; + + /** + * 账号状态(0正常 1停用) + */ + status: string; + + /** + * 人脸 + */ + faceAddr: string; + + /** + * 手机mac地址 + */ + mac: string; + + /** + * 邀请码 + */ + inviteUsed: string; + + /** + * 邀请码创建时间 + */ + inviteTime: string; + + /** + * 最后登录IP + */ + loginIp: string; + + /** + * 最后登录时间 + */ + loginDate: string; + + /** + * 备注 + */ + remark: string; + +} + +export interface UserForm extends BaseEntity { + /** + * 用户ID + */ + userId?: string | number; + + /** + * 用户账号 + */ + userName?: string; + + /** + * 用户昵称 + */ + nickName?: string; + + /** + * 身份证号 + */ + idCard?: string | number; + + /** + * 用户类型(sys_user系统用户) + */ + userType?: string; + + /** + * 用户邮箱 + */ + email?: string; + + /** + * 手机号码 + */ + phonenumber?: string; + + /** + * 用户性别(0男 1女 2未知) + */ + sex?: string; + + /** + * 头像地址 + */ + avatar?: number; + + /** + * 密码 + */ + password?: string; + + /** + * 账号状态(0正常 1停用) + */ + status?: string; + + /** + * 人脸 + */ + faceAddr?: string; + + /** + * 手机mac地址 + */ + mac?: string; + + /** + * 邀请码 + */ + inviteUsed?: string; + + /** + * 邀请码创建时间 + */ + inviteTime?: string; + + /** + * 最后登录IP + */ + loginIp?: string; + + /** + * 最后登录时间 + */ + loginDate?: string; + + /** + * 备注 + */ + remark?: string; + +} + +export interface UserQuery extends PageQuery { + + /** + * 用户账号 + */ + userName?: string; + + /** + * 用户昵称 + */ + nickName?: string; + + /** + * 身份证号 + */ + idCard?: string | number; + + /** + * 用户类型(sys_user系统用户) + */ + userType?: string; + + /** + * 用户邮箱 + */ + email?: string; + + /** + * 手机号码 + */ + phonenumber?: string; + + /** + * 用户性别(0男 1女 2未知) + */ + sex?: string; + + /** + * 头像地址 + */ + avatar?: number; + + /** + * 密码 + */ + password?: string; + + /** + * 账号状态(0正常 1停用) + */ + status?: string; + + /** + * 人脸 + */ + faceAddr?: string; + + /** + * 手机mac地址 + */ + mac?: string; + + /** + * 邀请码 + */ + inviteUsed?: string; + + /** + * 邀请码创建时间 + */ + inviteTime?: string; + + /** + * 最后登录IP + */ + loginIp?: string; + + /** + * 最后登录时间 + */ + loginDate?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/api/app/userdeviceToken/index.ts b/src/api/app/userdeviceToken/index.ts new file mode 100644 index 0000000..af8a393 --- /dev/null +++ b/src/api/app/userdeviceToken/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { UserdeviceTokenVO, UserdeviceTokenForm, UserdeviceTokenQuery } from '@/api/app/userdeviceToken/types'; + +/** + * 查询推送用户手机token列表 + * @param query + * @returns {*} + */ + +export const listUserdeviceToken = (query?: UserdeviceTokenQuery): AxiosPromise => { + return request({ + url: '/app/userdeviceToken/list', + method: 'get', + params: query + }); +}; + +/** + * 查询推送用户手机token详细 + * @param id + */ +export const getUserdeviceToken = (id: string | number): AxiosPromise => { + return request({ + url: '/app/userdeviceToken/' + id, + method: 'get' + }); +}; + +/** + * 新增推送用户手机token + * @param data + */ +export const addUserdeviceToken = (data: UserdeviceTokenForm) => { + return request({ + url: '/app/userdeviceToken', + method: 'post', + data: data + }); +}; + +/** + * 修改推送用户手机token + * @param data + */ +export const updateUserdeviceToken = (data: UserdeviceTokenForm) => { + return request({ + url: '/app/userdeviceToken', + method: 'put', + data: data + }); +}; + +/** + * 删除推送用户手机token + * @param id + */ +export const delUserdeviceToken = (id: string | number | Array) => { + return request({ + url: '/app/userdeviceToken/' + id, + method: 'delete' + }); +}; diff --git a/src/api/app/userdeviceToken/types.ts b/src/api/app/userdeviceToken/types.ts new file mode 100644 index 0000000..64d89e4 --- /dev/null +++ b/src/api/app/userdeviceToken/types.ts @@ -0,0 +1,83 @@ +export interface UserdeviceTokenVO { + /** + * + */ + id: string | number; + + /** + * 账号用户id + */ + userId: string | number; + + /** + * 设备token + */ + token: string; + + /** + * 平台 iOS/Android + */ + platform: string; + + /** + * + */ + createdTime: string; + +} + +export interface UserdeviceTokenForm extends BaseEntity { + /** + * + */ + id?: string | number; + + /** + * 账号用户id + */ + userId?: string | number; + + /** + * 设备token + */ + token?: string; + + /** + * 平台 iOS/Android + */ + platform?: string; + + /** + * + */ + createdTime?: string; + +} + +export interface UserdeviceTokenQuery extends PageQuery { + + /** + * 账号用户id + */ + userId?: string | number; + + /** + * 设备token + */ + token?: string; + + /** + * 平台 iOS/Android + */ + platform?: string; + + /** + * + */ + createdTime?: string; + + /** + * 日期范围参数 + */ + params?: any; +} diff --git a/src/components/RoleSelect/index.vue b/src/components/RoleSelect/index.vue index 56a784b..e39f71e 100644 --- a/src/components/RoleSelect/index.vue +++ b/src/components/RoleSelect/index.vue @@ -144,7 +144,7 @@ const computedIds = (data) => { const getList = () => { loading.value = true; api.listRole(proxy?.addDateRange(queryParams.value, dateRange.value)).then((res) => { - roleList.value = res.rows; + roleList.value = res.data; total.value = res.total; loading.value = false; }); diff --git a/src/views/app/.workbuddy/memory/2026-06-04.md b/src/views/app/.workbuddy/memory/2026-06-04.md new file mode 100644 index 0000000..36df793 --- /dev/null +++ b/src/views/app/.workbuddy/memory/2026-06-04.md @@ -0,0 +1,45 @@ +# 2026-06-04 + +## user/index.vue - 人脸列多图片展示 +- 将人脸列从单张 `image-preview` 改为多张 `el-image` 缩略图布局 +- 新增 `faceUrls()` 工具函数,将逗号分隔的 `faceAddr` 拆分为数组 +- 每张缩略图 40x40,flex 横排,gap 4px +- 通过 `preview-src-list` + `initial-index` 实现点击任意一张可轮播预览全部 +- 添加 hover 放大动效和图片加载失败的占位 icon + +## user/index.vue - 用户账号列展示优化 +- "用户账号"列改为优先展示手机号、其次邮箱、最后 userName 的降级逻辑 +- 模板表达式:`phonenumber || email || userName || '-'` + +## user/index.vue - 仿 sysuser 添加重置密码 +- API: `d:\code\plus-ui\src\api\app\user\index.ts` 新增 `resetUserPwd(userId, password)` → `PUT /app/user/resetPwd` +- View: 操作列新增"重置密码"按钮(Key 图标),权限 `app:user:resetPwd` +- `handleResetPwd`: ElMessageBox.prompt 弹窗输入新密码,校验 5-20 位、禁非法字符 `<>"'|\` +- 成功提示包含新密码明文 + +## user/index.vue - 账号状态改为 el-switch 开关 +- API: `d:\code\plus-ui\src\api\app\user\index.ts` 新增 `changeUserStatus(userId, status)` → `PUT /app/user/changeStatus` +- 状态列从纯文本改为 `el-switch`,`active-value="0"`(启用)、`inactive-value="1"`(停用) +- `handleStatusChange`: 切换前弹确认框,操作失败时回滚开关状态 + +## message/index.vue - 视频地址改为在线播放 +- 视频地址列从纯文本改为"播放"按钮(`VideoPlay` 图标 + 点击触发 `handlePlayVideo`) +- 新增视频播放弹窗:`