Compare commits

..

11 Commits

Author SHA1 Message Date
王熙朝 ddcda5494c fase()指标预警,滑窗结果 2024-06-29 10:55:35 +08:00
王熙朝 d72c65b2a0 fase()指标预警,滑窗规则 2024-06-28 16:03:36 +08:00
王熙朝 891152c5fc fase()指标预警,报文添加 2024-06-26 21:43:20 +08:00
王熙朝 cf58cb0dc3 fase()故障,电子围栏优化 2024-06-23 22:35:23 +08:00
王熙朝 e5ca476f0f fase()实时轨迹 2024-06-23 10:44:43 +08:00
王熙朝 87e9200466 fase()实时轨迹 2024-06-19 22:30:54 +08:00
王熙朝 dbf878c819 fase()实时数据 2024-06-18 20:54:09 +08:00
王熙朝 f1fe1a348a fase()坐标获取 2024-06-03 20:53:07 +08:00
王熙朝 73fd29b308 fase()坐标 2024-06-02 22:46:26 +08:00
王熙朝 1e6509846d fase()新建地图 2024-06-01 20:07:21 +08:00
王熙朝 97acceb830 fase()新建 2024-05-30 22:45:48 +08:00
28 changed files with 2483 additions and 3086 deletions

View File

@ -36,11 +36,12 @@
"url": "https://gitee.com/y_project/MuYu-Cloud.git"
},
"dependencies": {
"@amap/amap-jsapi-loader": "^1.0.1",
"@riophae/vue-treeselect": "0.4.0",
"axios": "0.24.0",
"chart.js": "^4.4.3",
"clipboard": "2.0.8",
"core-js": "3.25.3",
"echarts": "5.4.0",
"element-ui": "2.15.13",
"file-saver": "2.0.5",
"fuse.js": "6.4.3",
@ -69,6 +70,7 @@
"chalk": "4.1.0",
"compression-webpack-plugin": "5.0.2",
"connect": "3.6.6",
"echarts": "^4.9.0",
"eslint": "7.15.0",
"eslint-plugin-vue": "7.2.0",
"lint-staged": "10.5.3",

View File

@ -7,6 +7,9 @@
<meta content="width=device-width, initial-scale=1, maximum-scale=1, user-scalable=no" name="viewport">
<link href="<%= BASE_URL %>favicon.ico" rel="icon">
<title><%= webpackConfig.name %></title>
<!-- <script src="https://webapi.amap.com/maps?v=2.0&key=0e95def81c998806b1a63910f7f51f3c&plugin=AMap.MouseTool"></script>-->
<script type="text/javascript" src="https://webapi.amap.com/maps?v=1.4.15&key=0e95def81c998806b1a63910f7f51f3c"></script>
<script src="https://a.amap.com/jsapi_demos/static/demo-center/js/demoutils.js"></script>
<!--[if lt IE 11]>
<script>window.location.href = '/html/ie.html';</script><![endif]-->
<style>

View File

@ -0,0 +1,19 @@
import request from '@/utils/request'
// 查询测试信息列表
export function listBreakdown(query) {
return request({
url: '/rule/breakdown/list',
method: 'get',
params: query
})
}
export function pies(data) {
return request({
url: '/rule/breakdown/pies',
method: 'post',
data
})
}

View File

@ -0,0 +1,10 @@
import request from '@/utils/request'
// 查询企业列表
export function listEnterprise() {
return request({
url: '/rule/client/listEnterprise',
method: 'post'
})
}

View File

@ -0,0 +1,82 @@
import request from '@/utils/request'
// 查询车辆信息列表
export function listCar(query) {
return request({
url: '/rule/car/list',
method: 'get',
params: query
})
}
// 查询车辆信息详细
export function getCar(carId) {
return request({
url: '/rule/car/' + carId,
method: 'get'
})
}
// 查询车辆信息详细
export function query(carId) {
return request({
url: '/rule/car/query/' + carId,
method: 'post'
})
}
// 新增车辆信息
export function addCar(data) {
return request({
url: '/rule/car',
method: 'post',
data: data
})
}
// 修改车辆信息
export function updateCar(data) {
return request({
url: '/rule/car',
method: 'put',
data: data
})
}
// 删除车辆信息
export function delCar(carId) {
return request({
url: '/rule/car/' + carId,
method: 'delete'
})
}
export function read() {
return request({
url: '/rule/car/read',
method: 'post'
})
}
export function open() {
return request({
// url: 'http://129.211.23.219:9100/manage/open/JAV0VJUJYOTOK9KSY/1',
url: 'rule/car/open',
method: 'post'
})
}
export function close() {
return request({
// url: 'http://129.211.23.219:9100/mange/close/JAV0VJUJYOTOK9KSY/1',
url: 'rule/car/close',
method: 'post'
})
}

View File

@ -0,0 +1,77 @@
import request from '@/utils/request'
// 查询企业列表
export function listEnterprise(query) {
return request({
url: '/goods/enterprise/list',
method: 'get',
params: query
})
}
export function lists(data) {
return request({
url: '/goods/enterprise/lists',
method: 'post',
data
})
}
// 查询企业详细
export function getEnterprise(id) {
return request({
url: '/goods/enterprise/' + id,
method: 'get'
})
}
// 新增企业
export function addEnterprise(data) {
return request({
url: '/goods/enterprise',
method: 'post',
data: data
})
}
// 修改企业
export function updateEnterprise(data) {
return request({
url: '/goods/enterprise',
method: 'put',
data: data
})
}
// 企业认证
export function authentication(id) {
return request({
url: '/goods/enterprise/authentication?id=' + id,
method: 'post'
})
}
// 删除企业
export function delEnterprise(id) {
return request({
url: '/goods/enterprise/enterprise/' + id,
method: 'delete'
})
}
export function sysUsers(data) {
return request({
url: '/goods/enterprise/sysUsers/',
method: 'post',
data
})
}
// 选择服务
export function getLevel(id,serviceLevel) {
return request({
url: '/goods/enterprise/getLevel?id=' + id + "&&serviceLevel=" + serviceLevel,
method: 'post'
})
}

View File

@ -0,0 +1,59 @@
import request from '@/utils/request'
// 查询围栏组列表
export function standard(data) {
return request({
url: '/rule/forewarn/standard',
method: 'post',
data
})
}
/**
* 新增报文
* @param data
* @returns {AxiosPromise}
*/
export function indexDataFormat(data,vin) {
return request({
url: '/rule/forewarn/indexDataFormat?vin=' + vin,
method: 'post',
data
})
}
/**
* 查询报文
* @param vin
* @returns {AxiosPromise}
*/
export function selectDataFormatById(vin) {
return request({
url: '/rule/forewarn/selectDataFormatById?vin=' + vin,
method: 'post'
})
}
//删除报文
export function deleteDataFormatById(vin) {
return request({
url: '/rule/forewarn/deleteDataFormatById/' + vin,
method: 'post'
})
}
// 指标预警
export function listWarningInfoById(vin) {
return request({
url: '/rule/forewarn/listWarningInfoById/' + vin,
method: 'post'
})
}

View File

@ -0,0 +1,70 @@
import request from '@/utils/request'
// 查询围栏组列表
export function selectFenceGroups(data) {
return request({
url: '/rule/map/selectFenceGroups',
method: 'post',
data
})
}
// 查询围栏列表
export function selectFence(data) {
return request({
url: '/rule/map/selectFence',
method: 'post',
data
})
}
// 查询车辆绑定围栏组及下属围栏
export function selectFenceGroupsById(carId) {
return request({
url: '/rule/map/selectFenceGroupsById/' + carId,
method: 'post'
})
}
// 将坐标传输给电子围栏
export function getSel(data) {
return request({
url: '/rule/map/getSel',
method: 'post',
data
})
}
//删除电子围栏
export function deleteFence(fenceId) {
return request({
url: '/rule/map/deleteFence/' + fenceId,
method: 'post'
})
}
//查看详情
export function queryFence(fenceId) {
return request({
url: '/rule/map/queryFence/' + fenceId,
method: 'post'
})
}
// 修改围栏状态
export function updateFence(fenceId) {
return request({
url: '/rule/map/updateFence/' + fenceId,
method: 'post'
})
}
export function dbx(data) {
return request({
url: 'https://tsapi.amap.com/v1/track/geofence/add/polygon',
method: 'post',
data
})
}

View File

@ -0,0 +1,82 @@
import request from '@/utils/request'
// 查询所属滑窗
export function selectDataSpecificationDev(vin) {
return request({
url: '/rule/forewarn/selectDataSpecificationDev?vin=' + vin,
method: 'post'
})
}
// 添加新滑动
export function indexDataSpecification(data,vin) {
return request({
url: '/rule/forewarn/indexDataSpecification?vin=' + vin,
method: 'post',
data
})
}
// 获取指定值
export function selectDataSpecificationById(id) {
return request({
url: '/rule/forewarn/selectDataSpecificationById/' + id,
method: 'post'
})
}
// 修改滑窗
export function updataDataSpecification(data) {
return request({
url: '/rule/forewarn/updataDataSpecification',
method: 'post',
data
})
}
// 删除滑窗
export function deleteDataSpecification(id) {
return request({
url: '/rule/forewarn/deleteDataSpecification?id=' + id,
method: 'post'
})
}
// 获取滑行长度
export function listLength(data) {
return request({
url: '/rule/forewarn/listLength',
method: 'post',
data
})
}
// 获取滑窗范围
export function listRadius(data) {
return request({
url: '/rule/forewarn/listRadius',
method: 'post',
data
})
}
// 获取相应的编码
export function listDateType(vin) {
return request({
url: '/rule/forewarn/listDateType?vin=' + vin,
method: 'post'
})
}
// 获取相应的编码
export function selectDateType(data) {
return request({
url: '/rule/forewarn/selectDateType',
method: 'post',
data
})
}

View File

@ -0,0 +1,11 @@
'use strict';(function(m,p){"object"===typeof exports&&"undefined"!==typeof module?module.exports=p():"function"===typeof define&&define.amd?define(p):(m=m||self,m.AMapLoader=p())})(this,function(){function m(a){var b=[];a.AMapUI&&b.push(p(a.AMapUI));a.Loca&&b.push(r(a.Loca));return Promise.all(b)}function p(a){return new Promise(function(h,c){var f=[];if(a.plugins)for(var e=0;e<a.plugins.length;e+=1)-1==d.AMapUI.plugins.indexOf(a.plugins[e])&&f.push(a.plugins[e]);if(g.AMapUI===b.failed)c("\u524d\u6b21\u8bf7\u6c42 AMapUI \u5931\u8d25");
else if(g.AMapUI===b.notload){g.AMapUI=b.loading;d.AMapUI.version=a.version||d.AMapUI.version;e=d.AMapUI.version;var l=document.body||document.head,k=document.createElement("script");k.type="text/javascript";k.src="https://webapi.amap.com/ui/"+e+"/main.js";k.onerror=function(a){g.AMapUI=b.failed;c("\u8bf7\u6c42 AMapUI \u5931\u8d25")};k.onload=function(){g.AMapUI=b.loaded;if(f.length)window.AMapUI.loadUI(f,function(){for(var a=0,b=f.length;a<b;a++){var c=f[a].split("/").slice(-1)[0];window.AMapUI[c]=
arguments[a]}for(h();n.AMapUI.length;)n.AMapUI.splice(0,1)[0]()});else for(h();n.AMapUI.length;)n.AMapUI.splice(0,1)[0]()};l.appendChild(k)}else g.AMapUI===b.loaded?a.version&&a.version!==d.AMapUI.version?c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c AMapUI \u6df7\u7528"):f.length?window.AMapUI.loadUI(f,function(){for(var a=0,b=f.length;a<b;a++){var c=f[a].split("/").slice(-1)[0];window.AMapUI[c]=arguments[a]}h()}):h():a.version&&a.version!==d.AMapUI.version?c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c AMapUI \u6df7\u7528"):
n.AMapUI.push(function(a){a?c(a):f.length?window.AMapUI.loadUI(f,function(){for(var a=0,b=f.length;a<b;a++){var c=f[a].split("/").slice(-1)[0];window.AMapUI[c]=arguments[a]}h()}):h()})})}function r(a){return new Promise(function(h,c){if(g.Loca===b.failed)c("\u524d\u6b21\u8bf7\u6c42 Loca \u5931\u8d25");else if(g.Loca===b.notload){g.Loca=b.loading;d.Loca.version=a.version||d.Loca.version;var f=d.Loca.version,e=d.AMap.version.startsWith("2"),l=f.startsWith("2");if(e&&!l||!e&&l)c("JSAPI \u4e0e Loca \u7248\u672c\u4e0d\u5bf9\u5e94\uff01\uff01");
else{e=d.key;l=document.body||document.head;var k=document.createElement("script");k.type="text/javascript";k.src="https://webapi.amap.com/loca?v="+f+"&key="+e;k.onerror=function(a){g.Loca=b.failed;c("\u8bf7\u6c42 AMapUI \u5931\u8d25")};k.onload=function(){g.Loca=b.loaded;for(h();n.Loca.length;)n.Loca.splice(0,1)[0]()};l.appendChild(k)}}else g.Loca===b.loaded?a.version&&a.version!==d.Loca.version?c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c Loca \u6df7\u7528"):h():a.version&&a.version!==d.Loca.version?
c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c Loca \u6df7\u7528"):n.Loca.push(function(a){a?c(a):c()})})}if(!window)throw Error("AMap JSAPI can only be used in Browser.");var b;(function(a){a.notload="notload";a.loading="loading";a.loaded="loaded";a.failed="failed"})(b||(b={}));var d={key:"",AMap:{version:"1.4.15",plugins:[]},AMapUI:{version:"1.1",plugins:[]},Loca:{version:"1.3.2"}},g={AMap:b.notload,AMapUI:b.notload,Loca:b.notload},n={AMap:[],AMapUI:[],Loca:[]},q=[],t=function(a){"function"==typeof a&&
(g.AMap===b.loaded?a(window.AMap):q.push(a))};return{load:function(a){return new Promise(function(h,c){if(g.AMap==b.failed)c("");else if(g.AMap==b.notload){var f=a.key,e=a.version,l=a.plugins;f?(window.AMap&&"lbs.amap.com"!==location.host&&c("\u7981\u6b62\u591a\u79cdAPI\u52a0\u8f7d\u65b9\u5f0f\u6df7\u7528"),d.key=f,d.AMap.version=e||d.AMap.version,d.AMap.plugins=l||d.AMap.plugins,g.AMap=b.loading,e=document.body||document.head,window.___onAPILoaded=function(d){delete window.___onAPILoaded;if(d)g.AMap=
b.failed,c(d);else for(g.AMap=b.loaded,m(a).then(function(){h(window.AMap)})["catch"](c);q.length;)q.splice(0,1)[0]()},l=document.createElement("script"),l.type="text/javascript",l.src="https://webapi.amap.com/maps?callback=___onAPILoaded&v="+d.AMap.version+"&key="+f+"&plugin="+d.AMap.plugins.join(","),l.onerror=function(a){g.AMap=b.failed;c(a)},e.appendChild(l)):c("\u8bf7\u586b\u5199key")}else if(g.AMap==b.loaded)if(a.key&&a.key!==d.key)c("\u591a\u4e2a\u4e0d\u4e00\u81f4\u7684 key");else if(a.version&&
a.version!==d.AMap.version)c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c JSAPI \u6df7\u7528");else{f=[];if(a.plugins)for(e=0;e<a.plugins.length;e+=1)-1==d.AMap.plugins.indexOf(a.plugins[e])&&f.push(a.plugins[e]);if(f.length)window.AMap.plugin(f,function(){m(a).then(function(){h(window.AMap)})["catch"](c)});else m(a).then(function(){h(window.AMap)})["catch"](c)}else if(a.key&&a.key!==d.key)c("\u591a\u4e2a\u4e0d\u4e00\u81f4\u7684 key");else if(a.version&&a.version!==d.AMap.version)c("\u4e0d\u5141\u8bb8\u591a\u4e2a\u7248\u672c JSAPI \u6df7\u7528");
else{var k=[];if(a.plugins)for(e=0;e<a.plugins.length;e+=1)-1==d.AMap.plugins.indexOf(a.plugins[e])&&k.push(a.plugins[e]);t(function(){if(k.length)window.AMap.plugin(k,function(){m(a).then(function(){h(window.AMap)})["catch"](c)});else m(a).then(function(){h(window.AMap)})["catch"](c)})}})},reset:function(){delete window.AMap;delete window.AMapUI;delete window.Loca;d={key:"",AMap:{version:"1.4.15",plugins:[]},AMapUI:{version:"1.1",plugins:[]},Loca:{version:"1.3.2"}};g={AMap:b.notload,AMapUI:b.notload,
Loca:b.notload};n={AMap:[],AMapUI:[],Loca:[]}}}})

View File

@ -73,32 +73,6 @@ export const constantRoutes = [
}
]
},
{
path: '/admin',
component: Layout,
redirect: 'index',
children: [
{
path: 'index',
component: () => import('@/views/goods/admin/index'),
name: '测试用户',
meta: {title: '测试用户', icon: 'form', affix: true}
}
]
},
{
path: '/source',
component: Layout,
redirect: 'index',
children: [
{
path: 'index',
component: () => import('@/views/assets/source/index.vue'),
name: '资产接入',
meta: {title: '资产接入', icon: 'form', affix: true}
}
]
},
// {
// path: '/access',
// component: Layout,

View File

@ -1,509 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="接入源名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入接入源名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据来源系统名称" prop="systemName">
<el-input
v-model="queryParams.systemName"
placeholder="请输入数据来源系统名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="主机地址" prop="host">
<el-input
v-model="queryParams.host"
placeholder="请输入主机地址"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="端口号" prop="port">
<el-input
v-model="queryParams.port"
placeholder="请输入端口号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据库名称" prop="databaseName">
<el-input
v-model="queryParams.databaseName"
placeholder="请输入数据库名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据连接参数" prop="connectionParam">
<el-input
v-model="queryParams.connectionParam"
placeholder="请输入数据连接参数"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:access:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:access:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:access:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:access:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="accessList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="接入源名称" align="center" prop="name" />
<el-table-column label="数据来源系统名称" align="center" prop="systemName" />
<el-table-column label="数据接入类型" align="center" prop="type" />
<el-table-column label="主机地址" align="center" prop="host" />
<el-table-column label="端口号" align="center" prop="port" />
<el-table-column label="数据库名称" align="center" prop="databaseName" />
<el-table-column label="数据连接参数" align="center" prop="connectionParam" />
<el-table-column label="介绍" align="center" prop="intor" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:access:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:access:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改数据接入对话框 -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-card>
<div clot="header" class="clearfix">
<span>基础信息</span>
</div>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="接入源名称" prop="name">
<el-input v-model="form.name" placeholder="请输入接入源名称" />
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="数据来源系统名称" prop="systemName">
<el-input v-model="form.systemName" placeholder="请输入数据来源系统名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="主机地址" prop="host">
<el-input v-model="form.host" placeholder="请输入主机地址" />
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="端口号" prop="port">
<el-input v-model="form.port" placeholder="请输入端口号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="数据库名称" prop="databaseName">
<el-input v-model="form.databaseName" placeholder="请输入数据库名称" />
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="数据接入类型" prop="type">
<el-select v-model="form.type">
<el-option v-for="item in types"
:key="item.value"
:label="item.lable"
:value="item.value">
</el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card>
<div slot="header" class="clearfix">
<span>数据连接参数</span>
</div>
<el-col :sm="24">
<el-form-item label="数据连接参数" prop="connectionParam">
<el-input v-model="form.connectionParam" placeholder="请输入数据连接参数" />
</el-form-item>
</el-col>
<el-row :gutter="10" style="margin: 10px 0">
<el-col :span="2">
<el-button type="primary" @click="addParam()"></el-button>
</el-col>
<el-col :span="2">
<el-button type="danger" @click="deleteParam(null)"></el-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :md="8" :xs="12" style="margin: 10px 0" v-for="(dataSourceParam, dataSourceParamIndex) in dataSourceParamList">
<el-col :span="10">
<el-input v-model="dataSourceParam.name" placeholder="请输入参数建" @keyup.native="processParam"></el-input>
</el-col>
<el-col :span="1"><span style="font-size: 28px; margin: 0 3px 0 0;">:</span></el-col>
<el-col :span="10">
<el-input v-model="dataSourceParam.val" placeholder="请输入参数值" @keyup.native="processParam"/>
</el-col>
<el-col :span="3">
<el-button type="danger" @click="deleteParam(dataSourceParamIndex)"></el-button>
</el-col>
</el-col>
</el-row>
</el-card>
<el-card>
<div clot="header" class="clearfix">
<span>线程池</span>
</div>
<el-row :gutter="10" style="margin: 10px 0">
<el-col :sm="24">
<el-form-item label="初始连接数量" prop="initNum">
<el-input v-model="form.initNum" placeholder="请输入初始连接数量" />
</el-form-item>
</el-col>
<el-col :sm="24">
<el-form-item label="最大连接数量" prop="maxNum">
<el-input v-model="form.maxNum" placeholder="请输入最大连接数量" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :sm="24">
<el-form-item label="最大等待时间" prop="maxWaitTime">
<el-input v-model="form.maxWaitTime" placeholder="请输入最大等待时间" />
</el-form-item>
</el-col>
<el-col :sm="24">
<el-form-item label="最大等待次数" prop="maxWaitSize">
<el-input v-model="form.maxWaitSize" placeholder="请输入最大等待次数" />
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card>
<div clot="header" class="clearfix">
<span>简介</span>
</div>
<el-form-item label="介绍" prop="intor">
<el-input v-model="form.intor" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-card>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listAccess, getAccess, delAccess, addAccess, updateAccess } from "@/api/system/access";
export default {
name: "Access",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
accessList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
name: null,
systemName: null,
type: null,
host: null,
port: null,
databaseName: null,
connectionParam: null,
initNum: null,
maxNum: null,
maxWaitTime: null,
maxWaitSize: null,
intor: null
},
//
form: {},
//
types: [{
value: 'MySql',
lable: 'MySql',
},{
value: 'Oracle',
lable: 'Oracle',
},],
rules: {
name: [
{ required: true, message: "接入源名称不能为空", trigger: "blur" }
],
systemName: [
{ required: true, message: "数据来源系统名称不能为空", trigger: "blur" }
],
type: [
{ required: true, message: "数据接入类型不能为空", trigger: "change" }
],
host: [
{ required: true, message: "主机地址不能为空", trigger: "blur" }
],
port: [
{ required: true, message: "端口号不能为空", trigger: "blur" }
],
databaseName: [
{ required: true, message: "数据库名称不能为空", trigger: "blur" }
],
connectionParam: [
{ required: true, message: "数据连接参数不能为空", trigger: "blur" }
],
initNum: [
{ required: true, message: "初始连接数量不能为空", trigger: "blur" }
],
maxNum: [
{ required: true, message: "最大连接数量不能为空", trigger: "blur" }
],
maxWaitTime: [
{ required: true, message: "最大等待时间不能为空", trigger: "blur" }
],
maxWaitSize: [
{ required: true, message: "最大等待次数不能为空", trigger: "blur" }
],
intor: [
{ required: true, message: "简介", trigger: "blur" }
],
},
dataSourceParamList: [
{
name: null,
val: null
}
]
};
},
created() {
this.getList();
},
methods: {
//
addParam(){
this.dataSourceParamList.push({
name: null,
val: null
})
},
//
deleteParam(index){
if (index != null){
this.dataSourceParamList.splice(index, 1);
}else {
this.dataSourceParamList = []
}
this.processParam();
},
//
processParam(){
this.form.connectionParam = this.dataSourceParamList
.filter(item => item.name != null || item.val != null)
.map(item => {
return item.name + "=" + item.val;
}).join("&")
console.log(this.form.connectionParam)
},
/** 查询数据接入列表 */
getList() {
this.loading = true;
listAccess(this.queryParams).then(response => {
this.accessList = response.data.rows;
this.total = response.data.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
name: null,
systemName: null,
type: null,
host: null,
port: null,
databaseName: null,
connectionParam: null,
initNum: null,
maxNum: null,
maxWaitTime: null,
maxWaitSize: null,
intor: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加数据接入";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getAccess(id).then(response => {
this.form = response.data;
this.dataSourceParamList = [];
this.form.connectionParam.split("&").forEach(res => {
let arr = res.split("=");
this.dataSourceParamList.push({
name: arr[0],
val: arr[1]
})
})
this.open = true;
this.title = "修改数据接入";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateAccess(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addAccess(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除数据接入编号为"' + ids + '"的数据项?').then(function() {
return delAccess(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('system/access/export', {
...this.queryParams
}, `access_${new Date().getTime()}.xlsx`)
}
}
};
</script>

View File

@ -1,461 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="链接名" prop="dataSourceName">
<el-input
v-model="queryParams.dataSourceName"
placeholder="请输入链接名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据库来源系统名称" prop="dataSourceSystemName">
<el-input
v-model="queryParams.dataSourceSystemName"
placeholder="请输入数据库来源系统名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="ip地址" prop="ip">
<el-input
v-model="queryParams.ip"
placeholder="请输入ip地址"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="端口号" prop="port">
<el-input
v-model="queryParams.port"
placeholder="请输入端口号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:source:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:source:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:source:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:source:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="sourceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="编号" align="center" prop="id" />
<el-table-column label="链接名" align="center" prop="dataSourceName" />
<el-table-column label="数据库来源系统名称" align="center" prop="dataSourceSystemName" />
<el-table-column label="数据库类型" align="center" prop="databaseType" />
<el-table-column label="ip地址" align="center" prop="ip" />
<el-table-column label="端口号" align="center" prop="port" />
<el-table-column label="用户名" align="center" prop="username" />
<el-table-column label="密码" align="center" prop="password" />
<el-table-column label="类型 '查询'/'存储'" align="center" prop="type" />
<el-table-column label="拼接的连接参数" align="center" prop="createBy" />
<el-table-column label="拼接的连接配置" align="center" prop="updateBy" />
<el-table-column label="状态 'Y'/'N'" align="center" prop="status" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:source:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:source:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改获取信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-card>
<div clot="header" class="clearfix">
<span>基础信息</span>
</div>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="链接名" prop="dataSourceName">
<el-input v-model="form.dataSourceName" placeholder="请输入链接名" />
</el-form-item>
<el-form-item label="数据库来源系统名称" prop="dataSourceSystemName">
<el-input v-model="form.dataSourceSystemName" placeholder="请输入数据库来源系统名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="数据库类型" prop="dataSourceSystemName">
<el-select v-model="form.databaseType" clearable placeholder="请选择">
<el-option key="1" label="mysql" value="1"></el-option>
<el-option key="2" label="redis" value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="ip地址" prop="ip">
<el-input v-model="form.ip" placeholder="请输入ip地址" />
</el-form-item>
<el-form-item label="端口号" prop="port">
<el-input v-model="form.port" placeholder="请输入端口号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="用户名" prop="username">
<el-input v-model="form.username" placeholder="请输入用户名" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form.password" placeholder="请输入密码" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="类型" prop="connectionParameter">
<el-select v-model="form.type" clearable placeholder="请选择">
<el-option key="查询" label="查询" value="查询"></el-option>
<el-option key="存储" label="存储" value="存储"></el-option>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="connectionConfig">
<el-radio v-model="form.status" label="Y">Y</el-radio>
<el-radio v-model="form.status" label="N">N</el-radio>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card>
<div slot="header" class="clearfix">
<span>数据连接参数</span>
</div>
<el-col :sm="24">
<el-form-item label="数据连接参数" prop="connectionParam">
<el-input v-model="form.createBy" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-row :gutter="10" style="margin: 10px 0">
<el-col :span="2">
<el-button type="primary" @click="addParam()"></el-button>
</el-col>
<el-col :span="2">
<el-button type="danger" @click="deleteParam(null)"></el-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :md="8" :xs="12" style="margin: 10px 0" v-for="(dataSourceParam, dataSourceParamIndex) in dataSourceParamList">
<el-col :span="10">
<el-input v-model="dataSourceParam.name" placeholder="请输入参数键" @keyup.native="processParam"/>
</el-col>
<el-col :span="1"><span style="font-size: 28px; margin: 0 3px 0 0;">:</span></el-col>
<el-col :span="10">
<el-input v-model="dataSourceParam.val" placeholder="请输入参数值" @keyup.native="processParam"/>
</el-col>
<el-col :span="3">
<el-button type="danger" @click="deleteParam(dataSourceParamIndex)"></el-button>
</el-col>
</el-col>
</el-row>
</el-card>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listSource, getSource, delSource, addSource, updateSource } from "@/api/system/source";
export default {
name: "Source",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
sourceList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
dataSourceName: null,
dataSourceSystemName: null,
databaseType: null,
ip: null,
port: null,
username: null,
password: null,
type: null,
connectionParameter: null,
connectionConfig: null,
status: null,
},
//
form: {},
//
rules: {
dataSourceName: [
{ required: true, message: "链接名不能为空", trigger: "blur" }
],
dataSourceSystemName: [
{ required: true, message: "数据库来源系统名称不能为空", trigger: "blur" }
],
databaseType: [
{ required: true, message: "数据库类型不能为空", trigger: "change" }
],
ip: [
{ required: true, message: "ip地址不能为空", trigger: "blur" }
],
port: [
{ required: true, message: "端口号不能为空", trigger: "blur" }
],
username: [
{ required: true, message: "用户名不能为空", trigger: "blur" }
],
password: [
{ required: true, message: "密码不能为空", trigger: "blur" }
],
type: [
{ required: true, message: "类型 '查询'/'存储'不能为空", trigger: "change" }
],
status: [
{ required: true, message: "状态 'Y'/'N'不能为空", trigger: "change" }
],
createBy: [
{ required: true, message: "连接数据参数不能为空", trigger: "change" }
]
},
//
dataSourceParamList: [
{
name: null,
val: null
}
]
};
},
created() {
this.getList();
},
methods: {
//
addParam(){
this.dataSourceParamList.push({
name: null,
val: null
})
},
//
deleteParam(index){
if (index != null){
this.dataSourceParamList.splice(index, 1);
}else {
this.dataSourceParamList = []
}
this.processParam();
},
//
processParam(){
this.form.createBy = this.dataSourceParamList
.filter(item => item.name != null || item.val != null)
.map(item => {
return item.name + "=" + item.val;
}).join("&")
console.log(this.form.connectionParam)
},
/** 查询获取信息列表 */
getList() {
this.loading = true;
listSource(this.queryParams).then(response => {
this.sourceList = response.data.rows;
this.total = response.data.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
dataSourceName: null,
dataSourceSystemName: null,
databaseType: null,
ip: null,
port: null,
username: null,
password: null,
type: null,
connectionParameter: null,
connectionConfig: null,
status: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加获取信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getSource(id).then(response => {
this.form = response.data;
this.dataSourceParamList = [];
this.form.createBy.split("&").forEach(param => {
let paramArr = param.split("=");
this.dataSourceParamList.push({
name: paramArr[0],
val: paramArr[1]
})
})
this.open = true;
this.title = "修改获取信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateSource(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addSource(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除获取信息编号为"' + ids + '"的数据项?').then(function() {
return delSource(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('system/source/export', {
...this.queryParams
}, `source_${new Date().getTime()}.xlsx`)
}
}
};
</script>

View File

@ -1,465 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="130px">
<el-form-item label="接入源名称" prop="name">
<el-input
v-model="queryParams.name"
placeholder="请输入接入源名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据来源系统名称" prop="systemName">
<el-input
v-model="queryParams.systemName"
placeholder="请输入数据来源系统名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据库名称" prop="databaseName">
<el-input
v-model="queryParams.databaseName"
placeholder="请输入数据库名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:access:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:access:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:access:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="accessList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="接入源名称" align="center" prop="name" />
<el-table-column label="数据来源系统名称" align="center" prop="systemName" />
<el-table-column label="主机地址" align="center" prop="host" />
<el-table-column label="主机地址" align="center" prop="port" />
<el-table-column label="数据接入类型" align="center" prop="type" />
<el-table-column label="数据库名称" align="center" prop="databaseName" />
<el-table-column label="备注" align="center" prop="remark" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:access:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:access:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改数据接入对话框 -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="140px">
<el-card>
<div slot="header" class="clearfix">
<span>基础配置信息</span>
</div>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="接入源名称" prop="name">
<el-input v-model="form.name" placeholder="请输入接入源名称" />
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="数据来源系统名称" prop="systemName">
<el-input v-model="form.systemName" placeholder="请输入数据来源系统名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="主机地址" prop="host">
<el-input v-model="form.host" placeholder="请输入主机地址" />
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="主机地址" prop="port">
<el-input v-model="form.port" placeholder="请输入主机地址" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="数据接入类型" prop="type">
<el-select style="width: 100%" v-model="form.type">
<el-option label="MySql" value="MySql">MySql</el-option>
<el-option label="Oracle" value="Oracle">Oracle</el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="数据库名称" prop="databaseName">
<el-input v-model="form.databaseName" placeholder="请输入数据库名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-card>
<div slot="header" class="clearfix">
<span>数据连接参数</span>
</div>
<el-col :sm="24">
<el-form-item label="数据连接参数" prop="connectionParam">
<el-input v-model="form.connectionParam" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-row :gutter="10" style="margin: 10px 0">
<el-col :span="2">
<el-button type="primary" @click="addParam()"></el-button>
</el-col>
<el-col :span="2">
<el-button type="danger" @click="deleteParam(null)"></el-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :md="8" :xs="12" style="margin: 10px 0" v-for="(dataSourceParam, dataSourceParamIndex) in dataSourceParamList">
<el-col :span="10">
<el-input v-model="dataSourceParam.name" placeholder="请输入参数键" @keyup.native="processParam"/>
</el-col>
<el-col :span="1"><span style="font-size: 28px; margin: 0 3px 0 0;">:</span></el-col>
<el-col :span="10">
<el-input v-model="dataSourceParam.val" placeholder="请输入参数值" @keyup.native="processParam"/>
</el-col>
<el-col :span="3">
<el-button type="danger" @click="deleteParam(dataSourceParamIndex)"></el-button>
</el-col>
</el-col>
</el-row>
</el-card>
</el-row>
</el-card>
<el-card style="margin-top: 20px">
<div slot="header" class="clearfix">
<span>连接池配置</span>
</div>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="初始连接数量" prop="initNum">
<el-input v-model="form.initNum" placeholder="请输入初始连接数量" />
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="最大连接数量" prop="maxNum">
<el-input v-model="form.maxNum" placeholder="请输入最大连接数量" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="最大等待时间" prop="maxWaitTime">
<el-input v-model="form.maxWaitTime" placeholder="请输入最大等待时间" />
</el-form-item>
</el-col>
<el-col :md="12" :sm="24">
<el-form-item label="最大等待次数" prop="maxWaitSize">
<el-input v-model="form.maxWaitSize" placeholder="请输入最大等待次数" />
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card style="margin-top: 20px">
<div slot="header" class="clearfix">
<span>其他信息</span>
</div>
<el-form-item label="备注" prop="remark">
<el-input v-model="form.remark" type="textarea" placeholder="请输入内容" />
</el-form-item>
</el-card>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
export default {
name: "Access",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
accessList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
name: null,
systemName: null,
databaseName: null
},
//
form: {},
//
rules: {
name: [
{required: true, message: "接入源名称不能为空", trigger: "blur"}
],
systemName: [
{required: true, message: "数据来源系统名称不能为空", trigger: "blur"}
],
type: [
{required: true, message: "数据接入类型不能为空", trigger: "blur"}
],
host: [
{required: true, message: "主机地址不能为空", trigger: "blur"}
],
port: [
{required: true, message: "主机地址不能为空", trigger: "blur"}
],
databaseName: [
{required: true, message: "数据库名称不能为空", trigger: "blur"}
],
connectionParam: [
{required: true, message: "数据连接参数不能为空", trigger: "blur"}
],
initNum: [
{required: true, message: "初始连接数量不能为空", trigger: "blur"}
],
maxNum: [
{required: true, message: "最大连接数量不能为空", trigger: "blur"}
],
maxWaitTime: [
{required: true, message: "最大等待时间不能为空", trigger: "blur"}
],
maxWaitSize: [
{required: true, message: "最大等待次数不能为空", trigger: "blur"}
]
},
//
dataSourceParamList: [
{
name: null,
val: null
}
]
};
},
created() {
this.getList();
},
methods: {
//
addParam(){
this.dataSourceParamList.push({
name: null,
val: null
})
},
//
deleteParam(index){
if (index != null){
this.dataSourceParamList.splice(index, 1);
}else {
this.dataSourceParamList = []
}
this.processParam();
},
//
processParam(){
this.form.connectionParam = this.dataSourceParamList
.filter(item => item.name != null || item.val != null)
.map(item => {
return item.name + "=" + item.val;
}).join("&")
console.log(this.form.connectionParam)
},
/** 查询数据接入列表 */
getList() {
this.loading = true;
let response = {
"code": 200,
"msg": "查询成功",
"data": {
"total": 1,
"rows": [
{
id: null,
name: "测试",
type: "MySql",
systemName: "云计算业务系统",
host: "125.36.25.36",
port: 6536,
databaseName: "yunjisuan-server",
connectionParam: "useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8",
initNum: 5,
maxNum: 20,
maxWaitTime: 3000,
maxWaitSize: 3,
remark: "云计算业务系统,开展云计算详细业务,教学,作业等工作"
}
]
}
};
this.accessList = response.data.rows;
this.total = response.data.total;
this.loading = false;
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
name: null,
type: null,
systemName: null,
host: null,
port: null,
databaseName: null,
connectionParam: null,
initNum: 5,
maxNum: 20,
maxWaitTime: 3000,
maxWaitSize: 3,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null,
remark: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length !== 1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加数据接入";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
this.form = row;
this.dataSourceParamList = [];
this.form.connectionParam.split("&").forEach(param => {
let paramArr = param.split("=");
this.dataSourceParamList.push({
name: paramArr[0],
val: paramArr[1]
})
})
this.open = true;
this.title = "修改数据接入";
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
this.$modal.msgSuccess("修改成功");
this.open = false;
} else {
this.$modal.msgSuccess("新增成功");
this.open = false;
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除数据接入编号为"' + ids + '"的数据项?').then(() => {
this.$modal.msgSuccess("删除成功");
});
},
/** 导出按钮操作 */
handleExport() {
this.$modal.msgSuccess("导出成功");
}
}
};
</script>

View File

@ -1,461 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="链接名" prop="dataSourceName">
<el-input
v-model="queryParams.dataSourceName"
placeholder="请输入链接名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="数据库来源系统名称" prop="dataSourceSystemName">
<el-input
v-model="queryParams.dataSourceSystemName"
placeholder="请输入数据库来源系统名称"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="ip地址" prop="ip">
<el-input
v-model="queryParams.ip"
placeholder="请输入ip地址"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="端口号" prop="port">
<el-input
v-model="queryParams.port"
placeholder="请输入端口号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:source:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['system:source:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['system:source:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['system:source:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="sourceList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="编号" align="center" prop="id" />
<el-table-column label="链接名" align="center" prop="dataSourceName" />
<el-table-column label="数据库来源系统名称" align="center" prop="dataSourceSystemName" />
<el-table-column label="数据库类型" align="center" prop="databaseType" />
<el-table-column label="ip地址" align="center" prop="ip" />
<el-table-column label="端口号" align="center" prop="port" />
<el-table-column label="用户名" align="center" prop="username" />
<el-table-column label="密码" align="center" prop="password" />
<el-table-column label="类型 '查询'/'存储'" align="center" prop="type" />
<el-table-column label="拼接的连接参数" align="center" prop="createBy" />
<el-table-column label="拼接的连接配置" align="center" prop="updateBy" />
<el-table-column label="状态 'Y'/'N'" align="center" prop="status" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['system:source:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['system:source:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改获取信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="80%" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-card>
<div clot="header" class="clearfix">
<span>基础信息</span>
</div>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="链接名" prop="dataSourceName">
<el-input v-model="form.dataSourceName" placeholder="请输入链接名" />
</el-form-item>
<el-form-item label="数据库来源系统名称" prop="dataSourceSystemName">
<el-input v-model="form.dataSourceSystemName" placeholder="请输入数据库来源系统名称" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="数据库类型" prop="dataSourceSystemName">
<el-select v-model="form.databaseType" clearable placeholder="请选择">
<el-option key="1" label="mysql" value="1"></el-option>
<el-option key="2" label="redis" value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="ip地址" prop="ip">
<el-input v-model="form.ip" placeholder="请输入ip地址" />
</el-form-item>
<el-form-item label="端口号" prop="port">
<el-input v-model="form.port" placeholder="请输入端口号" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="用户名" prop="username">
<el-input v-model="form.username" placeholder="请输入用户名" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form.password" placeholder="请输入密码" />
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :md="12" :sm="24">
<el-form-item label="类型" prop="connectionParameter">
<el-select v-model="form.type" clearable placeholder="请选择">
<el-option key="查询" label="查询" value="查询"></el-option>
<el-option key="存储" label="存储" value="存储"></el-option>
</el-select>
</el-form-item>
<el-form-item label="状态" prop="connectionConfig">
<el-radio v-model="form.status" label="Y">Y</el-radio>
<el-radio v-model="form.status" label="N">N</el-radio>
</el-form-item>
</el-col>
</el-row>
</el-card>
<el-card>
<div slot="header" class="clearfix">
<span>数据连接参数</span>
</div>
<el-col :sm="24">
<el-form-item label="数据连接参数" prop="connectionParam">
<el-input v-model="form.createBy" placeholder="请输入内容" />
</el-form-item>
</el-col>
<el-row :gutter="10" style="margin: 10px 0">
<el-col :span="2">
<el-button type="primary" @click="addParam()"></el-button>
</el-col>
<el-col :span="2">
<el-button type="danger" @click="deleteParam(null)"></el-button>
</el-col>
</el-row>
<el-row :gutter="10">
<el-col :md="8" :xs="12" style="margin: 10px 0" v-for="(dataSourceParam, dataSourceParamIndex) in dataSourceParamList">
<el-col :span="10">
<el-input v-model="dataSourceParam.name" placeholder="请输入参数键" @keyup.native="processParam"/>
</el-col>
<el-col :span="1"><span style="font-size: 28px; margin: 0 3px 0 0;">:</span></el-col>
<el-col :span="10">
<el-input v-model="dataSourceParam.val" placeholder="请输入参数值" @keyup.native="processParam"/>
</el-col>
<el-col :span="3">
<el-button type="danger" @click="deleteParam(dataSourceParamIndex)"></el-button>
</el-col>
</el-col>
</el-row>
</el-card>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listSource, getSource, delSource, addSource, updateSource } from "@/api/system/source";
export default {
name: "Source",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
sourceList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
dataSourceName: null,
dataSourceSystemName: null,
databaseType: null,
ip: null,
port: null,
username: null,
password: null,
type: null,
connectionParameter: null,
connectionConfig: null,
status: null,
},
//
form: {},
//
rules: {
dataSourceName: [
{ required: true, message: "链接名不能为空", trigger: "blur" }
],
dataSourceSystemName: [
{ required: true, message: "数据库来源系统名称不能为空", trigger: "blur" }
],
databaseType: [
{ required: true, message: "数据库类型不能为空", trigger: "change" }
],
ip: [
{ required: true, message: "ip地址不能为空", trigger: "blur" }
],
port: [
{ required: true, message: "端口号不能为空", trigger: "blur" }
],
username: [
{ required: true, message: "用户名不能为空", trigger: "blur" }
],
password: [
{ required: true, message: "密码不能为空", trigger: "blur" }
],
type: [
{ required: true, message: "类型 '查询'/'存储'不能为空", trigger: "change" }
],
status: [
{ required: true, message: "状态 'Y'/'N'不能为空", trigger: "change" }
],
createBy: [
{ required: true, message: "连接数据参数不能为空", trigger: "change" }
]
},
//
dataSourceParamList: [
{
name: null,
val: null
}
]
};
},
created() {
this.getList();
},
methods: {
//
addParam(){
this.dataSourceParamList.push({
name: null,
val: null
})
},
//
deleteParam(index){
if (index != null){
this.dataSourceParamList.splice(index, 1);
}else {
this.dataSourceParamList = []
}
this.processParam();
},
//
processParam(){
this.form.createBy = this.dataSourceParamList
.filter(item => item.name != null || item.val != null)
.map(item => {
return item.name + "=" + item.val;
}).join("&")
console.log(this.form.connectionParam)
},
/** 查询获取信息列表 */
getList() {
this.loading = true;
listSource(this.queryParams).then(response => {
this.sourceList = response.data.rows;
this.total = response.data.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
dataSourceName: null,
dataSourceSystemName: null,
databaseType: null,
ip: null,
port: null,
username: null,
password: null,
type: null,
connectionParameter: null,
connectionConfig: null,
status: null,
createBy: null,
createTime: null,
updateBy: null,
updateTime: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加获取信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getSource(id).then(response => {
this.form = response.data;
this.dataSourceParamList = [];
this.form.createBy.split("&").forEach(param => {
let paramArr = param.split("=");
this.dataSourceParamList.push({
name: paramArr[0],
val: paramArr[1]
})
})
this.open = true;
this.title = "修改获取信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateSource(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addSource(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除获取信息编号为"' + ids + '"的数据项?').then(function() {
return delSource(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('system/source/export', {
...this.queryParams
}, `source_${new Date().getTime()}.xlsx`)
}
}
};
</script>

View File

@ -0,0 +1,415 @@
<template>
<div class="app-container">
<span v-if="enterprise == null">
</span>
<span v-else>
<span v-if="enterprise.authentication != 1 ">
<h2>企业信息尚未完善请先补充完善后通知管理员审核</h2>
<!-- 添加或修改企业对话框 -->
<el-dialog title="补充企业信息" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="enterprise" :rules="enterprise" label-width="80px">
<el-form-item label="企业名称" prop="enterpriseName">
<el-input v-model="enterprise.enterpriseName" placeholder="请输入企业名称" />
</el-form-item>
<el-form-item label="法定代表人" prop="legalPerson">
<el-input v-model="enterprise.legalPerson" placeholder="请输入法定代表人" />
</el-form-item>
<el-form-item label="经营执照凭证号码" prop="businessLincenseNumber">
<el-input v-model="enterprise.businessLincenseNumber" placeholder="请输入经营执照凭证号码" />
</el-form-item>
<el-form-item label="企业成立日期" prop="estabinessDate">
<el-date-picker clearable
v-model="enterprise.estabinessDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择企业成立日期">
</el-date-picker>
</el-form-item>
<el-form-item label="经营范围" prop="businessScope">
<el-input v-model="enterprise.businessScope" placeholder="请输入经营范围" />
</el-form-item>
<el-form-item label="注册地址" prop="address">
<el-input v-model="enterprise.address" placeholder="请输入注册地址" />
</el-form-item>
<el-form-item label="企业联系方式" prop="contactPhone">
<el-input v-model="enterprise.contactPhone" placeholder="请输入企业联系方式" />
</el-form-item>
<el-form-item label="公司邮箱" prop="email">
<el-input v-model="enterprise.email" placeholder="请输入公司邮箱" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="enterprise.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button>
</div>
</el-dialog>
</span>
<span v-else>
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="车辆识别码" prop="vin">
<el-input
v-model="queryParams.vin"
placeholder="请输入车辆识别码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="车牌号" prop="registrationNumber">
<el-input
v-model="queryParams.registrationNumber"
placeholder="请输入车牌号"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="carList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="车辆唯一标识" align="center" prop="carId" />
<el-table-column label="车辆识别码" align="center" prop="vin" />
<el-table-column label="品牌" align="center" prop="brand" />
<el-table-column label="型号" align="center" prop="model" />
<el-table-column label="生产年份" align="center" prop="manufactureYear" />
<el-table-column label="车辆颜色" align="center" prop="color" />
<el-table-column label="发动机排量" align="center" prop="engineCapacity" />
<el-table-column label="燃油类型" align="center" prop="fuelType" />
<el-table-column label="变速器类型" align="center" prop="transmission" />
<el-table-column label="驱动类型" align="center" prop="driveType" />
<el-table-column label="注册日期" align="center" prop="registrationDate" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.registrationDate, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="车牌号" align="center" prop="registrationNumber" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
>删除</el-button>
</template>
</el-table-column>
<el-table-column label="查看服务">
<span slot-scope="scope">
<el-button type="text" @click="fence(scope.row.carId)"></el-button>
<el-button type="text" @click="breakdown(scope.row.vin)"></el-button>
<el-button type="text" @click="warning(scope.row.vin)"></el-button>
</span>
</el-table-column>
<el-table-column label="查看车辆检测规则">
<span slot-scope="scope">
<el-button type="text" @click="windows(scope.row.vin)"></el-button>
<el-button type="text" @click="readFormat(scope.row.vin)"></el-button>
</span>
</el-table-column>
<el-table-column label="查看实时坐标">
<span slot-scope="scope">
<el-button type="text" @click="realTime(scope.row.vin)"></el-button>
</span>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改车辆信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="品牌" prop="brand">
<el-input v-model="form.brand" placeholder="请输入品牌" />
</el-form-item>
<el-form-item label="型号" prop="model">
<el-input v-model="form.model" placeholder="请输入型号" />
</el-form-item>
<el-form-item label="生产年份" prop="manufactureYear">
<el-input v-model="form.manufactureYear" placeholder="请输入生产年份" />
</el-form-item>
<el-form-item label="车辆颜色" prop="color">
<el-input v-model="form.color" placeholder="请输入车辆颜色" />
</el-form-item>
<el-form-item label="发动机排量" prop="engineCapacity">
<el-input v-model="form.engineCapacity" placeholder="请输入发动机排量" />
</el-form-item>
<el-form-item label="燃油类型" prop="fuelType">
<el-select v-model="form.fuelType">
<el-option label="Petrol" value="Petrol"></el-option>
<el-option label="Diesel" value="Diesel"></el-option>
<el-option label="Electric" value="Electric"></el-option>
</el-select>
</el-form-item>
<el-form-item label="变速器类型" prop="transmission">
<el-select v-model="form.transmission">
<el-option label="Automatic" value="Automatic"></el-option>
<el-option label="Manual" value="Manual"></el-option>
</el-select>
</el-form-item>
<el-form-item label="驱动类型" prop="driveType">
<el-select v-model="form.driveType">
<el-option label="FWD" value="FWD"></el-option>
<el-option label="RWD" value="RWD"></el-option>
<el-option label="AWD" value="AWD"></el-option>
</el-select>
</el-form-item>
<el-form-item label="注册日期" prop="registrationDate">
<el-date-picker clearable
v-model="form.registrationDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择注册日期">
</el-date-picker>
</el-form-item>
<el-form-item label="车牌号" prop="registrationNumber">
<el-input v-model="form.registrationNumber" placeholder="请输入车牌号" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</span>
</span>
</div>
</template>
<script>
import { listCar, getCar, delCar, addCar, updateCar, query } from "@/api/goods/car";
import {listEnterprise} from "@/api/goods/business";
export default {
name: "Car",
data() {
return {
enterprise: {},
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
carList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
vin: null,
registrationNumber: null,
},
//
form: {},
//
rules: {
}
};
},
created() {
this.getList();
},
methods: {
bulk() {
alert("信息已发送,等待处理")
},
fence(carId) {//
this.$router.push({path: '/client/sever/fence',query:{carId:carId}})
},
breakdown(vin) {//
this.$router.push({path: '/client/sever/breakdown',query:{vin:vin}})
},
warning(vin) {//
this.$router.push({path: '/client/sever/forewarning',query:{vin:vin}})
},
realTime(vin) {//
this.$router.push({path: '/client/sever/random',query:{vin:vin}})
},
readFormat(vin) {//
this.$router.push({path: '/client/sever/message',query:{vin:vin}})
},
windows(vin) {//
this.$router.push({path: '/client/sever/window',query:{vin:vin}})
},
/** 查询车辆信息列表 */
getList() {
this.loading = true;
listCar(this.queryParams).then(response => {
console.log(response)
this.carList = response.data.rows;
this.total = response.data.total;
this.loading = false;
});
listEnterprise().then(res => {
this.enterprise = res.data
console.log(res.data)
})
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
carId: null,
vin: null,
brand: null,
model: null,
manufactureYear: null,
bodyType: null,
color: null,
engineCapacity: null,
fuelType: null,
transmission: null,
driveType: null,
mileage: null,
registrationDate: null,
registrationNumber: null,
ownerId: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.carId)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加车辆信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const carId = row.carId || this.ids
getCar(carId).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改车辆信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.carId != null) {
updateCar(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addCar(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const carIds = row.carId || this.ids;
this.$modal.confirm('是否确认删除车辆信息编号为"' + carIds + '"的数据项?').then(function() {
return delCar(carIds);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('rule/car/export', {
...this.queryParams
}, `car_${new Date().getTime()}.xlsx`)
}
}
};
</script>

View File

@ -0,0 +1,148 @@
<template>
<div>
<span v-if="enterprise == null">
</span>
<span v-else>
<span v-if="enterprise.authentication != 1 ">
<h2>企业信息尚未完善请先补充完善后通知管理员审核</h2>
<el-button @click="bulk"></el-button>
<!-- 添加或修改企业对话框 -->
<el-dialog title="补充企业信息" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="enterprise" :rules="rules" label-width="80px">
<el-form-item label="企业名称" prop="enterpriseName">
<el-input v-model="enterprise.enterpriseName" placeholder="请输入企业名称" />
</el-form-item>
<el-form-item label="法定代表人" prop="legalPerson">
<el-input v-model="enterprise.legalPerson" placeholder="请输入法定代表人" />
</el-form-item>
<el-form-item label="经营执照凭证号码" prop="businessLincenseNumber">
<el-input v-model="enterprise.businessLincenseNumber" placeholder="请输入经营执照凭证号码" />
</el-form-item>
<el-form-item label="企业成立日期" prop="estabinessDate">
<el-date-picker clearable
v-model="enterprise.estabinessDate"
type="date"
value-format="yyyy-MM-dd"
placeholder="请选择企业成立日期">
</el-date-picker>
</el-form-item>
<el-form-item label="经营范围" prop="businessScope">
<el-input v-model="enterprise.businessScope" placeholder="请输入经营范围" />
</el-form-item>
<el-form-item label="注册地址" prop="address">
<el-input v-model="enterprise.address" placeholder="请输入注册地址" />
</el-form-item>
<el-form-item label="企业联系方式" prop="contactPhone">
<el-input v-model="enterprise.contactPhone" placeholder="请输入企业联系方式" />
</el-form-item>
<el-form-item label="公司邮箱" prop="email">
<el-input v-model="enterprise.email" placeholder="请输入公司邮箱" />
</el-form-item>
<el-form-item label="备注" prop="remark">
<el-input v-model="enterprise.remark" placeholder="请输入备注" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="open = false"> </el-button>
</div>
</el-dialog>
</span>
<span v-else>
<el-descriptions class="margin-top" title="企业详情" :data="enterprise" :column="3" :size="size" border>
<el-descriptions-item label="企业名称">{{enterprise.enterpriseName}}</el-descriptions-item>
<el-descriptions-item label="法定代表人">{{enterprise.legalPerson}}</el-descriptions-item>
<el-descriptions-item label="企业联系方式">{{enterprise.contactPhone}}</el-descriptions-item>
<el-descriptions-item label="公司邮箱">{{enterprise.email}}</el-descriptions-item>
<el-descriptions-item label="是否认证">
<span v-if="enterprise.authentication == 0"></span>
<span v-if="enterprise.authentication == 1"></span>
</el-descriptions-item>
<el-descriptions-item label="服务等级">
<span v-if="enterprise.serviceLevel === 0"></span>
<span v-if="enterprise.serviceLevel === 1"></span>
<span v-if="enterprise.serviceLevel === 2"></span>
</el-descriptions-item>
<el-descriptions-item label="备注">{{enterprise.remark}}</el-descriptions-item>
</el-descriptions>
</span>
</span>
<el-button @click="stand()"></el-button>
</div>
</template>
<script>
import { listEnterprise } from "@/api/goods/business";
import { standard } from "@/api/goods/forewarn";
import { getEnterprise, updateEnterprise } from "@/api/goods/enterprise";
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {},
data() {
// "
return {
open: false,
enterprise:{},
//
rules: {}
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
bulk() {
this.open = true
},
getInfo() {
listEnterprise().then(res => {
this.enterprise = res.data
console.log(res.data)
})
},
stand() {
standard().then(res => {
console.log(res)
})
},
submitForm() {
updateEnterprise(this.enterprise).then(res => {
this.$message.success("申请已发送,请审核")
this.open = false
this.getInfo();
})
}
},
// - 访this",
created() {
this.getInfo()
},
// - 访DOM",
mounted() {
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,297 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="故障码" prop="faultCode">
<el-input
v-model="queryParams.vin"
placeholder="请输入故障码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="故障产生时间" prop="faultStartTime">
<el-date-picker clearable
v-model="queryParams.faultStartTime"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请开始时间区间">
</el-date-picker>-------------
<el-date-picker clearable
v-model="queryParams.faultEndTime"
type="date"
value-format="yyyy-MM-dd HH:mm:ss"
placeholder="请结束时间区间">
</el-date-picker>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-form :inline="true" :model="formInline" class="demo-form-inline">
<el-date-picker
v-model="formInline.faultStartTime"
type="datetime"
placeholder="选择日期时间"
align="right">
</el-date-picker>-----
<el-date-picker
v-model="formInline.faultEndTime"
type="datetime"
placeholder="选择日期时间"
align="right">
</el-date-picker>
<el-button @click="look()"></el-button>
</el-form>
<!-- <el-button @click="par()"></el-button>-->
<!-- <el-button @click="pie()"></el-button>-->
<el-table v-loading="loading" :data="breakdownList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键" align="center" prop="id" />
<el-table-column label="故障码" align="center" prop="faultCode" />
<el-table-column label="车辆标识" align="center" prop="vin" />
<el-table-column label="故障状态" align="center" prop="faultState" />
<el-table-column label="故障产生时间" align="center" prop="faultStartTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.faultStartTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="故障解决时间" align="center" prop="faultEndTime" width="180">
<template slot-scope="scope">
<span>{{ parseTime(scope.row.faultEndTime, '{y}-{m}-{d}') }}</span>
</template>
</el-table-column>
<el-table-column label="故障等级" align="center" prop="faultLevel" width="180"></el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<div class="container">
<div id="main" rel="stylesheet" style="height: 400px;width: 400px;display: flex;
align-items: center;justify-content: center"></div>
<div id="main2" rel="stylesheet" style="height: 400px;width: 400px;display: flex;
align-items: center;justify-content: center"></div>
</div>
</div>
</template>
<script>
import { listBreakdown, pies } from "@/api/goods/breakdown";
import * as echarts from "echarts";
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {},
data() {
// "
return {
a: [],
b: [],
c: [],
//
queryParams: {
pageNum: 1,
pageSize: 10,
vin: this.$route.query.vin,
faultStartTime: null,
faultEndTime: null
},
formInline: {
vin: this.$route.query.vin,
faultStartTime: null,
faultEndTime: null
},
//
showSearch: true,
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
total: 0,
//
loading: true,
//
breakdownList: [],
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
look() {
this.getPers()
this.par()
this.pie()
},
/** 查询企业列表 */
getList() {
this.loading = true;
listBreakdown(this.queryParams).then(response => {
this.breakdownList = response.data.rows;
this.total = response.data.total;
this.loading = false;
console.log(response)
});
},
getPers() {
pies(this.formInline).then(res => {
let a1 = []
let b1 = []
res.data.forEach(ren => {
a1.push(ren.name)
b1.push(ren.value)
this.a = a1;
this.b = b1;
})
this.c = res.data
})
},
//
par() {
//
const option = {
title: {
text: '平面展示'
},
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'shadow'
}
},
legend: {},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'value',
boundaryGap: [0, 0.01]
},
yAxis: {
type: 'category',
data: this.a
},
series: [
{
type: 'bar',
data: this.b,
// itemStyle: {
// color:
// }
},
]
};
const myChart = echarts.init(document.getElementById("main"));
myChart.setOption(option);
//
// window.addEventListener("resize", () => {
// myChart.resize();
// });
},
//
pie() {
const option = {
title: {
text: '百分比展示',
subtext: '占比',
left: 'center'
},
tooltip: {
trigger: 'item'
},
legend: {
orient: 'vertical',
left: 'left'
},
series: [
{
name: 'Access From',
type: 'pie',
radius: '50%',
data: this.c
,
emphasis: {
itemStyle: {
shadowBlur: 10,
shadowOffsetX: 0,
shadowColor: 'rgba(0, 0, 0, 0.5)'
}
}
}
]
}
const myChart = echarts.init(document.getElementById("main2"));
myChart.setOption(option);
}
},
// - 访this",
created() {
},
// - 访DOM",
mounted() {
this.getList()
this.getPers()
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style scoped>
.container {
display: flex;
justify-content: space-between;
align-items: start;
}
.centered-box {
display: flex;
align-items: center;
justify-content: center;
/* 如果需要间隔,可以添加 margin */
margin-right: 10px; /* 右侧间隔最后一个元素可以设置为0或者使用margin-left在左侧元素上 */
}
</style>

View File

@ -0,0 +1,135 @@
<template>
<div>
<el-button type="text" @click="addGroups(dialogFormVisible = true)">增加围栏组</el-button>
<el-button type="text" @click="mapFence()"></el-button>
<el-table :data="fenceGroups">
<el-table-column prop="groupsName" label="围栏组名称"></el-table-column>
<el-table-column prop="fenceName" label="围栏名称"></el-table-column>
<el-table-column prop="fenceType" label="围栏类型"></el-table-column>
<el-table-column prop="eventType" label="驶入驶出">
<span slot-scope="scope">
<span v-if="scope.row.eventType === 'Y'"></span>
<span v-if="scope.row.eventType === 'N'"></span>
</span>
</el-table-column>
<el-table-column prop="staut" label="围栏状态">
<span slot-scope="scope">
<span v-if="scope.row.staut === 'Y'"></span>
<span v-if="scope.row.staut === 'N'"></span>
</span>
</el-table-column>
<el-table-column prop="polygonPoints" label="坐标"></el-table-column>
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<span slot-scope="scope">
<span v-if="scope.row.staut === 'Y'">
<el-button type="text" icon="el-icon-edit" @click="query(scope.row.fenceId)"></el-button>
</span>
<span v-if="scope.row.staut === 'N'">
<el-button type="text" icon="el-icon-edit" @click="query(scope.row.fenceId)"></el-button>
</span>
<br>
<el-button size="mini" icon="el-icon-delete" type="text" @click="del(scope.row.fenceId)"></el-button>
</span>
</el-table-column>
</el-table>
<el-dialog title="新增围栏组" :visible.sync="dialogFormVisible">
<el-form :model="groups">
<el-form-item label="围栏名称" :label-width="formLabelWidth">
<el-input v-model="groups.groupsName" autocomplete="off"></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialogFormVisible = false"> </el-button>
<el-button type="primary" @click="dialogFormVisible = false"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import {selectFenceGroupsById, deleteFence, updateFence} from "@/api/goods/map";
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {},
data() {
// "
return {
carId: this.$route.query.carId,
groups: {
carId: this.$route.query.carId,
groupsName: ''
},
fenceGroups:[],
dialogFormVisible: false,
formLabelWidth: '120px'
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
//
getInfo() {
selectFenceGroupsById(this.carId).then(res => {
this.fenceGroups = res.data
console.log(1)
console.log(this.fenceGroups)
})
},
//
del(fenceId) {
deleteFence(fenceId).then(res => {
this.$message.success(res.data)
this.getInfo()
})
},
//
addGroups() {},
//
add(groupsId) {
// this.$router.push({path:'/client/sever/map',query:{groupsId:groupsId}})
},
//
query(fenceId) {
updateFence(fenceId).then(res => {
this.$message.success(res.data)
this.getInfo()
})
},
//
mapFence() {
this.$router.push({path: '/client/sever/map'})
}
},
// - 访this",
created() {
this.getInfo()
},
// - 访DOM",
mounted() {
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,64 @@
<template>
<div>
<el-table :data="warningInfo">
<el-table-column prop="vin" label="车辆编码"></el-table-column>
<el-table-column prop="field" label="预警编码"></el-table-column>
<el-table-column prop="abnormalType" label="异常状态"></el-table-column>
<el-table-column prop="time" label="预警时间"></el-table-column>
</el-table>
</div>
</template>
<script>
import { listWarningInfoById } from "@/api/goods/forewarn";
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {},
data() {
// "
return {
vin: this.$route.query.vin,
warningInfo: []
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
getInfo() {
listWarningInfoById(this.vin).then(res => {
this.warningInfo = res.data
})
}
},
// - 访this",
created() {
this.getInfo()
},
// - 访DOM",
mounted() {
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style scoped>
</style>

View File

@ -0,0 +1,182 @@
<template>
<div class="index">
<el-button type="primary" @click="drawRectangle"></el-button>
<el-button type="primary" @click="editRectangle"></el-button>
<el-button type="primary" @click="deleRectangle"></el-button>
<el-button type="primary" @click="sel"></el-button>
<div id="amapContainer"></div>
</div>
</template>
<script>
import { getSel, dbx } from "@/api/goods/map";
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {
paths: {} //
},
data() {
// "
return {
// groupsId: this.$route.query.groupsId,
path: [], //
polygonItem: [], //
polyEditors: [], //
pences:{
list: []
} //
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
sel() {//
this.pences.list = this.polygonItem[0].w.path;
getSel(this.pences.list).then(res => {
console.log(res)
})
console.log(this.pences.list)
},
//
intAmap (callBack) {
this.AMap = window.AMap;
this.AMap.plugin(['AMap.MouseTool', 'AMap.PolyEditor', 'AMap.ControlBar'], function () {
//TODO
});
this.map = new this.AMap.Map("amapContainer", {
center: [116.409753, 39.921925],
zoom: 14,
// mapStyle: "amap://styles/darkblue",
pitch: 80,
rotation: -15,
viewMode: '3D',//3D,
buildingAnimation: true,//
});
this.map.addControl(new this.AMap.ControlBar());
if (callBack && typeof callBack == 'function') {
callBack();
}
},
//
editRectangle (paths) {
const path = paths;
const AMap = window.AMap;
var polygon = new this.AMap.Polygon({
path: path,
strokeColor: "#FF33FF",
strokeWeight: 6,
strokeOpacity: 0.2,
fillOpacity: 0.4,
fillColor: '#1791fc',
zIndex: 50,
});
this.map.add(polygon);
this.polygonItem.push(polygon);
//
this.map.setFitView([polygon]);
this.polyEditor = new AMap.PolyEditor(this.map, polygon);
this.polyEditor.open();
this.polyEditors.push(this.polyEditor);
this.polyEditor.on('addnode', function (event) {
console.info('触发事件addnode', event)
console.info('修改后的经纬度:', polygon.getPath())
});
this.polyEditor.on('adjust', function (event) {
console.info('触发事件adjust', event)
console.info('修改后的经纬度:', polygon.getPath())
});
this.polyEditor.on('removenode', function (event) {
console.info('触发事件removenode', event)
console.info('修改后的经纬度:', polygon.getPath())
});
this.polyEditor.on('end', function (event) {
console.info('触发事件: end', event)
console.info('修改后的经纬度:', polygon.getPath())
// event.target
});
},
//
drawRectangle () {
const vm = this;
this.mouseTool = new this.AMap.MouseTool(this.map);
const polygon = this.mouseTool.polygon({
strokeColor: 'red',
strokeOpacity: 0.5,
strokeWeight: 6,
fillColor: 'blue',
fillOpacity: 0.5,
// strokeStyle solid
strokeStyle: 'solid',
// strokeDasharray: [30,10],
});
this.mouseTool.on('draw', function (event) {
// event.obj
var polygonItem = event.obj;
var paths = polygonItem.getPath();//
console.log('覆盖物对象绘制完成各个点的坐标', paths);
var path = []; //
paths.forEach(v => {
path.push([v.lng, v.lat])
});
vm.path = path;
vm.editRectangle(vm.path);
vm.polygonItem.push(event.obj);
vm.map.remove(event.obj); //
console.log("覆盖物对象绘制完成的坐标点",event.obj.getPath())
});
},
//
deleRectangle () {
//
this.polyEditors.forEach(v => {
v.close();
});
this.map.clearMap(); //
},
},
// - 访this",
created() {
},
// - 访DOM",
mounted() {
this.intAmap(() => {
if (this.paths) {
this.editRectangle(this.paths);
}
})
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style lang="scss" scoped>
#amapContainer {
height: 800px;
width: 1000px;
}
</style>

View File

@ -0,0 +1,215 @@
<template>
<div class="container">
<div class="left">
<div class="top">
基本信息
<div v-for="(item, index) in basic" :key="index" class="item-container">
<label>
<input type="checkbox" :value="item" v-model="selectedOptions" disabled>
{{item.label}}
</label>
<div v-if="isSelected(index)">
<label>Start:<input type="number" v-model="item.start" min="1" disabled/></label>
<label>End:<input type="number" v-model="item.end" min="1" disabled/></label>
</div>
</div>
</div>
<div class="middle">
车辆详情:
<div v-for="(item, index) in standard" :key="index">
<label>
<input type="checkbox" :value="item" v-model="selectedOptions">
{{item.label}}
</label>
<div v-if="isSelected2(index)">
<label>Start:<input type="number" v-model="item.start" min="1"/></label>
<label>End:<input type="number" v-model="item.end" min="1"/></label>
</div>
</div>
</div>
<div class="boolean">
故障状态<br>
<div v-for="(item,index) in breakdown" :key="index">
<label>
<input type="checkbox" :value="item" v-model="selectedOptions">
{{item.label}}
</label>
<div v-if="isSelected3(index)">
<label>Start:<input type="number" v-model="item.start" min="1"/></label>
<label>End:<input type="number" v-model="item.end" min="1"/></label>
</div>
</div>
</div>
</div>
<div class="right">
<el-button @click="dian"></el-button>
<br>
<div v-for="(option, index) in selectedOptions" :key="index">
{{option}}
</div>
</div>
</div>
</template>
<script>
import { indexDataFormat, selectDataFormatById, deleteDataFormatById } from "@/api/goods/forewarn"
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {},
data() {
// "
return {
vin: this.$route.query.vin,
//
basic: [
{dataCode:"vin",label:"车辆标识",start:1,end:17},
{dataCode:"time",label:"时间",start:18,end:30},
{dataCode:"longitude",label:"经度",start:31,end:40},
{dataCode:"latitude",label:"纬度",start:41,end:50},
{dataCode:"speed",label:"车速",start:52,end:57},
{dataCode:"totalMileage",label:"总里程",start:58,end:68},
{dataCode:"gears",label:"档位",start:89,end:89}
],
//
standard: [
{dataCode:"totalVoltage",label:"总电压",start:69,end:74},
{dataCode:"totalCurrent",label:"总电流",start:75,end:79},
{dataCode:"insulationResistance",label:"绝缘电阻",start:80,end:87},
{dataCode:"acceleratorPedal",label:"加速踏板行程值",start:90,end:91},
{dataCode:"brakePedal",label:"制动踏板行程值",start:92,end:93},
{dataCode:"fuelConsumptionRate",label:"燃料消耗率",start:94,end:98},
{dataCode:"MotorControllerTemperature",label:"电机控制器温度",start:99,end:104},
{dataCode:"motorSpeed",label:"电机转速",start:104,end:109},
{dataCode:"motorTorque",label:"电机转矩",start:110,end:113},
{dataCode:"motorTemperature",label:"电机温度",start:114,end:119},
{dataCode:"motorVoltage",label:"电机电压",start:120,end:124},
{dataCode:"motorCurrent",label:"电机电流",start:125,end:132},
{dataCode:"remainingPower",label:"动力电池剩余电量SOC",start:133,end:138},
{dataCode:"maximumFeedbackPower",label:"当前状态允许的最大反馈功率",start:139,end:144},
{dataCode:"maximumDischargePower",label:"当前状态允许最大放电功率",start:145,end:150},
{dataCode:"selfTestCounter",label:"BMS自检计数器",start:151,end:152},
{dataCode:"batteryChargeOrDischargeCurrent",label:"动力电池充放电电流",start:153,end:157},
{dataCode:"totalVoltageV3",label:"动力电池负载端总电压V3",start:158,end:163},
{dataCode:"maximumVoltage",label:"单次最大电压",start:164,end:167},
{dataCode:"minimumBatteryVoltage",label:"单体电池最低电压",start:168,end:171},
{dataCode:"maximumBatteryTemperature",label:"单体电池最高温度",start:172,end:177},
{dataCode:"minimumBatteryTemperature",label:"单体电池最低温度",start:178,end:183},
{dataCode:"usableBatteryCapacity",label:"动力电池可用容量",start:184,end:189},
],
//
breakdown: [
{dataCode:"vehicleStatus",label:"车辆状态",start:190,end:190},
{dataCode:"chargeStatus",label:"充电状态",start:191,end:191},
{dataCode:"operationalStatus",label:"运行状态",start:192,end:192},
{dataCode:"soc",label:"SOC",start:193,end:193},
{dataCode:"energyStorageDeviceWorkingStatus",label:"可充电储能装置工作状态",start:194,end:194},
{dataCode:"driveMotorStatus",label:"驱动电机状态",start:195,end:195},
{dataCode:"positioningIsOrNotEffective",label:"定位是否有效",start:196,end:196},
{dataCode:"eas",label:"EAS",start:197,end:197},
{dataCode:"ptc",label:"PTC",start:198,end:198},
{dataCode:"eps",label:"EPS",start:198,end:198},
{dataCode:"abs",label:"ABS",start:200,end:200},
{dataCode:"mcu",label:"mcu",start:201,end:201},
{dataCode:"batteryHeatingStatus",label:"动力电池加热状态",start:202,end:202},
{dataCode:"batteryCurrentStatus",label:"动力电池当前状态",start:203,end:203},
{dataCode:"batteryInsulationStatus",label:"动力电池保温状态",start:204,end:204},
{dataCode:"dcdc",label:"DCDC",start:205,end:205},
{dataCode:"chg",label:"CHG",start:206,end:206}
],
//
selectedOptions: [
{dataCode:"vin",label:"车辆标识",start:1,end:17},
{dataCode:"time",label:"时间",start:18,end:27},
{dataCode:"longitude",label:"经度",start:31,end:40},
{dataCode:"latitude",label:"纬度",start:41,end:50},
{dataCode:"speed",label:"车速",start:52,end:57},
{dataCode:"totalMileage",label:"总里程",start:58,end:68},
{dataCode:"gears",label:"档位",start:89,end:89}
],
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
//
isSelected(index) {
return this.selectedOptions.some(item => item.dataCode === this.basic[index].dataCode);
},
isSelected2(index) {
return this.selectedOptions.some(item => item.dataCode === this.standard[index].dataCode);
},
isSelected3(index) {
return this.selectedOptions.some(item => item.dataCode === this.breakdown[index].dataCode);
},
//
dian() {
indexDataFormat(this.selectedOptions,this.vin).then(res => {
console.log(res)
if (res.data != 0){
this.$modal.msgSuccess("新增成功")
}else{
this.$modal.msgSuccess("新增失败")
}
})
this.getInfo()
},
getInfo() {
selectDataFormatById(this.vin).then(res => {
if (res.data != null) {
this.selectedOptions = res.data
}
})
}
},
// - 访this",
created() {
this.getInfo()
},
// - 访DOM",
mounted() {
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style scoped>
.container {
display: flex;
}
.left {
flex: 1;
display: flex;
flex-direction: column;
}
.left > div {
flex: 0 0 auto;
border-bottom: 1px solid #eee;
}
.right .bottom {
border-bottom: none;
}
.right {
flex: 1;
}
</style>

View File

@ -0,0 +1,296 @@
<template>
<div>
<div class="index">
<div id="map" style="width: 100%; height: 400px;"></div>
</div>
<el-descriptions title="实时数据" direction="vertical" :column="4" :model="VehicleInfo" border>
<el-descriptions-item label="vin">{{VehicleInfo.vin}}</el-descriptions-item>
<el-descriptions-item label="时间">{{VehicleInfo.time}}</el-descriptions-item>
<el-descriptions-item label="经度">{{VehicleInfo.longitude}}</el-descriptions-item>
<el-descriptions-item label="纬度">{{VehicleInfo.latitude}}</el-descriptions-item>
<el-descriptions-item label="车速">{{VehicleInfo.speed}}</el-descriptions-item>
<el-descriptions-item label="总里程">{{VehicleInfo.totalMileage}}</el-descriptions-item>
<el-descriptions-item label="总电压">{{VehicleInfo.totalVoltage}}</el-descriptions-item>
<el-descriptions-item label="总电流">{{VehicleInfo.totalCurrent}}</el-descriptions-item>
<!-- <el-descriptions-item label="绝缘电阻">{{VehicleInfo.insulationResistance}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="档位">{{VehicleInfo.gears}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="加速踏板行程值">{{VehicleInfo.acceleratorPedal}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="制动踏板行程值">{{VehicleInfo.brakePedal}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="燃料消耗率">{{VehicleInfo.fuelConsumptionRate}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="电机控制器温度">{{VehicleInfo.MotorControllerTemperature}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="电机转速">{{VehicleInfo.motorSpeed}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="电机转矩">{{VehicleInfo.motorTorque}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="电机温度">{{VehicleInfo.motorTemperature}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="电机电压">{{VehicleInfo.motorVoltage}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="电机电流">{{VehicleInfo.motorCurrent}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="动力电池剩余电量SOC">{{VehicleInfo.remainingPower}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="当前状态允许的最大反馈功率">{{VehicleInfo.maximumFeedbackPower}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="当前状态允许最大放电功率">{{VehicleInfo.maximumDischargePower}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="BMS自检计数器">{{VehicleInfo.selfTestCounter}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="动力电池充放电电流">{{VehicleInfo.batteryChargeOrDischargeCurrent}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="动力电池负载端总电压V3">{{VehicleInfo.totalVoltageV3}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="单次最大电压">{{VehicleInfo.maximumVoltage}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="单体电池最低电压">{{VehicleInfo.minimumBatteryVoltage}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="单体电池最高温度">{{VehicleInfo.maximumBatteryTemperature}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="单体电池最低温度">{{VehicleInfo.minimumBatteryTemperature}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="动力电池可用容量">{{VehicleInfo.usableBatteryCapacity}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="车辆状态">{{VehicleInfo.vehicleStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="充电状态">{{VehicleInfo.chargeStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="运行状态">{{VehicleInfo.operationalStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="SOC">{{VehicleInfo.soc}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="可充电储能装置工作状态">{{VehicleInfo.energyStorageDeviceWorkingStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="驱动电机状态">{{VehicleInfo.driveMotorStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="定位是否有效">{{VehicleInfo.positioningIsOrNotEffective}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="EAS">{{VehicleInfo.eas}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="PTC">{{VehicleInfo.ptc}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="EPS">{{VehicleInfo.eps}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="ABS">{{VehicleInfo.abs}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="MCU">{{VehicleInfo.mcu}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="动力电池加热状态">{{VehicleInfo.batteryHeatingStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="动力电池当前状态">{{VehicleInfo.batteryCurrentStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="动力电池保温状态">{{VehicleInfo.batteryInsulationStatus}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="DCDC">{{VehicleInfo.dcdc}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="CHG">{{VehicleInfo.chg}}</el-descriptions-item>-->
<!-- <el-descriptions-item label="校验位">{{VehicleInfo.checkDigit}}</el-descriptions-item>-->
</el-descriptions>
</div>
</template>
<script>
import { read, open, close } from "@/api/goods/car";
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {
paths: {}, //
},
data() {
// "
return {
map: null, //
path: [], //
VehicleInfo: {
// vin
vin: '',
//
time: '',
//
longitude: '',
//
latitude: '',
//
speed: '',
//
totalMileage: '',
//
totalVoltage: '',
//
totalCurrent: '',
//
insulationResistance: '',
//
gears: '',
//
acceleratorPedal: '',
//
brakePedal: '',
//
fuelConsumptionRate: '',
//
MotorControllerTemperature: '',
//
motorSpeed: '',
//
motorTorque: '',
//
motorTemperature: '',
//
motorVoltage: '',
//
motorCurrent: '',
// SOC
remainingPower: '',
//
maximumFeedbackPower: '',
//
maximumDischargePower: '',
// BMS
selfTestCounter: '',
//
batteryChargeOrDischargeCurrent: '',
// V3
totalVoltageV3: '',
//
maximumVoltage: '',
//
minimumBatteryVoltage: '',
//
maximumBatteryTemperature: '',
//
minimumBatteryTemperature: '',
//
usableBatteryCapacity: '',
//
vehicleStatus: '',
//
chargeStatus: '',
//
operationalStatus: '',
// SOC
soc: '',
//
energyStorageDeviceWorkingStatus: '',
//
driveMotorStatus: '',
//
positioningIsOrNotEffective: '',
// EAS
eas: '',
// PTC
ptc: '',
// EPS
eps: '',
// ABS
abs: '',
// MCU
mcu: '',
//
batteryHeatingStatus: '',
//
batteryCurrentStatus: '',
//
batteryInsulationStatus: '',
// DCDC
dcdc: '',
// CHG
chg: '',
//
checkDigit: '',
},
vin: this.$route.query.vin,
carMarker: null, //
carPath: null, //
carPosition: { //
longitude: 116.663817, //
latitude: 39.53177, //
},
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
//
initMap() {
//
this.map = new AMap.Map('map', {
zoom: 15, //
center: [this.carPosition.longitude, this.carPosition.latitude], //
});
},
createCar() {
//
const icon = new AMap.Icon({
size: new AMap.Size(50, 50), //
image: 'https://s1.4sai.com/src/img/png/37/3760fd545ff848c2b241b7cf400b3dd7.png?imageView2/2/w/256&e=1735488000&token=1srnZGLKZ0Aqlz6dk7yF4SkiYf4eP-YrEOdM1sob:F5xvrYJwsejuj9uCJhs70CQ7-mg=', //
imageSize: new AMap.Size(50, 50), //
});
this.carMarker = new AMap.Marker({
map: this.map, //
position: [this.carPosition.longitude, this.carPosition.latitude], //
icon: icon, // 使
offset: new AMap.Pixel(-26, -13), //
});
},
startSimulation() {
// moveCar
setInterval(() => {
this.moveCar();
}, 1000);
},
moveCar() {
//
const newLng = this.VehicleInfo.longitude; // 0.001
// const newLng = this.carPosition.longitude + 0.001; // 0.001
const newLat = this.VehicleInfo.latitude; // 0.00050.001
// const newLat = this.carPosition.latitude + 0.001 * Math.random() * 0.5; // 0.00050.001
// carPath
// carPath 使 AMap.Polyline API
// this.carPath.push([newLng, newLat]); // carPath Polyline
this.carMarker.setPosition([newLng, newLat]); //
this.carPosition = { longitude: newLng, latitude: newLat }; //
},
open() {
open().then(res =>{
console.log(res)
})
}
},
// - 访this",
created() {
this.open()
this.timer = setInterval(() => {
read().then(res => {
this.VehicleInfo = res.data
})
},2000)
},
// - 访DOM",
mounted() {
this.initMap(); //
this.createCar(); //
this.startSimulation(); //
this.intAmap(() => {
if (this.paths) {
this.editRectangle(this.paths);
}
})
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
//
if (this.carPath) {
this.carPath.setMap(null); // carPath Polyline
}
if (this.carMarker) {
this.carMarker.setMap(null); //
}
if (this.map) {
this.map.destroy(); //
}
//
if (this.timer) {
close().then(res => {
console.log(res)
})
clearInterval(this.timer)
}
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style lang="scss" scoped>
#amapContainer {
height: 400px;
width: 1200px;
}
</style>

View File

@ -0,0 +1,113 @@
<template>
<div id="map" style="width: 100%; height: 400px;"></div>
<!-- 地图容器设置了宽度和高度 -->
</template>
<script>
export default {
name: 'GaodeMap', //
data() {
return {
map: null, //
carMarker: null, //
carPath: null, //
carPosition: { //
longitude: 116.397428, //
latitude: 39.90923, //
},
path: []
};
},
mounted() {
this.initMap(); //
this.createCar(); //
this.startSimulation(); //
},
methods: {
initMap() {
//
this.map = new AMap.Map('map', {
zoom: 15, //
center: [this.carPosition.longitude, this.carPosition.latitude], //
});
this.polyline = new AMap.Polyline({
map: this.map,
path: [],
strokeColor: "#FF0000",
strokeWeight: 5,
});
},
createCar() {
//
const icon = new AMap.Icon({
size: new AMap.Size(50, 50), //
image: 'https://s1.4sai.com/src/img/png/37/3760fd545ff848c2b241b7cf400b3dd7.png?imageView2/2/w/256&e=1735488000&token=1srnZGLKZ0Aqlz6dk7yF4SkiYf4eP-YrEOdM1sob:F5xvrYJwsejuj9uCJhs70CQ7-mg=', //
imageSize: new AMap.Size(50, 50), //
});
this.carMarker = new AMap.Marker({
map: this.map, //
position: [this.carPosition.longitude, this.carPosition.latitude], //
icon: icon, // 使
offset: new AMap.Pixel(-26, -13), //
});
// 线
this.polyline = new AMap.Polyline({
path: this.path,
isOutline: true,
outlineColor: '#000000',
borderWeight: 1,
lineJoin: 'round',
lineCap: 'round',
strokeColor: '#0091ff',
strokeWeight: 6,
// Polyline
});
},
startSimulation() {
// moveCar
setInterval(() => {
this.moveCar();
}, 1000);
},
moveCar() {
//
const newLng = this.carPosition.longitude + 0.001; // 0.001
const newLat = this.carPosition.latitude + 0.001 * Math.random() * 0.5; // 0.00050.001
// carPath
// carPath 使 AMap.Polyline API
// this.carPath.push([newLng, newLat]); // carPath Polyline
this.carMarker.setPosition([newLng, newLat]); //
this.carPosition = { longitude: newLng, latitude: newLat }; //
//
this.path.push(this.carPosition);
//
this.carMarker.setPosition(this.carPosition);
// 线
if (!this.polyline.getMap()) {
this.polyline.setMap(this.map);
}
// 线
this.polyline.setPath(this.path);
},
},
beforeDestroy() {
//
if (this.carPath) {
this.carPath.setMap(null); // carPath Polyline
}
if (this.carMarker) {
this.carMarker.setMap(null); //
}
if (this.map) {
this.map.destroy(); //
}
if (this.polyline) {
this.polyline.setMap(null); // 线
}
},
};
</script>

View File

@ -0,0 +1,200 @@
<template>
<div>
<el-button @click="index()"></el-button>
<el-table :data="specification">
<el-table-column prop="vin" label="车辆标识"></el-table-column>
<el-table-column prop="dataCode" label="数据编码"></el-table-column>
<el-table-column prop="label" label="标签"></el-table-column>
<el-table-column prop="floating" label="浮动数据"></el-table-column>
<el-table-column prop="standardData" label="标准数据"></el-table-column>
<el-table-column prop="radiusName" label="滑窗范围"></el-table-column>
<el-table-column prop="lengthName" label="滑动长度"></el-table-column>
<el-table-column label="操作">
<span slot-scope="scope">
<el-button @click="update(scope.row.id)"></el-button>
<el-button @click="deleteDate(scope.row.id)"></el-button>
</span>
</el-table-column>
</el-table>
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :fication="fication" label-width="80px">
<el-form-item label="指向编码">
<span v-if="form.id != null">
<el-select v-model="form.dateTypeId" placeholder="请选择指向" disabled>
<el-option v-for="daty in dateType2" :key="daty.dateTypeId" :label="daty.label" :value="daty.dateTypeId"></el-option>
</el-select>
</span>
<span v-else>
<el-select v-model="form.dateTypeId" placeholder="请选择指向">
<el-option v-for="daty in dateType" :key="daty.dateTypeId" :label="daty.label" :value="daty.dateTypeId"></el-option>
</el-select>
</span>
</el-form-item>
<el-form-item label="滑窗范围" prop="radiusId">
<el-select v-model="form.radiusId" placeholder="请选择滑窗范围">
<el-option v-for="rad in radius" :key="rad.radiusId" :label="rad.radiusName" :value="rad.radiusId"/>
</el-select>
</el-form-item>
<el-form-item label="滑行长度" prop="lengthId">
<el-select v-model="form.lengthId" placeholder="请选择滑动长度">
<el-option v-for="item in length" :key="item.lengthId" :label="item.lengthName" :value="item.lengthId"/>
</el-select>
</el-form-item>
<el-form-item label="浮动数据" prop="floating">
<el-input v-model="form.floating " placeholder="请输入浮动数据" />
</el-form-item>
<el-form-item label="标准数据" prop="standardData">
<el-input v-model="form.standardData " placeholder="请输入标准数据" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { selectDataSpecificationDev, listRadius, listLength, listDateType, selectDateType, selectDataSpecificationById, indexDataSpecification, updataDataSpecification,deleteDataSpecification } from "@/api/goods/window";
// jsjsjson,
// import from ',
export default {
// import使"
components: {},
props: {},
data() {
// "
return {
vin: this.$route.query.vin,
//
specification: [],
//
length: [],
//
radius: [],
//
dateType: [],
//
dateType2: [],
title: '',//
open: false,//
form: {},
fication: {}
}
},
// data",
computed: {},
// data",
watch: {},
// ",
methods: {
reset() {
//
this.form = {
vin: null,
dataCode: null,
label: null,
standardData: null,
dateTypeId: null,
radiusId: null,
lengthId: null
};
this.resetForm("form");
},
//
getList() {
selectDataSpecificationDev(this.vin).then(res => {
this.specification = res.data
})
listDateType(this.vin).then(res => {
this.dateType = res.data
})
selectDateType().then(res => {
this.dateType2 = res.data
})
listLength().then(res => {
this.length = res.data
})
listRadius().then(res => {
this.radius = res.data
})
},
index() {
this.reset()
this.open = true;
this.title = "新增滑窗规则"
},
update(id) {
this.reset();
selectDataSpecificationById(id).then(res => {
this.form = res.data
this.open = true;
this.title = "报文修改信息"
})
},
//
deleteDate(id) {
deleteDataSpecification(id).then(res => {
console.log(res)
if (res.data>0) {
this.$message.success("成功")
this.getList()
} else {
this.$message.error("失败")
}
})
},
//
cancel() {
this.open = false;
this.reset();
},
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updataDataSpecification(this.form).then(response => {
this.$modal.msgSuccess("修改成功")
this.open = false;
this.getList()
})
} else {
indexDataSpecification(this.form,this.vin).then(res => {
this.$modal.msgSuccess("新增成功")
this.open = false
this.getList()
})
}
}
})
}
},
// - 访this",
created() {
this.getList()
},
// - 访DOM",
mounted() {
},
beforeCreate() {
}, // - ",
beforeMount() {
}, // - ",
beforeUpdate() {
}, // - ",
updated() {
}, // - ",
beforeDestroy() {
}, // - ",
destroyed() {
}, // - ",
activated() {
} // keep-alive",
}
</script>
<style scoped>
</style>

View File

@ -1,287 +0,0 @@
<template>
<div class="app-container">
<el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px">
<el-form-item label="用户名" prop="username">
<el-input
v-model="queryParams.username"
placeholder="请输入用户名"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input
v-model="queryParams.password"
placeholder="请输入密码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="号码" prop="tel">
<el-input
v-model="queryParams.tel"
placeholder="请输入号码"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item label="角色" prop="typeId">
<el-input
v-model="queryParams.typeId"
placeholder="请输入角色"
clearable
@keyup.enter.native="handleQuery"
/>
</el-form-item>
<el-form-item>
<el-button type="primary" icon="el-icon-search" size="mini" @click="handleQuery"></el-button>
<el-button icon="el-icon-refresh" size="mini" @click="resetQuery"></el-button>
</el-form-item>
</el-form>
<el-row :gutter="10" class="mb8">
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['goods:admin:add']"
>新增</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="success"
plain
icon="el-icon-edit"
size="mini"
:disabled="single"
@click="handleUpdate"
v-hasPermi="['goods:admin:edit']"
>修改</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="danger"
plain
icon="el-icon-delete"
size="mini"
:disabled="multiple"
@click="handleDelete"
v-hasPermi="['goods:admin:remove']"
>删除</el-button>
</el-col>
<el-col :span="1.5">
<el-button
type="warning"
plain
icon="el-icon-download"
size="mini"
@click="handleExport"
v-hasPermi="['goods:admin:export']"
>导出</el-button>
</el-col>
<right-toolbar :showSearch.sync="showSearch" @queryTable="getList"></right-toolbar>
</el-row>
<el-table v-loading="loading" :data="adminList" @selection-change="handleSelectionChange">
<el-table-column type="selection" width="55" align="center" />
<el-table-column label="主键" align="center" prop="id" />
<el-table-column label="用户名" align="center" prop="username" />
<el-table-column label="密码" align="center" prop="password" />
<el-table-column label="号码" align="center" prop="tel" />
<el-table-column label="角色" align="center" prop="typeId" />
<el-table-column label="操作" align="center" class-name="small-padding fixed-width">
<template slot-scope="scope">
<el-button
size="mini"
type="text"
icon="el-icon-edit"
@click="handleUpdate(scope.row)"
v-hasPermi="['goods:admin:edit']"
>修改</el-button>
<el-button
size="mini"
type="text"
icon="el-icon-delete"
@click="handleDelete(scope.row)"
v-hasPermi="['goods:admin:remove']"
>删除</el-button>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total>0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="getList"
/>
<!-- 添加或修改测试信息对话框 -->
<el-dialog :title="title" :visible.sync="open" width="500px" append-to-body>
<el-form ref="form" :model="form" :rules="rules" label-width="80px">
<el-form-item label="用户名" prop="username">
<el-input v-model="form.username" placeholder="请输入用户名" />
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input v-model="form.password" placeholder="请输入密码" />
</el-form-item>
<el-form-item label="号码" prop="tel">
<el-input v-model="form.tel" placeholder="请输入号码" />
</el-form-item>
<el-form-item label="角色" prop="typeId">
<el-input v-model="form.typeId" placeholder="请输入角色" />
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="submitForm"> </el-button>
<el-button @click="cancel"> </el-button>
</div>
</el-dialog>
</div>
</template>
<script>
import { listAdmin, getAdmin, delAdmin, addAdmin, updateAdmin } from "@/api/goods/admin";
export default {
name: "Admin",
data() {
return {
//
loading: true,
//
ids: [],
//
single: true,
//
multiple: true,
//
showSearch: true,
//
total: 0,
//
adminList: [],
//
title: "",
//
open: false,
//
queryParams: {
pageNum: 1,
pageSize: 10,
username: null,
password: null,
tel: null,
typeId: null
},
//
form: {},
//
rules: {
}
};
},
created() {
this.getList();
},
methods: {
/** 查询测试信息列表 */
getList() {
this.loading = true;
listAdmin(this.queryParams).then(response => {
this.adminList = response.rows;
this.total = response.total;
this.loading = false;
});
},
//
cancel() {
this.open = false;
this.reset();
},
//
reset() {
this.form = {
id: null,
username: null,
password: null,
tel: null,
typeId: null
};
this.resetForm("form");
},
/** 搜索按钮操作 */
handleQuery() {
this.queryParams.pageNum = 1;
this.getList();
},
/** 重置按钮操作 */
resetQuery() {
this.resetForm("queryForm");
this.handleQuery();
},
//
handleSelectionChange(selection) {
this.ids = selection.map(item => item.id)
this.single = selection.length!==1
this.multiple = !selection.length
},
/** 新增按钮操作 */
handleAdd() {
this.reset();
this.open = true;
this.title = "添加测试信息";
},
/** 修改按钮操作 */
handleUpdate(row) {
this.reset();
const id = row.id || this.ids
getAdmin(id).then(response => {
this.form = response.data;
this.open = true;
this.title = "修改测试信息";
});
},
/** 提交按钮 */
submitForm() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.id != null) {
updateAdmin(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addAdmin(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
/** 删除按钮操作 */
handleDelete(row) {
const ids = row.id || this.ids;
this.$modal.confirm('是否确认删除测试信息编号为"' + ids + '"的数据项?').then(function() {
return delAdmin(ids);
}).then(() => {
this.getList();
this.$modal.msgSuccess("删除成功");
}).catch(() => {});
},
/** 导出按钮操作 */
handleExport() {
this.download('goods/admin/export', {
...this.queryParams
}, `admin_${new Date().getTime()}.xlsx`)
}
}
};
</script>

View File

@ -1,883 +1,9 @@
<template>
<div class="app-container home">
<el-row :gutter="20">
<el-col :lg="24" :sm="24">
<blockquote class="text-warning" style="font-size: 14px">
领取阿里云通用云产品1888优惠券
<br/>
<el-link
href="https://www.aliyun.com/minisite/goods?userCode=brki8iof"
target="_blank"
type="primary"
>https://www.aliyun.com/minisite/goods?userCode=brki8iof
</el-link
>
<br/>
领取腾讯云通用云产品2860优惠券
<br/>
<el-link
href="https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console"
target="_blank"
type="primary"
>https://cloud.tencent.com/redirect.php?redirect=1025&cps_key=198c8df2ed259157187173bc7f4f32fd&from=console
</el-link
>
<br/>
阿里云服务器折扣区
<el-link href="http://aly.muyu.vip" target="_blank" type="primary"
>>点我进入
</el-link
>
&nbsp;&nbsp;&nbsp; 腾讯云服务器秒杀区
<el-link href="http://txy.muyu.vip" target="_blank" type="primary"
>>点我进入
</el-link
>
<br/>
<h4 class="text-danger">
云产品通用红包可叠加官网常规优惠使用(仅限新用户)
</h4>
</blockquote>
<hr/>
</el-col>
</el-row>
<el-row :gutter="20">
<el-col :lg="12" :sm="24" style="padding-left: 20px">
<h2>若依后台管理框架</h2>
<p>
一直想做一款后台管理系统看了很多优秀的开源项目但是发现没有合适自己的于是利用空闲休息时间开始自己写一套后台系统如此有了若依管理系统她可以用于所有的Web应用程序如网站管理后台网站会员中心CMSCRMOA等等当然您也可以对她进行深度定制以做出更强系统所有前端后台代码封装过后十分精简易上手出错概率低同时支持移动客户端访问系统会陆续更新一些实用功能
</p>
<p>
<b>当前版本:</b> <span>v{{ version }}</span>
</p>
<p>
<el-tag type="danger">&yen;免费开源</el-tag>
</p>
<p>
<el-button
icon="el-icon-cloudy"
plain
size="mini"
type="primary"
@click="goTarget('https://gitee.com/y_project/MuYu-Cloud')"
>访问码云
</el-button
>
<el-button
icon="el-icon-s-home"
plain
size="mini"
@click="goTarget('http://muyu.vip')"
>访问主页
</el-button
>
</p>
</el-col>
<el-col :lg="12" :sm="24" style="padding-left: 50px">
<el-row>
<el-col :span="12">
<h2>技术选型</h2>
</el-col>
</el-row>
<el-row>
<el-col :span="6">
<h4>后端技术</h4>
<ul>
<li>SpringBoot</li>
<li>SpringCloud</li>
<li>Nacos</li>
<li>Sentinel</li>
<li>Seata</li>
<li>Minio</li>
<li>...</li>
</ul>
</el-col>
<el-col :span="6">
<h4>前端技术</h4>
<ul>
<li>Vue</li>
<li>Vuex</li>
<li>Element-ui</li>
<li>Axios</li>
<li>Echarts</li>
<li>Quill</li>
<li>...</li>
</ul>
</el-col>
</el-row>
</el-col>
</el-row>
<el-divider/>
<el-row :gutter="20">
<el-col :lg="8" :md="12" :sm="24" :xs="24">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>联系信息</span>
</div>
<div class="body">
<p>
<i class="el-icon-s-promotion"></i> 官网
<el-link
href="http://www.muyu.vip"
target="_blank"
>http://www.muyu.vip
</el-link
>
</p>
<p>
<i class="el-icon-user-solid"></i> QQ群 <s> 满42799195 </s> <s> 满170157040 </s>
<s> 满130643120 </s> <s> 满225920371 </s> <s> 满201705537 </s> <s> 满236543183 </s>
<s> 满213618602 </s> <s> 满148794840 </s> <s> 满118752664 </s> <s> 满101038945</s>
<a
href="http://qm.qq.com/cgi-bin/qm/qr?_wv=1027&k=pHuELvQ01AXiVC_CH9HNq-hL6qd6EbIb&authKey=k5nCvwTnimKrFBbJpFEfaQabjBHzZhMAbvsZAjAXiOIekreMrmJzjjTVuoMsZgB%2F&noverify=0&group_code=128355254"
target="_blank"
>128355254</a
>
</p>
<p>
<i class="el-icon-chat-dot-round"></i> 微信<a
href="javascript:"
>/ *</a
>
</p>
<p>
<i class="el-icon-money"></i> 支付宝<a
class="支付宝信息"
href="javascript:"
>/ *</a
>
</p>
</div>
</el-card>
</el-col>
<el-col :lg="8" :md="12" :sm="24" :xs="24">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>更新日志</span>
</div>
<el-collapse accordion>
<el-collapse-item title="v3.6.3 - 2023-07-07">
<ol>
<li>支持登录IP黑名单限制</li>
<li>操作日志新增消耗时间属性</li>
<li>屏蔽定时任务bean违规的字符</li>
<li>日志管理使用索引提升查询性能</li>
<li>日志注解支持排除指定的请求参数</li>
<li>支持自定义隐藏属性列过滤子对象</li>
<li>升级spring-boot到最新版本2.7.13</li>
<li>升级spring-cloud到最新版2021.0.8</li>
<li>升级spring-cloud-alibaba到最新版2021.0.5.0</li>
<li>升级druid到最新版本1.2.16</li>
<li>升级fastjson到最新版2.0.34</li>
<li>升级pagehelper到最新版1.4.7</li>
<li>升级transmittable-thread-local到最新版本2.14.3</li>
<li>升级element-ui到最新版本2.15.13</li>
<li>移除apache/commons-fileupload依赖</li>
<li>修复页面切换时布局错乱的问题</li>
<li>修复用户多角色数据权限可能出现权限抬升的情况</li>
<li>修复导入用户时无法更新存在用户数据的问题</li>
<li>修复开启TopNav后一级菜单路由参数设置无效问题</li>
<li>优化文件下载出现的异常</li>
<li>优化选择图标组件高亮回显</li>
<li>优化修改密码日志存储明文问题</li>
<li>优化排序属性orderBy参数限制长度</li>
<li>优化页签栏关闭其他出现的异常问题</li>
<li>优化页签关闭左侧选项排除首页选项</li>
<li>优化关闭当前tab页跳转最右侧tab页</li>
<li>优化文件上传服务关闭InputStream</li>
<li>优化页签在Firefox浏览器被遮挡的问题</li>
<li>优化侧边栏的平台标题与VUE_APP_TITLE保持同步</li>
<li>优化DictTag组件value没有匹配的值时则展示value</li>
<li>优化去除@EnableCustomSwagger注解后会启动失败问题</li>
<li>优化upload接口在文件过大和文件名过长的情况返回提示信息</li>
<li>优化异步保存日志发生报错不进RemoteLogFallbackFactory问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.6.2 - 2023-01-16">
<ol>
<li>重置时取消部门选中</li>
<li>新增返回警告消息提示</li>
<li>忽略不必要的属性数据返回</li>
<li>修改参数键名时移除前缓存配置</li>
<li>开启TopNav没有子菜单隐藏侧边栏</li>
<li>删除fuse无效选项maxPatternLength</li>
<li>兼容Excel下拉框内容过多无法显示的问题</li>
<li>修复文件上传组件格式验证问题</li>
<li>修复回显数据字典数组异常问题</li>
<li>修复sheet超出最大行数异常问题</li>
<li>修复Log注解GET请求记录不到参数问题</li>
<li>修复gateway流控规则生效但不显示问题</li>
<li>修复主题颜色在Drawer组件不会加载问题</li>
<li>修复调度日志点击多次数据不变化的问题</li>
<li>修复用户编辑时角色和部门存在无法修改情况</li>
<li>修复使用透明底png图片时自动填充黑色背景</li>
<li>修复table中更多按钮切换主题色未生效修复问题</li>
<li>修复某些特性的环境生成代码变乱码TXT文件问题</li>
<li>修复代码生成图片/文件/单选时选择必填无法校验问题</li>
<li>升级spring-cloud到最新版2021.0.5</li>
<li>升级spring-boot到最新版本2.7.7</li>
<li>升级spring-boot-admin到最新版2.7.10</li>
<li>升级kaptcha到最新版2.3.3</li>
<li>升级druid到最新版本1.2.15</li>
<li>升级fastjson到最新版2.0.22</li>
<li>升级pagehelper到最新版1.4.6</li>
<li>升级transmittable-thread-local到最新版本2.14.2</li>
<li>升级echarts到最新版本5.4.0</li>
<li>升级core-js到最新版本3.25.3</li>
<li>升级element-ui到最新版本2.15.12</li>
<li>移除commons-collections多余的依赖</li>
<li>优化弹窗内容过多展示不全问题</li>
<li>优化导出对象的子列表为空会出现[]问题</li>
<li>优化字符未使用下划线不进行驼峰式处理</li>
<li>优化nacos修改xss开关时同步过滤器验证</li>
<li>优化修改头像在小屏幕上页面布局错位的问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.6.1 - 2022-10-01">
<ol>
<li>数据逻辑删除不进行唯一验证</li>
<li>支持多权限字符匹配角色数据权限</li>
<li>页面内嵌iframe切换tab不刷新数据</li>
<li>新增密码最大错误次数/锁定时间</li>
<li>登录日志新增解锁账户功能</li>
<li>通用下载方法新增config配置选项</li>
<li>操作日志记录支持排除敏感属性字段</li>
<li>Excel注解支持导出对象的子列表方法</li>
<li>Excel注解支持自定义隐藏属性列</li>
<li>Excel注解支持backgroundColor属性设置背景色</li>
<li>升级spring-cloud-alibaba到最新版2021.0.4.0</li>
<li>升级spring-cloud到最新版2021.0.4</li>
<li>升级spring-boot到最新版本2.7.3</li>
<li>升级spring-boot-admin到最新版2.7.5</li>
<li>升级seata到最新版1.5.2</li>
<li>升级druid到最新版本1.2.12</li>
<li>升级fastjson到最新版2.0.14</li>
<li>升级pagehelper到最新版1.4.5</li>
<li>升级core-js到最新版本3.25.2</li>
<li>升级dynamic-ds到最新版本3.5.2</li>
<li>升级element-ui到最新版本2.15.10</li>
<li>修复多文件上传报错出现的异常问题</li>
<li>修复图片预览组件src属性为null值控制台报错问题</li>
<li>修复使用FastDFS上传头像失败提示文件名没有后缀问题</li>
<li>优化seata单独依赖模块</li>
<li>优化任务过期不执行调度</li>
<li>优化字典数据使用store存取</li>
<li>优化代码生成同步后值NULL问题</li>
<li>优化定时任务支持执行父类方法</li>
<li>优化修改资料头像被覆盖的问题</li>
<li>优化修改用户登录账号重复验证</li>
<li>优化用户个人信息接口防止修改部门</li>
<li>优化布局设置使用el-drawer抽屉显示</li>
<li>优化日志注解记录限制请求地址的长度</li>
<li>优化导入更新用户数据前校验数据权限</li>
<li>优化excel/scale属性导出单元格数值类型</li>
<li>优化日志操作中重置按钮时重复查询的问题</li>
<li>优化多个相同角色数据导致权限SQL重复问题</li>
<li>优化表格上右侧工具条搜索按钮显隐&右侧样式凸出</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.6.0 - 2022-07-16">
<ol>
<li>Excel注解支持color字体颜色</li>
<li>用户头像上传限制只能为图片格式</li>
<li>检查定时任务bean所在包名是否为白名单配置</li>
<li>字典类型必须以字母开头且只能为小写字母数字下滑线</li>
<li>升级spring-cloud-alibaba到最新版2021.0.1.0</li>
<li>升级spring-cloud到最新版2021.0.3</li>
<li>升级spring-boot到最新版本2.7.1</li>
<li>升级spring-boot-admin到最新版2.7.2</li>
<li>升级seata到最新版1.5.1</li>
<li>升级pagehelper到最新版1.4.3</li>
<li>升级dynamic-ds到最新版本3.5.1</li>
<li>升级fastjson到最新版2.0.9</li>
<li>升级druid到最新版本1.2.11</li>
<li>升级transmittable-thread-local到最新版本2.13.2</li>
<li>升级element-ui到最新版本2.15.9</li>
<li>修复字典数据显示不全问题</li>
<li>修复操作日志查询类型条件为0时会查到所有数据</li>
<li>优化验证码开关变量名</li>
<li>优化设置分页参数默认值</li>
<li>优化对空字符串参数处理的过滤</li>
<li>优化Maven使用阿里云镜像站加速</li>
<li>优化用户列表查询不显示密码字段</li>
<li>优化表单构建按钮不显示正则校验</li>
<li>优化字典类型删除多余的mapper注解</li>
<li>优化字典数据回显样式下拉框显示值</li>
<li>优化用户管理左侧树型组件增加选中高亮保持</li>
<li>优化新增用户与角色信息&用户与岗位信息逻辑</li>
<li>优化数据监控Spring Security权限认证过时代码</li>
<li>优化岗位长主键溢出问题将查询返回类型改为Long</li>
<li>优化删除无用admin-client依赖声明避免造成误解</li>
<li>优化默认不启用压缩文件缓存防止node_modules过大</li>
<li>优化获取body请求数据缓存过滤器CacheRequestFilter</li>
<li>优化网关通过注解解决循环引用及Bean重复问题删除allow配置</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.5.0 - 2022-04-11">
<ol>
<li>开启TopNav没有子菜单情况隐藏侧边栏</li>
<li>侧边栏菜单名称过长悬停显示标题</li>
<li>用户访问控制时校验数据权限防止越权</li>
<li>导出Excel时屏蔽公式防止CSV注入风险</li>
<li>组件ImageUpload支持多图同时选择上传</li>
<li>组件FileUpload支持多文件同时选择上传</li>
<li>代码生成树表新增(展开/折叠)</li>
<li>代码生成子表支持日期/字典配置</li>
<li>代码生成编辑修改打开新页签</li>
<li>添加页签openPage支持传递参数</li>
<li>添加清理分页的线程变量方法</li>
<li>修改npm即将过期的注册源地址</li>
<li>用户缓存信息添加部门ancestors祖级列表</li>
<li>升级spring-cloud到最新版2021.0.1</li>
<li>升级spring-boot到最新版本2.6.6</li>
<li>升级spring-boot-admin到最新版2.6.6</li>
<li>升级spring-boot-mybatis到最新版2.2.2</li>
<li>降级jsencrypt版本兼容IE浏览器</li>
<li>修复分页组件请求两次问题</li>
<li>修复表单清除元素位置未垂直居中问题</li>
<li>修复Excel注解prompt/combo同时使用不生效问题</li>
<li>修复导入Excel时字典字段类型为Long转义为空问题</li>
<li>修复登录超时刷新页面跳转登录页面还提示重新登录问题</li>
<li>修复Xss注解字段值为空时的异常问题</li>
<li>优化IP地址获取到多个的问题</li>
<li>优化文件上传兼容Weblogic环境</li>
<li>代码生成同步保留必填/类型选项</li>
<li>优化Excel格式化不同类型的日期对象</li>
<li>优化菜单表关键字导致的插件报错问题</li>
<li>优化Oracle用户头像列为空时不显示问题</li>
<li>优化页面若未匹配到字典标签则返回原字典值</li>
<li>优化修复登录失效后多次请求提示多次弹窗问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.4.0 - 2022-01-24">
<ol>
<li>新增Vue3前端代码生成模板</li>
<li>新增图片预览组件</li>
<li>新增压缩插件实现打包Gzip</li>
<li>新增docker一键复制的脚本</li>
<li>自定义xss校验注解实现</li>
<li>路由支持单独配置菜单或角色权限</li>
<li>前端支持设置是否需要防止数据重复提交</li>
<li>预览组件支持多图显示</li>
<li>代码生成列表图片支持预览</li>
<li>代码生成新增Java类型Boolean</li>
<li>定时任务目标字符串过滤特殊字符</li>
<li>定时任务目标字符串验证包名白名单</li>
<li>升级nacos到最新版2.0.4</li>
<li>升级spring-cloud到最新版2021.0.0</li>
<li>升级spring-boot到最新版本2.6.3</li>
<li>升级spring-boot-admin到最新版2.6.1</li>
<li>升级pagehelper到最新版1.4.1</li>
<li>升级fastjson到最新版1.2.79</li>
<li>SQL工具类新增检查关键字方法</li>
<li>修复打包后字体图标偶现的乱码问题</li>
<li>修复版本差异导致的懒加载报错问题</li>
<li>修复选项卡点击右键刷新丢失参数问题</li>
<li>修复登录失效后多次请求提示多次弹窗问题</li>
<li>优化加载字典缓存数据</li>
<li>优化代码生成同步更新字段</li>
<li>优化代码生成字典组重复问题</li>
<li>优化空值不进行回显数据字典</li>
<li>优化用户导入提示溢出则显示滚动条</li>
<li>优化定时任务cron表达式小时设置24</li>
<li>优化部门修改缩放后出现的错位问题</li>
<li>优化分页方法设置成通用方便灵活调用</li>
<li>优化用户管理部门查询选择节点后分页参数初始</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.3.0 - 2021-12-13">
<ol>
<li>新增配套并同步的Vue3前端版本</li>
<li>新增认证对象简化权限验证</li>
<li>新增tab对象简化页签操作</li>
<li>修改获取缓存信息方式</li>
<li>修改权限认证注解实现</li>
<li>自定义文字复制剪贴指令</li>
<li>升级axios到最新版本0.24.0</li>
<li>升级core-js到最新版本3.19.1</li>
<li>升级jsencrypt到最新版本3.2.1</li>
<li>升级js-cookie到最新版本3.0.1</li>
<li>升级clipboard到最新版本2.0.8</li>
<li>升级velocity到最新版本2.3</li>
<li>升级spring-boot到最新版本2.5.6</li>
<li>升级spring-boot-admin到最新版2.5.4</li>
<li>升级dynamic-ds到最新版本3.5.0</li>
<li>代码生成预览支持复制内容</li>
<li>修复五级以上菜单出现的404问题</li>
<li>生产环境使用路由懒加载提升页面响应速度</li>
<li>任务屏蔽违规字符&参数忽略双引号中的逗号</li>
<li>优化用户个人信息接口防止修改用户名</li>
<li>优化登录/验证码请求headers不设置token</li>
<li>优化注册成功提示消息类型success</li>
<li>优化下载解析blob响应是否登录失效</li>
<li>修复字符串无法被反转义问题</li>
<li>修复响应体过大出现的乱码问题</li>
<li>修复回显数据字典组的键值错误</li>
<li>修复代码生成复选框字典遗漏问题</li>
<li>修复代码生成模板主子表删除缺少事务</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.2.0 - 2021-10-12">
<ol>
<li>菜单管理支持配置路由参数</li>
<li>定时任务支持在线生成cron表达式</li>
<li>自定义弹层溢出滚动样式</li>
<li>自定义可拖动弹窗宽度指令</li>
<li>自定义可拖动弹窗高度指令</li>
<li>修改时检查用户数据权限范围</li>
<li>修复保存配置主题颜色失效问题</li>
<li>新增暗色菜单风格主题</li>
<li>菜单&部门新增展开/折叠功能</li>
<li>页签新增关闭左侧&添加图标</li>
<li>代码生成主子表多选行数据</li>
<li>日期范围支持添加多组</li>
<li>Excel导入支持@Excels注解</li>
<li>Excel注解支持导入导出标题信息</li>
<li>Excel注解支持自定义数据处理器</li>
<li>日志注解新增是否保存响应参数</li>
<li>定时任务对检查异常进行事务回滚</li>
<li>补充定时任务表字段注释</li>
<li>定时任务屏蔽ldap远程调用</li>
<li>新增通用方法简化下载使用</li>
<li>新增通用方法简化模态/缓存使用</li>
<li>新增data-dict组件简化数据字典使用</li>
<li>禁用dict-tag组件的渐变动画</li>
<li>默认首页使用keep-alive缓存</li>
<li>升级springcloud到最新版2020.0.4</li>
<li>升级spring-boot到最新版本2.5.5</li>
<li>升级spring-boot-admin到最新版2.5.2</li>
<li>升级pagehelper到最新版1.4.0</li>
<li>升级fastjson到最新版1.2.78</li>
<li>升级druid到最新版1.2.8</li>
<li>升级element-ui到最新版本2.15.6</li>
<li>升级sass-loader到最新版本10.1.1</li>
<li>升级dart-sass到版本1.32.13</li>
<li>升级file-saver到最新版本2.0.5</li>
<li>优化异常处理信息</li>
<li>验证码默认20s超时</li>
<li>优化代码生成导入表按创建时间排序</li>
<li>优化代码生成点击预览重置激活tab</li>
<li>修复主子表代码模板方法名错误问题</li>
<li>修复xss过滤后格式出现的异常</li>
<li>修复多图组件验证失败被删除问题</li>
<li>请求参数新增reasonable分页合理化属性</li>
<li>修复代码生成页面数据编辑保存之后总是跳转第一页的问题</li>
<li>修复带safari浏览器无法格式化utc日期格式yyyy-MM-dd'T'HH:mm:ss.SSS问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.1.0 - 2021-08-02">
<ol>
<li>支持配置XSS跨站脚本过滤</li>
<li>支持配置验证码开关&类型</li>
<li>新增是否开启用户注册功能</li>
<li>用户管理新增分配角色功能</li>
<li>角色管理新增分配用户功能</li>
<li>系统布局配置支持动态标题开关</li>
<li>增加字典标签样式回显dict组件</li>
<li>FileUpload组件支持多文件上传</li>
<li>ImageUpload组件支持多图片上传</li>
<li>封装通用iframe组件</li>
<li>菜单路由配置支持内链访问</li>
<li>全局注册通用组件</li>
<li>富文本默认上传返回url类型</li>
<li>富文本新增上传文件大小限制</li>
<li>增加自定义弹窗拖拽指令</li>
<li>顶部菜单排除隐藏的默认路由</li>
<li>跳转路由高亮相对应的菜单栏</li>
<li>日志列表支持排序操作</li>
<li>分页组件新增pagerCount属性</li>
<li>定时任务屏蔽http(s)远程调用</li>
<li>文件服务本地资源允许跨域访问</li>
<li>升级spring-boot到最新版本2.5.3</li>
<li>升级spring-boot-admin到最新版2.4.3</li>
<li>升级spring-boot-mybatis到最新版2.2.0</li>
<li>升级nacos到最新版2.0.3</li>
<li>升级pagehelper到最新版1.3.1</li>
<li>升级minio到最新版本8.2.2</li>
<li>升级tobato到最新版本1.27.2</li>
<li>升级dynamic-ds到最新版本3.4.1</li>
<li>升级commons.io到最新版本v2.11.0</li>
<li>升级common-pool到最新版本2.10.0</li>
<li>升级commons.fileupload到最新版本v1.4</li>
<li>升级element-ui到最新版本2.15.3</li>
<li>优化统一网关错误码响应</li>
<li>修复导出含params属性对象参数问题</li>
<li>修复任意账户越权问题</li>
<li>修复定时任务日志执行状态显示</li>
<li>修改登录失效返回值code401</li>
<li>用户信息长度校验限制</li>
<li>角色&菜单新增字段属性提示信息</li>
<li>修复用户搜索分页变量错误</li>
<li>优化部门父级启用状态</li>
<li>启用部门状态排除顶级节点</li>
<li>定时任务新增更多操作</li>
<li>优化代码生成模板</li>
<li>优化顶部菜单显示样式</li>
<li>优化导入用户显示样式</li>
<li>优化用户不能删除自己</li>
<li>密码框新增显示切换密码图标</li>
<li>BLOB下载时清除URL对象引用</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v3.0.0 - 2021-06-10">
<ol>
<li>新增菜单导航显示风格TopNavfalse为左侧导航菜单true为顶部导航菜单</li>
<li>布局设置支持保存&重置配置</li>
<li>富文本编辑器支持自定义上传地址</li>
<li>富文本编辑组件新增readOnly属性</li>
<li>优化参数&字典缓存操作</li>
<li>新增IE浏览器版本过低提示页面</li>
<li>页签TagsView新增关闭右侧功能</li>
<li>显隐列组件加载初始默认隐藏列</li>
<li>关闭头像上传窗口还原默认图片</li>
<li>个人信息添加手机&邮箱重复验证</li>
<li>代码生成模板树表操作列添加新增按钮</li>
<li>代码生成模板修复主子表字段重名问题</li>
<li>支持docker部署项目</li>
<li>升级springcloud到最新版2020.0.3</li>
<li>升级spring-boot-alibaba到最新版2021.1</li>
<li>升级nacos到最新版2.0.1 性能提升</li>
<li>升级spring-boot到最新版本2.5.0</li>
<li>升级spring-boot-admin到最新版2.4.1</li>
<li>升级swagger到最新版本3.0.0</li>
<li>升级mybatis到最新版3.5.6</li>
<li>升级dynamic-ds到最新版本3.3.2</li>
<li>升级minio到最新版本8.2.1</li>
<li>升级fastjson到最新版1.2.76</li>
<li>升级druid到最新版本v1.2.6</li>
<li>修复四级菜单无法显示问题</li>
<li>修复树表数据显示不全&加载慢问题</li>
<li>修复关闭confirm提示框控制台报错问题</li>
<li>上传媒体类型添加视频格式</li>
<li>增加feign客户端IP头部信息</li>
<li>修复两处存在SQL注入漏洞问题</li>
<li>优化图片工具类读取文件防止异常</li>
<li>修复导出角色数据范围翻译缺少仅本人</li>
<li>修复表单构建选择下拉选择控制台报错问题</li>
<li>修复请求形参未传值记录日志异常问题</li>
<li>调整sql默认为当前时间</li>
<li>修改ip字段长度防止ipv6地址长度不够</li>
<li>删除操作日志记录信息</li>
<li>修复firefox下表单构建拖拽会新打卡一个选项卡</li>
<li>用户&角色单条删除时使其逻辑删除</li>
<li>优化树表代码生成模板</li>
<li>修正通知公告日志记录类型</li>
<li>修正后端导入表权限标识</li>
<li>过滤BindingResult对象防止异常</li>
<li>Redis设置HashKey序列化</li>
<li>优化Excel导入增加空行判断</li>
<li>树级结构更新子节点使用replaceFirst</li>
<li>富文本工具栏配置视频</li>
<li>修正模板字符编码</li>
<li>优化通用下载完成后删除节点</li>
<li>角色非自定义权限范围清空选择值</li>
<li>修改主题后mini类型按钮无效问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.5.0 - 2021-02-02">
<ol>
<li>增加分布式事务seata支持</li>
<li>代码生成模板支持主子表</li>
<li>表格右侧工具栏组件支持显隐列</li>
<li>图片组件添加预览&移除功能</li>
<li>Excel注解支持Image图片导出</li>
<li>操作按钮组调整为朴素按钮样式</li>
<li>代码生成支持文件上传组件</li>
<li>代码生成日期控件区分范围</li>
<li>代码生成数据库文本类型生成表单文本域</li>
<li>用户手机邮箱&菜单组件修改允许空字符串</li>
<li>修复header获取username中文情况下乱码</li>
<li>修复角色管理-编辑角色-功能权限显示异常</li>
<li>修正操作日志删除接口路径</li>
<li>修复IE11浏览器报错问题</li>
<li>修复sentinel流量告警前端不响应</li>
<li>修正侧边栏静态路由丢失问题</li>
<li>修复导入数据为负浮点数时丢失精度问题</li>
<li>修复Get请求参数特殊值无法正确的传参</li>
<li>更换过期的共享配置属性</li>
<li>添加启动执行脚本</li>
<li>升级element-ui到最新版本2.15.0</li>
<li>升级spring-boot到最新版本2.3.7</li>
<li>升级spring-cloud到Hoxton.SR9</li>
<li>升级spring-boot-alibaba到最新版2.2.5</li>
<li>升级spring-boot-admin到最新版2.3.1</li>
<li>升级druid到最新版本v1.2.4</li>
<li>升级fastjson到最新版1.2.75</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.4.0 - 2020-12-22">
<ol>
<li>增加分布式文件Minio支持</li>
<li>支持多数据源切换</li>
<li>修复多级菜单之间切换无法缓存的问题</li>
<li>三级菜单自动配置组件</li>
<li>支持主题风格配置</li>
<li>服务之间feign调用传递用户信息</li>
<li>删除用户和角色解绑关联</li>
<li>去除用户手机邮箱部门必填验证</li>
<li>代码生成预览支持高亮显示</li>
<li>获取请求token方法移至权限工具类</li>
<li>代码生成预览提供滚动机制</li>
<li>权限工具类增加管理员判断</li>
<li>日志记录增加过滤多文件场景</li>
<li>修改用户头像预览宽高</li>
<li>Excel支持注解align对齐方式</li>
<li>项目添加robots.txt 防止系统被搜索引擎收录</li>
<li>移除path-to-regexp正则匹配插件</li>
<li>修改Set可能导致嵌套的问题</li>
<li>调整代码生成页列宽</li>
<li>回显数据字典防止空值报错</li>
<li>支持get请求映射params参数</li>
<li>登录后push添加catch防止出现检查错误</li>
<li>防止安全扫描YUI出现的风险提示</li>
<li>代码生成删除多余的数字float类型</li>
<li>Excel支持导入Boolean型数据</li>
<li>修正转换字符串的目标字符集属性</li>
<li>删除多余的依赖</li>
<li>修改node-sass为dart-sass</li>
<li>升级poi到最新版本4.1.2</li>
<li>升级axios到最新版本0.21.0</li>
<li>升级element-ui到最新版本2.14.1</li>
<li>升级vue到最新版本2.6.12</li>
<li>升级vuex到最新版本3.6.0</li>
<li>升级vue-cli到版本4.5.9</li>
<li>升级vue-router到最新版本3.4.9</li>
<li>升级vue-cli到最新版本4.4.6</li>
<li>升级vue-cropper到最新版本0.5.5</li>
<li>升级clipboard到最新版本2.0.6</li>
<li>升级core-js到最新版本3.8.1</li>
<li>升级echarts到最新版本4.9.0</li>
<li>升级file-saver到最新版本2.0.4</li>
<li>升级fuse.js到最新版本6.4.3</li>
<li>升级js-beautify到最新版本1.13.0</li>
<li>升级js-cookie到最新版本2.2.1</li>
<li>升级path-to-regexp到最新版本6.2.0</li>
<li>升级quill到最新版本1.3.7</li>
<li>升级screenfull到最新版本5.0.2</li>
<li>升级sortablejs到最新版本1.10.2</li>
<li>升级vuedraggable到最新版本2.24.3</li>
<li>升级chalk到最新版本4.1.0</li>
<li>升级eslint到最新版本7.15.0</li>
<li>升级eslint-plugin-vue到最新版本7.2.0</li>
<li>升级lint-staged到最新版本10.5.3</li>
<li>升级runjs到最新版本4.4.2</li>
<li>升级sass-loader到最新版本10.1.0</li>
<li>升级script-ext-html-webpack-plugin到最新版本2.1.5</li>
<li>升级svg-sprite-loader到最新版本5.1.1</li>
<li>升级vue-template-compiler到最新版本2.6.12</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.3.0 - 2020-11-20">
<ol>
<li>新增文件服务应用支持本地FastDFS</li>
<li>优化头像样式鼠标移入悬停遮罩</li>
<li>AjaxResult重写put方法以方便链式调用</li>
<li>代码生成支持上传控件</li>
<li>新增图片上传组件</li>
<li>支持用户头像更新</li>
<li>调整默认首页</li>
<li>角色权限验证hasRole匹配改为equals</li>
<li>修正数组权限为空判断</li>
<li>修正注释选中节点和半选节点获取</li>
<li>升级pagehelper到最新版1.3.0</li>
<li>升级fastjson到最新版1.2.74</li>
<li>修正定时任务执行一次权限标识</li>
<li>修复页签关闭所有固定标签路由不刷新问题</li>
<li>表单构建布局型组件新增按钮</li>
<li>调整日志路径到模块目录</li>
<li>修正菜单提示信息错误</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.2.0 - 2020-10-10">
<ol>
<li>移除 OAuth2 改为 Redis</li>
<li>升级SpringCloud到最新版本Hoxton.SR8</li>
<li>升级SpringCloud Alibaba到最新版本2.2.3</li>
<li>升级SpringBoot Admin到最新版本2.3.0</li>
<li>升级Fastjson到最新版1.2.73</li>
<li>新增在线用户会话管理</li>
<li>修改用户个人资料/密码同步缓存信息</li>
<li>修复前端通用导出方法参数传值请求方式问题</li>
<li>菜单新增是否缓存keep-alive</li>
<li>菜单&数据权限新增展开/折叠 全选/全不选 父子联动</li>
<li>Job与Gen模块增加Redis默认配置</li>
<li>新增表格右侧工具栏组件right-toolbar</li>
<li>代码生成支持同步数据库</li>
<li>代码生成支持富文本控件</li>
<li>代码生成树模板去掉多余双引号</li>
<li>代码生成添加select必填选项</li>
<li>代码生成页面时不忽略remark属性</li>
<li>修复代码生成下载路径错误</li>
<li>左侧菜单文字过长显示省略号</li>
<li>表格操作列间距调整</li>
<li>Excel注解支持自动统计数据总和</li>
<li>Excel注解支持设置BigDecimal精度&舍入规则</li>
<li>导入Excel整形值校验优化</li>
<li>导出Excel类型NUMERIC支持精度浮点类型</li>
<li>导出Excel调整targetAttr获取值方法防止get方法不规范</li>
<li>Token续期调整为后端刷新</li>
<li>Token设置默认有效期时长12小时</li>
<li>网关白名单放入nacos配置&支持模糊匹配</li>
<li>修复富文本工具栏样式不对齐问题</li>
<li>Editor组件优化支持自定义高度&图片冲突问题</li>
<li>
修复富文本空格和缩进保存后不生效问题&删除重复的placeholder
</li>
<li>限制系统内置参数不允许删除</li>
<li>修正调用目标字符串最大长度</li>
<li>修改自定义权限实现</li>
<li>优化递归菜单&部门子节点</li>
<li>修改sass为node-sass避免el-icon图标乱码</li>
<li>修复根节点为子部门时树状结构显示问题</li>
<li>全局异常状态汉化拦截处理</li>
<li>唯一限制条件只返回单条数据</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.1.0 - 2020-08-02">
<ol>
<li>表格工具栏右侧添加刷新&显隐查询栏</li>
<li>OAuth自动刷新续签Token</li>
<li>网关支持黑名单配置</li>
<li>权限配置自动注册</li>
<li>Feign配置自动注册</li>
<li>代码生成支持选择上级菜单</li>
<li>代码生成支持复选框</li>
<li>代码生成支持自定义路径</li>
<li>验证码类型支持数组计算字符验证</li>
<li>Excel支持sort导出排序</li>
<li>Excel支持分割字符串组内容</li>
<li>excel 导入数字不需要格式化 导入允许列和属性个数不一致</li>
<li>新增菜单默认主类目</li>
<li>升级vue-cli版本到4.4.4</li>
<li>修改 node-sass dart-sass</li>
<li>升级element-ui版本到2.13.2</li>
<li>删除babel提高编译速度</li>
<li>修复验证码异常时network面板的中文会出现乱码问题</li>
<li>修复 utils/index.js 中不包含 parseTime 函数的 bug</li>
<li>优化selectDictLabel方法数组迭代器换为some</li>
<li>修复客户端模式认证会出现错误</li>
<li>检查字符支持小数点&降级改成异常提醒</li>
<li>定时任务添加cron表达式验证</li>
<li>代码生成查询条件修正</li>
<li>修正角色管理导出权限权限字符</li>
<li>修正防止切换权限用户后登录出现404</li>
<li>终端设置安全码加密&更新缓存</li>
<li>修复头像上传成功二次打开无法改变裁剪框大小和位置问题</li>
<li>修复布局为small者mini用户表单显示错位问题</li>
<li>修复代码生成点击多次表修改数据不变化的问题</li>
<li>修复代码生成导入表结构出现异常页面不提醒问题</li>
<li>修复角色权限修改时已有权限未自动勾选异常</li>
<li>创建用户不允许选择系统管理员角色</li>
<li>添加全局异常处理网关异常&业务异常</li>
<li>修复终端查询Enter键搜索时是刷新页面而不是查询列表</li>
<li>删除job重复表单参数</li>
<li>代码生成浮点型改用BigDecimal</li>
<li>表单类型为Integer/Long设置整形默认值</li>
<li>修改用户管理复选框宽度防止部分浏览器出现省略号</li>
<li>
RedisCache中所有方法参数添加final并优化list取出效率添加其它常用redis方法
</li>
<li>修正定时任务日志权限字符</li>
<li>添加Jackson时区配置</li>
<li>代码生成相关问题修复</li>
<li>自定义oauth2返回异常信息</li>
<li>升级nacos到最新版1.3.0 全新内核构建</li>
<li>修正代码生成功能无法下载的问题</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.0.0 - 2019-12-02">
<ol>
<li>新增代码生成</li>
<li>新增@RepeatSubmit注解防止重复提交</li>
<li>新增菜单主目录添加/删除操作</li>
<li>日志记录过滤特殊对象防止转换异常</li>
<li>修改代码生成路由脚本错误</li>
<li>用户上传头像实时同步缓存无需重新登录</li>
<li>调整切换页签后不重新加载数据</li>
<li>添加jsencrypt实现参数的前端加密</li>
<li>系统退出删除用户缓存记录</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v2.0.0 - 2020-06-10">
<ol>
<li>使用Sentinel代替Hystrix</li>
<li>菜单新增终端管理配置</li>
<li>菜单新增Nacos&Sentinel控制台</li>
<li>代码生成适配Cloud</li>
<li>记录登录退出日志信息</li>
<li>网关验证码过滤器添加放行校验</li>
<li>个性化的定制自动加载类</li>
<li>定时任务调整label-width防止部署出现错位</li>
<li>调整表头固定列默认样式</li>
<li>代码生成模板调整字段为String并且必填则加空串条件</li>
<li>代码生成字典Integer/Long使用parseInt</li>
<li>修复退出登录重定向到登录页登录后参数丢失</li>
<li>修正岗位导出权限注解</li>
<li>修复首页搜索菜单外链无法点击跳转问题</li>
<li>修复菜单管理选择图标backspace删除时不过滤数据</li>
<li>用户管理部门分支节点不可检查&显示计数</li>
<li>数据范围过滤属性调整</li>
<li>字典管理添加缓存读取</li>
<li>参数管理支持缓存操作</li>
<li>升级fastjson到最新版1.2.70 修复高危安全漏洞</li>
<li>dev启动默认打开浏览器</li>
<li>使用vue-cli默认source-map</li>
<li>slidebar eslint报错优化</li>
<li>当tags-view滚动关闭右键菜单</li>
<li>支持一级菜单和主页同级在main区域显示</li>
<li>限制外链地址必须以http(s)😕/开头</li>
<li>tagview & sidebar 主题颜色与element ui(全局)同步</li>
<li>
修复dict_sort不可update为0的问题&查询返回增加dict_sort升序排序
</li>
<li>权限部分代码调整</li>
<li>其他细节优化</li>
</ol>
</el-collapse-item>
<el-collapse-item title="v1.0.0 - 2020-05-20">
<ol>
<li>若依微服务系统正式发布</li>
</ol>
</el-collapse-item>
</el-collapse>
</el-card>
</el-col>
<el-col :lg="8" :md="12" :sm="24" :xs="24">
<el-card class="update-log">
<div slot="header" class="clearfix">
<span>捐赠支持</span>
</div>
<div class="body">
<img
alt="donate"
src="@/assets/images/pay.png"
width="100%"
/>
<span style="display: inline-block; height: 30px; line-height: 30px"
>你可以请作者喝杯咖啡表示鼓励</span
>
</div>
</el-card>
<h2>车联网客户业务系统</h2>
</el-col>
</el-row>
</div>

View File

@ -9,7 +9,7 @@ const CompressionPlugin = require('compression-webpack-plugin')
const name = process.env.VUE_APP_TITLE || '若依管理系统' // 网页标题
const port = process.env.port || process.env.npm_config_port || 80 // 端口
const port = process.env.port || process.env.npm_config_port || 8081 // 端口
// vue.config.js 配置说明
//官方vue.config.js 参考文档 https://cli.vuejs.org/zh/config/#css-loaderoptions