From f02122892ee506d6955eba4aac8ddee53a5194fc Mon Sep 17 00:00:00 2001
From: 罗广辉 <guanghui.luo@foxmail.com>
Date: Sun, 30 Mar 2025 11:21:02 +0800
Subject: [PATCH] feat: 整体交互调整
---
src/router/views/index.js | 70 --
src/views/System/Userinfo.vue | 113 +++
src/layout/index.vue | 8
src/assets/images/home/footer/3D1.png | 0
src/views/TestTemplate.vue | 27
src/assets/images/home/footer/machine-nest.png | 0
src/utils/cesium-tsa.js | 2
src/views/Home/useAggregation.js | 51 +
src/store/getters.js | 1
src/assets/images/home/footer/panorama1.png | 0
src/views/Home/Home.vue | 35
src/layout/Footer.vue | 58 +
src/layout/Header.vue | 1
src/assets/images/home/footer/orthophoto1.png | 0
src/store/index.js | 2
src/directive/drag.js | 42 +
src/assets/images/home/footer/machine-nest1.png | 0
src/router/index.js | 3
/dev/null | 1347 -------------------------------------------
src/assets/images/home/footer/orthophoto.png | 0
src/assets/images/home/footer/panorama.png | 0
src/layout/RSide.vue | 46 +
src/assets/images/home/footer/3D.png | 0
src/views/Home/components/HomeLeft/OverviewNext.vue | 14
src/store/modules/home.js | 18
src/assets/images/home/footer/event.png | 0
src/assets/images/home/footer/event1.png | 0
27 files changed, 367 insertions(+), 1,471 deletions(-)
diff --git a/src/assets/images/3D.png b/src/assets/images/home/footer/3D.png
similarity index 100%
rename from src/assets/images/3D.png
rename to src/assets/images/home/footer/3D.png
Binary files differ
diff --git a/src/assets/images/home/footer/3D1.png b/src/assets/images/home/footer/3D1.png
new file mode 100644
index 0000000..d2acafb
--- /dev/null
+++ b/src/assets/images/home/footer/3D1.png
Binary files differ
diff --git a/src/assets/images/event.png b/src/assets/images/home/footer/event.png
similarity index 100%
rename from src/assets/images/event.png
rename to src/assets/images/home/footer/event.png
Binary files differ
diff --git a/src/assets/images/home/footer/event1.png b/src/assets/images/home/footer/event1.png
new file mode 100644
index 0000000..5410c01
--- /dev/null
+++ b/src/assets/images/home/footer/event1.png
Binary files differ
diff --git a/src/assets/images/home/footer/machine-nest.png b/src/assets/images/home/footer/machine-nest.png
new file mode 100644
index 0000000..ba94743
--- /dev/null
+++ b/src/assets/images/home/footer/machine-nest.png
Binary files differ
diff --git a/src/assets/images/machine-nest.png b/src/assets/images/home/footer/machine-nest1.png
similarity index 100%
rename from src/assets/images/machine-nest.png
rename to src/assets/images/home/footer/machine-nest1.png
Binary files differ
diff --git a/src/assets/images/orthophoto.png b/src/assets/images/home/footer/orthophoto.png
similarity index 100%
rename from src/assets/images/orthophoto.png
rename to src/assets/images/home/footer/orthophoto.png
Binary files differ
diff --git a/src/assets/images/home/footer/orthophoto1.png b/src/assets/images/home/footer/orthophoto1.png
new file mode 100644
index 0000000..349e97b
--- /dev/null
+++ b/src/assets/images/home/footer/orthophoto1.png
Binary files differ
diff --git a/src/assets/images/panorama.png b/src/assets/images/home/footer/panorama.png
similarity index 100%
rename from src/assets/images/panorama.png
rename to src/assets/images/home/footer/panorama.png
Binary files differ
diff --git a/src/assets/images/home/footer/panorama1.png b/src/assets/images/home/footer/panorama1.png
new file mode 100644
index 0000000..aa06bc7
--- /dev/null
+++ b/src/assets/images/home/footer/panorama1.png
Binary files differ
diff --git a/src/directive/drag.js b/src/directive/drag.js
new file mode 100644
index 0000000..f52959f
--- /dev/null
+++ b/src/directive/drag.js
@@ -0,0 +1,42 @@
+const drag = {
+ mounted(el, binding) {
+
+ const dragBox = document.querySelector('#' + binding.arg)
+ //鼠标点击距离box盒子left的距离
+ let spotToBoxLeft = 0
+ let spotToBoxTop = 0
+
+ const mouseupFun = (e) => {
+ window.removeEventListener('mousemove', mousemoveFun)
+ window.removeEventListener('mouseup', mouseupFun)
+ }
+
+ const mousemoveFun = (evt) => {
+ console.log(66666);
+ //获取body宽高,获取拖动盒子的宽高
+ const {offsetWidth: bodyWidth, offsetHeight: bodyHeight} = document.body
+ const {offsetWidth: boxWidth, offsetHeight: boxHeight} = dragBox
+ //max取最大值,min取最小值
+ const left = Math.max(evt.clientX - spotToBoxLeft, 0)
+ const top = Math.max(evt.clientY - spotToBoxTop, 0)
+ dragBox.style.left = Math.min(left, bodyWidth - boxWidth) + 'px'
+ dragBox.style.top = Math.min(top, bodyHeight - boxHeight) + 'px'
+ }
+
+ el.__mousedownFun = (evt) => {
+ //鼠标坐标减去 box盒子相对于父盒子body 的距离
+ spotToBoxLeft = evt.clientX - dragBox.offsetLeft
+ spotToBoxTop = evt.clientY - dragBox.offsetTop
+ window.addEventListener('mousemove', mousemoveFun)
+ window.addEventListener('mouseup', mouseupFun)
+ }
+ el.addEventListener('mousedown', el.__mousedownFun);
+ },
+
+ // 绑定元素的父组件卸载前调用
+ beforeUnmount(el, binding,) {
+ el.removeEventListener('mousedown', el.__mousedownFun)
+ },
+}
+
+export default drag
diff --git a/src/layout/Footer.vue b/src/layout/Footer.vue
index f7c8504..53b90f6 100644
--- a/src/layout/Footer.vue
+++ b/src/layout/Footer.vue
@@ -1,18 +1,53 @@
<template>
- <div class="footer">
- <img class="machine-nest" src="@/assets/images/machine-nest.png" alt="">
- <img class="event" src="@/assets/images/event.png" alt="">
- <img class="panorama" src="@/assets/images/panorama.png" alt="">
- <img class="threeD" src="@/assets/images/3D.png" alt="">
- <img class="orthophoto" src="@/assets/images/orthophoto.png" alt="">
- </div>
- <div class="intelligent-introduction-flying">
- <img class="orthophoto" src="@/assets/images/intelligent-introduction-flying.png" alt="">
- </div>
+ <div class="footer">
+ <img v-for="item in list" :class="item.className" :src="item.active ? item.activeImg : item.img" alt="" @click="imgClick(item)">
+ </div>
+ <div class="intelligent-introduction-flying">
+ <img class="orthophoto" src="@/assets/images/intelligent-introduction-flying.png" alt="">
+ </div>
</template>
<script setup>
+import { useAggregation } from '@/views/Home/useAggregation';
+import img1 from '@/assets/images/home/footer/machine-nest.png'
+import activeImg1 from '@/assets/images/home/footer/machine-nest1.png'
+import img2 from '@/assets/images/home/footer/event.png'
+import activeImg2 from '@/assets/images/home/footer/event1.png'
+import img3 from '@/assets/images/home/footer/panorama.png'
+import activeImg3 from '@/assets/images/home/footer/panorama1.png'
+import img4 from '@/assets/images/home/footer/3D.png'
+import activeImg4 from '@/assets/images/home/footer/3D1.png'
+import img5 from '@/assets/images/home/footer/orthophoto.png'
+import activeImg5 from '@/assets/images/home/footer/orthophoto1.png'
+
+const list = ref([
+ {name:'event1',img:img1,activeImg:activeImg1,active:true,className:'machine-nest'},
+ {name:'event2',img:img2,activeImg:activeImg2,active:false,className:'event'},
+ {name:'event3',img:img3,activeImg:activeImg3,active:false,className:'panorama'},
+ {name:'event4',img:img4,activeImg:activeImg4,active:false,className:'threeD'},
+ {name:'event5',img:img5,activeImg:activeImg5,active:false,className:'orthophoto'},
+])
+
+const {init,removeAll} = useAggregation()
+
+const imgClick = (row) => {
+ const find = list.value.find(item => item.active)
+ if (find.name === row.name) return
+ list.value = list.value.map(item => ({...item,active: item.name === row.name}));
+ row.name === 'event1' ? init() :removeAll()
+}
+
+// 销毁前钩子
+onBeforeUnmount(() => {
+ if (!window.$viewer) return
+ removeAll();
+});
+onMounted(() => {
+ nextTick(() => {
+ init()
+ });
+});
</script>
<style scoped lang="scss">
@@ -23,6 +58,7 @@
img {
width: 103px;
height: 119px;
+ cursor: pointer;
}
.event {
position: relative;
@@ -53,4 +89,4 @@
height: 54px;
}
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/layout/Header.vue b/src/layout/Header.vue
index 822e18f..5d4ee4b 100644
--- a/src/layout/Header.vue
+++ b/src/layout/Header.vue
@@ -60,7 +60,6 @@
rightList.value.forEach(item => {
item.active = item.path === path;
});
- console.log(path);
// 跳转到指定页面
router.push(path);
};
diff --git a/src/layout/RSide.vue b/src/layout/RSide.vue
index ad43f52..c32053b 100644
--- a/src/layout/RSide.vue
+++ b/src/layout/RSide.vue
@@ -1,6 +1,23 @@
<template>
<div class="ai-chat">
- <img class="chat" src="@/assets/images/chat.png" alt="">
+
+ <el-popover
+ placement="bottom"
+ :visible="visible"
+ :width="200"
+ trigger="click"
+ >
+ <template #reference>
+ <div class="chat" id="chatID" v-drag:chatID @mousedown="handleMouseDown"
+ @mouseup="handleMouseUp"/>
+ </template>
+ <div>
+ 快和我对话吧
+ <el-input/>
+ </div>
+ </el-popover>
+
+
<img class="chat-bottom" src="@/assets/images/chat-bottom.png" alt="">
</div>
<div class="r-side">
@@ -14,10 +31,25 @@
</template>
<script setup>
+import vDrag from '@/directive/drag'
let logIndex = ref(3);
const enterHover = (value) => {
logIndex.value = value;
}
+const visible = ref(false);
+let pressStart = 0;
+
+const handleMouseDown = () => {
+ pressStart = Date.now(); // 记录按下时间
+};
+
+const handleMouseUp = () => {
+ const pressDuration = Date.now() - pressStart; // 计算按下时长
+ if (pressDuration < 150) {
+ // 如果按下时间小于200ms,认为是点击
+ visible.value = !visible.value;
+ }
+};
</script>
<style scoped lang="scss">
@@ -31,10 +63,16 @@
height: 68px;
display: block;
};
+
+
.chat {
- position: relative;
- bottom: -50px;
+ position: fixed;
+ bottom: 330px;
height: 124px;
+ width: 100px;
+ user-select: none;
+ z-index: 999;
+ background: url('@/assets/images/chat.png') no-repeat center / 100% 100%;
}
}
.r-side {
@@ -79,4 +117,4 @@
bottom: 122px;
}
-</style>
\ No newline at end of file
+</style>
diff --git a/src/layout/index.vue b/src/layout/index.vue
index 2d3b78f..f713ab7 100644
--- a/src/layout/index.vue
+++ b/src/layout/index.vue
@@ -4,8 +4,6 @@
<div class="page-index">
<Header />
<router-view></router-view>
- <RSide />
- <Footer />
</div>
</div>
</template>
@@ -14,19 +12,13 @@
import { onMounted } from 'vue';
import cesiumOperation from '@/utils/cesium-tsa';
import Header from './Header.vue';
-import Footer from './Footer.vue';
-import RSide from './RSide.vue';
-
-const { _init } = cesiumOperation();
const narrowScreen = ref(false)
-
const narrowScreenFun = () => {
// 监听窗口变化,计算是不是 窄屏幕
narrowScreen.value = window.innerWidth / window.innerHeight < 16 / 9;
};
onMounted(() => {
- _init('cesium');
narrowScreenFun()
window.addEventListener('resize', narrowScreenFun);
});
diff --git a/src/mac/index.vue b/src/mac/index.vue
deleted file mode 100644
index 7244c0a..0000000
--- a/src/mac/index.vue
+++ /dev/null
@@ -1,388 +0,0 @@
-<template>
- <div class="mac_bg"></div>
- <div class="desktop">
- <div class="top">
- <el-dropdown trigger="click">
- <div class="logo"><i class="iconfont iconicon_setting"></i></div>
- <template #dropdown>
- <el-dropdown-menu>
- <el-dropdown-item>
- <div>{{ userInfo.userName }}</div>
- </el-dropdown-item>
- <el-dropdown-item>
- <div @click="switchTheme">退出主题</div>
- </el-dropdown-item>
- <el-dropdown-item @click="logout">{{ $t('navbar.logOut') }}</el-dropdown-item>
- </el-dropdown-menu>
- </template>
- </el-dropdown>
- <div class="space"></div>
- <div class="status">
- <div class="audio">
- <i class="iconfont icon-changyongtubiao-xianxingdaochu-zhuanqu-39"></i>
- </div>
- <div class="datetime">{{ timeString }}</div>
- <div class="notification">
- <i class="iconfont icon-changyongtubiao-xianxingdaochu-zhuanqu-25"></i>
- </div>
- </div>
- </div>
- <div class="body">
- <div class="desktop-app">
- <template v-for="item in deskTopAppList" :key="item.key">
- <div class="app-item" @click="openApp(item)" v-if="!item.hideInDesktop">
- <div class="icon" :style="{ backgroundColor: item.iconBgColor, color: item.iconColor }">
- <i class="iconfont" :class="item[iconKey]"></i>
- </div>
- <div class="title">{{ item[labelKey] }}</div>
- </div>
- </template>
- </div>
- </div>
- <div class="footer">
- <div class="space"></div>
- <div class="dock">
- <template v-for="item in openAppList" :key="item.key">
- <div class="item" @click="openApp(item)">
- <i
- :style="{ backgroundColor: item.iconBgColor, color: item.iconColor }"
- class="iconfont"
- :class="item[iconKey]"
- ></i>
- <small style="margin-top: 5px; font-size: 10px">{{ item[labelKey] }}</small>
- </div>
- </template>
- </div>
- <div class="space"></div>
- </div>
- </div>
-</template>
-<script>
-import { mapGetters } from 'vuex';
-import $Mode from './mode/index';
-import index from '@/mixins/index';
-import topLock from '@/page/index/top/top-lock.vue';
-
-export default {
- mixins: [index],
- components: {
- topLock,
- },
- data() {
- return {
- app: false,
- timeString: '',
- };
- },
- computed: {
- ...mapGetters(['menu', 'tagList', 'tagWel', 'tag', 'userInfo', 'isMacOs']),
- labelKey() {
- return this.website.menu.label;
- },
- pathKey() {
- return this.website.menu.path;
- },
- hrefKey() {
- return this.website.menu.href;
- },
- childrenKey() {
- return this.website.menu.children;
- },
- queryKey() {
- return this.website.menu.query;
- },
- iconKey() {
- return this.website.menu.icon;
- },
- menuList() {
- let result = [];
- const findMenu = list => {
- list.forEach(ele => {
- if (ele[this.childrenKey] && ele[this.childrenKey].length !== 0) {
- findMenu(ele[this.childrenKey]);
- } else {
- result.push(ele);
- }
- });
- };
- findMenu(this.menu);
- return result;
- },
- deskTopAppList() {
- return this.menuList;
- },
- openAppList() {
- return [];
- },
- },
- created() {
- this.startTimer();
- this.$store.dispatch('GetMenu');
- },
- methods: {
- switchTheme() {
- this.$store.commit('SET_THEME_NAME', '');
- this.$router.push(this.tagWel);
- setTimeout(() => location.reload());
- },
- logout() {
- this.$store.commit('SET_THEME_NAME', '');
- this.$store.dispatch('LogOut').then(() => {
- this.$router.push({ path: '/login' });
- setTimeout(() => location.reload());
- });
- },
- startTimer() {
- setInterval(() => {
- this.timeString = this.$dayjs().format('YYYY年MM月DD日 HH:mm');
- }, 1000);
- },
- openApp(item) {
- $Mode({
- title: item[this.labelKey],
- path: item[this.hrefKey] ? item[this.hrefKey] : item[this.pathKey],
- });
- },
- },
-};
-</script>
-<style>
-.top .el-dropdown {
- color: white !important;
- height: 100% !important;
-}
-</style>
-<style scoped>
-.desktop {
- display: flex;
- flex-direction: column;
- position: absolute;
- left: 0;
- right: 0;
- top: 0;
- bottom: 0;
- color: white;
- overflow: hidden;
- text-shadow: 0px 2px 2px rgba(0, 0, 0, 0.1);
-}
-
-.top {
- height: 28px;
- background-color: rgba(0, 0, 0, 0.3);
- backdrop-filter: blur(20px);
- display: flex;
- flex-direction: row;
- font-size: 14px;
- align-items: center;
- justify-content: center;
- padding: 0px 5px;
- z-index: 100;
-}
-
-.space {
- flex-grow: 1;
-}
-
-.logo {
- height: 100%;
- align-items: center;
- justify-content: center;
- padding: 0px 15px;
- cursor: pointer;
- position: relative;
- display: flex;
- align-items: center;
- justify-content: center;
-}
-
-.logo .el-select {
- position: absolute;
- opacity: 0;
-}
-
-.logo:hover {
- background-color: rgba(255, 255, 255, 0.1);
-}
-
-.logo .iconfont {
- font-size: 16px;
- margin-top: -3px;
-}
-
-.menu .item:hover {
- background-color: rgba(255, 255, 255, 0.1);
-}
-
-.status {
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- height: 100%;
-}
-
-.audio .iconfont,
-.notification .iconfont {
- font-size: 20px;
-}
-
-.datetime,
-.audio,
-.notification {
- cursor: pointer;
- padding: 0px 10px;
- height: 100%;
- display: flex;
- justify-content: center;
- align-items: center;
- text-align: center;
-}
-
-.datetime:hover,
-.audio:hover,
-.notification:hover {
- background-color: rgba(255, 255, 255, 0.1);
-}
-
-.body {
- flex-grow: 1;
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- position: relative;
-}
-
-.footer {
- position: fixed;
- left: 5px;
- right: 5px;
- bottom: 5px;
- justify-content: center;
- align-items: center;
- display: flex;
- flex-direction: row;
- z-index: 100;
-}
-
-.footer .dock {
- background-color: rgba(255, 255, 255, 0.1);
- border: 1px solid rgba(255, 255, 255, 0.1);
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.2);
- backdrop-filter: blur(20px);
- border-radius: 10px;
- flex-direction: row;
- display: flex;
- padding: 2px;
-}
-
-.dock .item {
- padding: 3px;
- display: flex;
- justify-content: center;
- align-items: center;
- flex-direction: column;
-}
-
-.dock .dot {
- width: 3px;
- height: 3px;
- background: rgba(0, 0, 0, 0.8);
- position: absolute;
- bottom: 0px;
- border-radius: 5px;
- display: inline-block;
- font-size: 0;
-}
-
-.dock .item .iconfont {
- cursor: pointer;
- border-radius: 20px;
- padding: 2px;
- display: inline-block;
- background-color: rgba(255, 255, 255, 0.1);
- border-radius: 10px;
- height: 30px;
- width: 30px;
- text-align: center;
- font-size: 24px;
- display: flex;
- align-items: center;
- justify-content: center;
- transition: transform 0.3s, margin 0.3s;
-}
-
-.dock .item:hover .iconfont {
- transform: scale(2) translateY(-10px);
- margin: 0px 15px;
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
-}
-
-.dock .nearby .iconfont {
- transform: scale(1.6) translateY(-8px);
- margin: 0px 12px;
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
-}
-
-.dock .nearby1 .iconfont {
- transform: scale(1.2) translateY(-6px);
- margin: 0px 9px;
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
-}
-
-.dock .nearby2 .iconfont {
- transform: scale(1.1) translateY(-5px);
- margin: 0px 7px;
- box-shadow: 0px 0px 10px rgba(0, 0, 0, 0.3);
-}
-
-.desktop-app {
- position: absolute;
- right: 0;
- top: 0;
- bottom: 0;
- display: flex;
- flex-direction: column;
- justify-content: flex-start;
- align-items: flex-end;
- padding: 20px;
- flex-wrap: wrap-reverse;
-}
-
-.app-item {
- margin: 5px 10px;
- padding: 5px;
- flex-direction: column;
- text-align: center;
- text-shadow: 0px 0px 2px rgb(0 0 0 / 50%);
- cursor: pointer;
- border-radius: 10px;
- border: 2px solid transparent;
-}
-
-.app-item .icon {
- border-radius: 10px;
- width: 50px;
- height: 50px;
- display: flex;
- justify-content: center;
- align-items: center;
-}
-
-.app-item .iconfont {
- font-size: 36px;
-}
-
-.app-item .title {
- font-size: 12px;
- width: 50px;
- margin-top: 5px;
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.app-item:hover {
- border: 2px solid rgba(255, 255, 255, 0.5);
-}
-</style>
diff --git a/src/mac/lock.vue b/src/mac/lock.vue
deleted file mode 100644
index f444a62..0000000
--- a/src/mac/lock.vue
+++ /dev/null
@@ -1,62 +0,0 @@
-<template>
- <div class="mac_bg"></div>
- <div class="login animate__animated" :class="{ animate__bounceOut: pass }">
- <div class="head">
- <img
- src="https://bladex.cn/images/logo-small.png"
- alt=""
- />
- </div>
- <div class="message">{{ userInfo.username }}</div>
- <div class="form">
- <div class="item" style="width: 320px" :class="passwdError ? 'error' : ''">
- <input class="password" placeholder="password here..." v-model="passwd" type="password" />
- <i class="iconfont el-icon-unlock" @click="handleLogin"></i>
- <i class="iconfont icon-tuichu" @click="handleLogout"></i>
- </div>
- </div>
- </div>
-</template>
-<script>
-import { mapGetters } from 'vuex';
-
-export default {
- data() {
- return {
- passwdError: false,
- passwd: '',
- pass: false,
- };
- },
- computed: {
- ...mapGetters(['userInfo', 'tag', 'lockPasswd']),
- },
- methods: {
- handleLogout() {
- this.$store.dispatch('LogOut').then(() => {
- this.$router.push({ path: '/login' });
- });
- },
- handleLogin() {
- if (this.passwd !== this.lockPasswd) {
- this.passwd = '';
- this.passwdError = true;
- setTimeout(() => {
- this.passwdError = false;
- }, 1000);
- return;
- }
- this.pass = true;
- setTimeout(() => {
- this.$store.commit('CLEAR_LOCK');
- this.$router.push({
- path: this.tag.value,
- });
- }, 1000);
- },
- },
-};
-</script>
-<style lang="scss" scoped>
-@use './login.scss';
-</style>
diff --git a/src/mac/login.scss b/src/mac/login.scss
deleted file mode 100644
index 19e5e87..0000000
--- a/src/mac/login.scss
+++ /dev/null
@@ -1,134 +0,0 @@
-@keyframes loginErrorAnimation {
- 0% {
- margin-left: -30px;
- }
- 50% {
- margin-left: 30px;
- }
- 100% {
- margin-left: 0;
- }
-}
-
-.login {
- position: fixed;
- left: 0;
- right: 0;
- top: 0;
- bottom: 0;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
- color: white;
- margin-top: -100px;
- z-index: 99999;
- backdrop-filter: blur(20px);
-}
-
-.head {
- padding: 3px;
- background-size: 40% auto;
- background-position: center center;
- height: 150px;
- width: 150px;
- border-radius: 100%;
- box-sizing: border-box;
- box-shadow: 0px 0px 5px 5px rgba(0, 0, 0, 0.1);
- margin-top: -50px;
- overflow: hidden;
-}
-
-.head img {
- border-radius: 100%;
- width: 100%;
- height: 100%;
-}
-
-.message {
- margin-top: 20px;
- font-size: 20px;
- text-shadow: 0px 0px 2px 2px rgba(0, 0, 0, 0.3);
- color: #eee;
- margin-bottom: 50px;
-}
-
-.password {
- transition: width 0.3s;
-}
-
-.password-in {
- width: 155px;
-}
-
-.login-button {
- position: absolute;
- top: 5px;
- right: -50px;
- transition: right 0.3s;
-}
-
-.click-enable {
- right: 0;
-}
-
-.error {
- animation: loginErrorAnimation 0.2s ease 3;
-}
-
-::-webkit-input-placeholder {
- color: #fff;
-}
-
-::-moz-placeholder {
- color: #fff;
-}
-
-:-ms-input-placeholder {
- color: #fff;
-}
-
-.form {
- display: flex;
- flex-direction: column;
- align-items: center;
-}
-
-.item {
- position: relative;
- width: 280px;
- display: flex;
- align-items: center;
-}
-
-.item input {
- color: white;
- outline: none;
- border: none;
- margin: 5px 0;
- font-size: 16px;
- background-color: rgba(255, 255, 255, 0.3);
- padding: 8px 24px;
- border-radius: 20px;
- box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1);
- flex: 1;
-}
-
-.item .iconfont {
- margin-left: 10px;
- vertical-align: middle;
- display: inline-block;
- background-color: rgba(255, 255, 255, 0.3);
- font-size: 18px;
- border-radius: 100%;
- width: 36px;
- height: 36px;
- text-align: center;
- line-height: 36px;
- cursor: pointer;
- box-shadow: 0px 0px 5px rgba(0, 0, 0, 0.1);
-}
-
-.item .iconfont:hover {
- background-color: rgba(255, 255, 255, 0.5);
-}
diff --git a/src/mac/login.vue b/src/mac/login.vue
deleted file mode 100644
index 457cb7a..0000000
--- a/src/mac/login.vue
+++ /dev/null
@@ -1,72 +0,0 @@
-<template>
- <div class="mac_bg"></div>
- <div class="login animate__animated" :class="{ animate__bounceOut: pass }">
- <div class="head">
- <img
- src="https://bladex.cn/images/logo-small.png"
- alt=""
- />
- </div>
- <div class="message">Login Please</div>
- <div class="form">
- <div class="item" :class="isUserNameError ? 'error' : ''">
- <input class="account" placeholder="account here..." v-model="form.username" type="email" />
- </div>
- <div class="item" :class="isUserPasswordError ? 'error' : ''">
- <input
- class="password"
- placeholder="password here..."
- v-model="form.password"
- type="password"
- />
- <i class="iconfont icon-send" @click="handleLogin"></i>
- </div>
- </div>
- </div>
-</template>
-<script>
-import { mapGetters } from 'vuex';
-
-export default {
- data() {
- return {
- pass: false,
- isUserNameError: false,
- isUserPasswordError: false,
- form: {
- username: '',
- password: '',
- },
- };
- },
- computed: {
- ...mapGetters(['tagWel']),
- },
- methods: {
- handleLogin() {
- if (this.form.username === '') {
- this.isUserNameError = true;
- setTimeout(() => {
- this.isUserNameError = false;
- }, 1000);
- return;
- } else if (this.form.password === '') {
- this.isUserPasswordError = true;
- setTimeout(() => {
- this.isUserPasswordError = false;
- }, 1000);
- return;
- }
- this.$store.dispatch('LoginByUsername', this.loginForm).then(() => {
- this.pass = true;
- setTimeout(() => {
- this.$router.push(this.tagWel);
- }, 1000);
- });
- },
- },
-};
-</script>
-<style lang="scss" scoped>
-@use './login.scss';
-</style>
diff --git a/src/mac/mode/index.js b/src/mac/mode/index.js
deleted file mode 100644
index ca3c06b..0000000
--- a/src/mac/mode/index.js
+++ /dev/null
@@ -1,18 +0,0 @@
-import MessageConstructor from './index.vue';
-import { createVNode, render } from 'vue';
-
-export default (function () {
- return (opts = {}) => {
- let options = {
- app: opts,
- };
- const parent = document.createElement('div');
- let instance = createVNode(MessageConstructor, options);
- instance.props.onDestroy = () => {
- render(null, parent);
- };
- render(instance, parent);
- document.body.appendChild(parent.firstElementChild);
- return instance;
- };
-})();
diff --git a/src/mac/mode/index.vue b/src/mac/mode/index.vue
deleted file mode 100644
index 53790d8..0000000
--- a/src/mac/mode/index.vue
+++ /dev/null
@@ -1,483 +0,0 @@
-<template>
- <div
- class="moveBg"
- v-show="isShow"
- @click="handleFocus"
- @mousemove="mouseMove"
- @mouseup="mouseUp"
- @mouseleave.stop="mouseLeave"
- :style="{ pointerEvents: isBoxResizing || isBoxMoving ? 'auto' : 'none' }"
- >
- <div
- class="box"
- :style="{
- left: nowRect.left + 'px',
- top: nowRect.top + 'px',
- bottom: nowRect.bottom + 'px',
- right: nowRect.right + 'px',
- }"
- :class="getExtBoxClasses()"
- >
- <div class="box-top">
- <div class="box-top-left" @mousedown="resizeMouseDown"></div>
- <div class="box-top-center" @mousedown="resizeMouseDown"></div>
- <div class="box-top-right" @mousedown="resizeMouseDown"></div>
- </div>
- <div class="box-center">
- <div class="box-center-left" @mousedown="resizeMouseDown"></div>
- <div class="box-center-center loader">
- <div
- class="app-bar"
- :style="{ backgroundColor: app.tabbarBgColor }"
- @mousedown.stop="positionMouseDown"
- v-on:dblclick="appBarDoubleClicked"
- >
- <div class="controll">
- <div class="close" @click.stop="close"></div>
- <div
- class="full"
- :class="app.disableResize ? 'full-disabled' : ''"
- @click.stop="switchFullScreen"
- ></div>
- </div>
- <div class="title" :style="{ color: app.tabbarTextColor }">{{ app.title }}</div>
- </div>
- <iframe :src="location + app.path" frameborder="0" class="iframe"></iframe>
- </div>
- <div class="box-center-right" @mousedown="resizeMouseDown"></div>
- </div>
- <div class="box-bottom">
- <div class="box-bottom-left" @mousedown="resizeMouseDown"></div>
- <div class="box-bottom-center" @mousedown="resizeMouseDown"></div>
- <div class="box-bottom-right" @mousedown="resizeMouseDown"></div>
- </div>
- </div>
- </div>
-</template>
-
-<script>
-import { isURL } from 'utils/validate';
-import { defineAsyncComponent } from 'vue';
-
-export default {
- props: {
- app: Object,
- onDestroy: Function,
- },
- data() {
- return {
- isShow: true,
- defaultIndex: 10,
- activeIndex: 20,
- isBoxMoving: false,
- startPosition: { x: 0, y: 0 },
- nowRect: {
- left: 100,
- right: 100,
- top: 100,
- bottom: 100,
- },
- startRect: {
- left: 0,
- right: 0,
- top: 0,
- bottom: 0,
- },
- isBoxResizing: false,
- moveDirection: false,
- isMaxShowing: false,
- isFullScreen: false,
- };
- },
- computed: {
- location() {
- return isURL(this.app.path) ? '' : window.location.origin;
- },
- },
- created() {
- if (this.app.width) {
- this.nowRect.left = this.nowRect.right = (document.body.clientWidth - this.app.width) / 2;
- }
- if (this.app.height) {
- this.nowRect.bottom = (document.body.clientHeight - this.app.height) / 2 + 50;
- this.nowRect.top = (document.body.clientHeight - this.app.height) / 2 - 50;
- }
- },
- methods: {
- handleFocus() {
- let list = document.getElementsByClassName('moveBg');
- if (list.length == 1) return;
- let max = 0;
- for (let i = 0; i < list.length; i++) {
- let ele = list[i];
- let box = ele.getElementsByClassName('box')[0].style;
- let zIndex = Number(box.zIndex);
- if (max < zIndex) {
- max = zIndex;
- }
- }
- max = max + 1;
- this.$el.getElementsByClassName('box')[0].style.zIndex = max;
- },
- close() {
- this.isShow = false;
- this.onDestroy();
- },
- switchFullScreen() {
- if (this.app.disableResize) {
- return;
- }
- this.isFullScreen = !this.isFullScreen;
- if (this.isFullScreen) {
- this.isMaxShowing = true;
- } else {
- this.isMaxShowing = false;
- }
- },
- getExtBoxClasses() {
- let str = '';
- if (!this.isBoxResizing && !this.isBoxMoving) {
- str += 'box-animation ';
- }
- if (this.isMaxShowing) {
- str += 'isMaxShowing ';
- }
- if (this.isFullScreen) {
- str += 'isFullScreen ';
- }
- if (this.app.disableResize) {
- str += 'resize-disabled ';
- }
- if (this.app.isTop) {
- str += 'isTop ';
- }
- return str;
- },
- appBarDoubleClicked() {
- if (this.app.disableResize) {
- return;
- }
- this.isMaxShowing = !this.isMaxShowing;
- if (!this.isMaxShowing) {
- this.isFullScreen = false;
- }
- },
- positionMouseDown(e) {
- if (this.isFullScreen || this.isMaxShowing) {
- return;
- }
- this.startRect = {
- left: this.nowRect.left,
- right: this.nowRect.right,
- top: this.nowRect.top,
- bottom: this.nowRect.bottom,
- };
- this.startPosition.x = e.clientX;
- this.startPosition.y = e.clientY;
- this.isBoxMoving = true;
- },
- mouseUp() {
- this.isBoxMoving = false;
- this.isBoxResizing = false;
- this.moveDirection = false;
- },
- mouseLeave() {
- this.isBoxMoving = false;
- this.isBoxResizing = false;
- this.moveDirection = false;
- },
- mouseMove(e) {
- if (this.isBoxResizing) {
- this.isFullScreen = false;
- this.isMaxShowing = false;
- switch (this.moveDirection) {
- case 'box-top-left':
- this.nowRect.top = this.startRect.top + (e.clientY - this.startPosition.y);
- this.nowRect.left = this.startRect.left + (e.clientX - this.startPosition.x);
- break;
- case 'box-top-center':
- this.nowRect.top = this.startRect.top + (e.clientY - this.startPosition.y);
- break;
- case 'box-top-right':
- this.nowRect.top = this.startRect.top + (e.clientY - this.startPosition.y);
- this.nowRect.right = this.startRect.right - (e.clientX - this.startPosition.x);
- break;
- case 'box-center-left':
- this.nowRect.left = this.startRect.left + (e.clientX - this.startPosition.x);
- break;
- case 'box-bottom-left':
- this.nowRect.left = this.startRect.left + (e.clientX - this.startPosition.x);
- this.nowRect.bottom = this.startRect.bottom - (e.clientY - this.startPosition.y);
- break;
- case 'box-bottom-center':
- this.nowRect.bottom = this.startRect.bottom - (e.clientY - this.startPosition.y);
- break;
- case 'box-center-right':
- this.nowRect.right = this.startRect.right - (e.clientX - this.startPosition.x);
- break;
- case 'box-bottom-right':
- this.nowRect.right = this.startRect.right - (e.clientX - this.startPosition.x);
- this.nowRect.bottom = this.startRect.bottom - (e.clientY - this.startPosition.y);
- break;
- default:
- }
- return;
- }
- if (this.isBoxMoving) {
- this.isFullScreen = false;
- this.isMaxShowing = false;
- this.nowRect.left = this.startRect.left + (e.clientX - this.startPosition.x);
- this.nowRect.right = this.startRect.right - (e.clientX - this.startPosition.x);
- this.nowRect.top = this.startRect.top + (e.clientY - this.startPosition.y);
- this.nowRect.bottom = this.startRect.bottom - (e.clientY - this.startPosition.y);
- return;
- }
- },
- resizeMouseDown(e) {
- if (this.app.disableResize) {
- return;
- }
- if (this.isFullScreen || this.isMaxShowing) {
- return;
- }
- this.startRect = {
- left: this.nowRect.left,
- top: this.nowRect.top,
- right: this.nowRect.right,
- bottom: this.nowRect.bottom,
- };
- this.startPosition.x = e.clientX;
- this.startPosition.y = e.clientY;
- this.isBoxResizing = true;
- this.moveDirection = e.target.className;
- },
- },
-};
-</script>
-<style scoped>
-.iframe {
- width: 100%;
- height: calc(100% - 50px);
- margin-top: 5px;
- border-right: 5px;
-}
-
-.moveBg {
- position: absolute;
- left: 0;
- right: 0;
- top: 0;
- bottom: 0;
-}
-
-.box {
- --resize: 5px;
- --resize-bg: transparent;
- --resize-main: transparent;
- --resize-bg-main: transparent;
-}
-
-.box {
- position: absolute;
- pointer-events: auto;
- display: flex;
- flex-direction: column;
-}
-
-.box-top {
- display: flex;
- flex-direction: row;
-}
-
-.box-top-left {
- width: var(--resize);
- height: var(--resize);
- background: var(--resize-bg);
- cursor: nw-resize;
-}
-
-.box-top-center {
- height: var(--resize);
- background: var(--resize-bg-main);
- cursor: n-resize;
- flex-grow: 1;
-}
-
-.box-top-right {
- width: var(--resize);
- height: var(--resize);
- background: var(--resize-bg);
- cursor: ne-resize;
-}
-
-.box-center {
- display: flex;
- flex-direction: row;
- flex-grow: 1;
-}
-
-.box-center-left {
- width: var(--resize);
- height: 100%;
- background: var(--resize-bg-main);
- cursor: w-resize;
-}
-
-.box-center-center {
- height: 100%;
- flex-grow: 1;
- display: flex;
- flex-direction: column;
- border-radius: 10px;
- box-shadow: 0px 0px 3px #999;
- background: rgba(255, 255, 255, 0.8);
- backdrop-filter: blur(20px);
- overflow: hidden;
-}
-
-.isTop .box-center-center {
- box-shadow: 0px 0px 20px rgba(0, 0, 0, 0.5);
- filter: none;
-}
-
-.box-animation {
- transition: width 0.1s, height 0.1s, left 0.1s, right 0.1s, top 0.1s, bottom 0.1s;
-}
-
-.isMaxShowing {
- left: -5px !important;
- right: -5px !important;
- top: 24px !important;
- bottom: 47px !important;
- height: calc(100% - 24px);
-}
-
-.isFullScreen {
- position: fixed !important;
- z-index: 999 !important;
- bottom: -5px !important;
-}
-
-.isMaxShowing .box-center-center,
-.isFullScreen .box-center-center {
- border-radius: 0px !important;
-}
-
-.box-center-right {
- width: var(--resize);
- height: 100%;
- background: var(--resize-bg-main);
- cursor: e-resize;
-}
-
-.box-bottom {
- display: flex;
- flex-direction: row;
-}
-
-.box-bottom-left {
- width: var(--resize);
- height: var(--resize);
- background: var(--resize-bg);
- cursor: sw-resize;
-}
-
-.box-bottom-center {
- height: var(--resize);
- background: var(--resize-bg-main);
- cursor: s-resize;
- flex-grow: 1;
-}
-
-.box-bottom-right {
- width: var(--resize);
- height: var(--resize);
- background: var(--resize-bg);
- cursor: se-resize;
-}
-
-.loader {
- display: flex;
- flex-grow: 1;
- flex-direction: column;
- width: 100%;
-}
-
-.app-bar {
- height: 40px;
- background: rgba(255, 255, 255, 0.5);
- backdrop-filter: blur(20px);
- display: flex;
- flex-direction: row;
- justify-content: center;
- align-items: center;
- white-space: nowrap;
- text-overflow: ellipsis;
- overflow: hidden;
-}
-
-.app-bar .controll {
- display: flex;
- justify-content: center;
- align-items: center;
- margin-left: 15px;
-}
-
-.app-bar .controll div {
- border-radius: 100%;
- height: 11px;
- width: 11px;
- margin-right: 8px;
- cursor: pointer;
-}
-
-.app-bar .title {
- flex-grow: 1;
- text-align: center;
- margin-right: 80px;
- font-weight: 500;
- text-shadow: none;
- font-size: 13px;
- cursor: move;
- color: #333;
-}
-
-.controll .close {
- background: #fc605c;
- border: 1px solid #fc635d;
-}
-
-.controll .min {
- background: #fcbb40;
- border: 1px solid #f8b438;
-}
-
-.controll .full {
- background: #34c648;
- border: 1px solid #2bc03f;
-}
-
-.full-disabled {
- background: #ccc !important;
- border: 1px solid #ccc !important;
-}
-
-.resize-disabled .box-top-left,
-.resize-disabled .box-top-center,
-.resize-disabled .box-top-right,
-.resize-disabled .box-center-left,
-.resize-disabled .box-center-right,
-.resize-disabled .box-bottom-left,
-.resize-disabled .box-bottom-center,
-.resize-disabled .box-bottom-right {
- cursor: default;
-}
-
-.app-body {
- flex-grow: 1;
- display: flex;
- flex-direction: column;
- justify-content: center;
- align-items: center;
-}
-</style>
diff --git a/src/router/ext/index.js b/src/router/ext/index.js
deleted file mode 100644
index d6d1738..0000000
--- a/src/router/ext/index.js
+++ /dev/null
@@ -1 +0,0 @@
-export default [];
diff --git a/src/router/index.js b/src/router/index.js
index 6ba6cbb..14a8359 100644
--- a/src/router/index.js
+++ b/src/router/index.js
@@ -1,5 +1,4 @@
import { createRouter, createWebHashHistory, createWebHistory } from 'vue-router';
-import ExtRouter from './ext/';
import PageRouter from './page/';
import ViewsRouter from './views/';
import AvueRouter from './avue-router';
@@ -9,7 +8,7 @@
const Router = createRouter({
base: import.meta.env.VITE_APP_BASE,
history: createWebHashHistory(import.meta.env.VITE_APP_BASE),
- routes: [...ExtRouter, ...PageRouter, ...ViewsRouter],
+ routes: [...PageRouter, ...ViewsRouter],
});
AvueRouter.install({
store: Store,
diff --git a/src/router/views/index.js b/src/router/views/index.js
index 1a9330b..500ca0f 100644
--- a/src/router/views/index.js
+++ b/src/router/views/index.js
@@ -1,5 +1,6 @@
import Index from '@/layout/index.vue';
import Store from '@/store/';
+import Layout from '@/page/index/layout.vue';
export default [
{
@@ -33,77 +34,18 @@
},
component: () => import(/* webpackChunkName: "TaskManage" */ '@/views/TaskManage/TaskManage.vue'),
},
- {
- path: 'dashboard',
- name: '控制台',
- meta: {
- i18n: 'dashboard',
- menu: false,
- },
- component: () => import(/* webpackChunkName: "views" */ '@/views/wel/dashboard.vue'),
- },
],
},
{
- path: '/test',
- component: Index,
- redirect: '/test/index',
+ path: '/info',
+ component: () => import('@/layout/index.vue'),
+ redirect: '/info/index',
children: [
{
path: 'index',
- name: '测试页',
- meta: {
- i18n: 'test',
- },
- component: () => import(/* webpackChunkName: "views" */ '@/views/Test.vue'),
+ name: '个人信息',
+ component: () => import('@/views/System/Userinfo.vue'),
},
],
},
- // {
- // path: '/dict-horizontal',
- // component: Layout,
- // redirect: '/dict-horizontal/index',
- // children: [
- // {
- // path: 'index',
- // name: '字典管理',
- // meta: {
- // i18n: 'dict',
- // },
- // component: () =>
- // import(/* webpackChunkName: "views" */ '@/views/util/demo/dict-horizontal.vue'),
- // },
- // ],
- // },
- // {
- // path: '/dict-vertical',
- // component: Layout,
- // redirect: '/dict-vertical/index',
- // children: [
- // {
- // path: 'index',
- // name: '字典管理',
- // meta: {
- // i18n: 'dict',
- // },
- // component: () =>
- // import(/* webpackChunkName: "views" */ '@/views/util/demo/dict-vertical.vue'),
- // },
- // ],
- // },
- // {
- // path: '/info',
- // component: Layout,
- // redirect: '/info/index',
- // children: [
- // {
- // path: 'index',
- // name: '个人信息',
- // meta: {
- // i18n: 'info',
- // },
- // component: () => import(/* webpackChunkName: "views" */ '@/views/system/userinfo.vue'),
- // },
- // ],
- // },
];
diff --git a/src/store/getters.js b/src/store/getters.js
index 3edda43..22252dc 100644
--- a/src/store/getters.js
+++ b/src/store/getters.js
@@ -33,5 +33,6 @@
logsLen: state => state.logs.logsList.length || 0,
logsFlag: (state, getters) => getters.logsLen === 0,
flowRoutes: state => state.dict.flowRoutes,
+ singleUavHome: state => state.home.singleUavHome,
};
export default getters;
diff --git a/src/store/index.js b/src/store/index.js
index a764d4b..dda64e4 100644
--- a/src/store/index.js
+++ b/src/store/index.js
@@ -5,6 +5,7 @@
import logs from './modules/logs';
import dict from './modules/dict';
import getters from './getters';
+import home from '@/store/modules/home';
const store = createStore({
modules: {
@@ -13,6 +14,7 @@
logs,
tags,
dict,
+ home,
},
getters,
});
diff --git a/src/store/modules/home.js b/src/store/modules/home.js
new file mode 100644
index 0000000..fd72d30
--- /dev/null
+++ b/src/store/modules/home.js
@@ -0,0 +1,18 @@
+const home = {
+ state: {
+ singleUavHome: null,
+ },
+ actions: {},
+ mutations: {
+ setSingleUavHome: (state, data) => {
+ state.singleUavHome = data;
+ },
+ },
+ getters:{
+ test(state) {
+ return state.singleUavHome.id.toString() + '65'
+ }
+ }
+};
+
+export default home;
diff --git a/src/utils/cesium-tsa.js b/src/utils/cesium-tsa.js
index cad09ed..06bb067 100644
--- a/src/utils/cesium-tsa.js
+++ b/src/utils/cesium-tsa.js
@@ -219,7 +219,6 @@
if (item.mapLayer) item.mapLayer.show = false;
});
- console.log(store.state.common);
// 高德影像地图数据图层
if (store.state.common.mapSetting.mode === 3) {
@@ -991,6 +990,7 @@
const viewerDestory = () => {
viewer && viewer.destroy();
viewer = null;
+ window.$viewer = null
};
let tilesetArr = [];
diff --git a/src/views/Home/Home.vue b/src/views/Home/Home.vue
index 6139619..dae0c93 100644
--- a/src/views/Home/Home.vue
+++ b/src/views/Home/Home.vue
@@ -1,18 +1,37 @@
<template>
- <HomeLeft></HomeLeft>
- <!-- <div>中间搜索</div> -->
- <HomeRight></HomeRight>
- <SearchBox />
+ <template v-if="!singleUavHome?.id">
+ <SearchBox />
+ <HomeLeft />
+ <HomeRight />
+ </template>
+ <template v-else>
+ <SignMachineNest />
+ </template>
+ <RSide />
+ <Footer />
</template>
<script setup>
import HomeRight from './components/HomeRight/HomeRight.vue';
import HomeLeft from '@/views/Home/components/HomeLeft/HomeLeft.vue';
import SearchBox from '@/views/Home/SearchBox.vue';
-import { useAggregation } from '@/views/Home/useAggregation';
-import MapPopUpBox from '@/views/Home/MapPopUpBox.vue';
-import { render } from 'vue';
+import SignMachineNest from '@/views/SignMachineNest/SignMachineNest.vue';
+import { useStore } from 'vuex';
+import Footer from '@/layout/Footer.vue';
+import RSide from '@/layout/RSide.vue';
+import { onMounted } from 'vue';
+import cesiumOperation from '@/utils/cesium-tsa';
+const store = useStore();
+const { _init,viewerDestory } = cesiumOperation();
+const singleUavHome = computed(() => store.state.home.singleUavHome);
-useAggregation()
+onBeforeUnmount(()=>{
+ store.commit('setSingleUavHome',null);
+ viewerDestory()
+})
+
+onMounted(() => {
+ _init('cesium');
+});
</script>
diff --git a/src/views/Home/components/HomeLeft/OverviewNext.vue b/src/views/Home/components/HomeLeft/OverviewNext.vue
index 497e43c..476a472 100644
--- a/src/views/Home/components/HomeLeft/OverviewNext.vue
+++ b/src/views/Home/components/HomeLeft/OverviewNext.vue
@@ -38,12 +38,11 @@
</div>
</template>
<script setup>
-import { pxToRem } from '@/utils/rem';
import { Search } from '@element-plus/icons-vue';
import CommonTitle from '@/components/CommonTitle.vue';
import { getDeviceInfoNum } from '@/api/home/machineNest.js'
-import router from '@/router/';
-
+import { useStore } from 'vuex';
+const searchText = ref('')
const list = ref([
{ name: '执行中', value: 89, color: '#FFA768' },
{ name: '在线', value: 100, color: '#8EFFAC' },
@@ -64,13 +63,12 @@
console.log(res);
});
}
+const store = useStore();
+
// 单个机巢详情
const signMachineNestClick = () => {
- router.push({
- path: '/signMachineNest',
- query: {
- id: '123' // 这里可以传递你需要的参数
- }
+ store.commit('setSingleUavHome', {
+ id: '123'
});
}
diff --git a/src/views/Home/useAggregation.js b/src/views/Home/useAggregation.js
index 1dc0104..d9e9f89 100644
--- a/src/views/Home/useAggregation.js
+++ b/src/views/Home/useAggregation.js
@@ -18,10 +18,10 @@
{ name: '国', value: [1169651, 37962800], gJson: zg },
];
let viewer = null;
- const active = ref('');
+ let active = null;
let handler = null;
let positionC3 = null;
- const init = () => {
+ const listenerHeight = () => {
determineScaling();
viewer.camera.moveEnd.addEventListener(() => {
determineScaling();
@@ -30,14 +30,15 @@
// 确定缩放比例
const determineScaling = () => {
+ if(!viewer) return
let height = viewer.camera.positionCartographic.height;
// 根据高度展示对应的 gJson
for (let item of scalingJudgment) {
if (height > item.value[0] && height <= item.value[1]) {
- if (active.value !== item.name) {
+ if (active !== item.name) {
removeEntities();
removeLabel();
- active.value = item.name;
+ active = item.name;
item.gJson ? aggregation(item) : splashed();
}
break;
@@ -126,6 +127,7 @@
});
};
+ // 获取弹框box
const getLabelDom = () => {
const vNode = h(MapPopUpBox, { data: '参数', removeLabel });
const tooltipContainer = document.createElement('div');
@@ -138,6 +140,7 @@
return tooltipContainer;
};
+ // 弹框位置刷新
const labelBox = () => {
let dom = document.querySelector('#mapPopUpBox');
if (!dom) {
@@ -151,7 +154,8 @@
}
};
- const clickFun = click => {
+ // 左键单机事件
+ const singleMachineEvent = click => {
const pickedObject = viewer.scene.pick(click.position);
if (Cesium.defined(pickedObject) && pickedObject.id) {
const entity = pickedObject.id;
@@ -161,10 +165,12 @@
}
};
+ // 移除 点 和 gjson 实体
const removeEntities = () => {
- viewer.dataSources.removeAll(true);
- viewer.entities.removeAll();
+ viewer.dataSources?.removeAll(true);
+ viewer.entities?.removeAll();
};
+ // 移除弹框标签
const removeLabel = () => {
viewer.scene.postRender.removeEventListener(labelBox);
const dom = document.querySelector('#mapPopUpBox');
@@ -173,19 +179,30 @@
}
};
- onBeforeUnmount(() => {
+ const removeAll = () => {
removeEntities();
removeLabel();
handler?.removeInputAction(Cesium.ScreenSpaceEventType.LEFT_CLICK);
handler?.destroy();
- });
+ viewer = null;
+ active = null
+ handler = null;
+ positionC3 = null;
+ };
+ const init = () => {
+ viewer = window.$viewer;
+ handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
+ handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+ listenerHeight();
+ };
+ // onMounted(() => {
+ // nextTick(() => {
+ // viewer = window.$viewer;
+ // handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
+ // handler.setInputAction(singleMachineEvent, Cesium.ScreenSpaceEventType.LEFT_CLICK);
+ // listenerHeight();
+ // });
+ // });
- onMounted(() => {
- nextTick(() => {
- viewer = window.$viewer;
- handler = new Cesium.ScreenSpaceEventHandler(viewer.scene.canvas);
- handler.setInputAction(clickFun, Cesium.ScreenSpaceEventType.LEFT_CLICK);
- init();
- });
- });
+ return { init,removeAll };
};
diff --git a/src/views/System/Userinfo.vue b/src/views/System/Userinfo.vue
new file mode 100644
index 0000000..6bca6d0
--- /dev/null
+++ b/src/views/System/Userinfo.vue
@@ -0,0 +1,113 @@
+<template>
+ <div>
+ <basic-container>
+ <avue-form
+ :option="option"
+ v-model="form"
+ @tab-click="handleTabClick"
+ @submit="handleSubmit"
+ ></avue-form>
+ </basic-container>
+ </div>
+</template>
+
+<script>
+import option from '@/option/user/info';
+import { getUserInfo, updateInfo, updatePassword } from '@/api/system/user';
+import md5 from 'js-md5';
+import func from '@/utils/func';
+import { validatenull } from '@/utils/validate';
+import { sensitive } from '@/utils/sensitive';
+
+export default {
+ data() {
+ return {
+ index: 0,
+ option: option,
+ form: {},
+ sensitiveManager: null,
+ };
+ },
+ created() {
+ this.handleWitch();
+ },
+ methods: {
+ handleSubmit(form, done) {
+ if (this.index === 0) {
+ const submitData = this.sensitiveManager.getSubmitData(form);
+ updateInfo(submitData).then(
+ res => {
+ if (res.data.success) {
+ this.$message({
+ type: 'success',
+ message: '修改信息成功!',
+ });
+ } else {
+ this.$message({
+ type: 'error',
+ message: res.data.msg,
+ });
+ }
+ done();
+ },
+ error => {
+ window.console.log(error);
+ done();
+ }
+ );
+ } else {
+ updatePassword(md5(form.oldPassword), md5(form.newPassword), md5(form.newPassword1)).then(
+ res => {
+ if (res.data.success) {
+ this.$message({
+ type: 'success',
+ message: '修改密码成功!',
+ });
+ } else {
+ this.$message({
+ type: 'error',
+ message: res.data.msg,
+ });
+ }
+ done();
+ },
+ error => {
+ window.console.log(error);
+ done();
+ }
+ );
+ }
+ },
+ handleWitch() {
+ // 创建脱敏工具实例
+ this.sensitiveManager = sensitive.create({
+ fields: ['phone', 'email'], // 配置需要脱敏的字段
+ });
+ if (this.index === 0) {
+ getUserInfo().then(res => {
+ const user = res.data.data;
+ this.form = {
+ id: user.id,
+ avatar: user.avatar,
+ name: user.name,
+ realName: user.realName,
+ phone: user.phone,
+ email: user.email,
+ };
+ // 保存初始脱敏数据
+ this.sensitiveManager.saveInitialData(this.form);
+ });
+ }
+ },
+ handleTabClick(tabs) {
+ if (validatenull(tabs.index)) {
+ return;
+ }
+ this.index = func.toInt(tabs.index, 0);
+ this.handleWitch();
+ },
+ },
+};
+</script>
+
+<style></style>
diff --git a/src/views/Test.vue b/src/views/Test.vue
deleted file mode 100644
index 71f1e1a..0000000
--- a/src/views/Test.vue
+++ /dev/null
@@ -1,19 +0,0 @@
-<template>
- <div>
- <basic-container>测试页</basic-container>
- </div>
-</template>
-
-<script>
-export default {
- name: 'wel',
- data() {
- return {};
- },
- computed: {},
- created() {},
- methods: {},
-};
-</script>
-
-<style scoped="scoped" lang="scss"></style>
diff --git a/src/views/TestTemplate.vue b/src/views/TestTemplate.vue
new file mode 100644
index 0000000..359a7f4
--- /dev/null
+++ b/src/views/TestTemplate.vue
@@ -0,0 +1,27 @@
+<script setup>
+import { useStore } from 'vuex';
+
+const store = useStore();
+
+// state必须带上.home
+const singleUavHome = computed(() => store.state.home.singleUavHome);
+// getters不需要带.home
+const test = computed(() => store.getters.test);
+onMounted(() => {
+ // commit dispatch 不需要带.home
+ store.commit('xxxx', '同步步修改啦');
+ store.dispatch('xxxx', '异步修改啦');
+});
+
+watch(
+ singleUavHome,
+ (newValue, oldValue) => {
+ console.log(newValue);
+ },
+ { immediate: true, deep: true }
+);
+</script>
+
+<template></template>
+
+<style scoped lang="scss"></style>
diff --git a/src/views/wel/dashboard.vue b/src/views/wel/dashboard.vue
deleted file mode 100644
index 62f5612..0000000
--- a/src/views/wel/dashboard.vue
+++ /dev/null
@@ -1,196 +0,0 @@
-<template>
- <basic-container>
- <div class="wel">
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-platform-eleme"
- text="开始菜单1"
- time="1"
- background="/img/bg/bg3.jpg"
- color="#d56259"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-eleme"
- text="开始菜单2"
- time="2"
- background="/img/bg/bg2.jpg"
- color="#419ce7"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-delete-solid"
- text="开始菜单3"
- time="3"
- color="#56b69b"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-delete"
- text="开始菜单4"
- time="4"
- color="#d44858"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-tools"
- text="开始菜单5"
- time="5"
- color="#3a1f7e"
- ></basic-block>
- <basic-block
- :width="410"
- :height="height"
- icon="el-icon-setting"
- text="开始菜单6"
- time="6"
- background="/img/bg/bg1.jpg"
- dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
- color="#422829"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-user-solid"
- text="开始菜单7"
- time="7"
- color="#613cbd"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-star-off"
- text="开始菜单8"
- time="8"
- color="#da542e"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-goods"
- text="开始菜单9"
- time="9"
- color="#2e8aef"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-circle-check"
- text="开始菜单10"
- time="10"
- color="#3d17b8"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-platform"
- text="开始菜单11"
- time="11"
- color="#e31462"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-fold"
- text="开始菜单12"
- time="12"
- color="#d9532d"
- ></basic-block>
- <basic-block
- :width="410"
- :height="height"
- icon="el-icon-s-open"
- text="开始菜单13"
- time="13"
- dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
- color="#b72147"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-flag"
- text="开始菜单14"
- time="14"
- color="#01a100"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-data"
- text="开始菜单15"
- time="15"
- color="#0c56bf"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-grid"
- text="开始菜单16"
- time="16"
- color="#0098a9"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-release"
- text="开始菜单17"
- time="17"
- background="/img/bg/bg2.jpg"
- color="#209bdf"
- ></basic-block>
- <basic-block
- :width="width"
- :height="height"
- icon="el-icon-s-home"
- text="开始菜单18"
- time="18"
- background="/img/bg/bg3.jpg"
- color="#603bbc"
- ></basic-block>
- <basic-block
- :width="515"
- :height="height"
- icon="el-icon-s-promotion"
- text="开始菜单19"
- time="19"
- dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
- color="#009bad"
- ></basic-block>
- <basic-block
- :width="515"
- :height="height"
- icon="el-icon-s-custom"
- text="开始菜单20"
- time="20"
- background="/img/bg/bg4.jpg"
- dept="这是一段很长的很长很长很长的描述这是一段很长的很长很长很长的描述"
- color="#d74e2a"
- ></basic-block>
- </div>
- </basic-container>
-</template>
-
-<script>
-export default {
- data() {
- return {
- width: 200,
- height: 120,
- };
- },
-};
-</script>
-
-<style lang="scss">
-.wel {
- display: flex;
- flex-wrap: wrap;
- width: 1100px;
- margin: 0 auto;
-}
-</style>
diff --git a/src/views/wel/index.vue b/src/views/wel/index.vue
deleted file mode 100644
index 8a61bc8..0000000
--- a/src/views/wel/index.vue
+++ /dev/null
@@ -1,1347 +0,0 @@
-<template>
- <div>
- <el-row>
- <el-col :span="24">
- <third-register></third-register>
- </el-col>
-
- <el-col :span="24">
- <basic-container>
- <p style="text-align: center">
- <img src="https://img.shields.io/badge/Release-V4.5.0-green.svg" alt="Downloads" />
- <img src="https://img.shields.io/badge/JDK-17+-green.svg" alt="Build Status" />
- <img
- src="https://img.shields.io/badge/Spring%20Cloud-2023-blue.svg"
- alt="Coverage Status"
- />
- <img src="https://img.shields.io/badge/Spring%20Boot-3.2-blue.svg" alt="Downloads" />
- <a target="_blank" href="https://bladex.cn">
- <img
- src="https://img.shields.io/badge/Saber%20Author-Small%20Chill-ff69b4.svg"
- alt="Downloads"
- />
- </a>
- <a target="_blank" href="https://bladex.cn">
- <img
- src="https://img.shields.io/badge/Copyright%20-@BladeX-%23ff3f59.svg"
- alt="Downloads"
- />
- </a>
- </p>
- </basic-container>
- </el-col>
- <el-col :span="15">
- <basic-container>
- <el-collapse v-model="activeNames" @change="handleChange">
- <el-collapse-item title="欢迎使用Saber" name="1">
- <div>1.Saber是BladeX前端UI系统</div>
- <div>2.基于Avue3对现有的vue3、element-plus库进行二次封装</div>
- <div>3.100%兼容原生element-plus库</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.cn/#/vip">点击授权</a>
- </div>
- </el-collapse-item>
- <el-collapse-item title="为何需要BladeX" name="3">
- <div>1.经历过较长的线上生产,积累了很多企业痛点的解决方案</div>
- <div>
- 2.一套代码兼容MySql、Oracle、PostgreSQL、SqlServer、达梦,适应企业各种不同场景的需求
- </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基于React,Saber基于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.分布式文件服务-集成minio、qiniu、alioss等优秀的第三方,提供便捷的文件上传与管理
- </div>
- <div>16.多租户对象存储系统-在SaaS系统中,各租户可自行配置文件上传至自己的私有OSS</div>
- <div>17.权限管理-精心设计的权限管理方案,角色权限精确到按钮</div>
- <div>
- 18.动态数据权限-高度灵活的动态数据权限,提供注解+Web可视化两种配置方式,Web配置无需重启直接生效
- </div>
- <div>
- 19.动态接口权限-高度灵活的动态接口权限,提供注解+Web可视化两种配置方式,Web配置无需重启直接生效
- </div>
- <div>
- 20.多租户顶部菜单配置-提供给每个租户独立的顶部菜单配置模块,可以自定义顶部菜单切换
- </div>
- <div>21.主流数据库兼容-一套代码完全兼容Mysql、Postgresql、Oracle三大主流数据库</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个月以内工期的react、vue、springboot、springcloud、app、小程序等软件定制服务
- </div>
- <div>
- 3.有意向请联系官方商务微信:<a target="_blank" href="https://bladex.cn/#/contract"
- >点击查看</a
- >
- </div>
- </el-collapse-item>
- </el-collapse>
- </basic-container>
- </el-col>
- <el-col :span="9">
- <el-col :span="24">
- <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 size="small" type="info" effect="plain">人事(hr)</el-tag>
- <el-divider direction="vertical" />
- <el-tag size="small" type="success" effect="plain">经理(manager)</el-tag>
- <el-divider direction="vertical" />
- <el-tag size="small" 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.cn" target="_blank" type="primary"
- >https://bladex.cn</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.cn" target="_blank" type="primary"
- >https://sns.bladex.cn</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.cn/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.cn/#/vip')"
- >商业版</el-tag
- >
- </span>
- </div>
- </basic-container>
- </el-col>
- <el-col :span="24">
- <basic-container>
- <el-collapse v-model="logActiveNames" @change="handleChange">
- <el-collapse-item
- title="4.5.0.RELEASE发布,新增超轻量级规则引擎 LiteRule,重构@PreAuth等底层模块"
- name="41"
- >
- <div>1.[新增]超轻量级规则引擎LiteRule,采用LiteFlow设计语言并替换LiteFlow实现</div>
- <div>2.[新增]redis发布订阅器支持延迟加载</div>
- <div>3.[新增]管理员身份判断采用@IsAdmin与@IsAdministrator新版注解</div>
- <div>4.[新增]国密key、令牌key支持从系统变量读取,可通过配置系统变量启动系统</div>
- <div>5.[新增]Oss与Sms模块针对accessKey与secretKey进行脱敏操作</div>
- <div>6.[新增]用户锁定时增加日志记录请求ip</div>
- <div>7.[新增]Boot版本框架的docker一键部署脚本</div>
- <div>8.[重构]PreAuth模块,支持多种权限类型快捷定义</div>
- <div>9.[重构]blade-core-oauth2 迁移至 blade-core-auth 模块</div>
- <div>10.[重构]blade-core-secure 迁移至 blade-core-auth 模块</div>
- <div>11.[重构]blade-starter-auth 迁移至 blade-core-auth 模块</div>
- <div>12.[重构]blade-starter-jwt 迁移至 blade-core-auth 模块</div>
- <div>13.[重构]blade-starter-datascope 重命名为 blade-starter-data-scope</div>
- <div>
- 14.[重构]腾讯云短信底层实现采用最新版API(appId+secretId+secretKey+regionId)
- </div>
- <div>15.[优化]短信模块发送失败时增加警告日志输出,方便排查</div>
- <div>16.[优化]tokenGranter密码匹配的逻辑,便于调试排查</div>
- <div>17.[优化]PermissionConstant采用字符串预编译,提升性能降低内存占用</div>
- <div>18.[优化]指定自定义 SQLServer 方言,解决不加 order by 的分页将报错的问题</div>
- <div>19.[优化]全局异常增加是否发送错误日志的配置</div>
- <div>
- 20.[优化]jackson反序列化不再执行脱敏与空值转换逻辑,仅在序列化场景执行处理逻辑
- </div>
- <div>21.[优化]mybatis-plus日志加载逻辑</div>
- <div>22.[优化]oss配置类加载逻辑</div>
- <div>23.[优化]租户名称展示逻辑防止报错</div>
- <div>24.[优化]用户注册接口增加请求头userType读取与设置</div>
- <div>25.[优化]codemirror引入</div>
- <div>26.[优化]Saber3采用新版scss引用方式</div>
- <div>27.[优化]个别环境打包丢失sm2方法定义的问题</div>
- <div>28.[优化]众多工具类优化方法及增强</div>
- <div>29.[修复]避免jackson序列化冲突</div>
- <div>30.[修复]代码生成的sql语法,同时适配多种数据库</div>
- </el-collapse-item>
- <el-collapse-item
- title="4.4.0.RELEASE发布,新增字段脱敏,前端打包速度+100%,访问速度+200%"
- name="40"
- >
- <div>1.[新增]Saber3分段式构建逻辑,打包速度提升100%,首页访问速度提升200%</div>
- <div>2.[新增]Saber3禁用调试窗口功能,通过配置VITE_APP_DEBUG_SWITCH生效</div>
- <div>3.[新增]脱敏工具类和Jackson注解实现参数脱敏</div>
- <div>4.[新增]日志消息、用户管理等关键字段的脱敏逻辑</div>
- <div>5.[新增]全局增加@PreAuth("hasMenu('xxx')")注解以规避垂直越权的风险</div>
- <div>6.[新增]Redis模块基于Redisson的pub/sub发布器</div>
- <div>7.[新增]Geo坐标工具类</div>
- <div>8.[优化]Saber的userInfo变量采用新版字段authority</div>
- <div>9.[优化]角色菜单、顶部菜单、租户产品包三方均配置后的最终菜单展示逻辑</div>
- <div>10.[优化]oauth2的客户端模式与简化模式支持租户ID</div>
- <div>11.[优化]oauth2授权码模式认证成功后将删除缓存的code信息防止二次认证</div>
- <div>12.[优化]oauth2授权码模式退出登录增加自定义跳转uri功能</div>
- <div>13.[优化]oauth2授权码模式退出登录优化逻辑</div>
- <div>14.[优化]第三方授权登录注册逻辑</div>
- <div>15.[优化]jackson序列化时支持空字符串转换为null对象</div>
- <div>16.[优化]jackson在字段名为id时跳过null序列化处理</div>
- <div>17.[优化]拓展jsoup,xss过滤时不默认处理&符号的转换</div>
- <div>18.[优化]Mybatis的SQL日志打印逻辑</div>
- <div>19.[优化]字典查询逻辑,支持字符相同大小写不同的查询场景</div>
- <div>20.[优化]租户数据源切换出错时增加错误日志输出</div>
- <div>21.[优化]SpringUtil不再捕获异常以避免通过事件发布的事务无法回滚的问题</div>
- <div>22.[优化]oss外网地址拼接时去除最后一位的斜杠符号</div>
- <div>23.[优化]黑名单拦截请求的文案</div>
- <div>24.[优化]缩小默认白名单ip范围,若可信ip在默认范围外请另外配置白名单</div>
- <div>25.[优化]用户修改自身信息强制指定当前请求账号的ID防止水平越权</div>
- <div>26.[优化]job日期为空时的默认值逻辑</div>
- <div>27.[修复]第三方系统对接单点登录时退出失效的问题</div>
- </el-collapse-item>
- <el-collapse-item
- title="4.3.0.RELEASE发布,新版登录主题,重构Xss,代码快速生成接入可视化拖拽表单"
- name="39"
- >
- <div>1.[升级]Spring 至 6.1.15</div>
- <div>2.[升级]SpringBoot 至 3.2.12</div>
- <div>3.[新增]重构独立Xss模块,支持配置放行、注解放行、注解定义xss过滤器</div>
- <div>4.[新增]采用新版Xss配置,系统API以注解替换配置文件</div>
- <div>5.[新增]新版本登录界面、注册界面与系统主题</div>
- <div>6.[新增]在线代码快速生成功能增加可视化拖拽表单设计绑定</div>
- <div>
- 7.[新增]禁用url、白名单、黑名单功能,默认禁用外部ip访问actuator的请求,免去nginx配置
- </div>
- <div>
- 8.[新增]支持配置是否给超管账号关闭租户过滤的逻辑,默认为超管账号可看到所有租户数据
- </div>
- <div>
- 9.[新增]@PreAuth("hasMenu('xxx')") 权限配置,支持后端接口与菜单编号的角色权限绑定
- </div>
- <div>10.[新增]TenantUtil,支持线程模式设置租户与忽略租户</div>
- <div>11.[新增]/oauth/user-info接口用于获取token数据</div>
- <div>12.[新增]Saber3的Composition API写法示例</div>
- <div>13.[新增]Saber3全局水印配置</div>
- <div>14.[新增]Saber3系统右上角下拉菜单支持在线切换角色与部门</div>
- <div>15.[优化]Saber3权限permission缓存逻辑</div>
- <div>16.[优化]代码生成配置仅在新增模式自动填充模块信息</div>
- <div>17.[优化]前端页面图标展示</div>
- <div>18.[优化]前端报错提示文案</div>
- <div>19.[优化]角色管理模块,新增现有角色别名列表可供快速选择</div>
- <div>20.[优化]租户产品包与数据源接口限制只有超管账号可访问</div>
- <div>21.[优化]申请token的角色指定逻辑</div>
- <div>22.[优化]用户单角色绑定逻辑</div>
- <div>
- 23.[优化]报文加密逻辑,@ApiDecrypt与@ApiEncrypt默认为AES模式,简化配置参数
- </div>
- <div>24.[优化]重构WebUtil的getRequestBody与getRequestContent方法逻辑</div>
- <div>
- 25.[优化]代码生成Entity的逻辑,不继承基础类的情况下不限制通用业务字段的生成逻辑
- </div>
- <div>26.[优化]调整Filter优先级,日志追踪支持自定义开关</div>
- <div>27.[优化]SpringDoc加载逻辑</div>
- <div>28.[优化]CacheUtil若获取空值则将错误打印至控制台方便调试</div>
- <div>29.[修复]用户字段返回</div>
- <div>30.[修复]报文加密解密顺序</div>
- </el-collapse-item>
- <el-collapse-item
- title="4.2.0.RELEASE发布,新增对象存储本地模式上传 新增代码生成默认配置与快速生成"
- name="38"
- >
- <div>1.[升级]SpringBoot 至 3.2.10</div>
- <div>2.[升级]SpringCloud 至 2023.0.3</div>
- <div>3.[升级]AlibabaCloud 至 2023.0.1.2</div>
- <div>4.[升级]Nacos 至 2.4.3</div>
- <div>5.[升级]MybatisPlus 至 3.5.8</div>
- <div>6.[升级]Jackson 至 2.18.0</div>
- <div>7.[升级]Lombok 至 1.18.34</div>
- <div>8.[新增]对象存储模块本地模式文件上传</div>
- <div>9.[新增]代码生成支持自定义绑定上级菜单ID</div>
- <div>10.[新增]代码生成默认配置模块</div>
- <div>11.[新增]在线代码快速生成功能,通过前端快速配置无需模型定义一键生成代码</div>
- <div>12.[新增]离线代码快速生成功能,脱离前端在后端一键生成单表CRUD的后端代码</div>
- <div>13.[新增]Oauth2用户前置校验逻辑</div>
- <div>14.[新增]Oauth2异常处理类统一接口支持外部自定义</div>
- <div>15.[新增]Oauth2在非生产环境下认证异常的详细堆栈打印</div>
- <div>16.[新增]Tool工程模块化名称</div>
- <div>17.[新增]生产环境弱密码校验的逻辑</div>
- <div>18.[新增]多租户独立数据源,与代码生成器数据源分离</div>
- <div>19.[新增]Saber3全局颜色主题自定义</div>
- <div>20.[新增]Saber3代码编辑器组件code-editor与highlight</div>
- <div>21.[新增]Saber一套新的iconfont图标</div>
- <div>22.[优化]代码生成器的模版与逻辑</div>
- <div>23.[优化]BladeContext模块请求头过滤增加全小写兼容</div>
- <div>24.[优化]Redis序列化默认加载逻辑</div>
- <div>25.[优化]Condition类的构建逻辑,若查询参数字段不匹配,则系统自动删除</div>
- <div>26.[优化]业务字典支持超管指定租户id查询数据</div>
- <div>27.[优化]租户授权逻辑</div>
- <div>28.[优化]租户缓存逻辑</div>
- <div>29.[优化]验证码模式认证失败后删除验证码缓存</div>
- <div>30.[优化]UserService认证接口调用链</div>
- <div>31.[优化]用户注册成功后仅弹框提示不再跳转</div>
- <div>32.[优化]升级适配最新依赖对应的API</div>
- <div>33.[修复]编译过程中"未知的枚举常量"警告提示</div>
- <div>34.[修复]用户锁定逻辑未触发的问题</div>
- <div>35.[修复]多数据源模式sql日志打印失效的问题</div>
- <div>36.[修复]pg数据库下租户状态查询的问题</div>
- <div>37.[修复]超管编辑租户部门时拉下数据未刷新的问题</div>
- <div>38.[修复]token过期后解决refreshToken重复刷新的问题</div>
- <div>39.[迁移]TenantBaseConstant部分属性迁移至TenantDynamicConstant</div>
- <div>40.[移除]注册接口返回的令牌与刷新令牌字段</div>
- </el-collapse-item>
- <el-collapse-item
- title="4.1.0.RELEASE发布,安全认证采用国密算法,新增短信登录,新增token无感刷新"
- name="37"
- >
- <div>1.[升级]SpringBoot 至 3.2.7</div>
- <div>2.[升级]SpringCloud 至 2023.0.2</div>
- <div>3.[升级]AlibabaCloud 至 2023.0.1.0</div>
- <div>4.[升级]Nacos 至 2.3.2</div>
- <div>5.[升级]MybatisPlus 至 3.5.7</div>
- <div>6.[新增]Token自适应无感刷新方案代替定时刷新方案</div>
- <div>7.[新增]单点登录增加自动授权功能,开启后无需每次点击授权按钮再跳转登录</div>
- <div>8.[新增]单点登录认证升级为国密算法,数据库password字段内容无需变动</div>
- <div>9.[新增]账号密码认证升级为国密算法,数据库password字段内容无需变动</div>
- <div>10.[新增]手机短信登录模式,采用国密算法加密</div>
- <div>11.[新增]用户注册采用国密算法加密</div>
- <div>12.[新增]注册用户自动进入待审核状态,由管理员审核后方可登录系统</div>
- <div>13.[新增]租户回收站功能,支持租户一级删除与二级删除</div>
- <div>14.[新增]多租户oss与多租户sms支持自定义指定tenantId,支持异步场景</div>
- <div>15.[新增]saber2与saber3采用nodejs18编译</div>
- <div>16.[新增]prometheus http sd 支持自定义 management port</div>
- <div>17.[优化]用户与租户删除增加联动模块删除</div>
- <div>18.[优化]用户完整信息判断逻辑</div>
- <div>19.[优化]用户手机号重复判断</div>
- <div>20.[优化]第三方登录token发放逻辑</div>
- <div>21.[优化]swagger在不同环境变量下的配置</div>
- <div>22.[优化]springdoc配置,取消param入参的类被解析成json参数</div>
- <div>23.[优化]springdoc配置,隐藏通用业务字段展示</div>
- <div>24.[优化]sqlkeyword类增加特殊字符清除逻辑</div>
- <div>25.[优化]oauth2响应逻辑</div>
- <div>26.[优化]client校验逻辑</div>
- <div>27.[优化]refreshToken认证逻辑</div>
- <div>28.[优化]数据权限占位符解析器,支持递归层级取值</div>
- <div>29.[优化]数据提交时租户ID判断逻辑</div>
- <div>30.[优化]适配新版代码生成API</div>
- <div>31.[优化]退出登录后的token清楚逻辑</div>
- <div>32.[优化]sql脚本默认关闭注册功能</div>
- <div>33.[修复]错误日志推送保存报错的问题</div>
- <div>34.[修复]redis stream消息自动确认的问题</div>
- <div>35.[修复]不同类型数据库通过DS注解切换后方言没同时切换的问题</div>
- <div>36.[修复]地区数据提交逻辑</div>
- <div>37.[修复]租户字典查询逻辑</div>
- <div>38.[修复]代码生成路径引用错误</div>
- </el-collapse-item>
- <el-collapse-item
- title="4.0.1.RELEASE发布,拆分租户数据库隔离模块 多组件适配优化"
- name="36"
- >
- <div>1.[新增]租户数据库隔离依赖分离可按需引入</div>
- <div>2.[优化]适配shardingsphere在springboot3的兼容性</div>
- <div>3.[优化]适配shardingsphere在dynamic-datasource的兼容性</div>
- <div>4.[优化]ShardingDS注解支持类与方法声明</div>
- <div>5.[优化]用户注册格式校验逻辑</div>
- <div>6.[优化]用户注册的密码设置md5传输</div>
- <div>7.[优化]代码生成模版,避免jdk17反射模块的问题</div>
- <div>8.[优化]指定easyexcel依赖的poi版本避免版本冲突导致报错</div>
- <div>9.[优化]完善secure安全框架的路径放行策略</div>
- <div>10.[优化]放开granter认证功能,用户可自由定义</div>
- </el-collapse-item>
- <el-collapse-item
- title="4.0.0.RELEASE发布,全面升级支持Java17、SpringBoot3、SpringCloud2023"
- name="35"
- >
- <div>1.[升级]JDK 至 Java17</div>
- <div>2.[升级]SpringBoot 至 3.2.4</div>
- <div>3.[升级]SpringBootAdmin 至 3.2.3</div>
- <div>4.[升级]SpringCloud 至 2023.0.1</div>
- <div>5.[升级]AlibabaCloud 至 2022.0.0</div>
- <div>6.[升级]JJWT 至 0.12.5</div>
- <div>7.[升级]Flowable 至 7.0.1</div>
- <div>8.[升级]XxlJob 至 2.4.0</div>
- <div>9.[升级]PowerJob 至 4.3.9</div>
- <div>10.[升级]Knife4j 至 4.5.0</div>
- <div>11.[升级]MybatisSpring 至 3.0.3</div>
- <div>12.[升级]DynamicDatasource 至 4.3.0</div>
- <div>13.[升级]Druid 至 1.2.22</div>
- <div>14.[升级]Nacos 至 2.3.1</div>
- <div>15.[升级]Fastjson 至 2.0.47</div>
- <div>16.[升级]EasyExcel 至 3.3.4</div>
- <div>17.[替换]原SecurityOauth2改为BladeXOAuth2</div>
- <div>18.[替换]原Swagger2改为OpenAPI3</div>
- <div>19.[替换]原独立blade-swagger服务改为blade-gateway聚合文档</div>
- <div>20.[替换]代码头部注释全局替换为新版本</div>
- <div>21.[新增]原Auth模块完全重构,采用新版BladeXOAuth实现</div>
- <div>22.[新增]Boot与Cloud共用认证逻辑,Boot支持单点登录</div>
- <div>23.[新增]安全框架Token与Header严格模式</div>
- <div>24.[新增]安全框架默认打开严格模式与内部二次鉴权</div>
- <div>25.[新增]登录首页用户注册功能</div>
- <div>26.[新增]新注册账号若未绑定角色部门在严格模式下无法直接调用接口</div>
- <div>27.[新增]Sentinel新版API适配</div>
- <div>28.[新增]生产环境屏蔽详细的异常信息返回</div>
- <div>29.[新增]新增卡片+列表模式共存,无缝切换</div>
- <div>30.[新增]SpringDoc-OpenAI3集成支持</div>
- <div>31.[优化]更新代码生成脚本适配最新版API</div>
- <div>32.[优化]优化数据权限枚举类转换方法</div>
- <div>33.[优化]Feign接口地址参数完善命名</div>
- <div>34.[优化]blade-flow配置文件默认关闭租户动态数据源</div>
- <div>35.[优化]问号挂参的路由不再开启新tab</div>
- <div>36.[优化]vue3支持base路径的配置和部署</div>
- <div>37.[优化]优化流程图布局</div>
- <div>38.[优化]数据缓存逻辑,避免无授权用户访问</div>
- <div>39.[优化]默认错误提示</div>
- <div>40.[修复]附件单位转换逻辑</div>
- <div>41.[修复]vue2模块日期格式格式化</div>
- <div>42.[修复]vue3指定第三方登录的路由</div>
- <div>43.[修复]vue3用户个人信息切换后提交报错的问题</div>
- </el-collapse-item>
- <el-collapse-item title="3.4.0.RELEASE发布,新增分布式任务调度客户端" name="34">
- <div>1.[升级]Jackson 至 2.16.1</div>
- <div>2.[升级]Mybatis 至 3.5.15</div>
- <div>3.[升级]MybatisSpring 至 2.1.2</div>
- <div>4.[升级]MybatisPlus 至 3.5.5</div>
- <div>5.[升级]MybatisPlusGenerator 至 3.5.5</div>
- <div>6.[升级]MinioClient 至 8.5.7</div>
- <div>7.[新增]分布式任务PowJob集成</div>
- <div>8.[新增]分布式任务客户端开发</div>
- <div>9.[优化]Saber3加载动画</div>
- <div>10.[修复]代码生成主子表路径引用问题</div>
- </el-collapse-item>
- <el-collapse-item
- title="3.3.1.RELEASE发布,优化Token加密、独立分库分表配置"
- name="33"
- >
- <div>1.[升级]Nacos 至 2.3.0</div>
- <div>2.[升级]FastJson 至 2.0.43</div>
- <div>3.[升级]EasyExcel 至 3.3.3</div>
- <div>4.[升级]JustAuth 至 1.16.6</div>
- <div>5.[升级]MySql驱动 mysql-connector-java 至 mysql-connector-j</div>
- <div>6.[新增]Nacos认证启动注册</div>
- <div>7.[新增]使用 flatten-maven-plugin 重构版本管理</div>
- <div>8.[新增]CryptoKeyGenerator提供加密签名获取</div>
- <div>9.[新增]cryptoData配置支持前端报文加密自动化</div>
- <div>10.[新增]分库分表独立配置</div>
- <div>
- 11.[优化]Token加密单独出配置blade.token.crypto-key防止与报文加密配置逻辑冲突
- </div>
- <div>12.[优化]tenant数据库隔离与sharding分库分表依赖分离,减少默认jar包容量</div>
- <div>13.[优化]默认关闭Notice模块的token加密,降低启动难度</div>
- <div>14.[优化]关闭aesKey与desKey的默认值防止外部以此攻击加密接口获取信息</div>
- <div>15.[修复]修复菜单新增层级问题</div>
- </el-collapse-item>
- <el-collapse-item
- title="3.3.0.RELEASE发布,多租户数据库隔离集成ShardingSphere支持分库分表"
- name="32"
- >
- <div>1.[升级]SpringBoot 至 2.7.18</div>
- <div>2.[升级]SpringBootAdmin 至 2.7.4</div>
- <div>3.[升级]Spring 至 5.3.31</div>
- <div>4.[升级]Druid 至 1.2.20</div>
- <div>5.[升级]Mybatis-Plus 至 3.5.4.1</div>
- <div>6.[升级]Avue3 至 3.2.23</div>
- <div>7.[升级]Knife4j 至 4.3.0</div>
- <div>8.[升级]Jackson 至 2.16.0</div>
- <div>9.[升级]Log4j2 至 2.22.0</div>
- <div>10.[升级]Logback 至 1.2.13</div>
- <div>11.[升级]LiteFlow 至 2.11.3</div>
- <div>12.[新增]多租户数据库隔离支持分库分表功能</div>
- <div>13.[新增]动态数据源与分库分表集成</div>
- <div>14.[新增]多租户对象存储支持内外网地址映射</div>
- <div>15.[优化]Sql防注入逻辑避免双写等情况攻击</div>
- <div>16.[优化]Redis序列化逻辑</div>
- <div>17.[优化]RequestInterceptor增加初始化指定类名</div>
- <div>18.[优化]antlr4版本指定避免模版解析冲突失效</div>
- <div>19.[优化]调整对象存储枚举类别名与配置类名称一致</div>
- <div>20.[优化]部分重要API调用权限提高至管理员角色</div>
- <div>21.[优化]数据源配置提交逻辑</div>
- <div>
- 22.[优化]数据权限处理器强制指定Master数据源,避免动态数据源无法正确读取数据
- </div>
- <div>23.[修复]单点登录退出失效的问题</div>
- <div>24.[修复]oss缓存判断有概率空指针的问题</div>
- <div>25.[修复]ApiVersion在 SpringBoot2.7.x下报错的问题</div>
- <div>26.[修复]修复用户名称读取错误的问题</div>
- </el-collapse-item>
- <el-collapse-item
- title="3.2.0.RELEASE发布,新增规则引擎、token加密、skywalking集成"
- name="31"
- >
- <div>1.[升级]SpringCloud 至 2021.0.8</div>
- <div>2.[升级]SpringBoot 至 2.7.15</div>
- <div>3.[升级]Spring 至 5.3.29</div>
- <div>4.[升级]Druid 至 1.2.19</div>
- <div>5.[升级]Mybatis-Plus 至 3.5.3.2</div>
- <div>6.[升级]Avue3 至 3.2.19</div>
- <div>7.[升级]Avue-Plugin 至 1.0.3</div>
- <div>8.[新增]SkyWalking集成</div>
- <div>9.[新增]Token加密传输与校验</div>
- <div>10.[新增]JwtCrypto工具</div>
- <div>11.[新增]LiteFlow规则引擎集成</div>
- <div>12.[新增]多租户对象存储改造为规则引擎实现</div>
- <div>13.[新增]多租户短信配置改造为规则引擎实现</div>
- <div>14.[新增]新租户创建流程改造为规则引擎实现</div>
- <div>15.[优化]minio增加URL转换功能,支持使用内网地址上传并返回外网地址数据</div>
- <div>16.[优化]多租户动态数据源逻辑</div>
- <div>17.[修复]saber3编辑器文件上传配置</div>
- <div>18.[修复]saber3同路由tab切换不刷新数据的问题</div>
- <div>19.[修复]saber3代码生产模版错误语法</div>
- <div>20.[提醒]minio由于转变开源协议为AGPLv3,最新开源版已不适用与商业化项目</div>
- <div>21.[提醒]minio开源版若需要请下载apache2.0协议的最后一个版本</div>
- <div>22.[提醒]minio开源版可用版本:minio-RELEASE.2021-04-22T15-44-28Z</div>
- </el-collapse-item>
- <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.1、ElementUI 至 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.[优化]SmsBuilder、OssBuilder</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.12,SpringCloud 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.[新增]kafka、rabbitmq、cloudstream集成</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.[新增][修复]dict、role不选择父节点报错</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.8、springcloud 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.[新增]一套代码兼容Mysql、Oracle、PostgreSQL三大主流数据库</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 SR2,mybatis-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.[新增]集成minio、qiniu,进行统一管理的多租户oss系统</div>
- <div>5.[优化]blade-core-cloud逻辑</div>
- <div>6.[新增]badex-biz增加不同包名的swagger、mybatis配置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.[新增]DictCache、UserCache、SysCache缓存工具类</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-col>
- </el-col>
- </el-row>
- </div>
-</template>
-
-<script>
-import { mapGetters } from 'vuex';
-
-export default {
- name: 'wel',
- data() {
- return {
- activeNames: ['1', '2', '3', '5'],
- logActiveNames: ['41'],
- };
- },
- computed: {
- ...mapGetters(['userInfo']),
- },
- methods: {
- handleChange(val) {
- window.console.log(val);
- },
- },
-};
-</script>
-
-<style>
-.el-font-size {
- font-size: 14px;
-}
-</style>
--
Gitblit v1.9.3