发布v2.7.8Beta1 (#1957)

* beta:2.7.8-a 增加自动化创建树形结构 (#1941)

* feat: 支持创建树形结构

---------

Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com>

* 优化user store部分写法

* Update user.js

* feat: 升级版本号

* Dev 278 beta2 (#1954)

* 在关闭详情弹窗后 detailFrom为空对象,arr为undefined 使用slice控制台会报错

* 查询不重置pageSize

* 优化主题模式相关内容

* 优化弹窗手机端显示

* bugfix:PostgreSQL initdb (#1953)

* bugfix:postgresql增加显示指定template

---------

Co-authored-by: PiexlMax(奇淼 <165128580+pixelmaxQm@users.noreply.github.com>

---------

Co-authored-by: zayn <972858472@qq.com>
Co-authored-by: Azir <2075125282@qq.com>
Co-authored-by: Qing Liang <106448173+xue-ding-e@users.noreply.github.com>

* docs:调整部分代码注释以及代码格式

* feat: 自动化代码字典支持多选

* fix:调整值接收器和指针接收器

* feat: 支持导出表格复制,优化增加方法页面。

* chore:初始化代码规范化。

---------

Co-authored-by: piexlMax(奇淼 <qimiaojiangjizhao@gmail.com>
Co-authored-by: Azir <2075125282@qq.com>
Co-authored-by: zayn <972858472@qq.com>
Co-authored-by: Qing Liang <106448173+xue-ding-e@users.noreply.github.com>
Co-authored-by: cjb <75364055@qq.com>
This commit is contained in:
PiexlMax(奇淼
2024-12-08 21:17:21 +08:00
committed by GitHub
co-authored by piexlMax(奇淼 zayn Azir Qing Liang cjb
parent 80c54ad890
commit 283143e1bf
69 changed files with 3609 additions and 480 deletions
+39 -55
View File
@@ -1,8 +1,12 @@
import { defineStore } from 'pinia'
import { ref, watchEffect, reactive } from 'vue'
import { setBodyPrimaryColor } from '@/utils/format'
import { useDark, usePreferredDark } from '@vueuse/core'
export const useAppStore = defineStore('app', () => {
const device = ref('')
const drawerSize = ref('')
const operateMinWith = ref('240')
const config = reactive({
weakness: false,
grey: false,
@@ -16,14 +20,17 @@ export const useAppStore = defineStore('app', () => {
side_mode: 'normal'
})
const theme = ref('auto')
const isDark = useDark({
selector: 'html',
attribute: 'class',
valueDark: 'dark',
valueLight: 'light',
})
const toggleTheme = (dark) => {
if (dark) {
theme.value = 'dark'
} else {
theme.value = 'light'
}
const preferredDark = usePreferredDark()
const toggleTheme = (darkMode) => {
isDark.value = darkMode
}
const toggleWeakness = (e) => {
@@ -43,6 +50,13 @@ export const useAppStore = defineStore('app', () => {
}
const toggleDevice = (e) => {
if(e === 'mobile'){
drawerSize.value = '100%'
operateMinWith.value = '80'
}else {
drawerSize.value = '800'
operateMinWith.value = '240'
}
device.value = e
}
@@ -50,15 +64,14 @@ export const useAppStore = defineStore('app', () => {
config.darkMode = e
}
const toggleDarkModeAuto = () => {
// 处理浏览器主题
const darkQuery = window.matchMedia('(prefers-color-scheme: dark)')
const dark = darkQuery.matches
toggleTheme(dark)
darkQuery.addEventListener('change', (e) => {
toggleTheme(e.matches)
})
}
// 监听系统主题变化
watchEffect(() => {
if (config.darkMode === 'auto') {
isDark.value = preferredDark.value
return
}
isDark.value = config.darkMode === 'dark'
})
const toggleConfigSideWidth = (e) => {
config.layout_side_width = e
@@ -76,55 +89,26 @@ export const useAppStore = defineStore('app', () => {
config.show_watermark = e
}
const toggleSideModel = (e) => {
const toggleSideMode = (e) => {
config.side_mode = e
}
// 监听色弱模式和灰色模式
watchEffect(() => {
if (theme.value === 'dark') {
document.documentElement.classList.add('dark')
document.documentElement.classList.remove('light')
} else {
document.documentElement.classList.add('light')
document.documentElement.classList.remove('dark')
}
})
watchEffect(() => {
// 色弱模式监听处理
if (config.weakness) {
document.documentElement.classList.add('html-weakenss')
} else {
document.documentElement.classList.remove('html-weakenss')
}
})
watchEffect(() => {
// 灰色模式监听处理
if (config.grey) {
document.documentElement.classList.add('html-grey')
} else {
document.documentElement.classList.remove('html-grey')
}
document.documentElement.classList.toggle('html-weakenss', config.weakness)
document.documentElement.classList.toggle('html-grey', config.grey)
})
// 监听主题色
watchEffect(() => {
if (config.darkMode === 'auto') {
toggleDarkModeAuto()
}
if (config.darkMode === 'dark') {
toggleTheme(true)
} else {
toggleTheme(false)
}
})
watchEffect(() => {
setBodyPrimaryColor(config.primaryColor, theme.value)
setBodyPrimaryColor(config.primaryColor, isDark.value ? 'dark' : 'light')
})
return {
theme,
isDark,
device,
drawerSize,
operateMinWith,
config,
toggleTheme,
toggleDevice,
@@ -137,6 +121,6 @@ export const useAppStore = defineStore('app', () => {
toggleConfigSideCollapsedWidth,
toggleConfigSideItemHeight,
toggleConfigWatermark,
toggleSideModel
toggleSideMode
}
})
+50 -56
View File
@@ -3,9 +3,10 @@ import { jsonInBlacklist } from '@/api/jwt'
import router from '@/router/index'
import { ElLoading, ElMessage } from 'element-plus'
import { defineStore } from 'pinia'
import { ref, watch } from 'vue'
import { ref, computed } from 'vue'
import { useRouterStore } from './router'
import cookie from 'js-cookie'
import { useCookies } from '@vueuse/integrations/useCookies'
import { useStorage } from '@vueuse/core'
import { useAppStore } from '@/pinia'
@@ -19,9 +20,10 @@ export const useUserStore = defineStore('user', () => {
headerImg: '',
authority: {}
})
const token = ref(
window.localStorage.getItem('token') || cookie.get('x-token') || ''
)
const token = useStorage('token', '')
const xToken = useCookies('x-token')
const currentToken = computed(() => token.value || xToken.value || '')
const setUserInfo = (val) => {
userInfo.value = val
if (val.originSetting) {
@@ -33,11 +35,11 @@ export const useUserStore = defineStore('user', () => {
const setToken = (val) => {
token.value = val
xToken.value = val
}
const NeedInit = async () => {
token.value = ''
window.localStorage.removeItem('token')
await ClearStorage()
await router.push({ name: 'Init', replace: true })
}
@@ -57,49 +59,49 @@ export const useUserStore = defineStore('user', () => {
}
/* 登录*/
const LoginIn = async (loginInfo) => {
loadingInstance.value = ElLoading.service({
fullscreen: true,
text: '登录中,请稍候...'
})
try {
loadingInstance.value = ElLoading.service({
fullscreen: true,
text: '登录中,请稍候...'
})
const res = await login(loginInfo)
const res = await login(loginInfo)
if (res.code !== 0) {
ElMessage.error(res.message || '登录失败')
return false
}
// 登陆成功,设置用户信息和权限相关信息
setUserInfo(res.data.user)
setToken(res.data.token)
// 登陆失败,直接返回
if (res.code !== 0) {
loadingInstance.value.close()
// 初始化路由信息
const routerStore = useRouterStore()
await routerStore.SetAsyncRouter()
const asyncRouters = routerStore.asyncRouters
// 注册到路由表里
asyncRouters.forEach((asyncRouter) => {
router.addRoute(asyncRouter)
})
if (!router.hasRoute(userInfo.value.authority.defaultRouter)) {
ElMessage.error('请联系管理员进行授权')
} else {
await router.replace({ name: userInfo.value.authority.defaultRouter })
}
const isWindows = /windows/i.test(navigator.userAgent)
window.localStorage.setItem('osType', isWindows ? 'WIN' : 'MAC')
// 全部操作均结束,关闭loading并返回
return true
} catch (error) {
console.error('LoginIn error:', error)
return false
} finally {
loadingInstance.value?.close()
}
// 登陆成功,设置用户信息和权限相关信息
setUserInfo(res.data.user)
setToken(res.data.token)
// 初始化路由信息
const routerStore = useRouterStore()
await routerStore.SetAsyncRouter()
const asyncRouters = routerStore.asyncRouters
// 注册到路由表里
asyncRouters.forEach((asyncRouter) => {
router.addRoute(asyncRouter)
})
if (!router.hasRoute(userInfo.value.authority.defaultRouter)) {
ElMessage.error('请联系管理员进行授权')
} else {
await router.replace({ name: userInfo.value.authority.defaultRouter })
}
const isWin = ref(/windows/i.test(navigator.userAgent))
if (isWin.value) {
window.localStorage.setItem('osType', 'WIN')
} else {
window.localStorage.setItem('osType', 'MAC')
}
// 全部操作均结束,关闭loading并返回
loadingInstance.value.close()
return true
}
/* 登出*/
const LoginOut = async () => {
@@ -119,22 +121,14 @@ export const useUserStore = defineStore('user', () => {
/* 清理数据 */
const ClearStorage = async () => {
token.value = ''
xToken.value = ''
sessionStorage.clear()
window.localStorage.removeItem('token')
cookie.remove('x-token')
localStorage.removeItem('originSetting')
}
watch(
() => token.value,
() => {
window.localStorage.setItem('token', token.value)
}
)
return {
userInfo,
token,
token: currentToken,
NeedInit,
ResetUserInfo,
GetUserInfo,