Browse Source

合并代码

master
song 4 years ago
parent
commit
495941bc84
  1. 9
      .vscode/settings.json
  2. 72
      package-lock.json
  3. 3
      package.json
  4. 45
      src/App.vue
  5. 3
      src/apis/index.js
  6. 12
      src/components/device-edit.vue
  7. 22
      src/components/navbar.vue
  8. 59
      src/components/search-bar-data.vue
  9. 23
      src/routers/index.js
  10. 27
      src/store/device.js
  11. 11
      src/store/index.js
  12. 122
      src/views/data-history.vue
  13. 181
      src/views/device-edit.vue
  14. 14
      src/views/device-list.vue
  15. 2
      src/views/test.vue

9
.vscode/settings.json

@ -1,9 +1,4 @@
{ {
"cSpell.words": [ "cSpell.words": ["browserslist", "commitlint", "unplugin", "windi", "windicss"],
"browserslist", "vue3snippets.enable-compile-vue-file-on-did-save-code": true
"commitlint",
"unplugin",
"windi",
"windicss"
]
} }

72
package-lock.json

@ -1815,6 +1815,51 @@
"esutils": "^2.0.2" "esutils": "^2.0.2"
} }
}, },
"dom-serializer": {
"version": "1.3.2",
"resolved": "https://registry.nlark.com/dom-serializer/download/dom-serializer-1.3.2.tgz?cache=0&sync_timestamp=1621256858583&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdom-serializer%2Fdownload%2Fdom-serializer-1.3.2.tgz",
"integrity": "sha1-YgZDfTLO767HFhgDIwx6ILwbTZE=",
"dev": true,
"requires": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.0",
"entities": "^2.0.0"
},
"dependencies": {
"entities": {
"version": "2.2.0",
"resolved": "https://registry.nlark.com/entities/download/entities-2.2.0.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-2.2.0.tgz",
"integrity": "sha1-CY3JDruD2N/6CJ1VJWs1HTTE2lU=",
"dev": true
}
}
},
"domelementtype": {
"version": "2.2.0",
"resolved": "https://registry.npm.taobao.org/domelementtype/download/domelementtype-2.2.0.tgz?cache=0&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdomelementtype%2Fdownload%2Fdomelementtype-2.2.0.tgz",
"integrity": "sha1-mgtsJ4LtahxzI9QiZxg9+b2LHVc=",
"dev": true
},
"domhandler": {
"version": "4.2.2",
"resolved": "https://registry.nlark.com/domhandler/download/domhandler-4.2.2.tgz?cache=0&sync_timestamp=1630246778110&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomhandler%2Fdownload%2Fdomhandler-4.2.2.tgz",
"integrity": "sha1-6CXXIdGahrjCAaNSZOImxnjudV8=",
"dev": true,
"requires": {
"domelementtype": "^2.2.0"
}
},
"domutils": {
"version": "2.8.0",
"resolved": "https://registry.nlark.com/domutils/download/domutils-2.8.0.tgz?cache=0&sync_timestamp=1630106535879&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fdomutils%2Fdownload%2Fdomutils-2.8.0.tgz",
"integrity": "sha1-RDfe9dtuLR9dbuhZvZXKfQIEgTU=",
"dev": true,
"requires": {
"dom-serializer": "^1.0.1",
"domelementtype": "^2.2.0",
"domhandler": "^4.2.0"
}
},
"dot-prop": { "dot-prop": {
"version": "5.3.0", "version": "5.3.0",
"resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.3.0.tgz?cache=0&sync_timestamp=1605778235569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.3.0.tgz", "resolved": "https://registry.npm.taobao.org/dot-prop/download/dot-prop-5.3.0.tgz?cache=0&sync_timestamp=1605778235569&other_urls=https%3A%2F%2Fregistry.npm.taobao.org%2Fdot-prop%2Fdownload%2Fdot-prop-5.3.0.tgz",
@ -1871,6 +1916,12 @@
"ansi-colors": "^4.1.1" "ansi-colors": "^4.1.1"
} }
}, },
"entities": {
"version": "3.0.1",
"resolved": "https://registry.nlark.com/entities/download/entities-3.0.1.tgz?cache=0&sync_timestamp=1628508126700&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fentities%2Fdownload%2Fentities-3.0.1.tgz",
"integrity": "sha1-K4h8piWF6W2zkDSC0zbBAGwwAdQ=",
"dev": true
},
"error-ex": { "error-ex": {
"version": "1.3.2", "version": "1.3.2",
"resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz", "resolved": "https://registry.npm.taobao.org/error-ex/download/error-ex-1.3.2.tgz",
@ -2163,6 +2214,15 @@
} }
} }
}, },
"eslint-plugin-html": {
"version": "6.2.0",
"resolved": "https://registry.nlark.com/eslint-plugin-html/download/eslint-plugin-html-6.2.0.tgz?cache=0&sync_timestamp=1632176597928&other_urls=https%3A%2F%2Fregistry.nlark.com%2Feslint-plugin-html%2Fdownload%2Feslint-plugin-html-6.2.0.tgz",
"integrity": "sha1-cVvAC1C70NmW4o+VPCiaXr7GnUM=",
"dev": true,
"requires": {
"htmlparser2": "^7.1.2"
}
},
"eslint-plugin-import": { "eslint-plugin-import": {
"version": "2.25.2", "version": "2.25.2",
"resolved": "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.25.2.tgz?cache=0&sync_timestamp=1634079318456&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-plugin-import%2Fdownload%2Feslint-plugin-import-2.25.2.tgz", "resolved": "https://registry.npmmirror.com/eslint-plugin-import/download/eslint-plugin-import-2.25.2.tgz?cache=0&sync_timestamp=1634079318456&other_urls=https%3A%2F%2Fregistry.npmmirror.com%2Feslint-plugin-import%2Fdownload%2Feslint-plugin-import-2.25.2.tgz",
@ -2845,6 +2905,18 @@
"lru-cache": "^6.0.0" "lru-cache": "^6.0.0"
} }
}, },
"htmlparser2": {
"version": "7.1.2",
"resolved": "https://registry.nlark.com/htmlparser2/download/htmlparser2-7.1.2.tgz?cache=0&sync_timestamp=1631386311915&other_urls=https%3A%2F%2Fregistry.nlark.com%2Fhtmlparser2%2Fdownload%2Fhtmlparser2-7.1.2.tgz",
"integrity": "sha1-WHkj048DvIngMHbgDLosdHPzf3w=",
"dev": true,
"requires": {
"domelementtype": "^2.0.1",
"domhandler": "^4.2.2",
"domutils": "^2.8.0",
"entities": "^3.0.1"
}
},
"human-signals": { "human-signals": {
"version": "2.1.0", "version": "2.1.0",
"resolved": "https://registry.nlark.com/human-signals/download/human-signals-2.1.0.tgz", "resolved": "https://registry.nlark.com/human-signals/download/human-signals-2.1.0.tgz",

3
package.json

@ -8,7 +8,7 @@
"cz": "git add . && git cz", "cz": "git add . && git cz",
"format": "prettier --write ./src", "format": "prettier --write ./src",
"lint": "eslint ./src --ext .vue,.js,.ts", "lint": "eslint ./src --ext .vue,.js,.ts",
"lint-fix": "eslint --fix ./src --ext .vue,.js,.ts", "fix": "eslint --fix ./src --ext .vue,.js,.ts",
"prepare": "husky install" "prepare": "husky install"
}, },
"dependencies": { "dependencies": {
@ -31,6 +31,7 @@
"eslint": "^7.32.0", "eslint": "^7.32.0",
"eslint-config-airbnb-base": "^14.2.1", "eslint-config-airbnb-base": "^14.2.1",
"eslint-config-prettier": "^8.3.0", "eslint-config-prettier": "^8.3.0",
"eslint-plugin-html": "^6.2.0",
"eslint-plugin-import": "^2.25.2", "eslint-plugin-import": "^2.25.2",
"eslint-plugin-prettier": "^4.0.0", "eslint-plugin-prettier": "^4.0.0",
"eslint-plugin-vue": "^7.19.1", "eslint-plugin-vue": "^7.19.1",

45
src/App.vue

@ -1,15 +1,20 @@
<script setup> <script setup>
import { computed } from 'vue'; import { computed, ref } from 'vue';
import { useStore } from 'vuex'; import { useStore } from 'vuex';
import { useRoute } from 'vue-router'; import { useRoute } from 'vue-router';
import Navbar from 'components/navbar.vue'; import Navbar from 'components/navbar.vue';
import zhCn from 'element-plus/lib/locale/lang/zh-cn'; import zhCn from 'element-plus/lib/locale/lang/zh-cn';
import { ElMessage } from 'element-plus'; import { ElMessage } from 'element-plus';
import { routes } from '@/routers/index.js';
const local = zhCn; const local = zhCn;
const store = useStore(); const store = useStore();
let timer = null; let timer = null;
const routeList = ref(routes);
const menu = computed(() => store.state.menu);
// queryu token // queryu token
const validateQuery = async () => { const validateQuery = async () => {
const route = useRoute(); const route = useRoute();
@ -44,14 +49,44 @@ getDeviceData();
<template> <template>
<el-config-provider :locale="local"> <el-config-provider :locale="local">
<Navbar /> <el-container>
<div class="p-4"> <el-header style="padding: 0">
<router-view></router-view> <Navbar />
</div> </el-header>
<el-container>
<!-- <el-aside width="180px" v-if="menu.show"> -->
<el-aside :width="!menu.collapse ? '180px' : '64px'" v-if="menu.show">
<el-menu :default-active="0" class="el-menu-vertical-demo" :collapse="menu.collapse">
<el-menu-item :index="index" v-for="(item, index) in routeList" :key="item.name">
<i :class="item.meta.icon"></i>
<template #title>
<router-link :to="item.path">{{ item.meta.title }}</router-link>
</template>
</el-menu-item>
</el-menu>
</el-aside>
<el-main style="padding: 0">
<div class="p-4">
<router-view></router-view>
</div>
</el-main>
</el-container>
</el-container>
</el-config-provider> </el-config-provider>
</template> </template>
<style> <style>
html,
body,
#app,
#app > section {
height: 100%;
}
.el-menu {
min-height: 100%;
}
.el-form--label-top .el-form-item__label { .el-form--label-top .el-form-item__label {
padding-bottom: 0 !important; padding-bottom: 0 !important;
} }

3
src/apis/index.js

@ -13,6 +13,9 @@ export const getDevices = () => http.get(`${corrosion}/devices`);
// 获取设备列表 完整信息 // 获取设备列表 完整信息
export const getDevicesAll = () => http.get(`${corrosion}/devices/all`); export const getDevicesAll = () => http.get(`${corrosion}/devices/all`);
// 查历史数据
export const getHistories = params => http.get(`${corrosion}/histories`, { params });
// 获取月累计数据分析 // 获取月累计数据分析
export const getMonthesDate = params => http.get(`${corrosion}/statistics/monthes`, { params }); export const getMonthesDate = params => http.get(`${corrosion}/statistics/monthes`, { params });

12
src/components/device-edit.vue

@ -1,19 +1,13 @@
<template> <template>
<el-dialog v-model="show" title="编辑设备信息" width="80%" :before-close="handleClose"> <el-dialog v-model="show" title="编辑设备信息" fullscreen="true" @close="$emit('toggle-mdoal')">
<span>This is a message</span> <DeviceEdit v-if="show" :edit="true" @cancel="$emit('toggle-mdoal')" />
<template #footer>
<span class="dialog-footer">
<el-button @click="$emit('toggle-mdoal')">Cancel</el-button>
<el-button type="primary" @click="$emit('toggle-mdoal')">Confirm</el-button>
</span>
</template>
</el-dialog> </el-dialog>
</template> </template>
<script setup> <script setup>
import { defineProps, defineEmits } from 'vue'; import { defineProps, defineEmits } from 'vue';
import DeviceEdit from 'views/device-edit.vue';
defineProps({ show: Boolean }); defineProps({ show: Boolean });
defineEmits(['toggle-mdoal']); defineEmits(['toggle-mdoal']);
</script> </script>

22
src/components/navbar.vue

@ -1,3 +1,23 @@
<script setup>
import { computed } from 'vue';
import { useStore } from 'vuex';
const store = useStore();
const toggleCollapse = () => {
console.log('Toggle Collapse');
store.commit('toggleCollapse');
};
const menu = computed(() => store.state.menu);
</script>
<template> <template>
<h1 class="text-lg font-medium py-3 px-6 shadow">{{ $route.meta.title || '智能大气腐蚀检测平台' }}</h1> <h1 class="text-lg font-medium py-3 px-6 shadow">
<i
class="el-icon-guide mr-2"
:class="{ 'text-gray-800': !menu.collapse, 'text-gray-400': menu.collapse }"
@click="toggleCollapse"
v-if="menu.show"
></i>
{{ $route.meta.title || '智能大气腐蚀检测平台' }}
</h1>
</template> </template>

59
src/components/search-bar-data.vue

@ -0,0 +1,59 @@
<template>
<el-form :inline="true" :model="searchDevice" ref="searchDeviceForm">
<el-form-item label="选择站点">
<el-select v-model="searchDevice.deviceId" placeholder="请选择站点">
<el-option label="全部" value></el-option>
<el-option :label="item.address" :value="item.deviceId" v-for="item in devices" :key="item.deviceId"></el-option>
</el-select>
</el-form-item>
<el-form-item label="选择日期">
<el-date-picker
v-model="searchDevice.date"
type="daterange"
range-separator="-"
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="onSubmit">查询</el-button>
</el-form-item>
</el-form>
</template>
<script setup>
import { reactive, ref, computed, defineEmits } from 'vue';
import { useStore } from 'vuex';
const emit = defineEmits(['search']);
const searchDevice = reactive({ deviceId: '', date: '' });
const searchDeviceForm = ref(null); // form
const store = useStore();
const devices = computed(() => store.state.device.devices);
/**
* 格式化日期
* @param {Date} date 选择的日期
*/
const formatDate = date => {
const year = date.getFullYear();
const month = date.getMonth() + 1;
const day = date.getDate();
return `${year}-${month}-${day}`;
};
//
const onSubmit = () => {
searchDeviceForm.value.validate(() => {
const { deviceId, date } = searchDevice;
if (date) {
const daterange = [formatDate(date[0]), formatDate(date[1])];
emit('search', { deviceId, date: daterange });
} else {
emit('search', { deviceId, date });
}
});
};
</script>

23
src/routers/index.js

@ -2,36 +2,35 @@ import { createRouter, createWebHistory } from 'vue-router';
// 还有 createWebHashHistory 和 createMemoryHistory // 还有 createWebHashHistory 和 createMemoryHistory
export const routes = [ export const routes = [
{ path: '/', redirect: '/test' },
{ {
path: '/network-config', path: '/network-config',
name: 'network-config', name: 'network-config',
meta: { title: '网络参数配置' }, meta: { title: '网络参数配置', icon: 'el-icon-setting' },
component: () => import('@/views/network-config.vue'), component: () => import('@/views/network-config.vue'),
}, },
{ {
path: '/function-config', path: '/function-config',
name: 'function-config', name: 'function-config',
meta: { title: '功能参数配置' }, meta: { title: '功能参数配置', icon: 'el-icon-set-up' },
component: () => import('@/views/function-config.vue'), component: () => import('@/views/function-config.vue'),
}, },
{ {
path: '/device-create', path: '/device-create',
name: 'device-create', name: 'device-create',
meta: { title: '设备添加' }, meta: { title: '设备添加', icon: 'el-icon-plus' },
component: () => import('@/views/device-create.vue'), component: () => import('@/views/device-create.vue'),
}, },
{ {
path: '/devices', path: '/devices',
name: 'devices', name: 'devices',
meta: { title: '设备管理' }, meta: { title: '设备管理', icon: 'el-icon-box' },
component: () => import('@/views/device-list.vue'), component: () => import('@/views/device-list.vue'),
}, },
{ {
path: '/monthes', path: '/data-history',
name: 'monthes', name: 'data-history',
meta: { title: '月累计数据分析' }, meta: { title: '历史数据查看', icon: 'el-icon-data-line' },
component: () => import('@/views/month-data.vue'), component: () => import('@/views/data-history.vue'),
}, },
{ {
path: '/statistical-realtime', path: '/statistical-realtime',
@ -45,6 +44,12 @@ export const routes = [
meta: { title: '历史数据统计' }, meta: { title: '历史数据统计' },
component: () => import('@/views/statistical-history.vue'), component: () => import('@/views/statistical-history.vue'),
}, },
{
path: '/months',
name: 'months',
meta: { title: '月累计数据分析', icon: 'el-icon-data-analysis' },
component: () => import('@/views/month-data.vue'),
},
{ {
path: '/test', path: '/test',
name: 'test', name: 'test',

27
src/store/device.js

@ -4,11 +4,21 @@ const user = {
namespaced: true, namespaced: true,
state: { state: {
devices: [], devices: [], // 站点列表 设备列表简版
devicesAll: null, devicesAll: null, // 设备列表完整版
currentDeviceId: '', // 当前正在编辑的设备deviceId
}, },
getters: {}, getters: {
// 当前正在编辑的设备的完整信息
current({ devicesAll, currentDeviceId }) {
try {
return devicesAll.data.find(device => device.deviceId === currentDeviceId);
} catch (error) {
return null;
}
},
},
mutations: { mutations: {
/** /**
@ -23,11 +33,20 @@ const user = {
/** /**
* 设置devicesAll的数据 * 设置devicesAll的数据
* @param {*} state * @param {*} state
* @param {*} devices * @param {array} devices
*/ */
setDevicesAll(state, devices) { setDevicesAll(state, devices) {
state.devicesAll = devices; state.devicesAll = devices;
}, },
/**
* 设置正则编辑的设备deviceId
* @param {*} state
* @param {string} deviceId
*/
setCurrentDeviceId(state, deviceId) {
state.currentDeviceId = deviceId;
},
}, },
actions: { actions: {

11
src/store/index.js

@ -1,12 +1,17 @@
import { createStore } from 'vuex'; import { createStore } from 'vuex';
import device from './device'; import device from './device';
import user from './user';
import statistics from './statistics'; import statistics from './statistics';
import user from './user';
export default createStore({ export default createStore({
modules: { user, device, statistics }, modules: { user, device, statistics },
state: {}, state: { menu: { show: true, collapse: false } },
getters: {}, getters: {},
mutations: {}, mutations: {
toggleCollapse(state) {
console.log('1');
state.menu.collapse = !state.menu.collapse;
},
},
actions: {}, actions: {},
}); });

122
src/views/data-history.vue

@ -0,0 +1,122 @@
<script setup>
import { computed, onMounted, ref } from 'vue';
import { useStore } from 'vuex';
import SearchBar from 'components/search-bar-data.vue';
import { getHistories } from 'apis/index';
const search = ref({});
const page = ref({ page: 2, size: 10 });
let timer = null;
const store = useStore();
const token = computed(() => store.getters['user/token']);
let contentHeight = 600;
const data = ref(null);
//
const getData = async () => {
try {
if (token) {
const params = { search: { ...search.value }, page: { page: page.value.page, size: page.value.size } };
console.log('params: ', params);
const resData = await getHistories(params);
data.value = resData.data;
page.value = resData.page;
timer && clearTimeout(timer);
timer = null;
} else {
timer = setTimeout(() => {
getData();
}, 20);
}
} catch (error) {
console.log('error: ', error);
}
};
getData();
//
onMounted(() => {
const winHeight = document.documentElement.clientHeight;
contentHeight = winHeight - 150;
});
/**
* 监听search信息
* @param {object} payload search组件emit的数据
*/
const onSearch = payload => {
search.value = { ...payload };
getData();
};
/**
* 当前页码变化
* 更新page 重新获取数据
* @param {number} e 当前的页码
*/
const onCurrentPageChange = e => {
page.value.page = e;
getData();
};
const onSizeChange = e => {
page.value.size = e;
getData();
};
//
const onNext = e => {
page.value.page = e + 1;
getData();
};
//
const onPrev = e => {
page.value.page = e - 1;
getData();
};
</script>
<template>
<SearchBar @search="onSearch" />
<template v-if="data">
<el-table :data="data" style="width: 100%" border stripe :style="{ 'max-height': contentHeight + 'px' }">
<el-table-column label="设备编号" fixed prop="deviceNo" width="140" />
<el-table-column label="ICCID" fixed prop="ICCID" width="100" />
<el-table-column label="IMEI" fixed prop="IMEI" width="80" />
<el-table-column label="信号强度" prop="signal" width="80" />
<el-table-column label="基站编号" prop="stationNo" width="80" />
<el-table-column label="版本号" prop="version" width="80" />
<el-table-column label="太阳能电压" prop="solarVoltage" width="94" />
<el-table-column label="蓄电池电压" prop="batteryVoltage" width="94" />
<el-table-column label="机箱温度" prop="deviceTemperature" width="80" />
<el-table-column label="机箱湿度" prop="deviceHumidity" width="80" />
<el-table-column label="环境温度" prop="environmentTemperature" width="80" />
<el-table-column label="环境湿度" prop="environmentHumidity" width="80" />
<el-table-column label="SO2" prop="so2" width="50" />
<el-table-column label="盐分" prop="salt" width="50" />
<el-table-column label="腐流1" prop="corrosion1" width="60" />
<el-table-column label="腐流2" prop="corrosion2" width="60" />
<el-table-column label="腐流3" prop="corrosion3" width="60" />
<el-table-column label="腐流4" prop="corrosion4" width="60" />
</el-table>
<el-pagination
background
:current-page="page.page"
:page-size="page.size"
:default-page-size="10"
:page-count="page.count"
layout="total, sizes, prev, pager, next, jumper"
:page-sizes="[1, 10, 20, 50, 100]"
class="my-3 float-right"
:total="page.total"
@current-change="onCurrentPageChange"
@size-change="onSizeChange"
@prev-click="onPrev"
@next-click="onNext"
></el-pagination>
</template>
</template>

181
src/views/device-edit.vue

@ -0,0 +1,181 @@
<template>
<el-form label-position="top" :model="data" ref="deviceEdit">
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="设备ID号" prop="deviceId">
<el-input v-model="data.deviceId" disabled></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="设备完整ID" prop="deviceFullId">
<el-input v-model="data.deviceFullId"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="地区" prop="area">
<el-input v-model="data.area"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="安装地点名称" prop="address">
<el-input v-model="data.address"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="联系人" prop="contact">
<el-input v-model="data.contact"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="电话" prop="phone">
<el-input v-model="data.phone"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="经度" prop="lon">
<el-input v-model="data.lon"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="纬度" prop="lat">
<el-input v-model="data.lat"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="负责人" prop="head">
<el-input v-model="data.head"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="安装位置" prop="installLocation">
<el-input v-model="data.installLocation"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="安装时间" prop="installTime">
<el-input v-model="data.installTime"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="正式运行时间" prop="runTime">
<el-input v-model="data.runTime"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="链路地址" prop="linkAddress">
<el-input v-model="data.linkAddress"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="探头编号" prop="probNo">
<el-input v-model="data.probNo"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="试样" prop="simple">
<el-input v-model="data.simple"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="sim卡1" prop="sim1">
<el-input v-model="data.sim1"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="设备朝向" prop="deviceDirection">
<el-input v-model="data.deviceDirection"></el-input>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="与主站后台联调情况" prop="joint">
<el-input v-model="data.joint"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :span="12">
<el-form-item label="备注" prop="remark">
<el-input v-model="data.remark" type="textarea"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row :gutter="20" class="mt-5 pl-2">
<el-form-item>
<el-button type="primary" @click="onSubmit">提交</el-button>
<el-button @click="$emit('cancel')">取消</el-button>
</el-form-item>
</el-row>
</el-form>
</template>
<script setup>
import { reactive, ref, computed, watch } from 'vue';
import { useStore } from 'vuex';
let data = reactive({
deviceId: '', // id
deviceFullId: '', // id
deviceDirection: '', //
area: '', //
address: '', //
contact: '', //
phone: '', //
lon: '', //
lat: '', //
head: '', //
installLocation: '', //
installTime: '', //
runTime: '', //
linkAddress: '', //
probNo: '', //
simple: '', //
sim1: '', // sim1
joint: '', //
remark: '', //
});
const deviceEdit = ref(null); // form
const store = useStore();
const device = computed(() => store.getters['device/current']);
watch(
() => device,
newValue => {
data = newValue.value;
},
{ immediate: true, deep: true },
);
//
const onSubmit = () => {
deviceEdit.value.validate(valid => {
console.log(valid, { ...data });
});
};
</script>

14
src/views/device-list.vue

@ -2,7 +2,7 @@
<SearchBar /> <SearchBar />
<template v-if="devicesAll && devicesAll.data"> <template v-if="devicesAll && devicesAll.data">
<el-table :data="devicesAll.data" style="width: 100%" :style="{ 'max-height': contentHeight + 'px' }"> <el-table :data="devicesAll.data" style="width: 100%" border stripe :style="{ 'max-height': contentHeight + 'px' }">
<el-table-column type="expand"> <el-table-column type="expand">
<template #default="props"> <template #default="props">
<el-row :gutter="20" class="px-6 text-gray-400"> <el-row :gutter="20" class="px-6 text-gray-400">
@ -26,14 +26,14 @@
<el-table-column label="安装时间" prop="installTime" width="200" /> <el-table-column label="安装时间" prop="installTime" width="200" />
<el-table-column label="正式运行时间" prop="runTime" width="200" /> <el-table-column label="正式运行时间" prop="runTime" width="200" />
<el-table-column fixed="right" label="操作" width="148"> <el-table-column fixed="right" label="操作" width="148">
<template #default> <template #default="props">
<el-popconfirm title="确定要删除此设备吗?" @confirm="handleDelete"> <el-popconfirm title="确定要删除此设备吗?" @confirm="handleDelete">
<template #reference> <template #reference>
<el-button type="danger" plain size="mini">删除</el-button> <el-button type="danger" plain size="mini">删除</el-button>
</template> </template>
</el-popconfirm> </el-popconfirm>
<el-button type="primary" plain size="mini" @click="editting = true">编辑</el-button> <el-button type="primary" plain size="mini" @click="handleEdit(props.row)">编辑</el-button>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
@ -43,7 +43,7 @@
:current-page="devicesAll.page.page" :current-page="devicesAll.page.page"
:page-size="devicesAll.page.size" :page-size="devicesAll.page.size"
:default-page-size="10" :default-page-size="10"
:page-count="devicesAll.page.total" :page-count="devicesAll.page.count"
class="my-3 float-right" class="my-3 float-right"
@size-change="onSizeChange" @size-change="onSizeChange"
@current-change="onCurrentPageChange" @current-change="onCurrentPageChange"
@ -114,4 +114,10 @@ const onPrev = e => {
const handleDelete = () => { const handleDelete = () => {
console.log('delete'); console.log('delete');
}; };
//
const handleEdit = item => {
store.commit('device/setCurrentDeviceId', item.deviceId);
editting.value = true;
};
</script> </script>

2
src/views/test.vue

@ -5,7 +5,7 @@
<span>测试</span> <span>测试</span>
</div> </div>
</template> </template>
<div class="text item" v-for="item in routeList" :key="item"> <div class="text item" v-for="item in routeList" :key="item.name">
<router-link :to="item.path"> <router-link :to="item.path">
<el-button type="text">{{ item.name }}</el-button> <el-button type="text">{{ item.name }}</el-button>
</router-link> </router-link>

Loading…
Cancel
Save