mirror of
https://gitee.com/js-yhsec/energy_storage.git
synced 2026-05-27 18:59:26 +08:00
feat(web): 新增设备管理功能
- 新增设备管理页面和相关功能
This commit is contained in:
@@ -1,36 +1,10 @@
|
||||
const btnList = [
|
||||
{ label: '', type: '', disFlag: '' },
|
||||
{ label: '新增', type: 'add', disFlag: 'isEdit', icon: 'icon-add' },
|
||||
{ label: '更新', type: 'edit', disFlag: 'isEdit' },
|
||||
{ label: '查看', type: 'detail', disFlag: 'isQuery' },
|
||||
{ label: '编辑', type: 'edit', disFlag: 'isEdit' },
|
||||
{ label: '删除', type: 'del', disFlag: 'isEdit', icon: 'icon-del' },
|
||||
{ label: '批量删除', type: 'del', disFlag: 'isEdit', icon: 'icon-del' },
|
||||
{ label: '导入', type: 'upload', disFlag: 'isEdit', icon: 'icon-import' },
|
||||
{ label: '导出', type: 'download', disFlag: 'isEdit', icon: 'icon-export' },
|
||||
{ label: '上传', type: 'upload', disFlag: 'isEdit', icon: 'icon-upload' },
|
||||
{ label: '下载', type: 'download', disFlag: 'isEdit', icon: 'icon-download' },
|
||||
{ label: '下发', type: 'xf', disFlag: 'isControl' },
|
||||
{ label: '批量下载', type: 'download', disFlag: 'isEdit', icon: 'icon-download' },
|
||||
{ label: '下载模版', type: 'downTemplate', disFlag: 'isControl', icon: 'icon-download' },
|
||||
{ label: '重置密码', type: 'reset', disFlag: 'isEdit' },
|
||||
{ label: '派发', type: 'distribute', disFlag: 'isControl' },
|
||||
{ label: '处理', type: 'dealWith', disFlag: 'isControl' },
|
||||
{ label: '审核', type: 'audit', disFlag: 'isControl' },
|
||||
{ label: '标记为已读', type: 'setTagR', disFlag: 'isControl', icon: 'icon-chulizhuangtai' },
|
||||
{ label: '标记为已处理', type: 'setTagD', disFlag: 'isControl' },
|
||||
{ label: '启动', type: 'start', disFlag: 'isControl' },
|
||||
{ label: '停止', type: 'stop', disFlag: 'isControl' },
|
||||
{ label: '重启', type: 'restart', disFlag: 'isControl' },
|
||||
{ label: '批量启动', type: 'start', disFlag: 'isControl' },
|
||||
{ label: '批量停止', type: 'stop', disFlag: 'isControl' },
|
||||
{ label: '批量重启', type: 'restart', disFlag: 'isControl' },
|
||||
{ label: '监控日志', type: 'log', disFlag: 'isControl' },
|
||||
{ label: '新建备份', type: 'backups', disFlag: 'isEdit', icon: 'icon-add' },
|
||||
{ label: '导入备份', type: 'importBackups', disFlag: 'isEdit', icon: 'icon-import' },
|
||||
{ label: '还原', type: 'restore', disFlag: 'isEdit' },
|
||||
{ label: '批量启用', type: 'enable', disFlag: 'isControl', icon: 'icon-a-qiyong' },
|
||||
{ label: '批量禁用', type: 'disable', disFlag: 'isControl', icon: 'icon-a-jinyong' }
|
||||
{ label: '查看', type: 'read', disFlag: 'isQuery' },
|
||||
{ label: '修改', type: 'edit', disFlag: 'isEdit' },
|
||||
{ label: '删除', type: 'del', disFlag: 'isEdit', icon: 'icon-del' }
|
||||
// { label: '批量删除', type: 'del', disFlag: 'isEdit', icon: 'icon-del' }
|
||||
]
|
||||
|
||||
// arr:按钮数组
|
||||
@@ -40,12 +14,12 @@ const btnList = [
|
||||
// isQuery: true;
|
||||
// }
|
||||
function getBtns(arr) {
|
||||
const permissions =
|
||||
JSON.parse(localStorage.getItem('user')).userExtend.role.permissionList[0] || {}
|
||||
// const permissions =
|
||||
// JSON.parse(localStorage.getItem('user')).userExtend.role.permissionList[0] || {}
|
||||
const btns = []
|
||||
btnList.forEach((item) => {
|
||||
if (arr.includes(item.label)) {
|
||||
item.disabled = !Boolean(permissions[item.disFlag])
|
||||
// item.disabled = !Boolean(permissions[item.disFlag])
|
||||
btns.push(item)
|
||||
}
|
||||
})
|
||||
|
||||
@@ -69,7 +69,7 @@ const colWidth = [
|
||||
{
|
||||
label: '操作',
|
||||
align: 'center',
|
||||
width: 130,
|
||||
width: 200,
|
||||
fixed: 'right',
|
||||
resizable: false
|
||||
}
|
||||
|
||||
@@ -13,3 +13,146 @@ export const policyTypes = [
|
||||
// label: '峰谷套利2'
|
||||
// }
|
||||
]
|
||||
|
||||
export const deviceTypeList = [
|
||||
{
|
||||
value: 1,
|
||||
label: '变压器',
|
||||
iconfont: 'icon-transformer'
|
||||
},
|
||||
{
|
||||
value: 2,
|
||||
label: '配电柜',
|
||||
iconfont: 'icon-dianpingcai'
|
||||
},
|
||||
{
|
||||
value: 3,
|
||||
label: '电表',
|
||||
iconfont: 'icon-dianbiao'
|
||||
},
|
||||
{
|
||||
value: 4,
|
||||
label: '门禁',
|
||||
iconfont: 'icon-menjin'
|
||||
},
|
||||
{
|
||||
value: 5,
|
||||
label: '空调',
|
||||
iconfont: 'icon-kongdiaogongcheng'
|
||||
},
|
||||
{
|
||||
value: 6,
|
||||
label: '照明',
|
||||
iconfont: 'icon-zhaomingdeng'
|
||||
},
|
||||
{
|
||||
value: 7,
|
||||
label: '消防',
|
||||
iconfont: 'icon-xiaofang'
|
||||
},
|
||||
{
|
||||
value: 8,
|
||||
label: '光照监测设备',
|
||||
iconfont: 'icon-guangzhaojianceshebei'
|
||||
},
|
||||
{
|
||||
value: 9,
|
||||
label: '风速监测设备',
|
||||
iconfont: 'icon-fengsujiance'
|
||||
},
|
||||
{
|
||||
value: 10,
|
||||
label: '温湿度监测设备',
|
||||
iconfont: 'icon-wenshidujiance'
|
||||
},
|
||||
{
|
||||
value: 11,
|
||||
label: '烟感监测设备',
|
||||
iconfont: 'icon-yanganjiance'
|
||||
},
|
||||
{
|
||||
value: 12,
|
||||
label: '水浸传感器',
|
||||
iconfont: 'icon-shuijinchuanganqiicon'
|
||||
},
|
||||
{
|
||||
value: 13,
|
||||
label: '视频监控',
|
||||
iconfont: 'icon-shipinjiankong'
|
||||
},
|
||||
{
|
||||
value: 100,
|
||||
label: '储能预制舱',
|
||||
iconfont: 'icon-jizhuangxiang'
|
||||
},
|
||||
{
|
||||
value: 101,
|
||||
label: 'EMS',
|
||||
iconfont: 'icon-quexianguanli'
|
||||
},
|
||||
{
|
||||
value: 102,
|
||||
label: 'PCS',
|
||||
iconfont: 'icon-nengyuanguanli'
|
||||
},
|
||||
{
|
||||
value: 103,
|
||||
label: 'PCU',
|
||||
iconfont: 'icon-bianyaqi'
|
||||
},
|
||||
{
|
||||
value: 104,
|
||||
label: 'BMS',
|
||||
iconfont: 'icon-BMSchunengdianchi'
|
||||
},
|
||||
{
|
||||
value: 105,
|
||||
label: 'BCU',
|
||||
iconfont: 'icon-L-chunengdianchicu'
|
||||
},
|
||||
{
|
||||
value: 106,
|
||||
label: '充电桩',
|
||||
iconfont: 'icon-charging-pile-line'
|
||||
},
|
||||
{
|
||||
value: 107,
|
||||
label: '充电枪',
|
||||
iconfont: 'icon-chongdianqiang'
|
||||
},
|
||||
{
|
||||
value: 108,
|
||||
label: '集中器',
|
||||
iconfont: 'icon-jizhongqi'
|
||||
},
|
||||
{
|
||||
value: 109,
|
||||
label: '光伏板',
|
||||
iconfont: 'icon-guangfuban'
|
||||
},
|
||||
{
|
||||
value: 110,
|
||||
label: '风力发电机光感',
|
||||
iconfont: 'icon-zhuangjirongliang'
|
||||
}
|
||||
]
|
||||
// 日志类型:0:其它; 1:系统日志; 2:操作日志; 3:设备日志
|
||||
|
||||
export const logTypes = [
|
||||
{
|
||||
value: '0',
|
||||
label: '其它'
|
||||
},
|
||||
{
|
||||
value: '1',
|
||||
label: '系统日志'
|
||||
},
|
||||
{
|
||||
value: '2',
|
||||
label: '操作日志'
|
||||
},
|
||||
{
|
||||
value: '3',
|
||||
label: '设备日志'
|
||||
}
|
||||
]
|
||||
|
||||
116
web/src/utils/decorator.js
Normal file
116
web/src/utils/decorator.js
Normal file
@@ -0,0 +1,116 @@
|
||||
let validateRulesObj = {
|
||||
phone: {
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const reg = /^[1][3,4,5,6,7,8,9][0-9]{9}$/
|
||||
if (value === '') {
|
||||
return Promise.resolve()
|
||||
} else if (!reg.test(value)) {
|
||||
return Promise.reject(new Error('请输入正确的手机号码'))
|
||||
}
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
email: {
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const reg =
|
||||
/^([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\_|\.]?)*[a-zA-Z0-9]+\.[a-zA-Z]{2,3}$/
|
||||
if (!reg.test(value)) {
|
||||
return Promise.reject(new Error('请输入正确的邮箱'))
|
||||
}
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
pwd: {
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const reg = /^(?![\d]+$)(?![a-zA-Z]+$)(?![^\da-zA-Z]+$).{6,20}$/
|
||||
if (!reg.test(value)) {
|
||||
return Promise.reject(new Error('请输入密码,密码由6-20位字母、字符或数字组成'))
|
||||
}
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
// 新密码与旧密码是否一致校验
|
||||
checkOpwd: {
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
// 获取旧密码
|
||||
let opwd = this.props.form.getFieldValue('oldPsd')
|
||||
if (!(opwd && opwd !== value)) {
|
||||
return Promise.reject(new Error('旧密码与新密码一致'))
|
||||
} else {
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
gphone: {
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const reg = /^([0-9]{3,4}-)?[0-9]{7,8}$/
|
||||
if (!reg.test(value)) {
|
||||
return Promise.reject(new Error('请输入正确的固定电话'))
|
||||
} else {
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
|
||||
lng: {
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const reg =
|
||||
/^(\-|\+)?(((\d|[1-9]\d|1[0-7]\d|0{1,3})\.\d{0,6})|(\d|[1-9]\d|1[0-7]\d|0{1,3})|180\.0{0,6}|180)$/
|
||||
if (value !== '' && value !== null && value !== undefined) {
|
||||
if (!reg.test(value)) {
|
||||
return Promise.reject(new Error('经度整数部分为-180 至 180,小数部分为0到6位!'))
|
||||
} else {
|
||||
return Promise.resolve()
|
||||
}
|
||||
} else {
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
},
|
||||
lat: {
|
||||
rules: [
|
||||
{
|
||||
validator: (rule, value, callback) => {
|
||||
const reg = /^(\-|\+)?([0-8]?\d{1}\.\d{0,6}|90\.0{0,6}|[0-8]?\d{1}|90)$/
|
||||
if (value !== '' && value !== null && value !== undefined) {
|
||||
if (!reg.test(value)) {
|
||||
return Promise.reject(new Error('纬度整数部分为-90 至 90,小数部分为0到6位!'))
|
||||
} else {
|
||||
return Promise.resolve()
|
||||
}
|
||||
} else {
|
||||
return Promise.resolve()
|
||||
}
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
}
|
||||
export default validateRulesObj
|
||||
59
web/src/utils/notification.js
Normal file
59
web/src/utils/notification.js
Normal file
@@ -0,0 +1,59 @@
|
||||
import { notification } from 'ant-design-vue'
|
||||
import { h } from 'vue'
|
||||
import {
|
||||
CheckCircleFilled,
|
||||
CloseCircleFilled,
|
||||
ExclamationCircleFilled
|
||||
} from '@ant-design/icons-vue'
|
||||
|
||||
// name:页面名称,角色、人员、系统等
|
||||
// type:add,edit,del,detail
|
||||
// status:success,error,warning
|
||||
// desc: 描述
|
||||
const option = {
|
||||
names: {
|
||||
user: '用户管理'
|
||||
},
|
||||
types: {
|
||||
// isDealWith: '标记为已处理',
|
||||
// isRead: '标记为已读'
|
||||
},
|
||||
status: { success: '成功', error: '失败', warning: '警告' }
|
||||
}
|
||||
const notiInfo = {
|
||||
success: {
|
||||
iconMessage: '成功通知',
|
||||
icon: CheckCircleFilled,
|
||||
iconColor: 'color:#065758',
|
||||
iconClass: 'notification-success-class'
|
||||
},
|
||||
error: {
|
||||
iconMessage: '失败通知',
|
||||
icon: CloseCircleFilled,
|
||||
iconColor: 'color:#ca4d2a',
|
||||
iconClass: 'notification-error-class'
|
||||
},
|
||||
warning: {
|
||||
iconMessage: '警告通知',
|
||||
icon: ExclamationCircleFilled,
|
||||
iconColor: 'color:#FF921B',
|
||||
iconClass: 'notification-warning-class'
|
||||
}
|
||||
}
|
||||
const openNotification = ({ name, type, status, desc = '' }) => {
|
||||
notification[status]({
|
||||
placement: 'bottomRight',
|
||||
message: notiInfo[status].iconMessage,
|
||||
description: desc || option.names[name] + option.types[type] + option.status[status],
|
||||
icon: () =>
|
||||
h(notiInfo[status].icon, {
|
||||
style: notiInfo[status].iconColor
|
||||
}),
|
||||
style: {
|
||||
minWidth: '400px'
|
||||
},
|
||||
class: notiInfo[status].iconClass,
|
||||
duration: 2
|
||||
})
|
||||
}
|
||||
export default openNotification
|
||||
Reference in New Issue
Block a user