From bbaece97903edc584e917ec3d76183e7e5c69e16 Mon Sep 17 00:00:00 2001 From: 龚焕茏 <2842157468@qq.com> Date: 星期五, 01 三月 2024 11:54:30 +0800 Subject: [PATCH] 安全隐患基础功能 --- vite.config.ts | 4 src/api/dg/dangerInfo/index.ts | 76 ++++ src/api/dg/dangerTotal/index.ts | 63 +++ src/api/dg/dangerInfo/types.ts | 116 ++++++ src/api/dg/dangerTotal/types.ts | 131 +++++++ src/views/dg/danger/total.vue | 311 +++++++++++++++++ src/views/dg/danger/index.vue | 351 +++++++++++++++++++ 7 files changed, 1,050 insertions(+), 2 deletions(-) diff --git a/src/api/dg/dangerInfo/index.ts b/src/api/dg/dangerInfo/index.ts new file mode 100644 index 0000000..6196d28 --- /dev/null +++ b/src/api/dg/dangerInfo/index.ts @@ -0,0 +1,76 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DangerInfoVO, DangerInfoForm, DangerInfoQuery } from '@/api/dg/dangerInfo/types'; + +/** + * 鏌ヨ瀹夊叏闅愭偅淇℃伅鍒楄〃 + * @param query + * @returns {*} + */ + +export const listDangerInfo = (query?: DangerInfoQuery): AxiosPromise<DangerInfoVO[]> => { + return request({ + url: '/demo/dangerInfo/list', + method: 'get', + params: query + }); +}; + +/** + * 鏌ヨ瀹夊叏闅愭偅绫诲瀷鏉′欢 + * @param query + * @returns {*} + */ + +// export const dangerTypes = (): AxiosPromise<String[]> => { +// return request({ +// url: '/demo/dangerInfo/getDangerType', +// method: 'get' +// }); +// }; + +/** + * 鏌ヨ瀹夊叏闅愭偅淇℃伅璇︾粏 + * @param id + */ +export const getDangerInfo = (id: string | number): AxiosPromise<DangerInfoVO> => { + return request({ + url: '/demo/dangerInfo/' + id, + method: 'get' + }); +}; + +/** + * 鏂板瀹夊叏闅愭偅淇℃伅 + * @param data + */ +export const addDangerInfo = (data: DangerInfoForm) => { + return request({ + url: '/demo/dangerInfo', + method: 'post', + data: data + }); +}; + +/** + * 淇敼瀹夊叏闅愭偅淇℃伅 + * @param data + */ +export const updateDangerInfo = (data: DangerInfoForm) => { + return request({ + url: '/demo/dangerInfo', + method: 'put', + data: data + }); +}; + +/** + * 鍒犻櫎瀹夊叏闅愭偅淇℃伅 + * @param id + */ +export const delDangerInfo = (id: string | number | Array<string | number>) => { + return request({ + url: '/demo/dangerInfo/' + id, + method: 'delete' + }); +}; diff --git a/src/api/dg/dangerInfo/types.ts b/src/api/dg/dangerInfo/types.ts new file mode 100644 index 0000000..784e9a6 --- /dev/null +++ b/src/api/dg/dangerInfo/types.ts @@ -0,0 +1,116 @@ +export interface DangerInfoVO { + /** + * 缂栧彿 + */ + id: string | number; + + /** + * 閫氭姤鏃堕棿 + */ + notificationTime: string; + + /** + * 闅愭偅绫诲瀷 + */ + dangerType: string; + + /** + * 璐d换鍗曚綅 + */ + accountabilityUnit: string; + + /** + * 鏁存敼鏃堕檺 + */ + rectificationTimeLimit: string; + + /** + * 瀹屾垚鎯呭喌 + */ + performance: string; + + /** + * 鍚敤鐘舵�� 1鍚敤 2鏈惎鐢� + */ + status: number; + +} + +export interface DangerInfoForm extends BaseEntity { + /** + * 缂栧彿 + */ + id?: string | number; + + /** + * 閫氭姤鏃堕棿 + */ + notificationTime?: string; + + /** + * 闅愭偅绫诲瀷 + */ + dangerType?: string; + + /** + * 璐d换鍗曚綅 + */ + accountabilityUnit?: string; + + /** + * 鏁存敼鏃堕檺 + */ + rectificationTimeLimit?: string; + + /** + * 瀹屾垚鎯呭喌 + */ + performance?: string; + + /** + * 鍚敤鐘舵�� 1鍚敤 2鏈惎鐢� + */ + status?: number; + +} + +export interface DangerInfoQuery extends PageQuery { + + /** + * 閫氭姤鏃堕棿 + */ + notificationTime?: string; + + /** + * 闅愭偅绫诲瀷 + */ + dangerType?: string; + + /** + * 璐d换鍗曚綅 + */ + accountabilityUnit?: string; + + /** + * 鏁存敼鏃堕檺 + */ + rectificationTimeLimit?: string; + + /** + * 瀹屾垚鎯呭喌 + */ + performance?: string; + + /** + * 鍚敤鐘舵�� 1鍚敤 2鏈惎鐢� + */ + status?: number; + + /** + * 鏃ユ湡鑼冨洿鍙傛暟 + */ + params?: any; +} + + + diff --git a/src/api/dg/dangerTotal/index.ts b/src/api/dg/dangerTotal/index.ts new file mode 100644 index 0000000..bdd703c --- /dev/null +++ b/src/api/dg/dangerTotal/index.ts @@ -0,0 +1,63 @@ +import request from '@/utils/request'; +import { AxiosPromise } from 'axios'; +import { DangerTotalVO, DangerTotalForm, DangerTotalQuery } from '@/api/demo/dangerTotal/types'; + +/** + * 鏌ヨ瀹夊叏闅愭偅缁熻鍒楄〃 + * @param query + * @returns {*} + */ + +export const listDangerTotal = (query?: DangerTotalQuery): AxiosPromise<DangerTotalVO[]> => { + return request({ + url: '/demo/dangerTotal/list', + method: 'get', + params: query + }); +}; + +/** + * 鏌ヨ瀹夊叏闅愭偅缁熻璇︾粏 + * @param id + */ +export const getDangerTotal = (id: string | number): AxiosPromise<DangerTotalVO> => { + return request({ + url: '/demo/dangerTotal/' + id, + method: 'get' + }); +}; + +/** + * 鏂板瀹夊叏闅愭偅缁熻 + * @param data + */ +export const addDangerTotal = (data: DangerTotalForm) => { + return request({ + url: '/demo/dangerTotal', + method: 'post', + data: data + }); +}; + +/** + * 淇敼瀹夊叏闅愭偅缁熻 + * @param data + */ +export const updateDangerTotal = (data: DangerTotalForm) => { + return request({ + url: '/demo/dangerTotal', + method: 'put', + data: data + }); +}; + +/** + * 鍒犻櫎瀹夊叏闅愭偅缁熻 + * @param id + */ +export const delDangerTotal = (id: string | number | Array<string | number>) => { + return request({ + url: '/demo/dangerTotal/' + id, + method: 'delete' + }); +}; diff --git a/src/api/dg/dangerTotal/types.ts b/src/api/dg/dangerTotal/types.ts new file mode 100644 index 0000000..d02bf9d --- /dev/null +++ b/src/api/dg/dangerTotal/types.ts @@ -0,0 +1,131 @@ +export interface DangerTotalVO { + /** + * 缂栧彿 + */ + id: string | number; + + /** + * 闀囪鍚嶇О + */ + townStreetName: string; + + /** + * 骞村害/鏈堝害 1骞村害 2鏈堝害 + */ + period: number; + + /** + * 鍛ㄦ湡 + */ + periodDate: string; + + /** + * 鍙戠幇瀹夊叏闅愭偅 + */ + findSecurityRisks: number; + + /** + * 涓嬪彂閫氱煡涔� + */ + issueNotice: number; + + /** + * 澶勭疆瀹夊叏闅愭偅 + */ + dealWithSecurityRisks: number; + + /** + * 鍚敤鐘舵�� 1鍚敤 2鏈惎鐢� + */ + status: number; + +} + +export interface DangerTotalForm extends BaseEntity { + /** + * 缂栧彿 + */ + id?: string | number; + + /** + * 闀囪鍚嶇О + */ + townStreetName?: string; + + /** + * 骞村害/鏈堝害 1骞村害 2鏈堝害 + */ + period?: number; + + /** + * 鍛ㄦ湡 + */ + periodDate?: string; + + /** + * 鍙戠幇瀹夊叏闅愭偅 + */ + findSecurityRisks?: number; + + /** + * 涓嬪彂閫氱煡涔� + */ + issueNotice?: number; + + /** + * 澶勭疆瀹夊叏闅愭偅 + */ + dealWithSecurityRisks?: number; + + /** + * 鍚敤鐘舵�� 1鍚敤 2鏈惎鐢� + */ + status?: number; + +} + +export interface DangerTotalQuery extends PageQuery { + + /** + * 闀囪鍚嶇О + */ + townStreetName?: string; + + /** + * 骞村害/鏈堝害 1骞村害 2鏈堝害 + */ + period?: number; + + /** + * 鍛ㄦ湡 + */ + periodDate?: string; + + /** + * 鍙戠幇瀹夊叏闅愭偅 + */ + findSecurityRisks?: number; + + /** + * 涓嬪彂閫氱煡涔� + */ + issueNotice?: number; + + /** + * 澶勭疆瀹夊叏闅愭偅 + */ + dealWithSecurityRisks?: number; + + /** + * 鍚敤鐘舵�� 1鍚敤 2鏈惎鐢� + */ + status?: number; + + /** + * 鏃ユ湡鑼冨洿鍙傛暟 + */ + params?: any; +} + + + diff --git a/src/views/dg/danger/index.vue b/src/views/dg/danger/index.vue new file mode 100644 index 0000000..733b070 --- /dev/null +++ b/src/views/dg/danger/index.vue @@ -0,0 +1,351 @@ +<template> + <div class="p-2"> + <el-tabs v-model="activeName" class="demo-tabs" @tab-click="handleClick"> + <el-tab-pane label="瀹夊叏闅愭偅" name="first"></el-tab-pane> + <el-tab-pane label="闅愭偅缁熻" name="second"></el-tab-pane> + </el-tabs> + <div v-show="activeName=='first'"> + <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> + <div class="search" v-show="showSearch"> + <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form-item label="闅愭偅绫诲瀷" prop="notificationTime"> + <el-select v-model="queryParams.dangerType" placeholder="璇烽�夋嫨" clearable style="width: 240px" @keyup.enter="handleQuery" > + <el-option v-for="item in dangerTypes" :key="item.dangerType" :label="item.dangerType" :value="item.dangerType"/> + </el-select> + </el-form-item> + <el-form-item label="璐d换鍗曚綅" prop="accountabilityUnit"> + <el-input v-model="queryParams.accountabilityUnit" placeholder="璇疯緭鍏ヨ矗浠诲崟浣�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨" clearable style="width: 240px" @keyup.enter="handleQuery" > + <el-option key="1" label="宸插惎鐢�" value="1" /> + <el-option key="2" label="宸茬鐢�" value="2" /> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> + </el-form-item> + </el-form> + </div> + </transition> + + <el-card shadow="never"> + <template #header> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['demo:dangerInfo:add']">鏂板</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['demo:dangerInfo:edit']">淇敼</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:dangerInfo:remove']">鍒犻櫎</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['demo:dangerInfo:export']">瀵煎嚭</el-button> + </el-col> + <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + </el-row> + </template> + + <el-table v-loading="loading" :data="dangerInfoList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column label="搴忓彿" align="center" type="index" v-if="true" width="60" /> + <el-table-column label="閫氭姤鏃堕棿" align="center" prop="notificationTime" /> + <el-table-column label="闅愭偅绫诲瀷" align="center" prop="dangerType" /> + <el-table-column label="璐d换鍗曚綅" align="center" prop="accountabilityUnit" /> + <el-table-column label="鏁存敼鏃堕檺" align="center" prop="rectificationTimeLimit" /> + <el-table-column label="瀹屾垚鎯呭喌" align="center" prop="performance" /> + <el-table-column label="鐘舵��" align="center" prop="status"> + <template #default="scope"> + <span v-show="scope.row['status'] == 1">宸插惎鐢�</span> + <span v-show="scope.row['status'] == 2" style="color: rgba(227, 70,101);">宸茬鐢�</span> + </template> + </el-table-column> + <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" /> + <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-tooltip content="淇敼" placement="top"> + <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:dangerInfo:edit']"></el-button> + </el-tooltip> + <el-tooltip content="鍒犻櫎" placement="top"> + <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:dangerInfo:remove']"></el-button> + </el-tooltip> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total>0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + </el-card> + <!-- 娣诲姞鎴栦慨鏀瑰畨鍏ㄩ殣鎮d俊鎭璇濇 --> + <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-form ref="dangerInfoFormRef" :model="form" :rules="rules" label-width="80px"> + <el-form-item label="閫氭姤鏃堕棿" prop="notificationTime"> + <el-date-picker v-model="form.notificationTime" type="date" value-format="YYYY-MM-DD" placeholder="璇烽�夋嫨閫氭姤鏃堕棿" /> + </el-form-item> + <el-form-item label="闅愭偅绫诲瀷" prop="dangerType"> + <el-input v-model="form.dangerType" placeholder="璇疯緭鍏ラ殣鎮g被鍨�" /> + </el-form-item> + <el-form-item label="璐d换鍗曚綅" prop="accountabilityUnit"> + <el-input v-model="form.accountabilityUnit" placeholder="璇疯緭鍏ヨ矗浠诲崟浣�" /> + </el-form-item> + <el-form-item label="鏁存敼鏃堕檺" prop="rectificationTimeLimit"> + <el-date-picker v-model="form.rectificationTimeLimit" type="date" value-format="YYYY-MM-DD" placeholder="璇烽�夋嫨鏁存敼鏃堕檺" /> + </el-form-item> + <el-form-item label="瀹屾垚鎯呭喌" prop="performance"> + <el-input v-model="form.performance" placeholder="璇疯緭鍏ュ畬鎴愭儏鍐�" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="form.status" placeholder="璇烽�夋嫨"> + <el-option key="1" label="宸插惎鐢�" :value="1" /> + <el-option key="2" label="宸茬鐢�" :value="2" /> + </el-select> + </el-form-item> + <el-upload + label="涓婁紶鍥剧墖" + v-model:file-list="fileList" + action="https://run.mocky.io/v3/9d059bf9-4660-45f2-925d-ce80ad6c4d15" + list-type="picture-card" + :on-preview="handlePictureCardPreview" + :on-remove="handleRemove" + > + <el-icon><Plus /></el-icon> + </el-upload> + + <el-dialog v-model="dialogVisible"> + <img w-full :src="dialogImageUrl" alt="Preview Image" /> + </el-dialog> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button> + <el-button @click="cancel">鍙� 娑�</el-button> + </div> + </template> + </el-dialog> + </div> + <div v-show="activeName=='second'"> + 2 + </div> + + </div> +</template> + +<script setup name="DangerInfo" lang="ts"> +import { listDangerInfo, getDangerInfo, delDangerInfo, addDangerInfo, updateDangerInfo } from '@/api/dg/dangerInfo'; +import { DangerInfoVO, DangerInfoQuery, DangerInfoForm } from '@/api/dg/dangerInfo/types'; +import type { TabsPaneContext, UploadProps, UploadUserFile } from "element-plus"; +const fileList = ref<UploadUserFile[]>([]) + +const dialogImageUrl = ref('') +const dialogVisible = ref(false) + +const handleRemove: UploadProps['onRemove'] = (uploadFile, uploadFiles) => { + console.log(uploadFile, uploadFiles) +} + +const handlePictureCardPreview: UploadProps['onPreview'] = (uploadFile) => { + dialogImageUrl.value = uploadFile.url! + dialogVisible.value = true +} +const activeName = ref('first') +const handleClick = (tab: TabsPaneContext) => { + tab.props.label +} +const { proxy } = getCurrentInstance() as ComponentInternalInstance; + +const activeIndex = ref('1') +const activeIndex2 = ref('1') +const handleSelect = (key: string, keyPath: string[]) => { + console.log(key, keyPath) +} + +const dangerInfoList = ref<DangerInfoVO[]>([]); +const buttonLoading = ref(false); +const loading = ref(true); +const showSearch = ref(true); +const ids = ref<Array<string | number>>([]); +const single = ref(true); +const multiple = ref(true); +const total = ref(0); + +const queryFormRef = ref<ElFormInstance>(); +const dangerInfoFormRef = ref<ElFormInstance>(); + +const dialog = reactive<DialogOption>({ + visible: false, + title: '' +}); + +const dangerTypes = [ + { + dangerType: '閬撹矾闅愭偅' + }]; + +const initFormData: DangerInfoForm = { + id: undefined, + notificationTime: undefined, + dangerType: undefined, + accountabilityUnit: undefined, + rectificationTimeLimit: undefined, + performance: undefined, + status: 1, +} +const data = reactive<PageData<DangerInfoForm, DangerInfoQuery>>({ + form: {...initFormData}, + queryParams: { + pageNum: 1, + pageSize: 10, + notificationTime: undefined, + dangerType: undefined, + accountabilityUnit: undefined, + rectificationTimeLimit: undefined, + performance: undefined, + status: undefined, + params: { + } + }, + rules: { + id: [ + { required: true, message: "缂栧彿涓嶈兘涓虹┖", trigger: "blur" } + ], + notificationTime: [ + { required: true, message: "閫氭姤鏃堕棿涓嶈兘涓虹┖", trigger: "blur" } + ], + dangerType: [ + { required: true, message: "闅愭偅绫诲瀷涓嶈兘涓虹┖", trigger: "change" } + ], + accountabilityUnit: [ + { required: true, message: "璐d换鍗曚綅涓嶈兘涓虹┖", trigger: "blur" } + ], + rectificationTimeLimit: [ + { required: true, message: "鏁存敼鏃堕檺涓嶈兘涓虹┖", trigger: "blur" } + ], + performance: [ + { required: true, message: "瀹屾垚鎯呭喌涓嶈兘涓虹┖", trigger: "blur" } + ], + status: [ + { required: true, message: "鍚敤鐘舵�� 1鍚敤 2鏈惎鐢ㄤ笉鑳戒负绌�", trigger: "change" } + ], + periodName: [ + { required: true, message: "鍛ㄦ湡涓嶈兘涓虹┖", trigger: "blur" } + ], + periodYear: [ + { required: true, message: "鍛ㄦ湡骞翠笉鑳戒负绌�", trigger: "blur" } + ], + periodMonth: [ + { required: true, message: "鍛ㄦ湡鏈堜笉鑳戒负绌�", trigger: "blur" } + ] + } +}); + +const { queryParams, form, rules } = toRefs(data); + +/** 鏌ヨ瀹夊叏闅愭偅淇℃伅鍒楄〃 */ +const getList = async () => { + loading.value = true; + const res = await listDangerInfo(queryParams.value); + dangerInfoList.value = res.rows; + total.value = res.total; + loading.value = false; +} + +/** 鏌ヨ瀹夊叏闅愭偅绫诲瀷鏌ヨ鏉′欢 */ +const getDangerTypes = async () => { + // dangerTypes.value = await getDangerTypes(); +} + +/** 鍙栨秷鎸夐挳 */ +const cancel = () => { + reset(); + dialog.visible = false; +} + +/** 琛ㄥ崟閲嶇疆 */ +const reset = () => { + form.value = {...initFormData}; + dangerInfoFormRef.value?.resetFields(); +} + +/** 鎼滅储鎸夐挳鎿嶄綔 */ +const handleQuery = () => { + queryParams.value.pageNum = 1; + getList(); +} + +/** 閲嶇疆鎸夐挳鎿嶄綔 */ +const resetQuery = () => { + queryFormRef.value?.resetFields(); + handleQuery(); +} + +/** 澶氶�夋閫変腑鏁版嵁 */ +const handleSelectionChange = (selection: DangerInfoVO[]) => { + ids.value = selection.map(item => item.id); + single.value = selection.length != 1; + multiple.value = !selection.length; +} + +/** 鏂板鎸夐挳鎿嶄綔 */ +const handleAdd = () => { + reset(); + dialog.visible = true; + dialog.title = "娣诲姞瀹夊叏闅愭偅淇℃伅"; +} + +/** 淇敼鎸夐挳鎿嶄綔 */ +const handleUpdate = async (row?: DangerInfoVO) => { + reset(); + const _id = row?.id || ids.value[0] + const res = await getDangerInfo(_id); + Object.assign(form.value, res.data); + dialog.visible = true; + dialog.title = "淇敼瀹夊叏闅愭偅淇℃伅"; +} + +/** 鎻愪氦鎸夐挳 */ +const submitForm = () => { + dangerInfoFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + buttonLoading.value = true; + if (form.value.id) { + await updateDangerInfo(form.value).finally(() => buttonLoading.value = false); + } else { + await addDangerInfo(form.value).finally(() => buttonLoading.value = false); + } + proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + dialog.visible = false; + await getList(); + } + }); +} + +/** 鍒犻櫎鎸夐挳鎿嶄綔 */ +const handleDelete = async (row?: DangerInfoVO) => { + if(row?.status == 1) { proxy?.$modal.msgWarning("褰撳墠涓哄凡鍚敤鐘舵�侊紝涓嶆敮鎸佸垹闄�"); return; } + const _ids = row?.id || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀹夊叏闅愭偅淇℃伅缂栧彿涓�"' + _ids + '"鐨勬暟鎹」锛�').finally(() => loading.value = false); + await delDangerInfo(_ids); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + await getList(); +} + +/** 瀵煎嚭鎸夐挳鎿嶄綔 */ +const handleExport = () => { + proxy?.download('demo/dangerInfo/export', { + ...queryParams.value + }, `dangerInfo_${new Date().getTime()}.xlsx`) +} + +onMounted(() => { + getList(); + getDangerTypes(); +}); +</script> diff --git a/src/views/dg/danger/total.vue b/src/views/dg/danger/total.vue new file mode 100644 index 0000000..9b260f7 --- /dev/null +++ b/src/views/dg/danger/total.vue @@ -0,0 +1,311 @@ +<template> + <div class="p-2"> + <transition :enter-active-class="proxy?.animate.searchAnimate.enter" :leave-active-class="proxy?.animate.searchAnimate.leave"> + <div class="search" v-show="showSearch"> + <el-form :model="queryParams" ref="queryFormRef" :inline="true" label-width="68px"> + <el-form-item label="闀囪鍚嶇О" prop="townStreetName"> + <el-input v-model="queryParams.townStreetName" placeholder="璇疯緭鍏ラ晣琛楀悕绉�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="缁熻鍛ㄦ湡" prop="periodDate"> + <el-input v-model="queryParams.periodDate" placeholder="璇疯緭鍏ョ粺璁″懆鏈�" clearable style="width: 240px" @keyup.enter="handleQuery" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status"> + <el-select v-model="queryParams.status" placeholder="璇烽�夋嫨" clearable style="width: 240px" @keyup.enter="handleQuery" > + <el-option key="1" label="宸插惎鐢�" value="1" /> + <el-option key="2" label="宸茬鐢�" value="2" /> + </el-select> + </el-form-item> + <el-form-item> + <el-button type="primary" icon="Search" @click="handleQuery">鎼滅储</el-button> + <el-button icon="Refresh" @click="resetQuery">閲嶇疆</el-button> + </el-form-item> + </el-form> + </div> + </transition> + + <el-card shadow="never"> + <template #header> + <el-row :gutter="10" class="mb8"> + <el-col :span="1.5"> + <el-button type="primary" plain icon="Plus" @click="handleAdd" v-hasPermi="['demo:dangerTotal:add']">鏂板</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="success" plain icon="Edit" :disabled="single" @click="handleUpdate()" v-hasPermi="['demo:dangerTotal:edit']">淇敼</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="danger" plain icon="Delete" :disabled="multiple" @click="handleDelete()" v-hasPermi="['demo:dangerTotal:remove']">鍒犻櫎</el-button> + </el-col> + <el-col :span="1.5"> + <el-button type="warning" plain icon="Download" @click="handleExport" v-hasPermi="['demo:dangerTotal:export']">瀵煎嚭</el-button> + </el-col> + <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar> + </el-row> + </template> + + <el-table v-loading="loading" :data="dangerTotalList" @selection-change="handleSelectionChange"> + <el-table-column type="selection" width="55" align="center" /> + <el-table-column label="搴忓彿" align="center" type="index" v-if="true" width="60" /> + <el-table-column label="闀囪鍚嶇О" align="center" prop="townStreetName" /> + <el-table-column label="缁熻鍛ㄦ湡" align="center" prop="periodDate" /> + <el-table-column label="鍙戠幇瀹夊叏闅愭偅" align="center" prop="findSecurityRisks" /> + <el-table-column label="涓嬪彂閫氱煡涔�" align="center" prop="issueNotice" /> + <el-table-column label="澶勭疆瀹夊叏闅愭偅" align="center" prop="dealWithSecurityRisks" /> + <el-table-column label="鐘舵��" align="center" prop="status"> + <template #default="scope"> + <span v-show="scope.row['status'] == 1">宸插惎鐢�</span> + <span v-show="scope.row['status'] == 2" style="color: rgba(227, 70,101);">宸茬鐢�</span> + </template> + </el-table-column> + <el-table-column label="鍒涘缓鏃堕棿" align="center" prop="createTime" /> + <el-table-column label="鎿嶄綔" align="center" class-name="small-padding fixed-width"> + <template #default="scope"> + <el-tooltip content="淇敼" placement="top"> + <el-button link type="primary" icon="Edit" @click="handleUpdate(scope.row)" v-hasPermi="['demo:dangerTotal:edit']"></el-button> + </el-tooltip> + <el-tooltip content="鍒犻櫎" placement="top"> + <el-button link type="primary" icon="Delete" @click="handleDelete(scope.row)" v-hasPermi="['demo:dangerTotal:remove']"></el-button> + </el-tooltip> + </template> + </el-table-column> + </el-table> + + <pagination + v-show="total>0" + :total="total" + v-model:page="queryParams.pageNum" + v-model:limit="queryParams.pageSize" + @pagination="getList" + /> + </el-card> + <!-- 娣诲姞鎴栦慨鏀瑰畨鍏ㄩ殣鎮g粺璁″璇濇 --> + <el-dialog :title="dialog.title" v-model="dialog.visible" width="500px" append-to-body> + <el-form ref="dangerTotalFormRef" :model="form" :rules="rules" label-width="80px"> + <el-form-item label="闀囪鍚嶇О" prop="townStreetName" label-width="100"> + <!-- <el-input v-model="form.townStreetName" placeholder="璇疯緭鍏ラ晣琛楀悕绉�" /> --> + <el-select v-model="form.townStreetName" placeholder="璇烽�夋嫨" clearable style="width: 240px" @keyup.enter="handleQuery" > + <el-option v-for="item in townStreetNames" :key="item.townStreetName" :label="item.townStreetName" :value="item.townStreetName"/> + </el-select> + </el-form-item> + <el-form-item label="缁熻鍛ㄦ湡" prop="periodDate" label-width="100"> + <el-select v-model="form.period" placeholder="璇烽�夋嫨" style="width: 100px;"> + <el-option key="1" label="骞村害" :value="1" /> + <el-option key="2" label="鏈堝害" :value="2" /> + </el-select> + + <el-date-picker v-model="form.periodDate" :type="pickerType" :value-format="pickerFormat" placeholder="璇烽�夋嫨缁熻鍛ㄦ湡" /> + </el-form-item> + <el-form-item label="鍙戠幇闅愭偅" prop="findSecurityRisks" label-width="100"> + <el-input v-model="form.findSecurityRisks" placeholder="璇疯緭鍏ュ彂鐜板畨鍏ㄩ殣鎮�" /> + </el-form-item> + <el-form-item label="涓嬪彂閫氱煡涔�" prop="issueNotice" label-width="100"> + <el-input v-model="form.issueNotice" placeholder="璇疯緭鍏ヤ笅鍙戦�氱煡涔�" /> + </el-form-item> + <el-form-item label="澶勭疆闅愭偅" prop="dealWithSecurityRisks" label-width="100"> + <el-input v-model="form.dealWithSecurityRisks" placeholder="璇疯緭鍏ュ缃畨鍏ㄩ殣鎮�" /> + </el-form-item> + <el-form-item label="鐘舵��" prop="status" label-width="100"> + <el-select v-model="form.status" placeholder="璇烽�夋嫨"> + <el-option key="1" label="宸插惎鐢�" :value="1" /> + <el-option key="2" label="宸茬鐢�" :value="2" /> + </el-select> + </el-form-item> + </el-form> + <template #footer> + <div class="dialog-footer"> + <el-button :loading="buttonLoading" type="primary" @click="submitForm">纭� 瀹�</el-button> + <el-button @click="cancel">鍙� 娑�</el-button> + </div> + </template> + </el-dialog> + </div> +</template> + +<script setup name="DangerTotal" lang="ts"> +import { listDangerTotal, getDangerTotal, delDangerTotal, addDangerTotal, updateDangerTotal } from '@/api/dg/dangerTotal'; +import { DangerTotalVO, DangerTotalQuery, DangerTotalForm } from '@/api/dg/dangerTotal/types'; + +const { proxy } = getCurrentInstance() as ComponentInternalInstance; + +const dangerTotalList = ref<DangerTotalVO[]>([]); +const buttonLoading = ref(false); +const loading = ref(true); +const showSearch = ref(true); +const ids = ref<Array<string | number>>([]); +const single = ref(true); +const multiple = ref(true); +const total = ref(0); + +const queryFormRef = ref<ElFormInstance>(); +const dangerTotalFormRef = ref<ElFormInstance>(); + +const dialog = reactive<DialogOption>({ + visible: false, + title: '' +}); + +const townStreetNames = [ + { + townStreetName: '骞哥琛楅亾', + }, + { + townStreetName: '閾舵潖琛楅亾' + }]; + +const initFormData: DangerTotalForm = { + id: undefined, + townStreetName: undefined, + period: 1, + periodDate: undefined, + findSecurityRisks: undefined, + issueNotice: undefined, + dealWithSecurityRisks: undefined, + status: undefined +} +const data = reactive<PageData<DangerTotalForm, DangerTotalQuery>>({ + form: {...initFormData}, + queryParams: { + pageNum: 1, + pageSize: 10, + townStreetName: undefined, + period: undefined, + periodDate: undefined, + findSecurityRisks: undefined, + issueNotice: undefined, + dealWithSecurityRisks: undefined, + status: undefined, + params: { + } + }, + rules: { + id: [ + { required: true, message: "缂栧彿涓嶈兘涓虹┖", trigger: "blur" } + ], + townStreetName: [ + { required: true, message: "闀囪鍚嶇О涓嶈兘涓虹┖", trigger: "blur" } + ], + period: [ + { required: true, message: "骞村害/鏈堝害 1骞村害 2鏈堝害涓嶈兘涓虹┖", trigger: "blur" } + ], + periodDate: [ + { required: true, message: "鍛ㄦ湡涓嶈兘涓虹┖", trigger: "blur" } + ], + findSecurityRisks: [ + { required: true, message: "鍙戠幇瀹夊叏闅愭偅涓嶈兘涓虹┖", trigger: "blur" } + ], + issueNotice: [ + { required: true, message: "涓嬪彂閫氱煡涔︿笉鑳戒负绌�", trigger: "blur" } + ], + dealWithSecurityRisks: [ + { required: true, message: "澶勭疆瀹夊叏闅愭偅涓嶈兘涓虹┖", trigger: "blur" } + ], + status: [ + { required: true, message: "鍚敤鐘舵�� 1鍚敤 2鏈惎鐢ㄤ笉鑳戒负绌�", trigger: "change" } + ] + } +}); + +const { queryParams, form, rules } = toRefs(data); + +/** 鏌ヨ瀹夊叏闅愭偅缁熻鍒楄〃 */ +const getList = async () => { + loading.value = true; + const res = await listDangerTotal(queryParams.value); + dangerTotalList.value = res.rows; + total.value = res.total; + loading.value = false; +} + +/** 鍙栨秷鎸夐挳 */ +const cancel = () => { + reset(); + dialog.visible = false; +} + +/** 琛ㄥ崟閲嶇疆 */ +const reset = () => { + form.value = {...initFormData}; + dangerTotalFormRef.value?.resetFields(); +} + +/** 鎼滅储鎸夐挳鎿嶄綔 */ +const handleQuery = () => { + queryParams.value.pageNum = 1; + getList(); +} + +/** 閲嶇疆鎸夐挳鎿嶄綔 */ +const resetQuery = () => { + queryFormRef.value?.resetFields(); + handleQuery(); +} + +/** 澶氶�夋閫変腑鏁版嵁 */ +const handleSelectionChange = (selection: DangerTotalVO[]) => { + ids.value = selection.map(item => item.id); + single.value = selection.length != 1; + multiple.value = !selection.length; +} + +/** 鏂板鎸夐挳鎿嶄綔 */ +const handleAdd = () => { + reset(); + dialog.visible = true; + dialog.title = "娣诲姞瀹夊叏闅愭偅缁熻"; +} + +/** 淇敼鎸夐挳鎿嶄綔 */ +const handleUpdate = async (row?: DangerTotalVO) => { + reset(); + const _id = row?.id || ids.value[0] + const res = await getDangerTotal(_id); + Object.assign(form.value, res.data); + dialog.visible = true; + dialog.title = "淇敼瀹夊叏闅愭偅缁熻"; +} + +/** 鎻愪氦鎸夐挳 */ +const submitForm = () => { + dangerTotalFormRef.value?.validate(async (valid: boolean) => { + if (valid) { + buttonLoading.value = true; + if (form.value.id) { + await updateDangerTotal(form.value).finally(() => buttonLoading.value = false); + } else { + await addDangerTotal(form.value).finally(() => buttonLoading.value = false); + } + proxy?.$modal.msgSuccess("淇敼鎴愬姛"); + dialog.visible = false; + await getList(); + } + }); +} + +/** 鍒犻櫎鎸夐挳鎿嶄綔 */ +const handleDelete = async (row?: DangerTotalVO) => { + const _ids = row?.id || ids.value; + await proxy?.$modal.confirm('鏄惁纭鍒犻櫎瀹夊叏闅愭偅缁熻缂栧彿涓�"' + _ids + '"鐨勬暟鎹」锛�').finally(() => loading.value = false); + await delDangerTotal(_ids); + proxy?.$modal.msgSuccess("鍒犻櫎鎴愬姛"); + await getList(); +} + +/** 瀵煎嚭鎸夐挳鎿嶄綔 */ +const handleExport = () => { + proxy?.download('demo/dangerTotal/export', { + ...queryParams.value + }, `dangerTotal_${new Date().getTime()}.xlsx`) +} + +onMounted(() => { + getList(); +}); + +/** 鍛ㄦ湡骞存垨鏈� */ +const pickerType = computed(() => { + return form.value.period === 1 ? 'year' : 'month'; +}); + +const pickerFormat = computed(() => { + return form.value.period === 1 ? 'YYYY' : 'YYYY-MM'; +}); +</script> diff --git a/vite.config.ts b/vite.config.ts index 73449ef..f560144 100644 --- a/vite.config.ts +++ b/vite.config.ts @@ -26,8 +26,8 @@ open: true, proxy: { [env.VITE_APP_BASE_API]: { - target: 'http://192.168.3.43:8080', - // target: 'http://localhost:8080', + // target: 'http://192.168.3.43:8080', + target: 'http://localhost:8080', changeOrigin: true, rewrite: (path) => path.replace(new RegExp('^' + env.VITE_APP_BASE_API), '') } -- Gitblit v1.8.0