Преглед изворни кода

Merge branch 'master' of http://git.mydig.net/Sagoo-Cloud/sagoo-admin-ui

vera_min пре 2 година
родитељ
комит
a63c316cb7
44 измењених фајлова са 4401 додато и 6291 уклоњено
  1. 0 1
      src/api/heatingDistrict/index.ts
  2. 60 0
      src/components/upload-wrapper/index.vue
  3. 54 0
      src/components/vue3cron/language/cn.js
  4. 54 0
      src/components/vue3cron/language/en.js
  5. 9 0
      src/components/vue3cron/language/index.js
  6. 54 0
      src/components/vue3cron/language/pt_br.js
  7. 833 0
      src/components/vue3cron/vue3cron.vue
  8. 1 1
      src/router/backEnd.ts
  9. 3 0
      src/utils/request.ts
  10. 1 1
      src/views/heating/energyAnalysis/loopEnergyCostPerformanceAppraisal/index.vue
  11. 0 200
      src/views/heating/heatStation/heatingDistrict/floorManage/component/detail.vue
  12. 0 193
      src/views/heating/heatStation/heatingDistrict/floorManage/component/edit.vue
  13. 0 250
      src/views/heating/heatStation/heatingDistrict/floorManage/index.vue
  14. 0 200
      src/views/heating/heatStation/heatingDistrict/regionalManage/component/detail.vue
  15. 0 166
      src/views/heating/heatStation/heatingDistrict/regionalManage/component/edit.vue
  16. 0 226
      src/views/heating/heatStation/heatingDistrict/regionalManage/index.vue
  17. 0 200
      src/views/heating/heatStation/heatingDistrict/residentManage/component/detail.vue
  18. 0 278
      src/views/heating/heatStation/heatingDistrict/residentManage/component/edit.vue
  19. 0 318
      src/views/heating/heatStation/heatingDistrict/residentManage/index.vue
  20. 0 200
      src/views/heating/heatStation/heatingDistrict/unitManage/component/detail.vue
  21. 0 221
      src/views/heating/heatStation/heatingDistrict/unitManage/component/edit.vue
  22. 0 260
      src/views/heating/heatStation/heatingDistrict/unitManage/index.vue
  23. 440 418
      src/views/heating/monitor/weather.vue
  24. 74 77
      src/views/iot/device/category/index.vue
  25. 634 648
      src/views/iot/device/instance/detail.vue
  26. 145 148
      src/views/iot/device/instance/index.vue
  27. 108 108
      src/views/iot/rule-engine/send.vue
  28. 11 62
      src/views/login/component/account.vue
  29. 62 131
      src/views/personal/index.vue
  30. 70 70
      src/views/system/api/index.vue
  31. 9 48
      src/views/system/assess/totalIndex/index.vue
  32. 139 140
      src/views/system/city/index.vue
  33. 196 211
      src/views/system/config/index.vue
  34. 30 2
      src/views/system/datahub/modeling/component/edit.vue
  35. 180 194
      src/views/system/datahub/modeling/detail.vue
  36. 193 216
      src/views/system/datahub/modeling/index.vue
  37. 43 42
      src/views/system/datahub/source/component/edit.vue
  38. 1 1
      src/views/system/datahub/source/component/editNode.vue
  39. 235 261
      src/views/system/datahub/source/index.vue
  40. 128 128
      src/views/system/dict/dataList.vue
  41. 195 224
      src/views/system/dict/index.vue
  42. 94 93
      src/views/system/menu/component/btn.vue
  43. 111 119
      src/views/system/menu/index.vue
  44. 234 235
      src/views/system/task/index.vue

+ 0 - 1
src/api/heatingDistrict/index.ts

@@ -35,7 +35,6 @@ export default {
     setStatus: (id: number, status: number) => put('/region/unit/editStatus', { id, status }),
   },
   resident: {
-    allList: (params: object) => get('/region/resident/all', params),
     getList: (params: object) => get('/region/resident/list', params),
     add: (data: object) => post('/region/resident/add', data),
     edit: (data: object) => put('/region/resident/edit', data),

+ 60 - 0
src/components/upload-wrapper/index.vue

@@ -0,0 +1,60 @@
+<template>
+  <div class="upload">
+    <el-upload class="hide" :accept="accept" :limit="1" :multiple="multiple" :headers="headers" :before-upload="beforeAvatarUpload" :action="uploadUrl" :on-success="updateImg">
+      <slot></slot>
+    </el-upload>
+  </div>
+</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 uploadUrl: string = getOrigin(import.meta.env.VITE_API_URL + '/common/singleImg');
+
+const headers = {
+  Authorization: 'Bearer ' + JSON.parse(sessionStorage.token),
+};
+
+const emit = defineEmits(['setImg', 'setImgs']);
+
+const props = defineProps({
+  multiple: {
+    type: Boolean,
+    default: false,
+  },
+  accept: {
+    type: String,
+    default: '.jpg,.png,.jpeg,.gif',
+  },
+});
+
+const updateImg = (res: any) => {
+  const url = getOrigin(import.meta.env.VITE_SERVER_URL + '/' + res.data?.path)
+
+  emit('setImg', url);
+};
+
+const beforeAvatarUpload: UploadProps['beforeUpload'] = (rawFile) => {
+  if (rawFile.size / 1024 / 1024 > 2) {
+    ElMessage.error('图片不能超过2MB!');
+    return false;
+  }
+  return true;
+};
+</script>
+
+<style scoped>
+.hide ::v-deep(.el-upload-list) {
+	display: none;
+}
+
+.preview {
+	max-width: 100%;
+	max-height: 60vh;
+	display: block;
+	margin: 0 auto;
+}
+</style>

+ 54 - 0
src/components/vue3cron/language/cn.js

@@ -0,0 +1,54 @@
+export default {
+    Seconds:{
+        name:'秒',
+        every:'每一秒钟',
+        interval:['每隔','秒执行 从','秒开始'],
+        specific:'具体秒数(可多选)',
+        cycle:['周期从','到','秒']
+    },
+    Minutes:{
+        name:'分',
+        every:'每一分钟',
+        interval:['每隔','分执行 从','分开始'],
+        specific:'具体分钟数(可多选)',
+        cycle:['周期从','到','分']
+    },
+    Hours:{
+        name:'时',
+        every:'每一小时',
+        interval:['每隔','小时执行 从','小时开始'],
+        specific:'具体小时数(可多选)',
+        cycle:['周期从','到','小时']
+    },
+    Day:{
+        name:'天',
+        every:'每一天',
+        intervalWeek:['每隔','周执行 从','开始'],
+        intervalDay:['每隔','天执行 从','天开始'],
+        specificWeek:'具体星期几(可多选)',
+        specificDay:'具体天数(可多选)',
+        lastDay:'在这个月的最后一天',
+        lastWeekday:'在这个月的最后一个工作日',
+        lastWeek:['在这个月的最后一个'],
+        beforeEndMonth:['在本月底前','天'],
+        nearestWeekday:['最近的工作日(周一至周五)至本月','日'],
+        someWeekday:['在这个月的第','个'],
+    },
+    Week:['天','一','二','三','四','五','六'].map(val=>'星期'+val),
+    Month:{
+        name:'月',
+        every:'每一月',
+        interval:['每隔','月执行 从','月开始'],
+        specific:'具体月数(可多选)',
+        cycle:['从','到','月之间的每个月']
+    },
+    Year:{
+        name:'年',
+        every:'每一年',
+        interval:['每隔','年执行 从','年开始'],
+        specific:'具体年份(可多选)',
+        cycle:['从','到','年之间的每一年']
+    },
+    Save:'保存',
+    Close:'关闭'
+}

+ 54 - 0
src/components/vue3cron/language/en.js

@@ -0,0 +1,54 @@
+export default {
+    Seconds:{
+        name:'Seconds',
+        every:'Every second',
+        interval:['Every','second(s) starting at second'],
+        specific:'Specific second (choose one or many)',
+        cycle:['Every second between second','and second']
+    },
+    Minutes:{
+        name:'Minutes',
+        every:'Every minute',
+        interval:['Every','minute(s) starting at minute'],
+        specific:'Specific minute (choose one or many)',
+        cycle:['Every minute between minute','and minute']
+    },
+    Hours:{
+        name:'Hours',
+        every:'Every hour',
+        interval:['Every','hour(s) starting at hour'],
+        specific:'Specific hour (choose one or many)',
+        cycle:['Every hour between hour','and hour']
+    },
+    Day:{
+        name:'Day',
+        every:'Every day',
+        intervalWeek:['Every','day(s) starting on'],
+        intervalDay:['Every','day(s) starting at the','of the month'],
+        specificWeek:'Specific day of week (choose one or many)',
+        specificDay:'Specific day of month (choose one or many)',
+        lastDay:'On the last day of the month',
+        lastWeekday:'On the last weekday of the month',
+        lastWeek:['On the last',' of the month'],
+        beforeEndMonth:['day(s) before the end of the month'],
+        nearestWeekday:['Nearest weekday (Monday to Friday) to the','of the month'],
+        someWeekday:['On the','of the month'],
+    },
+    Week:['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
+    Month:{
+        name:'Month',
+        every:'Every month',
+        interval:['Every','month(s) starting in'],
+        specific:'Specific month (choose one or many)',
+        cycle:['Every month between','and']
+    },
+    Year:{
+        name:'Year',
+        every:'Any year',
+        interval:['Every','year(s) starting in'],
+        specific:'Specific year (choose one or many)',
+        cycle:['Every year between','and']
+    },
+    Save:'Save',
+    Close:'Close'
+}

+ 9 - 0
src/components/vue3cron/language/index.js

@@ -0,0 +1,9 @@
+import en from './en'
+import cn from './cn'
+import pt from './pt_br'
+
+export default {
+    en,
+    cn,
+    pt
+}

+ 54 - 0
src/components/vue3cron/language/pt_br.js

@@ -0,0 +1,54 @@
+export default {
+    Seconds:{
+        name:'Segundos',
+        every:'A cada segundo',
+        interval:['A cada','segundo(s) começando no segundo'],
+        specific:'Segundo específico (escolha um ou muitos)',
+        cycle:['A Cada segundo entre segundos','e segundo']
+    },
+    Minutes:{
+        name:'Minutos',
+        every:'A cada minuto',
+        interval:['A cada','minuto(s) começando no minuto'],
+        specific:'Minuto específico (escolha um ou muitos)',
+        cycle:['A cada minuto entre minutos','e minutos']
+    },
+    Hours:{
+        name:'Horas',
+        every:'A cada hora',
+        interval:['A cada','hora(s) começando na hora'],
+        specific:'Hora específica (escolha uma ou muitas)',
+        cycle:['A cada hora entre horas','e horas']
+    },
+    Day:{
+        name:'Dia',
+        every:'A cada dia',
+        intervalWeek:['A cada','dia(s) começando em'],
+        intervalDay:['A cada','dia(s) começando no','do mês'],
+        specificWeek:'Dia específico da semana (escolha um ou vários)',
+        specificDay:'Dia específico do mês (escolha um ou vários)',
+        lastDay:'No último dia do mês',
+        lastWeekday:'No último dia da semana do mês',
+        lastWeek:['No último',' do mês'],
+        beforeEndMonth:['dia(s) antes do final do mês'],
+        nearestWeekday:['Dia da semana mais próximo (segunda a sexta) ao ','do mês'],
+        someWeekday:['No','do mês'],
+    },
+    Week:['Domingo','Segunda-feira','Terça-feira','Quarta-feira','Quinta-feira','Sexta-feira','Sábado'],
+    Month:{
+        name:'Mês',
+        every:'A cada mês',
+        interval:['A cada','mês(es) começando em'],
+        specific:'Mês específico (escolha um ou muitos)',
+        cycle:['Todo mês entre','e']
+    },
+    Year:{
+        name:'Ano',
+        every:'Qualquer ano',
+        interval:['A cada','ano(s) começando em'],
+        specific:'Ano específico (escolha um ou muitos)',
+        cycle:['Todo ano entre','e']
+    },
+    Save:'Salvar',
+    Close:'Fechar'
+}

+ 833 - 0
src/components/vue3cron/vue3cron.vue

@@ -0,0 +1,833 @@
+
+<template>
+    <div class="vue3-cron-div">
+        <!-- <el-button class="language" type="text" @click="state.language = state.language === 'en' ? 'cn' : 'en'">{{
+            state.language === 'en' ? 'cn' : 'en'
+        }}</el-button> -->
+        <el-tabs type="border-card">
+            <el-tab-pane>
+                <template #label>
+                    <span><i class="el-icon-date"></i> {{ state.text.Seconds.name }}</span>
+                </template>
+                <div class="tabBody myScroller" :style="{ 'max-height': maxHeight }">
+                    <el-row>
+                        <el-radio v-model="state.second.cronEvery" label="1">{{ state.text.Seconds.every }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.second.cronEvery" label="2"
+                            >{{ state.text.Seconds.interval[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.second.incrementIncrement"
+                                :min="1"
+                                :max="60"
+                            ></el-input-number>
+                            {{ state.text.Seconds.interval[1] || '' }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.second.incrementStart"
+                                :min="0"
+                                :max="59"
+                            ></el-input-number>
+                            {{ state.text.Seconds.interval[2] || '' }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio class="long" v-model="state.second.cronEvery" label="3"
+                            >{{ state.text.Seconds.specific }}
+                            <el-select size="small" multiple v-model="state.second.specificSpecific">
+                                <el-option v-for="(val, index) in 60" :key="index" :value="val - 1">{{
+                                    val - 1
+                                }}</el-option>
+                            </el-select>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.second.cronEvery" label="4"
+                            >{{ state.text.Seconds.cycle[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.second.rangeStart"
+                                :min="1"
+                                :max="60"
+                            ></el-input-number>
+                            {{ state.text.Seconds.cycle[1] || '' }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.second.rangeEnd"
+                                :min="0"
+                                :max="59"
+                            ></el-input-number>
+                            {{ state.text.Seconds.cycle[2] || '' }}
+                        </el-radio>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+            <el-tab-pane>
+                <template #label>
+                    <span><i class="el-icon-date"></i> {{ state.text.Minutes.name }}</span>
+                </template>
+                <div class="tabBody myScroller" :style="{ 'max-height': maxHeight }">
+                    <el-row>
+                        <el-radio v-model="state.minute.cronEvery" label="1">{{ state.text.Minutes.every }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.minute.cronEvery" label="2"
+                            >{{ state.text.Minutes.interval[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.minute.incrementIncrement"
+                                :min="1"
+                                :max="60"
+                            ></el-input-number>
+                            {{ state.text.Minutes.interval[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.minute.incrementStart"
+                                :min="0"
+                                :max="59"
+                            ></el-input-number>
+                            {{ state.text.Minutes.interval[2] || '' }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio class="long" v-model="state.minute.cronEvery" label="3"
+                            >{{ state.text.Minutes.specific }}
+                            <el-select size="small" multiple v-model="state.minute.specificSpecific">
+                                <el-option v-for="(val, index) in 60" :key="index" :value="val - 1">{{
+                                    val - 1
+                                }}</el-option>
+                            </el-select>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.minute.cronEvery" label="4"
+                            >{{ state.text.Minutes.cycle[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.minute.rangeStart"
+                                :min="1"
+                                :max="60"
+                            ></el-input-number>
+                            {{ state.text.Minutes.cycle[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.minute.rangeEnd"
+                                :min="0"
+                                :max="59"
+                            ></el-input-number>
+                            {{ state.text.Minutes.cycle[2] }}
+                        </el-radio>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+            <el-tab-pane>
+                <template #label>
+                    <span><i class="el-icon-date"></i> {{ state.text.Hours.name }}</span>
+                </template>
+                <div class="tabBody myScroller" :style="{ 'max-height': maxHeight }">
+                    <el-row>
+                        <el-radio v-model="state.hour.cronEvery" label="1">{{ state.text.Hours.every }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.hour.cronEvery" label="2"
+                            >{{ state.text.Hours.interval[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.hour.incrementIncrement"
+                                :min="0"
+                                :max="23"
+                            ></el-input-number>
+                            {{ state.text.Hours.interval[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.hour.incrementStart"
+                                :min="0"
+                                :max="23"
+                            ></el-input-number>
+                            {{ state.text.Hours.interval[2] }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio class="long" v-model="state.hour.cronEvery" label="3"
+                            >{{ state.text.Hours.specific }}
+                            <el-select size="small" multiple v-model="state.hour.specificSpecific">
+                                <el-option v-for="(val, index) in 24" :key="index" :value="val - 1">{{
+                                    val - 1
+                                }}</el-option>
+                            </el-select>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.hour.cronEvery" label="4"
+                            >{{ state.text.Hours.cycle[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.hour.rangeStart"
+                                :min="0"
+                                :max="23"
+                            ></el-input-number>
+                            {{ state.text.Hours.cycle[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.hour.rangeEnd"
+                                :min="0"
+                                :max="23"
+                            ></el-input-number>
+                            {{ state.text.Hours.cycle[2] }}
+                        </el-radio>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+            <el-tab-pane>
+                <template #label>
+                    <span><i class="el-icon-date"></i> {{ state.text.Day.name }}</span>
+                </template>
+                <div class="tabBody myScroller" :style="{ 'max-height': maxHeight }">
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="1">{{ state.text.Day.every }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="2"
+                            >{{ state.text.Day.intervalWeek[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.week.incrementIncrement"
+                                :min="1"
+                                :max="7"
+                            ></el-input-number>
+                            {{ state.text.Day.intervalWeek[1] }}
+                            <el-select size="small" v-model="state.week.incrementStart">
+                                <el-option
+                                    v-for="(val, index) in 7"
+                                    :key="index"
+                                    :label="state.text.Week[val - 1]"
+                                    :value="val"
+                                ></el-option>
+                            </el-select>
+                            {{ state.text.Day.intervalWeek[2] }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="3"
+                            >{{ state.text.Day.intervalDay[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.day.incrementIncrement"
+                                :min="1"
+                                :max="31"
+                            ></el-input-number>
+                            {{ state.text.Day.intervalDay[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.day.incrementStart"
+                                :min="1"
+                                :max="31"
+                            ></el-input-number>
+                            {{ state.text.Day.intervalDay[2] }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio class="long" v-model="state.day.cronEvery" label="4"
+                            >{{ state.text.Day.specificWeek }}
+                            <el-select size="small" multiple v-model="state.week.specificSpecific">
+                                <el-option
+                                    v-for="(val, index) in 7"
+                                    :key="index"
+                                    :label="state.text.Week[val - 1]"
+                                    :value="['SUN', 'MON', 'TUE', 'WED', 'THU', 'FRI', 'SAT'][val - 1]"
+                                ></el-option>
+                            </el-select>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio class="long" v-model="state.day.cronEvery" label="5"
+                            >{{ state.text.Day.specificDay }}
+                            <el-select size="small" multiple v-model="state.day.specificSpecific">
+                                <el-option v-for="(val, index) in 31" :key="index" :value="val">{{ val }}</el-option>
+                            </el-select>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="6">{{ state.text.Day.lastDay }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="7">{{ state.text.Day.lastWeekday }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="8"
+                            >{{ state.text.Day.lastWeek[0] }}
+                            <el-select size="small" v-model="state.day.cronLastSpecificDomDay">
+                                <el-option
+                                    v-for="(val, index) in 7"
+                                    :key="index"
+                                    :label="state.text.Week[val - 1]"
+                                    :value="val"
+                                ></el-option>
+                            </el-select>
+                            {{ state.text.Day.lastWeek[1] || '' }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="9">
+                            <el-input-number
+                                size="small"
+                                v-model="state.day.cronDaysBeforeEomMinus"
+                                :min="1"
+                                :max="31"
+                            ></el-input-number>
+                            {{ state.text.Day.beforeEndMonth[0] }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="10"
+                            >{{ state.text.Day.nearestWeekday[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.day.cronDaysNearestWeekday"
+                                :min="1"
+                                :max="31"
+                            ></el-input-number>
+                            {{ state.text.Day.nearestWeekday[1] }}
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.day.cronEvery" label="11"
+                            >{{ state.text.Day.someWeekday[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.week.cronNthDayNth"
+                                :min="1"
+                                :max="5"
+                            ></el-input-number>
+                            <el-select size="small" v-model="state.week.cronNthDayDay">
+                                <el-option
+                                    v-for="(val, index) in 7"
+                                    :key="index"
+                                    :label="state.text.Week[val - 1]"
+                                    :value="val"
+                                ></el-option>
+                            </el-select>
+                            {{ state.text.Day.someWeekday[1] }}
+                        </el-radio>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+            <el-tab-pane>
+                <template #label>
+                    <span><i class="el-icon-date"></i> {{ state.text.Month.name }}</span>
+                </template>
+                <div class="tabBody myScroller" :style="{ 'max-height': maxHeight }">
+                    <el-row>
+                        <el-radio v-model="state.month.cronEvery" label="1">{{ state.text.Month.every }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.month.cronEvery" label="2"
+                            >{{ state.text.Month.interval[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.month.incrementIncrement"
+                                :min="0"
+                                :max="12"
+                            ></el-input-number>
+                            {{ state.text.Month.interval[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.month.incrementStart"
+                                :min="0"
+                                :max="12"
+                            ></el-input-number>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio class="long" v-model="state.month.cronEvery" label="3"
+                            >{{ state.text.Month.specific }}
+                            <el-select size="small" multiple v-model="state.month.specificSpecific">
+                                <el-option
+                                    v-for="(val, index) in 12"
+                                    :key="index"
+                                    :label="val"
+                                    :value="val"
+                                ></el-option>
+                            </el-select>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.month.cronEvery" label="4"
+                            >{{ state.text.Month.cycle[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.month.rangeStart"
+                                :min="1"
+                                :max="12"
+                            ></el-input-number>
+                            {{ state.text.Month.cycle[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.month.rangeEnd"
+                                :min="1"
+                                :max="12"
+                            ></el-input-number>
+                        </el-radio>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+            <el-tab-pane>
+                <template #label>
+                    <span><i class="el-icon-date"></i> {{ state.text.Year.name }}</span>
+                </template>
+                <div class="tabBody myScroller" :style="{ 'max-height': maxHeight }">
+                    <el-row>
+                        <el-radio v-model="state.year.cronEvery" label="1">{{ state.text.Year.every }}</el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.year.cronEvery" label="2"
+                            >{{ state.text.Year.interval[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.year.incrementIncrement"
+                                :min="1"
+                                :max="99"
+                            ></el-input-number>
+                            {{ state.text.Year.interval[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.year.incrementStart"
+                                :min="2018"
+                                :max="2118"
+                            ></el-input-number>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio class="long" v-model="state.year.cronEvery" label="3"
+                            >{{ state.text.Year.specific }}
+                            <el-select size="small" filterable multiple v-model="state.year.specificSpecific">
+                                <el-option
+                                    v-for="(val, index) in 100"
+                                    :key="index"
+                                    :label="2017 + val"
+                                    :value="2017 + val"
+                                ></el-option>
+                            </el-select>
+                        </el-radio>
+                    </el-row>
+                    <el-row>
+                        <el-radio v-model="state.year.cronEvery" label="4"
+                            >{{ state.text.Year.cycle[0] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.year.rangeStart"
+                                :min="2018"
+                                :max="2118"
+                            ></el-input-number>
+                            {{ state.text.Year.cycle[1] }}
+                            <el-input-number
+                                size="small"
+                                v-model="state.year.rangeEnd"
+                                :min="2018"
+                                :max="2118"
+                            ></el-input-number>
+                        </el-radio>
+                    </el-row>
+                </div>
+            </el-tab-pane>
+        </el-tabs>
+        <div class="bottom">
+            <div class="value" style="margin: 10px;">
+                <span> cron预览: </span>
+                <el-tag type="primary">
+                    {{ state.cron }}
+                </el-tag>
+            </div>
+            <div class="buttonDiv" style="text-align: right;">
+                <el-button type="primary" size="mini" @click.stop="handleChange">{{ state.text.Save }}</el-button>
+                <el-button type="primary" size="mini" @click="close">{{ state.text.Close }}</el-button>
+            </div>
+        </div>
+    </div>
+</template>
+<script>
+import Language from './language';
+import { reactive, computed, toRefs, defineComponent } from 'vue';
+export default defineComponent({
+    name: 'vue3Cron',
+    props: {
+        cronValue: {},
+        type: '',
+        i18n: {},
+        maxHeight: {}
+    },
+    setup(props, { emit }) {
+        const { i18n } = toRefs(props);
+        const state = reactive({
+            language: i18n.value,
+            second: {
+                cronEvery: '1',
+                incrementStart: 3,
+                incrementIncrement: 5,
+                rangeStart: 0,
+                rangeEnd: 0,
+                specificSpecific: []
+            },
+            minute: {
+                cronEvery: '1',
+                incrementStart: 3,
+                incrementIncrement: 5,
+                rangeStart: 0,
+                rangeEnd: 0,
+                specificSpecific: []
+            },
+            hour: {
+                cronEvery: '1',
+                incrementStart: 3,
+                incrementIncrement: 5,
+                rangeStart: 0,
+                rangeEnd: 0,
+                specificSpecific: []
+            },
+            day: {
+                cronEvery: '1',
+                incrementStart: 1,
+                incrementIncrement: 1,
+                rangeStart: 0,
+                rangeEnd: 0,
+                specificSpecific: [],
+                cronLastSpecificDomDay: 1,
+                cronDaysBeforeEomMinus: 0,
+                cronDaysNearestWeekday: 0
+            },
+            week: {
+                cronEvery: '1',
+                incrementStart: 1,
+                incrementIncrement: 1,
+                specificSpecific: [],
+                cronNthDayDay: 1,
+                cronNthDayNth: 1
+            },
+            month: {
+                cronEvery: '1',
+                incrementStart: 3,
+                incrementIncrement: 5,
+                rangeStart: 0,
+                rangeEnd: 0,
+                specificSpecific: []
+            },
+            year: {
+                cronEvery: '1',
+                incrementStart: 2017,
+                incrementIncrement: 1,
+                rangeStart: 0,
+                rangeEnd: 0,
+                specificSpecific: []
+            },
+            output: {
+                second: '',
+                minute: '',
+                hour: '',
+                day: '',
+                month: '',
+                Week: '',
+                year: ''
+            },
+            text: computed(() => Language[state.language || 'cn']),
+            secondsText: computed(() => {
+                let seconds = '';
+                let cronEvery = state.second.cronEvery;
+                switch (cronEvery.toString()) {
+                    case '1':
+                        seconds = '*';
+                        break;
+                    case '2':
+                        seconds = state.second.incrementStart + '/' + state.second.incrementIncrement;
+                        break;
+                    case '3':
+                        state.second.specificSpecific.map(val => {
+                            seconds += val + ',';
+                        });
+                        seconds = seconds.slice(0, -1);
+                        break;
+                    case '4':
+                        seconds = state.second.rangeStart + '-' + state.second.rangeEnd;
+                        break;
+                }
+                console.log(seconds);
+                return seconds;
+            }),
+            minutesText: computed(() => {
+                let minutes = '';
+                let cronEvery = state.minute.cronEvery;
+                switch (cronEvery.toString()) {
+                    case '1':
+                        minutes = '*';
+                        break;
+                    case '2':
+                        minutes = state.minute.incrementStart + '/' + state.minute.incrementIncrement;
+                        break;
+                    case '3':
+                        state.minute.specificSpecific.map(val => {
+                            minutes += val + ',';
+                        });
+                        minutes = minutes.slice(0, -1);
+                        break;
+                    case '4':
+                        minutes = state.minute.rangeStart + '-' + state.minute.rangeEnd;
+                        break;
+                }
+                return minutes;
+            }),
+            hoursText: computed(() => {
+                let hours = '';
+                let cronEvery = state.hour.cronEvery;
+                switch (cronEvery.toString()) {
+                    case '1':
+                        hours = '*';
+                        break;
+                    case '2':
+                        hours = state.hour.incrementStart + '/' + state.hour.incrementIncrement;
+                        break;
+                    case '3':
+                        state.hour.specificSpecific.map(val => {
+                            hours += val + ',';
+                        });
+                        hours = hours.slice(0, -1);
+                        break;
+                    case '4':
+                        hours = state.hour.rangeStart + '-' + state.hour.rangeEnd;
+                        break;
+                }
+                return hours;
+            }),
+            daysText: computed(() => {
+                let days = '';
+                let cronEvery = state.day.cronEvery;
+                switch (cronEvery.toString()) {
+                    case '1':
+                        break;
+                    case '2':
+                    case '4':
+                    case '11':
+                        days = '?';
+                        break;
+                    case '3':
+                        days = state.day.incrementStart + '/' + state.day.incrementIncrement;
+                        break;
+                    case '5':
+                        state.day.specificSpecific.map(val => {
+                            days += val + ',';
+                        });
+                        days = days.slice(0, -1);
+                        break;
+                    case '6':
+                        days = 'L';
+                        break;
+                    case '7':
+                        days = 'LW';
+                        break;
+                    case '8':
+                        days = state.day.cronLastSpecificDomDay + 'L';
+                        break;
+                    case '9':
+                        days = 'L-' + state.day.cronDaysBeforeEomMinus;
+                        break;
+                    case '10':
+                        days = state.day.cronDaysNearestWeekday + 'W';
+                        break;
+                }
+                return days;
+            }),
+            weeksText: computed(() => {
+                let weeks = '';
+                let cronEvery = state.day.cronEvery;
+                switch (cronEvery.toString()) {
+                    case '1':
+                    case '3':
+                    case '5':
+                        weeks = '?';
+                        break;
+                    case '2':
+                        weeks = state.week.incrementStart + '/' + state.week.incrementIncrement;
+                        break;
+                    case '4':
+                        state.week.specificSpecific.map(val => {
+                            weeks += val + ',';
+                        });
+                        weeks = weeks.slice(0, -1);
+                        break;
+                    case '6':
+                    case '7':
+                    case '8':
+                    case '9':
+                    case '10':
+                        weeks = '?';
+                        break;
+                    case '11':
+                        weeks = state.week.cronNthDayDay + '#' + state.week.cronNthDayNth;
+                        break;
+                }
+                return weeks;
+            }),
+            monthsText: computed(() => {
+                let months = '';
+                let cronEvery = state.month.cronEvery;
+                switch (cronEvery.toString()) {
+                    case '1':
+                        months = '*';
+                        break;
+                    case '2':
+                        months = state.month.incrementStart + '/' + state.month.incrementIncrement;
+                        break;
+                    case '3':
+                        state.month.specificSpecific.map(val => {
+                            months += val + ',';
+                        });
+                        months = months.slice(0, -1);
+                        break;
+                    case '4':
+                        months = state.month.rangeStart + '-' + state.month.rangeEnd;
+                        break;
+                }
+                return months;
+            }),
+            yearsText: computed(() => {
+                let years = '';
+                let cronEvery = state.year.cronEvery;
+                switch (cronEvery.toString()) {
+                    case '1':
+                        years = '*';
+                        break;
+                    case '2':
+                        years = state.year.incrementStart + '/' + state.year.incrementIncrement;
+                        break;
+                    case '3':
+                        state.year.specificSpecific.map(val => {
+                            years += val + ',';
+                        });
+                        years = years.slice(0, -1);
+                        break;
+                    case '4':
+                        years = state.year.rangeStart + '-' + state.year.rangeEnd;
+                        break;
+                }
+                return years;
+            }),
+            cron: computed(() => {
+
+                let cron =`${state.secondsText || '*'} ${state.minutesText || '*'} ${state.hoursText || '*'} ${
+                    state.daysText || '*'
+                } ${state.monthsText || '*'} ${state.weeksText || '?'} ${state.yearsText || '*'}`;
+               
+                return cron
+            })
+        });
+        const getValue = () => {
+            return state.cron;
+        };
+        const close = () => {
+            emit('close');
+        };
+        const handleChange = () => {
+            emit('handlelisten', {
+                    cron:state.cron,
+                    type:props.type
+                });
+            close();
+        };
+        const rest = data => {
+            for (let i in data) {
+                if (data[i] instanceof Object) {
+                    this.rest(data[i]);
+                } else {
+                    switch (typeof data[i]) {
+                        case 'object':
+                            data[i] = [];
+                            break;
+                        case 'string':
+                            data[i] = '';
+                            break;
+                    }
+                }
+            }
+        };
+        return {
+            state,
+            getValue,
+            close,
+            handleChange,
+            rest
+        };
+    }
+});
+</script>
+<style >
+.vue3-cron-div {
+    .el-input-number__decrease,
+    .el-input-number__increase {
+        top: 2px !important;
+    }
+    .language {
+        position: absolute;
+        right: 25px;
+        z-index: 1;
+    }
+    .el-tabs {
+        box-shadow: none;
+    }
+    .tabBody {
+        overflow: auto;
+        .el-row {
+            margin: 20px 0;
+            .long {
+                .el-select {
+                    width: 350px;
+                }
+            }
+            .el-input-number {
+                width: 110px;
+            }
+        }
+    }
+    .myScroller {
+        &::-webkit-scrollbar {
+            /*滚动条整体样式*/
+            width: 5px; /*高宽分别对应横竖滚动条的尺寸*/
+            height: 1px;
+        }
+        &::-webkit-scrollbar-thumb {
+            /*滚动条里面小方块*/
+            border-radius: 10px;
+            background-color: skyblue;
+            background-image: -webkit-linear-gradient(
+                45deg,
+                rgba(255, 255, 255, 0.2) 25%,
+                transparent 25%,
+                transparent 50%,
+                rgba(255, 255, 255, 0.2) 50%,
+                rgba(255, 255, 255, 0.2) 75%,
+                transparent 75%,
+                transparent
+            );
+        }
+        &::-webkit-scrollbar-track {
+            /*滚动条里面轨道*/
+            box-shadow: inset 0 0 5px rgba(0, 0, 0, 0.2);
+            background: #ededed;
+            border-radius: 10px;
+        }
+    }
+    .bottom {
+        width: 100%;
+        margin-top: 5px;
+        display: flex;
+        align-items: center;
+        justify-content: space-around;
+        .value {
+            float: left;
+            font-size: 14px;
+            vertical-align: middle;
+            span:nth-child(1) {
+                color: red;
+            }
+        }
+    }
+}
+</style>

+ 1 - 1
src/router/backEnd.ts

@@ -57,7 +57,7 @@ export async function initBackEndControlRoutes() {
  */
 export async function getBackEndControlRoutes() {
 	return api.login.currentUser().then((res: any) => {
-		Session.set('userMenu', res || [])
+		Session.set('userMenu', res.Data || [])
 		// Session.set('permissions',res.data.permissions)
 		// store.dispatch('userInfos/setPermissions',res.data.permissions)
 	})

+ 3 - 0
src/utils/request.ts

@@ -55,6 +55,9 @@ service.interceptors.response.use(
 			// if (res.data?.Data) {
 			// 	return res.data.Data
 			// }
+			if (res.data?.Info && res.data?.Data) { // currentUser接口
+				return res.data
+			}
 			if (res.data?.Data === undefined) {
 				return res.data
 			}

+ 1 - 1
src/views/heating/energyAnalysis/loopEnergyCostPerformanceAppraisal/index.vue

@@ -125,7 +125,7 @@ const queryTree = () => {
 };
 // 页面加载时
 onMounted(() => {
-	queryTree()
+	// queryTree()
 });
 /** 重置按钮操作 */
 const resetQuery = (formEl: FormInstance | undefined) => {

+ 0 - 200
src/views/heating/heatStation/heatingDistrict/floorManage/component/detail.vue

@@ -1,200 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="'环路详情'" v-model="dialogVisible" width="950px">
-			<el-form :model="ruleForm" ref="formRef" size="default" label-width="110px">
-				<el-form-item label="环路名称" prop="name">
-					{{ ruleForm.name }}
-				</el-form-item>
-				<el-form-item label="环路编号" prop="code">
-					{{ ruleForm.code }}
-				</el-form-item>
-				<el-form-item label="所属换热站" prop="stationId">
-          {{ ruleForm.stationId }}
-					<!-- <el-tree-select
-						v-model="ruleForm.stationId"
-						:data="treeData"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/> -->
-				</el-form-item>
-        <el-form-item label="环路类型" prop="loopTypes">
-          {{ ruleForm.loopTypes === 1 ? '一网' : '二网' }}
-        </el-form-item>
-        <el-form-item label="节能类型" prop="energyTypes">
-          {{ ruleForm.energyTypes === 1 ? '节能' : '' }}
-        </el-form-item>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖对象" prop="heatingObject">
-              {{ ruleForm.heatingObject === 1 ? '公建' : '居民' }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="供暖类型" prop="heatingTypes">
-              {{ ruleForm.heatingTypes === 1 ? '地暖' : '暖气片' }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖面积" prop="heatingArea">
-              {{ ruleForm.heatingArea }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="实际面积" prop="forRealArea">
-              {{ ruleForm.forRealArea }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-form-item label="环路年代" prop="decade">
-          {{ ruleForm.decade }}
-        </el-form-item>
-				<el-form-item label="状态" prop="status">
-          {{ ruleForm.decade === 1 ? '在线' : '不在线' }}
-				</el-form-item>
-        <el-form-item label="路线信息" prop="">
-					<div class="mb10" style="width: 100%">
-						<div style="display: flex;" class="mb10" v-for="(item, index) in pointList" :key="index">
-							<el-input v-model="item.position" :disabled="!item.editFalg" @keydown="onLocalChange(item, index)" @change="onLocalChange(item, index)" placeholder="请输入关键字进行搜索" clearable style="flex: 1; margin-right: 10px"></el-input>
-							<span>排序:</span>
-							<el-input-number v-model="item.sort" :controls="false" :disabled="!item.editFalg" placeholder="排序" clearable style="width: 100px; margin-right: 10px"></el-input-number>
-						</div>
-					</div>
-        </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 } from 'vue';
-import api from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-interface Point {
-	sort?: number;
-	lnt: number;
-	lat: number
-}
-interface RuleFormState {
-	id?: number;
-	name: string;
-	code: string;
-	stationId: string;
-	loopTypes: string;
-	energyTypes: string;
-	heatingObject: string;
-	heatingTypes: string;
-	heatingArea: string;
-	forRealArea: string;
-	viaPoint: Array<Point>;
-	decade: string;
-	status: number;
-}
-
-export default defineComponent({
-	name: 'headStationLoop',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-        decade: '',
-				viaPoint: [],
-        status: 1
-			},
-			treeData: [],
-      pointList: [] as any
-		})
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id
-				getDetail()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-				viaPoint: [],
-        decade: '',
-        status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-			state.pointList = []
-		}
-		const queryTree = () => {
-			api.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.treeData = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.loop.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res
-					}
-					state.pointList = state.ruleForm.viaPoint.map((item: any) => ({
-						...item,
-						editFlag: false
-					}))
-				})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			formRef,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 193
src/views/heating/heatStation/heatingDistrict/floorManage/component/edit.vue

@@ -1,193 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '楼宇'" v-model="dialogVisible" width="550px">
-			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
-				<el-form-item label="所属组织" prop="organizationId">
-					<el-tree-select
-						v-model="ruleForm.organizationId"
-						:data="orgList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<el-form-item label="所属换热站" prop="heatStaId">
-					<el-tree-select
-						v-model="ruleForm.heatStaId"
-						:data="heatList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<el-form-item label="小区名称" prop="plotId">
-					<el-select v-model="ruleForm.plotId" placeholder="选择小区名称" filterable clearable size="default" style="width: 100%">
-						<el-option
-							v-for="item in plotList"
-							:key="item.id"
-							:label="item.name"
-							:value="item.id">
-						</el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="楼宇名称" prop="name">
-					<el-input v-model="ruleForm.name" placeholder="请输入楼宇名称" />
-				</el-form-item>
-				<el-form-item label="楼号" prop="number">
-					<el-input v-model="ruleForm.number" placeholder="请输入楼号" />
-				</el-form-item>
-				<el-form-item label="状态" prop="status">
-					<el-radio v-model="ruleForm.status" :label="1">启用</el-radio>
-					<el-radio v-model="ruleForm.status" :label="0">禁用</el-radio>
-				</el-form-item>
-				<el-form-item label="备注" prop="remark">
-					<el-input type="textarea" :rows="8" v-model="ruleForm.remark" 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.id !== 0 ? '修 改' : '添 加' }}</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, defineComponent, ref, unref, nextTick } from 'vue';
-import api from '/@/api/heatingDistrict';
-import heatApi from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-interface RuleFormState {
-	id?: number;
-	name: string;
-	organizationId: string;
-}
-
-export default defineComponent({
-	name: 'edit',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				name: '',
-        organizationId: '',
-        plotId: '',
-        heatStaId: '',
-        number: '',
-        remark: '',
-				status: 1
-			},
-			rules: {
-				name: [{ required: true, message: '楼宇名称不能为空', trigger: ['blur', 'change'] }],
-				organizationId: [{ required: true, message: '所属组织不能为空', trigger: ['blur', 'change'] }],
-				plotId: [{ required: true, message: '小区名称不能为空', trigger: ['blur', 'change'] }],
-				heatStaId: [{ required: true, message: '所属换热站不能为空', trigger: ['blur', 'change'] }],
-				number: [{ required: true, message: '楼号不能为空', trigger: ['blur', 'change'] }],
-			},
-			orgList: [],
-			plotList: [],
-			heatList: []
-		})
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id
-				getDetail()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				name: '',
-        organizationId: '',
-        plotId: '',
-        heatStaId: '',
-        number: '',
-        remark: '',
-				status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false;
-			(formRef.value as any).clearValidate()
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-		}
-		const queryTree = () => {
-			heatApi.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.heatList = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.floor.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res
-					}
-				})
-		}
-		// 新增
-		const onSubmit = () => {
-			const formWrap = unref(formRef) as any
-			if (!formWrap) return;
-			formWrap.validate((valid: boolean) => {
-				if (valid) {
-					let params = { ...state.ruleForm }
-
-					if (params.id) {
-						//修改
-						api.floor.edit(params).then(() => {
-							ElMessage.success('楼宇修改成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					} else {
-						//添加
-						api.floor.add(params).then(() => {
-							ElMessage.success('楼宇添加成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					}
-				}
-			})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			formRef,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 250
src/views/heating/heatStation/heatingDistrict/floorManage/index.vue

@@ -1,250 +0,0 @@
-<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="organizationId">
-						<el-tree-select
-							v-model="tableData.param.organizationId"
-							:data="orgList"
-							:props="{
-								label: 'name',
-								children: 'children'
-							}"
-							placeholder="请选择"
-							node-key="id"
-							:clearable="true"
-							check-strictly
-							style="width: 100%;"
-							:render-after-expand="true"
-							size="default"
-						/>
-          </el-form-item>
-          <el-form-item label="小区名称" prop="plotId">
-            <el-select v-model="tableData.param.plotId" placeholder="选择小区名称" filterable clearable size="default">
-							<el-option
-								v-for="item in plotList"
-								:key="item.id"
-								:label="item.name"
-								:value="item.id">
-							</el-option>
-						</el-select>
-          </el-form-item>
-          <el-form-item label="楼宇名称" prop="name">
-            <el-input v-model="tableData.param.name" placeholder="请输入楼宇名称" clearable size="default" style="width: 240px" @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="onOpenDialog()">
-              <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" v-loading="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="100" />
-	    	<el-table-column label="楼号" prop="number" min-width="100" />
-	    	<!-- <el-table-column label="单元数" prop="name" /> -->
-        <el-table-column label="小区名称" prop="" min-width="100">
-          <template #default="{ row }">
-            {{ row.ZhgyPlotInfo ? row.ZhgyPlotInfo.name : '-' }}
-          </template>
-        </el-table-column>
-        <el-table-column label="组织名称" prop="" min-width="100">
-          <template #default="{ row }">
-            {{ row.SysOrganization ? row.SysOrganization.name : '-' }}
-          </template>
-        </el-table-column>
-	    	<el-table-column label="更新时间" prop="createdAt" width="180" />
-				<el-table-column prop="status" label="启用状态" width="120" align="center">
-					<template #default="scope">
-						<el-switch v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
-						</el-switch>
-					</template>
-				</el-table-column>
-        <el-table-column label="操作" width="200" align="center" fixed="right">
-          <template #default="scope">
-            <el-button size="small" text type="warning" @click="onOpenDialog(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="queryList" />
-    </el-card>
-    <EditDic ref="editDicRef" @queryList="queryList" />
-    <Detail ref="detailRef"  />
-  </div>
-</template>
-
-<script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent } 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/heatingDistrict';
-import systemApi from '/@/api/system';
-
-export default defineComponent({
-	name: 'loop',
-	components: { EditDic,Detail },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const detailRef=ref();
-		const queryRef = ref();
-		const state = reactive({
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					name: '',
-					plotId: '',
-					organizationId: '',
-					status: -1
-				},
-			},
-		});
-		// 组织
-		const orgList = ref([])
-		// 小区
-		const plotList = ref([])
-		// 初始化表格数据
-		const initTableData = () => {
-			queryList();
-		};
-		// 获取组织
-		const getOrgList = () => {
-			systemApi.org.getList({ name: '', status: -1 }).then((res: any) => {
-				orgList.value = res;
-			});
-		}
-		// 获取区域
-		const getPlotList = () => {
-			api.regionalManage.allList({})
-				.then((res: any) => {
-					plotList.value = res.Info || []
-				})
-		}
-		const queryList = () => {
-			state.tableData.loading = true
-			api.floor.getList(state.tableData.param).then((res: any) => {
-				console.log(res);
-				state.tableData.data = res.Info || [];
-				state.tableData.total = res.Total;
-				state.tableData.loading = false
-			});
-		};
-
-		//查看详情
-		const onOpenDetail=(row: any)=>{
-			detailRef.value.openDialog(row);
-		}
-		// 打开新增修改弹窗
-		const onOpenDialog = (row: any) => {
-			editDicRef.value.orgList = orgList.value
-			editDicRef.value.plotList = plotList.value
-			editDicRef.value.openDialog(row);
-		};
-		
-		// 状态修改
-		const handleStatusChange = (row: any) => {
-			let text = row.status === 1 ? '启用' : '停用';
-			ElMessageBox.confirm('确认要"' + text + '":"' + row.name + '"楼宇吗?', '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(function () {
-					return api.floor.setStatus(row.id, row.status);
-				})
-				.then(() => {
-					ElMessage.success(text + '成功');
-				})
-				.catch(function () {
-					row.status = row.status === 0 ? 1 : 0;
-				});
-		};
-		// 删除产品
-		const onRowDel = (row: any) => {
-			// let msg = '你确定要删除所选数据?';
-			// let ids: number[] = [];
-			// if (row) {
-			let 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.floor.del(row.id).then(() => {
-						ElMessage.success('删除成功');
-						queryList();
-					});
-				})
-				.catch(() => {});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-			getOrgList();
-			getPlotList()
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			queryList();
-		};
-
-		return {
-			addDicRef,
-			editDicRef,
-			detailRef,
-			queryRef,
-			onOpenDetail,
-			onOpenDialog,
-			onRowDel,
-			queryList,
-			resetQuery,
-			orgList,
-			plotList,
-			handleStatusChange,
-			...toRefs(state),
-		};
-	},
-});
-</script>

+ 0 - 200
src/views/heating/heatStation/heatingDistrict/regionalManage/component/detail.vue

@@ -1,200 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="'环路详情'" v-model="dialogVisible" width="950px">
-			<el-form :model="ruleForm" ref="formRef" size="default" label-width="110px">
-				<el-form-item label="环路名称" prop="name">
-					{{ ruleForm.name }}
-				</el-form-item>
-				<el-form-item label="环路编号" prop="code">
-					{{ ruleForm.code }}
-				</el-form-item>
-				<el-form-item label="所属换热站" prop="stationId">
-          {{ ruleForm.stationId }}
-					<!-- <el-tree-select
-						v-model="ruleForm.stationId"
-						:data="treeData"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/> -->
-				</el-form-item>
-        <el-form-item label="环路类型" prop="loopTypes">
-          {{ ruleForm.loopTypes === 1 ? '一网' : '二网' }}
-        </el-form-item>
-        <el-form-item label="节能类型" prop="energyTypes">
-          {{ ruleForm.energyTypes === 1 ? '节能' : '' }}
-        </el-form-item>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖对象" prop="heatingObject">
-              {{ ruleForm.heatingObject === 1 ? '公建' : '居民' }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="供暖类型" prop="heatingTypes">
-              {{ ruleForm.heatingTypes === 1 ? '地暖' : '暖气片' }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖面积" prop="heatingArea">
-              {{ ruleForm.heatingArea }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="实际面积" prop="forRealArea">
-              {{ ruleForm.forRealArea }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-form-item label="环路年代" prop="decade">
-          {{ ruleForm.decade }}
-        </el-form-item>
-				<el-form-item label="状态" prop="status">
-          {{ ruleForm.decade === 1 ? '在线' : '不在线' }}
-				</el-form-item>
-        <el-form-item label="路线信息" prop="">
-					<div class="mb10" style="width: 100%">
-						<div style="display: flex;" class="mb10" v-for="(item, index) in pointList" :key="index">
-							<el-input v-model="item.position" :disabled="!item.editFalg" @keydown="onLocalChange(item, index)" @change="onLocalChange(item, index)" placeholder="请输入关键字进行搜索" clearable style="flex: 1; margin-right: 10px"></el-input>
-							<span>排序:</span>
-							<el-input-number v-model="item.sort" :controls="false" :disabled="!item.editFalg" placeholder="排序" clearable style="width: 100px; margin-right: 10px"></el-input-number>
-						</div>
-					</div>
-        </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 } from 'vue';
-import api from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-interface Point {
-	sort?: number;
-	lnt: number;
-	lat: number
-}
-interface RuleFormState {
-	id?: number;
-	name: string;
-	code: string;
-	stationId: string;
-	loopTypes: string;
-	energyTypes: string;
-	heatingObject: string;
-	heatingTypes: string;
-	heatingArea: string;
-	forRealArea: string;
-	viaPoint: Array<Point>;
-	decade: string;
-	status: number;
-}
-
-export default defineComponent({
-	name: 'headStationLoop',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-        decade: '',
-				viaPoint: [],
-        status: 1
-			},
-			treeData: [],
-      pointList: [] as any
-		})
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id
-				getDetail()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-				viaPoint: [],
-        decade: '',
-        status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-			state.pointList = []
-		}
-		const queryTree = () => {
-			api.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.treeData = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.loop.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res
-					}
-					state.pointList = state.ruleForm.viaPoint.map((item: any) => ({
-						...item,
-						editFlag: false
-					}))
-				})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			formRef,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 166
src/views/heating/heatStation/heatingDistrict/regionalManage/component/edit.vue

@@ -1,166 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '小区'" v-model="dialogVisible" width="550px">
-			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
-				<el-form-item label="所属组织" prop="organizationId">
-					<el-tree-select
-						v-model="ruleForm.organizationId"
-						:data="orgList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<!-- heatStaId -->
-				<el-form-item label="所属换热站" prop="heatStaId">
-					<el-tree-select
-						v-model="ruleForm.heatStaId"
-						:data="heatList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<el-form-item label="小区名称" prop="name">
-					<el-input v-model="ruleForm.name" placeholder="请输入小区名称" />
-				</el-form-item>
-				<el-form-item label="状态" prop="status">
-					<el-radio v-model="ruleForm.status" :label="1">启用</el-radio>
-					<el-radio v-model="ruleForm.status" :label="0">禁用</el-radio>
-				</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, nextTick } from 'vue';
-import api from '/@/api/heatingDistrict';
-import heatApi from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-interface RuleFormState {
-	id?: number;
-	name: string;
-	organizationId: string;
-}
-
-export default defineComponent({
-	name: 'edit',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				name: '',
-        organizationId: '',
-				status: 1
-			},
-			rules: {
-				name: [{ required: true, message: '小区名称不能为空', trigger: ['blur', 'change'] }],
-				organizationId: [{ required: true, message: '所属组织不能为空', trigger: ['blur', 'change'] }]
-			},
-			orgList: [],
-			heatList: []
-		})
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id
-				getDetail()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				name: '',
-        organizationId: '',
-				status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false;
-			(formRef.value as any).clearValidate()
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-		}
-		const queryTree = () => {
-			heatApi.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.heatList = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.regionalManage.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res
-					}
-				})
-		}
-		// 新增
-		const onSubmit = () => {
-			const formWrap = unref(formRef) as any
-			if (!formWrap) return;
-			formWrap.validate((valid: boolean) => {
-				if (valid) {
-					let params = { ...state.ruleForm }
-
-					if (params.id) {
-						//修改
-						api.regionalManage.edit(params).then(() => {
-							ElMessage.success('小区修改成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					} else {
-						//添加
-						api.regionalManage.add(params).then(() => {
-							ElMessage.success('小区添加成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					}
-				}
-			})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			formRef,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 226
src/views/heating/heatStation/heatingDistrict/regionalManage/index.vue

@@ -1,226 +0,0 @@
-<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="organizationId">
-						<el-tree-select
-							v-model="tableData.param.organizationId"
-							:data="orgList"
-							:props="{
-								label: 'name',
-								children: 'children'
-							}"
-							placeholder="请选择"
-							node-key="id"
-							:clearable="true"
-							check-strictly
-							style="width: 100%;"
-							:render-after-expand="true"
-							size="default"
-						/>
-          </el-form-item>
-          <el-form-item label="小区名称" prop="name">
-            <el-input v-model="tableData.param.name" placeholder="请输入小区名称" clearable size="default" style="width: 240px" @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="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" v-loading="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="100" />
-        <el-table-column label="组织名称" prop="" min-width="100">
-					<template #default="{ row }">
-						{{ row.SysOrganization.name }}
-					</template>
-				</el-table-column>
-	    	<el-table-column label="更新时间" prop="createdAt" width="180" />
-				<el-table-column prop="status" label="启用状态" width="120" align="center">
-					<template #default="scope">
-						<el-switch v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
-						</el-switch>
-					</template>
-				</el-table-column>
-        <el-table-column label="操作" width="200" align="center" fixed="right">
-          <template #default="scope">
-            <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="queryList" />
-    </el-card>
-    <EditDic ref="editDicRef" @queryList="queryList" />
-    <Detail ref="detailRef"  />
-  </div>
-</template>
-
-<script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent } 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/heatingDistrict';
-import systemApi from '/@/api/system';
-
-export default defineComponent({
-	name: 'loop',
-	components: { EditDic,Detail },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const detailRef=ref();
-		const queryRef = ref();
-		const state = reactive({
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					name: '',
-					code: '',
-					loopTypes: '',
-					heatingObject: '',
-					status: -1
-				},
-			},
-		});
-		const orgList = ref([])
-		// 初始化表格数据
-		const initTableData = () => {
-			queryList();
-		};
-		const getOrgList = () => {
-			systemApi.org.getList({ name: '', status: -1 }).then((res: any) => {
-				orgList.value = res;
-			});
-		}
-		const queryList = () => {
-			state.tableData.loading = true
-			api.regionalManage.getList(state.tableData.param).then((res: any) => {
-				console.log(res);
-				state.tableData.data = res.Info || [];
-				state.tableData.total = res.Total;
-				state.tableData.loading = false
-			});
-		};
-
-		//查看详情
-		const onOpenDetail=(row: any)=>{
-			detailRef.value.openDialog(row);
-		}
-		// 打开新增产品弹窗
-		const onOpenAddDic = () => {
-			editDicRef.value.orgList = orgList.value
-			editDicRef.value.openDialog();
-		};
-		// 打开修改产品弹窗
-		const onOpenEditDic = (row: any) => {
-			editDicRef.value.orgList = orgList.value
-			editDicRef.value.openDialog(row);
-		};
-		
-		// 状态修改
-		const handleStatusChange = (row: any) => {
-			let text = row.status === 1 ? '启用' : '停用';
-			ElMessageBox.confirm('确认要"' + text + '":"' + row.name + '"小区吗?', '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(function () {
-					return api.regionalManage.setStatus(row.id, row.status);
-				})
-				.then(() => {
-					ElMessage.success(text + '成功');
-				})
-				.catch(function () {
-					row.status = row.status === 0 ? 1 : 0;
-				});
-		};
-		// 删除产品
-		const onRowDel = (row: any) => {
-			// let msg = '你确定要删除所选数据?';
-			// let ids: number[] = [];
-			// if (row) {
-			let 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.regionalManage.del(row.id).then(() => {
-						ElMessage.success('删除成功');
-						queryList();
-					});
-				})
-				.catch(() => {});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-			getOrgList();
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			queryList();
-		};
-
-		return {
-			addDicRef,
-			editDicRef,
-			detailRef,
-			queryRef,
-			onOpenDetail,
-			onOpenAddDic,
-			onOpenEditDic,
-			onRowDel,
-			queryList,
-			resetQuery,
-			orgList,
-			handleStatusChange,
-			...toRefs(state),
-		};
-	},
-});
-</script>

+ 0 - 200
src/views/heating/heatStation/heatingDistrict/residentManage/component/detail.vue

@@ -1,200 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="'环路详情'" v-model="dialogVisible" width="950px">
-			<el-form :model="ruleForm" ref="formRef" size="default" label-width="110px">
-				<el-form-item label="环路名称" prop="name">
-					{{ ruleForm.name }}
-				</el-form-item>
-				<el-form-item label="环路编号" prop="code">
-					{{ ruleForm.code }}
-				</el-form-item>
-				<el-form-item label="所属换热站" prop="stationId">
-          {{ ruleForm.stationId }}
-					<!-- <el-tree-select
-						v-model="ruleForm.stationId"
-						:data="treeData"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/> -->
-				</el-form-item>
-        <el-form-item label="环路类型" prop="loopTypes">
-          {{ ruleForm.loopTypes === 1 ? '一网' : '二网' }}
-        </el-form-item>
-        <el-form-item label="节能类型" prop="energyTypes">
-          {{ ruleForm.energyTypes === 1 ? '节能' : '' }}
-        </el-form-item>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖对象" prop="heatingObject">
-              {{ ruleForm.heatingObject === 1 ? '公建' : '居民' }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="供暖类型" prop="heatingTypes">
-              {{ ruleForm.heatingTypes === 1 ? '地暖' : '暖气片' }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖面积" prop="heatingArea">
-              {{ ruleForm.heatingArea }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="实际面积" prop="forRealArea">
-              {{ ruleForm.forRealArea }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-form-item label="环路年代" prop="decade">
-          {{ ruleForm.decade }}
-        </el-form-item>
-				<el-form-item label="状态" prop="status">
-          {{ ruleForm.decade === 1 ? '在线' : '不在线' }}
-				</el-form-item>
-        <el-form-item label="路线信息" prop="">
-					<div class="mb10" style="width: 100%">
-						<div style="display: flex;" class="mb10" v-for="(item, index) in pointList" :key="index">
-							<el-input v-model="item.position" :disabled="!item.editFalg" @keydown="onLocalChange(item, index)" @change="onLocalChange(item, index)" placeholder="请输入关键字进行搜索" clearable style="flex: 1; margin-right: 10px"></el-input>
-							<span>排序:</span>
-							<el-input-number v-model="item.sort" :controls="false" :disabled="!item.editFalg" placeholder="排序" clearable style="width: 100px; margin-right: 10px"></el-input-number>
-						</div>
-					</div>
-        </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 } from 'vue';
-import api from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-interface Point {
-	sort?: number;
-	lnt: number;
-	lat: number
-}
-interface RuleFormState {
-	id?: number;
-	name: string;
-	code: string;
-	stationId: string;
-	loopTypes: string;
-	energyTypes: string;
-	heatingObject: string;
-	heatingTypes: string;
-	heatingArea: string;
-	forRealArea: string;
-	viaPoint: Array<Point>;
-	decade: string;
-	status: number;
-}
-
-export default defineComponent({
-	name: 'headStationLoop',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-        decade: '',
-				viaPoint: [],
-        status: 1
-			},
-			treeData: [],
-      pointList: [] as any
-		})
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id
-				getDetail()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-				viaPoint: [],
-        decade: '',
-        status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-			state.pointList = []
-		}
-		const queryTree = () => {
-			api.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.treeData = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.loop.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res
-					}
-					state.pointList = state.ruleForm.viaPoint.map((item: any) => ({
-						...item,
-						editFlag: false
-					}))
-				})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			formRef,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 278
src/views/heating/heatStation/heatingDistrict/residentManage/component/edit.vue

@@ -1,278 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '住户'" v-model="dialogVisible" width="550px">
-			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
-				<el-form-item label="所属组织" prop="organizationId">
-					<el-tree-select
-						v-model="ruleForm.organizationId"
-						:data="orgList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<el-form-item label="所属换热站" prop="">
-					<el-tree-select
-						v-model="ruleForm.heatStaId"
-						:data="heatList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<el-form-item label="小区名称" prop="plotId">
-					<el-select v-model="ruleForm.plotId" @change="onPlotChange" placeholder="选择小区名称" filterable clearable size="default" style="width: 100%">
-						<el-option
-							v-for="item in plotList"
-							:key="item.id"
-							:label="item.name"
-							:value="item.id">
-						</el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="楼宇名称" prop="floorId">
-					<el-select v-model="ruleForm.floorId" @change="onFloorChange" placeholder="选择楼宇名称" filterable clearable size="default" style="width: 100%">
-						<el-option
-							v-for="item in floorList"
-							:key="item.id"
-							:label="item.name"
-							:value="item.id">
-						</el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="单元名称" prop="unitId">
-					<el-select v-model="ruleForm.unitId" placeholder="选择单元名称" filterable clearable size="default" style="width: 100%">
-						<el-option
-							v-for="item in unitList"
-							:key="item.id"
-							:label="item.name"
-							:value="item.id">
-						</el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="住户姓名" prop="name">
-					<el-input v-model="ruleForm.name" placeholder="请输入住户姓名" />
-				</el-form-item>
-				<el-form-item label="楼层" prop="floorLevel">
-					<el-input v-model="ruleForm.floorLevel" placeholder="请输入楼层" />
-				</el-form-item>
-				<el-form-item label="房间号" prop="roomNumber">
-					<el-input v-model="ruleForm.roomNumber" placeholder="请输入房间号" />
-				</el-form-item>
-				<el-form-item label="电话号码" prop="phone">
-					<el-input v-model="ruleForm.phone" placeholder="请输入电话号码" />
-				</el-form-item>
-				<el-form-item label="建筑面积" prop="buildingArea">
-					<el-input v-model="ruleForm.buildingArea" placeholder="请输入建筑面积" />
-				</el-form-item>
-				<el-form-item label="实供面积" prop="forRealArea">
-					<el-input v-model="ruleForm.forRealArea" placeholder="请输入实供面积" />
-				</el-form-item>
-				<el-form-item label="状态" prop="status">
-					<el-radio v-model="ruleForm.status" :label="1">启用</el-radio>
-					<el-radio v-model="ruleForm.status" :label="0">禁用</el-radio>
-				</el-form-item>
-				<el-form-item label="备注" prop="remark">
-					<el-input type="textarea" :rows="8" v-model="ruleForm.remark" 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.id !== 0 ? '修 改' : '添 加' }}</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, defineComponent, ref, unref, nextTick } from 'vue';
-import api from '/@/api/heatingDistrict';
-import heatApi from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-interface RuleFormState {
-	id?: number;
-	name: string;
-	organizationId: string;
-}
-
-export default defineComponent({
-	name: 'edit',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				organizationId: '',
-				heatStaId: '',
-				plotId: '',
-				floorId: '',
-				unitId: '',
-				name: '',
-				floorLevel: '',
-				roomNumber: '',
-				phone: '',
-				buildingArea: '',
-				forRealArea: '',
-				remark: '',
-				status: 1
-			},
-			rules: {
-				name: [{ required: true, message: '住户名称不能为空', trigger: ['blur', 'change'] }],
-				organizationId: [{ required: true, message: '所属组织不能为空', trigger: ['blur', 'change'] }],
-				plotId: [{ required: true, message: '小区名称不能为空', trigger: ['blur', 'change'] }],
-				floorId: [{ required: true, message: '楼宇名称不能为空', trigger: ['blur', 'change'] }],
-				unitId: [{ required: true, message: '单元名称不能为空', trigger: ['blur', 'change'] }],
-				heatStaId: [{ required: true, message: '所属换热站不能为空', trigger: ['blur', 'change'] }],
-				floorLevel: [{ required: true, message: '楼层不能为空', trigger: ['blur', 'change'] }],
-				roomNumber: [{ required: true, message: '房间号不能为空', trigger: ['blur', 'change'] }],
-				phone: [{ required: true, message: '手机号码不能为空', trigger: ['blur', 'change'] }],
-				forRealArea: [{ required: true, message: '实供面积不能为空', trigger: ['blur', 'change'] }],
-				buildingArea: [{ required: true, message: '建筑面积不能为空', trigger: ['blur', 'change'] }],
-			},
-			orgList: [],
-			plotList: [],
-			floorList: [],
-			unitList: [],
-			heatList: []
-		})
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id
-				getDetail()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				organizationId: '',
-				heatStaId: '',
-				plotId: '',
-				floorId: '',
-				unitId: '',
-				name: '',
-				floorLevel: '',
-				roomNumber: '',
-				phone: '',
-				buildingArea: '',
-				forRealArea: '',
-				remark: '',
-				status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false;
-			(formRef.value as any).clearValidate()
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-		}
-		const queryTree = () => {
-			heatApi.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.heatList = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.resident.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res,
-						heatStaId: res.heatStaId || ''
-					}
-				})
-		}
-		// 获取楼宇
-		const getFloorList = () => {
-			api.floor.allList({ plotId: state.ruleForm.plotId })
-				.then((res: any) => {
-					state.floorList = res.Info || []
-				})
-		}
-		// 获取单元
-		const getUnitList = () => {
-			api.unit.getListByFloorId({ floorId: state.ruleForm.floorId })
-				.then((res: any) => {
-					(state.unitList as any) = res ? [res] : []
-				})
-		}
-		const onPlotChange = () => { 
-			state.floorList = []
-			state.unitList = []
-			state.ruleForm.floorId = ''
-			state.ruleForm.unitId = ''
-			if (state.ruleForm.plotId) {
-				getFloorList()
-			}
-		}
-		const onFloorChange = () => {
-			state.unitList = []
-			state.ruleForm.unitId = ''
-			if (state.ruleForm.floorId) {
-				getUnitList()
-			}
-		}
-		// 新增
-		const onSubmit = () => {
-			const formWrap = unref(formRef) as any
-			if (!formWrap) return;
-			formWrap.validate((valid: boolean) => {
-				if (valid) {
-					let params = { ...state.ruleForm }
-
-					if (params.id) {
-						//修改
-						api.resident.edit(params).then(() => {
-							ElMessage.success('单元修改成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					} else {
-						//添加
-						api.resident.add(params).then(() => {
-							ElMessage.success('单元添加成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					}
-				}
-			})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			formRef,
-			onPlotChange,
-			onFloorChange,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 318
src/views/heating/heatStation/heatingDistrict/residentManage/index.vue

@@ -1,318 +0,0 @@
-<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="organizationId">
-						<el-tree-select
-							v-model="tableData.param.organizationId"
-							:data="orgList"
-							:props="{
-								label: 'name',
-								children: 'children'
-							}"
-							placeholder="请选择"
-							node-key="id"
-							:clearable="true"
-							check-strictly
-							style="width: 100%;"
-							:render-after-expand="true"
-							size="default"
-						/>
-          </el-form-item>
-          <el-form-item label="小区名称" prop="plotId">
-            <el-select v-model="tableData.param.plotId" @change="onPlotChange" placeholder="选择小区名称" filterable clearable size="default">
-							<el-option
-								v-for="item in plotList"
-								:key="item.id"
-								:label="item.name"
-								:value="item.id">
-							</el-option>
-						</el-select>
-          </el-form-item>
-          <el-form-item label="楼宇名称" prop="floorId">
-            <el-select v-model="tableData.param.floorId" @change="onFloorChange" placeholder="选择楼宇名称" filterable clearable size="default">
-							<el-option
-								v-for="item in floorList"
-								:key="item.id"
-								:label="item.name"
-								:value="item.id">
-							</el-option>
-						</el-select>
-          </el-form-item>
-          <el-form-item label="单元名称" prop="unitId">
-            <el-select v-model="tableData.param.unitId" placeholder="选择单元名称" filterable clearable size="default">
-							<el-option
-								v-for="item in unitList"
-								:key="item.id"
-								:label="item.name"
-								:value="item.id">
-							</el-option>
-						</el-select>
-          </el-form-item>
-          <el-form-item label="住户名称" prop="name">
-            <el-input v-model="tableData.param.name" placeholder="请输入住户名称" clearable size="default" style="width: 240px" @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="onOpenDialog()">
-              <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" v-loading="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="" min-width="100">
-          <template #default="{ row }">
-            {{ row.organizationInfo.name }}
-          </template>
-        </el-table-column>
-        <el-table-column label="小区名称" prop="" min-width="100">
-          <template #default="{ row }">
-            {{ row.plotInfo.name }}
-          </template>
-        </el-table-column>
-        <el-table-column label="楼宇名称" prop="" min-width="100">
-          <template #default="{ row }">
-            {{ row.floorInfo.name }}
-          </template>
-        </el-table-column>
-	    	<el-table-column label="单元名称" prop="name" min-width="100">
-          <template #default="{ row }">
-            {{ row.unitInfo.name }}
-          </template>
-        </el-table-column>
-	    	<el-table-column label="单元号" prop="number" min-width="100">
-          <template #default="{ row }">
-            {{ row.unitInfo.number }}
-          </template>
-        </el-table-column>
-	    	<el-table-column label="住户姓名" prop="name" min-width="100" />
-	    	<el-table-column label="楼层" prop="floorLevel" min-width="100" />
-	    	<el-table-column label="房间号" prop="roomNumber" min-width="100" />
-	    	<el-table-column label="电话号码" prop="phone" min-width="100" />
-	    	<el-table-column label="建筑面积" prop="buildingArea" min-width="100" />
-	    	<el-table-column label="实供面积" prop="forRealArea" min-width="100" />
-	    	<el-table-column label="更新时间" prop="createdAt" width="180"/>
-				<el-table-column prop="status" label="启用状态" width="120" align="center">
-					<template #default="scope">
-						<el-switch v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
-						</el-switch>
-					</template>
-				</el-table-column>
-        <el-table-column label="操作" width="200" align="center" fixed="right">
-          <template #default="scope">
-            <el-button size="small" text type="warning" @click="onOpenDialog(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="queryList" />
-    </el-card>
-    <EditDic ref="editDicRef" @queryList="queryList" />
-    <Detail ref="detailRef"  />
-  </div>
-</template>
-
-<script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent } 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/heatingDistrict';
-import systemApi from '/@/api/system';
-
-export default defineComponent({
-	name: 'loop',
-	components: { EditDic,Detail },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const detailRef=ref();
-		const queryRef = ref();
-		const state = reactive({
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					name: '',
-					plotId: '',
-					floorId: '',
-					unitId: '',
-					organizationId: '',
-					status: -1
-				},
-			},
-		});
-		// 组织
-		const orgList = ref([])
-		// 小区
-		const plotList = ref([])
-		// 楼宇
-		const floorList = ref([])
-		// 单元
-		const unitList = ref([])
-		// 初始化表格数据
-		const initTableData = () => {
-			queryList();
-		};
-		// 获取组织
-		const getOrgList = () => {
-			systemApi.org.getList({ name: '', status: -1 }).then((res: any) => {
-				orgList.value = res;
-			});
-		}
-		// 获取区域
-		const getPlotList = () => {
-			api.regionalManage.allList({})
-				.then((res: any) => {
-					plotList.value = res.Info || []
-				})
-		}
-		// 获取楼宇
-		const getFloorList = () => {
-			api.floor.allList({})
-				.then((res: any) => {
-					floorList.value = res.Info || []
-				})
-		}
-		// 获取单元
-		const getUnitList = () => {
-			api.unit.getListByFloorId({ floorId: state.tableData.param.floorId })
-				.then((res: any) => {
-					(unitList.value as any) = res ? [res] : []
-				})
-		}
-		const queryList = () => {
-			state.tableData.loading = true
-			api.resident.getList(state.tableData.param).then((res: any) => {
-				console.log(res);
-				state.tableData.data = res.Data || [];
-				state.tableData.total = res.Total;
-				state.tableData.loading = false
-			});
-		};
-		const onPlotChange = () => { 
-			floorList.value = []
-			unitList.value = []
-			state.tableData.param.floorId = ''
-			state.tableData.param.unitId = ''
-			if (state.tableData.param.plotId) {
-				getFloorList()
-			}
-		}
-		const onFloorChange = () => {
-			unitList.value = []
-			state.tableData.param.unitId = ''
-			if (state.tableData.param.floorId) {
-				getUnitList()
-			}
-		}
-		//查看详情
-		const onOpenDetail=(row: any)=>{
-			detailRef.value.openDialog(row);
-		}
-		// 打开新增修改弹窗
-		const onOpenDialog = (row: any) => {
-			editDicRef.value.orgList = orgList.value
-			editDicRef.value.plotList = plotList.value
-			editDicRef.value.openDialog(row);
-		};
-		
-		// 状态修改
-		const handleStatusChange = (row: any) => {
-			let text = row.status === 1 ? '启用' : '停用';
-			ElMessageBox.confirm('确认要"' + text + '":"' + row.name + '"住户吗?', '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(function () {
-					return api.resident.setStatus(row.id, row.status);
-				})
-				.then(() => {
-					ElMessage.success(text + '成功');
-				})
-				.catch(function () {
-					row.status = row.status === 0 ? 1 : 0;
-				});
-		};
-		// 删除产品
-		const onRowDel = (row: any) => {
-			let msg = `此操作将永久删除住户:“${row.name}”,是否继续?`;
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					api.resident.del(row.id).then(() => {
-						ElMessage.success('删除成功');
-						queryList();
-					});
-				})
-				.catch(() => {});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-			getOrgList();
-			getPlotList()
-			// getFloorList()
-			// getUnitList()
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			queryList();
-		};
-
-		return {
-			addDicRef,
-			editDicRef,
-			detailRef,
-			queryRef,
-			onOpenDetail,
-			onOpenDialog,
-			onRowDel,
-			queryList,
-			resetQuery,
-			orgList,
-			plotList,
-			floorList,
-			unitList,
-			onPlotChange,
-			onFloorChange,
-			handleStatusChange,
-			...toRefs(state),
-		};
-	},
-});
-</script>

+ 0 - 200
src/views/heating/heatStation/heatingDistrict/unitManage/component/detail.vue

@@ -1,200 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="'环路详情'" v-model="dialogVisible" width="950px">
-			<el-form :model="ruleForm" ref="formRef" size="default" label-width="110px">
-				<el-form-item label="环路名称" prop="name">
-					{{ ruleForm.name }}
-				</el-form-item>
-				<el-form-item label="环路编号" prop="code">
-					{{ ruleForm.code }}
-				</el-form-item>
-				<el-form-item label="所属换热站" prop="stationId">
-          {{ ruleForm.stationId }}
-					<!-- <el-tree-select
-						v-model="ruleForm.stationId"
-						:data="treeData"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/> -->
-				</el-form-item>
-        <el-form-item label="环路类型" prop="loopTypes">
-          {{ ruleForm.loopTypes === 1 ? '一网' : '二网' }}
-        </el-form-item>
-        <el-form-item label="节能类型" prop="energyTypes">
-          {{ ruleForm.energyTypes === 1 ? '节能' : '' }}
-        </el-form-item>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖对象" prop="heatingObject">
-              {{ ruleForm.heatingObject === 1 ? '公建' : '居民' }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="供暖类型" prop="heatingTypes">
-              {{ ruleForm.heatingTypes === 1 ? '地暖' : '暖气片' }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-row :gutter="10">
-          <el-col :span="12">
-            <el-form-item label="供暖面积" prop="heatingArea">
-              {{ ruleForm.heatingArea }}
-            </el-form-item>
-          </el-col>
-          <el-col :span="12">
-            <el-form-item label="实际面积" prop="forRealArea">
-              {{ ruleForm.forRealArea }}
-            </el-form-item>
-          </el-col>
-        </el-row>
-        <el-form-item label="环路年代" prop="decade">
-          {{ ruleForm.decade }}
-        </el-form-item>
-				<el-form-item label="状态" prop="status">
-          {{ ruleForm.decade === 1 ? '在线' : '不在线' }}
-				</el-form-item>
-        <el-form-item label="路线信息" prop="">
-					<div class="mb10" style="width: 100%">
-						<div style="display: flex;" class="mb10" v-for="(item, index) in pointList" :key="index">
-							<el-input v-model="item.position" :disabled="!item.editFalg" @keydown="onLocalChange(item, index)" @change="onLocalChange(item, index)" placeholder="请输入关键字进行搜索" clearable style="flex: 1; margin-right: 10px"></el-input>
-							<span>排序:</span>
-							<el-input-number v-model="item.sort" :controls="false" :disabled="!item.editFalg" placeholder="排序" clearable style="width: 100px; margin-right: 10px"></el-input-number>
-						</div>
-					</div>
-        </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 } from 'vue';
-import api from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-interface Point {
-	sort?: number;
-	lnt: number;
-	lat: number
-}
-interface RuleFormState {
-	id?: number;
-	name: string;
-	code: string;
-	stationId: string;
-	loopTypes: string;
-	energyTypes: string;
-	heatingObject: string;
-	heatingTypes: string;
-	heatingArea: string;
-	forRealArea: string;
-	viaPoint: Array<Point>;
-	decade: string;
-	status: number;
-}
-
-export default defineComponent({
-	name: 'headStationLoop',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-        decade: '',
-				viaPoint: [],
-        status: 1
-			},
-			treeData: [],
-      pointList: [] as any
-		})
-		// 打开弹窗
-		const openDialog = (row: RuleFormState | null) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id
-				getDetail()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				name: '',
-        code: '',
-        stationId: '',
-        loopTypes: '',
-        energyTypes: '',
-        heatingObject: '',
-        heatingTypes: '',
-        heatingArea: '',
-        forRealArea: '',
-				viaPoint: [],
-        decade: '',
-        status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-			state.pointList = []
-		}
-		const queryTree = () => {
-			api.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.treeData = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.loop.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res
-					}
-					state.pointList = state.ruleForm.viaPoint.map((item: any) => ({
-						...item,
-						editFlag: false
-					}))
-				})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			formRef,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 221
src/views/heating/heatStation/heatingDistrict/unitManage/component/edit.vue

@@ -1,221 +0,0 @@
-<template>
-	<div class="system-edit-dic-container">
-		<el-dialog :title="(ruleForm.id !== 0 ? '修改' : '添加') + '单元'" v-model="dialogVisible" width="550px">
-			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
-				<el-form-item label="所属组织" prop="organizationId">
-					<el-tree-select
-						v-model="ruleForm.organizationId"
-						:data="orgList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<!-- heatStaId -->
-				<el-form-item label="所属换热站" prop="">
-					<el-tree-select
-						v-model="ruleForm.heatStaId"
-						:data="heatList"
-						:props="{
-							label: 'name',
-							children: 'children'
-						}"
-						node-key="id"
-						:clearable="true"
-						check-strictly
-						style="width: 100%;"
-						:render-after-expand="true"
-					/>
-				</el-form-item>
-				<el-form-item label="小区名称" prop="plotId">
-					<el-select v-model="ruleForm.plotId" @change="onPlotChange" placeholder="选择小区名称" filterable clearable size="default" style="width: 100%">
-						<el-option
-							v-for="item in plotList"
-							:key="item.id"
-							:label="item.name"
-							:value="item.id">
-						</el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="楼宇名称" prop="floorId">
-					<el-select v-model="ruleForm.floorId" placeholder="选择楼宇名称" filterable clearable size="default" style="width: 100%">
-						<el-option
-							v-for="item in floorList"
-							:key="item.id"
-							:label="item.name"
-							:value="item.id">
-						</el-option>
-					</el-select>
-				</el-form-item>
-				<el-form-item label="单元名称" prop="name">
-					<el-input v-model="ruleForm.name" placeholder="请输入单元名称" />
-				</el-form-item>
-				<el-form-item label="单元号" prop="number">
-					<el-input v-model="ruleForm.number" placeholder="请输入单元号" />
-				</el-form-item>
-				<el-form-item label="状态" prop="status">
-					<el-radio v-model="ruleForm.status" :label="1">启用</el-radio>
-					<el-radio v-model="ruleForm.status" :label="0">禁用</el-radio>
-				</el-form-item>
-				<el-form-item label="备注" prop="remark">
-					<el-input type="textarea" :rows="8" v-model="ruleForm.remark" 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.id !== 0 ? '修 改' : '添 加' }}</el-button>
-				</span>
-			</template>
-		</el-dialog>
-	</div>
-</template>
-
-<script lang="ts">
-import { reactive, toRefs, defineComponent, ref, unref, nextTick } from 'vue';
-import api from '/@/api/heatingDistrict';
-import heatApi from '/@/api/heatStation';
-import { ElMessage } from 'element-plus';
-
-export default defineComponent({
-	name: 'edit',
-	setup(prop, { emit }) {
-		const formRef = ref<HTMLElement | null>(null);
-		const state = reactive({
-			dialogVisible: false,
-			ruleForm: {
-				id: 0,
-				name: '',
-        organizationId: '',
-        plotId: '',
-        floorId: '',
-        heatStaId: '',
-        number: '',
-        remark: '',
-				status: 1
-			},
-			rules: {
-				name: [{ required: true, message: '单元名称不能为空', trigger: ['blur', 'change'] }],
-				organizationId: [{ required: true, message: '所属组织不能为空', trigger: ['blur', 'change'] }],
-				plotId: [{ required: true, message: '小区名称不能为空', trigger: ['blur', 'change'] }],
-				floorId: [{ required: true, message: '楼宇名称不能为空', trigger: ['blur', 'change'] }],
-				heatStaId: [{ required: true, message: '所属换热站不能为空', trigger: ['blur', 'change'] }],
-				number: [{ required: true, message: '楼号不能为空', trigger: ['blur', 'change'] }],
-			},
-			orgList: [],
-			plotList: [],
-			floorList: [],
-			heatList: []
-		})
-		// 打开弹窗
-		const openDialog = (row: any) => {
-			resetForm()
-			queryTree()
-			if (row) {
-				(state.ruleForm as any).id = row.id;
-				(state.ruleForm as any).plotId = row.plotId;
-				getDetail()
-				getFloorList()
-			}
-			state.dialogVisible = true
-		}
-		const resetForm = () => {
-			state.ruleForm = {
-				id: 0,
-				name: '',
-        organizationId: '',
-        plotId: '',
-        floorId: '',
-        heatStaId: '',
-        number: '',
-        remark: '',
-				status: 1
-			}
-		}
-		// 关闭弹窗
-		const closeDialog = () => {
-			state.dialogVisible = false;
-			(formRef.value as any).clearValidate()
-		}
-		// 取消
-		const onCancel = () => {
-			closeDialog()
-		}
-		const queryTree = () => {
-			heatApi.heatStation.getList({
-					name: '',
-					code: '',
-					status: -1
-				})
-				.then((res: any) => {
-					state.heatList = res || [];
-				});
-		};
-		const getDetail = () => {
-			api.unit.detail(state.ruleForm.id)
-				.then((res: any) => {
-					state.ruleForm = {
-						...res,
-						heatStaId: res.heatStaId || ''
-					}
-				})
-		}
-		const onPlotChange = () => {
-			state.floorList = []
-			state.ruleForm.floorId = ''
-			if (state.ruleForm.plotId) {
-				getFloorList()
-			}
-		}
-		// 获取楼宇
-		const getFloorList = () => {
-			api.floor.allList({ plotId: state.ruleForm.plotId })
-				.then((res: any) => {
-					state.floorList = res.Info || []
-				})
-		}
-		// 新增
-		const onSubmit = () => {
-			const formWrap = unref(formRef) as any
-			if (!formWrap) return;
-			formWrap.validate((valid: boolean) => {
-				if (valid) {
-					let params = { ...state.ruleForm }
-
-					if (params.id) {
-						//修改
-						api.unit.edit(params).then(() => {
-							ElMessage.success('单元修改成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					} else {
-						//添加
-						api.unit.add(params).then(() => {
-							ElMessage.success('单元添加成功')
-							closeDialog() // 关闭弹窗
-							emit('queryList')
-						})
-					}
-				}
-			})
-		}
-
-		return {
-			openDialog,
-			closeDialog,
-			onCancel,
-			onSubmit,
-			formRef,
-			onPlotChange,
-			...toRefs(state)
-		}
-	}
-})
-</script>

+ 0 - 260
src/views/heating/heatStation/heatingDistrict/unitManage/index.vue

@@ -1,260 +0,0 @@
-<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="organizationId">
-						<el-tree-select
-							v-model="tableData.param.organizationId"
-							:data="orgList"
-							:props="{
-								label: 'name',
-								children: 'children'
-							}"
-							placeholder="请选择"
-							node-key="id"
-							:clearable="true"
-							check-strictly
-							style="width: 100%;"
-							:render-after-expand="true"
-							size="default"
-						/>
-          </el-form-item>
-          <el-form-item label="小区名称" prop="plotId">
-            <el-select v-model="tableData.param.plotId" @change="onPlotChange" placeholder="选择小区名称" filterable clearable size="default">
-							<el-option
-								v-for="item in plotList"
-								:key="item.id"
-								:label="item.name"
-								:value="item.id">
-							</el-option>
-						</el-select>
-          </el-form-item>
-          <el-form-item label="楼宇名称" prop="floorId">
-            <el-select v-model="tableData.param.floorId" placeholder="选择楼宇名称" filterable clearable size="default">
-							<el-option
-								v-for="item in floorList"
-								:key="item.id"
-								:label="item.name"
-								:value="item.id">
-							</el-option>
-						</el-select>
-          </el-form-item>
-          <el-form-item label="单元名称" prop="name">
-            <el-input v-model="tableData.param.name" placeholder="请输入单元名称" clearable size="default" style="width: 240px" @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="onOpenDialog()">
-              <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" v-loading="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="organizationInfo.name" min-width="100" />
-        <el-table-column label="小区名称" prop="plotInfo.name" min-width="100" />
-        <el-table-column label="楼宇名称" prop="floorInfo.name" min-width="100" />
-        <el-table-column label="楼号" prop="floorInfo.number" min-width="100" />
-	    	<el-table-column label="单元名称" prop="name" min-width="100" />
-	    	<el-table-column label="单元号" prop="number" min-width="100" />
-	    	<el-table-column label="更新时间" prop="updatedAt" width="180" />
-				<el-table-column prop="status" label="启用状态" width="120" align="center">
-					<template #default="scope">
-						<el-switch v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
-						</el-switch>
-					</template>
-				</el-table-column>
-        <el-table-column label="操作" width="200" align="center" fixed="right">
-          <template #default="scope">
-            <el-button size="small" text type="warning" @click="onOpenDialog(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="queryList" />
-    </el-card>
-    <EditDic ref="editDicRef" @queryList="queryList" />
-    <Detail ref="detailRef"  />
-  </div>
-</template>
-
-<script lang="ts">
-import { toRefs, reactive, onMounted, ref, defineComponent } 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/heatingDistrict';
-import systemApi from '/@/api/system';
-
-export default defineComponent({
-	name: 'loop',
-	components: { EditDic,Detail },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const detailRef=ref();
-		const queryRef = ref();
-		const state = reactive({
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					name: '',
-					plotId: '',
-					floorId: '',
-					organizationId: '',
-					status: -1
-				},
-			},
-		});
-		// 组织
-		const orgList = ref([])
-		// 小区
-		const plotList = ref([])
-		// 楼宇
-		const floorList = ref([])
-		// 初始化表格数据
-		const initTableData = () => {
-			queryList();
-		};
-		// 获取组织
-		const getOrgList = () => {
-			systemApi.org.getList({ name: '', status: -1 }).then((res: any) => {
-				orgList.value = res;
-			});
-		}
-		// 获取区域
-		const getPlotList = () => {
-			api.regionalManage.allList({})
-				.then((res: any) => {
-					plotList.value = res.Info || []
-				})
-		}
-		// 获取楼宇
-		const getFloorList = () => {
-			api.floor.allList({ plotId: state.tableData.param.plotId })
-				.then((res: any) => {
-					floorList.value = res.Info || []
-				})
-		}
-		const queryList = () => {
-			state.tableData.loading = true
-			api.unit.getList(state.tableData.param).then((res: any) => {
-				console.log(res);
-				state.tableData.data = res.Data || [];
-				state.tableData.total = res.Total;
-				state.tableData.loading = false
-			});
-		};
-		const onPlotChange = () => {
-			floorList.value = []
-			state.tableData.param.floorId = ''
-			if (state.tableData.param.plotId) {
-				getFloorList()
-			}
-		}
-		//查看详情
-		const onOpenDetail=(row: any)=>{
-			detailRef.value.openDialog(row);
-		}
-		// 打开新增修改弹窗
-		const onOpenDialog = (row: any) => {
-			editDicRef.value.orgList = orgList.value
-			editDicRef.value.plotList = plotList.value
-			editDicRef.value.openDialog(row);
-		};
-		
-		// 状态修改
-		const handleStatusChange = (row: any) => {
-			let text = row.status === 1 ? '启用' : '停用';
-			ElMessageBox.confirm('确认要"' + text + '":"' + row.name + '"单元吗?', '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(function () {
-					return api.unit.setStatus(row.id, row.status);
-				})
-				.then(() => {
-					ElMessage.success(text + '成功');
-				})
-				.catch(function () {
-					row.status = row.status === 0 ? 1 : 0;
-				});
-		};
-		// 删除产品
-		const onRowDel = (row: any) => {
-			let msg = `此操作将永久删除单元:“${row.name}”,是否继续?`;
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					api.unit.del(row.id).then(() => {
-						ElMessage.success('删除成功');
-						queryList();
-					});
-				})
-				.catch(() => {});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-			getOrgList();
-			getPlotList()
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			queryList();
-		};
-
-		return {
-			addDicRef,
-			editDicRef,
-			detailRef,
-			queryRef,
-			onOpenDetail,
-			onOpenDialog,
-			onRowDel,
-			queryList,
-			resetQuery,
-			orgList,
-			plotList,
-			floorList,
-			onPlotChange,
-			handleStatusChange,
-			...toRefs(state),
-		};
-	},
-});
-</script>

+ 440 - 418
src/views/heating/monitor/weather.vue

@@ -1,69 +1,70 @@
 <template>
-	<div class="monitor-weather">
-		<div class="left">
-			<div class="city-weather-data-overview-wrap">
-				<section class="title">
-					<span>城市</span>
-					<span>风力</span>
-					<span>日照时长</span>
-				</section>
-				<section style="cursor: pointer" :class="currentcityId == item.id ? 'active' : ''" @click="currentcityId = item.id, currentcityName = item.name" v-for="(item, index) in cityList" :key="index">
-					<span>{{ item.name }}</span>
-					<span>{{ item.windpower }}</span>
-					<span>{{ item.sunshineDuration }}</span>
-				</section>
-			</div>
-		</div>
-		<div class="right">
-			<el-row :gutter="15" class="home-card-two mb15">
-				<el-col>
-					<div class="weather-info">
-						<section v-if="oneCityInfo.weather">
-							<span class="temperature">{{ oneCityInfo.Temperature }}℃</span>
-							<img :src="`/imgs/weather/${oneCityInfo.weather}.svg`" alt="">
-							<span class="weather">{{ oneCityInfo.weather }}</span>
-							<span>{{ oneCityInfo.reporttime }}更新</span>
-						</section>
-						<section>
-							<span style="margin-right: 20px;">地点:{{ currentcityName }}</span>
-							<img src="/@/assets/img/windPowerIcon.svg" alt="">
-							<span>风力: {{ oneCityInfo.winddirection + oneCityInfo.windpower }}</span>
-							<img class="sunset-sunrise" src="/@/assets/img/sunset.svg" alt="">
-							<span class="sunset">日出时间: {{ oneCityInfo.sunrise }}</span>
-							<span>日落时间: {{ oneCityInfo.sunset }}</span>
-						</section>
-					</div>
-				</el-col>
-			</el-row>
-			<el-row :gutter="15" class="home-card-two mb15">
-				<el-col>
-					<div class="home-card-item">
-						<div class="home-card-item-title">
-							<span>温度 监测图表</span>
-							<el-select @change="getTemperatureEchartById(currentcityId)" v-model="temperatureType" placeholder="请选择查询范围" size="mini">
-								<el-option v-for="item in ranges" :key="item.value" :label="item.label" :value="item.value" />
-							</el-select>
-						</div>
-						<div style="height: 100%" ref="homeTemLineRef"></div>
-					</div>
-				</el-col>
-			</el-row>
-			<el-row :gutter="15" class="home-card-three">
-				<el-col>
-					<div class="home-card-item">
-						<div class="home-card-item-title">
-							<span>风力 监测图表</span>
-							<el-select @change="getWindpowerEchartById(currentcityId)" v-model="windpowerType" placeholder="请选择查询范围" size="mini">
-								<el-option v-for="item in ranges" :key="item.value" :label="item.label" :value="item.value" />
-							</el-select>
-						</div>
-						<div style="height: 100%" ref="homeWindLineRef"></div>
-					</div>
-				</el-col>
-			</el-row>
-		</div>
-
-	</div>
+  <div class="monitor-weather">
+    <div class="left" :style="{width: isCollapse?'384px':'40px',minWidth: isCollapse?'384px':'40px'}">
+      <SvgIcon class="collapse" :name="isCollapse ? 'ele-Expand' : 'ele-Fold'" :size="16" @click="changeCollapse" />
+      <div class="city-weather-data-overview-wrap" v-if="isCollapse">
+        <section class="title">
+          <span>城市</span>
+          <span>风力</span>
+          <span>日照时长</span>
+        </section>
+        <section style="cursor: pointer" :class="currentcityId == item.id ? 'active' : ''" @click="currentcityId = item.id, currentcityName = item.name" v-for="(item, index) in cityList" :key="index">
+          <span>{{ item.name }}</span>
+          <span>{{ item.windpower }}</span>
+          <span>{{ item.sunshineDuration }}</span>
+        </section>
+      </div>
+    </div>
+    <div class="right">
+      <el-row :gutter="15" class="home-card-two mb15">
+        <el-col>
+          <div class="weather-info">
+            <section v-if="oneCityInfo.weather">
+              <span class="temperature">{{ oneCityInfo.Temperature }}℃</span>
+              <img :src="`/imgs/weather/${oneCityInfo.weather}.svg`" alt="">
+              <span class="weather">{{ oneCityInfo.weather }}</span>
+              <span>{{ oneCityInfo.reporttime }}更新</span>
+            </section>
+            <section>
+              <span style="margin-right: 20px;">地点:{{ currentcityName }}</span>
+              <img src="/@/assets/img/windPowerIcon.svg" alt="">
+              <span>风力: {{ oneCityInfo.winddirection + oneCityInfo.windpower }}</span>
+              <img class="sunset-sunrise" src="/@/assets/img/sunset.svg" alt="">
+              <span class="sunset">日出时间: {{ oneCityInfo.sunrise }}</span>
+              <span>日落时间: {{ oneCityInfo.sunset }}</span>
+            </section>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row :gutter="15" class="home-card-two mb15">
+        <el-col>
+          <div class="home-card-item">
+            <div class="home-card-item-title">
+              <span>温度 监测图表</span>
+              <el-select @change="getTemperatureEchartById(currentcityId)" v-model="temperatureType" placeholder="请选择查询范围" size="mini">
+                <el-option v-for="item in ranges" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </div>
+            <div style="height: 100%" ref="homeTemLineRef"></div>
+          </div>
+        </el-col>
+      </el-row>
+      <el-row :gutter="15" class="home-card-three">
+        <el-col>
+          <div class="home-card-item">
+            <div class="home-card-item-title">
+              <span>风力 监测图表</span>
+              <el-select @change="getWindpowerEchartById(currentcityId)" v-model="windpowerType" placeholder="请选择查询范围" size="mini">
+                <el-option v-for="item in ranges" :key="item.value" :label="item.label" :value="item.value" />
+              </el-select>
+            </div>
+            <div style="height: 100%" ref="homeWindLineRef"></div>
+          </div>
+        </el-col>
+      </el-row>
+    </div>
+
+  </div>
 </template>
 
 <script lang="ts">
@@ -74,353 +75,361 @@ import { useStore } from '/@/store/index';
 import api from '/@/api/datahub';
 
 let global: any = {
-	homeChartOne: null,
-	homeChartTwo: null,
-	homeCharThree: null,
-	dispose: [null, '', undefined]
+  homeChartOne: null,
+  homeChartTwo: null,
+  homeCharThree: null,
+  dispose: [null, '', undefined]
 };
 
 export default defineComponent({
-	name: 'home',
-	setup() {
-		const homeTemLineRef = ref();
-		const homeWindLineRef = ref();
-		const store = useStore();
-		const state = reactive({
-			city: '',
-			cityList: [],
-			oneCityInfo: {},
-			temperatureType: 1,
-			windpowerType: 1,
-			ranges: [
-				{
-					value: 1,
-					label: "日数据"
-				},
-				{
-					value: 2,
-					label: "周数据"
-				},
-				{
-					value: 3,
-					label: "月数据"
-				},
-				{
-					value: 4,
-					label: "年数据"
-				}
-			],
-			xAxis: [],
-			tem: [],
-			averageTem: [],
-			xAxisWind: [],
-			temWind: [],
-			averageTemWind: [],
-			currentcityId: 0,
-			currentcityName: '',
-			myCharts: [],
-			charts: {
-				theme: '',
-				bgColor: '',
-				color: '#303133',
-			},
-		});
-		// 获取左侧数据
-		const getCityWeatherList = () => {
-			api.weather.getCityWeatherList().then((res: any) => {
-				state.cityList = res.Info;
-				if (!res.Info.length) return;
-				state.currentcityId = res.Info[0].id;
-				state.currentcityName = res.Info[0].name;
-			});
-		};
-
-		// 根据ID获取指定城市的风力图表
-		const getWindpowerEchartById = (id: number) => {
-			api.weather.getWindpowerEchartById({ id: id, types: state.windpowerType }).then((res: any) => {
-				const { AvgInfo, Info } = res;
-				state.xAxisWind = [];
-				state.temWind = [];
-				state.averageTemWind = [];
-				if (Info && Info.length) {
-					Info.forEach((i: any) => {
-						state.xAxisWind.push(i.time);
-						state.temWind.push(i.value);
-					})
-				}
-				if (AvgInfo && AvgInfo.length) {
-					AvgInfo.forEach((i: any) => {
-						state.averageTemWind.push(i.value)
-					})
-				}
-				nextTick(() => {
-					initWindLineChart();
-				});
-			});
-		};
-
-		// 根据ID获取指定城市的温度图表
-		const getTemperatureEchartById = (id: number) => {
-			api.weather.getTemperatureEchartById({ id: id, types: state.temperatureType }).then((res: any) => {
-				const { AvgInfo, Info } = res;
-				state.xAxis = [];
-				state.tem = [];
-				state.averageTem = [];
-				if (Info && Info.length) {
-					Info.forEach((i: any) => {
-						state.xAxis.push(i.time);
-						state.tem.push(i.value);
-					})
-				}
-				if (AvgInfo && AvgInfo.length) {
-					AvgInfo.forEach((i: any) => {
-						state.averageTem.push(i.value)
-					})
-				}
-				nextTick(() => {
-					initTemLineChart();
-				});
-			});
-		};
-
-		// 获取顶部天气数据
-		const getWhichCityWeather = (id: number) => {
-			api.weather.getWhichCityWeather({ id: id }).then((res: any) => {
-				state.oneCityInfo = res.Info
-			});
-		};
-
-		// 温度折线图
-		const initTemLineChart = () => {
-			if (!global.dispose.some((b: any) => b === global.homeChartOne)) global.homeChartOne.dispose();
-			global.homeChartOne = <any>echarts.init(homeTemLineRef.value, state.charts.theme);
-
-			const option = {
-				backgroundColor: state.charts.bgColor,
-				grid: { top: 70, right: 40, bottom: 50, left: 40 },
-				tooltip: { trigger: 'axis' },
-				legend: { data: ['气温(℃)', '当日平均(℃)'], left: '40%' },
-				xAxis: {
-					data: state.xAxis
-				},
-				yAxis: [
-					{
-						type: 'value',
-						axisLabel: {
-							formatter: "{value}℃"
-						},
-						splitLine: { show: true, lineStyle: { type: 'dashed', color: '#f5f5f5' } },
-					},
-				],
-				series: [
-					{
-						name: '气温(℃)',
-						type: 'line',
-						symbolSize: 6,
-						symbol: 'circle',
-						smooth: true,
-						// data: [0, 41.1, 30.4, 65.1, 53.3, 53.3, 53.3, 41.1, 30.4, 65.1, 53.3, 10],
-						data: state.tem,
-						lineStyle: { color: '#fe9a8b' },
-						itemStyle: { color: '#fe9a8b', borderColor: '#fe9a8b' },
-						areaStyle: {
-							color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-								{ offset: 0, color: '#fe9a8bb3' },
-								{ offset: 1, color: '#fe9a8b03' },
-							]),
-						},
-					},
-					{
-						name: '当日平均(℃)',
-						type: 'line',
-						symbolSize: 6,
-						symbol: 'circle',
-						smooth: true,
-						data: state.averageTem,
-						lineStyle: { color: '#9E87FF' },
-						itemStyle: { color: '#9E87FF', borderColor: '#9E87FF' },
-						areaStyle: {
-							color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-								{ offset: 0, color: '#9E87FFb3' },
-								{ offset: 1, color: '#9E87FF03' },
-							]),
-						},
-						emphasis: {
-							itemStyle: {
-								color: {
-									type: 'radial',
-									x: 0.5,
-									y: 0.5,
-									r: 0.5,
-									colorStops: [
-										{ offset: 0, color: '#9E87FF' },
-										{ offset: 0.4, color: '#9E87FF' },
-										{ offset: 0.5, color: '#fff' },
-										{ offset: 0.7, color: '#fff' },
-										{ offset: 0.8, color: '#fff' },
-										{ offset: 1, color: '#fff' },
-									],
-								},
-								borderColor: '#9E87FF',
-								borderWidth: 2,
-							},
-						},
-					},
-				],
-			};
-			(<any>global.homeChartOne).setOption(option);
-			(<any>state.myCharts).push(global.homeChartOne);
-		};
-		// 风力折线图
-		const initWindLineChart = () => {
-			if (!global.dispose.some((b: any) => b === global.homeChartTwo)) global.homeChartTwo.dispose();
-			global.homeChartTwo = <any>echarts.init(homeWindLineRef.value, state.charts.theme);
-			const option = {
-				backgroundColor: state.charts.bgColor,
-				grid: { top: 70, right: 40, bottom: 50, left: 40 },
-				tooltip: { trigger: 'axis' },
-				legend: { data: ['风力(级)', '当日风力(级)'], left: '40%' },
-				xAxis: {
-					data: state.xAxisWind
-				},
-				yAxis: [
-					{
-						type: 'value',
-						axisLabel: {
-							formatter: "{value}级"
-						},
-						splitLine: { show: true, lineStyle: { type: 'dashed', color: '#f5f5f5' } },
-					},
-				],
-				series: [
-					{
-						name: '风力(级)',
-						type: 'line',
-						symbolSize: 6,
-						symbol: 'circle',
-						smooth: true,
-						// data: [0, 41.1, 30.4, 65.1, 53.3, 53.3, 53.3, 41.1, 30.4, 65.1, 53.3, 10],
-						data: state.temWind,
-						lineStyle: { color: '#fe9a8b' },
-						itemStyle: { color: '#fe9a8b', borderColor: '#fe9a8b' },
-						areaStyle: {
-							color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-								{ offset: 0, color: '#fe9a8bb3' },
-								{ offset: 1, color: '#fe9a8b03' },
-							]),
-						},
-					},
-					{
-						name: '当日风力(级)',
-						type: 'line',
-						symbolSize: 6,
-						symbol: 'circle',
-						smooth: true,
-						// data: [0, 24.1, 7.2, 15.5, 42.4, 42.4, 42.4, 24.1, 7.2, 15.5, 42.4, 0],
-						data: state.averageTemWind,
-						lineStyle: { color: '#9E87FF' },
-						itemStyle: { color: '#9E87FF', borderColor: '#9E87FF' },
-						areaStyle: {
-							color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
-								{ offset: 0, color: '#9E87FFb3' },
-								{ offset: 1, color: '#9E87FF03' },
-							]),
-						},
-						emphasis: {
-							itemStyle: {
-								color: {
-									type: 'radial',
-									x: 0.5,
-									y: 0.5,
-									r: 0.5,
-									colorStops: [
-										{ offset: 0, color: '#9E87FF' },
-										{ offset: 0.4, color: '#9E87FF' },
-										{ offset: 0.5, color: '#fff' },
-										{ offset: 0.7, color: '#fff' },
-										{ offset: 0.8, color: '#fff' },
-										{ offset: 1, color: '#fff' },
-									],
-								},
-								borderColor: '#9E87FF',
-								borderWidth: 2,
-							},
-						},
-					},
-				],
-			};
-			(<any>global.homeChartTwo).setOption(option);
-			(<any>state.myCharts).push(global.homeChartTwo);
-		};
-		// 批量设置 echarts resize
-		const initEchartsResizeFun = () => {
-			nextTick(() => {
-				for (let i = 0; i < state.myCharts.length; i++) {
-					setTimeout(() => {
-						(<any>state.myCharts[i]).resize();
-					}, i * 1000);
-				}
-			});
-		};
-		// 批量设置 echarts resize
-		const initEchartsResize = () => {
-			window.addEventListener('resize', initEchartsResizeFun);
-		};
-		// 页面加载时
-		onMounted(() => {
-			initEchartsResize();
-			getCityWeatherList();
-		});
-		// 由于页面缓存原因,keep-alive
-		onActivated(() => {
-			initEchartsResizeFun();
-		});
-		// 监听 vuex 中的 tagsview 开启全屏变化,重新 resize 图表,防止不出现/大小不变等
-		watch(
-			() => store.state.tagsViewRoutes.isTagsViewCurrenFull,
-			() => {
-				initEchartsResizeFun();
-			}
-		);
-		// 监听 vuex 中是否开启深色主题
-		watch(
-			() => store.state.themeConfig.themeConfig.isIsDark,
-			(isIsDark) => {
-				nextTick(() => {
-					state.charts.theme = isIsDark ? 'dark' : '';
-					state.charts.bgColor = isIsDark ? 'transparent' : '';
-					state.charts.color = isIsDark ? '#dadada' : '#303133';
-					setTimeout(() => {
-						initTemLineChart();
-					}, 500);
-					setTimeout(() => {
-						initWindLineChart();
-					}, 700);
-				});
-			},
-			{
-				deep: true,
-				immediate: true,
-			}
-		);
-		watch(
-			() => state.currentcityId,
-			() => {
-				getWhichCityWeather(state.currentcityId);
-				getTemperatureEchartById(state.currentcityId);
-				getWindpowerEchartById(state.currentcityId)
-			}
-		);
-		return {
-			homeTemLineRef,
-			homeWindLineRef,
-			getWhichCityWeather,
-			getCityWeatherList,
-			getTemperatureEchartById,
-			getWindpowerEchartById,
-			...toRefs(state),
-		};
-	},
+  name: 'home',
+  setup() {
+    const homeTemLineRef = ref();
+    const homeWindLineRef = ref();
+    const isCollapse = ref(true);
+    const store = useStore();
+    const state = reactive({
+      city: '',
+      cityList: [],
+      oneCityInfo: {},
+      temperatureType: 1,
+      windpowerType: 1,
+      ranges: [
+        {
+          value: 1,
+          label: "日数据"
+        },
+        {
+          value: 2,
+          label: "周数据"
+        },
+        {
+          value: 3,
+          label: "月数据"
+        },
+        {
+          value: 4,
+          label: "年数据"
+        }
+      ],
+      xAxis: [],
+      tem: [],
+      averageTem: [],
+      xAxisWind: [],
+      temWind: [],
+      averageTemWind: [],
+      currentcityId: 0,
+      currentcityName: '',
+      myCharts: [],
+      charts: {
+        theme: '',
+        bgColor: '',
+        color: '#303133',
+      },
+    });
+    // 获取左侧数据
+    const getCityWeatherList = () => {
+      api.weather.getCityWeatherList().then((res: any) => {
+        state.cityList = res.Info;
+        if (!res.Info.length) return;
+        state.currentcityId = res.Info[0].id;
+        state.currentcityName = res.Info[0].name;
+      });
+    };
+
+    // 根据ID获取指定城市的风力图表
+    const getWindpowerEchartById = (id: number) => {
+      api.weather.getWindpowerEchartById({ id: id, types: state.windpowerType }).then((res: any) => {
+        const { AvgInfo, Info } = res;
+        state.xAxisWind = [];
+        state.temWind = [];
+        state.averageTemWind = [];
+        if (Info && Info.length) {
+          Info.forEach((i: any) => {
+            state.xAxisWind.push(i.time);
+            state.temWind.push(i.value);
+          })
+        }
+        if (AvgInfo && AvgInfo.length) {
+          AvgInfo.forEach((i: any) => {
+            state.averageTemWind.push(i.value)
+          })
+        }
+        nextTick(() => {
+          initWindLineChart();
+        });
+      });
+    };
+
+    // 根据ID获取指定城市的温度图表
+    const getTemperatureEchartById = (id: number) => {
+      api.weather.getTemperatureEchartById({ id: id, types: state.temperatureType }).then((res: any) => {
+        const { AvgInfo, Info } = res;
+        state.xAxis = [];
+        state.tem = [];
+        state.averageTem = [];
+        if (Info && Info.length) {
+          Info.forEach((i: any) => {
+            state.xAxis.push(i.time);
+            state.tem.push(i.value);
+          })
+        }
+        if (AvgInfo && AvgInfo.length) {
+          AvgInfo.forEach((i: any) => {
+            state.averageTem.push(i.value)
+          })
+        }
+        nextTick(() => {
+          initTemLineChart();
+        });
+      });
+    };
+
+    // 获取顶部天气数据
+    const getWhichCityWeather = (id: number) => {
+      api.weather.getWhichCityWeather({ id: id }).then((res: any) => {
+        state.oneCityInfo = res.Info
+      });
+    };
+
+    // 温度折线图
+    const initTemLineChart = () => {
+      if (!global.dispose.some((b: any) => b === global.homeChartOne)) global.homeChartOne.dispose();
+      global.homeChartOne = <any>echarts.init(homeTemLineRef.value, state.charts.theme);
+
+      const option = {
+        backgroundColor: state.charts.bgColor,
+        grid: { top: 70, right: 40, bottom: 50, left: 40 },
+        tooltip: { trigger: 'axis' },
+        legend: { data: ['气温(℃)', '当日平均(℃)'], left: '40%' },
+        xAxis: {
+          data: state.xAxis
+        },
+        yAxis: [
+          {
+            type: 'value',
+            axisLabel: {
+              formatter: "{value}℃"
+            },
+            splitLine: { show: true, lineStyle: { type: 'dashed', color: '#f5f5f5' } },
+          },
+        ],
+        series: [
+          {
+            name: '气温(℃)',
+            type: 'line',
+            symbolSize: 6,
+            symbol: 'circle',
+            smooth: true,
+            // data: [0, 41.1, 30.4, 65.1, 53.3, 53.3, 53.3, 41.1, 30.4, 65.1, 53.3, 10],
+            data: state.tem,
+            lineStyle: { color: '#fe9a8b' },
+            itemStyle: { color: '#fe9a8b', borderColor: '#fe9a8b' },
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: '#fe9a8bb3' },
+                { offset: 1, color: '#fe9a8b03' },
+              ]),
+            },
+          },
+          {
+            name: '当日平均(℃)',
+            type: 'line',
+            symbolSize: 6,
+            symbol: 'circle',
+            smooth: true,
+            data: state.averageTem,
+            lineStyle: { color: '#9E87FF' },
+            itemStyle: { color: '#9E87FF', borderColor: '#9E87FF' },
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: '#9E87FFb3' },
+                { offset: 1, color: '#9E87FF03' },
+              ]),
+            },
+            emphasis: {
+              itemStyle: {
+                color: {
+                  type: 'radial',
+                  x: 0.5,
+                  y: 0.5,
+                  r: 0.5,
+                  colorStops: [
+                    { offset: 0, color: '#9E87FF' },
+                    { offset: 0.4, color: '#9E87FF' },
+                    { offset: 0.5, color: '#fff' },
+                    { offset: 0.7, color: '#fff' },
+                    { offset: 0.8, color: '#fff' },
+                    { offset: 1, color: '#fff' },
+                  ],
+                },
+                borderColor: '#9E87FF',
+                borderWidth: 2,
+              },
+            },
+          },
+        ],
+      };
+      (<any>global.homeChartOne).setOption(option);
+      (<any>state.myCharts).push(global.homeChartOne);
+    };
+    // 风力折线图
+    const initWindLineChart = () => {
+      if (!global.dispose.some((b: any) => b === global.homeChartTwo)) global.homeChartTwo.dispose();
+      global.homeChartTwo = <any>echarts.init(homeWindLineRef.value, state.charts.theme);
+      const option = {
+        backgroundColor: state.charts.bgColor,
+        grid: { top: 70, right: 40, bottom: 50, left: 40 },
+        tooltip: { trigger: 'axis' },
+        legend: { data: ['风力(级)', '当日风力(级)'], left: '40%' },
+        xAxis: {
+          data: state.xAxisWind
+        },
+        yAxis: [
+          {
+            type: 'value',
+            axisLabel: {
+              formatter: "{value}级"
+            },
+            splitLine: { show: true, lineStyle: { type: 'dashed', color: '#f5f5f5' } },
+          },
+        ],
+        series: [
+          {
+            name: '风力(级)',
+            type: 'line',
+            symbolSize: 6,
+            symbol: 'circle',
+            smooth: true,
+            // data: [0, 41.1, 30.4, 65.1, 53.3, 53.3, 53.3, 41.1, 30.4, 65.1, 53.3, 10],
+            data: state.temWind,
+            lineStyle: { color: '#fe9a8b' },
+            itemStyle: { color: '#fe9a8b', borderColor: '#fe9a8b' },
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: '#fe9a8bb3' },
+                { offset: 1, color: '#fe9a8b03' },
+              ]),
+            },
+          },
+          {
+            name: '当日风力(级)',
+            type: 'line',
+            symbolSize: 6,
+            symbol: 'circle',
+            smooth: true,
+            // data: [0, 24.1, 7.2, 15.5, 42.4, 42.4, 42.4, 24.1, 7.2, 15.5, 42.4, 0],
+            data: state.averageTemWind,
+            lineStyle: { color: '#9E87FF' },
+            itemStyle: { color: '#9E87FF', borderColor: '#9E87FF' },
+            areaStyle: {
+              color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                { offset: 0, color: '#9E87FFb3' },
+                { offset: 1, color: '#9E87FF03' },
+              ]),
+            },
+            emphasis: {
+              itemStyle: {
+                color: {
+                  type: 'radial',
+                  x: 0.5,
+                  y: 0.5,
+                  r: 0.5,
+                  colorStops: [
+                    { offset: 0, color: '#9E87FF' },
+                    { offset: 0.4, color: '#9E87FF' },
+                    { offset: 0.5, color: '#fff' },
+                    { offset: 0.7, color: '#fff' },
+                    { offset: 0.8, color: '#fff' },
+                    { offset: 1, color: '#fff' },
+                  ],
+                },
+                borderColor: '#9E87FF',
+                borderWidth: 2,
+              },
+            },
+          },
+        ],
+      };
+      (<any>global.homeChartTwo).setOption(option);
+      (<any>state.myCharts).push(global.homeChartTwo);
+    };
+    // 批量设置 echarts resize
+    const initEchartsResizeFun = () => {
+      nextTick(() => {
+        for (let i = 0; i < state.myCharts.length; i++) {
+          setTimeout(() => {
+            (<any>state.myCharts[i]).resize();
+          }, 0);
+        }
+      });
+    };
+    // 批量设置 echarts resize
+    const changeCollapse = () => {
+      isCollapse.value = !isCollapse.value;
+      initEchartsResizeFun()
+    };
+    // 批量设置 echarts resize
+    const initEchartsResize = () => {
+      window.addEventListener('resize', initEchartsResizeFun);
+    };
+    // 页面加载时
+    onMounted(() => {
+      initEchartsResize();
+      getCityWeatherList();
+    });
+    // 由于页面缓存原因,keep-alive
+    onActivated(() => {
+      initEchartsResizeFun();
+    });
+    // 监听 vuex 中的 tagsview 开启全屏变化,重新 resize 图表,防止不出现/大小不变等
+    watch(
+      () => store.state.tagsViewRoutes.isTagsViewCurrenFull,
+      () => {
+        initEchartsResizeFun();
+      }
+    );
+    // 监听 vuex 中是否开启深色主题
+    watch(
+      () => store.state.themeConfig.themeConfig.isIsDark,
+      (isIsDark) => {
+        nextTick(() => {
+          state.charts.theme = isIsDark ? 'dark' : '';
+          state.charts.bgColor = isIsDark ? 'transparent' : '';
+          state.charts.color = isIsDark ? '#dadada' : '#303133';
+          setTimeout(() => {
+            initTemLineChart();
+          }, 500);
+          setTimeout(() => {
+            initWindLineChart();
+          }, 700);
+        });
+      },
+      {
+        deep: true,
+        immediate: true,
+      }
+    );
+    watch(
+      () => state.currentcityId,
+      () => {
+        getWhichCityWeather(state.currentcityId);
+        getTemperatureEchartById(state.currentcityId);
+        getWindpowerEchartById(state.currentcityId)
+      }
+    );
+    return {
+      changeCollapse,
+      isCollapse,
+      homeTemLineRef,
+      homeWindLineRef,
+      getWhichCityWeather,
+      getCityWeatherList,
+      getTemperatureEchartById,
+      getWindpowerEchartById,
+      ...toRefs(state),
+    };
+  },
 });
 </script>
 
@@ -432,18 +441,32 @@ $homeNavLengh: 8;
 	display: flex;
 	background-color: #fff;
 	padding: 20px;
+	justify-content: space-between;
 
 	.left {
 		width: 384px;
 		height: 500px;
+		margin-right: 20px;
+		position: relative;
+		.collapse {
+			position: absolute;
+			top: 0;
+			right: 0;
+			z-index: 1;
+			padding: 5px;
+			width: 36px;
+			height: 36px;
+			cursor: pointer;
+		}
 
 		.city-weather-data-overview-wrap {
-			border: 1px solid #F2F2F2;
+			border: 1px solid #f2f2f2;
 
 			section.title {
 				font-size: 18px;
 				font-weight: bold;
-				color: #1A1A1A;
+				color: #1a1a1a;
+				padding-top: 30px;
 			}
 
 			section {
@@ -456,8 +479,8 @@ $homeNavLengh: 8;
 				}
 
 				span:nth-child(2) {
-					border-left: 1px solid #F2F2F2;
-					border-right: 1px solid #F2F2F2;
+					border-left: 1px solid #f2f2f2;
+					border-right: 1px solid #f2f2f2;
 				}
 			}
 
@@ -465,7 +488,7 @@ $homeNavLengh: 8;
 				background-color: #fff;
 			}
 
-			section:nth-child(2n+1) {
+			section:nth-child(2n + 1) {
 				background-color: #f8f8f8;
 			}
 
@@ -476,9 +499,9 @@ $homeNavLengh: 8;
 	}
 
 	.right {
-		width: calc(100% - 384px);
+		flex: 1;
 		height: 100%;
-		margin-left: 47px;
+		overflow: hidden;
 
 		.weather-info {
 			padding: 15px 30px 15px 30px;
@@ -525,7 +548,6 @@ $homeNavLengh: 8;
 
 	.home-card-two,
 	.home-card-three {
-
 		.home-card-item,
 		.home-card-top {
 			width: 100%;
@@ -715,7 +737,7 @@ $homeNavLengh: 8;
 	li {
 		padding: 0;
 		margin: 0;
-		list-style: none
+		list-style: none;
 	}
 
 	.product {

+ 74 - 77
src/views/iot/device/category/index.vue

@@ -6,7 +6,6 @@
           <el-form-item label="分类名称">
             <el-input size="default" v-model="tableData.param.name" placeholder="请输入分类名称" class="w-50" clearable />
           </el-form-item>
-         
           <el-form-item>
             <el-button size="default" type="primary" class="ml10" @click="getCateList">
               <el-icon>
@@ -25,9 +24,7 @@
       </div>
       <el-table :data="tableData.data" style="width: 100%" row-key="id" default-expand-all :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" v-loading="tableData.loading">
         <el-table-column prop="name" label="分类名称" v-col="'name'" show-overflow-tooltip> </el-table-column>
-        
-       
-        <el-table-column prop="createdAt" label="创建时间" align="center" min-width="180" v-col="'createdAt'"></el-table-column>
+        <el-table-column prop="desc" label="描述" align="center" min-width="180" v-col="'desc'"></el-table-column>
         <el-table-column label="操作" align="center" width="140" fixed="right">
           <template #default="scope">
             <el-button size="small" type="text" @click="onOpenAdd(scope.row)" v-auth="'add'">新增</el-button>
@@ -49,83 +46,83 @@ import api from '/@/api/device';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	id: number;
-	parentId: number;
-	name: string;
-	status: number;
-	orderNum: number;
-	leader: string;
-	children?: TableDataRow[];
+  id: number;
+  parentId: number;
+  name: string;
+  status: number;
+  orderNum: number;
+  leader: string;
+  children?: TableDataRow[];
 }
 interface TableDataState {
-	tableData: {
-		data: Array<TableDataRow>;
-		loading: boolean;
-		param: {
-			name: string;
-			status: number;
-		};
-	};
+  tableData: {
+    data: Array<TableDataRow>;
+    loading: boolean;
+    param: {
+      name: string;
+      status: number;
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'deviceCate',
-	components: { EditCate },
-	setup() {
-		const editDeptRef = ref();
-		const state = reactive<TableDataState>({
-			tableData: {
-				data: [],
-				loading: false,
-				param: {
-					name: '',
-					status: -1,
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			getCateList();
-		};
-		const getCateList = () => {
-			state.tableData.loading = true;
-			api.category.getList(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.category;
-			}).finally(() => (state.tableData.loading = false));
-		};
-		// 打开新增菜单弹窗
-		const onOpenAdd = (row?: TableDataRow) => {
-			editDeptRef.value.openDialog(row?.id);
-		};
-		// 打开编辑菜单弹窗
-		const onOpenEdit = (row: TableDataRow) => {
-			editDeptRef.value.openDialog(row);
-		};
-		// 删除当前行
-		const onTabelRowDel = (row: TableDataRow) => {
-			ElMessageBox.confirm(`此操作将永久删除分类:${row.name}, 是否继续?`, '提示', {
-				confirmButtonText: '删除',
-				cancelButtonText: '取消',
-				type: 'warning',
-			}).then(() => {
-				api.category.del(row.id).then(() => {
-					ElMessage.success('删除成功');
-					getCateList();
-				});
-			});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-		});
-		return {
-			editDeptRef,
-			getCateList,
-			onOpenAdd,
-			onOpenEdit,
-			onTabelRowDel,
-			...toRefs(state),
-		};
-	},
+  name: 'deviceCate',
+  components: { EditCate },
+  setup() {
+    const editDeptRef = ref();
+    const state = reactive<TableDataState>({
+      tableData: {
+        data: [],
+        loading: false,
+        param: {
+          name: '',
+          status: -1,
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      getCateList();
+    };
+    const getCateList = () => {
+      state.tableData.loading = true;
+      api.category.getList(state.tableData.param).then((res: any) => {
+        state.tableData.data = res.category;
+      }).finally(() => (state.tableData.loading = false));
+    };
+    // 打开新增菜单弹窗
+    const onOpenAdd = (row?: TableDataRow) => {
+      editDeptRef.value.openDialog(row?.id);
+    };
+    // 打开编辑菜单弹窗
+    const onOpenEdit = (row: TableDataRow) => {
+      editDeptRef.value.openDialog({ ...row });
+    };
+    // 删除当前行
+    const onTabelRowDel = (row: TableDataRow) => {
+      ElMessageBox.confirm(`此操作将永久删除分类:${row.name}, 是否继续?`, '提示', {
+        confirmButtonText: '删除',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        api.category.del(row.id).then(() => {
+          ElMessage.success('删除成功');
+          getCateList();
+        });
+      });
+    };
+    // 页面加载时
+    onMounted(() => {
+      initTableData();
+    });
+    return {
+      editDeptRef,
+      getCateList,
+      onOpenAdd,
+      onOpenEdit,
+      onTabelRowDel,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

Разлика између датотеке није приказан због своје велике величине
+ 634 - 648
src/views/iot/device/instance/detail.vue


+ 145 - 148
src/views/iot/device/instance/index.vue

@@ -6,7 +6,7 @@
           <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="key">
+          <el-form-item label="设备标识" prop="key">
             <el-input v-model="tableData.param.key" placeholder="请输入产品名称" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
           </el-form-item>
 
@@ -52,12 +52,9 @@
       <el-table :data="tableData.data" style="width: 100%" @selection-change="handleSelectionChange" v-loading="tableData.loading">
         <el-table-column type="selection" width="55" align="center" />
         <el-table-column label="ID" align="center" prop="id" width="60" v-col="'id'" />
-	    <el-table-column label="标识" prop="key" :show-overflow-tooltip="true" v-col="'key'"/>
-        <el-table-column label="名称" prop="name" :show-overflow-tooltip="true" v-col="'name'"/>
-        <el-table-column label="产品名称" prop="productName" :show-overflow-tooltip="true" v-col="'productName'"/>
-        <el-table-column label="部门" prop="deptName" :show-overflow-tooltip="true" v-col="'deptName'"/>
-
-
+        <el-table-column label="标识" prop="key" :show-overflow-tooltip="true" v-col="'key'" />
+        <el-table-column label="名称" prop="name" :show-overflow-tooltip="true" v-col="'name'" />
+        <el-table-column label="产品名称" prop="productName" :show-overflow-tooltip="true" v-col="'productName'" />
         <el-table-column prop="status" label="状态" width="100" align="center" v-col="'status'">
           <template #default="scope">
             <el-tag type="info" size="small" v-if="scope.row.status==1">离线</el-tag>
@@ -65,13 +62,13 @@
             <el-tag type="info" size="small" v-if="scope.row.status==0">未启用</el-tag>
           </template>
         </el-table-column>
-         <el-table-column prop="registryTime" label="激活时间" align="center" width="150" v-col="'registryTime'"></el-table-column>
-         <el-table-column prop="lastOnlineTime" label="最后上线时间" align="center" width="150" v-col="'lastOnlineTime'"></el-table-column>
+        <el-table-column prop="registryTime" label="激活时间" align="center" width="150" v-col="'registryTime'"></el-table-column>
+        <el-table-column prop="lastOnlineTime" label="最后上线时间" align="center" width="150" v-col="'lastOnlineTime'"></el-table-column>
         <el-table-column label="操作" width="200" align="center" fixed="right">
           <template #default="scope">
 
-			 <!-- <el-button size="small" text type="primary" @click="onOpenDetail(scope.row)">详情</el-button> -->
-			 <router-link :to="'/device/instance/detail/' + scope.row.id" class="link-type" style="padding-right: 12px;
+            <!-- <el-button size="small" text type="primary" @click="onOpenDetail(scope.row)">详情</el-button> -->
+            <router-link :to="'/device/instance/detail/' + scope.row.id" class="link-type" style="padding-right: 12px;
     font-size: 12px;color: #409eff;" v-auth="'detail'">
               <span>详情</span>
             </router-link>
@@ -96,148 +93,148 @@ import api from '/@/api/device';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	id: number;
-	name: string;
-	key: string;
-	status: number;
-	desc: string;
-	createBy: string;
+  id: number;
+  name: string;
+  key: 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;
-			key: string;
-			status: string;
-			dateRange: string[];
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: Array<TableDataRow>;
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      name: string;
+      key: string;
+      status: string;
+      dateRange: string[];
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'deviceInstance',
-	components: { EditDic },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const detailRef=ref();
-		const queryRef = ref();
-		const state = reactive<TableDataState>({
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					name: '',
-					key: '',
-					status: '',
-					dateRange: [],
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			typeList();
-		};
-		const typeList = () => {
-			state.tableData.loading = true;
-			api.instance.getList(state.tableData.param).then((res: any) => {
-				console.log(res);
-				state.tableData.data = res.device;
-				state.tableData.total = res.total;
-			}).finally(() => (state.tableData.loading = false));
-		};
+  name: 'deviceInstance',
+  components: { EditDic },
+  setup() {
+    const addDicRef = ref();
+    const editDicRef = ref();
+    const detailRef = ref();
+    const queryRef = ref();
+    const state = reactive<TableDataState>({
+      ids: [],
+      tableData: {
+        data: [],
+        total: 0,
+        loading: false,
+        param: {
+          pageNum: 1,
+          pageSize: 10,
+          name: '',
+          key: '',
+          status: '',
+          dateRange: [],
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      typeList();
+    };
+    const typeList = () => {
+      state.tableData.loading = true;
+      api.instance.getList(state.tableData.param).then((res: any) => {
+        console.log(res);
+        state.tableData.data = res.device;
+        state.tableData.total = res.total;
+      }).finally(() => (state.tableData.loading = false));
+    };
 
-		//查看详情
-		const onOpenDetail=(row: TableDataRow)=>{
-			detailRef.value.openDialog(row);
-		}
-		// 打开新增产品弹窗
-		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.instance.del(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);
-		};
-		const onActionStatus=(item:TableDataRow[])=>{
-			if(item.status==0){
-				api.instance.devdeploy({id:item.id}).then((res: any) => {
-						typeList();
-						ElMessage.success(res.message || '操作成功');
-				});
-			}else{
-				api.instance.devundeploy({id:item.id}).then((res: any) => {
-						typeList();
-						ElMessage.success(res.message || '操作成功');
-				});
-			}
-		}
-		return {
-			addDicRef,
-			editDicRef,
-			detailRef,
-			queryRef,
-			onActionStatus,
-			onOpenDetail,
-			onOpenAddDic,
-			onOpenEditDic,
-			onRowDel,
-			typeList,
-			resetQuery,
-			handleSelectionChange,
-			...toRefs(state),
-		};
-	},
+    //查看详情
+    const onOpenDetail = (row: TableDataRow) => {
+      detailRef.value.openDialog(row);
+    }
+    // 打开新增产品弹窗
+    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.instance.del(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);
+    };
+    const onActionStatus = (item: TableDataRow[]) => {
+      if (item.status == 0) {
+        api.instance.devdeploy({ id: item.id }).then((res: any) => {
+          typeList();
+          ElMessage.success(res.message || '操作成功');
+        });
+      } else {
+        api.instance.devundeploy({ id: item.id }).then((res: any) => {
+          typeList();
+          ElMessage.success(res.message || '操作成功');
+        });
+      }
+    }
+    return {
+      addDicRef,
+      editDicRef,
+      detailRef,
+      queryRef,
+      onActionStatus,
+      onOpenDetail,
+      onOpenAddDic,
+      onOpenEditDic,
+      onRowDel,
+      typeList,
+      resetQuery,
+      handleSelectionChange,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

+ 108 - 108
src/views/iot/rule-engine/send.vue

@@ -1,47 +1,47 @@
 <template>
-	<el-card shadow="hover">
-		<div class="search">
-			<el-form :inline="true">
-				<el-form-item>
-					<!-- <el-button size="default" type="primary" class="ml10" @click="getList(1)">
+  <el-card shadow="hover">
+    <div class="search">
+      <el-form :inline="true">
+        <el-form-item>
+          <!-- <el-button size="default" type="primary" class="ml10" @click="getList(1)">
 							<el-icon>
 								<ele-Search />
 							</el-icon>
 							查询
 						</el-button> -->
-					<el-button type="success" @click="addOrEdit()">
-						<el-icon>
-							<ele-FolderAdd />
-						</el-icon>
-						新增规则编排
-					</el-button>
-				</el-form-item>
-			</el-form>
-		</div>
-		<el-table :data="tableData" style="width: 100%" v-loading="loading">
-			<el-table-column type="index" label="序号" width="80" align="center" />
-			<el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
-			<el-table-column prop="expound" label="说明" show-overflow-tooltip></el-table-column>
-			<el-table-column prop="createdAt" label="创建时间" min-width="100" align="center"></el-table-column>
-			<el-table-column prop="status" label="状态" width="100" align="center">
-				<template #default="scope">
-					<el-tag type="success" size="small" v-if="scope.row.status == 1">已启动</el-tag>
-					<el-tag type="info" size="small" v-else>已停止</el-tag>
-				</template>
-			</el-table-column>
-			<el-table-column label="操作" width="200" align="center">
-				<template #default="scope">
-					<el-button size="small" text type="info" v-if="scope.row.status" @click="setStatus(scope.row, 0)">停止</el-button>
-					<el-button size="small" text type="primary" v-else @click="setStatus(scope.row, 1)">启动</el-button>
-					<el-button size="small" text type="warning" @click="addOrEdit(scope.row)">编辑</el-button>
-					<el-button size="small" text type="warning" @click="edit(scope.row)">规则编辑</el-button>
-					<el-button size="small" text type="danger" @click="onDel(scope.row)">删除</el-button>
-				</template>
-			</el-table-column>
-		</el-table>
-		<pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
-		<EditForm ref="editFormRef" @getList="getList()" :types="1"></EditForm>
-	</el-card>
+          <el-button type="success" @click="addOrEdit()">
+            <el-icon>
+              <ele-FolderAdd />
+            </el-icon>
+            新增数据转发
+          </el-button>
+        </el-form-item>
+      </el-form>
+    </div>
+    <el-table :data="tableData" style="width: 100%" v-loading="loading">
+      <el-table-column type="index" label="序号" width="80" align="center" />
+      <el-table-column prop="name" label="名称" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="expound" label="说明" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="createdAt" label="创建时间" min-width="100" align="center"></el-table-column>
+      <el-table-column prop="status" label="状态" width="100" align="center">
+        <template #default="scope">
+          <el-tag type="success" size="small" v-if="scope.row.status == 1">已启动</el-tag>
+          <el-tag type="info" size="small" v-else>已停止</el-tag>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="200" align="center">
+        <template #default="scope">
+          <el-button size="small" text type="info" v-if="scope.row.status" @click="setStatus(scope.row, 0)">停止</el-button>
+          <el-button size="small" text type="primary" v-else @click="setStatus(scope.row, 1)">启动</el-button>
+          <el-button size="small" text type="warning" @click="addOrEdit(scope.row)">编辑</el-button>
+          <el-button size="small" text type="warning" @click="edit(scope.row)">规则编辑</el-button>
+          <el-button size="small" text type="danger" @click="onDel(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+    <pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
+    <EditForm ref="editFormRef" @getList="getList()" :types="1"></EditForm>
+  </el-card>
 </template>
 
 <script lang="ts" setup>
@@ -58,90 +58,90 @@ const editFormRef = ref();
 const { params, tableData, getList, loading } = useSearch<any[]>(api.getList, 'Data', { types: 1 });
 
 const headers = {
-	Authorization: 'Bearer ' + JSON.parse(sessionStorage.token),
+  Authorization: 'Bearer ' + JSON.parse(sessionStorage.token),
 };
 const flowsUrl = window.location.origin + '/rule-engine/flows';
 
 getList();
 
 const addOrEdit = async (row?: any) => {
-	if (row) {
-		editFormRef.value.open(row);
-		return;
-	} else {
-		editFormRef.value.open();
-	}
+  if (row) {
+    editFormRef.value.open(row);
+    return;
+  } else {
+    editFormRef.value.open();
+  }
 };
 
 const setStatus = async (row: any, status: number) => {
-	// 找到所有规则
-	const { data: flows } = await axios.get(flowsUrl, { headers });
-
-	const flow = flows.find((item: any) => item.id === row.flowId);
-
-	if (!flow) {
-		ElMessage.error('规则不存在');
-		return;
-	}
-
-	// 改变指定规则状态
-	flow.disabled = status ? false : true;
-
-	// 设置规则状态
-	await axios.post(flowsUrl, flows, { headers });
-
-	api
-		.setStatus(row.id, status)
-		.then(() => {
-			ElMessage.success('操作成功');
-			getList();
-		})
-		.catch(() => {
-			ElMessage.error('操作失败');
-		});
+  // 找到所有规则
+  const { data: flows } = await axios.get(flowsUrl, { headers });
+
+  const flow = flows.find((item: any) => item.id === row.flowId);
+
+  if (!flow) {
+    ElMessage.error('规则不存在');
+    return;
+  }
+
+  // 改变指定规则状态
+  flow.disabled = status ? false : true;
+
+  // 设置规则状态
+  await axios.post(flowsUrl, flows, { headers });
+
+  api
+    .setStatus(row.id, status)
+    .then(() => {
+      ElMessage.success('操作成功');
+      getList();
+    })
+    .catch(() => {
+      ElMessage.error('操作失败');
+    });
 };
 
 const edit = async (row: any) => {
-	localStorage.setItem('auth-tokens', `{"access_token":"${Session.get('token')}"}`);
-	// const url = window.location.protocol + '//' + window.location.hostname + ':1880/rule-engine?access_token=' + Session.get('token') + '#flow/' + row.flowId;
-	const url = '/rule-engine/#flow/' + row.flowId;
-	window.open(url);
+  localStorage.setItem('auth-tokens', `{"access_token":"${Session.get('token')}"}`);
+  // const url = window.location.protocol + '//' + window.location.hostname + ':1880/rule-engine?access_token=' + Session.get('token') + '#flow/' + row.flowId;
+  const url = '/rule-engine/#flow/' + row.flowId;
+  window.open(url);
 };
 
 const onDel = (row: any) => {
-	ElMessageBox.confirm(`此操作将删除:“${row.name}”,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(async () => {
-		// 找到所有规则
-		const { data: flows } = await axios.get(flowsUrl, { headers });
-
-		const flowIndex = flows.findIndex((item: any) => item.id === row.flowId);
-
-		if (flowIndex === -1) {
-			ElMessage.error('规则不存在');
-			return;
-		}
-
-		// 删除指定规则
-		flows.splice(flowIndex, 1);
-
-		// 删除当前规则下的各个节点信息
-		const newFlows = flows.filter((item: any) => {
-			if (item.z === row.flowId) {
-				return false;
-			} else {
-				return true;
-			}
-		});
-
-		// 设置规则状态
-		await axios.post(flowsUrl, newFlows, { headers });
-
-		await api.del([row.id as string]);
-		ElMessage.success('删除成功');
-		getList();
-	});
+  ElMessageBox.confirm(`此操作将删除:“${row.name}”,是否继续?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+  }).then(async () => {
+    // 找到所有规则
+    const { data: flows } = await axios.get(flowsUrl, { headers });
+
+    const flowIndex = flows.findIndex((item: any) => item.id === row.flowId);
+
+    if (flowIndex === -1) {
+      ElMessage.error('规则不存在');
+      return;
+    }
+
+    // 删除指定规则
+    flows.splice(flowIndex, 1);
+
+    // 删除当前规则下的各个节点信息
+    const newFlows = flows.filter((item: any) => {
+      if (item.z === row.flowId) {
+        return false;
+      } else {
+        return true;
+      }
+    });
+
+    // 设置规则状态
+    await axios.post(flowsUrl, newFlows, { headers });
+
+    await api.del([row.id as string]);
+    ElMessage.success('删除成功');
+    getList();
+  });
 };
 </script>

+ 11 - 62
src/views/login/component/account.vue

@@ -1,22 +1,7 @@
 <template>
-  <el-form
-    ref="loginForm"
-    size="large"
-    class="login-content-form"
-    :model="ruleForm"
-    :rules="formRules"
-  >
-    <el-form-item
-      class="login-animation1"
-      prop="userName"
-    >
-      <el-input
-        type="text"
-        :placeholder="$t('message.account.accountPlaceholder1')"
-        v-model="ruleForm.userName"
-        clearable
-        autocomplete="off"
-      >
+  <el-form ref="loginForm" size="large" class="login-content-form" :model="ruleForm" :rules="formRules">
+    <el-form-item class="login-animation1" prop="userName">
+      <el-input type="text" :placeholder="$t('message.account.accountPlaceholder1')" v-model="ruleForm.userName" clearable autocomplete="off">
         <template #prefix>
           <el-icon class="el-input__icon">
             <ele-User />
@@ -24,46 +9,22 @@
         </template>
       </el-input>
     </el-form-item>
-    <el-form-item
-      class="login-animation2"
-      prop="password"
-    >
-      <el-input
-        :type="isShowPassword ? 'text' : 'password'"
-        :placeholder="$t('message.account.accountPlaceholder2')"
-        v-model="ruleForm.password"
-        autocomplete="off"
-        @keyup.enter="onSignIn"
-      >
+    <el-form-item class="login-animation2" prop="password">
+      <el-input :type="isShowPassword ? 'text' : 'password'" :placeholder="$t('message.account.accountPlaceholder2')" v-model="ruleForm.password" autocomplete="off" @keyup.enter="onSignIn">
         <template #prefix>
           <el-icon class="el-input__icon">
             <ele-Unlock />
           </el-icon>
         </template>
         <template #suffix>
-          <i
-            class="iconfont el-input__icon login-content-password"
-            :class="isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'"
-            @click="isShowPassword = !isShowPassword"
-          >
+          <i class="iconfont el-input__icon login-content-password" :class="isShowPassword ? 'icon-yincangmima' : 'icon-xianshimima'" @click="isShowPassword = !isShowPassword">
           </i>
         </template>
       </el-input>
     </el-form-item>
-    <el-form-item
-      class="login-animation3"
-      prop="captcha"
-    >
+    <el-form-item class="login-animation3" prop="captcha">
       <el-col :span="15">
-        <el-input
-          type="text"
-          maxlength="4"
-          :placeholder="$t('message.account.accountPlaceholder3')"
-          v-model="ruleForm.captcha"
-          clearable
-          autocomplete="off"
-          @keyup.enter="onSignIn"
-        >
+        <el-input type="text" maxlength="4" :placeholder="$t('message.account.accountPlaceholder3')" v-model="ruleForm.captcha" clearable autocomplete="off" @keyup.enter="onSignIn">
           <template #prefix>
             <el-icon class="el-input__icon">
               <ele-Position />
@@ -74,24 +35,12 @@
       <el-col :span="1"></el-col>
       <el-col :span="8">
         <div class="login-content-code">
-          <img
-            class="login-content-code-img"
-            @click="getCaptcha"
-            width="130"
-            height="38"
-            :src="captchaSrc"
-            style="cursor: pointer"
-          />
+          <img class="login-content-code-img" @click="getCaptcha" width="130" height="38" :src="captchaSrc" style="cursor: pointer" />
         </div>
       </el-col>
     </el-form-item>
     <el-form-item class="login-animation4">
-      <el-button
-        type="primary"
-        class="login-content-submit"
-        @click="onSignIn"
-        :loading="loading.signIn"
-      >
+      <el-button type="primary" class="login-content-submit" @click="onSignIn" :loading="loading.signIn">
         <span>{{ $t('message.account.accountBtnText') }}</span>
       </el-button>
     </el-form-item>
@@ -182,7 +131,7 @@ export default defineComponent({
     const currentUser = async () => {
       api.login.currentUser().then(async (res: any) => {
         // 设置用户菜单
-        Session.set('userMenu', res || []);
+        Session.set('userMenu', res.Data || []);
         store.dispatch('requestOldRoutes/setBackEndControlRoutes', res || []);
         if (!store.state.themeConfig.themeConfig.isRequestRoutes) {
           // 前端控制路由,2、请注意执行顺序

+ 62 - 131
src/views/personal/index.vue

@@ -1,138 +1,69 @@
 <template>
-	<div class="personal">
-		<el-row>
-			<!-- 个人信息 -->
-			<el-col :xs="24" :sm="12">
-				<el-card shadow="hover" header="个人信息">
-					<div class="personal-user">
-						<div class="personal-user-left">
-							<el-upload class="h100 personal-user-left-upload" action="https://jsonplaceholder.typicode.com/posts/" multiple :limit="1">
-								<img src="https://ss0.bdstatic.com/70cFvHSh_Q1YnxGkpoWK1HF6hhy/it/u=1813762643,1914315241&fm=26&gp=0.jpg" />
-							</el-upload>
-						</div>
-						<div class="personal-user-right">
-							<el-row>
-								<el-col :span="24" class="personal-title mb18">{{ currentTime }},admin,生活变的再糟糕,也不妨碍我变得更好! </el-col>
-								<el-col :span="24">
-									<el-row>
-										<el-col :xs="24" :sm="8" class="personal-item mb6">
-											<div class="personal-item-label">昵称:</div>
-											<div class="personal-item-value">小柒</div>
-										</el-col>
-										<el-col :xs="24" :sm="16" class="personal-item mb6">
-											<div class="personal-item-label">身份:</div>
-											<div class="personal-item-value">超级管理</div>
-										</el-col>
-									</el-row>
-								</el-col>
-								<el-col :span="24">
-									<el-row>
-										<el-col :xs="24" :sm="8" class="personal-item mb6">
-											<div class="personal-item-label">登录IP:</div>
-											<div class="personal-item-value">192.168.1.1</div>
-										</el-col>
-										<el-col :xs="24" :sm="16" class="personal-item mb6">
-											<div class="personal-item-label">登录时间:</div>
-											<div class="personal-item-value">2021-02-05 18:47:26</div>
-										</el-col>
-									</el-row>
-								</el-col>
-							</el-row>
-						</div>
-					</div>
-				</el-card>
-			</el-col>
-
-			<!-- 更新信息 -->
-			<el-col  :xs="24" :sm="12">
-				<el-card shadow="hover" class="mt15 personal-edit" header="更新信息">
-					<div class="personal-edit-safe-box">
-						<div class="personal-edit-safe-item">
-							<div class="personal-edit-safe-item-left">
-								<div class="personal-edit-safe-item-left-label">账户密码</div>
-								<div class="personal-edit-safe-item-left-value">当前密码强度:强</div>
-							</div>
-							<div class="personal-edit-safe-item-right">
-								<el-button type="text">立即修改</el-button>
-							</div>
-						</div>
-					</div>
-					<div class="personal-edit-safe-box">
-						<div class="personal-edit-safe-item">
-							<div class="personal-edit-safe-item-left">
-								<div class="personal-edit-safe-item-left-label">密保手机</div>
-								<div class="personal-edit-safe-item-left-value">已绑定手机:132****4108</div>
-							</div>
-							<div class="personal-edit-safe-item-right">
-								<el-button type="text">立即修改</el-button>
-							</div>
-						</div>
-					</div>
-					<div class="personal-edit-safe-box">
-						<div class="personal-edit-safe-item">
-							<div class="personal-edit-safe-item-left">
-								<div class="personal-edit-safe-item-left-label">密保问题</div>
-								<div class="personal-edit-safe-item-left-value">已设置密保问题,账号安全大幅度提升</div>
-							</div>
-							<div class="personal-edit-safe-item-right">
-								<el-button type="text">立即设置</el-button>
-							</div>
-						</div>
-					</div>
-					<div class="personal-edit-safe-box">
-						<div class="personal-edit-safe-item">
-							<div class="personal-edit-safe-item-left">
-								<div class="personal-edit-safe-item-left-label">绑定QQ</div>
-								<div class="personal-edit-safe-item-left-value">已绑定QQ:110****566</div>
-							</div>
-							<div class="personal-edit-safe-item-right">
-								<el-button type="text">立即设置</el-button>
-							</div>
-						</div>
-					</div>
-				</el-card>
-			</el-col>
-		</el-row>
-	</div>
+  <div class="personal">
+    <el-row>
+      <!-- 个人信息 -->
+      <el-col :xs="24" :sm="24">
+        <el-card shadow="hover" header="个人信息" v-loading="!info.userName">
+          <div class="personal-user">
+            <div class="personal-user-left">
+              <!-- <el-upload class="h100 personal-user-left-upload" action="https://jsonplaceholder.typicode.com/posts/" multiple :limit="1">
+              <img :src="info.avatar" />
+              </el-upload> -->
+              <uploadVue @set-img="setImg">
+                <img style="width:140px;height:140px" :src="info.avatar" />
+              </uploadVue>
+            </div>
+            <div class="personal-user-right">
+              <el-row>
+                <el-col :span="24" class="personal-title mb18">{{ currentTime }},{{info.userName}},生活变的再糟糕,也不妨碍我变得更好! </el-col>
+                <el-col :xs="24" :sm="24" class="personal-item mb6">
+                  <div class="personal-item-label">昵称:</div>
+                  <div class="personal-item-value">{{info.userNickname}}</div>
+                </el-col>
+                <el-col :xs="24" :sm="24" class="personal-item mb6">
+                  <div class="personal-item-label">性别:</div>
+                  <div class="personal-item-value">{{info.sex=='1'?'男':'女'}}</div>
+                </el-col>
+                <el-col :xs="24" :sm="24" class="personal-item mb6">
+                  <div class="personal-item-label">登录IP:</div>
+                  <div class="personal-item-value">{{info.lastLoginIp}}</div>
+                </el-col>
+                <el-col :xs="24" :sm="24" class="personal-item mb6">
+                  <div class="personal-item-label">登录时间:</div>
+                  <div class="personal-item-value">{{info.lastLoginTime}}</div>
+                </el-col>
+              </el-row>
+            </div>
+          </div>
+        </el-card>
+      </el-col>
+    </el-row>
+  </div>
 </template>
 
-<script lang="ts">
-import { toRefs, reactive, computed, defineComponent } from 'vue';
+<script lang="ts" setup>
+import { ref, computed } from 'vue';
 import { formatAxis } from '/@/utils/formatTime';
-import { newsInfoList, recommendList } from './mock';
+import api from '/@/api/system';
+import uploadVue from '/@/components/upload-wrapper/index.vue';
 
-// 定义接口来定义对象的类型
-interface PersonalState {
-	newsInfoList: any;
-	recommendList: any;
-	personalForm: any;
-}
+const info = ref<any>({})
+
+api.login.currentUser().then((res: any) => {
+  console.log(res.Info);
+  info.value = res.Info
+});
 
-export default defineComponent({
-	name: 'personal',
-	setup() {
-		const state = reactive<PersonalState>({
-			newsInfoList,
-			recommendList,
-			personalForm: {
-				name: '',
-				email: '',
-				autograph: '',
-				occupation: '',
-				phone: '',
-				sex: '',
-			},
-		});
-		// 当前时间提示语
-		const currentTime = computed(() => {
-			return formatAxis(new Date());
-		});
-		return {
-			currentTime,
-			...toRefs(state),
-		};
-	},
+// 当前时间提示语
+const currentTime = computed(() => {
+  return formatAxis(new Date());
 });
+
+const setImg = (img: string) => {
+  api.user.edit({ avatar: img }).then((res: any) => {
+    console.log(res)
+  })
+}
 </script>
 
 <style scoped lang="scss">
@@ -143,9 +74,9 @@ export default defineComponent({
 		display: flex;
 		align-items: center;
 		.personal-user-left {
-			width: 100px;
-			height: 130px;
-			border-radius: 3px;
+			// width: 100px;
+			// height: 130px;
+			// border-radius: 3px;
 			::v-deep(.el-upload) {
 				height: 100%;
 			}

+ 70 - 70
src/views/system/api/index.vue

@@ -1,58 +1,58 @@
 <template>
-	<div class="page">
-		<el-card shadow="hover">
-			<div class="search">
-				<el-form :inline="true">
-					<el-form-item label="接口名称">
-						<el-input v-model="params.name" placeholder="请输入接口名称" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
-					</el-form-item>
-					<el-form-item label="接口地址">
-						<el-input v-model="params.address" placeholder="请输入接口地址" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
-					</el-form-item>
-					<el-form-item label="状态" prop="status" style="width: 200px">
-						<el-select v-model="params.status" placeholder="接口状态" clearablestyle="width: 240px">
-							<el-option label="全部" :value="-1" />
-							<el-option label="启用" :value="1" />
-							<el-option label="禁用" :value="0" />
-						</el-select>
-					</el-form-item>
-					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="getList(1)">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button>
-						<el-button type="success" @click="addOrEdit()">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增接口
-						</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-			<el-table :data="tableData" style="width: 100%" v-loading="loading">
-				<el-table-column type="index" label="序号" width="60" align="center" />
-				<el-table-column prop="name" label="接口名称" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="address" label="接口地址" show-overflow-tooltip></el-table-column>
-				<el-table-column prop="status" label="状态" min-width="100" 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 label="操作" width="100" align="center">
-					<template #default="scope">
-						<el-button size="small" text type="warning" @click="addOrEdit(scope.row)">修改</el-button>
-						<el-button size="small" text type="danger" @click="onDel(scope.row)">删除</el-button>
-					</template>
-				</el-table-column>
-			</el-table>
-			<pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
-		</el-card>
-		<EditForm ref="editFormRef" @getList="getList()"></EditForm>
-	</div>
+  <div class="page">
+    <el-card shadow="hover">
+      <div class="search">
+        <el-form :inline="true">
+          <el-form-item label="接口名称">
+            <el-input v-model="params.name" placeholder="请输入接口名称" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
+          </el-form-item>
+          <el-form-item label="接口地址">
+            <el-input v-model="params.address" placeholder="请输入接口地址" clearablestyle="width: 240px" @keyup.enter.native="getList(1)" />
+          </el-form-item>
+          <el-form-item label="状态" prop="status" style="width: 200px">
+            <el-select v-model="params.status" placeholder="接口状态" clearablestyle="width: 240px">
+              <el-option label="全部" :value="-1" />
+              <el-option label="启用" :value="1" />
+              <el-option label="禁用" :value="0" />
+            </el-select>
+          </el-form-item>
+          <el-form-item>
+            <el-button size="default" type="primary" class="ml10" @click="getList(1)">
+              <el-icon>
+                <ele-Search />
+              </el-icon>
+              查询
+            </el-button>
+            <el-button type="success" @click="addOrEdit()" v-auth="'add'">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增接口
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <el-table :data="tableData" style="width: 100%" v-loading="loading">
+        <el-table-column type="index" label="序号" width="60" align="center" />
+        <el-table-column prop="name" v-col="'name'" label="接口名称" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="address" v-col="'address'" label="接口地址" show-overflow-tooltip></el-table-column>
+        <el-table-column prop="status" v-col="'status'" label="状态" min-width="100" 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 label="操作" width="100" align="center" v-col="'handle'">
+          <template #default="scope">
+            <el-button size="small" text type="warning" @click="addOrEdit(scope.row)" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onDel(scope.row)" v-auth="'del'">删除</el-button>
+          </template>
+        </el-table-column>
+      </el-table>
+      <pagination v-if="params.total" :total="params.total" v-model:page="params.pageNum" v-model:limit="params.pageSize" @pagination="getList()" />
+    </el-card>
+    <EditForm ref="editFormRef" @getList="getList()"></EditForm>
+  </div>
 </template>
 
 <script lang="ts" setup>
@@ -70,24 +70,24 @@ const { params, tableData, getList, loading } = useSearch<ApiRow[]>(api.api.getL
 getList();
 
 const addOrEdit = async (row?: ApiRow) => {
-	if (row) {
-		const res = await api.api.detail(row.id as number);
-		editFormRef.value.open(res);
-		return;
-	} else {
-		editFormRef.value.open();
-	}
+  if (row) {
+    const res = await api.api.detail(row.id as number);
+    editFormRef.value.open(res);
+    return;
+  } else {
+    editFormRef.value.open();
+  }
 };
 
 const onDel = (row: ApiRow) => {
-	ElMessageBox.confirm(`此操作将删除接口:“${row.name}”,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(async () => {
-		await api.api.del(row.id as number);
-		ElMessage.success('删除成功');
-		getList();
-	});
+  ElMessageBox.confirm(`此操作将删除接口:“${row.name}”,是否继续?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+  }).then(async () => {
+    await api.api.del(row.id as number);
+    ElMessage.success('删除成功');
+    getList();
+  });
 };
 </script>

+ 9 - 48
src/views/system/assess/totalIndex/index.vue

@@ -9,57 +9,21 @@
 					</el-icon>
 					查询
 				</el-button> -->
-        <el-button
-          size="default"
-          type="primary"
-          class="ml10"
-          @click="onOpenAddItem"
-        >
+        <el-button size="default" type="primary" class="ml10" @click="onOpenAddItem" v-auth="'add'">
           <el-icon>
             <ele-FolderAdd />
           </el-icon>
           新建
         </el-button>
       </div>
-      <el-table
-        v-loading="loading"
-        :data="tableData.data"
-        style="width: 100%"
-      >
-        <el-table-column
-          align="left"
-          prop="title"
-          label="名称"
-          width="260"
-          show-overflow-tooltip
-        ></el-table-column>
-        <el-table-column
-          align="left"
-          prop="explain"
-          label="描述"
-          show-overflow-tooltip
-        ></el-table-column>
-        <el-table-column
-          align="center"
-          label="操作"
-          width="180"
-        >
+      <el-table v-loading="tableData.loading" :data="tableData.data" style="width: 100%">
+        <el-table-column align="left" prop="title" v-col="'title'" label="名称" width="260" show-overflow-tooltip></el-table-column>
+        <el-table-column align="left" prop="explain" v-col="'explain'" label="描述" show-overflow-tooltip></el-table-column>
+        <el-table-column align="center" label="操作" width="180" v-col="'handle'">
           <template #default="scope">
-            <el-button
-              size="small"
-              type="text"
-              @click="onOpenEditItem(scope.row)"
-            >编辑</el-button>
-            <el-button
-              size="small"
-              type="text"
-              @click="onRowDel(scope.row)"
-            >删除</el-button>
-            <el-button
-              size="small"
-              type="text"
-              @click="onOpenDetailItem(scope.row)"
-            >详细信息</el-button>
+            <el-button size="small" type="text" @click="onOpenEditItem(scope.row)" v-auth="'edit'">编辑</el-button>
+            <el-button size="small" type="text" @click="onRowDel(scope.row)" v-auth="'del'">删除</el-button>
+            <el-button size="small" type="text" @click="onOpenDetailItem(scope.row)" v-auth="'detail'">详细信息</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -77,10 +41,7 @@
 			>
 			</el-pagination> -->
     </el-card>
-    <EditOrAddItem
-      ref="EditOrAddItem"
-      @fetchList="fetchList"
-    />
+    <EditOrAddItem ref="EditOrAddItem" @fetchList="fetchList" />
     <DetailItem ref="detailItemRef" />
 
   </div>

+ 139 - 140
src/views/system/city/index.vue

@@ -6,7 +6,7 @@
           <el-form-item label="城市名称" prop="name">
             <el-input v-model="tableData.param.name" placeholder="请输入城市名称" clearable size="default" @keyup.enter="queryList" />
           </el-form-item>
-		  		<el-form-item label="城市编号" prop="code">
+          <el-form-item label="城市编号" prop="code">
             <el-input v-model="tableData.param.code" placeholder="请输入城市编号" clearable size="default" @keyup.enter="queryList" />
           </el-form-item>
           <el-form-item>
@@ -22,7 +22,7 @@
               </el-icon>
               重置
             </el-button>
-            <el-button size="default" type="success" class="ml10" @click="onOpenAddDic">
+            <el-button size="default" type="success" class="ml10" @click="onOpenAddDic" v-auth="'add'">
               <el-icon>
                 <ele-FolderAdd />
               </el-icon>
@@ -31,23 +31,22 @@
           </el-form-item>
         </el-form>
       </div>
-			
-      <el-table :data="tableData.data" v-loading="tableData.loading" style="width: 100%"  row-key="id" default-expand-all :indent="16" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
-	    	<el-table-column label="城市名称" prop="name" :show-overflow-tooltip="true" />
-	    	<el-table-column label="城市编号" prop="code" :show-overflow-tooltip="true" />
-	    	<el-table-column label="状态" prop="status" width="80">
-                <template #default="scope">
-					{{ scope.row.status === 1 ? '在线' : '不在线' }}
-                </template>
-            </el-table-column>
-			<el-table-column label="排序" prop="sort" align="center" />
-	    	<el-table-column label="创建时间" prop="createdAt" :show-overflow-tooltip="true" />
-            <el-table-column label="操作" width="200" align="center">
-            <template #default="scope">
-			 	<!-- <el-button size="small" text type="primary" @click="onOpenDetail(scope.row)">详情</el-button> -->
-                <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 :data="tableData.data" v-loading="tableData.loading" style="width: 100%" row-key="id" default-expand-all :indent="16" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
+        <el-table-column label="城市名称" v-col="'name'" prop="name" :show-overflow-tooltip="true" />
+        <el-table-column label="城市编号" v-col="'code'" prop="code" :show-overflow-tooltip="true" />
+        <el-table-column label="状态" v-col="'status'" prop="status" width="80">
+          <template #default="scope">
+            {{ scope.row.status === 1 ? '在线' : '不在线' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="排序" v-col="'sort'" prop="sort" align="center" />
+        <el-table-column label="创建时间" prop="createdAt" v-col="'createdAt'" :show-overflow-tooltip="true" />
+        <el-table-column label="操作" width="200" align="center" v-col="'handle'">
+          <template #default="scope">
+            <el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'del'">删除</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="queryList" />
@@ -66,132 +65,132 @@ import api from '/@/api/system';
 
 // 定义接口来定义对象的类型
 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;
+  id: number;
+  name: string;
+  code: string;
+  stationId: string;
+  loopTypes: number;
+  energyTypes: number;
+  heatingObject: number;
+  heatingTypes: number;
+  heatingArea: string;
+  forRealArea: string;
+  decade: string;
+  status: number;
 }
 interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: Array<TableDataRow>;
-		loading: boolean;
-		param: {
-			name: string;
-			code: string;
-			status: number;
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: Array<TableDataRow>;
+    loading: boolean;
+    param: {
+      name: string;
+      code: string;
+      status: number;
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'cityManage',
-	components: { EditDic },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		// const detailRef = ref();
-		const queryRef = ref();
-		const state = reactive<TableDataState>({
-			ids: [],
-			tableData: {
-				data: [],
-				loading: false,
-				param: {
-					name: '',
-					code: '',
-					status: -1
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			queryList();
-		};
-		const queryList = () => {
-			state.tableData.loading = true
-			api.city.getList(state.tableData.param)
-				.then((res: any) => {
-					state.tableData.data = res || [];
-					state.tableData.loading = false
-				});
-		};
+  name: 'cityManage',
+  components: { EditDic },
+  setup() {
+    const addDicRef = ref();
+    const editDicRef = ref();
+    // const detailRef = ref();
+    const queryRef = ref();
+    const state = reactive<TableDataState>({
+      ids: [],
+      tableData: {
+        data: [],
+        loading: false,
+        param: {
+          name: '',
+          code: '',
+          status: -1
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      queryList();
+    };
+    const queryList = () => {
+      state.tableData.loading = true
+      api.city.getList(state.tableData.param)
+        .then((res: any) => {
+          state.tableData.data = res || [];
+          state.tableData.loading = false
+        });
+    };
 
-		// //查看详情
-		// const onOpenDetail=(row: TableDataRow)=>{
-		// 	detailRef.value.openDialog(row);
-		// }
-		// 打开新增产品弹窗
-		const onOpenAddDic = () => {
-			editDicRef.value.openDialog(null, state.tableData.data);
-		};
-		// 打开修改产品弹窗
-		const onOpenEditDic = (row: TableDataRow) => {
-			editDicRef.value.openDialog(row, state.tableData.data);
-		};
-		// 删除产品
-		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.city.del(row.id).then(() => {
-						ElMessage.success('删除成功');
-						queryList();
-					});
-				})
-				.catch(() => {});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			queryList();
-		};
-		// 多选框选中数据
-		const handleSelectionChange = (selection: TableDataRow[]) => {
-			state.ids = selection.map((item) => item.id);
-		};
-		return {
-			addDicRef,
-			editDicRef,
-			// detailRef,
-			queryRef,
-			// onOpenDetail,
-			onOpenAddDic,
-			onOpenEditDic,
-			onRowDel,
-			queryList,
-			resetQuery,
-			handleSelectionChange,
-			...toRefs(state),
-		};
-	},
+    // //查看详情
+    // const onOpenDetail=(row: TableDataRow)=>{
+    // 	detailRef.value.openDialog(row);
+    // }
+    // 打开新增产品弹窗
+    const onOpenAddDic = () => {
+      editDicRef.value.openDialog(null, state.tableData.data);
+    };
+    // 打开修改产品弹窗
+    const onOpenEditDic = (row: TableDataRow) => {
+      editDicRef.value.openDialog(row, state.tableData.data);
+    };
+    // 删除产品
+    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.city.del(row.id).then(() => {
+            ElMessage.success('删除成功');
+            queryList();
+          });
+        })
+        .catch(() => { });
+    };
+    // 页面加载时
+    onMounted(() => {
+      initTableData();
+    });
+    /** 重置按钮操作 */
+    const resetQuery = (formEl: FormInstance | undefined) => {
+      if (!formEl) return;
+      formEl.resetFields();
+      queryList();
+    };
+    // 多选框选中数据
+    const handleSelectionChange = (selection: TableDataRow[]) => {
+      state.ids = selection.map((item) => item.id);
+    };
+    return {
+      addDicRef,
+      editDicRef,
+      // detailRef,
+      queryRef,
+      // onOpenDetail,
+      onOpenAddDic,
+      onOpenEditDic,
+      onRowDel,
+      queryList,
+      resetQuery,
+      handleSelectionChange,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

+ 196 - 211
src/views/system/config/index.vue

@@ -1,89 +1,74 @@
 <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="configName">
-						<el-input v-model="tableData.param.configName" placeholder="请输入参数名称" clearable size="default" @keyup.enter.native="dataList" />
-					</el-form-item>
-					<el-form-item label="参数键名" prop="configKey">
-						<el-input v-model="tableData.param.configKey" placeholder="请输入参数键名" clearable size="default" @keyup.enter.native="dataList" />
-					</el-form-item>
-					<el-form-item label="系统内置" prop="configType" style="width: 200px">
-						<el-select v-model="tableData.param.configType" placeholder="系统内置" clearable size="default" style="width: 240px">
-							<el-option v-for="dict in sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
-						</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="dataList">
-							<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="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" v-loading="tableData.loading">
-				<el-table-column type="selection" width="55" align="center" />
-				<el-table-column label="ID" align="center" prop="configId" width="60" />
-				<el-table-column label="参数名称" prop="configName" :show-overflow-tooltip="true" />
-				<el-table-column label="参数键名" prop="configKey" :show-overflow-tooltip="true" />
-				<el-table-column label="参数键值" prop="configValue" />
-				<el-table-column label="备注" prop="remark" :show-overflow-tooltip="true" />
-				<!-- <el-table-column label="创建时间" prop="createdAt" width="180" align="center" /> -->
-				<el-table-column label="系统内置" align="center" prop="configType" width="100">
-					<template #default="{ row }">
-						{{ row.configType ? '是' : '否' }}
-					</template>
-				</el-table-column>
-				<el-table-column label="操作" width="100" align="center" fixed="right">
-					<template #default="scope">
-						<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="dataList"
-			/>
-		</el-card>
-		<EditConfig ref="editDicRef" @dataList="dataList" :sysYesNoOptions="sys_yes_no" />
-	</div>
+  <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="configName">
+            <el-input v-model="tableData.param.configName" placeholder="请输入参数名称" clearable size="default" @keyup.enter.native="dataList" />
+          </el-form-item>
+          <el-form-item label="参数键名" prop="configKey">
+            <el-input v-model="tableData.param.configKey" placeholder="请输入参数键名" clearable size="default" @keyup.enter.native="dataList" />
+          </el-form-item>
+          <el-form-item label="系统内置" prop="configType" style="width: 200px">
+            <el-select v-model="tableData.param.configType" placeholder="系统内置" clearable size="default" style="width: 240px">
+              <el-option v-for="dict in sys_yes_no" :key="dict.value" :label="dict.label" :value="dict.value" />
+            </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="dataList">
+              <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="onOpenAddDic" v-auth="'add'">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增参数
+            </el-button>
+            <el-button size="default" type="danger" class="ml10" @click="onRowDel()" v-auth="'del'">
+              <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" v-loading="tableData.loading">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="ID" v-col="'configId'" align="center" prop="configId" width="60" />
+        <el-table-column label="参数名称" v-col="'configName'" prop="configName" :show-overflow-tooltip="true" />
+        <el-table-column label="参数键名" v-col="'configKey'" prop="configKey" :show-overflow-tooltip="true" />
+        <el-table-column label="参数键值" v-col="'configValue'" prop="configValue" />
+        <el-table-column label="备注" prop="remark" v-col="'remark'" :show-overflow-tooltip="true" />
+        <!-- <el-table-column label="创建时间" prop="createdAt" width="180" align="center" /> -->
+        <el-table-column label="系统内置" v-col="'configType'" align="center" prop="configType" width="100">
+          <template #default="{ row }">
+            {{ row.configType ? '是' : '否' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="100" v-col="'handle'" align="center" fixed="right">
+          <template #default="scope">
+            <el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'del'">删除</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="dataList" />
+    </el-card>
+    <EditConfig ref="editDicRef" @dataList="dataList" :sysYesNoOptions="sys_yes_no" />
+  </div>
 </template>
 
 <script lang="ts">
@@ -94,136 +79,136 @@ import api from '/@/api/system';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	configId: number;
-	configName: string;
-	configKey: string;
-	configValue: string;
-	configType: number;
-	remark: string;
-	createdAt: string;
+  configId: number;
+  configName: string;
+  configKey: string;
+  configValue: string;
+  configType: number;
+  remark: string;
+  createdAt: string;
 }
 interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: Array<TableDataRow>;
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			configName: string;
-			configKey: string;
-			configType: string;
-			dateRange: string[];
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: Array<TableDataRow>;
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      configName: string;
+      configKey: string;
+      configType: string;
+      dateRange: string[];
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'apiV1SystemDictDataList',
-	components: { EditConfig },
-	setup() {
-		const { proxy } = getCurrentInstance() as any;
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const queryRef = ref();
-		const { sys_yes_no } = proxy.useDict('sys_yes_no');
-		const state = reactive<TableDataState>({
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					dateRange: [],
-					pageNum: 1,
-					pageSize: 10,
-					configName: '',
-					configKey: '',
-					configType: '',
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			dataList();
-		};
-		const dataList = () => {
-			state.tableData.loading = true;
-			api.config
-				.getList(state.tableData.param)
-				.then((res: any) => {
-					state.tableData.data = res.list;
-					state.tableData.total = res.total;
-				})
-				.finally(() => (state.tableData.loading = false));
-		};
-		// 打开新增字典弹窗
-		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.configName}”,是否继续?`;
-				ids = [row.configId];
-			} else {
-				ids = state.ids;
-			}
-			if (ids.length === 0) {
-				ElMessage.error('请选择要删除的数据。');
-				return;
-			}
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					api.config.del(ids).then(() => {
-						ElMessage.success('删除成功');
-						dataList();
-					});
-				})
-				.catch(() => {});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			dataList();
-		};
-		// 多选框选中数据
-		const handleSelectionChange = (selection: TableDataRow[]) => {
-			state.ids = selection.map((item) => item.configId);
-		};
-		// 参数系统内置字典翻译
-		const typeFormat = (row: TableDataRow) => {
-			return proxy.selectDictLabel(unref(sys_yes_no), row.configType);
-		};
-		return {
-			addDicRef,
-			editDicRef,
-			queryRef,
-			sys_yes_no,
-			onOpenAddDic,
-			onOpenEditDic,
-			onRowDel,
-			dataList,
-			resetQuery,
-			handleSelectionChange,
-			...toRefs(state),
-		};
-	},
+  name: 'apiV1SystemDictDataList',
+  components: { EditConfig },
+  setup() {
+    const { proxy } = getCurrentInstance() as any;
+    const addDicRef = ref();
+    const editDicRef = ref();
+    const queryRef = ref();
+    const { sys_yes_no } = proxy.useDict('sys_yes_no');
+    const state = reactive<TableDataState>({
+      ids: [],
+      tableData: {
+        data: [],
+        total: 0,
+        loading: false,
+        param: {
+          dateRange: [],
+          pageNum: 1,
+          pageSize: 10,
+          configName: '',
+          configKey: '',
+          configType: '',
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      dataList();
+    };
+    const dataList = () => {
+      state.tableData.loading = true;
+      api.config
+        .getList(state.tableData.param)
+        .then((res: any) => {
+          state.tableData.data = res.list;
+          state.tableData.total = res.total;
+        })
+        .finally(() => (state.tableData.loading = false));
+    };
+    // 打开新增字典弹窗
+    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.configName}”,是否继续?`;
+        ids = [row.configId];
+      } else {
+        ids = state.ids;
+      }
+      if (ids.length === 0) {
+        ElMessage.error('请选择要删除的数据。');
+        return;
+      }
+      ElMessageBox.confirm(msg, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
+          api.config.del(ids).then(() => {
+            ElMessage.success('删除成功');
+            dataList();
+          });
+        })
+        .catch(() => { });
+    };
+    // 页面加载时
+    onMounted(() => {
+      initTableData();
+    });
+    /** 重置按钮操作 */
+    const resetQuery = (formEl: FormInstance | undefined) => {
+      if (!formEl) return;
+      formEl.resetFields();
+      dataList();
+    };
+    // 多选框选中数据
+    const handleSelectionChange = (selection: TableDataRow[]) => {
+      state.ids = selection.map((item) => item.configId);
+    };
+    // 参数系统内置字典翻译
+    const typeFormat = (row: TableDataRow) => {
+      return proxy.selectDictLabel(unref(sys_yes_no), row.configType);
+    };
+    return {
+      addDicRef,
+      editDicRef,
+      queryRef,
+      sys_yes_no,
+      onOpenAddDic,
+      onOpenEditDic,
+      onRowDel,
+      dataList,
+      resetQuery,
+      handleSelectionChange,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

+ 30 - 2
src/views/system/datahub/modeling/component/edit.vue

@@ -19,14 +19,20 @@
 				</el-form-item> -->
 
 				<el-form-item label="定时请求">
+			
+					<div style="display:flex">
 							<el-input v-model="ruleForm.cronExpression" placeholder="请输入cron表达式" />
-							<ul style="list-style: none;">
+							<el-button type="success"  @click="showCron('ruleForm')" style="margin-left: 5px;">设置</el-button>
+
+						</div>
+							<!-- <el-input v-model="ruleForm.cronExpression" placeholder="请输入cron表达式" /> -->
+							<!-- <ul style="list-style: none;">
 								<li><el-icon><ele-WarningFilled /></el-icon> */5 * * * * ? : 每隔5秒执行一次</li>
 								<li><el-icon><ele-WarningFilled /></el-icon> 20 */1 * * * ? : 每隔1分钟执行一次</li>
 								<li><el-icon><ele-WarningFilled /></el-icon> 30 0 23 * * ? : 每天23点执行一次</li>
 								<li><el-icon><ele-WarningFilled /></el-icon> 0 0 1 * * ? : 每天凌晨1点执行一次</li>
 								<li><el-icon><ele-WarningFilled /></el-icon> 0 0 1 1 * ? : 每月1号凌晨1点执行一次</li>
-							</ul>
+							</ul> -->
 						</el-form-item>
 
 				<el-form-item label="描述" prop="desc">
@@ -55,6 +61,10 @@
 				</span>
 			</template>
 		</el-dialog>
+
+		<el-dialog v-model="cronShow" title="选择Cron规则" width="60%">
+			<vue3cron @handlelisten="handlelisten" :type="crontype" @close="cronclose"></vue3cron>
+		</el-dialog>
 	</div>
 </template>
 
@@ -62,6 +72,7 @@
 import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 import api from '/@/api/datahub';
 import { ElMessage } from 'element-plus';
+import vue3cron from '/@/components/vue3cron/vue3cron.vue';
 
 interface RuleFormState {
 	id?: number;
@@ -78,6 +89,7 @@ interface DicState {
 
 export default defineComponent({
 	name: 'Edit',
+	components: { vue3cron },
 
 	setup(prop, { emit }) {
 		const formRef = ref<HTMLElement | null>(null);
@@ -85,6 +97,8 @@ export default defineComponent({
 			isShowDialog: false,
 			zidianData:[],
 			cityData:[],
+			cronShow:false,
+			crontype:'',
 			unitData: [
 				{
 					label: '秒',
@@ -183,8 +197,22 @@ export default defineComponent({
 				}
 			});
 		};
+		const handlelisten = (e) => {
+			state.ruleForm.cronExpression=e.cron
+		};
+		const showCron=(type)=>{
+				state.crontype=type
+				state.cronShow=true;
+
+		};
+		const cronclose=()=>{
+			state.cronShow=false;
+		}
 
 		return {
+			handlelisten,
+			showCron,
+			cronclose,
 			openDialog,
 			closeDialog,
 			onCancel,

+ 180 - 194
src/views/system/datahub/modeling/detail.vue

@@ -1,103 +1,89 @@
 <template>
-	<div class="system-dic-container">
-		<div class="content">
-			<div class="cont_box">
-				<div class="title">模型标识:{{ detail.key }}</div>
-				<div class="title" style="margin-left: 20px">模型表名:{{ detail.name }}</div>
+  <div class="system-dic-container">
+    <div class="content">
+      <div class="cont_box">
+        <div class="title">模型标识:{{ detail.key }}</div>
+        <div class="title" style="margin-left: 20px">模型表名:{{ detail.name }}</div>
 
-				<div class="pro-status"><span :class="developer_status == 1 ? 'on' : 'off'"></span>{{ developer_status == 1 ? '已发布' : '未发布' }}</div>
+        <div class="pro-status"><span :class="developer_status == 1 ? 'on' : 'off'"></span>{{ developer_status == 1 ? '已发布' : '未发布' }}</div>
 
-				<div class="pro-option" @click="CkOption">{{ developer_status == 1 ? '停用' : '发布' }}</div>
-			</div>
-		</div>
+        <div class="pro-option" @click="CkOption">{{ developer_status == 1 ? '停用' : '发布' }}</div>
+      </div>
+    </div>
 
-		<div class="content-box">
-			<div class="wu-box">
-				<div class="system-user-search mb15">
-					<el-form :model="tableData.param" ref="queryRef" :inline="true" label-width="130px">
-						<el-form-item label="字段标题" prop="key">
-							<el-input
-								v-model="tableData.param.key"
-								placeholder="请输入字段标题"
-								clearable
-								size="default"
-								style="width: 240px"
-								@keyup.enter.native="typeList"
-							/>
-						</el-form-item>
-						<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>
+    <div class="content-box">
+      <div class="wu-box">
+        <div class="system-user-search mb15">
+          <el-form :model="tableData.param" ref="queryRef" :inline="true" label-width="130px">
+            <el-form-item label="字段标题" prop="key">
+              <el-input v-model="tableData.param.key" placeholder="请输入字段标题" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
+            </el-form-item>
+            <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>
-							<el-button size="default" type="primary" class="ml10" @click="typeList">
-								<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="onOpenAdd" v-auth="'add'" v-if="developer_status==0">
-								<el-icon>
-									<ele-FolderAdd />
-								</el-icon>
-								新增字段节点
-							</el-button>
-							<!-- <el-button size="default" type="danger" class="ml10" @click="onRowDel(null)">
+            <el-form-item>
+              <el-button size="default" type="primary" class="ml10" @click="typeList">
+                <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="onOpenAdd" v-auth="'add'" v-if="developer_status==0">
+                <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-form-item>
+          </el-form>
+        </div>
 
-				<el-table :data="tableData.data" style="width: 100%"  v-loading="tableData.loading">
-					<el-table-column label="ID" align="center" prop="id" width="60" v-col="'id'" />
-					<el-table-column label="字段名称" prop="key" width="120" :show-overflow-tooltip="true"  v-col="'key'"/>
-					<el-table-column label="字段标题" prop="name" width="120" :show-overflow-tooltip="true" v-col="'name'"/>
-					<el-table-column label="类型" prop="dataType" width="85" :show-overflow-tooltip="true" v-col="'dataType'"/>
+        <el-table :data="tableData.data" style="width: 100%" v-loading="tableData.loading">
+          <el-table-column label="ID" align="center" prop="id" width="60" v-col="'id'" />
+          <el-table-column label="字段名称" prop="key" width="120" :show-overflow-tooltip="true" v-col="'key'" />
+          <el-table-column label="字段标题" prop="name" width="120" :show-overflow-tooltip="true" v-col="'name'" />
+          <el-table-column label="类型" prop="dataType" width="85" :show-overflow-tooltip="true" v-col="'dataType'" />
 
-					<el-table-column label="数据源名称" align="center"  v-col="'from'">
-						<template #default="scope">
-							<span v-if="scope.row.from==2">{{scope.row.source.name}}</span>
-						</template>
-					</el-table-column>
-					<el-table-column label="默认值" prop="default" width="80" :show-overflow-tooltip="true" v-col="'default'"/>
-					<el-table-column label="备注说明" prop="value" width="100" :show-overflow-tooltip="true"v-col="'value'" />
-					<el-table-column prop="createdAt" label="创建时间" align="center" width="160" v-col="'createdAt'"></el-table-column>
+          <el-table-column label="数据源名称" align="center" v-col="'from'">
+            <template #default="scope">
+              <span v-if="scope.row.from==2">{{scope.row.source.name}}</span>
+            </template>
+          </el-table-column>
+          <el-table-column label="默认值" prop="default" width="80" :show-overflow-tooltip="true" v-col="'default'" />
+          <el-table-column label="备注说明" prop="value" width="100" :show-overflow-tooltip="true" v-col="'value'" />
+          <el-table-column prop="createdAt" label="创建时间" align="center" width="160" v-col="'createdAt'"></el-table-column>
 
-					<el-table-column label="操作" width="100" align="center" fixed="right">
-						<template #default="scope">
-							<el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="developer_status==0" v-auth="'edit'">修改</el-button>
-							<el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="developer_status==0" v-auth="'del'">删除</el-button>
-						</template>
-					</el-table-column>
-				</el-table>
-				<!-- <pagination
+          <el-table-column label="操作" width="100" align="center" fixed="right">
+            <template #default="scope">
+              <el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="developer_status==0" v-auth="'edit'">修改</el-button>
+              <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="developer_status==0" v-auth="'del'">删除</el-button>
+            </template>
+          </el-table-column>
+        </el-table>
+        <!-- <pagination
 					v-show="tableData.data.length > 0"
 					:total="tableData.total"
 					v-model:page="tableData.param.pageNum"
 					v-model:limit="tableData.param.pageSize"
 					@pagination="typeList"
 				/> -->
-			</div>
-		</div>
-		<EditDic ref="editDicRef" @typeList="typeList" />
-	</div>
+      </div>
+    </div>
+    <EditDic ref="editDicRef" @typeList="typeList" />
+  </div>
 </template>
 <script lang="ts">
 import { toRefs, reactive, onMounted, ref, defineComponent } from 'vue';
@@ -108,135 +94,135 @@ import EditDic from './component/editNode.vue';
 import api from '/@/api/datahub';
 
 interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: [];
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			name: string;
-			deviceType: string;
-			status: string;
-			dateRange: string[];
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: [];
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      name: string;
+      deviceType: string;
+      status: string;
+      dateRange: string[];
+    };
+  };
 }
 export default defineComponent({
-	name: 'dataDetail',
-	components: { EditDic },
-	setup(prop, context) {
-		const editDicRef = ref();
+  name: 'dataDetail',
+  components: { EditDic },
+  setup(prop, context) {
+    const editDicRef = ref();
 
-		const route = useRoute();
-		const state = reactive<TableDataState>({
-			config: {},
+    const route = useRoute();
+    const state = reactive<TableDataState>({
+      config: {},
 
-			isShowDialog: false,
-			detail: [],
-			developer_status:0,
+      isShowDialog: false,
+      detail: [],
+      developer_status: 0,
 
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					tid: route.params && route.params.id,
-					status: '',
-					dateRange: [],
-				},
-			},
-		});
+      tableData: {
+        data: [],
+        total: 0,
+        loading: false,
+        param: {
+          pageNum: 1,
+          pageSize: 10,
+          tid: route.params && route.params.id,
+          status: '',
+          dateRange: [],
+        },
+      },
+    });
 
-		onMounted(() => {
-			const ids = route.params && route.params.id;
-			api.template.detail(ids).then((res: any) => {
-				state.detail = res.data;
-				state.developer_status=res.data.status
-			});
+    onMounted(() => {
+      const ids = route.params && route.params.id;
+      api.template.detail(ids).then((res: any) => {
+        state.detail = res.data;
+        state.developer_status = res.data.status
+      });
 
-			typeList();
-		});
+      typeList();
+    });
 
 
 
-		const typeList = () => {
-			state.tableData.loading = true;
-			api.tnode.getList(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.list;
-				//state.tableData.total = res.Total;
-			}).finally(() => (state.tableData.loading = false));
-		};
+    const typeList = () => {
+      state.tableData.loading = true;
+      api.tnode.getList(state.tableData.param).then((res: any) => {
+        state.tableData.data = res.list;
+        //state.tableData.total = res.Total;
+      }).finally(() => (state.tableData.loading = false));
+    };
 
-		const handleClick = (tab: TabsPaneContext, event: Event) => {
-			console.log(tab, event);
-		};
+    const handleClick = (tab: TabsPaneContext, event: Event) => {
+      console.log(tab, event);
+    };
 
-		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.tnode.delete(ids).then(() => {
-						ElMessage.success('删除成功');
-						typeList();
-					});
-				})
-				.catch(() => {});
-		};
+    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.tnode.delete(ids).then(() => {
+            ElMessage.success('删除成功');
+            typeList();
+          });
+        })
+        .catch(() => { });
+    };
 
-		// 打开修改数据源弹窗
-		const onOpenEdit = (row: TableDataRow) => {
-			editDicRef.value.openDialog(row);
-		};
+    // 打开修改数据源弹窗
+    const onOpenEdit = (row: TableDataRow) => {
+      editDicRef.value.openDialog(row);
+    };
 
-		const onOpenAdd = () => {
-			editDicRef.value.openDialog({ tid: route.params.id, id: 0, from: 1,isSorting:0,isDesc:1 });
-		};
+    const onOpenAdd = () => {
+      editDicRef.value.openDialog({ tid: route.params.id, id: 0, from: 1, isSorting: 0, isDesc: 1 });
+    };
 
-		const CkOption = () => {
-			if (state.developer_status == 1) {
-				api.tnode.undeploy({ id: route.params.id }).then((res: any) => {
-					ElMessage.success('操作成功');
-					state.developer_status = 0;
-				});
-			} else {
-				api.tnode.deploy({ id: route.params.id }).then((res: any) => {
-					ElMessage.success('操作成功');
-					state.developer_status = 1;
-				});
-			}
-		};
+    const CkOption = () => {
+      if (state.developer_status == 1) {
+        api.tnode.undeploy({ id: route.params.id }).then((res: any) => {
+          ElMessage.success('操作成功');
+          state.developer_status = 0;
+        });
+      } else {
+        api.tnode.deploy({ id: route.params.id }).then((res: any) => {
+          ElMessage.success('操作成功');
+          state.developer_status = 1;
+        });
+      }
+    };
 
-		return {
-			Edit,
-			CkOption,
-			editDicRef,
-			onOpenAdd,
-			typeList,
-			onRowDel,
-			onOpenEdit,
-			handleClick,
-			...toRefs(state),
-		};
-	},
+    return {
+      Edit,
+      CkOption,
+      editDicRef,
+      onOpenAdd,
+      typeList,
+      onRowDel,
+      onOpenEdit,
+      handleClick,
+      ...toRefs(state),
+    };
+  },
 });
 </script>
 <style>

+ 193 - 216
src/views/system/datahub/modeling/index.vue

@@ -1,97 +1,74 @@
 <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">
-					<el-form-item label="模型标识" prop="key">
-						<el-input
-							v-model="tableData.param.key"
-							placeholder="请输入模型标识"
-							clearable
-							size="default"
-							style="width: 240px"
-							@keyup.enter.native="typeList"
-						/>
-					</el-form-item>
-					<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>
-						<el-button size="default" type="primary" class="ml10" @click="typeList">
-							<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="onOpenAdd" v-auth="'add'">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增模型
-						</el-button>
-						<el-button size="default" type="danger" class="ml10" @click="onRowDel(null)" v-auth="'del'">
-							<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" v-loading="tableData.loading">
-				<el-table-column type="selection" width="55" align="center" />
-				<el-table-column label="ID" align="center" prop="id" width="80" v-col="'id'"/>
-<!--				<el-table-column label="模型标识" prop="key" :show-overflow-tooltip="true" />-->
-				<el-table-column label="模型名称" prop="name" :show-overflow-tooltip="true"  v-col="'name'"/>
-				<el-table-column prop="status" label="状态" width="100" align="center"  v-col="'status'"> 
+  <div class="system-dic-container">
+    <el-card shadow="hover">
+      <div class="system-user-search mb15">
+        <el-form :model="tableData.param" ref="queryRef" :inline="true">
+          <el-form-item label="模型标识" prop="key">
+            <el-input v-model="tableData.param.key" placeholder="请输入模型标识" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
+          </el-form-item>
+          <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>
+            <el-button size="default" type="primary" class="ml10" @click="typeList">
+              <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="onOpenAdd" v-auth="'add'">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增模型
+            </el-button>
+            <el-button size="default" type="danger" class="ml10" @click="onRowDel()" v-auth="'del'">
+              <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" v-loading="tableData.loading">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="ID" align="center" prop="id" width="80" v-col="'id'" />
+        <!--				<el-table-column label="模型标识" prop="key" :show-overflow-tooltip="true" />-->
+        <el-table-column label="模型名称" prop="name" :show-overflow-tooltip="true" v-col="'name'" />
+        <el-table-column label="描述" prop="desc" :show-overflow-tooltip="true" v-col="'desc'" />
+        <el-table-column prop="status" label="状态" width="100" align="center" v-col="'status'">
           <template #default="scope">
             <el-tag type="success" size="small" v-if="scope.row.status==1">已发布</el-tag>
             <el-tag type="info" size="small" v-else>未发布</el-tag>
           </template>
         </el-table-column>
-				<el-table-column prop="createdAt" label="创建时间"  width="200" align="center" v-col="'createdAt'"></el-table-column>
+        <el-table-column prop="createdAt" label="创建时间" width="200" align="center" v-col="'createdAt'"></el-table-column>
 
-				<el-table-column label="操作" width="280" align="center" fixed="right">
-					<template #default="scope" >
-						<router-link
-							:to="'/datahub/modeling/detail/' + scope.row.id"
-							class="link-type"
-							style="padding-right: 12px; font-size: 12px; color: #409eff"
-							v-auth="'detail'">
-							<span>字段管理</span>
-						</router-link>
-						<el-button size="small" text type="success" @click="onOpenRecord(scope.row)"  v-if="scope.row.status==1" v-auth="'record'">数据记录</el-button>
-						<el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="scope.row.status==0" v-auth="'edit'">修改</el-button>
-						<el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="scope.row.status==0" v-auth="'del'">删除</el-button>
-						<el-button size="small" text type="primary" @click="copy(scope.row)" v-auth="'copy'">复制</el-button>
+        <el-table-column label="操作" width="280" align="center" fixed="right">
+          <template #default="scope">
+            <router-link :to="'/datahub/modeling/detail/' + scope.row.id" class="link-type" style="padding-right: 12px; font-size: 12px; color: #409eff" v-auth="'detail'">
+              <span>字段管理</span>
+            </router-link>
+            <el-button size="small" text type="success" @click="onOpenRecord(scope.row)" v-if="scope.row.status==1" v-auth="'record'">数据记录</el-button>
+            <el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="scope.row.status==0" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="scope.row.status==0" v-auth="'del'">删除</el-button>
+            <el-button size="small" text type="primary" @click="copy(scope.row)" v-auth="'copy'">复制</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" />
-		<Detail ref="detailRef" />
-	</div>
+          </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" />
+    <Detail ref="detailRef" />
+  </div>
 </template>
 
 <script lang="ts">
@@ -103,146 +80,146 @@ import api from '/@/api/datahub';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	id: number;
-	name: string;
-	key: string;
+  id: number;
+  name: string;
+  key: string;
 
-	createBy: string;
+  createBy: string;
 }
 interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: Array<TableDataRow>;
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			name: string;
-			key: string;
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: Array<TableDataRow>;
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      name: string;
+      key: string;
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'sourcelist',
-	components: { EditDic,Detail },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const detailRef=ref();
-		const queryRef = ref();
-		const state = reactive<TableDataState>({
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					name: '',
-					key: '',
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			typeList();
-		};
-		const typeList = () => {
-			state.tableData.loading = true;
-			api.template.getList(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.list;
-				state.tableData.total = res.Total;
-			}).finally(() => (state.tableData.loading = false));
-		};
-		// 打开新增菜单弹窗
-		const onOpenAdd = (row?: TableDataRow) => {
-			editDicRef.value.openDialog(row?.id);
-		};
-		// 打开修改模型弹窗
-		const onOpenEdit = (row: TableDataRow) => {
-			editDicRef.value.openDialog(row);
-		};
-		//打开数据记录
-		const onOpenRecord=(row: TableDataRow)=>{
-			detailRef.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.template.delete(ids).then(() => {
-						ElMessage.success('删除成功');
-						typeList();
-					});
-				})
-				.catch(() => {});
-		};
+  name: 'sourcelist',
+  components: { EditDic, Detail },
+  setup() {
+    const addDicRef = ref();
+    const editDicRef = ref();
+    const detailRef = ref();
+    const queryRef = ref();
+    const state = reactive<TableDataState>({
+      tableData: {
+        data: [],
+        total: 0,
+        loading: false,
+        param: {
+          pageNum: 1,
+          pageSize: 10,
+          name: '',
+          key: '',
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      typeList();
+    };
+    const typeList = () => {
+      state.tableData.loading = true;
+      api.template.getList(state.tableData.param).then((res: any) => {
+        state.tableData.data = res.list;
+        state.tableData.total = res.Total;
+      }).finally(() => (state.tableData.loading = false));
+    };
+    // 打开新增菜单弹窗
+    const onOpenAdd = (row?: TableDataRow) => {
+      editDicRef.value.openDialog(row?.id);
+    };
+    // 打开修改模型弹窗
+    const onOpenEdit = (row: TableDataRow) => {
+      editDicRef.value.openDialog({ ...row });
+    };
+    //打开数据记录
+    const onOpenRecord = (row: TableDataRow) => {
+      detailRef.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.template.delete(ids).then(() => {
+            ElMessage.success('删除成功');
+            typeList();
+          });
+        })
+        .catch(() => { });
+    };
 
-		//复制数据
-		const copy=(row:TableDataRow)=>{
-			ElMessageBox.confirm("确定要复制该数据吗?", '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
+    //复制数据
+    const copy = (row: TableDataRow) => {
+      ElMessageBox.confirm("确定要复制该数据吗?", '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
 
-					api.template.copy({id:row.id}).then(() => {
-						ElMessage.success('复制成功');
-						typeList();
-					});
-				})
-				.catch(() => {});
-		}
+          api.template.copy({ id: row.id }).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);
-		};
+    // 页面加载时
+    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,
-			detailRef,
-			queryRef,
-			onOpenRecord,
-			onOpenAdd,
-			onOpenEdit,
-			onRowDel,
-			copy,
-			typeList,
-			resetQuery,
-			handleSelectionChange,
-			...toRefs(state),
-		};
-	},
+    return {
+      addDicRef,
+      editDicRef,
+      detailRef,
+      queryRef,
+      onOpenRecord,
+      onOpenAdd,
+      onOpenEdit,
+      onRowDel,
+      copy,
+      typeList,
+      resetQuery,
+      handleSelectionChange,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

+ 43 - 42
src/views/system/datahub/source/component/edit.vue

@@ -55,8 +55,12 @@
 					</el-form-item>
 
 					<el-form-item label="定时请求">
-						<el-input v-model="config.cronExpression" placeholder="请输入cron表达式" />
-						<ul style="list-style: none">
+						<div style="display:flex">
+							<el-input v-model="config.cronExpression" placeholder="请输入cron表达式" />
+							<el-button type="success"  @click="showCron('config')" style="    margin-left: 5px;">设置</el-button>
+
+						</div>
+						<!-- <ul style="list-style: none">
 							<li>
 								<el-icon><ele-WarningFilled /></el-icon> */5 * * * * ? : 每隔5秒执行一次
 							</li>
@@ -72,7 +76,7 @@
 							<li>
 								<el-icon><ele-WarningFilled /></el-icon> 0 0 1 1 * ? : 每月1号凌晨1点执行一次
 							</li>
-						</ul>
+						</ul> -->
 					</el-form-item>
 
 					<!-- <el-form-item label="更新时间">
@@ -128,36 +132,7 @@
 							</el-option>
 						</el-select>
 					</el-form-item>
-					<!-- <el-form-item label="主机地址" >
-							<el-input v-model="devconfig.host" placeholder="请输入主机地址"   />
-						</el-form-item>
-
-						<el-form-item label="端口号">
-							<el-input v-model="devconfig.port" placeholder="请输入端口号" />
-						</el-form-item>
-
-						<el-form-item label="用户名">
-							<el-input v-model="devconfig.user" placeholder="请输入用户名" />
-						</el-form-item>
-
-						<el-form-item label="密码">
-							<el-input v-model="devconfig.password" placeholder="请输入密码" />
-						</el-form-item>
-
-						<el-form-item label="数据库名称">
-							<el-input v-model="devconfig.dbname" placeholder="请输入数据库名称" />
-						</el-form-item>
-
-						<el-form-item label="表名称">
-							<el-input v-model="devconfig.table" placeholder="请输入表名称" />
-						</el-form-item>
-
-						<el-form-item label="更新时间">
-							<el-input v-model="devconfig.interval" placeholder="请输入更新时间" class="w-35" />
-							<el-select v-model="devconfig.intervalUnit" placeholder="请选择单位">
-								<el-option v-for="item in unitData" :key="item.value" :label="item.label" :value="item.value" />
-							</el-select>
-						</el-form-item> -->
+			
 				</div>
 
 				<div v-if="ruleForm.from == 2">
@@ -203,14 +178,13 @@
 						</el-form-item>
 
 						<el-form-item label="任务表达式">
-							<el-input v-model="tabconfig.cronExpression" placeholder="请输入cron任务表达式" />
-							<ul style="list-style: none;">
-								<li><el-icon><ele-WarningFilled /></el-icon> */5 * * * * ? : 每隔5秒执行一次</li>
-								<li><el-icon><ele-WarningFilled /></el-icon> 20 */1 * * * ? : 每隔1分钟执行一次</li>
-								<li><el-icon><ele-WarningFilled /></el-icon> 30 0 23 * * ? : 每天23点执行一次</li>
-								<li><el-icon><ele-WarningFilled /></el-icon> 0 0 1 * * ? : 每天凌晨1点执行一次</li>
-								<li><el-icon><ele-WarningFilled /></el-icon> 0 0 1 1 * ? : 每月1号凌晨1点执行一次</li>
-							</ul>
+
+						<div style="display:flex">
+								<el-input v-model="tabconfig.cronExpression" placeholder="请输入cron任务表达式" />
+							    <el-button type="success"  @click="showCron('tabconfig')" style="    margin-left: 5px;">设置</el-button>
+
+						</div>
+							
 						</el-form-item>
 				</div>
 			</el-form>
@@ -232,6 +206,10 @@
 				</span>
 			</template>
 		</el-dialog>
+
+		<el-dialog v-model="cronShow" title="选择Cron规则" width="60%">
+			<vue3cron @handlelisten="handlelisten" :type="crontype" @close="cronclose"></vue3cron>
+		</el-dialog>
 	</div>
 </template>
 
@@ -239,6 +217,7 @@
 import { reactive, toRefs, defineComponent, ref, unref } from 'vue';
 import api from '/@/api/datahub';
 import 'vue3-json-viewer/dist/index.css';
+import vue3cron from '/@/components/vue3cron/vue3cron.vue';
 
 import { ElMessage } from 'element-plus';
 import { Delete, Plus, CircleClose, Minus, Right } from '@element-plus/icons-vue';
@@ -261,7 +240,7 @@ interface DicState {
 
 export default defineComponent({
 	name: 'Edit',
-	components: { Delete, Plus, CircleClose, Minus, Right },
+	components: { Delete, Plus, CircleClose, Minus, Right,vue3cron },
 
 	setup(prop, { emit }) {
 		const myRef = ref<HTMLElement | null>(null);
@@ -269,6 +248,8 @@ export default defineComponent({
 		const state = reactive<DicState>({
 			isShowDialog: false,
 			dialogVisible: false,
+			cronShow:false,
+			crontype:'',
 			config: {},
 			devconfig: {},
 			tabconfig: {},
@@ -581,11 +562,31 @@ export default defineComponent({
 				}
 			});
 		};
+		
+		const handlelisten = (e) => {
+			console.log(e);
+			if(e.type=='config'){
+				state.config.cronExpression=e.cron
+			}else if(e.type=='tabconfig'){
+				state.tabconfig.cronExpression=e.cron
+			}
+		};
+		const showCron=(type)=>{
+				state.crontype=type
+				state.cronShow=true;
+
+		};
+		const cronclose=()=>{
+			state.cronShow=false;
+		}
 
 		return {
+			cronclose,
+			showCron,
 			onTest,
 			addRule,
 			delRule,
+			handlelisten,
 			addParams,
 			addParamss,
 			delParamss,

+ 1 - 1
src/views/system/datahub/source/component/editNode.vue

@@ -3,7 +3,7 @@
 		<el-dialog :title="(ruleForm.nodeId !== 0 ? '修改' : '添加') + '数据节点'" v-model="isShowDialog" width="769px">
 			<el-form :model="ruleForm" ref="formRef" :rules="rules" size="default" label-width="110px">
 				<el-form-item label="数据节点标识" prop="key">
-					<el-input v-model="ruleForm.key" placeholder="请输入数据节点名称" :disabled="detail.lockKey==1" />
+					<el-input v-model="ruleForm.key" placeholder="请输入数据节点名称" :disabled="detail.lockKey==1 && ruleForm.nodeId !== 0" />
 				</el-form-item>
 				<el-form-item label="数据节点名称" prop="name">
 					<el-input v-model="ruleForm.name" placeholder="请输入数据节点名称" />

+ 235 - 261
src/views/system/datahub/source/index.vue

@@ -1,111 +1,85 @@
 <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">
-					<el-form-item label="数据源标识" prop="key">
-						<el-input
-							v-model="tableData.param.key"
-							placeholder="数据源标识"
-							clearable
-							size="default"
-							style="width: 240px"
-							@keyup.enter.native="typeList"
-						/>
-					</el-form-item>
-					<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>
+  <div class="system-dic-container">
+    <el-card shadow="hover">
+      <div class="system-user-search mb15">
+        <el-form :model="tableData.param" ref="queryRef" :inline="true">
+          <el-form-item label="数据源标识" prop="key">
+            <el-input v-model="tableData.param.key" placeholder="数据源标识" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
+          </el-form-item>
+          <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="host">
-						<el-select v-model="tableData.param.from" placeholder="请选择数据源类型" @keyup.enter.native="typeList">
-							<el-option v-for="item in typeData" :key="item.value" :label="item.label" :value="item.value" />
-						</el-select>
-					</el-form-item>
+          <el-form-item label="数据源类型" prop="host">
+            <el-select v-model="tableData.param.from" placeholder="请选择数据源类型" @keyup.enter.native="typeList">
+              <el-option v-for="item in typeData" :key="item.value" :label="item.label" :value="item.value" />
+            </el-select>
+          </el-form-item>
 
-					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="typeList">
-							<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="onOpenAdd" v-auth="'add'"> 
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增数据源
-						</el-button>
-						<el-button size="default" type="danger" class="ml10" @click="onRowDel(null)" v-auth="'del'">
-							<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" v-loading="tableData.loading">
-				<el-table-column type="selection" width="55" align="center" />
-				<el-table-column label="ID" align="center" prop="sourceId" width="80" v-col="'sourceId'" />
-				<el-table-column label="数据源名称" prop="name" :show-overflow-tooltip="true" v-col="'name'"/>
-				<el-table-column prop="from" label="数据源类型" width="160" align="center" v-col="'from'">
-					<template #default="scope">
-						<span v-if="scope.row.from == 1">api导入</span>
-						<span v-if="scope.row.from == 2">数据库</span>
-						<span v-if="scope.row.from == 3">文件</span>
-						<span v-if="scope.row.from == 4">设备</span>
-					</template>
-				</el-table-column>
-				<el-table-column prop="status" label="状态" width="100" align="center" v-col="'status'">
-					<template #default="scope">
-						<el-tag type="success" size="small" v-if="scope.row.status == 1">已发布</el-tag>
-						<el-tag type="info" size="small" v-if="scope.row.status == 0">未发布</el-tag>
-					</template>
-				</el-table-column>
+          <el-form-item>
+            <el-button size="default" type="primary" class="ml10" @click="typeList">
+              <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="onOpenAdd" v-auth="'add'">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增数据源
+            </el-button>
+            <el-button size="default" type="danger" class="ml10" @click="onRowDel()" v-auth="'del'">
+              <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" v-loading="tableData.loading">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="ID" align="center" prop="sourceId" width="80" v-col="'sourceId'" />
+        <el-table-column label="数据源名称" prop="name" :show-overflow-tooltip="true" v-col="'name'" />
+        <el-table-column prop="from" label="数据源类型" width="160" align="center" v-col="'from'">
+          <template #default="scope">
+            <span v-if="scope.row.from == 1">api导入</span>
+            <span v-if="scope.row.from == 2">数据库</span>
+            <span v-if="scope.row.from == 3">文件</span>
+            <span v-if="scope.row.from == 4">设备</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="status" label="状态" width="100" align="center" v-col="'status'">
+          <template #default="scope">
+            <el-tag type="success" size="small" v-if="scope.row.status == 1">已发布</el-tag>
+            <el-tag type="info" size="small" v-if="scope.row.status == 0">未发布</el-tag>
+          </template>
+        </el-table-column>
 
-
-				<el-table-column label="操作" width="200" align="center" fixed="right">
-					<template #default="scope">
-						<router-link
-							:to="'/datahub/source/detail/' + scope.row.sourceId"
-							class="link-type"
-							style="padding-right: 12px; font-size: 12px; color: #409eff"
-							v-auth="'detail'"
-						>
-							<span>详情</span>
-						</router-link>
-						<el-button size="small" text type="success" @click="onOpenList(scope.row)"  v-if="scope.row.status==1" v-auth="'detail'">数据记录</el-button>
-						<el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="scope.row.status==0" v-auth="'edit'">修改</el-button>
-						<el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="scope.row.status==0" v-auth="'del'">删除</el-button>
-						<el-button size="small" text type="primary" @click="copy(scope.row)" v-auth="'copy'">复制</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" />
-		<ListDic ref="listDicRef" />
-	</div>
+        <el-table-column label="操作" width="200" align="center" fixed="right">
+          <template #default="scope">
+            <router-link :to="'/datahub/source/detail/' + scope.row.sourceId" class="link-type" style="padding-right: 12px; font-size: 12px; color: #409eff" v-auth="'detail'">
+              <span>详情</span>
+            </router-link>
+            <el-button size="small" text type="success" @click="onOpenList(scope.row)" v-if="scope.row.status==1" v-auth="'detail'">数据记录</el-button>
+            <el-button size="small" text type="warning" @click="onOpenEdit(scope.row)" v-if="scope.row.status==0" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-if="scope.row.status==0" v-auth="'del'">删除</el-button>
+            <el-button size="small" text type="primary" @click="copy(scope.row)" v-auth="'copy'">复制</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" />
+    <ListDic ref="listDicRef" />
+  </div>
 </template>
 
 <script lang="ts">
@@ -117,171 +91,171 @@ import api from '/@/api/datahub';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	sourceId: number;
-	name: string;
-	key: string;
-	status: number;
-	from: string;
-	createBy: string;
+  sourceId: number;
+  name: string;
+  key: string;
+  status: number;
+  from: string;
+  createBy: string;
 }
 interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: Array<TableDataRow>;
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			name: string;
-			key: string;
-			from: string;
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: Array<TableDataRow>;
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      name: string;
+      key: string;
+      from: string;
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'sourcelist',
-	components: { EditDic,ListDic },
-	setup() {
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const listDicRef=ref();
-		const queryRef = ref();
-		const state = reactive<TableDataState>({
-			typeData: [
-				{
-					label: '全部',
-					value: '-1',
-				},
-				{
-					label: 'api导入',
-					value: '1',
-				},
-				{
-					label: '数据库',
-					value: '2',
-				},
-				{
-					label: '文件',
-					value: '3',
-				},
-				{
-					label: '设备',
-					value: '4',
-				},
-			],
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					name: '',
-					types: '',
-					status: '',
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			typeList();
-		};
-		const typeList = () => {
-			state.tableData.loading = true;
-			api.common.getList(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.list;
-				state.tableData.total = res.Total;
-			}).finally(() => (state.tableData.loading = false));
-		};
+  name: 'sourcelist',
+  components: { EditDic, ListDic },
+  setup() {
+    const addDicRef = ref();
+    const editDicRef = ref();
+    const listDicRef = ref();
+    const queryRef = ref();
+    const state = reactive<TableDataState>({
+      typeData: [
+        {
+          label: '全部',
+          value: '-1',
+        },
+        {
+          label: 'api导入',
+          value: '1',
+        },
+        {
+          label: '数据库',
+          value: '2',
+        },
+        {
+          label: '文件',
+          value: '3',
+        },
+        {
+          label: '设备',
+          value: '4',
+        },
+      ],
+      ids: [],
+      tableData: {
+        data: [],
+        total: 0,
+        loading: false,
+        param: {
+          pageNum: 1,
+          pageSize: 10,
+          name: '',
+          types: '',
+          status: '',
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      typeList();
+    };
+    const typeList = () => {
+      state.tableData.loading = true;
+      api.common.getList(state.tableData.param).then((res: any) => {
+        state.tableData.data = res.list;
+        state.tableData.total = res.Total;
+      }).finally(() => (state.tableData.loading = false));
+    };
 
-		//复制数据
-		const copy=(row:TableDataRow)=>{
-			ElMessageBox.confirm("确定要复制该数据吗?", '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
+    //复制数据
+    const copy = (row: TableDataRow) => {
+      ElMessageBox.confirm("确定要复制该数据吗?", '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
 
-					api.common.copy({sourceId:row.sourceId}).then(() => {
-						ElMessage.success('复制成功');
-						typeList();
-					});
-				})
-				.catch(() => {});
-		}
+          api.common.copy({ sourceId: row.sourceId }).then(() => {
+            ElMessage.success('复制成功');
+            typeList();
+          });
+        })
+        .catch(() => { });
+    }
 
-		//打开数据记录
-		const onOpenList=(row: TableDataRow)=>{
-			listDicRef.value.openDialog(row);
-		}
-		// 打开新增数据源弹窗
-		const onOpenAdd = () => {
-			editDicRef.value.openDialog();
-		};
-		// 打开修改数据源弹窗
-		const onOpenEdit = (row: TableDataRow) => {
-			editDicRef.value.openDialog(row);
-		};
-		const onRowDel = (row: TableDataRow) => {
-			let msg = '你确定要删除所选数据?';
-			let ids: number[] = [];
-			if (row) {
-				msg = `此操作将永久删除数据源:“${row.name}”,是否继续?`;
-				ids = [row.sourceId];
-			} else {
-				ids = state.ids;
-			}
-			if (ids.length === 0) {
-				ElMessage.error('请选择要删除的数据。');
-				return;
-			}
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					api.common.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.sourceId);
-		};
+    //打开数据记录
+    const onOpenList = (row: TableDataRow) => {
+      listDicRef.value.openDialog(row);
+    }
+    // 打开新增数据源弹窗
+    const onOpenAdd = () => {
+      editDicRef.value.openDialog();
+    };
+    // 打开修改数据源弹窗
+    const onOpenEdit = (row: TableDataRow) => {
+      editDicRef.value.openDialog(row);
+    };
+    const onRowDel = (row?: TableDataRow) => {
+      let msg = '你确定要删除所选数据?';
+      let ids: number[] = [];
+      if (row) {
+        msg = `此操作将永久删除数据源:“${row.name}”,是否继续?`;
+        ids = [row.sourceId];
+      } else {
+        ids = state.ids;
+      }
+      if (ids.length === 0) {
+        ElMessage.error('请选择要删除的数据。');
+        return;
+      }
+      ElMessageBox.confirm(msg, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
+          api.common.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.sourceId);
+    };
 
-		return {
-			addDicRef,
-			editDicRef,
-			listDicRef,
-			queryRef,
-			copy,
-			onOpenList,
-			onOpenAdd,
-			onOpenEdit,
-			onRowDel,
-			typeList,
-			resetQuery,
-			handleSelectionChange,
-			...toRefs(state),
-		};
-	},
+    return {
+      addDicRef,
+      editDicRef,
+      listDicRef,
+      queryRef,
+      copy,
+      onOpenList,
+      onOpenAdd,
+      onOpenEdit,
+      onRowDel,
+      typeList,
+      resetQuery,
+      handleSelectionChange,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

+ 128 - 128
src/views/system/dict/dataList.vue

@@ -23,13 +23,13 @@
               </el-icon>
               查询
             </el-button>
-            <el-button size="default" type="success" class="ml10" @click="onOpenAddDic">
+            <el-button size="default" type="success" class="ml10" @click="onOpenAddDic" v-auth="'add'">
               <el-icon>
                 <ele-FolderAdd />
               </el-icon>
               新增字典
             </el-button>
-            <el-button size="default" type="danger" class="ml10" @click="onRowDel(null)">
+            <el-button size="default" type="danger" class="ml10" @click="onRowDel()" v-auth="'del'">
               <el-icon>
                 <ele-Delete />
               </el-icon>
@@ -40,22 +40,22 @@
       </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="字典编码" width="90"  align="center" prop="dictCode" />
-        <el-table-column label="字典标签" align="center" prop="dictLabel" />
-        <el-table-column label="字典键值" align="center" prop="dictValue" />
-        <el-table-column label="字典排序" width="100" align="center" prop="dictSort" />
-        <el-table-column label="备注" align="center" prop="remark" :show-overflow-tooltip="true" />
+        <el-table-column label="字典编码" v-col="'dictCode'" width="90" align="center" prop="dictCode" />
+        <el-table-column label="字典标签" v-col="'dictLabel'" align="center" prop="dictLabel" />
+        <el-table-column label="字典键值" v-col="'dictValue'" align="center" prop="dictValue" />
+        <el-table-column label="字典排序" v-col="'dictSort'" width="100" align="center" prop="dictSort" />
+        <el-table-column label="备注" v-col="'remark'" align="center" prop="remark" :show-overflow-tooltip="true" />
         <!-- <el-table-column label="创建时间" align="center" prop="createdAt" width="180" /> -->
-        <el-table-column prop="status" label="字典状态" width="120" align="center">
+        <el-table-column prop="status" label="字典状态" v-col="'status'" 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 label="操作" width="100" align="center">
+        <el-table-column label="操作" width="100" align="center" v-col="'handle'">
           <template #default="scope">
-            <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>
+            <el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'del'">删除</el-button>
           </template>
         </el-table-column>
       </el-table>
@@ -74,127 +74,127 @@ import { useRoute } from 'vue-router';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	dictCode: number;
-	dictSort: number;
-	dictLabel: string;
-	dictValue: string;
-	dictType: string;
-	status: number;
-	remark: string;
-	createdAt: string;
+  dictCode: number;
+  dictSort: number;
+  dictLabel: string;
+  dictValue: string;
+  dictType: string;
+  status: number;
+  remark: string;
+  createdAt: string;
 }
 interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: Array<TableDataRow>;
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			dictType: string;
-			dictLabel: string;
-			status: number;
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: Array<TableDataRow>;
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      dictType: string;
+      dictLabel: string;
+      status: number;
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'apiV1SystemDictDataList',
-	components: { EditDic },
-	setup() {
-		const route = useRoute();
-		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,
-					dictLabel: '',
-					dictType: '',
-					status: -1,
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			dataList();
-		};
-		const dataList = () => {
-			api.dict.getDataList(state.tableData.param).then((res: any) => {
-				state.tableData.data = res.list;
-				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.dictLabel}”,是否继续?`;
-				ids = [row.dictCode];
-			} else {
-				ids = state.ids;
-			}
-			if (ids.length === 0) {
-				ElMessage.error('请选择要删除的数据。');
-				return;
-			}
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					api.dict.deleteData(ids).then(() => {
-						ElMessage.success('删除成功');
-						dataList();
-					});
-				})
-				.catch(() => {});
-		};
-		// 页面加载时
-		onMounted(() => {
-			const dictType = route.params && route.params.dictType;
-			state.tableData.param.dictType = <string>dictType;
-			initTableData();
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			dataList();
-		};
-		// 多选框选中数据
-		const handleSelectionChange = (selection: TableDataRow[]) => {
-			state.ids = selection.map((item) => item.dictCode);
-		};
-		return {
-			addDicRef,
-			editDicRef,
-			queryRef,
-			onOpenAddDic,
-			onOpenEditDic,
-			onRowDel,
-			dataList,
-			resetQuery,
-			handleSelectionChange,
-			...toRefs(state),
-		};
-	},
+  name: 'apiV1SystemDictDataList',
+  components: { EditDic },
+  setup() {
+    const route = useRoute();
+    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,
+          dictLabel: '',
+          dictType: '',
+          status: -1,
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      dataList();
+    };
+    const dataList = () => {
+      api.dict.getDataList(state.tableData.param).then((res: any) => {
+        state.tableData.data = res.list;
+        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.dictLabel}”,是否继续?`;
+        ids = [row.dictCode];
+      } else {
+        ids = state.ids;
+      }
+      if (ids.length === 0) {
+        ElMessage.error('请选择要删除的数据。');
+        return;
+      }
+      ElMessageBox.confirm(msg, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
+          api.dict.deleteData(ids).then(() => {
+            ElMessage.success('删除成功');
+            dataList();
+          });
+        })
+        .catch(() => { });
+    };
+    // 页面加载时
+    onMounted(() => {
+      const dictType = route.params && route.params.dictType;
+      state.tableData.param.dictType = <string>dictType;
+      initTableData();
+    });
+    /** 重置按钮操作 */
+    const resetQuery = (formEl: FormInstance | undefined) => {
+      if (!formEl) return;
+      formEl.resetFields();
+      dataList();
+    };
+    // 多选框选中数据
+    const handleSelectionChange = (selection: TableDataRow[]) => {
+      state.ids = selection.map((item) => item.dictCode);
+    };
+    return {
+      addDicRef,
+      editDicRef,
+      queryRef,
+      onOpenAddDic,
+      onOpenEditDic,
+      onRowDel,
+      dataList,
+      resetQuery,
+      handleSelectionChange,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

+ 195 - 224
src/views/system/dict/index.vue

@@ -1,110 +1,81 @@
 <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="dictName">
-						<el-input
-							v-model="tableData.param.dictName"
-							placeholder="请输入字典名称"
-							clearable
-							size="default"
-							style="width: 240px"
-							@keyup.enter.native="typeList"
-						/>
-					</el-form-item>
-					<el-form-item label="字典类型" prop="dictType">
-						<el-input
-							v-model="tableData.param.dictType"
-							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-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="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" v-loading="tableData.loading">
-				<el-table-column type="selection" width="55" align="center" />
-				<el-table-column label="字典ID" align="center" prop="dictId" width="80" />
-				<el-table-column label="字典名称" prop="dictName" :show-overflow-tooltip="true" />
-				<el-table-column label="字典类型" align="center" :show-overflow-tooltip="true">
-					<template #default="scope">
-						<router-link :to="'/system/dict/data/list/' + scope.row.dictType" class="link-type">
-							<span>{{ scope.row.dictType }}</span>
-						</router-link>
-					</template>
-				</el-table-column>
-				<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="remark" label="字典描述" show-overflow-tooltip></el-table-column>
-				<!-- <el-table-column prop="createdAt" label="创建时间" align="center" width="180"></el-table-column> -->
-				<el-table-column label="操作" width="100" align="center">
-					<template #default="scope">
-						<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>
+  <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="dictName">
+            <el-input v-model="tableData.param.dictName" placeholder="请输入字典名称" clearable size="default" style="width: 240px" @keyup.enter.native="typeList" />
+          </el-form-item>
+          <el-form-item label="字典类型" prop="dictType">
+            <el-input v-model="tableData.param.dictType" 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-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="onOpenAddDic" v-auth="'add'">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增字典
+            </el-button>
+            <el-button size="default" type="danger" class="ml10" @click="onRowDel()" v-auth="'del'">
+              <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" v-loading="tableData.loading">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="字典ID" v-col="'dictId'" align="center" prop="dictId" width="80" />
+        <el-table-column label="字典名称" v-col="'dictName'" prop="dictName" :show-overflow-tooltip="true" />
+        <el-table-column label="字典类型" v-col="'dictType'" align="center" :show-overflow-tooltip="true">
+          <template #default="scope">
+            <router-link :to="'/system/dict/data/list/' + scope.row.dictType" class="link-type">
+              <span>{{ scope.row.dictType }}</span>
+            </router-link>
+          </template>
+        </el-table-column>
+        <el-table-column prop="status" label="字典状态" v-col="'status'" 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="remark" v-col="'remark'" label="字典描述" show-overflow-tooltip></el-table-column>
+        <!-- <el-table-column prop="createdAt" label="创建时间" align="center" width="180"></el-table-column> -->
+        <el-table-column label="操作" width="100" align="center" v-col="'handle'">
+          <template #default="scope">
+            <el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'del'">删除</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">
@@ -115,128 +86,128 @@ import api from '/@/api/system';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	dictId: number;
-	dictName: string;
-	dictType: string;
-	status: number;
-	remark: string;
-	createdAt: string;
+  dictId: number;
+  dictName: string;
+  dictType: string;
+  status: number;
+  remark: string;
+  createdAt: string;
 }
 interface TableDataState {
-	ids: number[];
-	tableData: {
-		data: Array<TableDataRow>;
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			dictName: string;
-			dictType: string;
-			status: string;
-			dateRange: string[];
-		};
-	};
+  ids: number[];
+  tableData: {
+    data: Array<TableDataRow>;
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      dictName: string;
+      dictType: string;
+      status: string;
+      dateRange: string[];
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'systemDic',
-	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 = () => {
-			state.tableData.loading = true;
-			api.dict
-				.getTypeList(state.tableData.param)
-				.then((res: any) => {
-					state.tableData.data = res.dictTypeList;
-					state.tableData.total = res.total;
-				})
-				.finally(() => (state.tableData.loading = false));
-		};
-		// 打开新增字典弹窗
-		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.dictName}”,是否继续?`;
-				ids = [row.dictId];
-			} else {
-				ids = state.ids;
-			}
-			if (ids.length === 0) {
-				ElMessage.error('请选择要删除的数据。');
-				return;
-			}
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					api.dict.deleteType(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.dictId);
-		};
-		return {
-			addDicRef,
-			editDicRef,
-			queryRef,
-			onOpenAddDic,
-			onOpenEditDic,
-			onRowDel,
-			typeList,
-			resetQuery,
-			handleSelectionChange,
-			...toRefs(state),
-		};
-	},
+  name: 'systemDic',
+  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 = () => {
+      state.tableData.loading = true;
+      api.dict
+        .getTypeList(state.tableData.param)
+        .then((res: any) => {
+          state.tableData.data = res.dictTypeList;
+          state.tableData.total = res.total;
+        })
+        .finally(() => (state.tableData.loading = false));
+    };
+    // 打开新增字典弹窗
+    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.dictName}”,是否继续?`;
+        ids = [row.dictId];
+      } else {
+        ids = state.ids;
+      }
+      if (ids.length === 0) {
+        ElMessage.error('请选择要删除的数据。');
+        return;
+      }
+      ElMessageBox.confirm(msg, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
+          api.dict.deleteType(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.dictId);
+    };
+    return {
+      addDicRef,
+      editDicRef,
+      queryRef,
+      onOpenAddDic,
+      onOpenEditDic,
+      onRowDel,
+      typeList,
+      resetQuery,
+      handleSelectionChange,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

+ 94 - 93
src/views/system/menu/component/btn.vue

@@ -1,52 +1,53 @@
 <template>
-	<el-drawer v-model="drawer" :title="title" direction="rtl" size="700px">
-		<div class="p-3">
-			<el-button size="default" type="success" class="mr-3" @click="onAddRow">
-				<el-icon>
-					<ele-FolderAdd />
-				</el-icon>
-				新增按钮
-			</el-button>
+  <el-drawer v-model="drawer" :title="title" direction="rtl" size="700px">
+    <div class="p-3">
+      <el-button size="default" type="success" class="mr-3" @click="onAddRow">
+        <el-icon>
+          <ele-FolderAdd />
+        </el-icon>
+        新增按钮
+      </el-button>
 
-			<el-dropdown @command="addCommonType">
-				<el-button text type="primary">
-					<el-icon>
-						<ele-Plus />
-					</el-icon>常用按钮权限
-				</el-button>
-				<template #dropdown>
-					<el-dropdown-menu>
-						<el-dropdown-item command="add-新增">新增</el-dropdown-item>
-						<el-dropdown-item command="edit-编辑">编辑</el-dropdown-item>
-						<el-dropdown-item command="detail-详情">详情</el-dropdown-item>
-						<el-dropdown-item command="del-删除">删除</el-dropdown-item>
-						<el-dropdown-item command="upload-导入">导入</el-dropdown-item>
-						<el-dropdown-item command="dwonload-导出">导出</el-dropdown-item>
-						<el-dropdown-item command="reset-重置">重置</el-dropdown-item>
-					</el-dropdown-menu>
-				</template>
-			</el-dropdown>
-		</div>
+      <el-dropdown @command="addCommonType">
+        <el-button text type="primary">
+          <el-icon>
+            <ele-Plus />
+          </el-icon>常用按钮权限
+        </el-button>
+        <template #dropdown>
+          <el-dropdown-menu>
+            <el-dropdown-item command="add-新增">新增</el-dropdown-item>
+            <el-dropdown-item command="edit-编辑">编辑</el-dropdown-item>
+            <el-dropdown-item command="detail-详情">详情</el-dropdown-item>
+            <el-dropdown-item command="del-删除">删除</el-dropdown-item>
+            <el-dropdown-item command="upload-导入">导入</el-dropdown-item>
+            <el-dropdown-item command="dwonload-导出">导出</el-dropdown-item>
+            <el-dropdown-item command="reset-重置">重置</el-dropdown-item>
+            <el-dropdown-item command="more-更多">更多</el-dropdown-item>
+          </el-dropdown-menu>
+        </template>
+      </el-dropdown>
+    </div>
 
-		<el-table :data="tableData" style="width: 100%" row-key="id" border :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
-			<el-table-column type="index" label="序号" width="60" align="center" />
-			<el-table-column prop="name" label="按钮名称" width="220" show-overflow-tooltip></el-table-column>
-			<el-table-column prop="types" label="按钮编码" show-overflow-tooltip></el-table-column>
-			<el-table-column prop="status" label="状态" width="100" align="center">
-				<template #default="scope">
-					<el-switch v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
-					</el-switch>
-				</template>
-			</el-table-column>
-			<el-table-column label="操作" width="100" align="center">
-				<template #default="scope">
-					<el-button size="small" text type="warning" @click="onEdit(scope.row)">修改</el-button>
-					<el-button size="small" text type="danger" @click="onDel(scope.row)">删除</el-button>
-				</template>
-			</el-table-column>
-		</el-table>
-	</el-drawer>
-	<btnForm ref="btnFormRef" :parent-data="tableData" @getList="getList"></btnForm>
+    <el-table :data="tableData" style="width: 100%" row-key="id" border :tree-props="{ children: 'children', hasChildren: 'hasChildren' }">
+      <el-table-column type="index" label="序号" width="60" align="center" />
+      <el-table-column prop="name" label="按钮名称" width="220" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="types" label="按钮编码" show-overflow-tooltip></el-table-column>
+      <el-table-column prop="status" label="状态" width="100" align="center">
+        <template #default="scope">
+          <el-switch v-model="scope.row.status" inline-prompt :active-value="1" :inactive-value="0" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
+          </el-switch>
+        </template>
+      </el-table-column>
+      <el-table-column label="操作" width="100" align="center">
+        <template #default="scope">
+          <el-button size="small" text type="warning" @click="onEdit(scope.row)">修改</el-button>
+          <el-button size="small" text type="danger" @click="onDel(scope.row)">删除</el-button>
+        </template>
+      </el-table-column>
+    </el-table>
+  </el-drawer>
+  <btnForm ref="btnFormRef" :parent-data="tableData" @getList="getList"></btnForm>
 </template>
 
 <script lang="ts" setup>
@@ -63,73 +64,73 @@ const tableData = ref<MenuBtnRow[]>([]);
 const menuRow = ref();
 const btnFormRef = ref();
 const getList = async () => {
-	tableData.value = [];
-	let res = await api.menu.btn.getList({ menuId: menuRow.value.id as number, status: -1 });
-	tableData.value = res || [];
+  tableData.value = [];
+  let res = await api.menu.btn.getList({ menuId: menuRow.value.id as number, status: -1 });
+  tableData.value = res || [];
 };
 
 const open = async (row: any) => {
-	// console.log(row);
-	title.value = '按钮权限 - ' + row.title;
-	drawer.value = true;
-	menuRow.value = row;
-	getList();
+  // console.log(row);
+  title.value = '按钮权限 - ' + row.title;
+  drawer.value = true;
+  menuRow.value = row;
+  getList();
 };
 
 const onAddRow = () => {
-	btnFormRef.value.open({ menuId: menuRow.value.id });
+  btnFormRef.value.open({ menuId: menuRow.value.id });
 };
 
 const onEdit = (row: MenuBtnRow) => {
-	btnFormRef.value.open(row);
+  btnFormRef.value.open(row);
 };
 
 // 添加常用类型
 const addCommonType = async (command: string) => {
-	const [types, name] = command.split('-');
-	const formData: MenuBtnRow = {
-		parentId: -1,
-		menuId: menuRow.value.id as number,
-		name,
-		types,
-		description: '',
-		status: 1,
-	};
-	await api.menu.btn.add(formData);
-	ElMessage.success('操作成功');
-	getList();
-	getBackEndControlRoutes();
+  const [types, name] = command.split('-');
+  const formData: MenuBtnRow = {
+    parentId: -1,
+    menuId: menuRow.value.id as number,
+    name,
+    types,
+    description: '',
+    status: 1,
+  };
+  await api.menu.btn.add(formData);
+  ElMessage.success('操作成功');
+  getList();
+  getBackEndControlRoutes();
 };
 
 // 修改启用停用状态
 const handleStatusChange = (row: MenuBtnRow) => {
-	let text = row.status === 1 ? '启用' : '停用';
-	ElMessageBox.confirm('确认要"' + text + '":"' + row.name + '"按钮吗?', '警告', {
-		confirmButtonText: '确定',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(async function () {
-			await api.menu.btn.setStatus(row.id as number, row.menuId as number, row.status);
-			ElMessage.success('操作成功');
-			getBackEndControlRoutes();
-		})
-		.catch(function () {
-			row.status = row.status === 0 ? 1 : 0;
-		});
+  let text = row.status === 1 ? '启用' : '停用';
+  ElMessageBox.confirm('确认要"' + text + '":"' + row.name + '"按钮吗?', '警告', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning',
+  })
+    .then(async function () {
+      await api.menu.btn.setStatus(row.id as number, row.menuId as number, row.status);
+      ElMessage.success('操作成功');
+      getBackEndControlRoutes();
+    })
+    .catch(function () {
+      row.status = row.status === 0 ? 1 : 0;
+    });
 };
 
 const onDel = (row: MenuBtnRow) => {
-	ElMessageBox.confirm(`此操作将删除按钮:“${row.name}”,是否继续?`, '提示', {
-		confirmButtonText: '确认',
-		cancelButtonText: '取消',
-		type: 'warning',
-	}).then(async () => {
-		await api.menu.btn.del(row.id as number);
-		ElMessage.success('删除成功');
-		getList();
-		getBackEndControlRoutes();
-	});
+  ElMessageBox.confirm(`此操作将删除按钮:“${row.name}”,是否继续?`, '提示', {
+    confirmButtonText: '确认',
+    cancelButtonText: '取消',
+    type: 'warning',
+  }).then(async () => {
+    await api.menu.btn.del(row.id as number);
+    ElMessage.success('删除成功');
+    getList();
+    getBackEndControlRoutes();
+  });
 };
 
 defineExpose({ open });

+ 111 - 119
src/views/system/menu/index.vue

@@ -1,87 +1,79 @@
 <template>
-	<div class="system-user-container">
-		<el-card shadow="hover">
-			<div class="system-menu-search">
-				<el-form inline>
-					<el-form-item label="菜单名称">
-						<el-input v-model="state.queryParams.title" placeholder="请输入菜单名称" size="default" clearable class="w-50" />
-					</el-form-item>
-					<!-- <el-form-item label="组件路径">
+  <div class="system-user-container">
+    <el-card shadow="hover">
+      <div class="system-menu-search">
+        <el-form inline>
+          <el-form-item label="菜单名称">
+            <el-input v-model="state.queryParams.title" placeholder="请输入菜单名称" size="default" clearable class="w-50" />
+          </el-form-item>
+          <!-- <el-form-item label="组件路径">
             <el-input v-model="queryParams.component" placeholder="请输入组件路径" clearable  class="w-50" />
           </el-form-item> -->
-					<el-form-item>
-						<el-button type="primary" class="ml10" @click="handleQuery">
-							<el-icon>
-								<ele-Search />
-							</el-icon>
-							查询
-						</el-button>
-						<el-button type="success" class="ml10" @click="onOpenAddMenu(null)">
-							<el-icon>
-								<ele-FolderAdd />
-							</el-icon>
-							新增菜单
-						</el-button>
-					</el-form-item>
-				</el-form>
-			</div>
-			<el-table
-				:data="state.menuTableData"
-				default-expand-all
-				style="width: 100%"
-				row-key="path"
-				:tree-props="{ children: 'children', hasChildren: 'hasChildren' }"
-        v-loading="state.loading"
-			>
-				<el-table-column label="菜单名称" show-overflow-tooltip>
-					<template #default="scope">
-						<SvgIcon :name="scope.row.icon" />
-						<span class="ml10">{{ scope.row.title }}</span>
-					</template>
-				</el-table-column>
-				<el-table-column prop="path" label="路由路径" show-overflow-tooltip></el-table-column>
-				<el-table-column label="组件路径" prop="component" show-overflow-tooltip></el-table-column>
-				<el-table-column label="排序" prop="weigh" width="80" align="center"></el-table-column>
-				<el-table-column label="类型" width="80" align="center">
-					<template #default="scope">
-						<el-tag :type="scope.row.menuType === 0 ? 'danger' : scope.row.menuType === 1 ? 'success' : 'warning'" size="small">{{
+          <el-form-item>
+            <el-button type="primary" class="ml10" @click="handleQuery">
+              <el-icon>
+                <ele-Search />
+              </el-icon>
+              查询
+            </el-button>
+            <el-button type="success" class="ml10" @click="onOpenAddMenu(null)" v-auth="'add'">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增菜单
+            </el-button>
+          </el-form-item>
+        </el-form>
+      </div>
+      <el-table :data="state.menuTableData" :default-expand-all="false" style="width: 100%" row-key="path" :tree-props="{ children: 'children', hasChildren: 'hasChildren' }" v-loading="state.loading">
+        <el-table-column label="菜单名称" show-overflow-tooltip v-col="'title'">
+          <template #default="scope">
+            <SvgIcon :name="scope.row.icon" />
+            <span class="ml10">{{ scope.row.title }}</span>
+          </template>
+        </el-table-column>
+        <el-table-column prop="path" v-col="'path'" label="路由路径" show-overflow-tooltip></el-table-column>
+        <el-table-column label="组件路径" v-col="'component'" prop="component" show-overflow-tooltip></el-table-column>
+        <el-table-column label="排序" v-col="'weigh'" prop="weigh" width="80" align="center"></el-table-column>
+        <el-table-column label="类型" v-col="'menuType'" width="80" align="center">
+          <template #default="scope">
+            <el-tag :type="scope.row.menuType === 0 ? 'danger' : scope.row.menuType === 1 ? 'success' : 'warning'" size="small">{{
 							scope.row.menuType === 0 ? '目录' : scope.row.menuType === 1 ? '菜单' : '按钮'
 						}}</el-tag>
-					</template>
-				</el-table-column>
-				<el-table-column prop="isHide" label="显示状态" align="center" width="120">
-					<template #default="{ row }">
-						{{ row.isHide ? '隐藏' : '显示' }}
-					</template>
-				</el-table-column>
-				<el-table-column label="操作" width="200" align="center" fixed="right">
-					<template #default="scope">
-						<el-button v-if="!scope.row.menuType" size="small" type="text" @click="onOpenAddMenu(scope.row)">新增</el-button>
-						<el-button size="small" text type="warning" @click="onOpenEditMenu(scope.row)">修改</el-button>
-						<el-button size="small" text type="danger" @click="onTabelRowDel(scope.row)">删除</el-button>
-						<el-dropdown v-if="scope.row.menuType">
-							<el-button type="text" size="small" style="margin-top: 1px; margin-left: 10px"
-								>更多
-								<el-icon>
-									<ele-ArrowDown />
-								</el-icon>
-							</el-button>
-							<template #dropdown>
-								<el-dropdown-menu>
-									<el-dropdown-item @click.native="authOpen(scope.row, 'buttonAuthorizeList')">按钮权限</el-dropdown-item>
-									<el-dropdown-item @click.native="authOpen(scope.row, 'listAuthorizeList')">列表权限</el-dropdown-item>
-								</el-dropdown-menu>
-							</template>
-						</el-dropdown>
-					</template>
-				</el-table-column>
-			</el-table>
-		</el-card>
-		<EditMenu ref="editMenuRef" @menuList="menuList" :menu="state.menuTableData" :visibleOptions="sys_show_hide" :acType="acType" />
-		<ButtonAuthorizeListDrawer ref="buttonAuthorizeList" />
-		<ListAuthorizeListDrawer ref="listAuthorizeList" />
-		<ApiAuthorizeListDrawer ref="apiAuthorizeList" />
-	</div>
+          </template>
+        </el-table-column>
+        <el-table-column prop="isHide" v-col="'isHide'" label="显示状态" align="center" width="120">
+          <template #default="{ row }">
+            {{ row.isHide ? '隐藏' : '显示' }}
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" v-col="'handle'" width="200" align="center" fixed="right">
+          <template #default="scope">
+            <el-button v-if="!scope.row.menuType" size="small" type="text" @click="onOpenAddMenu(scope.row)" v-auth="'add'">新增</el-button>
+            <el-button size="small" text type="warning" @click="onOpenEditMenu(scope.row)" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onTabelRowDel(scope.row)" v-auth="'del'">删除</el-button>
+            <el-dropdown v-if="scope.row.menuType">
+              <el-button type="text" size="small" style="margin-top: 1px; margin-left: 10px" v-auth="'more'">更多
+                <el-icon>
+                  <ele-ArrowDown />
+                </el-icon>
+              </el-button>
+              <template #dropdown>
+                <el-dropdown-menu>
+                  <el-dropdown-item @click.native="authOpen(scope.row, 'buttonAuthorizeList')" v-auth="'btn'">按钮权限</el-dropdown-item>
+                  <el-dropdown-item @click.native="authOpen(scope.row, 'listAuthorizeList')" v-auth="'list'">列表权限</el-dropdown-item>
+                </el-dropdown-menu>
+              </template>
+            </el-dropdown>
+          </template>
+        </el-table-column>
+      </el-table>
+    </el-card>
+    <EditMenu ref="editMenuRef" @menuList="menuList" :menu="state.menuTableData" :visibleOptions="sys_show_hide" :acType="acType" />
+    <ButtonAuthorizeListDrawer ref="buttonAuthorizeList" />
+    <ListAuthorizeListDrawer ref="listAuthorizeList" />
+    <ApiAuthorizeListDrawer ref="apiAuthorizeList" />
+  </div>
 </template>
 
 <script lang="ts" setup>
@@ -95,68 +87,68 @@ const editMenuRef = ref();
 const buttonAuthorizeList = ref();
 const listAuthorizeList = ref();
 const state = reactive({
-  loading:false,
-	queryParams: {
-		title: '',
-		component: '',
-		status: -1,
-	},
-	menuTableData: [],
+  loading: false,
+  queryParams: {
+    title: '',
+    component: '',
+    status: -1,
+  },
+  menuTableData: [],
 });
 const { proxy } = getCurrentInstance() as any;
 const { sys_show_hide } = proxy.useDict('sys_show_hide');
 const acType = ref('add');
 // 打开新增菜单弹窗
 const onOpenAddMenu = (row: any) => {
-	acType.value = 'add';
-	editMenuRef.value.openDialog(row);
+  acType.value = 'add';
+  editMenuRef.value.openDialog(row);
 };
 // 打开编辑菜单弹窗
 const onOpenEditMenu = (row: any) => {
-	acType.value = 'edit';
-	editMenuRef.value.openDialog(row);
+  acType.value = 'edit';
+  editMenuRef.value.openDialog(row);
 };
 
 // 打开按钮权限抽下
 const authOpen = (row: any, key: string) => {
-	if (key === 'buttonAuthorizeList') {
-		return buttonAuthorizeList.value.open(row);
-	}
-	if (key === 'listAuthorizeList') {
-		return listAuthorizeList.value.open(row);
-	}
+  if (key === 'buttonAuthorizeList') {
+    return buttonAuthorizeList.value.open(row);
+  }
+  if (key === 'listAuthorizeList') {
+    return listAuthorizeList.value.open(row);
+  }
 };
 
 // 删除当前行
 const onTabelRowDel = (row: any) => {
-	ElMessageBox.confirm(`此操作将永久删除菜单:“${row.title}”, 是否继续?`, '提示', {
-		confirmButtonText: '删除',
-		cancelButtonText: '取消',
-		type: 'warning',
-	})
-		.then(() => {
-			api.menu.del(row.id).then(() => {
-				ElMessage.success('删除成功');
-				proxy.$refs['editMenuRef'].resetMenuSession();
-				menuList();
-			});
-		})
-		.catch(() => {});
+  ElMessageBox.confirm(`此操作将永久删除菜单:“${row.title}”, 是否继续?`, '提示', {
+    confirmButtonText: '删除',
+    cancelButtonText: '取消',
+    type: 'warning',
+  })
+    .then(() => {
+      api.menu.del(row.id).then(() => {
+        ElMessage.success('删除成功');
+        proxy.$refs['editMenuRef'].resetMenuSession();
+        menuList();
+      });
+    })
+    .catch(() => { });
 };
 onBeforeMount(() => {
-	menuList();
+  menuList();
 });
 const handleQuery = () => {
-	menuList();
+  menuList();
 };
 const menuList = () => {
-	state.loading = true;
-	api.menu
-		.getList(state.queryParams)
-		.then((res: any) => {
-			// console.log({...res[0]})
-			state.menuTableData = res || [];
-		})
-		.finally(() => (state.loading = false));
+  state.loading = true;
+  api.menu
+    .getList(state.queryParams)
+    .then((res: any) => {
+      // console.log({...res[0]})
+      state.menuTableData = res || [];
+    })
+    .finally(() => (state.loading = false));
 };
 </script>

+ 234 - 235
src/views/system/task/index.vue

@@ -1,78 +1,78 @@
 <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="configName">
-						<el-input v-model="tableData.param.configName" placeholder="请输入参数名称" clearable size="default" @keyup.enter="dataList" />
-					</el-form-item>
-					<el-form-item label="任务组名" prop="jobGroup">
-						<el-select v-model="tableData.param.jobGroup" size="mini" placeholder="请选择">
-							<el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
-						</el-select>
-					</el-form-item>
-					<el-form-item label="任务状态" prop="status" style="width: 200px">
-						<el-select v-model="tableData.param.status" size="mini" placeholder="请选择">
-							<el-option label="正常" :value="1" />
-							<el-option label="暂停" :value="0" />
-						</el-select>
-					</el-form-item>
+  <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="configName">
+            <el-input v-model="tableData.param.configName" placeholder="请输入参数名称" clearable size="default" @keyup.enter="dataList" />
+          </el-form-item>
+          <el-form-item label="任务组名" prop="jobGroup">
+            <el-select v-model="tableData.param.jobGroup" size="mini" placeholder="请选择">
+              <el-option v-for="dict in sys_job_group" :key="dict.value" :label="dict.label" :value="dict.value"> </el-option>
+            </el-select>
+          </el-form-item>
+          <el-form-item label="任务状态" prop="status" style="width: 200px">
+            <el-select v-model="tableData.param.status" size="mini" placeholder="请选择">
+              <el-option label="正常" :value="1" />
+              <el-option label="暂停" :value="0" />
+            </el-select>
+          </el-form-item>
 
-					<el-form-item>
-						<el-button size="default" type="primary" class="ml10" @click="dataList">
-							<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="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" v-loading="tableData.loading">
-				<el-table-column type="selection" width="55" align="center" />
-				<el-table-column label="ID" align="center" prop="jobId" width="60" />
-				<el-table-column label="任务名称" prop="jobName" :show-overflow-tooltip="true" />
-				<el-table-column label="任务描述" prop="remark" show-overflow-tooltip />
-				<el-table-column label="任务分组" prop="jobGroup" width="120" :formatter="jobGroupFormat" />
-				<el-table-column label="任务方法名" prop="invokeTarget" />
-				<el-table-column label="cron执行表达式" prop="cronExpression" />
-				<el-table-column label="状态" align="center" prop="status" width="100">
-					<template #default="scope">
-						<!-- {{ row.status ? '正常' : '暂停' }} -->
-						<el-switch v-model="scope.row.status" inline-prompt :active-value="0" :inactive-value="1" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
-						</el-switch>
-					</template>
-				</el-table-column>
-				<el-table-column label="操作" width="180" align="center" fixed="right">
-					<template #default="scope">
-						<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>
-						<el-button size="small" text type="primary" @click="onRowRun(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="dataList" />
-		</el-card>
-		<EditConfig ref="editDicRef" @dataList="dataList" />
-	</div>
+          <el-form-item>
+            <el-button size="default" type="primary" class="ml10" @click="dataList">
+              <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="onOpenAddDic" v-auth="'add'">
+              <el-icon>
+                <ele-FolderAdd />
+              </el-icon>
+              新增任务
+            </el-button>
+            <el-button size="default" type="danger" class="ml10" @click="onRowDel(null)" v-auth="'del'">
+              <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" v-loading="tableData.loading">
+        <el-table-column type="selection" width="55" align="center" />
+        <el-table-column label="ID" align="center" v-col="'jobId'" prop="jobId" width="60" />
+        <el-table-column label="任务名称" v-col="'jobName'" prop="jobName" :show-overflow-tooltip="true" />
+        <el-table-column label="任务描述" v-col="'remark'" prop="remark" show-overflow-tooltip />
+        <el-table-column label="任务分组" v-col="'jobGroup'" prop="jobGroup" width="120" :formatter="jobGroupFormat" />
+        <el-table-column label="任务方法名" v-col="'invokeTarget'" prop="invokeTarget" />
+        <el-table-column label="cron执行表达式" v-col="'cronExpression'" prop="cronExpression" />
+        <el-table-column label="状态" v-col="'status'" align="center" prop="status" width="100">
+          <template #default="scope">
+            <!-- {{ row.status ? '正常' : '暂停' }} -->
+            <el-switch v-model="scope.row.status" inline-prompt :active-value="0" :inactive-value="1" active-text="启" inactive-text="禁" @change="handleStatusChange(scope.row)">
+            </el-switch>
+          </template>
+        </el-table-column>
+        <el-table-column label="操作" width="180" align="center" fixed="right" v-col="'handle'">
+          <template #default="scope">
+            <el-button size="small" text type="warning" @click="onOpenEditDic(scope.row)" v-auth="'edit'">修改</el-button>
+            <el-button size="small" text type="danger" @click="onRowDel(scope.row)" v-auth="'del'">删除</el-button>
+            <el-button size="small" text type="primary" @click="onRowRun(scope.row)" v-auth="'do'">执行一次</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="dataList" />
+    </el-card>
+    <EditConfig ref="editDicRef" @dataList="dataList" />
+  </div>
 </template>
 
 <script lang="ts">
@@ -83,172 +83,171 @@ import api from '/@/api/system';
 
 // 定义接口来定义对象的类型
 interface TableDataRow {
-	jobName: string;
-	jobParams: string;
-	jobGroup: string;
-	invokeTarget: string;
-	cronExpression: string;
-	misfirePolicy: number;
-	status: number;
-	jobId: number;
+  jobName: string;
+  jobParams: string;
+  jobGroup: string;
+  invokeTarget: string;
+  cronExpression: string;
+  misfirePolicy: number;
+  status: number;
+  jobId: number;
 }
 interface TableDataState {
-	ids: number[] | undefined;
-	tableData: {
-		data: Array<TableDataRow>;
-		total: number;
-		loading: boolean;
-		param: {
-			pageNum: number;
-			pageSize: number;
-			jobName: string;
-			jobGroup: string;
-			status: number | null;
-		};
-	};
+  ids: number[] | undefined;
+  tableData: {
+    data: Array<TableDataRow>;
+    total: number;
+    loading: boolean;
+    param: {
+      pageNum: number;
+      pageSize: number;
+      jobName: string;
+      jobGroup: string;
+      status: number | null;
+    };
+  };
 }
 
 export default defineComponent({
-	name: 'apiV1SystemDictDataList',
-	components: { EditConfig },
-	setup() {
-		const { proxy } = getCurrentInstance() as any;
-		const addDicRef = ref();
-		const editDicRef = ref();
-		const queryRef = ref();
-		const { sys_yes_no, sys_job_group } = proxy.useDict('sys_yes_no', 'sys_job_group');
-		const state = reactive<TableDataState>({
-			ids: [],
-			tableData: {
-				data: [],
-				total: 0,
-				loading: false,
-				param: {
-					pageNum: 1,
-					pageSize: 10,
-					jobName: '',
-					jobGroup: '',
-					status: null,
-				},
-			},
-		});
-		// 初始化表格数据
-		const initTableData = () => {
-			dataList();
-		};
-		const dataList = () => {
-			state.tableData.loading = true;
-			api.task
-				.getList(state.tableData.param)
-				.then((res: any) => {
-					state.tableData.data = res.list;
-					state.tableData.total = res.total;
-				})
-				.finally(() => (state.tableData.loading = false));
-		};
-		// 打开新增任务弹窗
-		const onOpenAddDic = () => {
-			editDicRef.value.openDialog();
-		};
-		// 打开修改任务弹窗
-		const onOpenEditDic = (row: TableDataRow) => {
-			editDicRef.value.openDialog(row);
-		};
-		// 删除任务
-		const onRowDel = (row: TableDataRow) => {
-			let msg = '你确定要删除所选数据?';
-			let ids: any = [];
-			if (row) {
-				msg = `此操作将永久删除任务名称:“${row.jobName}”,是否继续?`;
-				ids = [row.jobId];
-			} else {
-				ids = state.ids;
-			}
-			if (ids.length === 0) {
-				ElMessage.error('请选择要删除的数据。');
-				return;
-			}
-			ElMessageBox.confirm(msg, '提示', {
-				confirmButtonText: '确认',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(() => {
-					api.task.del(ids).then(() => {
-						ElMessage.success('删除成功');
-						dataList();
-					});
-				})
-				.catch(() => { });
-		};
-		const onRowRun = (row: TableDataRow) => {
-			ElMessageBox.confirm(`是否确认立即执行一次该任务?`, '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			}).then(() => {
-				api.task.run(row.jobId).then(() => {
-					ElMessage.success('操作成功');
-					dataList();
-				});
-			});
-		};
-		const handleStatusChange = (row: TableDataRow) => {
-			let text = row.status === 0 ? '启用' : '停用';
-			ElMessageBox.confirm('确认要"' + text + '":"' + row.jobName + '"任务吗?', '警告', {
-				confirmButtonText: '确定',
-				cancelButtonText: '取消',
-				type: 'warning',
-			})
-				.then(function () {
-					if (row.status === 0) {
-						return api.task.start(row.jobId);
-					} else {
-						return api.task.stop(row.jobId);
-					}
-				})
-				.then(() => {
-					ElMessage.success(text + '成功');
-				})
-				.catch(function () {
-					row.status = row.status === 0 ? 1 : 0;
-				});
-		};
-		// 页面加载时
-		onMounted(() => {
-			initTableData();
-		});
-		/** 重置按钮操作 */
-		const resetQuery = (formEl: FormInstance | undefined) => {
-			if (!formEl) return;
-			formEl.resetFields();
-			dataList();
-		};
-		// 多选框选中数据
-		const handleSelectionChange = (selection: TableDataRow[]) => {
-			state.ids = selection.map((item) => item.jobId);
-		};
-		const jobGroupFormat = (row: TableDataRow) => {
-			console.log(row);
-			return proxy.selectDictLabel(unref(sys_job_group), row.jobGroup);
-		};
-		return {
-			addDicRef,
-			editDicRef,
-			queryRef,
-			sys_yes_no,
-			sys_job_group,
-			onOpenAddDic,
-			onOpenEditDic,
-			onRowDel,
-			onRowRun,
-			handleStatusChange,
-			dataList,
-			resetQuery,
-			handleSelectionChange,
-			jobGroupFormat,
-			...toRefs(state),
-		};
-	},
+  name: 'apiV1SystemDictDataList',
+  components: { EditConfig },
+  setup() {
+    const { proxy } = getCurrentInstance() as any;
+    const addDicRef = ref();
+    const editDicRef = ref();
+    const queryRef = ref();
+    const { sys_yes_no, sys_job_group } = proxy.useDict('sys_yes_no', 'sys_job_group');
+    const state = reactive<TableDataState>({
+      ids: [],
+      tableData: {
+        data: [],
+        total: 0,
+        loading: false,
+        param: {
+          pageNum: 1,
+          pageSize: 10,
+          jobName: '',
+          jobGroup: '',
+          status: null,
+        },
+      },
+    });
+    // 初始化表格数据
+    const initTableData = () => {
+      dataList();
+    };
+    const dataList = () => {
+      state.tableData.loading = true;
+      api.task
+        .getList(state.tableData.param)
+        .then((res: any) => {
+          state.tableData.data = res.list;
+          state.tableData.total = res.total;
+        })
+        .finally(() => (state.tableData.loading = false));
+    };
+    // 打开新增任务弹窗
+    const onOpenAddDic = () => {
+      editDicRef.value.openDialog();
+    };
+    // 打开修改任务弹窗
+    const onOpenEditDic = (row: TableDataRow) => {
+      editDicRef.value.openDialog(row);
+    };
+    // 删除任务
+    const onRowDel = (row: TableDataRow) => {
+      let msg = '你确定要删除所选数据?';
+      let ids: any = [];
+      if (row) {
+        msg = `此操作将永久删除任务名称:“${row.jobName}”,是否继续?`;
+        ids = [row.jobId];
+      } else {
+        ids = state.ids;
+      }
+      if (ids.length === 0) {
+        ElMessage.error('请选择要删除的数据。');
+        return;
+      }
+      ElMessageBox.confirm(msg, '提示', {
+        confirmButtonText: '确认',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(() => {
+          api.task.del(ids).then(() => {
+            ElMessage.success('删除成功');
+            dataList();
+          });
+        })
+        .catch(() => { });
+    };
+    const onRowRun = (row: TableDataRow) => {
+      ElMessageBox.confirm(`是否确认立即执行一次该任务?`, '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      }).then(() => {
+        api.task.run(row.jobId).then(() => {
+          ElMessage.success('操作成功');
+          dataList();
+        });
+      });
+    };
+    const handleStatusChange = (row: TableDataRow) => {
+      let text = row.status === 0 ? '启用' : '停用';
+      ElMessageBox.confirm('确认要"' + text + '":"' + row.jobName + '"任务吗?', '警告', {
+        confirmButtonText: '确定',
+        cancelButtonText: '取消',
+        type: 'warning',
+      })
+        .then(function () {
+          if (row.status === 0) {
+            return api.task.start(row.jobId);
+          } else {
+            return api.task.stop(row.jobId);
+          }
+        })
+        .then(() => {
+          ElMessage.success(text + '成功');
+        })
+        .catch(function () {
+          row.status = row.status === 0 ? 1 : 0;
+        });
+    };
+    // 页面加载时
+    onMounted(() => {
+      initTableData();
+    });
+    /** 重置按钮操作 */
+    const resetQuery = (formEl: FormInstance | undefined) => {
+      if (!formEl) return;
+      formEl.resetFields();
+      dataList();
+    };
+    // 多选框选中数据
+    const handleSelectionChange = (selection: TableDataRow[]) => {
+      state.ids = selection.map((item) => item.jobId);
+    };
+    const jobGroupFormat = (row: TableDataRow) => {
+      return proxy.selectDictLabel(unref(sys_job_group), row.jobGroup);
+    };
+    return {
+      addDicRef,
+      editDicRef,
+      queryRef,
+      sys_yes_no,
+      sys_job_group,
+      onOpenAddDic,
+      onOpenEditDic,
+      onRowDel,
+      onRowRun,
+      handleStatusChange,
+      dataList,
+      resetQuery,
+      handleSelectionChange,
+      jobGroupFormat,
+      ...toRefs(state),
+    };
+  },
 });
 </script>

Неке датотеке нису приказане због велике количине промена