统一登录风格,创建平台登录bs接收页面,创建接警中心页面

main
xuechunyuan 3 years ago
parent b301e4c8e1
commit 747e35fcaf
  1. BIN
      public/img/bg/bg.png
  2. BIN
      public/img/bg/home.jpg
  3. BIN
      public/img/bg/left_bg.png
  4. BIN
      public/img/bg/login.png
  5. 11
      src/api/user.js
  6. 59
      src/api/wirelessintrusion/wirelessintrusion.js
  7. 2
      src/components/third-register/main.vue
  8. 4
      src/config/website.js
  9. 79
      src/page/login/alogin.vue
  10. 46
      src/page/login/index.vue
  11. 6
      src/page/login/userlogin.vue
  12. 6
      src/router/axios.js
  13. 10
      src/router/page/index.js
  14. 8
      src/router/views/index.js
  15. 27
      src/styles/login.scss
  16. 391
      src/views/alarmcenter/index.vue
  17. 342
      src/views/alarmcenter/peopleposition/list.vue
  18. 292
      src/views/alarmcenter/point/list.vue
  19. 33
      src/views/map/index.vue
  20. 869
      src/views/wel/index copy.vue
  21. 32
      src/views/wel/index.vue
  22. 637
      src/views/wirelessintrusion/device/list.vue
  23. 14
      vue.config.js

Binary file not shown.

After

Width:  |  Height:  |  Size: 423 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 163 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 361 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 239 KiB

@ -113,3 +113,14 @@ export const clearCache = () => request({
method: 'get',
authorization: false
});
//授权登录
export const loginByAuth = (applyType, username, password) => request({
url: '/authApi/system/sys-sub/login',
method: 'post',
data: {
applyType,
username,
password
}
});

@ -0,0 +1,59 @@
import request from '@/router/axios';
const baseUrl = process.env.NODE_ENV === 'production' ? 'http://182.139.182.190:60032/prod-api' : 'http://182.139.182.190:60032/prod-api';
//物联网登录
export const bizLogin = (data) => {
return request({
url: baseUrl + '/api/Login',
method: 'post',
data: data,
authorization: false
})
}
//物联网设备状态
export const bizDeviceStatus = (token) => {
return request({
url: baseUrl + '/system/dict/data/type/device_status',
method: 'get',
headers: {
Authorization: token
},
authorization: false
})
}
//节点类型
export const bizNodeType = (token) => {
return request({
url: baseUrl + '/system/dict/data/type/node_type',
method: 'get',
headers: {
Authorization: token
},
authorization: false
})
}
//物联网设备列表
export const bizDeviceList = (token, params) => {
return request({
url: baseUrl + '/api/bizDevice/list',
method: 'get',
headers: {
Authorization: token
},
params: params,
authorization: false
})
}
//设备详情
export const bizDeviceDetail = (token, id) => {
return request({
url: baseUrl + '/api/bizDevice/' + id,
method: 'get',
headers: {
Authorization: token
},
authorization: false
})
}

@ -57,7 +57,7 @@
...mapGetters(["userInfo"]),
},
created() {
this.getTenant();
// this.getTenant();
},
mounted() {
//

@ -5,12 +5,12 @@ export default {
title: "saber",
logo: "S",
key: 'saber',//配置主键,目前用于存储
indexTitle: 'Saber Admin',
indexTitle: '入侵报警系统',
clientId: 'saber', // 客户端id
clientSecret: 'saber_secret', // 客户端密钥
tenantMode: false, // 是否开启租户模式
tenantId: "000000", // 管理组租户编号
captchaMode: true, // 是否开启验证码模式
captchaMode: false, // 是否开启验证码模式
switchMode: false, // 是否开启部门切换模式
lockPage: '/lock',
tokenTime: 3000,

@ -0,0 +1,79 @@
<template>
<div class="login-container">
</div>
</template>
<script>
import { mapGetters } from "vuex";
import { dateFormat } from "@/util/date";
import { validatenull } from "@/util/validate";
import { getQueryString, getTopUrl } from "@/util/util";
import { Base64 } from 'js-base64';
export default {
name: "alogin",
components: {
},
data() {
return {
loginForm: {
//ID
tenantId: "000000",
//ID
deptId: "",
//ID
roleId: "",
//
username: "admin",
//
password: "admin",
//
type: "account",
//
code: "",
//
key: "",
//
image: "data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
},
};
},
created() {
},
mounted() {
let source = this.$route.query.source;
let name =this.$route.query.name;
let password = this.$route.query.password;
source = source != 'undefined' ? Base64.decode(Base64.decode(source)) : '';
if (source == 'pt' && name && password) {
this.loginForm.name = Base64.decode(Base64.decode(name));
this.loginForm.password = Base64.decode(Base64.decode(password));
this.handleLogin();
} else {
// this.$router.push({path: '/login'})
}
},
computed: {
...mapGetters(["website", "tagWel"])
},
props: [],
methods: {
handleLogin() {
const loading = this.$loading({
lock: true,
text: '登录中,请稍后。。。',
spinner: "el-icon-loading"
});
this.$store.dispatch("LoginByUsername", this.loginForm).then(() => {
this.$router.push({ path: this.tagWel.value });
loading.close();
}).catch(() => {
loading.close();
});
}
}
};
</script>
<style lang="scss">
@import "@/styles/login.scss";
</style>

@ -4,49 +4,13 @@
@keyup.enter.native="handleLogin">
<top-color v-show="false"></top-color>
<div class="login-weaper animated bounceInDown">
<div class="login-left">
<div class="login-time">
{{time}}
</div>
<p class="title">{{ $t('login.info') }}</p>
<div style="font-size: 15px">
<span>----------------------------------------------</span>
<br>
<span>管理租户编号000000</span>
<br>
<span>超级管理员账号: admin / admin</span>
<br>
<span>人事账号: hr / hr</span>
<br>
<span>经理账号: manager / manager</span>
<br>
<span>老板账号: boss / boss</span>
<br>
<span>----------------------------------------------</span>
<br>
<span>普通租户编号详见租户管理模块</span>
<br>
<span>租户管理员账号: admin / admin</span>
<br>
<span>----------------------------------------------</span>
</div>
<!--<img class="img" src="/img/logo.png" alt="">-->
</div>
<div class="login-border">
<div class="login-border" style="float: right; border-radius: 15px;">
<div class="login-main">
<h4 class="login-title">
{{ $t('login.title') }}{{website.title}}
<top-lang></top-lang>
{{ $t('login.title') }}
入侵报警系统
</h4>
<userLogin v-if="activeName==='user'"></userLogin>
<codeLogin v-else-if="activeName==='code'"></codeLogin>
<thirdLogin v-else-if="activeName==='third'"></thirdLogin>
<div class="login-menu">
<a href="#" @click.stop="activeName='user'">{{ $t('login.userLogin') }}</a>
<!--<a href="#" @click.stop="activeName='code'">{{ $t('login.phoneLogin') }}</a>-->
<a href="#" @click.stop="activeName='third'">{{ $t('login.thirdLogin') }}</a>
<a :href="website.ssoUrl + website.redirectUri">{{ $t('login.ssoLogin') }}</a>
</div>
</div>
</div>
@ -82,7 +46,7 @@
source: "",
code: "",
state: "",
}
},
};
},
watch: {
@ -92,7 +56,7 @@
},
created() {
this.handleLogin();
this.getTime();
// this.getTime();
},
mounted() {
},

@ -72,7 +72,7 @@
<script>
import {mapGetters} from "vuex";
import {info} from "@/api/system/tenant";
import {getCaptcha} from "@/api/user";
import {getCaptcha, loginByAuth} from "@/api/user";
import {getTopUrl} from "@/util/util";
export default {
@ -163,8 +163,8 @@
};
},
created() {
this.getTenant();
this.refreshCode();
// this.getTenant();
// this.refreshCode();
},
mounted() {
},

@ -66,15 +66,15 @@ axios.interceptors.response.use(res => {
//关闭 progress bar
NProgress.done();
//获取状态码
const status = res.data.code || res.status;
const status = res.data.code == 0 ? 200 : res.data.code || res.status;
const statusWhiteList = website.statusWhiteList || [];
const message = res.data.msg || res.data.error_description || '未知错误';
//如果在白名单里则自行catch逻辑处理
if (statusWhiteList.includes(status)) return Promise.reject(res);
//如果是401则跳转到登录页面
if (status === 401) store.dispatch('FedLogOut').then(() => router.push({path: '/login'}));
if (status === 401 && message.indexOf('/system/dict/data/type/node_type') < 0 && message.indexOf('/system/dict/data/type/device_status') < 0 && message.indexOf('/api/bizDevice/list') < 0) store.dispatch('FedLogOut').then(() => router.push({path: '/login'}));
// 如果请求为非200否者默认统一处理
if (status !== 200) {
if (status !== 200 && message.indexOf('/system/dict/data/type/node_type') < 0 && message.indexOf('/system/dict/data/type/device_status') < 0 && message.indexOf('/api/bizDevice/list') < 0) {
Message({
message: message,
type: 'error'

@ -10,6 +10,16 @@ export default [{
isTab: false,
isAuth: false
}
},{
path: '/alogin',
name: '平台登录页',
component: () =>
import( /* webpackChunkName: "page" */ '@/page/login/alogin'),
meta: {
keepAlive: true,
isTab: false,
isAuth: false
}
},
{
path: '/lock',

@ -103,14 +103,6 @@ export default [{
component: () =>
import( /* webpackChunkName: "views" */ '@/views/work/process/leave/detail')
}]
},{
path: '/alarmcenter',
name: '报警中心',
component: () =>
import( /* webpackChunkName: "views" */ '@/views/alarmcenter/index'),
meta: {
isTab: false
}
},{
path: '/dispatch',
name: '语音调度',

@ -5,14 +5,17 @@
width: 100%;
height: 100%;
margin: 0 auto;
background-image: url("/img/bg/bg.jpg");
background-image: url("/img/bg/bg.png");
background-size: 100% 100%;
}
.login-weaper {
margin: 0 auto;
width: 1000px;
box-shadow: -4px 5px 10px rgba(0, 0, 0, 0.4);
width: 1200px;
height: 500px;
// box-shadow: -4px 5px 10px rgba(0, 0, 0, 0.4);
background: url("/img/bg/left_bg.png") 0 center no-repeat;
background-size: 685px 465px;
.el-input-group__append {
border: none;
@ -22,7 +25,7 @@
.login-left,
.login-border {
position: relative;
min-height: 500px;
min-height: 450px;
align-items: center;
display: flex;
}
@ -69,14 +72,15 @@
border-bottom-right-radius: 5px;
color: #fff;
background-color: #fff;
width: 50%;
width: 450px;
float: left;
box-sizing: border-box;
box-shadow: -4px 5px 10px rgba(0, 0, 0, 0.4);
}
.login-main {
margin: 0 auto;
width: 65%;
width: 85%;
box-sizing: border-box;
}
@ -113,11 +117,11 @@
width: 100%;
height: 45px;
border: 1px solid #409EFF;
background: none;
background: #409EFF;
font-size: 18px;
letter-spacing: 2px;
font-weight: 300;
color: #409EFF;
color: #fff;
cursor: pointer;
margin-top: 30px;
font-family: "neo";
@ -141,13 +145,12 @@
.el-input {
input {
padding-bottom: 10px;
height: 40px;
padding: 10px 25px;
text-indent: 5px;
background: transparent;
border: none;
border-radius: 0;
border: 1px solid #dcdfe6;
color: #333;
border-bottom: 1px solid rgb(235, 237, 242);
}
.el-input__prefix {

@ -1,27 +1,402 @@
<template>
<div>
报警中心
</div>
<basic-container>
<avue-crud :option="option"
:table-loading="loading"
:data="data"
:page.sync="page"
ref="crud"
@row-del="rowDel"
v-model="form"
:permission="permissionList"
@row-update="rowUpdate"
@row-save="rowSave"
:before-open="beforeOpen"
@search-change="searchChange"
@search-reset="searchReset"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad">
<template slot="menuLeft">
<el-button type="danger"
size="small"
icon="el-icon-turn-off"
plain>消警
</el-button>
<el-button type="danger"
size="small"
icon="el-icon-turn-off"
plain>撤防
</el-button>
<el-button type="danger"
size="small"
icon="el-icon-turn-off"
plain>旁路恢复
</el-button>
<el-button type="warning"
size="small"
icon="el-icon-download"
plain>导出
</el-button>
<!-- <el-button type="danger"
size="small"
icon="el-icon-delete"
plain
v-if="permission.notice_delete"
@click="handleDelete">
</el-button> -->
</template>
<template slot-scope="{row}"
slot="alarmInfo">
<!-- <el-tag type="danger"> -->
{{row.alarmInfo}}
<!-- </el-tag> -->
</template>
<template #menu="{row,index}">
<el-button @click="tip(row,index)"
type="primart" plain
size="small" >详情</el-button>
<el-button
@click="tip(row,index)"
type="primart" plain
size="small"
:disabled="row.cancelTime == ''">
消警
</el-button>
<!-- <el-button @click="tip(row,index)"
type="primart" plain
size="small">撤防</el-button> -->
<!-- <el-button @click="tip(row,index)"
type="primart" plain
size="small">旁路恢复</el-button> -->
<el-button
@click="linkVideo(row,index)"
type="primart"
plain
size="small"
:disabled="row.cancelTime == ''">
视频联动
</el-button>
</template>
</avue-crud>
<!-- 视频联动弹窗 -->
<el-dialog
title="视频联动"
:visible.sync="dialogVisible"
:append-to-body="true"
:close-on-click-modal="false"
:close-on-press-escape="false"
custom-class="video_dia"
width="65%">
<div class="video_box">
<!-- <div class="video_item" v-for="item in videoData" :key="item.id">
<div class="top_item">{{item.url}}</div>
<div class="bottom_item">{{item.name}}</div>
</div> -->
<el-row :gutter="20">
<el-col :span="6" v-for="item in videoData" :key="item.id">
<video class="grid-content" src="">
</video>
</el-col>
</el-row>
</div>
</el-dialog>
</basic-container>
</template>
<script>
import {getList, remove, update, add, getNotice} from "@/api/desk/notice";
import {mapGetters} from "vuex";
export default {
name: "alarmCenter",
data() {
return {
form: {},
query: {},
loading: true,
dialogVisible:false,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
selectionList: [],
option: {
height: 'auto',
calcHeight: 30,
dialogWidth: 950,
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
// index: true,
menuWidth: 320,
viewBtn: false,
addBtn: false,
editBtn: false,
delBtn: false,
selection: true,
dialogClickModal: false,
column: [
{
label: "设备名称",
prop: "title",
span: 24,
row: true,
search: true,
},
{
label: "设备编号",
prop: "deviceNo",
span: 24,
row: true,
},
{
label: "设备大类",
prop: "deviceType",
span: 24,
row: true,
},
{
label: "品牌编号",
prop: "brandNo",
span: 24,
row: true,
},
// {
// label: "",
// type: "select",
// dicUrl: "/api/blade-system/dict/dictionary?code=notice",
// props: {
// label: "dictValue",
// value: "dictKey"
// },
// dataType: "number",
// slot: true,
// prop: "category",
// search: true,
// },
{
label: "所属区域",
prop: "floor",
// slot: true,
},
{
label: "安装位置",
prop: "address",
// slot: true,
},
{
label: "报警信息",
prop: "alarmInfo",
slot: true,
overHidden:true
},
{
label: "报警时间",
prop: "alarmTime",
type: "date",
},
{
label: "消报时间",
prop: "cancelTime",
type: "date",
},
]
},
data: [],
videoData:[]
};
},
computed: {
...mapGetters(["userInfo"]),
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.notice_add, false),
viewBtn: this.vaildData(this.permission.notice_view, false),
delBtn: this.vaildData(this.permission.notice_delete, false),
editBtn: this.vaildData(this.permission.notice_edit, false)
};
},
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(",");
}
},
methods: {
},
rowSave(row, done, loading) {
add(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
window.console.log(error);
loading();
});
},
rowUpdate(row, index, done, loading) {
update(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
window.console.log(error);
loading();
});
},
rowDel(row) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
});
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
handleDelete() {
if (this.selectionList.length === 0) {
this.$message.warning("请选择至少一条数据");
return;
}
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(this.ids);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
this.$refs.crud.toggleSelection();
});
},
beforeOpen(done, type) {
if (["edit", "view"].includes(type)) {
getNotice(this.form.id).then(res => {
this.form = res.data.data;
});
}
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
// const {releaseTimeRange} = this.query;
// let values = {
// ...params,
// ...this.query
// };
// if (releaseTimeRange) {
// values = {
// ...values,
// releaseTime_datege: releaseTimeRange[0],
// releaseTime_datelt: releaseTimeRange[1],
// };
// values.releaseTimeRange = null;
// }
// this.loading = true;
// getList(page.currentPage, page.pageSize, values).then(res => {
// const data = res.data.data;
// this.page.total = data.total;
// this.data = data.records;
// this.loading = false;
// this.selectionClear();
// });
this.data = [
{title:'空调',deviceNo:'A101',deviceType:'空调设备',brandNo:'格力AT51',floor:'一号楼一层北',address:'1011室',alarmInfo:'无法制冷',alarmTime:'2023-07-14 09:55:23',cancelTime:'2023-07-15 15:23:10'},
{title:'空调',deviceNo:'A101',deviceType:'空调设备',brandNo:'格力AT51',floor:'一号楼一层北',address:'1011室',alarmInfo:'无法制冷,无法制冷无法制冷',alarmTime:'2023-07-14 09:55:23',cancelTime:''},
];
this.loading = false;
this.page.total = this.data.length
},
//
linkVideo(){
this.dialogVisible = true;
this.videoData = [
{id:'001',url:'cdcdcdcd',name:'视频一'},
{id:'002',url:'cdcdcdcd',name:'视频一'},
{id:'003',url:'cdcdcdcd',name:'视频一'},
{id:'004',url:'cdcdcdcd',name:'视频一'},
{id:'005',url:'cdcdcdcd',name:'视频一'},
{id:'006',url:'cdcdcdcd',name:'视频一'},
{id:'007',url:'cdcdcdcd',name:'视频一'},
{id:'008',url:'cdcdcdcd',name:'视频一'},
]
},
}
};
</script>
<style>
<style lang="scss" scoped>
</style>
<style lang="scss">
.video_dia{
.video_box{
width: 100%;
// display: flex;
// justify-content: space-between;
// flex-wrap: wrap;
.grid-content {
width: 100%;
height: 200px;
margin-bottom: 18px;
background: #959595;
video{
width: 100%;
height: 100%;
}
}
}
}
</style>

@ -0,0 +1,342 @@
<template>
<basic-container>
<avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" @row-del="rowDel"
v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
@search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
@current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
import { bizLogin, bizDeviceList, bizDeviceStatus, bizNodeType } from "@/api/wirelessintrusion/wirelessintrusion";
import { mapGetters } from "vuex";
export default {
data() {
return {
form: {},
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
selectionList: [],
option: {
height: 'auto',
calcHeight: 30,
dialogWidth: 950,
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
viewBtn: true,
editBtn: false,
delBtn: false,
addBtn: false,
dialogClickModal: false,
column: [
{
label: "设备名称",
prop: "name",
span: 12,
search: true,
formatter: (val, value, label) => {
return val.name + '/' + val.remark
},
labelWidth: 120
},
{
label: "备注名称",
prop: "remark",
span: 12,
hide: true,
viewDisplay: true,
labelWidth: 120
},
{
label: "设备所属产品",
prop: "name",
span: 12,
labelWidth: 120
},
{
label: "节点类型",
type: "select",
dicData: [],
props: {
label: "dictLabel",
value: "dictValue"
},
search: true,
prop: "node",
labelWidth: 120,
viewDisplay: false
},
{
label: "节点类型",
prop: "nodeLabel",
labelWidth: 120,
hide: true,
viewDisplay: true
},
{
label: "网关信息",
prop: "gateway",
formatter: (val, value, label) => {
return val.gateway || '-'
},
labelWidth: 120
},
{
label: "设备状态",
type: "select",
dicData: [],
props: {
label: "dictLabel",
value: "dictValue"
},
search: true,
prop: "status",
labelWidth: 120,
viewDisplay: false,
},
{
label: "节点类型",
prop: "statusLabel",
labelWidth: 120,
hide: true,
viewDisplay: true
},
{
label: "创建时间时间",
prop: "createTime",
labelWidth: 120,
hide: true,
viewDisplay: true,
}, {
label: "最后上线时间",
prop: "lastOnline",
labelWidth: 120
},
]
},
data: [],
nodeType: [],//
};
},
computed: {
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.notice_add, false),
viewBtn: this.vaildData(this.permission.notice_view, false),
delBtn: this.vaildData(this.permission.notice_delete, false),
editBtn: this.vaildData(this.permission.notice_edit, false)
};
},
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(",");
}
},
mounted() {
},
methods: {
//
loadDict() {
let token = window.sessionStorage.getItem('bizToken');
if (token == 'undefined' || !token) {
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => {
window.sessionStorage.setItem('bizToken', res.data.data.token);
bizDeviceStatus(res.data.data.token).then(res => {
const column = this.findObject(this.option.column, "status");
column.dicData = res.data.data;
})
bizNodeType(res.data.data.token).then(res => {
const column = this.findObject(this.option.column, "node");
column.dicData = res.data.data;
})
})
} else {
bizDeviceStatus(token).then(res => {
if(res.data.code == 401){
window.sessionStorage.removeItem('bizToken');
this.loadDict();
}
else if(res.data.code == 200){
const column = this.findObject(this.option.column, "status");
column.dicData = res.data.data;
}
})
bizNodeType(token).then(res => {
const column = this.findObject(this.option.column, "node");
column.dicData = res.data.data;
})
}
},
//
renderLabel(node,col) {
const column = this.findObject(this.option.column, col);
let idx = column.dicData.findIndex(item => item.dictValue == node);
return idx > -1 ? column.dicData[idx].dictLabel : '';
},
// rowSave(row, done, loading) {
// add(row).then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// done();
// }, error => {
// window.console.log(error);
// loading();
// });
// },
// rowUpdate(row, index, done, loading) {
// update(row).then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// done();
// }, error => {
// window.console.log(error);
// loading();
// });
// },
// rowDel(row) {
// this.$confirm("?", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// })
// .then(() => {
// return remove(row.id);
// })
// .then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// });
// },
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
// handleDelete() {
// if (this.selectionList.length === 0) {
// this.$message.warning("");
// return;
// }
// this.$confirm("?", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// })
// .then(() => {
// return remove(this.ids);
// })
// .then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// this.$refs.crud.toggleSelection();
// });
// },
beforeOpen(done, type) {
console.log(this.form)
if (["edit", "view"].includes(type)) {
// let token = window.sessionStorage.getItem('bizToken');
// if (token == 'undefined') {
// bizDeviceDetail(this.form.id).then(res => {
// this.form = res.data.data;
// });
// }
}
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
let values = {
...params,
...this.query,
pid: 98
};
let token = window.sessionStorage.getItem('bizToken');
if (token == 'undefined' || !token) {
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => {
window.sessionStorage.setItem('bizToken', res.data.data.token);
this.loading = true;
bizDeviceList(res.data.data.token, { ...values, pageSize: page.pageSize, pageNo: page.currentPage }).then(res2 => {
const data = res2.data;
this.page.total = data.total;
this.data = data.records;
this.loading = false;
this.selectionClear();
});
})
} else {
this.loading = true;
bizDeviceList(token, { ...values, pageSize: page.pageSize, pageNo: page.currentPage }).then(res2 => {
this.loading = false;
this.selectionClear();
if(res2.data.code == 401){
console.log(res2.data.code)
window.sessionStorage.removeItem('bizToken');
this.onLoad();
}
else if(res2.data.code == 200){
const data = res2.data;
this.page.total = data.total;
data.rows.map(item => {
item.node = item.bizProduct.node;
item.nodeLabel = this.renderLabel(item.node,'node');
item.statusLabel = this.renderLabel(item.status,'status')
})
this.data = data.rows;
}
}, err => {
this.loading = false;
this.selectionClear();
});
}
}
}
};
</script>
<style></style>

@ -0,0 +1,292 @@
<template>
<basic-container>
<avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" :permission="permissionList"
@search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
@current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
<template #menu-left="{}">
<el-button>新增</el-button>
</template>
</avue-crud>
</basic-container>
</template>
<script>
import { bizLogin, bizDeviceList, bizDeviceStatus, bizNodeType } from "@/api/wirelessintrusion/wirelessintrusion";
import { mapGetters } from "vuex";
export default {
data() {
return {
form: {},
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
selectionList: [],
option: {
height: 'auto',
calcHeight: 30,
dialogWidth: 950,
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: false,
viewBtn: false,
editBtn: false,
delBtn: false,
addBtn: false,
dialogClickModal: false,
column: [
{
label: "报警点",
prop: "name",
search: true,
},
{
label: "所在区域",
prop: "remark",
search: true,
},
{
label: "经纬度",
prop: "name",
},
{
label: "关联摄像头",
prop: "node",
},
{
label: "关联手持终端",
prop: "nodeLabel",
},
{
label: "创建时间时间",
prop: "createTime",
labelWidth: 120,
}, {
label: "最后更新时间",
prop: "lastOnline",
},
]
},
data: [],
nodeType: [],//
};
},
computed: {
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.notice_add, false),
viewBtn: this.vaildData(this.permission.notice_view, false),
delBtn: this.vaildData(this.permission.notice_delete, false),
editBtn: this.vaildData(this.permission.notice_edit, false)
};
},
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(",");
}
},
mounted() {
// this.loadDict();
},
methods: {
//
loadDict() {
let token = window.sessionStorage.getItem('bizToken');
if (token == 'undefined' || !token) {
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => {
window.sessionStorage.setItem('bizToken', res.data.data.token);
bizDeviceStatus(res.data.data.token).then(res => {
const column = this.findObject(this.option.column, "status");
column.dicData = res.data.data;
})
bizNodeType(res.data.data.token).then(res => {
const column = this.findObject(this.option.column, "node");
column.dicData = res.data.data;
})
})
} else {
bizDeviceStatus(token).then(res => {
if(res.data.code == 401){
window.sessionStorage.removeItem('bizToken');
this.loadDict();
}
else if(res.data.code == 200){
const column = this.findObject(this.option.column, "status");
column.dicData = res.data.data;
}
})
bizNodeType(token).then(res => {
const column = this.findObject(this.option.column, "node");
column.dicData = res.data.data;
})
}
},
//
renderLabel(node,col) {
const column = this.findObject(this.option.column, col);
let idx = column.dicData.findIndex(item => item.dictValue == node);
return idx > -1 ? column.dicData[idx].dictLabel : '';
},
// rowSave(row, done, loading) {
// add(row).then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// done();
// }, error => {
// window.console.log(error);
// loading();
// });
// },
// rowUpdate(row, index, done, loading) {
// update(row).then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// done();
// }, error => {
// window.console.log(error);
// loading();
// });
// },
// rowDel(row) {
// this.$confirm("?", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// })
// .then(() => {
// return remove(row.id);
// })
// .then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// });
// },
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
// handleDelete() {
// if (this.selectionList.length === 0) {
// this.$message.warning("");
// return;
// }
// this.$confirm("?", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// })
// .then(() => {
// return remove(this.ids);
// })
// .then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// this.$refs.crud.toggleSelection();
// });
// },
beforeOpen(done, type) {
console.log(this.form)
if (["edit", "view"].includes(type)) {
// let token = window.sessionStorage.getItem('bizToken');
// if (token == 'undefined') {
// bizDeviceDetail(this.form.id).then(res => {
// this.form = res.data.data;
// });
// }
}
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
let values = {
...params,
...this.query,
pid: 98
};
let token = window.sessionStorage.getItem('bizToken');
if (token == 'undefined' || !token) {
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => {
window.sessionStorage.setItem('bizToken', res.data.data.token);
this.loading = true;
bizDeviceList(res.data.data.token, { ...values, pageSize: page.pageSize, pageNo: page.currentPage }).then(res2 => {
const data = res2.data;
this.page.total = data.total;
this.data = data.records;
this.loading = false;
this.selectionClear();
});
})
} else {
this.loading = true;
bizDeviceList(token, { ...values, pageSize: page.pageSize, pageNo: page.currentPage }).then(res2 => {
this.loading = false;
this.selectionClear();
if(res2.data.code == 401){
console.log(res2.data.code)
window.sessionStorage.removeItem('bizToken');
this.onLoad();
}
else if(res2.data.code == 200){
const data = res2.data;
this.page.total = data.total;
data.rows.map(item => {
item.node = item.bizProduct.node;
item.nodeLabel = this.renderLabel(item.node,'node');
item.statusLabel = this.renderLabel(item.status,'status')
})
this.data = data.rows;
}
}, err => {
this.loading = false;
this.selectionClear();
});
}
}
}
};
</script>
<style></style>

@ -0,0 +1,33 @@
<template>
<div>
<div id='mapContainer' style="widht:1000px;height:1000px;background:red;"></div>
</div>
</template>
<script>
export default {
name: "map",
data() {
return {
};
},
mounted() {
window.map = new jsmapbase.JSMap({
container:'mapContainer',
mapServerURL:'data/map'
});
window.map.openMapById('0001');
},
methods: {
},
};
</script>
<style>
.el-font-size {
font-size: 14px;
}
</style>

@ -1,869 +0,0 @@
<template>
<div>
<el-row>
<el-col :span="24">
<third-register></third-register>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<basic-container>
<p style="text-align: center">
<img src="https://img.shields.io/badge/Release-V3.1.1-green.svg" alt="Downloads"/>
<img src="https://img.shields.io/badge/JDK-1.8+-green.svg" alt="Build Status"/>
<img src="https://img.shields.io/badge/Spring%20Cloud-2021-blue.svg" alt="Coverage Status"/>
<img src="https://img.shields.io/badge/Spring%20Boot-2.7-blue.svg" alt="Downloads"/>
<a target="_blank" href="https://bladex.vip">
<img src="https://img.shields.io/badge/Saber%20Author-Small%20Chill-ff69b4.svg" alt="Downloads"/>
</a>
<a target="_blank" href="https://bladex.vip">
<img src="https://img.shields.io/badge/Copyright%20-@BladeX-%23ff3f59.svg" alt="Downloads"/>
</a>
</p>
</basic-container>
</el-col>
</el-row>
<el-row>
<el-col :span="16">
<basic-container>
<el-collapse v-model="activeNames" @change="handleChange">
<el-collapse-item title="欢迎使用Saber" name="1">
<div>1.Saber是BladeX前端UI系统</div>
<div>2.对现有的avue2.0element-ui库进行二次封装</div>
<div>3.100%兼容原生element-ui库</div>
<div>4.基于json驱动的模块配置打造最好用的vuejs中后台脚手架</div>
<div>5.使用Saber可以大幅度提升开发效率不再为重复工作发愁</div>
</el-collapse-item>
<el-collapse-item title="什么是BladeX" name="2">
<div>1.BladeX是一款精心设计的微服务架构提供 SpringCloud 全套解决方案</div>
<div>2.开源中国首批完美集成 SpringCloud Alibaba 系列组件的微服务架构</div>
<div>3.基于稳定生产的商业项目升级优化而来更加贴近企业级的需求</div>
<div>4.追求企业开发更加高效部署更加方便生产更加稳定</div>
<div>5.GVP-码云最有价值开源项目</div>
<div>6.BladeX授权地址:<a target="_blank" href="https://bladex.vip/#/vip">点击授权</a></div>
</el-collapse-item>
<el-collapse-item title="为何需要BladeX" name="3">
<div>1.经历过较长的线上生产积累了很多企业痛点的解决方案</div>
<div>2.一套代码兼容MySqlOraclePostgreSQLSqlServer达梦适应企业各种不同场景的需求</div>
<div>3.集成了很多企业急切所需的例如多租户Oauth2授权认证工作流分布式事务等等功能</div>
<div>4.深度定制了Flowable工作流完美支持SpringCloud分布式服务的场景以远程调用的方式进行操作</div>
<div>5.升级了核心驱动新功能完全可以开箱即用而开源版需要自己再花时间进行集成需要花掉更多的时间成本</div>
<div>6.拥抱微服务时代很多企业由于项目转型或升级传统的技术已然不能满足反而会花更多成本而BladeX就是为此而生</div>
<div>7.同时提供SpringCloud版本和SpringBoot版本两个版本的api可以与Sword和Saber无缝对接为小型项目至大型项目保驾护航</div>
<div>8.授权购买即永久源码没有混淆完全开放后续升级完全免费企业只需花很少的钱即可获得一整套成熟的解决方案你还在等什么</div>
</el-collapse-item>
<el-collapse-item title="拥有的核心功能" name="4">
<div>1.前后端分离-采用前后端分离模式前端提供两套架构Sword基于ReactSaber基于Vue</div>
<div>2. 分布式单体式后端架构-提供两套后端架构基于SpringCloud的分布式架构以及基于SpringBoot的单体式架构</div>
<div>3.API完全兼容-两套后端架构与两套前端架构共四套架构可以任意组合所有API完全兼容</div>
<div>4.前后端代码生成-定制针对两套前端与后端的代码生成模板轻松生成整个模块的前后端代码减少重复工作量</div>
<div>5.组件化插件化架构-针对功能深度定制各个starter引入开箱即用为整个架构解耦提升效率</div>
<div>6.Nacos-集成阿里巴巴的Nacos完成统一的服务注册与配置</div>
<div>7.Sentinel-集成Sentinel从流量控制熔断降级系统负载等多个维度保护服务的稳定性</div>
<div>8.Dubbo-完美集成Dubbo最新版支持远程RPC调用</div>
<div>9.多租户系统-完整的SaaS多租户架构</div>
<div>10.Oauth2-集成Oauth2协议完美支持多终端的接入与认证授权</div>
<div>11.工作流-深度定制SpringCloud分布式场景的Flowable工作流为复杂流程保驾护航同时提供SpringBoot集成版本</div>
<div>12.独立流程设计器-提供独立的完全汉化的流程设计器轻松定制流程模型</div>
<div>13.动态网关-集成基于Nacos的轻量级高拓展性动态网关</div>
<div>14.动态聚合文档-实现基于Nacos的Swagger SpringCloud聚合文档</div>
<div>15.分布式文件服务-集成minioqiniualioss等优秀的第三方提供便捷的文件上传与管理</div>
<div>16.多租户对象存储系统-在SaaS系统中各租户可自行配置文件上传至自己的私有OSS</div>
<div>17.权限管理-精心设计的权限管理方案角色权限精确到按钮</div>
<div>18.动态数据权限-高度灵活的动态数据权限提供注解+Web可视化两种配置方式Web配置无需重启直接生效</div>
<div>19.动态接口权限-高度灵活的动态接口权限提供注解+Web可视化两种配置方式Web配置无需重启直接生效</div>
<div>20.多租户顶部菜单配置-提供给每个租户独立的顶部菜单配置模块可以自定义顶部菜单切换</div>
<div>21.主流数据库兼容-一套代码完全兼容MysqlPostgresqlOracle三大主流数据库</div>
<div>22.动态网关鉴权-基于Nacos的动态网关鉴权可在线配置实时生效</div>
<div>23.全能代码生成器-支持自定义模型模版 业务建模支持多种模板引擎在线配置大幅度提升开发效率不再为重复工作发愁</div>
<div>24.Seata分布式事务-定制集成Seata支持分布式事务无代码侵入不失灵活与简洁</div>
<div>25.未完待续...</div>
</el-collapse-item>
<el-collapse-item title="软件定制开发合作" name="5">
<div>1.接BladeX系列架构的定制服务</div>
<div>2.接3个月以内工期的reactvuespringbootspringcloudapp小程序等软件定制服务</div>
<div>3.有意向请联系唯一指定QQ:1272154962</div>
</el-collapse-item>
</el-collapse>
</basic-container>
</el-col>
<el-col :span="8">
<el-row>
<basic-container>
<div class="el-font-size">
<span>产品名称</span>
<el-divider direction="vertical"/>
<span><el-tag>BladeX企业级微服务开发平台</el-tag></span>
<el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
<span>账号密码</span>
<el-divider direction="vertical"/>
<el-tag type="info" effect="plain">人事(hr)</el-tag>
<el-divider direction="vertical"/>
<el-tag type="success" effect="plain">经理(manager)</el-tag>
<el-divider direction="vertical"/>
<el-tag type="warning" effect="plain">老板(boss)</el-tag>
<el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
<span>官网地址</span>
<el-divider direction="vertical"/>
<span><el-link href="https://bladex.vip" target="_blank"
type="primary">https://bladex.vip</el-link></span>
<el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
<span>社区地址</span>
<el-divider direction="vertical"/>
<span><el-link href="https://sns.bladex.vip" target="_blank"
type="primary">https://sns.bladex.vip</el-link></span>
<el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
<span>获取文档</span>
<el-divider direction="vertical"/>
<span class="tag-group">
<el-tag type="success" style="cursor: pointer"
onclick="window.open('https://sns.bladex.vip/note/view/1.html')">免费版</el-tag>
<el-divider direction="vertical"/>
<el-tooltip class="item" effect="dark" content="前往商业群文件免费下载,每份授权有一个名额入群" placement="top">
<el-tag type="danger" style="cursor: pointer">收费版</el-tag>
</el-tooltip>
</span>
<el-divider content-position="right"><i class="el-icon-star-off"/></el-divider>
<span>获取源码</span>
<el-divider direction="vertical"/>
<span class="tag-group">
<el-tag type="success" effect="dark" style="cursor: pointer"
onclick="window.open('https://gitee.com/smallc/SpringBlade')">开源版</el-tag>
<el-divider direction="vertical"/>
<el-tag type="danger" effect="dark" style="cursor: pointer"
onclick="window.open('https://bladex.vip/#/vip')">商业版</el-tag>
</span>
</div>
</basic-container>
</el-row>
<el-row>
<basic-container>
<el-collapse v-model="logActiveNames" @change="handleChange">
<el-collapse-item title="3.1.1.RELEASE发布,新增国产崖山数据库支持,升级中央仓库" name="30">
<div>1.[升级]SpringBoot 2.7.11</div>
<div>2.[升级]Druid 1.2.18</div>
<div>3.[新增]新版nexus仓库依赖</div>
<div>4.[新增]docker构建工具更换为fabric</div>
<div>5.[新增]支持国产崖山数据库(YashanDB)</div>
<div>6.[新增]控制台日志增加放行url的特性</div>
<div>7.[新增]单人登录模式新增全平台唯一与单客户端唯一两种选择</div>
<div>8.[新增]signKey生成器</div>
<div>9.[新增]多租户对象存储新增 华为云obs amazon s3</div>
<div>10.[优化]适配腾讯云cos最新API</div>
<div>11.[优化]适配最新版minio接口手动关闭流</div>
<div>12.[优化]代码生成增加查询字段适配</div>
<div>13.[优化]saber3添加prod环境的启动与打包命令</div>
<div>14.[优化]取消Dept模块默认的全局管理员接口权限</div>
<div>15.[优化]SqlKeyword类的防sql注入功能</div>
<div>16.[优化]数据模型字段comment改名为jdbc_comment避免数据库关键词</div>
<div>17.[优化]element风格代码生成增加按钮权限</div>
<div>18.[优化]vue3版代码生成适配新的时间格式</div>
<div>19.[优化]达梦数据库文件修改为脚本文件避免编码不同导入失败</div>
<div>20.[修复]报表管理外链打开问题</div>
</el-collapse-item>
<el-collapse-item title="3.1.0.RELEASE发布,新增vue3、sharding-jdbc、aws s3、redis mq支持" name="29">
<div>1.[升级]SpringCloud 2021.0.6</div>
<div>2.[升级]SpringBoot 2.7.10</div>
<div>3.[升级]SpringBootAdmin 2.7.10</div>
<div>4.[升级]AlibabaCloud 2021.0.5.0</div>
<div>5.[升级]Mybatis-Plus 3.5.3.1</div>
<div>6.[升级]Mybatis-Plus-Generator 3.5.3.1</div>
<div>7.[升级]Nacos 2.1.2</div>
<div>8.[升级]Seata 1.6.1</div>
<div>9.[升级]Knife4j 4.1.0</div>
<div>10.[升级]Log4j 2.20.0</div>
<div>11.[升级]Avue2 2.10.10</div>
<div>12.[升级]Avue3 3.2.13</div>
<div>13.[新增]基于Vue3与Element-Plus版本的Saber正式发布</div>
<div>14.[新增]新增Sharding-Jdbc与动态数据源联合demo</div>
<div>15.[新增]axios支持baseUrl自动追加</div>
<div>16.[新增]字典管理新增全数据接口提供前端缓存支持</div>
<div>17.[新增]使用 flatten maven 插件优化版本处理</div>
<div>18.[新增]BizService供用户自行修改拓展并引入新的业务模块</div>
<div>19.[新增]Auto 支持 spring boot 2.7.x spi</div>
<div>20.[新增]Metrics 增加 undertow 指标</div>
<div>21.[新增]Redis 添加 stream,轻量级 mq支持广播和集群模式</div>
<div>22.[新增]Redis 调整限流脚本,更好的支持云服务器</div>
<div>23.[新增]S3Template支持 aws s3 且可同时支持minio作为分布式存储</div>
<div>24.[新增]可配置七牛云region的方式 增加七牛云私有文件下载方式</div>
<div>25.[新增]OssTemplate实现类获取流的方式去下载文件</div>
<div>26.[新增]代码生成saber3以及element-plus模版</div>
<div>27.[优化]代码生成数据模型新增后增加提示框是否需要配置详情</div>
<div>28.[优化]代码生成查询类型适配</div>
<div>29.[优化]代码生成优化基础业务的判断逻辑</div>
<div>30.[优化]代码生成增加excel导出功能</div>
<div>31.[优化]代码生成加快物理表信息读取速度</div>
<div>32.[优化]代码生成参数类型适配pg</div>
<div>33.[优化]代码生成数据模型新增逻辑</div>
<div>34.[优化]代码生成数据模型增加表前缀提醒</div>
<div>35.[优化]代码生成优化表前缀判断</div>
<div>36.[优化]代码生成数据模型删除增加关联表</div>
<div>37.[优化]登录成功后清除验证码缓存</div>
<div>38.[优化]代码生成通用字段默认隐藏</div>
<div>39.[优化]关闭nacos默认日志解决与logback冲突的问题</div>
<div>40.[优化]取消token默认签名强制要求配置自定义签名</div>
<div>41.[优化]资源管理默认参数判断逻辑</div>
<div>42.[优化]Oauth2 token发放增加空判断</div>
<div>43.[优化]BladeReids getIncr与getDecr专用方法</div>
<div>44.[修复]BladeRedis rPush 方法</div>
<div>45.[修复]Xss转义符</div>
<div>46.[修复]行政区划市级新增报错问题</div>
<div>47.[修复]Jackson注册模块失效的问题</div>
<div>48.[修复]流程部署问题</div>
<div>49.[修复]字典管理新增缓存上级数据不匹配的问题</div>
<div>50.[修复]用户模块先查看再提交会失败的问题</div>
<div>51.[迁移]Xxl-Job迁移至Biz工程</div>
<div>52.[迁移]user服务合并至system服务保留blade-user-api</div>
</el-collapse-item>
<el-collapse-item title="3.0.1.RELEASE发布,代码生成功能全面升级" name="28">
<div>1.[新增]数据模型在线配置</div>
<div>2.[新增]代码生成表单组件在线配置</div>
<div>3.[新增]Saber风格的单表生成模版</div>
<div>4.[新增]Saber风格的主子表生成模版</div>
<div>5.[新增]Saber风格的树表生成模版</div>
<div>6.[新增]ElementUI风格的单表生成模版</div>
<div>7.[新增]ElementUI风格的主子表生成模版</div>
<div>8.[新增]ElementUI风格的树表生成模版</div>
</el-collapse-item>
<el-collapse-item title="3.0.0.RELEASE发布,系统架构升级至 SpringCloud 2021" name="27">
<div>1.[升级]SpringCloud 2021.0.3</div>
<div>2.[升级]SpringBoot 2.7.1</div>
<div>3.[升级]SpringBootAdmin 2.7.1</div>
<div>4.[升级]AlibabaCloud 2021.0.1.0</div>
<div>5.[升级]Mybatis-Plus 3.5.2</div>
<div>6.[升级]Mybatis-Plus-Generator 3.5.3</div>
<div>7.[升级]Nacos 2.1.0</div>
<div>8.[升级]Seata 1.5.2</div>
<div>9.[升级]Log4J 2.18.0</div>
<div>10.[升级]JackSon 2.13.3</div>
<div>11.[升级]FastJson 1.2.83</div>
<div>12.[升级]Avue 2.9.12</div>
<div>13.[新增]基于Oauth2的单点登录</div>
<div>14.[新增]灰度服务发布与调用</div>
<div>15.[新增]代码生成增加element和feign模版</div>
<div>16.[优化]自动装配模块采用新版@AutoConfiguration注解</div>
<div>17.[优化]TencentCosTemplate避免oom的情况</div>
<div>18.[优化]TreeNode类</div>
<div>19.[优化]Gateway鉴权逻辑</div>
<div>20.[修复]BladeRedis incr方法失效的问题</div>
<div>21.[修复]租户产品包更新后缓存未刷新的问题</div>
<div>22.[修复]绑定租户产品包后普通管理员权限配置丢失按钮选项的问题</div>
<div>23.[修复]流程设计器监听无法删除的问题</div>
<div>24.[修复]用户excel导出条件为空的判断逻辑</div>
<div>25.[删除]Hystrix接入以Sentinel取代</div>
<div>26.[删除]Ribbon接入以LoadBalancer取代</div>
<div>27.[删除]Zipkin接入</div>
<div>28.[删除]Turbine接入</div>
<div>29.[替代]后续版本将对接SkyWalking取代Zipkin与Turbine</div>
</el-collapse-item>
<el-collapse-item title="2.9.1.RELEASE发布,新增达梦数据库支持,集成NutFlow流程设计器" name="26">
<div>1.[升级]Mybatis-Plus 3.5.1</div>
<div>2.[升级]Mybatis-Plus-Generator 3.5.2</div>
<div>3.[升级]Nacos 2.0.4</div>
<div>4.[升级]Log4j2 2.17.2</div>
<div>5.[升级]FastJson 1.2.80</div>
<div>6.[升级]Sentinel 1.8.3</div>
<div>7.[升级]EasyExcel 2.2.11</div>
<div>8.[升级]JuatAuth 1.16.5</div>
<div>9.[升级]OkHttp 4.9.3</div>
<div>10.[升级]AliyunOss 3.14.0</div>
<div>11.[升级]Minio 8.3.7</div>
<div>12.[升级]Qiniu 7.9.4</div>
<div>13.[升级]TencentCOS 5.6.69</div>
<div>14.[升级]HuaweiOss 3.21.12</div>
<div>15.[升级]Avue 2.9.4</div>
<div>16.[升级]ElementUI 2.15.6</div>
<div>17.[新增]达梦数据库支持</div>
<div>18.[新增]NutFlow流程设计器集成</div>
<div>19.[新增]Sword升级至AntdV4版本</div>
<div>20.[优化]租户全局数据源拦截器逻辑</div>
<div>21.[优化]单人在线模式RefreshToken的处理逻辑</div>
<div>22.[优化]单元测试支持读取服务名不同环境的配置</div>
<div>23.[优化]租户产品包支持配置清空</div>
<div>24.[优化]配置解决oracle更新null值报错的问题</div>
<div>25.[优化]适配oss与sms操作栏不换行</div>
<div>26.[优化]提升excel导出功能的用户体验</div>
<div>27.[优化]主页部门切换逻辑</div>
<div>28.[修复]用户解封增加空数据判断逻辑</div>
<div>29.[修复]流程用户查询增加租户ID筛选</div>
<div>30.[修复]Oauth2授权码模式失效</div>
<div>31.[修复]登录锁定逻辑</div>
<div>32.[修复]通知公告日期段查询报错</div>
</el-collapse-item>
<el-collapse-item title="2.9.0.RELEASE发布,新增租户菜单产品包功能" name="25">
<div>1.[升级]SpringCloud Hoxton.SR12</div>
<div>2.[升级]AlibabaCloud 2.2.7.RELEASE</div>
<div>3.[升级]Nacos 2.0.3</div>
<div>4.[升级]Log4j2 2.17.0</div>
<div>5.[升级]Druid 1.2.8</div>
<div>6.[升级]FastJson 1.2.78</div>
<div>7.[升级]Lombok 1.18.22</div>
<div>8.[升级]Avue 2.8.25</div>
<div>9.[升级]阿里云仓库为最新地址</div>
<div>10.[新增]租户菜单产品包功能</div>
<div>11.[新增]部门角色在线切换功能</div>
<div>12.[新增]登录错误次数支持从参数管理读取</div>
<div>13.[新增]管理端手动解锁用户功能</div>
<div>14.[新增]actuator接口增加内网放行外网认证功能</div>
<div>15.[新增]pg数据库int类型条件查询处理示例</div>
<div>16.[新增]Lemon平台代码生成模板</div>
<div>17.[优化]角色删除增加子节点判断</div>
<div>18.[优化]流程条件查询增加租户过滤</div>
<div>19.[优化]流程列表增加名称查询</div>
<div>20.[优化]登录成功时清除错误次数</div>
<div>21.[优化]适配cloud最新版异常处理</div>
<div>22.[优化]数据权限新增成功后清空表单数据</div>
<div>23.[修复]修复用户导入部门数据为null时保存报错的问题</div>
<div>24.[修复]修复刷新token导致多部门id被覆盖的问题</div>
<div>25.[修复]修复登录界面多部门选择弹框出现后直接刷新就能进入主页的问题</div>
<div>26.[修复]修复通知公告分页未带入查询条件的问题</div>
</el-collapse-item>
<el-collapse-item title="2.8.2.RELEASE发布,增强用户登录方案" name="24">
<div>1.[升级]SpringBoot 2.3.12</div>
<div>2.[升级]SpringBootAdmin 2.3.1</div>
<div>3.[升级]Knife4j 2.0.9</div>
<div>4.[升级]Nacos 2.0.2</div>
<div>5.[升级]Seata 1.4.2</div>
<div>6.[回滚]MybatisPlus 3.4.2</div>
<div>7.[升级]DynamicDatasource 3.3.6</div>
<div>8.[升级]Druid 1.2.6</div>
<div>9.[升级]Avue 2.8.18</div>
<div>10.[新增]用户登录错误次数锁定功能</div>
<div>11.[新增]多部门多角色用户在登录时增加下拉选项</div>
<div>12.[新增]新增用户多条件查询接口</div>
<div>13.[新增]Ribbon组件权重读取逻辑</div>
<div>14.[新增]ExcelUtil新增WriteHandler参数</div>
<div>15.[新增]CacheUtil增加指定tenantId清空方法</div>
<div>16.[优化]手机短信校验逻辑增加手机号强制判断</div>
<div>17.[优化]短信调试功能增加资源编号读取</div>
<div>18.[优化]多租户切面逻辑</div>
<div>19.[优化]多租户缓存清空逻辑</div>
<div>20.[优化]ISqlInjector支持自定义覆盖</div>
<div>21.[优化]优化日志对于租户id的判断</div>
<div>22.[优化]Menu类重写hashCode方法</div>
<div>23.[优化]MySql脚本将long类型字段改为bigint(20)</div>
<div>24.[修复]用户中心字段绑定相反的问题</div>
<div>25.[修复]关闭验证码模式后首页仍调用验证码接口的问题</div>
</el-collapse-item>
<el-collapse-item title="2.8.1.RELEASE发布,适配Nacos2支持长链接特性" name="23">
<div>1.[升级]SpringCloud Hoxton.SR11</div>
<div>2.[升级]Avue 2.8.12</div>
<div>3.[升级]Lombok 1.18.18</div>
<div>4.[升级]Nacos 2.0.1</div>
<div>5.[升级]JustAuth 1.16.1</div>
<div>6.[新增]JustAuth支持基于redis的state缓存</div>
<div>7.[新增]服务内部调用文件上传的工具类</div>
<div>8.[新增]插件市场目录说明</div>
<div>9.[新增]全新布局的字典管理模块</div>
<div>10.[优化]Dockerfile初始镜像改为固化的openjdk8-openj9含字体版本</div>
<div>11.[优化]SmsResponse返回字段message为msg</div>
<div>12.[优化]Feign熔断加载逻辑</div>
<div>13.[优化]Sql打印插件增加java8时间处理</div>
<div>14.[优化]多数据源环境下生效Sql打印插件的配置</div>
<div>15.[优化]校验短信验证码时与手机号关联验证</div>
<div>16.[优化]Request包装逻辑支持配置跳过</div>
<div>17.[优化]Mybatis-plus的SQLServerDialect逻辑</div>
<div>18.[优化]ObjectMapper支持可配</div>
<div>19.[优化]增加跨域请求头以防独立swagger服务出现跨域</div>
<div>20.[优化]数据权限与接口权限的缓存改为全局</div>
<div>21.[优化]Xss过滤逻辑</div>
<div>22.[优化]角色配置逻辑</div>
<div>23.[优化]菜单配置逻辑</div>
<div>24.[修复]ImageUtil宽高反转的bug</div>
<div>25.[修复]树组件未全选导致父节点没有入库从而引发顶部菜单生成的bug</div>
<div>26.[修复]字典通用接口未返回id与parentId产生的bug</div>
<div>27.[脚本]启动脚本增加jvm配置</div>
<div>28.[脚本]修复report脚本部署逻辑</div>
<div>29.[移除]过时的BladeRedisCache请用BladeRedis取代</div>
</el-collapse-item>
<el-collapse-item title="2.8.0.RELEASE发布,集成Prometheus全方位监控方案" name="22">
<div>1.[升级]SpringCloud Hoxton.SR10</div>
<div>2.[升级]AlibabaCloud 2.2.5.RELEASE</div>
<div>3.[升级]FastJson 1.2.75</div>
<div>4.[升级]Druid 1.2.5</div>
<div>5.[升级]EasyExcel 1.2.7</div>
<div>6.[升级]JustAuth 1.15.9</div>
<div>7.[升级]Avue 2.8.1</div>
<div>8.[升级]ElementUI 2.15.1</div>
<div>9.[升级]Oss与Sms升级依赖并适配最新版</div>
<div>10.[新增]基于宝塔系统的部署方案</div>
<div>11.[新增]Prometheus全方位监控方案</div>
<div>12.[新增]blade-admin服务支持prometheus对nacos的服务发现</div>
<div>13.[新增]BladeX对接Prometheus部署脚本</div>
<div>14.[新增]Saber远程部署推送脚本</div>
<div>15.[新增]基于Sentinel的服务熔断方案</div>
<div>16.[新增]Mybatis-Plus添加OptimizeJoin配置参数</div>
<div>17.[优化]将oss-starter系列合并为一</div>
<div>18.[优化]将sms-starter系列合并为一</div>
<div>19.[优化]增强优化Url通配符匹配逻辑</div>
<div>20.[优化]数据权限缓存逻辑</div>
<div>21.[优化]blade-auto封装</div>
<div>22.[优化]SqlLogInterceptor配置</div>
</el-collapse-item>
<el-collapse-item title="2.7.2.RELEASE发布,重构升级常用功能,优化使用体验" name="21">
<div>1.[升级]SpringBoot 2.2.13.RELEASE</div>
<div>2.[升级]AlibabaCloud 2.2.5</div>
<div>3.[升级]Mybatis-Plus 3.4.2</div>
<div>4.[升级]Dynamic-Datasource 至3.3.1</div>
<div>5.[升级]Avue 2.7.8</div>
<div>6.[升级]适配 Knife4j 2.0.8</div>
<div>7.[重构]Swagger聚合网关迁移至全新的blade-swagger服务</div>
<div>8.[重构]Sql日志打印采用druid底层实现展示完整带参SQL</div>
<div>9.[新增]LocalFile的domain字段</div>
<div>10.[新增]Sign模式鉴权timestamp在10秒内的合法时间段判断</div>
<div>11.[新增]开启租户插件后使用@TenantIgnore注解精准关闭租户过滤逻辑</div>
<div>12.[新增]Swagger公共信息配置</div>
<div>13.[新增]Saber矢量图标离线化</div>
<div>14.[新增]菜单管理isOpen字段控制左侧菜单是否可以使用新tab打开外链</div>
<div>15.[新增]Mybatis-Plus的Page合并工具类</div>
<div>16.[优化]阿里云短信返回成功判断逻辑</div>
<div>17.[优化]Token过期时间处理</div>
<div>18.[优化]Redis加载逻辑</div>
<div>19.[优化]用户登录逻辑</div>
<div>20.[优化]多租户角色创建逻辑</div>
<div>21.[优化]Dockerfile加速字体构建</div>
<div>22.[优化]Nacos Shared Config配置API改为最新版</div>
<div>23.[优化]Saber授权类型字段改为checkbox</div>
<div>24.[修复]RequestLog遇到MultipartFile.[]类型序列化报错的问题</div>
<div>25.[修复]顶级字典更新后未同步更新下属字典的编号</div>
<div>26.[修复]Saber退出后未刷新浏览器顶部title路由的问题</div>
<div>27.[修复]菜单机构模块关闭编辑界面再打开新增界面数据没有清空的问题</div>
</el-collapse-item>
<el-collapse-item title="2.7.1.RELEASE发布,重构钉钉监控通知,升级依赖适配最新API" name="20">
<div>1.[升级]SpringBoot 2.2.12.RELEASE</div>
<div>2.[升级]SpringCloud Hoxton.SR9</div>
<div>3.[升级]Knife4j 2.0.8</div>
<div>4.[升级]Druid 1.2.4</div>
<div>5.[升级]Seata 1.4.1</div>
<div>6.[升级]Jackson 2.11.4</div>
<div>7.[升级]Mybatis-Plus 3.4.1</div>
<div>8.[升级]Dynamic-Datasource 至3.2.1</div>
<div>9.[升级]Avue 2.7.5</div>
<div>10.[新增]Secure模块动态签名认证特性</div>
<div>11.[新增]Redis序列化方式的配置</div>
<div>12.[新增]用户导入导出的用户平台字段</div>
<div>13.[修改]日志路径默认优先级支持配置覆盖</div>
<div>14.[修改]Report模块包路径新增Core目录</div>
<div>15.[重构]blade-admin钉钉监控通知实现</div>
<div>16.[优化]blade-admin增加账号密码登录</div>
<div>17.[优化]RefreshToken刷新逻辑</div>
<div>18.[优化]租户新增逻辑业务字典支持无限层级复制</div>
<div>19.[优化]Ribbon组件支持Feign调用配置</div>
<div>20.[修复]流程名搜索失效的问题</div>
<div>21.[修复]附件管理租户隔离问题</div>
<div>22.[修复]数据权限分配模块的sqlserver兼容性</div>
<div>23.[修复]系统字典缓存刷新逻辑</div>
<div>24.[修复]Swagger文档出现Locale参数的问题</div>
<div>25.[删除]spring-cloud-stream依赖按需引入</div>
</el-collapse-item>
<el-collapse-item title="2.7.0.RELEASE发布,更新Hoxton.SR8,全面升级底层驱动" name="19">
<div>1.[升级]SpringBoot 2.2.11.RELEASE</div>
<div>2.[升级]SpringCloud Hoxton.SR8</div>
<div>3.[升级]AlibabaCloud 2.2.3.RELEASE</div>
<div>4.[升级]SpringBootAdmin 2.2.4</div>
<div>5.[升级]Knife4j 2.0.6</div>
<div>6.[升级]Swagger 2.10.5</div>
<div>7.[升级]SwaggerModel 1.6.2</div>
<div>8.[升级]SpringPlugin 2.2.0.RELEASE</div>
<div>9.[升级]Druid 1.2.1</div>
<div>10.[升级]JustAuth 1.15.8</div>
<div>11.[升级]Dubbo 2.7.8</div>
<div>12.[升级]Guava 30.0-jre</div>
<div>13.[升级]Avue 2.7.0</div>
<div>14.[优化]Swagger封装以支持Knife4j最新API</div>
<div>15.[优化]引入Knife4j增强配置,生产环境将完全隔离文档访问</div>
<div>16.[修复]未引入租户插件后,自定义类空指针的问题</div>
<div>17.[删除]Zipkin模块,推荐使用官方独立模式运行服务</div>
</el-collapse-item>
<el-collapse-item title="2.6.1.RELEASE发布,增加全局上下文系统,增加用户平台拓展模块" name="18">
<div>1.[升级]SpringBoot 2.1.17.RELEASE</div>
<div>2.[升级]Mybatis-Plus 3.4.0</div>
<div>3.[升级]Knife4j 2.0.5</div>
<div>4.[升级]JJWT 0.11.2</div>
<div>5.[升级]FastJson 1.2.74</div>
<div>6.[新增]上下文核心包优化全局上下文配置</div>
<div>7.[新增]secure模块的basic认证功能</div>
<div>8.[新增]用户平台拓展模块</div>
<div>9.[优化]重构增强cloud模块</div>
<div>10.[优化]request核心至boot模块</div>
<div>11.[优化]增强mybatis-plus的分页防注入功能</div>
<div>12.[优化]sms返回结果去掉验证码序列化</div>
<div>13.[优化]数据权限插件支持最新版mybatis-plus</div>
<div>14.[优化]增强sql日志拦截器</div>
<div>15.[优化]增强令牌新增对用户平台的判断逻辑</div>
<div>16.[优化]代码生成增加对sqlserver的支持</div>
<div>17.[优化]自定义mapper的api</div>
<div>18.[修复]Kv类克隆强转问题</div>
<div>19.[修复]elk配置无法读取项目名的问题</div>
<div>20.[修复]区划字段level为regionLevel以防oracle报错</div>
</el-collapse-item>
<el-collapse-item title="2.6.0.RELEASE发布,租户数据库隔离、报表管理、SqlServer兼容" name="17">
<div>1.[升级]Avue 2.6.15</div>
<div>2.[升级]SpringBoot 2.1.16.RELEASE</div>
<div>3.[升级]Seata 1.3.0</div>
<div>4.[升级]Nacos 1.3.2</div>
<div>5.[升级]FastJson 1.2.73</div>
<div>6.[升级]Knife4j 2.0.4</div>
<div>7.[升级]EasyExcel 2.2.6</div>
<div>8.[升级]JustAuth 1.15.6</div>
<div>9.[新增]多租户数据库隔离动态数据源特性</div>
<div>10.[新增]SqlServer兼容</div>
<div>11.[新增]UReport2报表管理模块</div>
<div>12.[新增]对象存储附件表功能</div>
<div>13.[优化]LocalFile支持序列化</div>
<div>14.[优化]MinioTemplate增加ContentType配置</div>
<div>15.[优化]LogBack-Elk的配置</div>
<div>16.[优化]流程状态变更的返回信息</div>
<div>17.[优化]顶部菜单配置接口支持大容量数据传输</div>
<div>18.[优化]User密码字段序列化</div>
<div>19.[优化]序列化additionalInformation解决非null值报错的问题</div>
<div>20.[修复]启用Token有状态模式下刷新Token的问题</div>
<div>21.[修复]日志表无法入库TenantId的问题</div>
<div>22.[修复]flowable-oracle脚本运行错误的问题</div>
</el-collapse-item>
<el-collapse-item title="2.5.1.RELEASE发布,增加第三方登录、行政区划、API报文加密" name="16">
<div>1.[升级]Avue 2.6.1ElementUI 2.13.2</div>
<div>2.[升级]SpringBoot 2.1.14.RELEASE</div>
<div>3.[升级]SpringCloud Greenwich.SR6</div>
<div>4.[升级]SpringCloud Alibaba 2.1.2.RELEASE</div>
<div>5.[升级]Seata 1.2.0</div>
<div>6.[升级]FastJson 1.2.70</div>
<div>7.[升级]Knife4j 2.0.3</div>
<div>8.[升级]MybatisPlus 至3.3.2</div>
<div>9.[升级]EasyExcel 2.2.4</div>
<div>10.[新增]第三方系统登录集成拓展JustAuth</div>
<div>11.[新增]行政区划功能模块</div>
<div>12.[新增]API报文加密工具</div>
<div>13.[新增]Token配置支持有状态模式支持一人在线或多人在线</div>
<div>14.[新增]Secure配置支持配置请求方法类型请求路径请求表达式匹配</div>
<div>15.[新增]Jackson配置支持大数字转字符串模式支持null转空值模式</div>
<div>16.[新增]租户账号授权码保护机制防止私有部署客户篡改数据库越权</div>
<div>17.[优化]字典模块增加树形结构</div>
<div>18.[优化]新增租户逻辑新增时同步超管配置的默认业务字典数据</div>
<div>19.[优化]用户导入逻辑只有超管才可以定义租户编号</div>
<div>20.[优化]部门列表逻辑非超管角色只可看到本级及以下部门数据</div>
<div>21.[优化]字典模块增加枚举类统一入口</div>
<div>22.[优化]DictCache缓存加载逻辑</div>
<div>23.[优化]租户缓存刷新逻辑</div>
<div>24.[优化]角色配置逻辑同步取消子角色对应的菜单权限</div>
<div>25.[优化]顶部菜单增加排序功能</div>
<div>26.[优化]INode支持泛型</div>
<div>27.[优化]代码结构为bean统一加上final关键字修饰</div>
<div>28.[优化]Nacos动态刷新配置</div>
<div>29.[优化]Dockerfile采用Openj9基础镜像大幅度降低内存占用</div>
<div>30.[优化]工程启动逻辑关闭Flowable自动建表功能需要手动导入流程sql</div>
<div>31.[修复]SpringBootAdmin读取actuator路径配置</div>
<div>32.[修复]用户导入逻辑修正密码加密规则</div>
<div>33.[修复]Boot版本Xss默认配置路径</div>
</el-collapse-item>
<el-collapse-item title="2.5.0.RELEASE发布,增加岗位管理,增加用户导入导出" name="15">
<div>1.[升级]Avue 2.5.0</div>
<div>2.[升级]SpringBoot 2.1.13</div>
<div>3.[升级]FastJson 1.2.68</div>
<div>4.[升级]Druid 1.1.22</div>
<div>5.[升级]Knife4j 2.0.2</div>
<div>6.[升级]Taobao-Sdk 20200415</div>
<div>7.[升级]docker-maven-plugin dockerfile-maven-plugin</div>
<div>8.[新增]验证码开关</div>
<div>9.[新增]数据权限全局开关</div>
<div>10.[新增]岗位管理模块</div>
<div>11.[新增]用户Excel导入导出功能</div>
<div>12.[新增]用户绑定岗位功能</div>
<div>13.[新增]EasyExcel封装工具ExcelUtil</div>
<div>14.[新增]Feign内部线程传递</div>
<div>15.[新增]Mybatis-Plus配置支持配置最大分页数</div>
<div>16.[新增]Gateway在多团队协作模式灵活指向本地服务的配置</div>
<div>17.[新增]Sms模块的sendMessage接口及SmsResponse响应类</div>
<div>18.[新增]CacheUtil租户缓存隔离功能</div>
<div>19.[优化]CacheUtil缓存重载逻辑返回bean不为null但数据全为空将不入缓存</div>
<div>20.[优化]缓存清除逻辑@CacheEvict统一修改为CacheUtil.clear</div>
<div>21.[优化]登录逻辑前端对密码加密后再传递至鉴权接口</div>
<div>22.[优化]Oss上传接口返回domain字段</div>
<div>23.[优化]BladeRedisCache命名为BladeRedis</div>
<div>24.[优化]控制台日志打印功能规避MultipartFile读取报错</div>
<div>25.[优化]配置关键字enable统一为enabled</div>
<div>26.[优化]keyword日期处理</div>
<div>27.[优化]代码生成sql脚本默认在工作台菜单下</div>
<div>28.[优化]Jwt获取Token逻辑</div>
<div>29.[优化]Token返回增加岗位ID</div>
<div>30.[优化]TokenGranter采用更简洁的拓展方式</div>
<div>31.[优化]日志管理展现方式</div>
<div>32.[优化]新建租户逻辑增加参数读取来设置新建租户的配置</div>
<div>33.[优化]流程签收接口支持多角色操作</div>
<div>34.[优化]动态网关支持读取自定义namespace配置</div>
<div>35.[优化]删除租户逻辑同时删除对应的用户</div>
<div>36.[优化]树形懒加载支持局部实时刷新功能</div>
<div>37.[优化]多租户插件新增修改逻辑若指定tenantId为空则不进行操作</div>
<div>38.[优化]SmsBuilderOssBuilder</div>
<div>39.[优化]Sentinel配置</div>
<div>40.[优化]XssFilter为全局的BladeRequestFilte</div>
<div>41.[优化]BladeX开发手册Linux部署章节讲解</div>
<div>42.[优化]Saber相关配置以适配Avue最新版API</div>
<div>43.[优化]Saber相关配置内done与loading的顺序</div>
<div>44.[修复]用户基本信息修改的bug</div>
<div>45.[修复]QiniuTemplate的putFile循环调用的bug</div>
<div>46.[修复]日志框架获取RequestBody为空的bug</div>
<div>47.[修复]Saber组件被复用导致没有刷新的bug</div>
<div>48.[删除]过时的BladeSecureUrlProperties</div>
<div>49.[删除]过时的XssUrlProperties</div>
<div>50.[删除]过时的RedisUtil</div>
</el-collapse-item>
<el-collapse-item title="2.4.0.RELEASE发布,增加多租户短信服务,升级Seata1.1" name="14">
<div>1.[新增]集成七牛阿里云腾讯云云片等短信服务支持多租户配置</div>
<div>2.[新增]对象存储模块的资源编号字段可根据编号指定oss配置的服务</div>
<div>3.[新增]对象存储短信配置模块的调试功能可在线调试配置是否可用</div>
<div>4.[新增]超管启用租户过滤的配置</div>
<div>5.[升级]SpringBoot 2.1.12SpringCloud SR5</div>
<div>6.[升级]兼容 Seata 1.1</div>
<div>7.[优化]对象存储的模块使用体验</div>
<div>8.[优化]兼容Oracle模糊查询的写法</div>
<div>9.[优化]超管权限不受租户过期时间影响</div>
<div>10.[优化]mybatis-plus相关过期注解</div>
<div>11.[优化]xxl-job模块的配置文件</div>
<div>12.[优化]INode支持序列化接口</div>
<div>13.[优化]统一Oss模块命名</div>
<div>14.[优化]部署脚本升级相关版本</div>
<div>15.[修复]数据权限部门过滤已删除对象</div>
<div>16.[修复]业务字典缓存bug增加租户过滤</div>
<div>17.[修复]占位符解析器的bug</div>
</el-collapse-item>
<el-collapse-item title="2.3.1.RELEASE发布,流程增加租户定制,登录增加验证码" name="13">
<div>1.[新增]登录验证码功能</div>
<div>2.[新增]Oauth2自定义TokenGranter</div>
<div>3.[新增]工作流绑定租户功能支持通用流程和定制流程</div>
<div>4.[新增]Condition类的自定义参数排除入口</div>
<div>5.[增强]租户插件功能新增操作可根据自定义的tenantId值进行覆盖</div>
<div>6.[增强]超管权限不受数据权限插件影响</div>
<div>7.[升级]mybatis-plus至3.3.1</div>
<div>8.[优化]mybatis-plus封装提升分页可拓展性</div>
<div>9.[优化]lib分离打包逻辑</div>
<div>10.[优化]CacheUtil初始化逻辑</div>
<div>11.[优化]HttpUtil采用最新封装逻辑</div>
<div>12.[优化]角色信息获取逻辑为实时不受开源版单体版缓存影响</div>
<div>13.[优化]日志打印工具判断空逻辑</div>
<div>14.[修复]BeanUtil的class类型判断逻辑</div>
<div>15.[删除]基于zookeeper体验不佳的分布式锁</div>
</el-collapse-item>
<el-collapse-item title="2.3.0.RELEASE发布,租户增强,底层架构插件全面增强" name="12">
<div>1.[新增]swagger-bootstrap-ui全新升级为knife4j</div>
<div>2.[新增]saber升级至avue2.3.7版本</div>
<div>3.[新增]saber树表懒加载模式</div>
<div>4.[新增]腾讯云存储封装</div>
<div>5.[新增]xxl-job集成支持分布式任务调度</div>
<div>6.[新增]kafkarabbitmqcloudstream集成</div>
<div>7.[新增]redis分布式锁插件</div>
<div>8.[新增]高性能http调用模块</div>
<div>9.[新增]PropertySource注册逻辑提高安全性</div>
<div>10.[新增]Param参数缓存工具类</div>
<div>11.[新增]租户操作增加创建对应的租户管理员账号菜单权限</div>
<div>12.[新增]租户插件超管可查看所有租户数据的逻辑</div>
<div>13.[新增]租户功能绑定域名系统背景账号额度过期时间</div>
<div>14.[新增]登录创建用户操作绑定租户配置</div>
<div>15.[优化]租户插件判断逻辑增加flowable相关表的租户过滤排除</div>
<div>16.[优化]xss过滤逻辑提高性能</div>
<div>17.[优化]本地文件上传逻辑</div>
<div>18.[优化]oss配置修改后及时生效无需点击启用</div>
<div>19.[优化]请求日志展示功能</div>
<div>20.[修复]前端关闭租户模式导致的新增用户失效问题</div>
<div>21.[修复]OSS相关bucket命名的问题</div>
<div>22.[修复]ribbon组件由降级引起的问题</div>
</el-collapse-item>
<el-collapse-item title="2.2.2.RELEASE发布,增强字典管理,用户管理增加左树右表" name="11">
<div>1.[优化]拆分出系统字典表与业务字典表字典键值改为string类型</div>
<div>2.[优化]用户管理增加左树右表功能</div>
<div>3.[优化]租户新增增加租户默认类型</div>
<div>4.[优化]多租户表对应实体继承TenantEntity</div>
<div>5.[优化]用于本地上传的BladeFile类更名为LocalFile防止冲突</div>
<div>6.[优化]菜单新增逻辑</div>
<div>7.[优化]mybatis-plus默认配置的处理</div>
<div>8.[优化]租户过滤判断逻辑删除多余的类</div>
<div>9.[优化]alioss生成地址的逻辑</div>
<div>10.[优化]redisTemplate加载逻辑</div>
<div>11.[优化]租户处理简化配置自动识别需要过滤的租户表</div>
<div>12.[优化]数据权限表单用户体验</div>
<div>13.[修复]数据权限插件不兼容的问题</div>
<div>14.[修复]数据权限树勾选显示问题</div>
<div>15.[修复]windows平台elk开关失效的问题</div>
<div>16.[修复]租户bean加载逻辑</div>
<div>17.[修复]saber代码生成驼峰路径导致的问题</div>
<div>18.[修复]docker脚本nginx端口匹配问题</div>
<div>19.[修复]机构模块提交未删除缓存的问题</div>
<div>20.[修复]oss缓存获取未加租户判断的问题</div>
<div>21.[修复]blade-auth在java11下无法运行的问题</div>
</el-collapse-item>
<el-collapse-item title="2.2.1.RELEASE发布,集成ELK,增加分布式日志追踪" name="10">
<div>1.[新增]集成最新版ELK增加分布式日志追踪功能</div>
<div>2.[新增]增加ELK一键部署docker脚本</div>
<div>3.[新增]抽象封装日志管理逻辑</div>
<div>4.[新增]BladeX-Biz增加easypoi的demo工程</div>
<div>5.[新增]BladeX-Biz增加websocket的demo工程</div>
<div>6.[优化]minio文件策略</div>
<div>7.[新增]Sql条件构建类去除分页字段</div>
<div>8.[优化]sql打印功能</div>
<div>9.[优化]wrapper逻辑</div>
<div>10.[新增]CommonConstant拆分出LauncherConstant</div>
</el-collapse-item>
<el-collapse-item title="2.2.0.RELEASE发布,增加集群监控,链路追踪" name="9">
<div>1.[新增]turbine集群监控服务</div>
<div>2.[新增]zipkin分布式链路追踪</div>
<div>3.[升级]seata版本至0.9.0解决分布式事务遇到的bug</div>
<div>4.[新增]Launcher的nacos配置改为sharedIds提升子工程配置优先级</div>
<div>5.[新增]增加changeStatus方法方便修改业务状态字段</div>
<div>6.[新增]saber代码模板增加刷新事件</div>
<div>7.[新增]saber底层架构升级</div>
<div>8.[新增]saber支持tab切换保存页面状态</div>
<div>9.[新增]添加bom统一版本配置</div>
<div>10.[新增]添加trace starter</div>
<div>11.[新增]blade-admin排除seata服务</div>
<div>12.[新增]oss敏感操作增加权限校验</div>
<div>13.[新增][修复]dictrole不选择父节点报错</div>
<div>14.[新增]动态网关设置启动加载</div>
<div>15.[新增]字典增加封存功能</div>
</el-collapse-item>
<el-collapse-item title="2.1.0.RELEASE发布,全面增强底层驱动" name="8">
<div>1.[升级]springboot 2.1.8springcloud greenwich sr3</div>
<div>2.[新增]集成seata提供最简集成方案</div>
<div>3.[新增]blade-admin增加nacos动态监听</div>
<div>4.[新增]增加alioss集成强化oss返回信息</div>
<div>5.[新增]获取令牌操作增加空判断</div>
<div>6.[新增]拆分数据库依赖增强mybatis增加yml自定义配置读取</div>
<div>7.[新增]各模块增加默认的yml配置不占用application.yml</div>
<div>8.[新增]增加ribbon组件可自定义lb优先选择的ip段解决团队网关调试需求</div>
<div>9.[优化]feign的bean加载逻辑</div>
<div>10.[增强]condition条件</div>
<div>11.[优化]日志打印效果</div>
<div>12.[重构]redis模块增加redis限流功能</div>
<div>13.[优化]beanutil性能</div>
<div>14.[优化]去掉调试用的RouteEndpoint增强安全性</div>
<div>15.[优化]部门新增逻辑</div>
</el-collapse-item>
<el-collapse-item title="2.0.7.RELEASE发布,增加网关鉴权,强化代码生成" name="7">
<div>1.[新增]增加基于Nacos的动态网关鉴权</div>
<div>2.[新增]代码生成增加多数据源选择强化单表代码生成</div>
<div>3.[新增]增加个人信息修改头像上传密码更新功能</div>
<div>4.[优化]新建角色逻辑</div>
<div>5.[修复]若干issue</div>
</el-collapse-item>
<el-collapse-item title="2.0.6.RELEASE发布,兼容三大主流数据库" name="6">
<div>1.[新增]一套代码兼容MysqlOraclePostgreSQL三大主流数据库</div>
<div>2.[升级]flowable 6.4.2</div>
<div>3.[新增]超管默认拥有所有菜单权限</div>
<div>4.[修复]权限配置数据长度过大的bug</div>
<div>5.[新增]增加租户信息获取</div>
<div>6.[优化]命令行启动顺序</div>
<div>7.[升级]alibaba cloud毕业版本</div>
<div>8.[新增]日志监听增加自定义配置</div>
<div>9.[升级]swagger-bootstrap-ui版本</div>
<div>10.[新增]saber表格自适应增加loading</div>
<div>11.[新增]saber通知公告模块增加富文本编辑器</div>
</el-collapse-item>
<el-collapse-item title="2.0.5.RELEASE发布,升级分布式接口权限系统" name="5">
<div>1.[升级]为分布式接口权限系统</div>
<div>2.[新增]增加多租户自定义顶部菜单功能</div>
<div>3.[升级]greenwich SR2mybatis-plus 3.1.2</div>
<div>4.[新增]swagger排序规则采用最新注解</div>
<div>5.[新增]数据权限增加可见字段配置</div>
<div>6.[新增]数据权限增加分布式服务支持</div>
<div>7.[新增]增加远程调用分页的例子解决mybatis-plus传递IPage反序化出现的bug</div>
<div>8.[优化]租户接口权限规则</div>
<div>9.[新增]SqlKeyword增加条件判断</div>
<div>10.[修复]部分模块包名分层的问题</div>
</el-collapse-item>
<el-collapse-item title="2.0.4.RELEASE发布,增加动态数据权限系统" name="4">
<div>1.[新增]注解+web可视化配置的动态数据权限系统</div>
<div>2.[升级]部门管理为机构管理增加机构类型</div>
<div>3.[新增]解决mybatis-plus排序字段的sql注入问题</div>
<div>4.[新增]create_dept统一业务字段</div>
<div>5.[新增]swagger ui页面设置Authorize 默认全局参数</div>
<div>6.[新增]jsonutil增加封装方法,去掉devtools依赖</div>
<div>7.[新增]数据库连接适配mysql8</div>
<div>8.[新增]docker-compose脚本增加时区</div>
<div>9.[新增]oauth申请token可支持自定义表</div>
<div>10.[修复]代码生成sql缺失主键的问</div>
<div>11.[新增]boot版本重构登录逻辑增强可拓展性</div>
</el-collapse-item>
<el-collapse-item title="2.0.3.RELEASE发布,优化多租户oss系统,优化业务架构" name="3">
<div>1.[新增]gateway增加动态文档配置可通过配置nacos动态刷新</div>
<div>2.[优化]修正blade_menu代码生成模块删除api的地址</div>
<div>3.[优化]mysql依赖</div>
<div>4.[新增]LauncherService增加排序功能</div>
<div>5.[优化]hystrixfeign加载</div>
<div>6.[优化]多租户oss系统逻辑使之更加易用</div>
<div>7.tenant_code字段统一为tenant_id</div>
</el-collapse-item>
<el-collapse-item title="2.0.2.RELEASE发布,增加多租户oss管理系统" name="2">
<div>1.[新增]增加minio封装</div>
<div>2.[新增]增加qiniu封装</div>
<div>3.[新增]增加oss统一接口</div>
<div>4.[新增]集成minioqiniu进行统一管理的多租户oss系统</div>
<div>5.[优化]blade-core-cloud逻辑</div>
<div>6.[新增]badex-biz增加不同包名的swaggermybatis配置demo</div>
<div>7.[新增]badex-biz增加nacos自定义注册文件demo</div>
<div>8.[新增]bladex-biz增加nacos参数动态刷新demo</div>
</el-collapse-item>
<el-collapse-item title="2.0.1.RELEASE发布,系统优化版本" name="1">
<div>1.[新增]兼容jdk11</div>
<div>2.[新增]支持refresh_token功能</div>
<div>3.[新增]增加minio封装支持多租户模式的oss对象存储</div>
<div>4.[新增]集成dubbo最新版本支持rpc远程调用</div>
<div>5.[新增]定制基于nacos的gateway动态网关</div>
<div>6.[优化]聚合网关配置使之更加轻巧</div>
<div>7.[新增]CacheUtil增加缓存清除方法</div>
<div>8.[优化]日志文件格式</div>
<div>9.[新增]Secure拦截器支持自定义加载</div>
</el-collapse-item>
<el-collapse-item title="2.0.0.RELEASE发布,完美定制的微服务开发平台" name="0">
<div>1.[新增]Swagger提供list形式配置扫描包</div>
<div>2.[新增]DictCacheUserCacheSysCache缓存工具类</div>
<div>3.[新增]重新设计EntityWrapper结构使之更加简单易用</div>
<div>4.[新增]强化部分敏感数据的删除校验</div>
<div>5.[新增]Condition类的sql条件构造器</div>
<div>6.[修复]工作流分页bug</div>
<div>7.[优化]docker配置</div>
<div>8.[优化]多租户逻辑</div>
<div>9.[优化]request打印日志逻辑</div>
<div>10.[修复]getIp的bug</div>
<div>11.[优化]saber代码生成模板</div>
<div>12.[新增]saber更新至element-ui 2.8.2版本</div>
<div>13.[修复]saber分页bug</div>
<div>14.[新增]crud组件提交报错后恢复按钮状态</div>
<div>15.[新增]字典管理表单调整</div>
<div>16.[升级]springboot 2.1.5</div>
</el-collapse-item>
</el-collapse>
</basic-container>
</el-row>
</el-col>
</el-row>
</div>
</template>
<script>
import {mapGetters} from "vuex";
export default {
name: "wel",
data() {
return {
activeNames: ['1', '2', '3', '5'],
logActiveNames: ['30']
};
},
computed: {
...mapGetters(["userInfo"]),
},
methods: {
handleChange(val) {
window.console.log(val);
}
},
};
</script>
<style>
.el-font-size {
font-size: 14px;
}
</style>

@ -1,10 +1,20 @@
<template>
<div>
<div id='mapContainer' style="widht:1000px;height:1000px;background:red;"></div>
<el-row>
<el-col :span="24">
<basic-container>
<div style="height: 700px;text-align: center;">
<div class="page-title">欢迎进入入侵报警系统</div>
<img src="/img/bg/home.jpg" style="margin: 50px auto 0;" />
</div>
</basic-container>
</el-col>
</el-row>
</div>
</template>
<script>
import {mapGetters} from "vuex";
export default {
name: "wel",
@ -12,22 +22,24 @@
return {
};
},
mounted() {
window.map = new jsmapbase.JSMap({
container:'mapContainer',
mapServerURL:'data/map'
});
window.map.openMapById('0001');
computed: {
...mapGetters(["userInfo"]),
},
methods: {
},
};
</script>
<style>
.el-font-size {
font-size: 14px;
.page-title{
color: #676a6c;
font-size: 48px;
font-weight: bold;
font-family: YouSheBiaoTiHei-2;
line-height: 56px;
text-align: center;
padding-top: 30px;
letter-spacing: 4px;
}
</style>

@ -1,346 +1,343 @@
<template>
<basic-container>
<avue-crud :option="option"
:table-loading="loading"
:data="data"
:page.sync="page"
ref="crud"
@row-del="rowDel"
v-model="form"
:permission="permissionList"
@row-update="rowUpdate"
@row-save="rowSave"
:before-open="beforeOpen"
@search-change="searchChange"
@search-reset="searchReset"
@selection-change="selectionChange"
@current-change="currentChange"
@size-change="sizeChange"
@refresh-change="refreshChange"
@on-load="onLoad">
<template slot="menuLeft">
<el-button type="danger"
size="small"
icon="el-icon-delete"
plain
v-if="permission.notice_delete"
@click="handleDelete">
</el-button>
</template>
<template slot-scope="{row}"
slot="category">
<el-tag>{{row.categoryName}}</el-tag>
</template>
<avue-crud :option="option" :table-loading="loading" :data="data" :page.sync="page" ref="crud" @row-del="rowDel"
v-model="form" :permission="permissionList" @row-update="rowUpdate" @row-save="rowSave" :before-open="beforeOpen"
@search-change="searchChange" @search-reset="searchReset" @selection-change="selectionChange"
@current-change="currentChange" @size-change="sizeChange" @refresh-change="refreshChange" @on-load="onLoad">
</avue-crud>
</basic-container>
</template>
<script>
import {getList, remove, update, add, getNotice} from "@/api/desk/notice";
import {mapGetters} from "vuex";
import { bizLogin, bizDeviceList, bizDeviceDetail, bizDeviceStatus, bizNodeType } from "@/api/wirelessintrusion/wirelessintrusion";
import { mapGetters } from "vuex";
export default {
data() {
return {
form: {},
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
selectionList: [],
option: {
height: 'auto',
calcHeight: 30,
dialogWidth: 950,
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
viewBtn: true,
selection: true,
excelBtn: true,
dialogClickModal: false,
column: [
{
label: "设备名称",
prop: "title",
span: 12,
search: true,
rules: [{
required: true,
message: "请输入通知标题",
trigger: "blur"
}]
},
{
label: "设备编号",
prop: "factorySn",
span: 12,
search: true,
rules: [{
required: true,
message: "请输入设备编号",
trigger: "blur"
}]
},
{
label: "设备大类",
type: "select",
dicUrl: "/api/blade-system/dict/dictionary?code=notice",
props: {
label: "dictValue",
value: "dictKey"
},
span: 12,
dataType: "number",
slot: true,
prop: "deviceCategoryId",
search: true,
hide: true,
viewDisplay: false,
rules: [{
required: true,
message: "请选择设备大类",
trigger: "blur"
}]
},
{
label: "设备大类",
prop: "brandName",
span: 12,
addDisplay: false,
editDisplay: false
},
{
label: "品牌编号",
type: "select",
prop: "brandCode",
span: 12,
hide: true,
addDisplay: true,
editDisplay: true,
viewDisplay: false,
rules: [{
required: true,
message: "请选择品牌编号",
trigger: "blur"
}]
},
{
label: "品牌名称",
prop: "brandName",
span: 12,
search: true,
addDisplay: false,
editDisplay: false,
viewDisplay: true
},
{
label: "所属区域",
type: "select",
prop: "regionCode",
span: 12,
hide: true,
addDisplay: true,
editDisplay: true,
viewDisplay: false,
rules: [{
required: true,
message: "请选择所属区域",
trigger: "blur"
}]
},
{
label: "所属区域",
prop: "regionName ",
span: 12,
addDisplay: false,
editDisplay: false,
viewDisplay: true,
export default {
data() {
return {
form: {},
query: {},
loading: true,
page: {
pageSize: 10,
currentPage: 1,
total: 0
},
selectionList: [],
option: {
height: 'auto',
calcHeight: 30,
dialogWidth: 950,
tip: false,
searchShow: true,
searchMenuSpan: 6,
border: true,
index: true,
viewBtn: true,
editBtn: false,
delBtn: false,
addBtn: false,
dialogClickModal: false,
column: [
{
label: "设备名称",
prop: "name",
span: 12,
search: true,
formatter: (val, value, label) => {
return val.name + '/' + val.remark
},
{
label: "安装位置",
prop: "areaId",
span: 12,
rules: [{
required: true,
message: "请输入设备安装详细位置",
trigger: "blur"
}]
labelWidth: 120
},
{
label: "备注名称",
prop: "remark",
span: 12,
hide: true,
viewDisplay: true,
labelWidth: 120
},
{
label: "设备所属产品",
prop: "name",
span: 12,
labelWidth: 120
},
{
label: "节点类型",
type: "select",
dicData: [],
props: {
label: "dictLabel",
value: "dictValue"
},
{
label: "纬度",
prop: "latitude",
span: 12,
rules: [{
required: true,
message: "请输入纬度",
trigger: "blur"
}]
search: true,
prop: "node",
labelWidth: 120,
viewDisplay: false
},
{
label: "节点类型",
prop: "nodeLabel",
labelWidth: 120,
hide: true,
viewDisplay: true
},
{
label: "网关信息",
prop: "gateway",
formatter: (val, value, label) => {
return val.gateway || '-'
},
{
label: "经度",
prop: "longitude",
span: 12,
rules: [{
required: true,
message: "请输入经度",
trigger: "blur"
}]
labelWidth: 120
},
{
label: "设备状态",
type: "select",
dicData: [],
props: {
label: "dictLabel",
value: "dictValue"
},
]
},
data: []
search: true,
prop: "status",
labelWidth: 120,
viewDisplay: false,
},
{
label: "节点类型",
prop: "statusLabel",
labelWidth: 120,
hide: true,
viewDisplay: true
},
{
label: "创建时间时间",
prop: "createTime",
labelWidth: 120,
hide: true,
viewDisplay: true,
}, {
label: "最后上线时间",
prop: "lastOnline",
labelWidth: 120
},
]
},
data: [],
nodeType: [],//
};
},
computed: {
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.notice_add, false),
viewBtn: this.vaildData(this.permission.notice_view, false),
delBtn: this.vaildData(this.permission.notice_delete, false),
editBtn: this.vaildData(this.permission.notice_edit, false)
};
},
computed: {
...mapGetters(["permission"]),
permissionList() {
return {
addBtn: this.vaildData(this.permission.notice_add, false),
viewBtn: this.vaildData(this.permission.notice_view, false),
delBtn: this.vaildData(this.permission.notice_delete, false),
editBtn: this.vaildData(this.permission.notice_edit, false)
};
},
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(",");
ids() {
let ids = [];
this.selectionList.forEach(ele => {
ids.push(ele.id);
});
return ids.join(",");
}
},
mounted() {
this.loadDict();
},
methods: {
//
loadDict() {
let token = window.sessionStorage.getItem('bizToken');
if (token == 'undefined' || !token) {
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => {
window.sessionStorage.setItem('bizToken', res.data.data.token);
bizDeviceStatus(res.data.data.token).then(res => {
const column = this.findObject(this.option.column, "status");
column.dicData = res.data.data;
})
bizNodeType(res.data.data.token).then(res => {
const column = this.findObject(this.option.column, "node");
column.dicData = res.data.data;
})
})
} else {
bizDeviceStatus(token).then(res => {
if(res.data.code == 401){
window.sessionStorage.removeItem('bizToken');
this.loadDict();
}
else if(res.data.code == 200){
const column = this.findObject(this.option.column, "status");
column.dicData = res.data.data;
}
})
bizNodeType(token).then(res => {
const column = this.findObject(this.option.column, "node");
column.dicData = res.data.data;
})
}
},
methods: {
rowSave(row, done, loading) {
add(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
window.console.log(error);
loading();
});
},
rowUpdate(row, index, done, loading) {
update(row).then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
done();
}, error => {
window.console.log(error);
loading();
});
},
rowDel(row) {
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(row.id);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
//
renderLabel(node,col) {
const column = this.findObject(this.option.column, col);
let idx = column.dicData.findIndex(item => item.dictValue == node);
return idx > -1 ? column.dicData[idx].dictLabel : '';
},
// rowSave(row, done, loading) {
// add(row).then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// done();
// }, error => {
// window.console.log(error);
// loading();
// });
// },
// rowUpdate(row, index, done, loading) {
// update(row).then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// done();
// }, error => {
// window.console.log(error);
// loading();
// });
// },
// rowDel(row) {
// this.$confirm("?", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// })
// .then(() => {
// return remove(row.id);
// })
// .then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// });
// },
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
// handleDelete() {
// if (this.selectionList.length === 0) {
// this.$message.warning("");
// return;
// }
// this.$confirm("?", {
// confirmButtonText: "",
// cancelButtonText: "",
// type: "warning"
// })
// .then(() => {
// return remove(this.ids);
// })
// .then(() => {
// this.onLoad(this.page);
// this.$message({
// type: "success",
// message: "!"
// });
// this.$refs.crud.toggleSelection();
// });
// },
beforeOpen(done, type) {
console.log(this.form)
if (["edit", "view"].includes(type)) {
// let token = window.sessionStorage.getItem('bizToken');
// if (token == 'undefined') {
// bizDeviceDetail(this.form.id).then(res => {
// this.form = res.data.data;
// });
// }
}
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
let values = {
...params,
...this.query,
pid: 98
};
let token = window.sessionStorage.getItem('bizToken');
if (token == 'undefined' || !token) {
bizLogin({ appKey: 'Arf7bd4f26', appSecret: 'kb207044c8' }).then(res => {
window.sessionStorage.setItem('bizToken', res.data.data.token);
this.loading = true;
bizDeviceList(res.data.data.token, { ...values, pageSize: page.pageSize, pageNo: page.currentPage }).then(res2 => {
const data = res2.data;
this.page.total = data.total;
this.data = data.records;
this.loading = false;
this.selectionClear();
});
},
searchReset() {
this.query = {};
this.onLoad(this.page);
},
searchChange(params, done) {
this.query = params;
this.page.currentPage = 1;
this.onLoad(this.page, params);
done();
},
selectionChange(list) {
this.selectionList = list;
},
selectionClear() {
this.selectionList = [];
this.$refs.crud.toggleSelection();
},
handleDelete() {
if (this.selectionList.length === 0) {
this.$message.warning("请选择至少一条数据");
return;
}
this.$confirm("确定将选择数据删除?", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
})
.then(() => {
return remove(this.ids);
})
.then(() => {
this.onLoad(this.page);
this.$message({
type: "success",
message: "操作成功!"
});
this.$refs.crud.toggleSelection();
});
},
beforeOpen(done, type) {
if (["edit", "view"].includes(type)) {
getNotice(this.form.id).then(res => {
this.form = res.data.data;
});
}
done();
},
currentChange(currentPage) {
this.page.currentPage = currentPage;
},
sizeChange(pageSize) {
this.page.pageSize = pageSize;
},
refreshChange() {
this.onLoad(this.page, this.query);
},
onLoad(page, params = {}) {
const {releaseTimeRange} = this.query;
let values = {
...params,
...this.query
};
if (releaseTimeRange) {
values = {
...values,
releaseTime_datege: releaseTimeRange[0],
releaseTime_datelt: releaseTimeRange[1],
};
values.releaseTimeRange = null;
}
} else {
this.loading = true;
getList(page.currentPage, page.pageSize, values).then(res => {
const data = res.data.data;
this.page.total = data.total;
this.data = data.records;
bizDeviceList(token, { ...values, pageSize: page.pageSize, pageNo: page.currentPage }).then(res2 => {
this.loading = false;
this.selectionClear();
if(res2.data.code == 401){
console.log(res2.data.code)
window.sessionStorage.removeItem('bizToken');
this.onLoad();
}
else if(res2.data.code == 200){
const data = res2.data;
this.page.total = data.total;
data.rows.map(item => {
item.node = item.bizProduct.node;
item.nodeLabel = this.renderLabel(item.node,'node');
item.statusLabel = this.renderLabel(item.status,'status')
})
this.data = data.rows;
}
}, err => {
this.loading = false;
this.selectionClear();
});
}
}
};
}
};
</script>
<style>
</style>
<style></style>

@ -40,14 +40,20 @@ module.exports = {
proxy: {
'/api': {
//本地服务接口地址
target: 'http://192.168.1.34:8008',
// target: 'http://192.168.3.32:8008',
//远程演示服务地址,可用于直接启动项目
//target: 'https://saber.bladex.vip/api',
// target: 'http://192.168.1.34:8008',
target: 'http://192.168.3.32:8008',
ws: true,
pathRewrite: {
'^/api': '/'
}
},
'/autoApi': {
//本地服务接口地址
target: 'http://182.139.182.190:82',
ws: true,
pathRewrite: {
'^/autoApi': '/'
}
}
}
}

Loading…
Cancel
Save