Initial commit: freedom-web frontend project

This commit is contained in:
张家训
2026-08-19 17:59:00 +08:00
commit 0131747f90
186 changed files with 18882 additions and 0 deletions
+23
View File
@@ -0,0 +1,23 @@
import Vue from 'vue'
import Vuex from 'vuex'
import user from './module/user'
import app from './module/app'
Vue.use(Vuex)
export default new Vuex.Store({
state: {
//
},
mutations: {
//
},
actions: {
//
},
modules: {
user,
app
}
})
+125
View File
@@ -0,0 +1,125 @@
import {
getBreadCrumbList,
setTagNavListInLocalstorage,
getMenuByRouter,
getTagNavListFromLocalstorage,
getHomeRoute,
getNextRoute,
routeHasExist,
routeEqual,
getRouteTitleHandled,
localSave,
localRead
} from '@/libs/util'
import beforeClose from '@/router/before-close'
import { saveErrorLogger } from '@/api/data'
import router from '@/router'
import routers from '@/router/routers'
import config from '@/config'
// ①引入路由数据读取方法
import { loadMenuList, createRouter } from '@/libs/router-util'
const { homeName } = config
const closePage = (state, route) => {
const nextRoute = getNextRoute(state.tagNavList, route)
state.tagNavList = state.tagNavList.filter(item => {
return !routeEqual(item, route)
})
router.push(nextRoute)
}
export default {
state: {
breadCrumbList: [],
tagNavList: [],
homeRoute: getHomeRoute(routers, homeName),
local: localRead('local'),
errorList: [],
hasReadErrorPage: false,
menuList: loadMenuList(),
},
getters: {
//menuList: (state, getters, rootState) => getMenuByRouter(routers, rootState.user.access),
// ②通过路由列表得到菜单列表
// menuList: (state, getters, rootState) => getMenuByRouter(loadMenuList(), rootState.user.access),
menuList: (state, getters, rootState) => getMenuByRouter(state.menuList, rootState.user.access),
errorCount: state => state.errorList.length
},
mutations: {
setBreadCrumb (state, route) {
state.breadCrumbList = getBreadCrumbList(route, state.homeRoute)
},
setTagNavList (state, list) {
let tagList = []
if (list) {
tagList = [...list]
} else tagList = getTagNavListFromLocalstorage() || []
if (tagList[0] && tagList[0].name !== homeName) tagList.shift()
let homeTagIndex = tagList.findIndex(item => item.name === homeName)
if (homeTagIndex > 0) {
let homeTag = tagList.splice(homeTagIndex, 1)[0]
tagList.unshift(homeTag)
}
state.tagNavList = tagList
setTagNavListInLocalstorage([...tagList])
},
closeTag (state, route) {
let tag = state.tagNavList.filter(item => routeEqual(item, route))
route = tag[0] ? tag[0] : null
if (!route) return
if (route.meta && route.meta.beforeCloseName && route.meta.beforeCloseName in beforeClose) {
new Promise(beforeClose[route.meta.beforeCloseName]).then(close => {
if (close) {
closePage(state, route)
}
})
} else {
closePage(state, route)
}
},
addTag (state, { route, type = 'unshift' }) {
let router = getRouteTitleHandled(route)
if (!routeHasExist(state.tagNavList, router)) {
if (type === 'push') state.tagNavList.push(router)
else {
if (router.name === homeName) state.tagNavList.unshift(router)
else state.tagNavList.splice(1, 0, router)
}
setTagNavListInLocalstorage([...state.tagNavList])
}
},
setLocal (state, lang) {
localSave('local', lang)
state.local = lang
},
addError (state, error) {
state.errorList.push(error)
},
setHasReadErrorLoggerStatus (state, status = true) {
state.hasReadErrorPage = status
},
updateMenuList(state, routes) {
// ③接受前台数组,刷新菜单
router.matcher = createRouter(routers).matcher
router.addRoutes(routes)
state.menuList = routes
},
},
actions: {
addErrorLog ({ commit, rootState }, info) {
if (!window.location.href.includes('error_logger_page')) commit('setHasReadErrorLoggerStatus', false)
const { user: { token, userId, username } } = rootState
let data = {
...info,
time: Date.parse(new Date()),
token,
userId,
username
}
saveErrorLogger(info).then(() => {
commit('addError', data)
})
}
}
}
+109
View File
@@ -0,0 +1,109 @@
import { login, logout, getUserInfo } from '@/api/sys/sys-user'
import { setToken, getToken, setExpireTime, getExpireTime, localDelete } from '@/libs/util'
export default {
state: {
username: '',
userId: '',
avatorImgPath: '',
nickname: '',
token: getToken(),
expireTime: getExpireTime(), //增加的token过期时间
access: '',
hasGetInfo: false
},
mutations: {
setAvator (state, avatorPath) {
state.avatorImgPath = avatorPath
},
setUserId (state, id) {
state.userId = id
},
setUsername (state, username) {
state.username = username
},
setNickname (state, nickname) {
state.nickname = nickname
},
setAccess (state, access) {
state.access = access
},
setToken (state, token) {
state.token = token
setToken(token)
},
setExpireTime (state, expireTime) {
state.expireTime = expireTime
setExpireTime(expireTime)
},
setHasGetInfo (state, status) {
state.hasGetInfo = status
}
},
actions: {
// 登录
handleLogin ({ commit }, {username, password ,ip}) {
username = username.trim()
return new Promise((resolve, reject) => {
login({
username,
password,
ip
}).then(res => {
let data = res.data
console.log("data:", data)
if (data.code === 200) {
let token = data.token
console.log("token:", token)
commit('setToken', token)
let curDate = new Date()
let expireTime = curDate.getTime() +24*60*60*1000 // 假设过期时间为后一天24*60*60*1000
commit('setExpireTime',expireTime)
}
resolve(data)
}).catch(err => {
reject(err)
})
})
},
// 退出登录
handleLogOut ({ state, commit }) {
return new Promise((resolve, reject) => {
logout(state.token).then(() => {
commit('setToken', '')
commit('setAccess', [])
// 退出时清空缓存路由
localDelete('route')
resolve()
}).catch(err => {
reject(err)
})
// 如果你的退出登录无需请求接口,则可以直接使用下面三行代码而无需使用logout调用接口
// commit('setToken', '')
// commit('setAccess', [])
// resolve()
})
},
// 获取用户相关信息
getUserInfo ({ state, commit }) {
return new Promise((resolve, reject) => {
try {
getUserInfo(state.token).then(res => {
const data = res.data.data;
commit('setAvator', data.avatar)
commit('setUsername', data.username) // 登录账号
commit('setNickname', data.nickname) // 昵称
commit('setUserId', data.id) //用户ID
commit('setAccess', ['admin']) //用户权限
commit('setHasGetInfo', true)
resolve(data)
}).catch(err => {
reject(err)
})
} catch (error) {
reject(error)
}
})
}
}
}