Forráskód Böngészése

增加证书管理功能

vera_min 2 éve
szülő
commit
695e49520c

+ 33 - 0
src/api/certificateManagement/index.ts

@@ -0,0 +1,33 @@
+import { get, post, del, put, file } from '/@/utils/request';
+import getOrigin from '/@/utils/origin';
+const baseUrl = getOrigin(import.meta.env.VITE_SERVER_URL);
+console.log(baseUrl)
+
+export default {
+  loop: {
+    getList: (params: object) => get('/region/loop/list', params),
+    add: (data: object) => post('/region/loop/add', data),
+    export: (params: object) => file('/region/loop/export', params), // 环路列表导出
+    upload: (params: object) => file('/region/loop/import', params), // 环路列表导出
+    edit: (data: object) => put('/region/loop/edit', data),
+    del: (id: number) => del('/region/loop/del', { id }),
+    detail: (id: number) => get('/region/loop/getInfoById', { id }),
+  },
+  certificateManagement: {
+    getList: (params: object) => get('/system/certificate/list', params),
+    add: (data: object) => post('/system/certificate/add', data),
+    edit: (data: object) => put('/system/certificate/edit', data),
+    del: (id: number) => del('/system/certificate/delete', { id }),
+    // getAll: (params?: object) => get('/region/monitor/getAllHeatStation', params),
+    getAll: (params?: object) => get('/region/monitor/loopMap', params),
+    heatStationExport: (params: object) => file('/region/heatStation/export', params), // 换热站列表导出
+    getAllList: (params: object) => get('/region/heatStation/getAll', params),
+    // add: (data: object) => post('/region/heatStation/add', data),
+    // edit: (data: object) => put('/region/heatStation/edit', data),
+    // del: (id: number) => del('/region/heatStation/del', { id }),
+    detail: (id: number) => get('/region/heatStation/getInfoById', { id }),
+    getAllStaAndLoop: (params?: object) => get('/region/heatStation/getAllStaAndLoop', params),
+    stationDetail: (params?: object) => get('/energy/performance/station/detail', params),
+    stationDetailHistory: (params?: object) => get('/energy/history/performance/station/detail', params),
+  }
+}

+ 70 - 0
src/components/upload/uploadFile.vue

@@ -0,0 +1,70 @@
+<template>
+	<el-upload
+		:accept="accept"
+		:show-file-list="false"
+		v-model:file-list="fileList"
+		:limit="1"
+		:headers="headers"
+		:before-upload="beforeAvatarUpload"
+		:action="uploadUrl"
+		:on-success="updateImg"
+	>
+		<el-button>
+			<el-icon> <ele-Upload /> </el-icon>
+			数据导入
+		</el-button>
+	</el-upload>
+</template>
+
+<script lang="ts" setup>
+import { ref } from 'vue';
+import { ElMessage } from 'element-plus';
+import type { UploadProps } from 'element-plus';
+import getOrigin from '/@/utils/origin';
+
+const headers = {
+	Authorization: 'Bearer ' + JSON.parse(sessionStorage.token),
+};
+
+const emit = defineEmits(['update']);
+
+const props = defineProps({
+	accept: {
+		type: String,
+		default: '',
+	},
+	url: {
+		type: String,
+		default: '/common/singleFile',
+	},
+	// https://zhgy.sagoo.cn/api/v1/common/singleFile
+});
+
+const fileList = ref<any[]>([
+	// {
+	// 	name: '',
+	// 	url: '',
+	// },
+]);
+
+const uploadUrl: string = getOrigin(import.meta.env.VITE_API_URL + props.url);
+
+const updateImg = (res: any) => {
+	console.log(res)
+	if (res.code === 0) {
+		ElMessage.success('文件上传成功');
+	} else {
+		ElMessage.error(res.message);
+	}
+	fileList.value = []
+	emit('update', res.data.path)
+};
+
+const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
+	if (rawFile.size / 1024 / 1024 > 2) {
+		ElMessage.error('文件不能超过2MB!');
+		return false;
+	}
+	return true;
+};
+</script>

+ 513 - 0
src/views/iot/certificate/component/editParams.vue

@@ -0,0 +1,513 @@
+<template>
+	<el-dialog @close="state.ruleForm= {}" :title="state.ruleForm.id ? '编辑证书' : '新增证书'" v-model="state.dialogVisible" width="60%">
+		<!-- <el-tabs v-model="state.activeName" @tab-click="onTabClick"> -->
+			<!-- <el-tab-pane label="基本信息" name="1"> -->
+				<el-form :rules="state.rules" ref="ruleForm" :model="state.ruleForm" label-width="120px">
+					<el-form-item label="证书标准" prop="standard">
+						<el-select v-model="state.ruleForm.standard" placeholder="请选择证书标准">
+							<el-option
+								v-for="dict in network_certificate"
+								:key="dict.value"
+								:label="dict.label"
+								:value="dict.value">
+							</el-option>
+						</el-select>
+					</el-form-item>
+					<el-form-item label="证书名称" prop="name">
+						<el-input size="default" v-model="state.ruleForm.name"></el-input>
+					</el-form-item>
+					<el-form-item label="证书文件" prop="fileContent">
+						<el-input disabled v-if="state.ruleForm.fileContent" size="default" v-model="state.ruleForm.fileContent"></el-input>
+						<uploadFile @update="updateFile" url="/common/singleFile"></uploadFile>
+					</el-form-item>
+					<el-form-item label="证书公钥" prop="publicKeyContent">
+						<el-input size="default" disabled type="textarea" :rows="6" v-model="state.ruleForm.publicKeyContent"></el-input>
+						<el-upload  
+							class="upload-demo"
+							action=""              
+							accept=".txt"
+							:on-change="beforePublicUpload"
+							:auto-upload="false">
+							<el-button size="small" type="primary">上传</el-button>             
+						</el-upload>
+					</el-form-item>
+					<el-form-item label="证书私钥" prop="privateKeyContent">
+						<el-input size="default" disabled type="textarea" :rows="6" v-model="state.ruleForm.privateKeyContent"></el-input>
+						<el-upload  
+							class="upload-demo"
+							action=""              
+							accept=".txt"
+							:on-change="beforePrivateUpload"
+							:auto-upload="false">
+							<el-button size="small" type="primary">上传</el-button>             
+						</el-upload>
+					</el-form-item>
+					<el-form-item label="说明">
+						<el-input size="default" type="textarea" :rows="6" v-model="state.ruleForm.description"></el-input>
+					</el-form-item>
+					
+				</el-form>
+			<!-- </el-tab-pane> -->
+			<!-- <el-tab-pane label="字段信息" name="2">
+				<el-table :data="state.columns" style="width: 100%">
+					<el-table-column label="字段描述" align="center" width="150" fixed="left">
+						<template #default="{ row }">
+							<el-input size="default" v-model="row.columnComment" placeholder=""></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column label="序号" type="index" width="60" align="center" />
+					<el-table-column label="字段列名" prop="columnName" width="150"> </el-table-column>
+					<el-table-column label="物理类型" prop="columnType" width="120"> </el-table-column>
+					<el-table-column label="go类型" prop="goType" width="120">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.goType" placeholder="">
+								<el-option label="int" value="int" />
+								<el-option label="unit" value="unit" />
+								<el-option label="int64" value="int64" />
+								<el-option label="unit64" value="unit64" />
+								<el-option label="float64" value="float64" />
+								<el-option label="string" value="string" />
+								<el-option label="Time" value="Time" />
+								<el-option label="byte" value="byte" />
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="go属性" prop="goField" width="150">
+						<template #default="{ row }">
+							<el-input size="default" v-model="row.goField" placeholder=""></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column label="json属性" prop="jsonField" width="150">
+						<template #default="{ row }">
+							<el-input size="default" v-model="row.jsonField" placeholder=""></el-input>
+						</template>
+					</el-table-column>
+					<el-table-column label="插入" prop="isInsert" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isInsert"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="编辑" prop="isEdit" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isEdit"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="列表" prop="isList" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isList"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="查询" prop="isQuery" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isQuery"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="必填" prop="isRequired" width="70">
+						<template #default="{ row }">
+							<el-checkbox size="default" v-model="row.isRequired"></el-checkbox>
+						</template>
+					</el-table-column>
+					<el-table-column label="查询方式" prop="queryType" width="120">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.queryType" placeholder="">
+								<el-option label="=" value="EQ" />
+								<el-option label="!=" value="NE" />
+								<el-option label=">" value="GT" />
+								<el-option label=">=" value="GTE" />
+								<el-option label="<" value="LT" />
+								<el-option label="<=" value="LTE" />
+								<el-option label="LIKE" value="LIKE" />
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="显示类型" prop="htmlType" width="140">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.htmlType" placeholder="">
+								<el-option label="文本框" value="input" />
+								<el-option label="下拉框" value="select" />
+								<el-option label="开关" value="switch" />
+								<el-option label="单选框" value="radio" />
+								<el-option label="多选框" value="checkbox" />
+								<el-option label="文件选择" value="file" />
+								<el-option label="文本域" value="textarea" />
+								<el-option label="日期控件" value="datetime" />
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="字典类型" prop="dictType" width="160">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.dictType" placeholder="">
+								<el-option v-for="item in []" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+							</el-select>
+						</template>
+					</el-table-column>
+					<el-table-column label="关系表" prop="linkTableName" width="160">
+						<template #default="{ row }">
+							<el-select size="default" v-model="row.linkTableName" placeholder="">
+								<el-option v-for="item in []" :key="item.value" :label="item.label" :value="item.value"> </el-option>
+							</el-select>
+						</template>
+					</el-table-column>
+				</el-table>
+			</el-tab-pane>
+			<el-tab-pane label="生成信息" name="3">
+				<el-form ref="ruleForm" :model="state.ruleForm" label-width="120px">
+					<el-row>
+						<el-col :span="12">
+							<el-form-item label="指定应用名" prop="packageName">
+								<el-input size="default" v-model="state.ruleForm.packageName"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="生成模块名" prop="moduleName">
+								<el-input size="default" v-model="state.ruleForm.moduleName"></el-input>
+							</el-form-item>
+						</el-col>
+					</el-row>
+					<el-row>
+						<el-col :span="12">
+							<el-form-item label="生成业务名" prop="businessName">
+								<el-input size="default" v-model="state.ruleForm.businessName"></el-input>
+							</el-form-item>
+						</el-col>
+						<el-col :span="12">
+							<el-form-item label="生成功能名" prop="functionName">
+								<el-input size="default" v-model="state.ruleForm.functionName"></el-input>
+							</el-form-item>
+						</el-col>
+					</el-row>
+				</el-form>
+			</el-tab-pane> -->
+		<!-- </el-tabs> -->
+
+		<template #footer>
+			<div class="dialog-footer">
+				<el-button type="default" @click="state.dialogVisible = false">取 消</el-button>
+				<el-button type="primary" @click="submitData(ruleForm)">提 交</el-button>
+			</div>
+		</template>
+	</el-dialog>
+</template>
+
+<script lang="ts" setup>
+import { reactive, ref, unref, getCurrentInstance } from 'vue';
+import { genFileId, FormRules, FormInstance } from 'element-plus'
+import uploadFile from '/@/components/upload/uploadFile.vue';
+import type { UploadInstance, UploadProps, UploadRawFile } from 'element-plus'
+
+import api from '/@/api/certificateManagement';
+import { ElMessage } from 'element-plus';
+
+const emit = defineEmits(['update']);
+
+const ruleForm = ref<FormInstance>()
+
+// const tagOption = ref(['api', 'editVue', 'entity', 'jsApi', 'listVue', 'router', 'service']);
+const state = reactive({
+	dialogVisible: false,
+	activeName: '1',
+	id: 0,
+	ruleForm: {},
+	rules: {
+		name: [{ required: true, message: '证书名称不能为空', trigger: 'blur' }],
+		standard: [{ required: true, message: '证书标准不能为空', trigger: 'blur' }],
+		fileContent: [{ required: true, message: '证书文件不能为空', trigger: 'blur' }],
+		publicKeyContent: [{ required: true, message: '证书公钥不能为空', trigger: 'blur' }],
+		privateKeyContent: [{ required: true, message: '证书私钥不能为空', trigger: 'blur' }]
+	},
+	columns: [
+		{
+			columnId: 29,
+			tableId: 3,
+			TableName: '',
+			columnName: 'business_type',
+			columnComment: '0其它 1新增 2修改 3删除',
+			columnType: 'varchar(1)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'BusinessType',
+			jsonField: 'businessType',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'datetime',
+			dictType: '',
+			sort: 3,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 31,
+			tableId: 3,
+			TableName: '',
+			columnName: 'method',
+			columnComment: '请求方法',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'Method',
+			jsonField: 'method',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 4,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 33,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_name',
+			columnComment: '操作人员',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'OperName',
+			jsonField: 'operName',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '1',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'LIKE',
+			htmlType: 'input',
+			dictType: '',
+			sort: 5,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 35,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_url',
+			columnComment: '操作url',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'OperUrl',
+			jsonField: 'operUrl',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 6,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 37,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_ip',
+			columnComment: '操作IP',
+			columnType: 'varchar(255)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'OperIp',
+			jsonField: 'operIp',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 7,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 41,
+			tableId: 3,
+			TableName: '',
+			columnName: 'status',
+			columnComment: '0=正常,1=异常',
+			columnType: 'varchar(1)',
+			columnKey: '',
+			goType: 'string',
+			goField: 'Status',
+			jsonField: 'status',
+			htmlField: '',
+			isPk: '0',
+			isIncrement: '',
+			isRequired: '1',
+			isInsert: '1',
+			isEdit: '1',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'radio',
+			dictType: '',
+			sort: 10,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+		{
+			columnId: 42,
+			tableId: 3,
+			TableName: '',
+			columnName: 'oper_id',
+			columnComment: '',
+			columnType: 'bigint(20)',
+			columnKey: '',
+			goType: 'int64',
+			goField: 'OperId',
+			jsonField: 'operId',
+			htmlField: '',
+			isPk: '1',
+			isIncrement: '',
+			isRequired: '0',
+			isInsert: '1',
+			isEdit: '0',
+			isList: '1',
+			isQuery: '1',
+			queryType: 'EQ',
+			htmlType: 'input',
+			dictType: '',
+			sort: 1,
+			linkTableName: '',
+			linkTableClass: '',
+			linkTablePackage: '',
+			linkLabelId: '',
+			linkLabelName: '',
+		},
+	],
+});
+const { proxy } = getCurrentInstance() as any;
+const { network_certificate } = proxy.useDict('network_certificate');
+console.log(network_certificate)
+// 打开弹窗
+const openDialog = (row: any) => {
+	if (row) {
+		state.ruleForm = row;
+	}
+	state.dialogVisible = true;
+};
+
+// 关闭弹窗
+const closeDialog = () => {
+	state.dialogVisible = false;
+};
+// 取消
+const onCancel = () => {
+	closeDialog();
+};
+
+const submitData =  async (formEl: any | undefined) => {
+	if (!formEl) return
+		await formEl.validate((valid: any, fields: any) => {
+		if (valid) {
+			console.log('submit!')
+			if(state.ruleForm.id) {
+				// 编辑
+				api.certificateManagement.edit(state.ruleForm).then((res: any) => {
+					ElMessage.success('证书编辑成功');
+					console.log(res)
+					state.dialogVisible = false
+					emit('update')
+					state.ruleForm = {}
+				});
+			}else {
+				// 新增
+				api.certificateManagement.add(state.ruleForm).then((res: any) => {
+					ElMessage.success('证书添加成功');
+					console.log(res)
+					state.dialogVisible = false
+					emit('update')
+					state.ruleForm = {}
+				});
+			}
+
+		} else {
+			console.log('error submit!', fields)
+		}
+	})
+}
+
+const beforePublicUpload = (response:any, file:any, fileList:any) => {
+	let reader=new FileReader();
+	reader.readAsText(file[file.length-1].raw,'UTF-8')//读取,转换字符编码
+	reader.onload=function(e:any){
+		let val = e.target.result;//获取数据
+		let rtulist = val.split("\r\n")
+		console.log('rtulist:>> ', rtulist);
+		state.ruleForm.publicKeyContent = rtulist[0];
+	}
+}
+
+const beforePrivateUpload = (response:any, file:any, fileList:any) => {
+	let reader=new FileReader();
+	reader.readAsText(file[file.length-1].raw,'UTF-8')//读取,转换字符编码
+	reader.onload=function(e:any){
+		let val = e.target.result;//获取数据
+		let rtulist = val.split("\r\n")
+		console.log('rtulist:>> ', rtulist);
+		state.ruleForm.privateKeyContent = rtulist[0];
+	}
+}
+const updateFile = (url: string) => {
+	console.log('文件上传成功')
+	state.ruleForm.fileContent = url
+}
+
+defineExpose({ openDialog });
+</script>
+
+<style scoped lang="scss">
+:deep(.el-dialog__body) {
+	max-height: calc(90vh - 111px) !important;
+	overflow-y: auto;
+	overflow-x: hidden;
+}
+:deep(.el-upload-list) {
+	display: none;
+}
+</style>

+ 185 - 0
src/views/iot/certificate/index.vue

@@ -0,0 +1,185 @@
+<template>
+  <div class="system-dic-container">
+    <el-card shadow="hover">
+      <div class="system-user-search mb15">
+        <el-form :model="state.tableData.param" ref="queryRef" :inline="true" label-width="60px">
+          <el-form-item label="关键字" prop="keyWord">
+            <el-input v-model="state.tableData.param.name" placeholder="请输入关键字" clearable size="default" @keyup.enter="queryList" />
+          </el-form-item>
+          <el-form-item>
+            <el-button size="default" type="primary" class="ml10" @click="queryList">
+              <el-icon>
+                <ele-Search />
+              </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="operate('add')">
+				<el-icon>
+					<ele-FolderAdd />
+				</el-icon>
+				新增证书
+			</el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+			<!--  -->
+      <el-table :data="state.tableData.data" v-loading="state.tableData.loading" style="width: 100%">
+        <!-- <el-table-column type="selection" width="55" align="center" /> -->
+        <el-table-column label="ID" align="center" prop="id" width="60" />
+	    	<el-table-column label="证书名称" prop="name" min-width="120" :show-overflow-tooltip="true" />
+	    	<el-table-column label="证书标准" prop="standard" min-width="120" :show-overflow-tooltip="true">
+				<template #default="scope">
+					{{filterStandard(scope.row.standard)}}
+                <!-- <el-button size="small" text type="primary" @click="operate('editParams', scope.row)">编辑</el-button> -->
+                <!-- <el-button size="small" text type="danger" @click="operate('delete', scope.row)">删除</el-button> -->
+            	</template>
+            </el-table-column>
+			<el-table-column label="说明" prop="description" min-width="120" :show-overflow-tooltip="true" />
+			<el-table-column label="操作" width="280" align="center" fixed="right">
+            <template #default="scope">
+                <el-button size="small" text type="primary" @click="operate('editParams', scope.row)">编辑</el-button>
+                <el-button size="small" text type="danger" @click="operate('delete', scope.row)">删除</el-button>
+            </template>
+            </el-table-column>
+      </el-table>
+      <pagination
+				v-show="state.tableData.total>0"
+				:total="state.tableData.total"
+				v-model:page="state.tableData.param.pageNum"
+				v-model:limit="state.tableData.param.pageSize"
+				@pagination="queryList"
+			/>
+    </el-card>
+	<EditParams ref="editParamsRef" @update="queryList"/>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { toRefs, reactive, onMounted, ref, defineComponent, getCurrentInstance } from 'vue';
+import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
+import EditDic from './component/edit.vue';
+import Detail from './component/detail.vue';
+import api from '/@/api/certificateManagement';
+import EditParams from './component/editParams.vue';
+
+// 定义接口来定义对象的类型
+interface TableDataRow {
+	id: number;
+	name: string;
+	code: string;
+	stationId: string;
+	loopTypes: number;
+	energyTypes: number;
+	heatingObject: number;
+	heatingTypes: number;
+	heatingArea: string;
+	forRealArea: string;
+	decade: string;
+	status: number;
+}
+const { proxy } = getCurrentInstance() as any;
+const { network_certificate } = proxy.useDict('network_certificate');
+console.log(network_certificate)
+
+const addDicRef = ref();
+const editDicRef = ref();
+const detailRef = ref();
+const previewRef = ref();
+const editParamsRef = ref();
+const buildConfigRef = ref();
+const queryRef = ref();
+const state = reactive({
+	ids: [],
+	tableData: {
+		data: [],
+		loading: false,
+		param: {
+			pageNum: 1,
+			PageSize: 10,
+            status: -1,
+			name: ""
+		},
+        total: 0
+	},
+});
+// 初始化表格数据
+const initTableData = () => {
+	queryList();
+};
+const queryList = () => {
+	state.tableData.loading = true
+	api.certificateManagement.getList(state.tableData.param).then((res: any) => {
+		console.log(res)
+		state.tableData.data = res.Info || [];
+		state.tableData.loading = false
+		state.tableData.total = res.total
+	});
+};
+
+const filterStandard = (type: any) => {
+	console.log(network_certificate.value)
+	let data  = network_certificate.value;
+	let opt = network_certificate.value.filter((ele: any) => {
+		return ele.value == type
+	})
+	return opt[0].label
+	console.log(opt)
+	// network_certificate.value.forEach((element: object) => {
+	// 	console.log(element)
+	// 	if(type == element.value) {
+	// 		console.log(type)
+	// 		return element.label
+	// 	}
+	// });
+}
+
+// 页面加载时
+onMounted(() => {
+	initTableData();
+});
+/** 重置按钮操作 */
+const resetQuery = (formEl: FormInstance | undefined) => {
+	if (!formEl) return;
+	formEl.resetFields();
+	queryList();
+};
+
+const operate = (type: string, row: any) => {
+	switch(type) {
+		case 'preview':
+			console.log(previewRef.value)
+			previewRef.value.openDialog(row)
+			break
+		case 'add':
+			// console.log(previewRef.value)
+			editParamsRef.value.openDialog()
+			break
+		case 'editParams':
+			editParamsRef.value.openDialog(row)
+			break
+		case 'buildConfig':
+			buildConfigRef.value.openDialog(row)
+			break
+		case 'delete':
+			ElMessageBox.confirm(`是否确认删除编号为"${row.id}"的数据项?`, '提示', {
+				confirmButtonText: '确认',
+				cancelButtonText: '取消',
+				type: 'warning',
+			})
+				.then(() => {
+					api.certificateManagement.del(row.id).then(() => {
+						ElMessage.success('删除成功');
+						queryList();
+					});
+				})
+				.catch(() => {});
+			break
+	}
+}
+</script>

+ 142 - 0
src/views/system/basicConfig/component/editConfig.vue

@@ -0,0 +1,142 @@
+<template>
+  <div class="system-edit-dic-container">
+    <el-dialog :title="(ruleForm.configId!==0?'修改':'添加')+'参数'" v-model="isShowDialog" width="769px">
+      <el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="90px">
+        <el-form-item label="参数名称" prop="configName">
+          <el-input v-model="ruleForm.configName" placeholder="请输入参数名称" />
+        </el-form-item>
+        <el-form-item label="参数键名" prop="configKey">
+          <el-input v-model="ruleForm.configKey" placeholder="请输入参数键名" />
+        </el-form-item>
+        <el-form-item label="参数键值" prop="configValue">
+          <el-input v-model="ruleForm.configValue" placeholder="请输入参数键值" />
+        </el-form-item>
+        <el-form-item label="系统内置" prop="configType">
+          <el-radio-group v-model="ruleForm.configType">
+            <el-radio v-for="dict in sysYesNoOptions" :key="dict.value" :label="Number(dict.value)">{{dict.label}}</el-radio>
+          </el-radio-group>
+        </el-form-item>
+        <el-form-item label="备注" prop="remark">
+          <el-input v-model="ruleForm.remark" type="textarea" placeholder="请输入内容" />
+        </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.configId!==0?'修 改':'添 加'}}</el-button>
+        </span>
+      </template>
+    </el-dialog>
+  </div>
+</template>
+
+<script lang="ts">
+import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
+import { ElMessage } from 'element-plus';
+import api from '/@/api/system';
+interface RuleFormState {
+  configId: number;
+  configName: string;
+  configKey: string;
+  configValue: string;
+  configType: string;
+  remark: string;
+}
+interface DicState {
+  isShowDialog: boolean;
+  ruleForm: RuleFormState;
+  rules: {};
+}
+
+export default defineComponent({
+  name: 'systemEditDicData',
+  props: {
+    sysYesNoOptions: {
+      type: Array,
+      default: () => [],
+    },
+  },
+  setup(prop, { emit }) {
+    const formRef = ref<HTMLElement | null>(null);
+    const state = reactive<DicState>({
+      isShowDialog: false,
+      ruleForm: {
+        configId: 0,
+        configName: '',
+        configKey: '',
+        configValue: '',
+        configType: '0',
+        remark: '',
+      },
+      rules: {
+        configName: [{ required: true, message: '参数名称不能为空', trigger: 'blur' }],
+        configKey: [{ required: true, message: '参数键名不能为空', trigger: 'blur' }],
+        configValue: [{ required: true, message: '参数键值不能为空', trigger: 'blur' }],
+      },
+    });
+    // 打开弹窗
+    const openDialog = (row: RuleFormState | null) => {
+      resetForm();
+      if (row) {
+        api.config.detail(row.configId).then((res: any) => {
+          const data: RuleFormState = res.data.data;
+          data.configType = String(data.configType);
+          state.ruleForm = data;
+        });
+        state.ruleForm = row;
+      }
+      state.isShowDialog = true;
+    };
+    const resetForm = () => {
+      state.ruleForm = {
+        configId: 0,
+        configName: '',
+        configKey: '',
+        configValue: '',
+        configType: '0',
+        remark: '',
+      };
+    };
+    // 关闭弹窗
+    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.configId !== 0) {
+            //修改
+            api.config.edit(state.ruleForm).then(() => {
+              ElMessage.success('参数修改成功');
+              closeDialog(); // 关闭弹窗
+              emit('dataList');
+            });
+          } else {
+            //添加
+            api.config.add(state.ruleForm).then(() => {
+              ElMessage.success('参数添加成功');
+              closeDialog(); // 关闭弹窗
+              emit('dataList');
+            });
+          }
+        }
+      });
+    };
+    return {
+      openDialog,
+      closeDialog,
+      onCancel,
+      onSubmit,
+      formRef,
+      ...toRefs(state),
+    };
+  },
+});
+</script>

+ 133 - 0
src/views/system/basicConfig/index.vue

@@ -0,0 +1,133 @@
+<template>
+  <div class="system-dic-container">
+    <el-card shadow="hover">
+        <el-form :model="state.tableData.param" label-position="top" ref="queryRef" :inline="true" label-width="100px">
+			<div class="form-inner-wrap">
+				<div class="left-wrap">
+					<el-form-item label="系统名称" prop="keyWord">
+						<el-input v-model="state.tableData.param.keyWord" placeholder="请输入系统名称" clearable size="default" />
+					</el-form-item>
+					<el-form-item label="主题色" prop="keyWord">
+						<el-input v-model="state.tableData.param.keyWord" placeholder="请输入主题色" clearable size="default" />
+					</el-form-item>
+					<el-form-item label="高德API Key" prop="keyWord">
+						<el-input v-model="state.tableData.param.keyWord" placeholder="请输入高德API Key" clearable size="default" />
+					</el-form-item>
+					<el-form-item label="base-path" prop="keyWord">
+						<el-input v-model="state.tableData.param.keyWord" placeholder="请输入base-path" clearable size="default" />
+					</el-form-item>
+					<el-row>
+						<el-col :span="12">
+							<el-form-item label="系统logo" prop="keyWord">
+								<uploadVue @set-img="setImg">
+									<img  style="width:140px;height:140px" :src="state.info.avatar1" />
+									<div class="tips">点击上方照片,即可更改头像</div>
+								</uploadVue>
+							</el-form-item>
+						</el-col>
+
+						<el-col :span="12">
+							<el-form-item label="浏览器页签" prop="keyWord">
+								<uploadVue @set-img="setImg">
+									<img  style="width:140px;height:140px" :src="state.info.avatar2" />
+									<div class="tips">点击上方照片,即可更改头像</div>
+								</uploadVue>
+							</el-form-item>
+						</el-col>
+					</el-row>
+					<el-form-item>
+						<el-button size="default" type="primary" class="ml10" @click="queryList">保存</el-button>
+					</el-form-item>
+				</div>
+				<div class="right-wrap">
+					<el-form-item label="登录背景图" prop="keyWord">
+						<uploadVue @set-img="setImg">
+							<img  style="width:140px;height:140px" :src="state.info.avatar3" />
+							<div class="tips">点击上方照片,即可更改头像</div>
+						</uploadVue>
+					</el-form-item>
+				</div>
+			</div>
+        </el-form>
+    </el-card>
+  </div>
+</template>
+
+<script lang="ts" setup>
+import { toRefs, reactive, onMounted, ref, defineComponent, getCurrentInstance } from 'vue';
+import { ElMessageBox, ElMessage, FormInstance } from 'element-plus';
+import api from '/@/api/certificateManagement';
+import uploadVue from '/@/components/upload-wrapper/index.vue';
+
+
+const { proxy } = getCurrentInstance() as any;
+const { network_certificate } = proxy.useDict('network_certificate');
+console.log(network_certificate)
+
+const addDicRef = ref();
+const editDicRef = ref();
+const detailRef = ref();
+const previewRef = ref();
+const editParamsRef = ref();
+const buildConfigRef = ref();
+const queryRef = ref();
+const state = reactive({
+	ids: [],
+	info: {},
+	tableData: {
+		data: [],
+		loading: false,
+		param: {
+			pageNum: 1,
+			PageSize: 10,
+            status: -1,
+			keyWord: ""
+		},
+        total: 0
+	},
+});
+// 初始化表格数据
+const initBasicConfigInfo = () => {
+	queryList();
+};
+const queryList = () => {
+	state.tableData.loading = true
+	api.certificateManagement.getList(state.tableData.param).then((res: any) => {
+		console.log(res)
+		state.tableData.data = res.Info || [];
+		state.tableData.loading = false
+		state.tableData.total = res.total
+	});
+};
+
+const setImg = (img: string) => {
+	console.log(img)
+//   api.user.setAvatar(info.value.id, img).then((res: any) => {
+//     ElMessage.success('更新成功')
+//     info.value.avatar = img
+//   })
+}
+
+// 页面加载时
+onMounted(() => {
+	initBasicConfigInfo();
+});
+
+</script>
+
+
+<style scoped lang="scss">
+:deep(.el-form) {
+	width: 100%;
+}
+:deep(.form-inner-wrap) {
+	width: 100%;
+	display: flex;
+	justify-content: space-between;
+	.left-wrap,
+	.right-wrap {
+		width: 100%;
+	}
+
+}
+</style>