瀏覽代碼

加入指数模块

vera_min 3 年之前
父節點
當前提交
e246384a84

+ 1 - 1
.env.development

@@ -5,4 +5,4 @@ ENV = 'development'
 VITE_API_URL = 'http://101.200.198.249:8899/api/v1'
 VITE_IMG_URL = 'http://101.200.198.249:8899/'
 # VITE_API_URL = 'http://sgadserver.wdeveloperw.xyz/api/v1'
-# VITE_IMG_URL = 'http://sgadserver.wdeveloperw.xyz/'
+# VITE_IMG_URL = 'http://sgadserver.wdeveloperw.xyz/'

+ 107 - 0
src/utils/request2.ts

@@ -0,0 +1,107 @@
+import axios from 'axios';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { Session } from '/@/utils/storage';
+
+// 配置新建一个 axios 实例
+const service = axios.create({
+	baseURL: import.meta.env.VITE_INDEX_URL as any,
+	timeout: 50000,
+	headers: { 'Content-Type': 'application/json' },
+});
+
+// 添加请求拦截器
+service.interceptors.request.use(
+	(config) => {
+		// 在发送请求之前做些什么 token
+		if (Session.get('token')) {
+			// (<any>config.headers).common['secret-key'] = Session.get('token')
+			(<any>config.headers).common['secret-key'] = '17216f2f0k0c5jeh656csmo2003c14ig'
+		}
+		return config;
+	},
+	(error) => {
+		// 对请求错误做些什么
+		return Promise.reject(error);
+	}
+);
+
+// 添加响应拦截器
+service.interceptors.response.use(
+	(response) => {
+		// 对响应数据做点什么
+		const res = response.data;
+		const code = response.data.code
+		if (code === 401) {
+			ElMessageBox.alert('登录状态已过期,请重新登录', '提示', { confirmButtonText: '确定' })
+				.then(() => {
+					Session.clear(); // 清除浏览器全部临时缓存
+					window.location.href = '/'; // 去登录页
+				})
+				.catch(() => { });
+		} else if (code !== 0) {
+			ElMessage.error(res.message)
+			return Promise.reject(new Error(res.message))
+		} else {
+			// 分页的数据
+			if (res.data?.Total !== undefined) {
+				return {
+					list: res.data.Data,
+					total: res.data.Total,
+					page: res.data.currentPage,
+					...res.data,
+				}
+			}
+			if (res.data?.Data) {
+				return res.data.Data 
+			}
+			if (res.data?.Data === undefined) {
+				return res.data
+			}
+		}
+	},
+	(error) => {
+		// 对响应错误做点什么
+		if (error.message.indexOf('timeout') != -1) {
+			ElMessage.error('网络超时');
+		} else if (error.message == 'Network Error') {
+			ElMessage.error('网络连接错误');
+		} else {
+			if (error.response.data) ElMessage.error(error.response.statusText);
+			else ElMessage.error('接口路径找不到');
+		}
+		return Promise.reject(error);
+	}
+);
+
+// 导出 axios 实例
+export default service;
+
+export function get(url: string, params?: any): any {
+	return service({
+		url,
+		method: "get",
+		params
+	})
+}
+
+export function post(url: string, data?: any): any {
+	return service({
+		url,
+		method: "post",
+		data
+	})
+}
+export function put(url: string, data?: any): any {
+	return service({
+		url,
+		method: "put",
+		data
+	})
+}
+export function del(url: string, data?: any): any{
+	return service({
+		url,
+		method: "delete",
+		data
+	})
+}

+ 212 - 0
src/views/assess/3123g t h.vue

@@ -0,0 +1,212 @@
+<template>
+  <div class="system-dic-container">
+    <el-card shadow="hover">
+      <div class="system-user-search mb15">
+        <!-- <el-form :model="tableData.param" ref="queryRef" :inline="true" label-width="68px">
+          <el-form-item label="产品名称" prop="name">
+            <el-input v-model="tableData.param.name" placeholder="请输入产品名称" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
+          </el-form-item>
+          <el-form-item label="设备类型" prop="deviceType">
+            <el-input v-model="tableData.param.deviceType" placeholder="请输入设备类型" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
+          </el-form-item>
+          <el-form-item label="发布状态" prop="status" style="width: 200px;">
+            <el-select v-model="tableData.param.status" placeholder="发布状态" clearable size="default" style="width: 240px">
+              <el-option label="已发布" :value="1" />
+              <el-option label="未发布" :value="0" />
+            </el-select>
+          </el-form-item>
+          <el-form-item label="创建时间" prop="dateRange">
+            <el-date-picker v-model="tableData.param.dateRange" size="default" style="width: 240px" value-format="YYYY-MM-DD" type="daterange" range-separator="-" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
+          </el-form-item>
+          <el-form-item> -->
+            <el-button size="default" type="primary" class="ml10" @click="typeList">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新建
+            </el-button>
+            <!-- <el-button size="default" @click="resetQuery(queryRef)">
+              <el-icon>
+                <ele-Refresh />
+              </el-icon>
+              重置
+            </el-button>
+            <el-button size="default" type="success" class="ml10" @click="onOpenAddDic">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增产品
+            </el-button>
+            <el-button size="default" type="danger" class="ml10" @click="onRowDel(null)">
+              <el-icon>
+                <ele-Delete />
+              </el-icon>
+              删除
+            </el-button>
+          </el-form-item>
+        </el-form> -->
+      </div>
+      <el-table :data="tableData.data" style="width: 100%" @selection-change="handleSelectionChange">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="ID" align="center" prop="id" width="80" />
+        <el-table-column label="产品名称" prop="name" :show-overflow-tooltip="true" />
+        <el-table-column label="产品标识" prop="key" :show-overflow-tooltip="true" />
+        <el-table-column label="分类名称" prop="categoryName" :show-overflow-tooltip="true" />
+        <el-table-column label="部门名称" prop="deptName" :show-overflow-tooltip="true" />
+        <el-table-column label="消息协议" prop="messageProtocol" :show-overflow-tooltip="true" />
+        <el-table-column label="传输协议" prop="transportProtocol" :show-overflow-tooltip="true" />
+        <el-table-column label="设备类型" prop="deviceType" :show-overflow-tooltip="true" />
+        
+        <el-table-column prop="status" label="发布状态" width="120" align="center">
+          <template #default="scope">
+            <el-tag type="success" size="small" v-if="scope.row.status">已发布</el-tag>
+            <el-tag type="info" size="small" v-else>未发布</el-tag>
+          </template>
+        </el-table-column>
+        <!-- <el-table-column prop="createdAt" label="创建时间" align="center" width="180"></el-table-column> -->
+        <el-table-column label="操作" width="300" align="center">
+          <template #default="scope">
+		     <router-link :to="'/device/product/detail/' + scope.row.id" class="link-type" style="padding-right: 10px;color: #409eff;">
+              <span>详情</span>
+            </router-link>
+            <el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination v-show="tableData.total>0" :total="tableData.total" v-model:page="tableData.param.pageNum" v-model:limit="tableData.param.pageSize" @pagination="typeList" />
+    </el-card>
+    <EditDic ref="editDicRef" @typeList="typeList" />
+  </div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
+import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
+import EditDic from './component/editPro.vue';
+import api from '/@/api/device';
+
+// 定义接口来定义对象的类型
+interface TableDataRow {
+	id: number;
+	name: string;
+	deviceType: string;
+	status: number;
+	desc: string;
+	createBy: string;
+}
+interface TableDataState {
+	ids: number[];
+	tableData: {
+		data: Array<TableDataRow>;
+		total: number;
+		loading: boolean;
+		param: {
+			pageNum: number;
+			pageSize: number;
+			name: string;
+			deviceType: string;
+			status: string;
+			dateRange: string[];
+		};
+	};
+}
+
+export default defineComponent({
+	name: 'deviceproduct',
+	components: { EditDic },
+	setup() {
+		const addDicRef = ref();
+		const editDicRef = ref();
+		const queryRef = ref();
+		const state = reactive<TableDataState>({
+			ids: [],
+			tableData: {
+				data: [],
+				total: 0,
+				loading: false,
+				param: {
+					pageNum: 1,
+					pageSize: 10,
+					dictName: '',
+					dictType: '',
+					status: '',
+					dateRange: [],
+				},
+			},
+		});
+		// 初始化表格数据
+		const initTableData = () => {
+			typeList();
+		};
+		const typeList = () => {
+			api.product.getList(state.tableData.param).then((res: any) => {
+				console.log(res);
+				state.tableData.data = res.product;
+				state.tableData.total = res.total;
+			});
+		};
+		// 打开新增产品弹窗
+		const onOpenAddDic = () => {
+			editDicRef.value.openDialog();
+		};
+		// 打开修改产品弹窗
+		const onOpenEditDic = (row: TableDataRow) => {
+			editDicRef.value.openDialog(row);
+		};
+		// 删除产品
+		const onRowDel = (row: TableDataRow) => {
+			let msg = '你确定要删除所选数据?';
+			let ids: number[] = [];
+			if (row) {
+				msg = `此操作将永久删除产品:“${row.name}”,是否继续?`;
+				ids = [row.id];
+			} else {
+				ids = state.ids;
+			}
+			if (ids.length === 0) {
+				ElMessage.error('请选择要删除的数据。');
+				return;
+			}
+			ElMessageBox.confirm(msg, '提示', {
+				confirmButtonText: '确认',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(() => {
+					api.product.delete(ids).then(() => {
+						ElMessage.success('删除成功');
+						typeList();
+					});
+				})
+				.catch(() => {});
+		};
+		// 页面加载时
+		onMounted(() => {
+			initTableData();
+		});
+		/** 重置按钮操作 */
+		const resetQuery = (formEl: FormInstance | undefined) => {
+			if (!formEl) return;
+			formEl.resetFields();
+			typeList();
+		};
+		// 多选框选中数据
+		const handleSelectionChange = (selection: TableDataRow[]) => {
+			state.ids = selection.map((item) => item.id);
+		};
+		return {
+			addDicRef,
+			editDicRef,
+			queryRef,
+			onOpenAddDic,
+			onOpenEditDic,
+			onRowDel,
+			typeList,
+			resetQuery,
+			handleSelectionChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>

+ 248 - 0
src/views/assess/component/editAttr.vue

@@ -0,0 +1,248 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '属性定义'" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="120px">
+				<el-form-item label="属性定义标识" prop="key">
+					<el-input v-model="ruleForm.key" placeholder="请输入属性定义标识" />
+				</el-form-item>
+				<el-form-item label="属性定义名称" prop="name">
+					<el-input v-model="ruleForm.name" placeholder="请输入属性定义名称" />
+				</el-form-item>
+
+				<el-form-item label="数据类型" prop="type">
+					<el-select v-model="valueType.type" placeholder="请选择数据类型" @change="seletChange">
+						<el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
+							<el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" />
+						</el-option-group>
+					</el-select>
+				</el-form-item>
+
+        <!--根据数据类型输出不同表单-->
+
+             <el-form-item label="精度" prop="maxLength1" v-if="type=='float' || type=='double'">
+                <el-input v-model="valueType.maxLength1" placeholder="请输入精度" />
+              </el-form-item>
+
+            	<el-form-item label="单位" prop="maxLength" v-if="type=='int' || type=='long' || type=='float'  || type=='double'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入单位" />
+              </el-form-item>
+
+              <el-form-item label="最大长度" prop="maxLength" v-if="type=='string'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入最大长度" />
+              </el-form-item>
+
+               <el-form-item label="时间格式" prop="maxLength" v-if="type=='date'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入时间格式" />
+              </el-form-item>
+             
+
+        <!--根据数据类型输出不同表单-->
+
+
+
+
+
+
+
+
+				<el-form-item label="是否只读" prop="accessMode">
+					<el-radio-group v-model="ruleForm.accessMode" model-value="0">
+						<el-radio label="0">读写</el-radio>
+
+						<el-radio label="1">只读</el-radio>
+					</el-radio-group>
+				</el-form-item>
+				<el-form-item label="属性定义描述	" prop="desc">
+					<el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入属性定义描述"></el-input>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import api from '/@/api/device';
+import uploadVue from '/@/components/upload/index.vue';
+import { ElMessage, UploadProps } from 'element-plus';
+
+interface RuleFormState {
+	id: number;
+	name: string;
+	dictType: string;
+	status: number;
+	desc: string;
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+	typeData: RuleFormState[];
+	rules: {};
+}
+
+export default defineComponent({
+	name: 'deviceEditPro',
+	components: { uploadVue },
+	setup(prop, { emit }) {
+		const formRef = ref<HTMLElement | null>(null);
+
+		const state = reactive<DicState>({
+			isShowDialog: false,
+			typeData: [], //
+      type: '',
+       valueType: {
+          type:'',
+          maxLength:'',
+
+        },
+
+			ruleForm: {
+				name: '',
+				key: '',
+				transportProtocol: '',
+				accessMode: '0',
+				status: 1,
+        valueType: {
+          type:'',
+          maxLength:'',
+
+        },
+				
+				desc: '',
+			},
+			rules: {
+				name: [{ required: true, message: '属性定义名称不能为空', trigger: 'blur' }],
+				key: [{ required: true, message: '属性定义标识不能为空', trigger: 'blur' }],
+				accessMode: [{ required: true, message: '请选择是否只读', trigger: 'blur' }],
+		
+			},
+		});
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState | null) => {
+			resetForm();
+
+			api.product.getDataType({ status: -1 }).then((res: any) => {
+				const datat = Object.values(res.dataType);
+				datat.forEach((item, index) => {
+					if (index == 0) {
+						datat[index]['label'] = '基础类型';
+						datat[index]['options'] = item;
+					} else {
+						datat[index]['label'] = '扩展类型';
+						datat[index]['options'] = item;
+					}
+				});
+				console.log(datat);
+				state.typeData = datat || [];
+			});
+
+			if (row) {
+				// api.dict.getType(row.dictId).then((res:any)=>{
+				//   state.ruleForm = res.data.dictType
+				// }
+				console.log(row);
+				state.ruleForm = row;
+			}
+			state.isShowDialog = true;
+		};
+		const resetForm = () => {
+			state.ruleForm = {
+				id: 0,
+				name: '',
+				dictType: '',
+				status: 1,
+				desc: '',
+			};
+		};
+
+    const seletChange=(val)=>{
+      state.type=val;
+      console.log(val);
+    };
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+			const formWrap = unref(formRef) as any;
+			if (!formWrap) return;
+			formWrap.validate((valid: boolean) => {
+				if (valid) {
+					if (state.ruleForm.id !== 0) {
+						//修改
+						api.product.edit(state.ruleForm).then(() => {
+							ElMessage.success('属性定义类型修改成功');
+							closeDialog(); // 关闭弹窗
+							emit('typeList');
+						});
+					} else {
+						//添加
+         
+            console.log(state.valueType);
+            state.ruleForm.valueType=state.valueType;
+           console.log(state.ruleForm);
+						api.model.propertyadd(state.ruleForm).then(() => {
+							ElMessage.success('属性定义类型添加成功');
+							closeDialog(); // 关闭弹窗
+							emit('typeList');
+						});
+					}
+				}
+			});
+		};
+
+		return {
+			openDialog,
+      seletChange,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			formRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style scoped>
+.avatar-uploader .avatar {
+	width: 178px;
+	height: 178px;
+	display: block;
+}
+</style>
+
+<style>
+.avatar-uploader .el-upload {
+	border: 1px dashed var(--el-border-color);
+	border-radius: 6px;
+	cursor: pointer;
+	position: relative;
+	overflow: hidden;
+	transition: var(--el-transition-duration-fast);
+}
+
+.avatar-uploader .el-upload:hover {
+	border-color: var(--el-color-primary);
+}
+
+.el-icon.avatar-uploader-icon {
+	font-size: 28px;
+	color: #8c939d;
+	width: 178px;
+	height: 178px;
+	text-align: center;
+}
+</style>

+ 251 - 0
src/views/assess/component/editEvent.vue

@@ -0,0 +1,251 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '事件定义'" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="120px">
+				<el-form-item label="事件定义标识" prop="key">
+					<el-input v-model="ruleForm.key" placeholder="请输入事件定义标识" />
+				</el-form-item>
+				<el-form-item label="事件定义名称" prop="name">
+					<el-input v-model="ruleForm.name" placeholder="请输入事件定义名称" />
+				</el-form-item>
+
+        
+				<el-form-item label="事件级别" prop="level">
+					<el-radio-group v-model="ruleForm.level" model-value="0">
+						<el-radio label="0">普通</el-radio>
+
+						<el-radio label="1">警告</el-radio>
+						<el-radio label="2">紧急</el-radio>
+					</el-radio-group>
+				</el-form-item>
+
+				<el-form-item label="输出参数" prop="type">
+					<el-select v-model="valueType.type" placeholder="请选择输出参数" @change="seletChange">
+						<el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
+							<el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" />
+						</el-option-group>
+					</el-select>
+				</el-form-item>
+
+        <!--根据数据类型输出不同表单-->
+
+             <el-form-item label="精度" prop="maxLength1" v-if="type=='float' || type=='double'">
+                <el-input v-model="valueType.maxLength1" placeholder="请输入精度" />
+              </el-form-item>
+
+            	<el-form-item label="单位" prop="maxLength" v-if="type=='int' || type=='long' || type=='float'  || type=='double'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入单位" />
+              </el-form-item>
+
+              <el-form-item label="最大长度" prop="maxLength" v-if="type=='string'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入最大长度" />
+              </el-form-item>
+
+               <el-form-item label="时间格式" prop="maxLength" v-if="type=='date'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入时间格式" />
+              </el-form-item>
+             
+
+        <!--根据数据类型输出不同表单-->
+
+
+
+
+
+
+
+
+				<el-form-item label="事件定义描述	" prop="desc">
+					<el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入事件定义描述"></el-input>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import api from '/@/api/device';
+import uploadVue from '/@/components/upload/index.vue';
+import { ElMessage, UploadProps } from 'element-plus';
+
+interface RuleFormState {
+	id: number;
+	name: string;
+	dictType: string;
+	status: number;
+	desc: string;
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+	typeData: RuleFormState[];
+	rules: {};
+}
+
+export default defineComponent({
+	name: 'deviceEditPro',
+	components: { uploadVue },
+	setup(prop, { emit }) {
+		const formRef = ref<HTMLElement | null>(null);
+
+		const state = reactive<DicState>({
+			isShowDialog: false,
+			typeData: [], //
+      type: '',
+       valueType: {
+          type:'',
+          maxLength:'',
+
+        },
+
+			ruleForm: {
+				name: '',
+				key: '',
+				transportProtocol: '',
+				accessMode: '0',
+				status: 1,
+        valueType: {
+          type:'',
+          maxLength:'',
+
+        },
+				
+				desc: '',
+			},
+			rules: {
+				name: [{ required: true, message: '事件定义名称不能为空', trigger: 'blur' }],
+				key: [{ required: true, message: '事件定义标识不能为空', trigger: 'blur' }],
+				accessMode: [{ required: true, message: '请选择是否只读', trigger: 'blur' }],
+		
+			},
+		});
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState | null) => {
+			resetForm();
+
+			api.product.getDataType({ status: -1 }).then((res: any) => {
+				const datat = Object.values(res.dataType);
+				datat.forEach((item, index) => {
+					if (index == 0) {
+						datat[index]['label'] = '基础类型';
+						datat[index]['options'] = item;
+					} else {
+						datat[index]['label'] = '扩展类型';
+						datat[index]['options'] = item;
+					}
+				});
+				console.log(datat);
+				state.typeData = datat || [];
+			});
+
+			if (row) {
+				// api.dict.getType(row.dictId).then((res:any)=>{
+				//   state.ruleForm = res.data.dictType
+				// }
+				console.log(row);
+				state.ruleForm = row;
+			}
+			state.isShowDialog = true;
+		};
+		const resetForm = () => {
+			state.ruleForm = {
+				id: 0,
+				name: '',
+				dictType: '',
+				status: 1,
+				desc: '',
+			};
+		};
+
+    const seletChange=(val)=>{
+      state.type=val;
+      console.log(val);
+    };
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+			const formWrap = unref(formRef) as any;
+			if (!formWrap) return;
+			formWrap.validate((valid: boolean) => {
+				if (valid) {
+					if (state.ruleForm.id !== 0) {
+						//修改
+						api.product.edit(state.ruleForm).then(() => {
+							ElMessage.success('事件定义类型修改成功');
+							closeDialog(); // 关闭弹窗
+							emit('typeList');
+						});
+					} else {
+						//添加
+         
+            console.log(state.valueType);
+            state.ruleForm.valueType=state.valueType;
+           console.log(state.ruleForm);
+						api.model.eventadd(state.ruleForm).then(() => {
+							ElMessage.success('事件定义类型添加成功');
+							closeDialog(); // 关闭弹窗
+							emit('typeList');
+						});
+					}
+				}
+			});
+		};
+
+		return {
+			openDialog,
+      seletChange,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			formRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style scoped>
+.avatar-uploader .avatar {
+	width: 178px;
+	height: 178px;
+	display: block;
+}
+</style>
+
+<style>
+.avatar-uploader .el-upload {
+	border: 1px dashed var(--el-border-color);
+	border-radius: 6px;
+	cursor: pointer;
+	position: relative;
+	overflow: hidden;
+	transition: var(--el-transition-duration-fast);
+}
+
+.avatar-uploader .el-upload:hover {
+	border-color: var(--el-color-primary);
+}
+
+.el-icon.avatar-uploader-icon {
+	font-size: 28px;
+	color: #8c939d;
+	width: 178px;
+	height: 178px;
+	text-align: center;
+}
+</style>

+ 232 - 0
src/views/assess/component/editFun.vue

@@ -0,0 +1,232 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog :title="(ruleForm.id!==0?'修改':'添加')+'功能定义'" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="120px">
+        <el-form-item label="功能定义标识" prop="key">
+          <el-input v-model="ruleForm.key" placeholder="请输入功能定义标识" />
+        </el-form-item>
+        <el-form-item label="功能定义名称" prop="name">
+          <el-input v-model="ruleForm.name" placeholder="请输入功能定义名称" />
+        </el-form-item>
+    
+    
+
+
+           
+         <el-form-item label="数据类型" prop="valueType">
+
+             <!--    <el-select v-model="ruleForm.valueType" placeholder="请选择数据类型">
+              <el-option
+                v-for="item in typeData"
+                :key="item.key"
+                :label="item.name"
+                :value="item.key"
+              />
+            </el-select> -->
+
+             <el-select v-model="ruleForm.valueType" placeholder="请选择数据类型">
+              <el-option-group
+                v-for="group in typeData"
+                :key="group"
+                :label="group"
+              >
+                <el-option
+                  v-for="item in group.options"
+                  :key="item.value"
+                  :label="item.label"
+                  :value="item.value"
+                />
+              </el-option-group>
+            </el-select>
+            </el-form-item> 
+
+          
+
+      
+        <el-form-item label="是否只读" prop="accessMode">
+          <el-radio-group v-model="ruleForm.accessMode" model-value="0">
+            <el-radio label="0">读写</el-radio>
+
+            <el-radio label="1">只读</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="功能定义描述	" prop="desc">
+          <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入功能定义描述"></el-input>
+        </el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">{{ruleForm.id!==0?'修 改':'添 加'}}</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent,ref, unref } from 'vue';
+import api from '/@/api/device';
+import uploadVue from '/@/components/upload/index.vue';
+import {ElMessage,UploadProps} from "element-plus";
+
+interface RuleFormState {
+  id:number;
+  name:string;
+  dictType:string;
+  status:number;
+  desc:string;
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+  typeData: RuleFormState[];
+  rules:{}
+}
+
+export default defineComponent({
+	name: 'deviceEditPro',
+  components: { uploadVue },
+	setup(prop,{emit}) {
+    const formRef = ref<HTMLElement | null>(null);
+    const baseURL:string|undefined|boolean = import.meta.env.VITE_API_URL
+
+		const state = reactive<DicState>({
+			isShowDialog: false,
+    	typeData: [], // 
+    	
+
+			ruleForm: {
+        id:0,
+        name:'',
+        key:'',
+        transportProtocol:'',
+        accessMode:'0',
+        status:1,
+        desc:''
+			},
+      rules: {
+        name: [
+          { required: true, message: "功能定义名称不能为空", trigger: "blur" }
+        ],
+         key: [
+          { required: true, message: "功能定义标识不能为空", trigger: "blur" }
+        ],
+        accessMode: [{ required: true, message: '功能定义分类不能为空', trigger: 'blur' }],
+        deptId: [{ required: true, message: '所属部门不能为空', trigger: 'blur' }],
+        deviceType: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
+      }
+		});
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState|null) => {
+      resetForm();
+   
+        api.product.getDataType({ status: -1 }).then((res: any) => {
+        
+       
+            // const  datat=Object.values(res.dataType);
+            // datat.forEach((item, index) => {
+
+            // });
+          
+                state.typeData = res.dataType || [];
+           
+         
+        });
+       
+      if (row){
+        // api.dict.getType(row.dictId).then((res:any)=>{
+        //   state.ruleForm = res.data.dictType
+        // }
+        console.log(row);
+        state.ruleForm = row;
+      }
+			state.isShowDialog = true;
+		};
+    const resetForm = ()=>{
+      state.ruleForm = {
+        id:0, 
+        name:'',
+        dictType:'',
+        status:1,
+        desc:''
+      }
+    };
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+      const formWrap = unref(formRef) as any;
+      if (!formWrap) return;
+      formWrap.validate((valid: boolean) => {
+        if (valid) {
+          if(state.ruleForm.id!==0){
+            //修改
+            api.product.edit(state.ruleForm).then(()=>{
+              ElMessage.success('功能定义类型修改成功');
+              closeDialog(); // 关闭弹窗
+              emit('typeList')
+            })
+          }else{
+            //添加
+            console.log(state.ruleForm);
+            api.product.add(state.ruleForm).then(()=>{
+              ElMessage.success('功能定义类型添加成功');
+              closeDialog(); // 关闭弹窗
+              emit('typeList')
+            })
+          }
+        }
+      });
+		};
+
+
+		return {
+			openDialog,
+			closeDialog,
+			onCancel,
+			onSubmit,
+      formRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style scoped>
+.avatar-uploader .avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed var(--el-border-color);
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  transition: var(--el-transition-duration-fast);
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: var(--el-color-primary);
+}
+
+.el-icon.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  text-align: center;
+}
+</style>

+ 272 - 0
src/views/assess/component/editPro.vue

@@ -0,0 +1,272 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog :title="(ruleForm.id!==0?'修改':'添加')+'产品'" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="90px">
+        <el-form-item label="产品标识" prop="key">
+          <el-input v-model="ruleForm.key" placeholder="请输入产品标识" />
+        </el-form-item>
+        <el-form-item label="产品名称" prop="name">
+          <el-input v-model="ruleForm.name" placeholder="请输入产品名称" />
+        </el-form-item>
+        <el-form-item label="产品图片" prop="imageUrl">
+     
+                     <uploadVue @set-img="handleAvatarSuccess" ></uploadVue>
+
+        </el-form-item>
+       
+        <el-form-item label="产品分类" prop="categoryId">
+              <el-cascader :options="cateData" :props="{ checkStrictly: true,emitPath: false, value: 'id', label: 'name' }" placeholder="请选择分类" clearable class="w100" v-model="ruleForm.categoryId">
+                <template #default="{ node, data }">
+                  <span>{{ data.name }}</span>
+                  <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                </template>
+              </el-cascader>
+            </el-form-item>
+
+        <el-form-item label="所属部门" prop="deptId">
+              <el-cascader :options="deptData" :props="{ checkStrictly: true,emitPath: false, value: 'deptId', label: 'deptName' }" placeholder="请选择所属部门" clearable class="w100" v-model="ruleForm.deptId">
+                <template #default="{ node, data }">
+                  <span>{{ data.deptName }}</span>
+                  <span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+                </template>
+              </el-cascader>
+            </el-form-item> 
+
+           
+          <el-form-item label="消息协议" prop="messageProtocol">
+      
+
+               <el-select v-model="ruleForm.messageProtocol" placeholder="请选择消息协议">
+              <el-option
+                v-for="item in messageData"
+                :key="item.key"
+                :label="item.name"
+                :value="item.key"
+              />
+            </el-select>
+            </el-form-item> 
+
+            <el-form-item label="传输协议" prop="transportProtocol">
+           
+
+                 <el-select v-model="ruleForm.transportProtocol" placeholder="请选择传输协议">
+              <el-option
+                v-for="item in tranData"
+                :key="item.key"
+                :label="item.name"
+                :value="item.key"
+              />
+            </el-select>
+            </el-form-item>
+
+      
+        <el-form-item label="设备类型" prop="deviceType">
+          <el-radio-group v-model="ruleForm.deviceType" model-value="设备">
+            <el-radio label="设备">设备</el-radio>
+
+            <el-radio label="网关">网关</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="产品描述	" prop="desc">
+          <el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入产品描述"></el-input>
+        </el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">{{ruleForm.id!==0?'修 改':'添 加'}}</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent,ref, unref } from 'vue';
+import api from '/@/api/device';
+import uploadVue from '/@/components/upload/index.vue';
+import {ElMessage,UploadProps} from "element-plus";
+
+interface RuleFormState {
+  id:number;
+  name:string;
+  dictType:string;
+  status:number;
+  desc:string;
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+  cateData: RuleFormState[];
+  deptData: RuleFormState[];
+  messageData:RuleFormState[];
+  tranData:RuleFormState[];
+  rules:{}
+}
+
+export default defineComponent({
+	name: 'deviceEditPro',
+  components: { uploadVue },
+	setup(prop,{emit}) {
+    const formRef = ref<HTMLElement | null>(null);
+    const baseURL:string|undefined|boolean = import.meta.env.VITE_API_URL
+
+		const state = reactive<DicState>({
+			isShowDialog: false,
+    	cateData: [], // 分类数据
+    	deptData: [], // 
+    	messageData: [], // 
+    	tranData: [], // 
+    	imageUrl: "", // 
+      singleImg:baseURL+"/product/icon/upload",
+
+			ruleForm: {
+        id:0,
+        name:'',
+        categoryId:'',
+        deptId:'',
+        messageProtocol:'',
+        transportProtocol:'',
+        deviceType:'设备',
+        status:1,
+        desc:''
+			},
+      rules: {
+        name: [
+          { required: true, message: "产品名称不能为空", trigger: "blur" }
+        ],
+         key: [
+          { required: true, message: "产品标识不能为空", trigger: "blur" }
+        ],
+        parentId: [{ required: true, message: '产品分类不能为空', trigger: 'blur' }],
+        deptId: [{ required: true, message: '所属部门不能为空', trigger: 'blur' }],
+        messageProtocol: [{ required: true, message: '消息协议不能为空', trigger: 'blur' }],
+        transportProtocol: [{ required: true, message: '传输协议不能为空', trigger: 'blur' }],
+        deviceType: [{ required: true, message: '设备类型不能为空', trigger: 'blur' }],
+      }
+		});
+
+
+
+
+    const handleAvatarSuccess: UploadProps['onSuccess'] = (
+      response    ) => {
+
+	console.log( response);
+
+         state.imageUrl = response
+        state.ruleForm.imageUrl=response
+    }
+
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState|null) => {
+      resetForm();
+        api.category.getList({ status: 1 }).then((res: any) => {
+          state.cateData = res.category || [];
+        });
+        api.dept.getList({ status: -1 }).then((res: any) => {
+          state.deptData = res || [];
+        });
+        api.product.message_protocol_list({ status: -1 }).then((res: any) => {
+          state.messageData = res.data || [];
+        });
+        api.product.trunsport_protocol_list({ status: -1 }).then((res: any) => {
+          state.tranData = res.data || [];
+        });
+      if (row){
+        // api.dict.getType(row.dictId).then((res:any)=>{
+        //   state.ruleForm = res.data.dictType
+        // }
+
+        state.ruleForm = row;
+      }
+			state.isShowDialog = true;
+		};
+    const resetForm = ()=>{
+      state.ruleForm = {
+        id:0, 
+        name:'',
+        dictType:'',
+        status:1,
+        desc:''
+      }
+    };
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+      const formWrap = unref(formRef) as any;
+      if (!formWrap) return;
+      formWrap.validate((valid: boolean) => {
+        if (valid) {
+          if(state.ruleForm.id!==0){
+            //修改
+            api.product.edit(state.ruleForm).then(()=>{
+              ElMessage.success('产品类型修改成功');
+              closeDialog(); // 关闭弹窗
+              emit('typeList')
+            })
+          }else{
+            //添加
+            console.log(state.ruleForm);
+            api.product.add(state.ruleForm).then(()=>{
+              ElMessage.success('产品类型添加成功');
+              closeDialog(); // 关闭弹窗
+              emit('typeList')
+            })
+          }
+        }
+      });
+		};
+
+
+		return {
+			openDialog,
+      handleAvatarSuccess,
+			closeDialog,
+			onCancel,
+			onSubmit,
+      formRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style scoped>
+.avatar-uploader .avatar {
+  width: 178px;
+  height: 178px;
+  display: block;
+}
+</style>
+
+<style>
+.avatar-uploader .el-upload {
+  border: 1px dashed var(--el-border-color);
+  border-radius: 6px;
+  cursor: pointer;
+  position: relative;
+  overflow: hidden;
+  transition: var(--el-transition-duration-fast);
+}
+
+.avatar-uploader .el-upload:hover {
+  border-color: var(--el-color-primary);
+}
+
+.el-icon.avatar-uploader-icon {
+  font-size: 28px;
+  color: #8c939d;
+  width: 178px;
+  height: 178px;
+  text-align: center;
+}
+</style>

+ 248 - 0
src/views/assess/component/editTab.vue

@@ -0,0 +1,248 @@
+<template>
+	<div class="system-edit-dic-container">
+		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '标签定义'" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="120px">
+				<el-form-item label="标签定义标识" prop="key">
+					<el-input v-model="ruleForm.key" placeholder="请输入标签定义标识" />
+				</el-form-item>
+				<el-form-item label="标签定义名称" prop="name">
+					<el-input v-model="ruleForm.name" placeholder="请输入标签定义名称" />
+				</el-form-item>
+
+				<el-form-item label="数据类型" prop="type">
+					<el-select v-model="valueType.type" placeholder="请选择数据类型" @change="seletChange">
+						<el-option-group v-for="group in typeData" :key="group.label" :label="group.label">
+							<el-option v-for="item in group.options" :key="item.type" :label="item.title" :value="item.type" />
+						</el-option-group>
+					</el-select>
+				</el-form-item>
+
+        <!--根据数据类型输出不同表单-->
+
+             <el-form-item label="精度" prop="maxLength1" v-if="type=='float' || type=='double'">
+                <el-input v-model="valueType.maxLength1" placeholder="请输入精度" />
+              </el-form-item>
+
+            	<el-form-item label="单位" prop="maxLength" v-if="type=='int' || type=='long' || type=='float'  || type=='double'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入单位" />
+              </el-form-item>
+
+              <el-form-item label="最大长度" prop="maxLength" v-if="type=='string'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入最大长度" />
+              </el-form-item>
+
+               <el-form-item label="时间格式" prop="maxLength" v-if="type=='date'">
+                <el-input v-model="valueType.maxLength" placeholder="请输入时间格式" />
+              </el-form-item>
+             
+
+        <!--根据数据类型输出不同表单-->
+
+
+
+
+
+
+
+
+				<el-form-item label="是否只读" prop="accessMode">
+					<el-radio-group v-model="ruleForm.accessMode" model-value="0">
+						<el-radio label="0">读写</el-radio>
+
+						<el-radio label="1">只读</el-radio>
+					</el-radio-group>
+				</el-form-item>
+				<el-form-item label="标签定义描述	" prop="desc">
+					<el-input v-model="ruleForm.desc" type="textarea" placeholder="请输入标签定义描述"></el-input>
+				</el-form-item>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">{{ ruleForm.id !== 0 ? '修 改' : '添 加' }}</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import api from '/@/api/device';
+import uploadVue from '/@/components/upload/index.vue';
+import { ElMessage, UploadProps } from 'element-plus';
+
+interface RuleFormState {
+	id: number;
+	name: string;
+	dictType: string;
+	status: number;
+	desc: string;
+}
+interface DicState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormState;
+	typeData: RuleFormState[];
+	rules: {};
+}
+
+export default defineComponent({
+	name: 'deviceEditPro',
+	components: { uploadVue },
+	setup(prop, { emit }) {
+		const formRef = ref<HTMLElement | null>(null);
+
+		const state = reactive<DicState>({
+			isShowDialog: false,
+			typeData: [], //
+      type: '',
+       valueType: {
+          type:'',
+          maxLength:'',
+
+        },
+
+			ruleForm: {
+				name: '',
+				key: '',
+				transportProtocol: '',
+				accessMode: '0',
+				status: 1,
+        valueType: {
+          type:'',
+          maxLength:'',
+
+        },
+				
+				desc: '',
+			},
+			rules: {
+				name: [{ required: true, message: '标签定义名称不能为空', trigger: 'blur' }],
+				key: [{ required: true, message: '标签定义标识不能为空', trigger: 'blur' }],
+				accessMode: [{ required: true, message: '请选择是否只读', trigger: 'blur' }],
+		
+			},
+		});
+
+		// 打开弹窗
+		const openDialog = (row: RuleFormState | null) => {
+			resetForm();
+
+			api.product.getDataType({ status: -1 }).then((res: any) => {
+				const datat = Object.values(res.dataType);
+				datat.forEach((item, index) => {
+					if (index == 0) {
+						datat[index]['label'] = '基础类型';
+						datat[index]['options'] = item;
+					} else {
+						datat[index]['label'] = '扩展类型';
+						datat[index]['options'] = item;
+					}
+				});
+				console.log(datat);
+				state.typeData = datat || [];
+			});
+
+			if (row) {
+				// api.dict.getType(row.dictId).then((res:any)=>{
+				//   state.ruleForm = res.data.dictType
+				// }
+				console.log(row);
+				state.ruleForm = row;
+			}
+			state.isShowDialog = true;
+		};
+		const resetForm = () => {
+			state.ruleForm = {
+				id: 0,
+				name: '',
+				dictType: '',
+				status: 1,
+				desc: '',
+			};
+		};
+
+    const seletChange=(val)=>{
+      state.type=val;
+      console.log(val);
+    };
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+			const formWrap = unref(formRef) as any;
+			if (!formWrap) return;
+			formWrap.validate((valid: boolean) => {
+				if (valid) {
+					if (state.ruleForm.id !== 0) {
+						//修改
+						api.product.edit(state.ruleForm).then(() => {
+							ElMessage.success('标签定义类型修改成功');
+							closeDialog(); // 关闭弹窗
+							emit('typeList');
+						});
+					} else {
+						//添加
+         
+            console.log(state.valueType);
+            state.ruleForm.valueType=state.valueType;
+           console.log(state.ruleForm);
+						api.model.tagadd(state.ruleForm).then(() => {
+							ElMessage.success('标签定义类型添加成功');
+							closeDialog(); // 关闭弹窗
+							emit('typeList');
+						});
+					}
+				}
+			});
+		};
+
+		return {
+			openDialog,
+      seletChange,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			formRef,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style scoped>
+.avatar-uploader .avatar {
+	width: 178px;
+	height: 178px;
+	display: block;
+}
+</style>
+
+<style>
+.avatar-uploader .el-upload {
+	border: 1px dashed var(--el-border-color);
+	border-radius: 6px;
+	cursor: pointer;
+	position: relative;
+	overflow: hidden;
+	transition: var(--el-transition-duration-fast);
+}
+
+.avatar-uploader .el-upload:hover {
+	border-color: var(--el-color-primary);
+}
+
+.el-icon.avatar-uploader-icon {
+	font-size: 28px;
+	color: #8c939d;
+	width: 178px;
+	height: 178px;
+	text-align: center;
+}
+</style>

+ 276 - 0
src/views/assess/totalIndex/component/addItem.vue

@@ -0,0 +1,276 @@
+<template>
+	<div class="system-add-user-container">
+		<el-dialog title="新增指标" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" size="default" label-width="90px">
+				<!-- <el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20"> -->
+						<el-form-item label="评价名称" required>
+							<el-input size="small" v-model="ruleForm.userName" placeholder="请输入评价名称" clearable></el-input>
+						</el-form-item>
+					<!-- </el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20"> -->
+						<el-form-item label="描述" required>
+							<el-input width="400"  size="small" v-model="ruleForm.describe" type="textarea" placeholder="请输入描述" maxlength="150"></el-input>
+						</el-form-item>
+					<!-- </el-col> -->
+				<!-- </el-row> -->
+			</el-form>
+			<el-button size="default" type="primary" class="mb10 mt10" @click="onOpenAddSign">
+				<el-icon>
+					<ele-FolderAdd />
+				</el-icon>
+				新建
+			</el-button>
+			<el-table border stripe :data="tableData.data" style="width: 100%">
+				<el-table-column type="index" label="序号" width="66" />
+				<el-table-column prop="userName" label="标识" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="dataType" label="数据项" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="num" label="权重(%)" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="description" label="取值范围" show-overflow-tooltip width="200" >
+					<template #default="scope">
+						<el-tag size="small" class="mr6" v-for="(item, index) in scope.row.range.split(', ')" :key="index">{{item}}</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column label="操作" width="153">
+					<template #default="scope">
+						<el-button size="small" type="text" @click="onOpenEditSign(scope.row)">编辑</el-button>
+						<el-button size="small" type="text" @click="onRowDel(scope.row)">删除</el-button>
+						<el-button size="small" type="text" @click="onRowDetail(scope.row)">任务接口</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination
+				@size-change="onHandleSizeChange"
+				@current-change="onHandleCurrentChange"
+				class="mt15"
+				:pager-count="5"
+				:page-sizes="[10, 20, 30]"
+				v-model:current-page="tableData.param.pageNum"
+				background
+				v-model:page-size="tableData.param.pageSize"
+				layout="total, sizes, prev, pager, next, jumper"
+				:total="tableData.total"
+			>
+			</el-pagination>
+
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">新 增</el-button>
+				</span>
+			</template>
+		</el-dialog>
+		<AddSign ref="addSignRef" />
+		<SetTask ref="setTaskRef" />
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, ref, defineComponent } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
+import AddSign from './addSign.vue';
+import SetTask from './setTask.vue';
+
+
+
+// 定义接口来定义对象的类型
+interface DeptData {
+	deptName: string;
+	createTime: string;
+	status: boolean;
+	sort: number | string;
+	describe: string;
+	id: number;
+	children?: DeptData[];
+}
+// 定义接口来定义对象的类型
+interface TableDataRow {
+	userName: string;
+	description: string;
+	dataType: string;
+	createTime: string;
+	num: string;
+	range: string;
+}
+// 定义整个dialog的数据类型
+interface ItemState {
+	isShowDialog: boolean;
+	ruleForm: {
+		userName: string;
+		userNickname: string;
+		roleSign: string;
+		department: any;
+		phone: string;
+		email: string;
+		sex: string;
+		password: string;
+		overdueTime: string;
+		status: boolean;
+		describe: string;
+	};
+	tableData: {
+		data: Array<TableDataRow>;
+		total: number;
+		loading: boolean;
+		param: {
+			pageNum: number;
+			pageSize: number;
+		};
+	};
+}
+
+
+
+
+export default defineComponent({
+	name: 'systemAddUser',
+	components: { AddSign, SetTask},
+	setup() {
+		const addSignRef = ref();
+		const setTaskRef = ref();
+		const state = reactive<ItemState>({
+			isShowDialog: false,
+			ruleForm: {
+				userName: '', // 账户名称
+				userNickname: '', // 用户昵称
+				roleSign: '', // 关联角色
+				department: [], // 部门
+				phone: '', // 手机号
+				email: '', // 邮箱
+				sex: '', // 性别
+				password: '', // 账户密码
+				overdueTime: '', // 账户过期
+				status: true, // 用户状态
+				describe: '', // 用户描述
+			},
+			// deptData: [], // 部门数据
+			// 标识列表数据
+			tableData: {
+				data: [],
+				total: 0,
+				loading: false,
+				param: {
+					pageNum: 1,
+					pageSize: 10,
+				},
+			}
+		});
+		// 打开弹窗
+		const openDialog = () => {
+			state.isShowDialog = true;
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+			closeDialog();
+		};
+		// 打开新增用户弹窗
+		const onOpenAddSign = () => {
+			addSignRef.value.openDialog();
+		};
+				
+		// 打开编辑弹窗
+		const onOpenEditSign = (row: TableDataRow) => {
+			addSignRef.value.openDialog(row);
+		};
+		// 打开任务接口弹窗
+		const onRowDetail = (row: TableDataRow) => {
+			setTaskRef.value.openDialog(row);
+		};
+		// 删除标识项
+		const onRowDel = (row: TableDataRow) => {
+			ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.userName}”,是否继续?`, '提示', {
+				confirmButtonText: '确认',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(() => {
+					ElMessage.success('删除成功');
+				})
+				.catch(() => {});
+		};
+		// 分页改变
+		const onHandleSizeChange = (val: number) => {
+			state.tableData.param.pageSize = val;
+		};
+		// 分页改变
+		const onHandleCurrentChange = (val: number) => {
+			state.tableData.param.pageNum = val;
+		};
+		// 初始化部门数据
+		const initTableData = () => {
+			const data: Array<TableDataRow> = [];
+			for (let i = 0; i < 6; i++) {
+				data.push({
+					userName: '这里是标识',
+					dataType: '设备评分',
+					description: '这里是描述这里是描述这里是描述这里是描述',
+					num: '88',
+					range: '10~20, 30~40',
+					createTime: new Date().toLocaleString(),
+
+				});
+			}
+			state.tableData.data = data;
+			state.tableData.total = data.length;
+		};
+		// 页面加载时
+		onMounted(() => {
+			initTableData();
+		});
+		return {
+			setTaskRef,
+			addSignRef,
+			onOpenAddSign,// 打开添加标识项弹窗
+			onOpenEditSign,// 打开编辑某一个标识项弹窗
+			onRowDel,// 删除某一个标识项
+			onRowDetail,// 打开数据源配置接口弹窗
+
+			onHandleSizeChange,// 标识项分页每页展示条数变化
+			onHandleCurrentChange,// 标识项分页页数变化变化
+
+			openDialog,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style lang="scss" scoped>
+
+
+::v-deep .el-form {
+	// display: flex;
+	// justify-self: center;
+	// flex-direction: column;
+	// align-content: center;
+	.el-form-item {
+		width: 500px;
+		margin: 8px auto;
+	}
+	::v-deep .el-input__inner,
+	::v-deep .el-textarea__inner {
+		width: 400px;
+		// flex-grow: 0;
+	}
+	::v-deep .el-input__inner {
+		padding: 1px 10px;
+	}
+	::v-deep .el-input__wrapper {
+		flex-grow: 0;
+		padding: 0
+	}
+}
+
+
+</style>

+ 239 - 0
src/views/assess/totalIndex/component/addSign.vue

@@ -0,0 +1,239 @@
+<template>
+	<div class="system-add-user-container">
+		<el-dialog title="新建标识项" v-model="isShowDialog" width="569px">
+			<el-form :model="ruleForm" size="default" label-width="90px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="标识" required>
+							<el-input v-model="ruleForm.userName" placeholder="请输入标识" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="名称" required>
+							<el-input v-model="ruleForm.phone" placeholder="请输入名称" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item class="has-symbol" label="权重" required>
+							<el-input v-model="ruleForm.email" placeholder="请输入权重" clearable></el-input>
+							<span class="symbol">%</span>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<!-- 添加取值范围 -->
+			<div class="add-value-range">
+				<p>添加取值范围</p>
+				<div class="add-value-range-wrap">
+					<section class="add-value-range-item" v-for="(item, index) in ruleForm.list" :key="index">
+						<div class="left-wrap">
+							<span class="symbol">*</span>
+							<span class="label">取值范围</span>
+							<el-input size="small" v-model="item.minVal" placeholder="请输入最小值" clearable></el-input>
+							<span> ~ </span>
+							<el-input size="small" v-model="item.maxVal" placeholder="请输入最大值" clearable></el-input>
+						</div>
+						<div class="right-wrap">
+							<span class="symbol">*</span>
+							<span class="label">得分</span>
+							<el-input size="small" v-model="item.score" placeholder="请输入得分" clearable></el-input>
+						</div>
+						 <el-button :disabled="index!==ruleForm.list.length-1" @click="addRange(item)" size="default" plain type="primary">添加</el-button>
+
+					</section>
+				</div>
+			</div>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">新 增</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent } from 'vue';
+import { ElMessage } from 'element-plus';
+
+// 定义接口来定义对象的类型
+interface DeptData {
+	deptName: string;
+	createTime: string;
+	status: boolean;
+	sort: number | string;
+	describe: string;
+	id: number;
+	children?: DeptData[];
+}
+interface RangeData {
+	minVal: number | string;
+	maxVal: number | string;
+	score: number | string;
+}
+interface UserState {
+	isShowDialog: boolean;
+	ruleForm: {
+		userName: string;
+		userNickname: string;
+		roleSign: string;
+		department: any;
+		phone: string;
+		email: string;
+		sex: string;
+		password: string;
+		overdueTime: string;
+		status: boolean;
+		describe: string;
+		list: Array<RangeData>;
+	};
+	deptData: Array<DeptData>;
+}
+
+export default defineComponent({
+	name: 'systemAddUser',
+	setup() {
+		const state = reactive<UserState>({
+			isShowDialog: false,
+			ruleForm: {
+				userName: '', // 账户名称
+				userNickname: '', // 用户昵称
+				roleSign: '', // 关联角色
+				department: [], // 部门
+				phone: '', // 手机号
+				email: '', // 邮箱
+				sex: '', // 性别
+				password: '', // 账户密码
+				overdueTime: '', // 账户过期
+				status: true, // 用户状态
+				describe: '', // 用户描述
+				list: []
+			},
+			deptData: [], // 部门数据
+		});
+		// 打开弹窗
+		const openDialog = () => {
+			state.isShowDialog = true;
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+			closeDialog();
+		};
+		// 初始化部门数据
+		const initTableData = () => {
+			state.deptData.push({
+				deptName: 'vueNextAdmin',
+				createTime: new Date().toLocaleString(),
+				status: true,
+				sort: Math.random(),
+				describe: '顶级部门',
+				id: Math.random(),
+				children: [
+					{
+						deptName: 'IT外包服务',
+						createTime: new Date().toLocaleString(),
+						status: true,
+						sort: Math.random(),
+						describe: '总部',
+						id: Math.random(),
+					},
+					{
+						deptName: '资本控股',
+						createTime: new Date().toLocaleString(),
+						status: true,
+						sort: Math.random(),
+						describe: '分部',
+						id: Math.random(),
+					},
+				],
+			});
+			state.ruleForm.list = [{
+				minVal: 10,
+				maxVal: 100,
+				score: 90
+			}]
+		};
+		const addRange = (item: RangeData) => {
+			const { minVal, maxVal, score } = item
+			if(!minVal || !maxVal || !score.toString()) {
+				ElMessage.error('请完善表单');
+				return 
+			}
+			state.ruleForm.list.push({
+				minVal: '',
+				maxVal: '',
+				score: ''
+			})
+		};
+		// 页面加载时
+		onMounted(() => {
+			initTableData();
+		});
+		return {
+			openDialog,
+			closeDialog,
+			addRange,
+			onCancel,
+			onSubmit,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style lang="scss" scoped>
+::v-deep .has-symbol > .el-form-item__content {
+	position: relative;
+	.symbol {
+		position: absolute;
+		right: 8px;
+	}
+}
+.el-form {
+	border-bottom: 1px solid var(--el-border-color);
+}
+.add-value-range {
+	// background-color: pink;
+	padding: 10px 0;
+	.add-value-range-wrap {
+		display: flex;
+		flex-direction: column;
+		.add-value-range-item {
+			display: flex;
+			justify-content: space-between;
+				align-content: center;
+				padding-top: 2px;
+			.left-wrap,
+			.right-wrap {
+				display: flex;
+				justify-content: center;
+				align-content: center;
+				height: 32px;
+				line-height: 28px;
+				.symbol {
+					content: "*";
+					color: var(--el-color-danger);
+					margin-right: 4px;
+				}
+				.label {
+					margin-right: 4px;
+				}
+
+			}
+			::v-deep .el-input {
+				width: 100px;
+				height: 28px;
+			}
+		}
+	}
+}
+</style>

+ 202 - 0
src/views/assess/totalIndex/component/editUser.vue

@@ -0,0 +1,202 @@
+<template>
+	<div class="system-edit-user-container">
+		<el-dialog title="修改用户" v-model="isShowDialog" width="769px">
+			<el-form :model="ruleForm" size="default" label-width="90px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="账户名称">
+							<el-input v-model="ruleForm.userName" placeholder="请输入账户名称" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="用户昵称">
+							<el-input v-model="ruleForm.userNickname" placeholder="请输入用户昵称" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="关联角色">
+							<el-select v-model="ruleForm.roleSign" placeholder="请选择" clearable class="w100">
+								<el-option label="超级管理员" value="admin"></el-option>
+								<el-option label="普通用户" value="common"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="部门">
+							<el-cascader
+								:options="deptData"
+								:props="{ checkStrictly: true, value: 'deptName', label: 'deptName' }"
+								placeholder="请选择部门"
+								clearable
+								class="w100"
+								v-model="ruleForm.department"
+							>
+								<template #default="{ node, data }">
+									<span>{{ data.deptName }}</span>
+									<span v-if="!node.isLeaf"> ({{ data.children.length }}) </span>
+								</template>
+							</el-cascader>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="手机号">
+							<el-input v-model="ruleForm.phone" placeholder="请输入手机号" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="邮箱">
+							<el-input v-model="ruleForm.email" placeholder="请输入" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="性别">
+							<el-select v-model="ruleForm.sex" placeholder="请选择" clearable class="w100">
+								<el-option label="男" value="男"></el-option>
+								<el-option label="女" value="女"></el-option>
+							</el-select>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="账户密码">
+							<el-input v-model="ruleForm.password" placeholder="请输入" type="password" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="账户过期">
+							<el-date-picker v-model="ruleForm.overdueTime" type="date" placeholder="请选择" class="w100"> </el-date-picker>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="12" :md="12" :lg="12" :xl="12" class="mb20">
+						<el-form-item label="用户状态">
+							<el-switch v-model="ruleForm.status" inline-prompt active-text="启" inactive-text="禁"></el-switch>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="用户描述">
+							<el-input v-model="ruleForm.describe" type="textarea" placeholder="请输入用户描述" maxlength="150"></el-input>
+						</el-form-item>
+					</el-col>
+				</el-row>
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">修 改</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent } from 'vue';
+
+// 定义接口来定义对象的类型
+interface DeptData {
+	deptName: string;
+	createTime: string;
+	status: boolean;
+	sort: number | string;
+	describe: string;
+	id: number;
+	children?: DeptData[];
+}
+interface RuleFormRow {
+	userName: string;
+	userNickname: string;
+	roleSign: string;
+	department: any;
+	phone: string;
+	email: string;
+	sex: string;
+	password: string;
+	overdueTime: string;
+	status: boolean;
+	describe: string;
+}
+interface UserState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormRow;
+	deptData: Array<DeptData>;
+}
+
+export default defineComponent({
+	name: 'systemEditUser',
+	setup() {
+		const state = reactive<UserState>({
+			isShowDialog: false,
+			ruleForm: {
+				userName: '', // 账户名称
+				userNickname: '', // 用户昵称
+				roleSign: '', // 关联角色
+				department: [], // 部门
+				phone: '', // 手机号
+				email: '', // 邮箱
+				sex: '', // 性别
+				password: '', // 账户密码
+				overdueTime: '', // 账户过期
+				status: true, // 用户状态
+				describe: '', // 用户描述
+			},
+			deptData: [], // 部门数据
+		});
+		// 打开弹窗
+		const openDialog = (row: RuleFormRow) => {
+			state.ruleForm = row;
+			state.isShowDialog = true;
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+			closeDialog();
+		};
+		// 初始化部门数据
+		const initTableData = () => {
+			state.deptData.push({
+				deptName: 'vueNextAdmin',
+				createTime: new Date().toLocaleString(),
+				status: true,
+				sort: Math.random(),
+				describe: '顶级部门',
+				id: Math.random(),
+				children: [
+					{
+						deptName: 'IT外包服务',
+						createTime: new Date().toLocaleString(),
+						status: true,
+						sort: Math.random(),
+						describe: '总部',
+						id: Math.random(),
+					},
+					{
+						deptName: '资本控股',
+						createTime: new Date().toLocaleString(),
+						status: true,
+						sort: Math.random(),
+						describe: '分部',
+						id: Math.random(),
+					},
+				],
+			});
+		};
+		// 页面加载时
+		onMounted(() => {
+			initTableData();
+		});
+		return {
+			openDialog,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			...toRefs(state),
+		};
+	},
+});
+</script>

+ 118 - 0
src/views/assess/totalIndex/component/setTask.vue

@@ -0,0 +1,118 @@
+<template>
+	<div class="system-add-user-container">
+		<el-dialog title="数据源配置接口" v-model="isShowDialog" width="569px">
+			<el-form :model="ruleForm" size="default" label-width="90px">
+				<el-row :gutter="35">
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="指标名称">
+							{{ruleForm.userName}}
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="URL" required>
+							<el-input v-model="ruleForm.userName" placeholder="请输入URL" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="取值项" required>
+							<el-input v-model="ruleForm.dataType" placeholder="请输入取值项" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="取值周期" required>
+							<el-input v-model="ruleForm.num" placeholder="请输入取值周期" clearable></el-input>
+						</el-form-item>
+					</el-col>
+					<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24" class="mb20">
+						<el-form-item label="是否启用">
+							  <el-radio-group v-model="ruleForm.isUse" class="ml-4">
+								<el-radio size="small" label="1">启用</el-radio>
+								<el-radio size="small" label="2">禁用</el-radio>
+							</el-radio-group>
+							 <el-button style="margin-left: 20px;" size="small" type="primary">检测</el-button>
+						</el-form-item>
+					</el-col>
+				</el-row>
+
+
+
+			</el-form>
+			<template #footer>
+				<span class="dialog-footer">
+					<el-button @click="onCancel" size="default">取 消</el-button>
+					<el-button type="primary" @click="onSubmit" size="default">新 增</el-button>
+				</span>
+			</template>
+		</el-dialog>
+	</div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, onMounted, defineComponent } from 'vue';
+import { ElMessage } from 'element-plus';
+
+// 定义接口来定义对象的类型
+interface RuleFormRow {
+	userName: string;
+	isUse: string;
+	dataType: string;
+	num: string;
+	description: any;
+}
+interface ItemState {
+	isShowDialog: boolean;
+	ruleForm: RuleFormRow;
+}
+
+export default defineComponent({
+	name: 'systemAddUser',
+	setup() {
+		const state = reactive<ItemState>({
+			isShowDialog: false,
+			ruleForm: {
+				userName: '', // 指标名称
+				isUse: "1", // 是否启用
+				dataType: '', // 数据项
+				num: '', // 权重(%)
+				description: '', // 取值范围
+			},
+		});
+		// 打开弹窗
+		const openDialog = (row: RuleFormRow) => {
+			state.ruleForm = row;
+			state.ruleForm.isUse = "1"
+			state.isShowDialog = true;
+		};
+		// 关闭弹窗
+		const closeDialog = () => {
+			state.isShowDialog = false;
+		};
+		// 取消
+		const onCancel = () => {
+			closeDialog();
+		};
+		// 新增
+		const onSubmit = () => {
+			closeDialog();
+		};
+		// 初始化部门数据
+		const initTableData = () => {
+			
+		};
+		// 页面加载时
+		onMounted(() => {
+			initTableData();
+		});
+		return {
+			openDialog,
+			closeDialog,
+			onCancel,
+			onSubmit,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style lang="scss" scoped>
+</style>

+ 189 - 0
src/views/assess/totalIndex/index.vue

@@ -0,0 +1,189 @@
+<template>
+	<div class="system-user-container">
+		<el-card shadow="hover">
+			<div class="system-user-search mb15">
+				<!-- <el-input size="default" placeholder="请输入用户名称" style="max-width: 180px"> </el-input>
+				<el-button size="default" type="success" class="ml10">
+					<el-icon>
+						<ele-Search />
+					</el-icon>
+					查询
+				</el-button> -->
+				<el-button size="default" type="primary" class="ml10" @click="onOpenAddItem">
+					<el-icon>
+						<ele-FolderAdd />
+					</el-icon>
+					新建
+				</el-button>
+			</div>
+			<el-table border stripe :data="tableData.data" style="width: 100%">
+				<!-- <el-table-column type="index" label="序号" width="60" /> -->
+				<el-table-column align="center" prop="userName" label="名称" show-overflow-tooltip></el-table-column>
+				<el-table-column align="center" prop="description" label="描述" show-overflow-tooltip></el-table-column>
+				<!-- <el-table-column prop="userNickname" label="用户昵称" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="roleSign" label="关联角色" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="department" label="部门" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="phone" label="手机号" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="email" label="邮箱" show-overflow-tooltip></el-table-column>
+				<el-table-column prop="status" label="用户状态" show-overflow-tooltip>
+					<template #default="scope">
+						<el-tag type="success" v-if="scope.row.status">启用</el-tag>
+						<el-tag type="info" v-else>禁用</el-tag>
+					</template>
+				</el-table-column>
+				<el-table-column prop="describe" label="用户描述" show-overflow-tooltip></el-table-column> -->
+				<el-table-column align="center" prop="createTime" label="创建时间" show-overflow-tooltip></el-table-column>
+				<el-table-column align="center" label="操作" width="180">
+					<template #default="scope">
+						<el-button size="small" type="text"  @click="onOpenEditUser(scope.row)">编辑</el-button>
+						<el-button size="small" type="text" @click="onRowDel(scope.row)">删除</el-button>
+						<el-button size="small" type="text" @click="onRowDel(scope.row)">详细信息</el-button>
+					</template>
+				</el-table-column>
+			</el-table>
+			<el-pagination
+				@size-change="onHandleSizeChange"
+				@current-change="onHandleCurrentChange"
+				class="mt15"
+				:pager-count="5"
+				:page-sizes="[10, 20, 30]"
+				v-model:current-page="tableData.param.page"
+				background
+				v-model:page-size="tableData.param.pageSize"
+				layout="total, sizes, prev, pager, next, jumper"
+				:total="tableData.total"
+			>
+			</el-pagination>
+		</el-card>
+		<!-- <AddUer ref="addUserRef" /> -->
+		<EditUser ref="editUserRef" />
+
+		<AddItem ref="addItemRef" />
+	</div>
+</template>
+
+<script lang="ts">
+import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
+import { ElMessageBox, ElMessage } from 'element-plus';
+// import AddUer from '/@/views/system/user/component/addUser.vue';
+import EditUser from './component/editUser.vue';
+
+import AddItem from './component/addItem.vue';
+import api from '/@/api/assess';
+
+// 定义接口来定义对象的类型
+interface TableDataRow {
+	userName: string;
+	description: string;
+	// userNickname: string;
+	// roleSign: string;
+	// department: string[];
+	// phone: string;
+	// email: string;
+	// sex: string;
+	// password: string;
+	// overdueTime: Date;
+	// status: boolean;
+	// describe: string;
+	createTime: string;
+}
+interface TableDataState {
+	tableData: {
+		data: Array<TableDataRow>;
+		total: number;
+		loading: boolean;
+		param: {
+			page: number;
+			pageSize: number;
+		};
+	};
+}
+
+export default defineComponent({
+	name: 'systemUser',
+	components: {  EditUser, AddItem },
+	setup() {
+		const addItemRef = ref();
+		const editUserRef = ref();
+		const state = reactive<TableDataState>({
+			tableData: {
+				data: [],
+				total: 0,
+				loading: false,
+				param: {
+					page: 1,
+					pageSize: 10,
+				},
+			},
+		});
+		// 初始化表格数据
+		const initTableData = () => {
+			// const data: Array<TableDataRow> = [];
+			// for (let i = 0; i < 9; i++) {
+			// 	data.push({
+			// 		userName: '这里是名称',
+			// 		description: '这里是描述这里是描述这里是描述这里是描述',
+			// 		createTime: new Date().toLocaleString(),
+
+			// 	});
+			// }
+			// state.tableData.data = data;
+			// state.tableData.total = state.tableData.data.length;
+			// console.log(data)
+			api.product.getList(state.tableData.param).then((res: any) => {
+				console.log(res);
+				state.tableData.data = res.product;
+				state.tableData.total = res.total;
+			});
+		};
+		// 打开新增用户弹窗
+		const onOpenAddItem = () => {
+			addItemRef.value.openDialog();
+		};
+		// 打开修改用户弹窗
+		const onOpenEditUser = (row: TableDataRow) => {
+			editUserRef.value.openDialog(row);
+		};
+		// 删除用户
+		const onRowDel = (row: TableDataRow) => {
+			ElMessageBox.confirm(`此操作将永久删除账户名称:“${row.userName}”,是否继续?`, '提示', {
+				confirmButtonText: '确认',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(() => {
+					ElMessage.success('删除成功');
+				})
+				.catch(() => {});
+		};
+		// 分页改变
+		const onHandleSizeChange = (val: number) => {
+			state.tableData.param.pageSize = val;
+		};
+		// 分页改变
+		const onHandleCurrentChange = (val: number) => {
+			state.tableData.param.page = val;
+		};
+		// 页面加载时
+		onMounted(() => {
+			initTableData();
+		});
+		return {
+			addItemRef,
+			editUserRef,
+			onOpenAddItem,
+			onOpenEditUser,
+			onRowDel,
+			onHandleSizeChange,
+			onHandleCurrentChange,
+			...toRefs(state),
+		};
+	},
+});
+</script>
+
+<style>
+.el-table th.el-table__cell {
+	background-color: #e3e3e3;
+}
+</style>