# Conflicts:
#	frontend/src/views/home/components/tree.vue
This commit is contained in:
GYYM
2024-11-12 20:39:16 +08:00
22 changed files with 806 additions and 548 deletions

View File

@@ -23,7 +23,7 @@ export const updatePqDev = (params: Device.ResPqDev) => {
//删除被检设备
export const deletePqDev = (params: string[]) => {
return http.delete(`/pqDev/delete`, params)
return http.post(`/pqDev/delete`, params)
}
//导出被检设备

View File

@@ -0,0 +1,35 @@
import type { ReqPage,ResPage } from '@/api/interface'
// 被检设备模块
export namespace Monitor {
/**
* 电能质量指标字典数据表格分页查询参数
*/
export interface ReqPqMonParams extends ReqPage{
id: string; // 装置序号id 必填
devType?: string; // 设备名称
createTime?:string; //创建时间
}
/**
* 被检设备新增、修改、根据id查询返回的对象
*/
export interface ResPqMon {
id: string; //监测点ID
code: string; //默认与谐波系统监测点ID相同
devId: string; //所属设备ID
name: string; //所属母线
num: number; //监测点序号
pt: number; //PT变比
ct: number; //CT变比
ptType:string; //接线方式,字典表
}
/**
* 被检设备表格查询分页返回的对象;
*/
export interface ResPqMonPage extends ResPage<ResPqMon> {
}
}

View File

@@ -0,0 +1,29 @@
import type { Monitor } from './interface'
import { ADMIN as rePrefix } from '@/api/config/serviceName'
import http from '@/api'
/**
* @name 被检设备管理模块
*/
//获取被检设备
export const getPqMonList = (params: Monitor.ReqPqMonParams) => {
return http.post(`/pqMon/list`, params)
}
//添加被检设备
export const addPqMon = (params: Monitor.ResPqMon) => {
return http.post(`/pqMon/add`, params)
}
//编辑被检设备
export const updatePqMon = (params: Monitor.ResPqMon) => {
return http.put(`/pqMon/update`, params)
}
//删除被检设备
export const deletePqMon = (params: string[]) => {
return http.post(`/pqMon/delete`, params)
}

View File

@@ -12,11 +12,16 @@ export namespace Role {
//角色接口
export interface RoleBO {
id?: string; //角色类型ID
id: string; //角色类型ID
name: string; //角色类型名称
code: string; //角色代码
type: number; //角色类型
remark:string; //角色描述
remark?:string; //角色描述
state:number;
createBy?:string; //
createTime?: string; // 创建时间
updateBy?: string; //
updateTime?: string; // 更新时间
}
//角色+资源

View File

@@ -1,5 +1,5 @@
import { ResPage } from '@/api/interface'
import { Role } from './interface'
import type { ResPage } from '@/api/interface'
import type { Role } from './interface'
import { ADMIN as rePrefix } from '@/api/config/serviceName'
import http from '@/api'
@@ -8,7 +8,7 @@ import http from '@/api'
*/
// 获取角色列表
export const getRoleList = (params: Role.ReqRoleParams) => {
return http.post<ResPage<Role.RoleBO>>(`/role/list`, params)
return http.get(`/sysRole/list`, params)
// return http.post<ResPage<Role.ResRoleList>>(`/RoleList_Post`, params)
// return http.post<ResPage<Role.ResRoleList>>(`${rePrefix}/role/list`, params)
@@ -16,17 +16,17 @@ export const getRoleList = (params: Role.ReqRoleParams) => {
// 新增角色
export const addRole = (params: Role.RoleBO) => {
return http.post(`/role/add`, params)
return http.post(`/sysRole/add`, params)
}
// 编辑角色
export const editRole = (params: Role.RoleBO) => {
return http.post(`/role/edit`, params)
return http.put(`/sysRole/edit`, params)
}
// 删除角色
export const deleteRole = (params: { id: string[] }) => {
return http.post(`/role/del`, params)
return http.post(`/sysRole/del`, params)
}
@@ -35,60 +35,3 @@ export const editRoleAndPermission = (params: Role.ReqRoleAndPermission) => {
return http.post(`/role/edit_RoleAndPermission`, params)
}
// // 获取树形用户列表
// export const getRoleTreeList = (params: Role.ReqRoleParams) => {
// return http.post<ResPage<Role.ResRoleList>>(`${rePrefix}/role/tree/list`, params)
// }
// export const addRole = (params: { id: string ; rolename: string;status: number; describe:string; }) => {
// return http.post(`/RoleList_Add`, params)
// }
// 批量添加角色
// export const BatchAddRole = (params: FormData) => {
// return http.post(`${rePrefix}/role/import`, params)
// }
// // 切换角色状态
// export const changeRoleStatus = (params: { id: string; status: number }) => {
// return http.post(`${rePrefix}/role/change`, params)
// }
// 重置用户密码
// export const resetUserPassWord = (params: { id: string }) => {
// return http.post(`${rePrefix}/role/rest_password`, params)
// }
// 导出角色数据
// export const exportRoleInfo = (params: Role.ReqRoleParams) => {
// return http.download(`${rePrefix}/role/export`, params)
// }
// 获取角色状态字典
// export const getRoleStatus = () => {
// return http.get<Role.ResStatus[]>(`${rePrefix}/role/status`)
// }
// 获取用户性别字典
// export const getUserGender = () => {
// return http.get<User.ResGender[]>(`${rePrefix}/user/gender`)
// }
// 获取角色权限列表
// export const getRoleDepartment = () => {
// return http.get<Role.ResPermissionList[]>(`${rePrefix}/role/permission`)
// }
// 获取用户角色字典
// export const getUserRole = () => {
// return http.get<User.ResRole[]>(`${rePrefix}/user/role`)
// }

View File

@@ -19,7 +19,7 @@ export const updateDictData = (params: Dict.ResDictData) => {
//删除字典数据
export const deleteDictData = (params: string[]) => {
return http.delete(`/dictData/delete`, params)
return http.post(`/dictData/delete`, params)
}
export const getDicDataById = (params: string) => {

View File

@@ -18,6 +18,6 @@ export const updateDictPq = (params: Dict.ResDictPq) => {
//删除字典类型
export const deleteDictPq = (params: string[]) => {
return http.delete(`/dictPq/delete`, params)
return http.post(`/dictPq/delete`, params)
}

View File

@@ -13,7 +13,7 @@ export const addDictTree = (params: Dict.ResDictTree) => {
//编辑字典类型
export const updateDictTree = (params: Dict.ResDictTree) => {
return http.post(`/dictTree/update`, params)
return http.put(`/dictTree/update`, params)
}
//删除字典类型

View File

@@ -18,7 +18,7 @@ export const updateDictType = (params: Dict.ResDictType) => {
//删除字典类型
export const deleteDictType = (params: string[]) => {
return http.delete(`/dictType/delete`, params)
return http.post(`/dictType/delete`, params)
}
//导出字典类型

View File

@@ -23,7 +23,7 @@ export namespace User {
*/
export interface ReqUserParams extends ReqPage{
id: string; // 装置序号用户ID 必填
name: string; //用户名(别名)
name?: string; //用户名(别名)
loginTime?: string;//最后一次登录时间
}
@@ -44,8 +44,19 @@ export namespace User {
createTime?: string;//创建时间
updateBy?: string;//更新用户
updateTime?: string;//更新时间
roleIds?: string[]; //
roleNames?:string[]; //
}
// 用户接口
export interface ResPassWordUser {
id: string; //用户ID作为唯一标识
oldPassword: string; //密码
newPassword: string; //新密码
surePassword:string;
}
/**
* 用户表格查询分页返回的对象;
*/

View File

@@ -1,3 +1,4 @@
import type { Role } from './../role/interface/index';
import type { ResPage } from '@/api/interface'
import type { User} from './interface'
import { ADMIN as rePrefix } from '@/api/config/serviceName'
@@ -8,50 +9,33 @@ import http from '@/api'
*/
// 获取用户列表
export const getUserList = (params: User.ReqUserParams) => {
return http.post(`/user/list`, params)
return http.post(`/sysUser/list`, params)
}
// 获取树形用户列表
// export const getUserTreeList = (params: User.ReqUserParams) => {
// return http.post<ResPage<User.ResUserList>>(`${rePrefix}/user/tree/list`, params)
// }
// 新增用户
export const addUser = (params: User.ResUser) => {
return http.post(`/user/add`, params)
}
// 批量添加用户
export const BatchAddUser = (params: User.ReqUserParams) => {
return http.post(`$/user/import`, params)
return http.post(`/sysUser/add`, params)
}
// 编辑用户
export const updateUser = (params: User.ResUser) => {
return http.post(`/user/update`, params)
return http.put(`/sysUser/update`, params)
}
// 删除用户
export const deleteUser = (params: string[] ) => {
return http.post(`/user/delete`, params)
return http.post(`/sysUser/delete`, params)
}
// 切换用户状态
// export const changeUserStatus = (params: { id: string; status: number }) => {
// return http.post(`${rePrefix}/user/change`, params)
// }
// 重置用户密码
// export const resetUserPassWord = (params: { id: string }) => {
// return http.post(`${rePrefix}/user/rest_password`, params)
// }
// 导出用户数据
export const exportUserInfo = (params: User.ReqUserParams) => {
return http.download(`${rePrefix}/user/export`, params)
// 获取角色列表
export const getRoleList = () => {
return http.get<Role.RoleBO>(`/sysRole/simpleList`)
}
//修改密码
export const updatePassWord = (params: User.ResPassWordUser) => {
return http.put(`/sysUser/updatePassword`,params)
}
// 获取用户状态字典
// export const getUserStatus = () => {
// return http.get<User.ResStatus[]>(`${rePrefix}/user/status`)
// }

View File

@@ -138,40 +138,42 @@ const updateDateRange = () => {
} else if (timeUnit.value === '周') {
startDate.value = getStartOfWeek(today.value)
endDate.value = getEndOfWeek(today.value)
console.log(endDate.value.toLocaleDateString())
//console.log(endDate.value.toLocaleDateString())
} else if (timeUnit.value === '月') {
// 获取本月的开始和结束日期
startDate.value = new Date(today.value.getFullYear(), today.value.getMonth(), 1);
endDate.value = new Date(today.value.getFullYear(), today.value.getMonth() + 1, 0);
// 确保结束日期不超过今天
if (endDate.value > today.value) {
endDate.value = new Date(today.value);
endDate.value.setHours(23, 59, 59, 999); // 设置结束时间为今天的23:59:59.999
}
// // 确保结束日期不超过今天
// if (endDate.value > today.value) {
// endDate.value = new Date(today.value);
// endDate.value.setHours(23, 59, 59, 999); // 设置结束时间为今天的23:59:59.999
// }
} else if (timeUnit.value === '季度') {
const quarter = Math.floor(today.value.getMonth() / 3);
startDate.value = new Date(today.value.getFullYear(), quarter * 3, 1);
endDate.value = new Date(today.value.getFullYear(), quarter * 3 + 3, 0);
// 确保结束日期不超过今天
if (endDate.value > today.value) {
endDate.value = new Date(today.value);
endDate.value.setHours(23, 59, 59, 999); // 设置结束时间为今天的23:59:59.999
}
// // 确保结束日期不超过今天
// if (endDate.value > today.value) {
// endDate.value = new Date(today.value);
// endDate.value.setHours(23, 59, 59, 999); // 设置结束时间为今天的23:59:59.999
// }
} else if (timeUnit.value === '年') {
startDate.value = new Date(today.value.getFullYear(), 0, 1);
endDate.value = new Date(today.value.getFullYear(), 11, 31);
// 确保结束日期不超过今天
if (endDate.value > today.value) {
endDate.value = new Date(today.value);
endDate.value.setHours(23, 59, 59, 999); // 设置结束时间为今天的23:59:59.999
}
// // 确保结束日期不超过今天
// if (endDate.value > today.value) {
// console.log("1111")
// endDate.value = new Date(today.value);
// endDate.value.setHours(23, 59, 59, 999); // 设置结束时间为今天的23:59:59.999
// }
}
updateNextButtonStatus()
}
const getStartOfWeek = (date: Date) => {
@@ -192,8 +194,8 @@ const getEndOfWeek = (date: Date) => {
today.setHours(23, 59, 59, 999); // 设置今天的结束时间23:59:59.999
// 返回不超过今天的结束时间
return endOfWeek > today ? today : endOfWeek;
//return endOfWeek
//return endOfWeek > today ? today : endOfWeek;
return endOfWeek
}
const prevPeriod = () => {
const prevStartDate = new Date(startDate.value)
@@ -206,8 +208,13 @@ const prevPeriod = () => {
prevStartDate.setDate(prevStartDate.getDate() - 7)
prevEndDate.setDate(prevEndDate.getDate() - 7)
} else if (timeUnit.value === '月') {
prevStartDate.setMonth(prevStartDate.getMonth() - 1)
prevEndDate.setMonth(prevEndDate.getMonth() - 1)
} else if (timeUnit.value === '季度') {
prevStartDate.setMonth(prevStartDate.getMonth() - 3)
prevEndDate.setMonth(prevEndDate.getMonth() - 3)
@@ -251,6 +258,7 @@ const nextPeriod = () => {
updateNextButtonStatus()
}
const updateNextButtonStatus = () => {
//console.log(endDate.value)
// 更新下一个按钮的禁用状态
const maxDate = new Date() // 假设最新日期为今天
// 将 maxDate 设置为当天的开始时间
@@ -263,6 +271,7 @@ const updateNextButtonStatus = () => {
emitDateChange() // 变化时也发出更新事件
}
// 限制开始日期不能选择超过当前日期
const disableStartDate = (date: Date) => {
return date > today.value

View File

@@ -1,40 +1,28 @@
<template>
<!-- 基础信息弹出框 -->
<el-dialog :model-value="dialogVisible" :title="title" v-bind="dialogSmall" @close="handleCancel" width="500" draggable>
<el-dialog :model-value="dialogVisible" :title="dialogTitle" v-bind="dialogSmall" @close="close" >
<div>
<el-form :model="data"
<el-form :model="formContent"
ref='formRuleRef'
:rules='rules'
>
<el-form-item label="名称" prop='name' :label-width="100">
<el-input v-model="data.name" placeholder="请输入名称" autocomplete="off" />
<el-input v-model="formContent.name" placeholder="请输入名称" autocomplete="off" />
</el-form-item>
<el-form-item label="编码" prop='code' :label-width="100">
<el-input v-model="data.code" placeholder="请输入编码" autocomplete="off" />
<el-input v-model="formContent.code" placeholder="请输入编码" autocomplete="off" />
</el-form-item>
<el-form-item label="类型" prop='type' :label-width="100">
<el-select v-model="data.type" placeholder="请选择类型" autocomplete="off">
<el-option
v-for="item in dictStore.getDictData('roleType')"
:key="item.id"
:label="item.label"
:value="item.code"
/>
</el-select>
</el-form-item>
<el-form-item label="描述" prop='remark' :label-width="100">
<el-input v-model="data.remark" :rows="2" type="textarea" placeholder="请输入备注" autocomplete="off" />
<el-input v-model="formContent.remark" :rows="2" type="textarea" placeholder="请输入备注" autocomplete="off" />
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="handleCancel">取消</el-button>
<el-button type="primary" @click="handleOK">
<el-button @click="close()">取消</el-button>
<el-button type="primary" @click="save()">
保存
</el-button>
</div>
@@ -44,32 +32,52 @@
</template>
<script lang="ts" setup>
import { FormInstance,FormItemRule } from 'element-plus'
import { ProTableInstance } from '@/components/ProTable/interface'
import { ref,computed } from 'vue'
import { Role } from '@/api/role/interface'
import{ ElMessage, type FormInstance,type FormItemRule } from 'element-plus'
import type { ProTableInstance } from '@/components/ProTable/interface'
import { ref,computed, Ref } from 'vue'
import { type Role } from '@/api/role/interface'
import {dialogSmall} from '@/utils/elementBind'
import { useDictStore } from '@/stores/modules/dict'
import {
addRole,
editRole,
} from '@/api/role/role'
import {addRole,editRole,} from '@/api/role/role'
const dictStore = useDictStore()
// 定义弹出组件元信息
const dialogFormRef = ref()
const {dialogVisible,title,data,openType,getTableList} = defineProps<{
dialogVisible:boolean;
title:string;
openType:string;
getTableList:Function;
data:{
id?: string; //角色类型ID
name: string; //角色类型名称
code: string; //角色代码
type: number;
remark:string; //角色描述
function useMetaInfo() {
const dialogVisible = ref(false)
const titleType = ref('add')
const formContent = ref<Role.RoleBO>({
id: '', //角色类型ID
name: '', //角色类型名称
code: '', //角色代码
type: 2, //角色类型
remark:'', //角色描述
state:1,
})
return { dialogVisible, titleType, formContent }
}
}>();
const { dialogVisible, titleType, formContent } = useMetaInfo()
// 清空formContent
const resetFormContent = () => {
formContent.value = {
id: '', //角色类型ID
name: '', //角色类型名称
code: '', //角色代码
type: 2, //角色类型
remark:'', //角色描述
state:1,
}
}
let dialogTitle = computed(() => {
return titleType.value === 'add' ? '新增角色' : '编辑角色'
})
//定义规则
@@ -80,59 +88,61 @@
code: [{ required: true, message: '编码必填!', trigger: 'blur' }],
})
const emit = defineEmits<{
(e:'update:visible',value:boolean):void;
}>();
const handleCancel = () => {
emit('update:visible',false)
// 关闭弹窗
const close = () => {
dialogVisible.value = false
// 清空dialogForm中的值
resetFormContent()
// 重置表单
dialogFormRef.value?.resetFields()
}
const handleOK = () => {
ElMessage.info('角色数据提交')
// 保存数据
const save = () => {
try {
formRuleRef.value?.validate((valid: boolean) => {
dialogFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
// 将表单数据转为json,发送到后端
// let confirmFormData = JSON.parse(JSON.stringify(form.value))
// console.log(confirmFormData)
if(openType === "add")
{
addRole(data).then(res => {
// if(res.code === "200")
// {
ElMessage.success(res.message)
getTableList()
// }
// else
// ElMessage.error(res.message)
})
}
if(openType === "edit")
{
editRole(data).then(res => {
// if(res.code === "200")
// {
ElMessage.success(res.message)
getTableList()
// }
// else
// ElMessage.error(res.message)
})
}
emit('update:visible',false)
if (formContent.value.id) {
const result = await editRole(formContent.value);
if(result.code != 'A0000'){
ElMessage.error({ message: result.message})
}else{
ElMessage.error('表单验证失败!')
ElMessage.success({ message: `${dialogTitle.value}成功!` })
}
} else {
const result = await addRole(formContent.value);
if(result.code != 'A0000'){
ElMessage.error({ message: result.message})
}else{
ElMessage.success({ message: `${dialogTitle.value}成功!` })
}
}
close()
// 刷新表格
await props.refreshTable!()
}
})
} catch (error) {
console.error('验证过程中发生错误', error)
} catch (err) {
console.error('验证过程中出现错误', err)
}
}
// 打开弹窗,可能是新增,也可能是编辑
const open = async (sign: string, data: Role.RoleBO) => {
titleType.value = sign
dialogVisible.value = true
if (data.id) {
formContent.value = { ...data }
} else {
resetFormContent()
}
}
// 对外映射
defineExpose({ open })
const props = defineProps<{
refreshTable: (() => Promise<void>) | undefined;
}>()
</script>

View File

@@ -4,13 +4,11 @@
ref='proTable'
:columns='columns'
:request-api="getTableList"
:data-callback="dataCallback"
>
<!-- :requestApi="getRoleList" -->
<!-- 表格 header 按钮 -->
<template #tableHeader='scope'>
<el-button type='primary' :icon='CirclePlus' @click="openDrawer('新增角色')">新增</el-button>
<el-button type='primary' :icon='Download' plain>导出数据</el-button>
<el-button type='danger' :icon='Delete' plain :disabled='!scope.isSelected'
@click='batchDelete(scope.selectedListIds)'>
批量删除
@@ -25,41 +23,20 @@
</ProTable>
</div>
<rolePopup
:dialogVisible=rolePopupVisible
:title=rolePopupTitle
:data=rolePopupData
:openType=openType
:getTableList="proTable?.getTableList || (() => {})"
@update:visible='rolePopupVisible = $event'
/>
<!-- :proTable="proTable || {} as ProTableInstance" -->
<permissionUnit
:dialogVisible=permissionUnitVisible
:title=permissionUnitTitle
:data=permissionUnitData
@update:visible='permissionUnitVisible = $event'
/>
<RolePopup :refresh-table='proTable?.getTableList' ref='rolePopup' />
</template>
<script setup lang='tsx' name='useRole'>
import { Role } from '@/api/role/interface'
import { type Role } from '@/api/role/interface'
import { useHandleData } from '@/hooks/useHandleData'
import { useDownload } from '@/hooks/useDownload'
import { useAuthButtons } from '@/hooks/useAuthButtons'
import ProTable from '@/components/ProTable/index.vue'
import rolePopup from './components/rolePopup.vue'
import permissionUnit from './components/permissionUnit.vue'
import ImportExcel from '@/components/ImportExcel/index.vue'
import { ProTableInstance, ColumnProps } from '@/components/ProTable/interface'
import type{ ProTableInstance, ColumnProps } from '@/components/ProTable/interface'
import { CirclePlus, Delete, EditPen, Share, Download, Upload, View, Refresh } from '@element-plus/icons-vue'
import { useDictStore } from '@/stores/modules/dict'
import {
getRoleList,
deleteRole,
} from '@/api/role/role'
import { deleteUser } from '@/api/user/user'
import {getRoleList,deleteRole} from '@/api/role/role'
import RolePopup from './components/rolePopup.vue'
import { reactive, ref } from 'vue'
const { rolePopupVisible, permissionUnitVisible, rolePopupTitle, permissionUnitTitle, rolePopupData, permissionUnitData } = useCount()
@@ -77,24 +54,11 @@ function useCount() {
const dictStore = useDictStore()
let openType = ''
const rolePopup = ref()
// ProTable 实例
const proTable = ref<ProTableInstance>()
// dataCallback 是对于返回的表格数据做处理,如果你后台返回的数据不是 list && total 这些字段,可以在这里进行处理成这些字段
// 或者直接去 hooks/useTable.ts 文件中把字段改为你后端对应的就行
const dataCallback = (data: any) => {
return {
records: data.list,
total: data.total,
current: data.pageNum,
size: data.pageSize,
}
}
// 如果你想在请求之前对当前请求参数做一些操作可以自定义如下函数params 为当前所有的请求参数(包括分页),最后返回请求列表接口
// 默认不做操作就直接在 ProTable 组件上绑定 :requestApi="getUserList"
const getTableList = (params: any) => {
@@ -105,9 +69,6 @@ const getTableList = (params: any) => {
return getRoleList(newParams)
}
// 页面按钮权限(按钮权限既可以使用 hooks也可以直接使用 v-auth 指令指令适合直接绑定在按钮上hooks 适合根据按钮权限显示不同的内容)
const { BUTTONS } = useAuthButtons()
// 表格配置项
const columns = reactive<ColumnProps<Role.RoleBO>[]>([
{ type: 'selection', fixed: 'left', width: 70 },
@@ -124,19 +85,16 @@ const columns = reactive<ColumnProps<Role.RoleBO>[]>([
search: { el: 'input' },
minWidth: 180,
},
{
prop: 'type',
label: '类型',
enum: dictStore.getDictData('roleType'),
fieldNames: { label: 'label', value: 'code' },
search: { el: 'select' },
minWidth: 180,
},
{
prop: 'remark',
label: '描述',
minWidth: 380,
},
{
prop: 'state',
label: '状态',
minWidth: 100,
},
{ prop: 'operation', label: '操作', fixed: 'right', width: 330 },
])
@@ -156,74 +114,10 @@ const batchDelete = async (id: string[]) => {
proTable.value?.getTableList()
}
// 切换角色状态
const changeStatus = async (row: Role.RoleBO) => {
// await useHandleData(changeRoleStatus, {
// id: row.id,
// status: row.status == 1 ? 0 : 1,
// }, `切换【${row.rolename}】角色状态`)
// proTable.value?.getTableList()
}
// 导出角色列表
//const downloadFile = async () => {
// ElMessageBox.confirm('确认导出角色数据?', '温馨提示', { dictType: 'warning' }).then(() =>
// useDownload(exportRoleInfo, '角色列表', proTable.value?.searchParam),
// )
//}
// 批量添加角色
const dialogRef = ref<InstanceType<typeof ImportExcel> | null>(null)
const batchAdd = () => {
// const params = {
// title: '角色',
// tempApi: exportRoleInfo,
// importApi: BatchAddRole,
// getTableList: proTable.value?.getTableList,
// }
// dialogRef.value?.acceptParams(params)
}
// 打开 drawer(新增、查看、编辑)
const openDrawer = (title: string, row: Partial<Role.RoleBO> = {}) => {
if (title === '新增角色' || title === '编辑角色') {
if (title === '新增角色')
openType = 'add'
else if (title === '编辑角色')
openType = 'edit'
rolePopupVisible.value = true
rolePopupTitle.value = title
const safeRow: Role.RoleBO = {
id: row.id || '',
name: row.name || '',
code: row.code || '',
type: row.type || 0,
remark: row.remark || '',
}
rolePopupData.value = safeRow
} else if (title === '设置权限') {
permissionUnitVisible.value = true
permissionUnitTitle.value = title
const safeRow: Role.RoleBO = {
id: row.id || '',
name: row.name || '',
code: row.code || '',
type: row.type || 0,
remark: row.remark || '',
}
permissionUnitData.value = safeRow
// if (row.permissionList)
// {
// permissionUnitData.value = row.permissionList;
// }
}
const openDrawer = (titleType: string, row: Partial<Role.RoleBO> = {}) => {
rolePopup.value?.open(titleType, row)
}
</script>

View File

@@ -0,0 +1,142 @@
<template>
<!-- 基础信息弹出框 -->
<el-dialog v-model='dialogVisible' :title="dialogTitle" v-bind="dialogSmall" @close="close">
<div>
<el-form :model="formContent"
ref='dialogFormRef'
:rules='rules'
>
<el-form-item label="原密码" prop='oldPassword' :label-width="100">
<el-input type="oldPassword" v-model="formContent.oldPassword" show-password placeholder="请输入原密码" autocomplete="off" />
</el-form-item>
<el-form-item label="新密码" prop='newPassword' :label-width="100">
<el-input type="newPassword" v-model="formContent.newPassword" show-password placeholder="请输入新密码" autocomplete="off" />
</el-form-item>
<el-form-item label="确认密码" prop='surePassword' :label-width="100">
<el-input type="surePassword" v-model="formContent.surePassword" show-password placeholder="请再次输入确认密码" autocomplete="off" />
</el-form-item>
</el-form>
</div>
<template #footer>
<div class="dialog-footer">
<el-button @click="close()">取消</el-button>
<el-button type="primary" @click="save()">
保存
</el-button>
</div>
</template>
</el-dialog>
</template>
<script lang="ts" setup>
import { ref, type Ref } from 'vue'
import {dialogSmall} from '@/utils/elementBind'
import { ElMessage, type FormInstance,type FormItemRule } from 'element-plus'
import {updatePassWord} from '@/api/user/user'
// 使用 dayjs 库格式化
import dayjs from 'dayjs';
import { type User } from '@/api/user/interface';
// 定义弹出组件元信息
const dialogFormRef = ref()
const dialogTitle = ref('修改密码')
const surePassword = ref('')
function useMetaInfo() {
const dialogVisible = ref(false)
const formContent = ref<User.ResPassWordUser>({
id: '', //用户ID作为唯一标识
oldPassword: '',//密码
newPassword:'',//
surePassword:'',
})
return { dialogVisible, formContent }
}
const { dialogVisible, formContent } = useMetaInfo()
// 清空formContent
const resetFormContent = () => {
formContent.value = {
id: '', //用户ID作为唯一标识
oldPassword: '',//密码
newPassword:'',//
surePassword:'',
}
}
//定义规则
const formRuleRef = ref<FormInstance>()
// 定义规则
const rules: Ref<Record<string, Array<FormItemRule>>> = ref({
oldPassword: [
{ required: true, message: '原密码必填!', trigger: 'blur' }
],
newPassword: [
{ required: true, message: '新密码必填!', trigger: 'blur' },
{ pattern: /^(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,16}$/, message: '密码长度为8-16需包含特殊字符', trigger: 'blur' }
],
surePassword: [
{ required: true, message: '确认密码必填!', trigger: 'blur' },
{
validator: (rule: FormItemRule, value: string, callback: Function) => {
console.log('1111')
if (value !== formContent.value.newPassword) {
callback(new Error('两次输入的密码不一致!'));
} else {
callback();
}
},
trigger: 'blur'
}
]
})
// 关闭弹窗
const close = () => {
dialogVisible.value = false
// 清空dialogForm中的值
resetFormContent()
// 重置表单
dialogFormRef.value?.resetFields()
}
// 保存数据
const save = () => {
try {
dialogFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
if (formContent.value.id) {
const result = await updatePassWord(formContent.value);
if(result.code != 'A0000'){
ElMessage.error({ message: String(result.data)})
}else{
ElMessage.success({ message: `${dialogTitle.value}成功!` })
}
}
close()
// 刷新表格
await props.refreshTable!()
}
})
} catch (err) {
console.error('验证过程中出现错误', err)
}
}
// 打开弹窗是编辑
const open = async ( data: User.ResPassWordUser) => {
dialogVisible.value = true
if (data.id) {
formContent.value = { ...data }
}
}
// 对外映射
defineExpose({ open })
const props = defineProps<{
refreshTable: (() => Promise<void>) | undefined;
}>()
</script>

View File

@@ -3,7 +3,7 @@
<el-dialog v-model='dialogVisible' :title="dialogTitle" v-bind="dialogSmall" @close="close">
<div>
<el-form :model="formContent"
ref='formRuleRef'
ref='dialogFormRef'
:rules='rules'
>
<el-form-item label="用户名" prop='name' :label-width="100">
@@ -12,8 +12,18 @@
<el-form-item label="登录名" prop='loginName' :label-width="100">
<el-input v-model="formContent.loginName" placeholder="请输入登录名" autocomplete="off" />
</el-form-item>
<el-form-item label="密码" prop='password' :label-width="100">
<el-input type="password" v-model="formContent.password" placeholder="请输入密码" autocomplete="off" />
<el-form-item label="密码" prop='password' :label-width="100" v-if="IsPasswordShow">
<el-input type="password" v-model="formContent.password" show-password placeholder="请输入密码" autocomplete="off" />
</el-form-item>
<el-form-item label='角色' :label-width='100' prop='roles'>
<el-select v-model="formContent.roleIds" multiple placeholder="请选择角色">
<el-option
v-for="item in roleList"
:key="item.id"
:label="item.name"
:value="item.id"
/>
</el-select>
</el-form-item>
<el-form-item label="手机号码" prop='phone' :label-width="100">
<el-input v-model="formContent.phone" placeholder="请输入手机号码" autocomplete="off" />
@@ -21,15 +31,7 @@
<el-form-item label="邮箱地址" prop='email' :label-width="100">
<el-input v-model="formContent.email" placeholder="请输入邮箱地址" autocomplete="off" />
</el-form-item>
<el-form-item label="最后一次登录时间" prop='loginTime' :label-width="100">
<el-input v-model="formContent.loginTime" placeholder="请输入最后一次登录时间" autocomplete="off" />
</el-form-item>
<el-form-item label="登录错误次数" prop='loginErrorTimes' :label-width="100">
<el-input v-model="formContent.loginErrorTimes" placeholder="请输入登录错误次数" autocomplete="off" />
</el-form-item>
<el-form-item label="用户密码错误锁定时间" prop='lockTime' :label-width="100">
<el-input v-model="formContent.lockTime" placeholder="请输入用户密码错误锁定时间" autocomplete="off" />
</el-form-item>
</el-form>
</div>
<template #footer>
@@ -50,14 +52,18 @@
import { ElMessage, type FormInstance,type FormItemRule } from 'element-plus'
import {
addUser,
updateUser
updateUser,
} from '@/api/user/user'
// 使用 dayjs 库格式化
import dayjs from 'dayjs';
import { type User } from '@/api/user/interface';
import { useDictStore } from '@/stores/modules/dict'
import { type Role } from '@/api/role/interface';
const dictStore = useDictStore()
// 定义弹出组件元信息
const dialogFormRef = ref()
const IsPasswordShow = ref(false)
const roleList = ref<Role.RoleBO[]>([])
function useMetaInfo() {
const dialogVisible = ref(false)
const titleType = ref('add')
@@ -71,6 +77,7 @@
loginTime: '',//最后一次登录时间
loginErrorTimes: 0,//登录错误次数
lockTime: '', //用户密码错误锁定时间
state: 1, //
})
return { dialogVisible, titleType, formContent }
}
@@ -88,6 +95,7 @@
loginTime: '',//最后一次登录时间
loginErrorTimes: 0,//登录错误次数
lockTime: '', //用户密码错误锁定时间
state: 1, //
}
}
@@ -100,10 +108,13 @@
const formRuleRef = ref<FormInstance>()
//定义校验规则
const rules: Ref<Record<string, Array<FormItemRule>>> = ref({
name: [{ required: true, message: '名称必填!', trigger: 'blur' }],
loginName: [{ required: true, message: '登录名必填!', trigger: 'blur' }],
password: [{ required: true, message: '密码必填!', trigger: 'blur' }],
loginErrorTimes: [{ required: true, message: '登录错误次数必填!', trigger: 'blur' }],
name: [{ required: true, message: '名称必填!', trigger: 'blur' },
// 指定正则,此处是数字正则
{ pattern: /^[A-Za-z\u4e00-\u9fa5]{1,16}$/, message: '名称需1~16位的英文或汉字', trigger: 'blur' }],
loginName: [{ required: true, message: '登录必填!', trigger: 'blur' },
{ pattern: /^[a-zA-Z_.]{1}[a-zA-Z0-9_.]{2,15}$/, message: '登录名需2-15位的字母数字符号', trigger: 'blur' }],
password: [{ required: true, message: '密码必填!', trigger: 'blur' },
{ pattern: /^(?=.*[!@#$%^&*()_+\-=\[\]{};':"\\|,.<>\/?]).{8,16}$/, message: '密码长度为8-16需包含特殊字符', trigger: 'blur' }],
})
@@ -121,7 +132,6 @@
try {
dialogFormRef.value?.validate(async (valid: boolean) => {
if (valid) {
formContent.value.lockTime = dayjs(formContent.value.lockTime).format('YYYY-MM-DD');
if (formContent.value.id) {
const result = await updateUser(formContent.value);
if(result.code != 'A0000'){
@@ -148,12 +158,16 @@
}
// 打开弹窗,可能是新增,也可能是编辑
const open = (sign: string, data: User.ResUser) => {
const open = async (sign: string, data: User.ResUser,roleParams: Role.RoleBO[]) => {
// 获取角色列表
roleList.value = roleParams
titleType.value = sign
dialogVisible.value = true
if (data.id) {
IsPasswordShow.value = false
formContent.value = { ...data }
} else {
IsPasswordShow.value = true
resetFormContent()
}
}

View File

@@ -18,33 +18,45 @@
<template #operation='scope'>
<el-button type='primary' link :icon='EditPen' @click="openDialog('edit', scope.row)">编辑</el-button>
<el-button type='primary' link :icon='Delete' @click='handleDelete(scope.row)'>删除</el-button>
<el-button type='primary' link :icon='Delete' @click='EditPassWord(scope.row)'>修改密码</el-button>
</template>
</ProTable>
</div>
<UserPopup :refresh-table='proTable?.getTableList' ref='userPopup' />
<PassWordPopup :refresh-table='proTable?.getTableList' ref='passWordPopup' />
</template>
<script setup lang='tsx' name='useRole'>
import TimeControl from '@/components/TimeControl/index.vue'
import { type User } from '@/api/user/interface'
import { useHandleData } from '@/hooks/useHandleData'
import { useDownload } from '@/hooks/useDownload'
import { useAuthButtons } from '@/hooks/useAuthButtons'
import ProTable from '@/components/ProTable/index.vue'
import UserPopup from './components/userPopup.vue'
import PassWordPopup from './components/passWordPopup.vue'
import ImportExcel from '@/components/ImportExcel/index.vue'
import { type ProTableInstance, type ColumnProps } from '@/components/ProTable/interface'
import { CirclePlus, Delete, EditPen} from '@element-plus/icons-vue'
import { useDictStore } from '@/stores/modules/dict'
import {getUserList, deleteUser,} from '@/api/user/user'
import { reactive, ref } from 'vue'
import {getUserList, deleteUser,getRoleList} from '@/api/user/user'
import { onMounted, reactive, ref } from 'vue'
import { type Role } from '@/api/role/interface'
const roleList = ref<Role.RoleBO[]>([])
const dictStore = useDictStore()
const userPopup = ref()
const passWordPopup = ref()
// ProTable 实例
const proTable = ref<ProTableInstance>()
// 初始化时获取角色列表
onMounted(async () => {
const response = await getRoleList()
roleList.value = response.data as unknown as Role.RoleBO[]
})
// 如果你想在请求之前对当前请求参数做一些操作可以自定义如下函数params 为当前所有的请求参数(包括分页),最后返回请求列表接口
// 默认不做操作就直接在 ProTable 组件上绑定 :requestApi="getUserList"
const getTableList = (params: any) => {
@@ -54,8 +66,6 @@
return getUserList(newParams)
}
// 表格配置项
const columns = reactive<ColumnProps<User.ResUser>[]>([
{ type: 'selection', fixed: 'left', width: 70 },
@@ -69,22 +79,30 @@
{
prop: 'loginName',
label: '登录名',
minWidth: 180,
minWidth: 150,
},
{
prop: 'password',
label: '密码',
minWidth: 180,
prop: 'roleNames',
label: '角色',
minWidth: 250,
render: (scope) => {
const roleNames = scope.row.roleNames;
const roleArray = Array.isArray(roleNames) ? roleNames : [roleNames];
if (roleArray.length > 1) {
return roleArray.join(', ');
}
return roleArray[0] || ''; // 添加默认值
},
},
{
prop: 'phone',
label: '手机号',
minWidth: 180,
minWidth: 150,
},
{
prop: 'email',
label: '邮箱',
minWidth: 180,
minWidth: 150,
},
{
prop: 'loginTime',
@@ -105,19 +123,56 @@
},
},
{
prop: 'loginErrorTimes',
label: '登录错误次数',
minWidth: 180,
},
{
prop: 'lockTime',
label: '用户密码错误锁定时间',
minWidth: 180,
prop: 'state',
label: '状态',
minWidth: 100,
enum: dictStore.getDictData('state'),
fieldNames: { label: 'label', value: 'code' },
render: (scope: { row: { state: any } }) => {
const { tagType, tagText } = getTagTypeAndText(scope.row.state);
return (<el-tag type={tagType}>{tagText}</el-tag>);
}
},
{ prop: 'operation', label: '操作', fixed: 'right', width: 330 },
])
// 提取出生成 tag 的逻辑
const getTagTypeAndText = (state: number) => {
let tagType = 'danger'; // 默认标签类型为 'danger'
let tagText = '';
switch(state) {
case 1:
tagType = 'success'; // 正常
tagText = '正常';
break;
case 2:
tagType = 'warning'; // 锁定
tagText = '锁定';
break;
case 3:
tagType = 'info'; // 待审核
tagText = '待审核';
break;
case 4:
tagType = 'default'; // 休眠
tagText = '休眠';
break;
case 5:
tagType = 'warning'; // 密码过期
tagText = '密码过期';
break;
case 0:
default:
tagType = 'danger'; // 删除
tagText = '删除';
break;
}
return { tagType, tagText };
}
// 处理日期变化的回调函数
const startDate = ref('')
const endDate = ref('')
@@ -128,17 +183,17 @@ const handleDateChange = (startDateTemp: string, endDateTemp: string) => {
// 打开 drawer(新增、编辑)
const openDialog = (titleType: string, row: Partial<User.ResUser> = {}) => {
userPopup.value?.open(titleType, row)
userPopup.value?.open(titleType, row,roleList.value)
}
// 删除用户信息
const handleDelete = async (params: User.ResUser) => {
await useHandleData(deleteUser, { id: [params.id] }, `删除【${params.name}】用户`)
await useHandleData(deleteUser, [params.id] , `删除【${params.name}】用户`)
proTable.value?.getTableList()
}
// 批量删除角色信息
// 批量删除用户信息
const batchDelete = async (id: string[]) => {
await useHandleData(deleteUser, { id }, '删除所选用户信息')
proTable.value?.clearSelection()
@@ -146,7 +201,11 @@ const openDialog = (titleType: string, row: Partial<User.ResUser> = {}) => {
}
// 修改密码
const EditPassWord = async (row: User.ResPassWordUser) => {
passWordPopup.value?.open(row)
}
</script>

View File

@@ -114,8 +114,6 @@ defineExpose({ getTreeData })
.tree_container {
flex: 1;
overflow-y: auto;
width: 100%;
overflow-x: auto;
.el-tree {
height: 100%;

View File

@@ -1,6 +1,7 @@
<template>
<el-dialog :title="dialogTitle" v-model='dialogVisible' @close="close" v-bind="dialogBig">
<el-divider >设备台账信息</el-divider>
<el-tabs type="border-card">
<el-tab-pane label="设备台账信息">
<div class="form-grid">
<el-form :model='formContent' ref='dialogFormRef' :rules='rules' :disabled="false">
<el-row :gutter="24" >
@@ -21,6 +22,21 @@
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label='通讯协议' prop='protocol'>
<el-select v-model="formContent.protocol" clearable placeholder="请选择通讯协议">
<el-option
v-for="item in dictStore.getDictData('Event_Type')"
:key="item.id"
:label="item.name"
:value="item.code"
/>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label="设备通道数" prop="devChns">
<el-select v-model="formContent.devChns" clearable placeholder="请选择设备通道数">
@@ -33,8 +49,6 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label="额定电压(V)" prop="devVolt">
<el-select v-model="formContent.devVolt" clearable placeholder="请选择额定电压">
@@ -59,6 +73,9 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label='生产厂家' prop='manufacturer'>
<el-select v-model="formContent.manufacturer" clearable placeholder="请选择生产厂家">
@@ -71,8 +88,6 @@
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label="生产日期" prop="createDate">
<el-date-picker
@@ -88,6 +103,8 @@
<el-input v-model="formContent.createId" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label="固件版本" prop="hardwareVersion">
<el-input v-model="formContent.hardwareVersion" placeholder="请输入固件版本"/>
@@ -98,23 +115,15 @@
<el-input v-model="formContent.softwareVersion" placeholder="请输入软件版本"/>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label='设备模式' prop='pattern'>
<el-input v-model='formContent.pattern' disabled/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label='通讯协议' prop='protocol'>
<el-select v-model="formContent.protocol" clearable placeholder="请选择通讯协议">
<el-option
v-for="item in dictStore.getDictData('Event_Type')"
:key="item.id"
:label="item.name"
:value="item.code"
/>
</el-select>
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label="IP地址" prop="ip">
<!-- <el-input v-model='formContent.ip'/> -->
<IPAddress v-model:value="formContent.ip"/>
</el-form-item>
</el-col>
@@ -123,23 +132,29 @@
<el-input v-model="formContent.port" />
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label='是否加密' prop='encryption'>
<el-select v-model="formContent.encryption" clearable placeholder="请选择是否加密">
<el-select v-model="formContent.encryption" clearable placeholder="请选择是否加密" @change="handleEncryptionChange">
<el-option label="是" :value="1"></el-option>
<el-option label="否" :value="0"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" >
<el-col :span="8">
<el-form-item label='设备模式' prop='pattern'>
<el-input v-model='formContent.pattern' disabled/>
<el-col :span="8" v-if="IsPasswordShow">
<el-form-item label='识别码' prop='series' clearable placeholder="请输入识别码">
<el-input v-model='formContent.series' show-password/>
</el-form-item>
</el-col>
<el-col :span="8" v-if="IsPasswordShow">
<el-form-item label='密钥' prop='devKey' clearable placeholder="请输入密钥">
<el-input v-model='formContent.devKey' show-password/>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" v-if="true">
<el-row :gutter="24" v-if="DevIsShow">
<el-col :span="8">
<el-form-item label='样品编号' prop='sampleID' clearable placeholder="请输入样品编号">
<el-input v-model='formContent.sampleID' />
@@ -155,9 +170,49 @@
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="24" v-if="MonIsShow">
<el-col :span="8">
<el-form-item label='所属地市' prop='cityName' clearable placeholder="请输入所属地市">
<el-input v-model='formContent.cityName' />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label='所属供电公司' prop='gDName' clearable placeholder="请输入所属供电公司">
<el-input v-model='formContent.gDName' />
</el-form-item>
</el-col>
<el-col :span="8">
<el-form-item label='所属电站' prop='subName' clearable placeholder="请输入所属电站">
<el-input v-model='formContent.subName' />
</el-form-item>
</el-col>
</el-row>
</el-form>
</div>
</el-tab-pane>
<el-tab-pane label="监测点台账信息" v-if="MonIsShow">
<div class='table-box' ref='popupBaseView'>
<ProTable
ref='proTable'
:columns='columns'
:request-api='getPqMonList'
>
<!-- 表格 header 按钮 -->
<template #tableHeader='scope'>
<el-button type='primary' :icon='CirclePlus' >新增</el-button>
<el-button type='danger' :icon='Delete' plain :disabled='!scope.isSelected'>批量删除</el-button>
</template>
<!-- 表格操作 -->
<template #operation>
<el-button type='primary' link :icon='EditPen'>复制</el-button>
<el-button type='primary' link :icon='EditPen'>编辑</el-button>
<el-button type='primary' link :icon='Delete'>删除</el-button>
</template>
</ProTable>
</div>
</el-tab-pane>
</el-tabs>
<template #footer>
<div >
<el-button @click='close()'> </el-button>
@@ -175,11 +230,18 @@
import { type Device } from '@/api/device/interface'
import { ElMessage, type FormItemRule } from 'element-plus'
import { addPqDev, updatePqDev } from '@/api/device/device.ts'
import { computed, type Ref, ref } from 'vue';
import { computed, reactive, type Ref, ref } from 'vue';
import { useDictStore } from '@/stores/modules/dict'
import { CirclePlus, Delete } from '@element-plus/icons-vue'
import { CirclePlus, Delete ,EditPen} from '@element-plus/icons-vue'
// 使用 dayjs 库格式化
import dayjs from 'dayjs';
import {getPqMonList,deletePqMon,} from '@/api/monitor/monitor.ts'
import { type ColumnProps } from '@/components/ProTable/interface'
import { type Monitor } from '@/api/monitor/interface'
import { el } from 'element-plus/es/locale'
const MonIsShow = ref(false)
const DevIsShow = ref(false)
const IsPasswordShow = ref(false)
const dictStore = useDictStore()
// 定义弹出组件元信息
const dialogFormRef = ref()
@@ -317,11 +379,28 @@
const open = (sign: string, data: Device.ResPqDev) => {
titleType.value = sign
dialogVisible.value = true
if (data.id) {
if(data.encryption === 1){
handleEncryptionChange(1)
}else{
handleEncryptionChange(0)
}
if(data.pattern == '比对式')
{
MonIsShow.value = true
DevIsShow.value = false
}else{
MonIsShow.value = false
DevIsShow.value = true
}
if (data.id) {
formContent.value = { ...data }
} else {
resetFormContent()
handleEncryptionChange(1)
}
}
@@ -332,5 +411,55 @@
}>()
const handleEncryptionChange = (value: number) => {
// 根据是否加密来显示或隐藏识别码和密钥
if(value === 1){
IsPasswordShow.value = true
}else
{
IsPasswordShow.value = false
formContent.value.series = ''
formContent.value.devKey = ''
}
// 如果选择"是",则显示;否则隐藏
}
// 表格配置项
const columns = reactive<ColumnProps<Monitor.ResPqMon>[]>([
{ type: 'selection', fixed: 'left', width: 70 },
{ type: 'index', fixed: 'left', width: 70, label: '序号' },
{
prop: '',
label: '所属母线',
width: 200,
},
{
prop: '',
label: '被检通道',
width: 200,
},
{
prop: '',
label: 'PT变比',
width: 110,
},
{
prop: '',
label: 'CT变比',
width: 130,
},
{
prop: '',
label: '接线方式',
width: 130,
},
{
prop: '',
label: '谐波系统监测点ID',
minWidth: 250,
},
{ prop: 'operation', label: '操作', fixed: 'right', width: 200 },
])
</script>

View File

@@ -40,7 +40,7 @@ import DevicePopup from '@/views/machine/device/components/devicePopup.vue'
import { CirclePlus, Delete, EditPen, Download, Upload } from '@element-plus/icons-vue'
import { useDictStore } from '@/stores/modules/dict'
import {getPqDevList, deletePqDev, exportPqDev, downloadTemplate,importPqDev} from '@/api/device/device.ts'
import { reactive, ref } from 'vue'
import { onMounted, reactive, ref } from 'vue'
import { ElMessageBox } from 'element-plus'
const dictStore = useDictStore()
@@ -56,6 +56,7 @@ const getTableList = (params: any) => {
return getPqDevList(newParams)
}
// 表格配置项
const columns = reactive<ColumnProps<Device.ResPqDev>[]>([
{ type: 'selection', fixed: 'left', width: 70 },
@@ -77,22 +78,17 @@ const columns = reactive<ColumnProps<Device.ResPqDev>[]>([
prop: 'devChns',
label: '设备通道数',
minWidth: 110,
enum: dictStore.getDictData('Dev_Chns'),
fieldNames: { label: 'name', value: 'code' },
},
{
prop: 'devVolt',
label: '额定电压V',
minWidth: 130,
enum: dictStore.getDictData('Dev_Volt'),
fieldNames: { label: 'name', value: 'code' },
},
{
prop: 'devCurr',
label: '额定电流A',
minWidth: 130,
enum: dictStore.getDictData('Dev_Curr'),
fieldNames: { label: 'name', value: 'code' },
},
{
prop: 'manufacturer',
@@ -137,7 +133,7 @@ const handleDateChange = (startDateTemp: string, endDateTemp: string) => {
// 打开 drawer(新增、编辑)
const openDialog = (titleType: string, row: Partial<Device.ResPqDev> = {}) => {
devicePopup.value?.open(titleType, row)
console.log(columns)
}
// 批量删除设备

View File

@@ -52,7 +52,7 @@
<el-form-item label='数据统计类型' :label-width='140' prop='statMethod'>
<el-select v-model="selectedStatMethods" multiple placeholder="请选择数据统计类型">
<el-option
v-for="item in dictStore.getDictData('stat_Method')"
v-for="item in dictStore.getDictData('Stat_Method')"
:key="item.value"
:label="item.name"
:value="item.code"

View File

@@ -125,7 +125,7 @@
prop: 'statMethod',
label: '数据统计类型',
width: 250,
enum: dictStore.getDictData('stat_Method'),
enum: dictStore.getDictData('Stat_Method'),
fieldNames: { label: 'name', value: 'code' },
render: (scope) => {
// 假设 statMethod 是一个数组,包含多个 'code' 值
@@ -141,14 +141,14 @@
// 查找与每个 code 值匹配的 name然后拼接成逗号分割的字符串
//console.log('codeArray',codeArray)
const names = codeArray.map(code => {
const dictItem = dictStore.getDictData('Event_Type').find(item => item.code === code);
const dictItem = dictStore.getDictData('Stat_Method').find(item => item.code === code);
return dictItem ? dictItem.name : ''; // 如果找到匹配的项,返回对应的 name
});
//console.log('names',names)
return names.join(', '); // 用逗号连接所有的 name
}
// 查找单个 code 对应的 name
const dictItem = dictStore.getDictData('Event_Type').find(item => item.code === codeArray[0]);
const dictItem = dictStore.getDictData('Stat_Method').find(item => item.code === codeArray[0]);
return dictItem ? dictItem.name : ''; // 如果找到匹配的项,返回对应的 name
},
},