Former-commit-id: f246662bbf830bd098145c0a71d80f67259a9583
This commit is contained in:
FairyEver
2019-08-20 22:27:32 +08:00
parent a50ec9aeb8
commit 9b54e8701f
15 changed files with 221 additions and 184 deletions
+92
View File
@@ -1,5 +1,7 @@
import low from 'lowdb'
import LocalStorage from 'lowdb/adapters/LocalStorage'
import util from '@/libs/util'
import { cloneDeep } from 'lodash'
const adapter = new LocalStorage(`d2admin-${process.env.VUE_APP_VERSION}`)
const db = low(adapter)
@@ -12,3 +14,93 @@ db
.write()
export default db
/**
* @description 检查路径是否存在 不存在的话初始化
* @param {Object} payload dbName {String} 数据库名称
* @param {Object} payload path {String} 路径
* @param {Object} payload user {Boolean} 区分用户
* @param {Object} payload validator {Function} 数据校验钩子 返回 true 表示验证通过
* @param {Object} payload defaultValue {*} 初始化默认值
* @returns {String} 可以直接使用的路径
*/
export function pathInit ({
dbName = 'database',
path = '',
user = true,
validator = () => true,
defaultValue = ''
}) {
const uuid = util.cookies.get('uuid') || 'ghost-uuid'
const currentPath = `${dbName}.${user ? `user.${uuid}` : 'public'}${path ? `.${path}` : ''}`
const value = db.get(currentPath).value()
if (!(value !== undefined && validator(value))) {
db
.set(currentPath, defaultValue)
.write()
}
return currentPath
}
/**
* @description 将数据存储到指定位置 | 路径不存在会自动初始化
* @description 效果类似于取值 dbName.path = value
* @param {Object} payload dbName {String} 数据库名称
* @param {Object} payload path {String} 存储路径
* @param {Object} payload value {*} 需要存储的值
* @param {Object} payload user {Boolean} 是否区分用户
*/
export function dbSet ({
dbName = 'database',
path = '',
value = '',
user = false
}) {
db.set(pathInit({
dbName,
path,
user
}), value).write()
}
/**
* @description 获取数据
* @description 效果类似于取值 dbName.path || defaultValue
* @param {Object} payload dbName {String} 数据库名称
* @param {Object} payload path {String} 存储路径
* @param {Object} payload defaultValue {*} 取值失败的默认值
* @param {Object} payload user {Boolean} 是否区分用户
*/
export function dbGet ({
dbName = 'database',
path = '',
defaultValue = '',
user = false
}) {
return new Promise(resolve => {
resolve(cloneDeep(db.get(pathInit({
dbName,
path,
user,
defaultValue
})).value()))
})
}
/**
* @description 获取存储数据库对象
* @param {Object} payload user {Boolean} 是否区分用户
*/
export function database ({
dbName = 'database',
path = '',
user = false,
validator = () => true,
defaultValue = ''
} = {}) {
return new Promise(resolve => {
resolve(db.get(pathInit({
dbName, path, user, validator, defaultValue
})))
})
}
+11 -11
View File
@@ -8,10 +8,10 @@ export default {
actions: {
/**
* @description 登录
* @param {Object} param context
* @param {Object} param username {String} 用户账号
* @param {Object} param password {String} 密码
* @param {Object} param route {Object} 登录成功后定向的路由对象 任何 vue-router 支持的格式
* @param {Object} context
* @param {Object} payload username {String} 用户账号
* @param {Object} payload password {String} 密码
* @param {Object} payload route {Object} 登录成功后定向的路由对象 任何 vue-router 支持的格式
*/
login ({ dispatch }, {
username = '',
@@ -48,8 +48,8 @@ export default {
},
/**
* @description 注销用户并返回登录页面
* @param {Object} param context
* @param {Object} param confirm {Boolean} 是否需要确认
* @param {Object} context
* @param {Object} payload confirm {Boolean} 是否需要确认
*/
logout ({ commit, dispatch }, { confirm = false } = {}) {
/**
@@ -69,9 +69,9 @@ export default {
// 判断是否需要确认
if (confirm) {
commit('d2admin/gray/set', true, { root: true })
MessageBox.confirm('注销当前账户吗? 打开的标签页和用户设置将会被保存。', '确认操作', {
confirmButtonText: '确定注销',
cancelButtonText: '放弃',
MessageBox.confirm('确定要注销当前用户吗', '注销用户', {
confirmButtonText: '确定',
cancelButtonText: '取消',
type: 'warning'
})
.then(() => {
@@ -81,7 +81,7 @@ export default {
.catch(() => {
commit('d2admin/gray/set', false, { root: true })
Message({
message: '放弃注销用户'
message: '取消注销操作'
})
})
} else {
@@ -90,7 +90,7 @@ export default {
},
/**
* @description 用户登录后从持久化数据加载一系列的设置
* @param {Object} state vuex state
* @param {Object} context
*/
load ({ dispatch }) {
return new Promise(async resolve => {
+41 -100
View File
@@ -1,33 +1,6 @@
import util from '@/libs/util'
import router from '@/router'
import { cloneDeep } from 'lodash'
/**
* @description 检查路径是否存在 不存在的话初始化
* @param {Object} param dbName {String} 数据库名称
* @param {Object} param path {String} 路径
* @param {Object} param user {Boolean} 区分用户
* @param {Object} param validator {Function} 数据校验钩子 返回 true 表示验证通过
* @param {Object} param defaultValue {*} 初始化默认值
* @returns {String} 可以直接使用的路径
*/
function pathInit ({
dbName = 'database',
path = '',
user = true,
validator = () => true,
defaultValue = ''
}) {
const uuid = util.cookies.get('uuid') || 'ghost-uuid'
const currentPath = `${dbName}.${user ? `user.${uuid}` : 'public'}${path ? `.${path}` : ''}`
const value = util.db.get(currentPath).value()
if (!(value !== undefined && validator(value))) {
util.db
.set(currentPath, defaultValue)
.write()
}
return currentPath
}
import { database as getDatabase, dbGet, dbSet } from '@/libs/util.db'
export default {
namespaced: true,
@@ -35,10 +8,11 @@ export default {
/**
* @description 将数据存储到指定位置 | 路径不存在会自动初始化
* @description 效果类似于取值 dbName.path = value
* @param {Object} param dbName {String} 数据库名称
* @param {Object} param path {String} 存储路径
* @param {Object} param value {*} 需要存储的值
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload dbName {String} 数据库名称
* @param {Object} payload path {String} 存储路径
* @param {Object} payload value {*} 需要存储的值
* @param {Object} payload user {Boolean} 是否区分用户
*/
set (context, {
dbName = 'database',
@@ -46,19 +20,16 @@ export default {
value = '',
user = false
}) {
util.db.set(pathInit({
dbName,
path,
user
}), value).write()
dbSet({ dbName, path, value, user })
},
/**
* @description 获取数据
* @description 效果类似于取值 dbName.path || defaultValue
* @param {Object} param dbName {String} 数据库名称
* @param {Object} param path {String} 存储路径
* @param {Object} param defaultValue {*} 取值失败的默认值
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload dbName {String} 数据库名称
* @param {Object} payload path {String} 存储路径
* @param {Object} payload defaultValue {*} 取值失败的默认值
* @param {Object} payload user {Boolean} 是否区分用户
*/
get (context, {
dbName = 'database',
@@ -66,150 +37,120 @@ export default {
defaultValue = '',
user = false
}) {
return new Promise(resolve => {
resolve(cloneDeep(util.db.get(pathInit({
dbName,
path,
user,
defaultValue
})).value()))
})
return dbGet({ dbName, path, defaultValue, user })
},
/**
* @description 获取存储数据库对象
* @param {Object} context context
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload user {Boolean} 是否区分用户
*/
database (context, {
user = false
} = {}) {
return new Promise(resolve => {
resolve(util.db.get(pathInit({
dbName: 'database',
path: '',
return getDatabase({
user,
defaultValue: {}
})))
})
},
/**
* @description 清空存储数据库对象
* @param {Object} context context
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload user {Boolean} 是否区分用户
*/
databaseClear (context, {
user = false
} = {}) {
return new Promise(resolve => {
resolve(util.db.get(pathInit({
dbName: 'database',
path: '',
return getDatabase({
user,
validator: () => false,
defaultValue: {}
})))
})
},
/**
* @description 获取存储数据库对象 [ 区分页面 ]
* @param {Object} context context
* @param {Object} param basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} payload user {Boolean} 是否区分用户
*/
databasePage (context, {
basis = 'fullPath',
user = false
} = {}) {
return new Promise(resolve => {
resolve(util.db.get(pathInit({
dbName: 'database',
return getDatabase({
path: `$page.${router.app.$route[basis]}`,
user,
defaultValue: {}
})))
})
},
/**
* @description 清空存储数据库对象 [ 区分页面 ]
* @param {Object} context context
* @param {Object} param basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} payload user {Boolean} 是否区分用户
*/
databasePageClear (context, {
basis = 'fullPath',
user = false
} = {}) {
return new Promise(resolve => {
resolve(util.db.get(pathInit({
dbName: 'database',
return getDatabase({
path: `$page.${router.app.$route[basis]}`,
user,
validator: () => false,
defaultValue: {}
})))
})
},
/**
* @description 快速将页面当前的数据 ( $data ) 持久化
* @param {Object} context context
* @param {Object} param instance {Object} vue 实例
* @param {Object} param basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload instance {Object} vue 实例
* @param {Object} payload basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} payload user {Boolean} 是否区分用户
*/
pageSet (context, {
instance,
basis = 'fullPath',
user = false
}) {
return new Promise(resolve => {
resolve(util.db.get(pathInit({
dbName: 'database',
return getDatabase({
path: `$page.${router.app.$route[basis]}.$data`,
user,
validator: () => false,
defaultValue: cloneDeep(instance.$data)
})))
})
},
/**
* @description 快速获取页面快速持久化的数据
* @param {Object} context context
* @param {Object} param instance {Object} vue 实例
* @param {Object} param basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload instance {Object} vue 实例
* @param {Object} payload basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} payload user {Boolean} 是否区分用户
*/
pageGet (context, {
instance,
basis = 'fullPath',
user = false
}) {
return new Promise(resolve => {
resolve(cloneDeep(util.db.get(pathInit({
dbName: 'database',
return dbGet({
path: `$page.${router.app.$route[basis]}.$data`,
user,
defaultValue: cloneDeep(instance.$data)
})).value()))
})
},
/**
* @description 清空页面快照
* @param {Object} context context
* @param {Object} param basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} param user {Boolean} 是否区分用户
* @param {Object} context
* @param {Object} payload basis {String} 页面区分依据 [ name | path | fullPath ]
* @param {Object} payload user {Boolean} 是否区分用户
*/
pageClear (context, {
basis = 'fullPath',
user = false
}) {
return new Promise(resolve => {
resolve(util.db.get(pathInit({
dbName: 'database',
return getDatabase({
path: `$page.${router.app.$route[basis]}.$data`,
user,
validator: () => false,
defaultValue: {}
})))
})
}
}
@@ -9,6 +9,7 @@ export default {
actions: {
/**
* @description 初始化监听
* @param {Object} context
*/
listen ({ commit }) {
return new Promise(resolve => {
@@ -26,6 +27,7 @@ export default {
},
/**
* @description 切换全屏
* @param {Object} context
*/
toggle ({ commit }) {
return new Promise(resolve => {
@@ -44,7 +46,7 @@ export default {
mutations: {
/**
* @description 设置 store 里的全屏状态
* @param {Object} state vuex state
* @param {Object} state state
* @param {Boolean} active active
*/
set (state, active) {
+2 -2
View File
@@ -7,14 +7,14 @@ export default {
mutations: {
/**
* @description 切换灰度状态
* @param {Object} state vuex state
* @param {Object} state state
*/
toggle (state) {
state.active = !state.active
},
/**
* @description 设置灰度模式
* @param {Object} state vuex state
* @param {Object} state state
* @param {Boolean} active active
*/
set (state, active) {
+4 -3
View File
@@ -32,9 +32,10 @@ export default {
actions: {
/**
* @description 添加一个日志
* @param {Object} context
* @param {String} param message {String} 信息
* @param {String} param type {String} 类型
* @param {Object} param meta {Object} 附带的信息
* @param {Object} payload meta {Object} 附带的信息
*/
push ({ rootState, commit }, { message, type = 'info', meta }) {
commit('push', {
@@ -59,7 +60,7 @@ export default {
mutations: {
/**
* @description 添加日志
* @param {Object} state vuex state
* @param {Object} state state
* @param {Object} log data
*/
push (state, log) {
@@ -67,7 +68,7 @@ export default {
},
/**
* @description 清空日志
* @param {Object} state vuex state
* @param {Object} state state
*/
clean (state) {
// store 赋值
+5 -5
View File
@@ -30,7 +30,7 @@ export default {
actions: {
/**
* 设置侧边栏展开或者收缩
* @param {Object} state vuex state
* @param {Object} context
* @param {Boolean} collapse is collapse
*/
asideCollapseSet ({ state, dispatch }, collapse) {
@@ -50,7 +50,7 @@ export default {
},
/**
* 切换侧边栏展开和收缩
* @param {Object} state vuex state
* @param {Object} context
*/
asideCollapseToggle ({ state, dispatch }) {
return new Promise(async resolve => {
@@ -69,7 +69,7 @@ export default {
},
/**
* 从持久化数据读取侧边栏展开或者收缩
* @param {Object} state vuex state
* @param {Object} context
*/
asideCollapseLoad ({ state, dispatch }) {
return new Promise(async resolve => {
@@ -88,7 +88,7 @@ export default {
mutations: {
/**
* @description 设置顶栏菜单
* @param {Object} state vuex state
* @param {Object} state state
* @param {Array} menu menu setting
*/
headerSet (state, menu) {
@@ -97,7 +97,7 @@ export default {
},
/**
* @description 设置侧边栏菜单
* @param {Object} state vuex state
* @param {Object} state state
* @param {Array} menu menu setting
*/
asideSet (state, menu) {
+24 -23
View File
@@ -22,6 +22,7 @@ export default {
actions: {
/**
* @description 确认已经加载多标签页数据 https://github.com/d2-projects/d2-admin/issues/201
* @param {Object} context
*/
isLoaded ({ state }) {
if (state.value) return Promise.resolve()
@@ -36,7 +37,7 @@ export default {
/**
* @class opened
* @description 从持久化数据载入标签页列表
* @param {Object} state vuex state
* @param {Object} context
*/
openedLoad ({ state, commit, dispatch }) {
return new Promise(async resolve => {
@@ -77,7 +78,7 @@ export default {
},
/**
* 将 opened 属性赋值并持久化 在这之前请先确保已经更新了 state.opened
* @param {Object} state vuex state
* @param {Object} context
*/
opend2db ({ state, dispatch }) {
return new Promise(async resolve => {
@@ -95,8 +96,8 @@ export default {
/**
* @class opened
* @description 更新页面列表上的某一项
* @param {Object} state vuex state
* @param {Object} param { index, params, query, fullPath } 路由信息
* @param {Object} context
* @param {Object} payload { index, params, query, fullPath } 路由信息
*/
openedUpdate ({ state, commit, dispatch }, { index, params, query, fullPath }) {
return new Promise(async resolve => {
@@ -115,8 +116,8 @@ export default {
/**
* @class opened
* @description 新增一个 tag (打开一个页面)
* @param {Object} state vuex state
* @param {Object} param new tag info
* @param {Object} context
* @param {Object} payload new tag info
*/
add ({ state, commit, dispatch }, { tag, params, query, fullPath }) {
return new Promise(async resolve => {
@@ -140,8 +141,8 @@ export default {
/**
* @class current
* @description 打开一个新的页面
* @param {Object} state vuex state
* @param {Object} param 从路由钩子的 to 对象上获取 { name, params, query, fullPath } 路由信息
* @param {Object} context
* @param {Object} payload 从路由钩子的 to 对象上获取 { name, params, query, fullPath } 路由信息
*/
open ({ state, commit, dispatch }, { name, params, query, fullPath }) {
return new Promise(async resolve => {
@@ -183,8 +184,8 @@ export default {
/**
* @class opened
* @description 关闭一个 tag (关闭一个页面)
* @param {Object} state vuex state
* @param {Object} param { tagName: 要关闭的标签名字 }
* @param {Object} context
* @param {Object} payload { tagName: 要关闭的标签名字 }
*/
close ({ state, commit, dispatch }, { tagName }) {
return new Promise(async resolve => {
@@ -233,8 +234,8 @@ export default {
/**
* @class opened
* @description 关闭当前标签左边的标签
* @param {Object} state vuex state
* @param {Object} param { pageSelect: 当前选中的tagName }
* @param {Object} context
* @param {Object} payload { pageSelect: 当前选中的tagName }
*/
closeLeft ({ state, commit, dispatch }, { pageSelect } = {}) {
return new Promise(async resolve => {
@@ -262,8 +263,8 @@ export default {
/**
* @class opened
* @description 关闭当前标签右边的标签
* @param {Object} state vuex state
* @param {Object} param { pageSelect: 当前选中的tagName }
* @param {Object} context
* @param {Object} payload { pageSelect: 当前选中的tagName }
*/
closeRight ({ state, commit, dispatch }, { pageSelect } = {}) {
return new Promise(async resolve => {
@@ -290,8 +291,8 @@ export default {
/**
* @class opened
* @description 关闭当前激活之外的 tag
* @param {Object} state vuex state
* @param {Object} param { pageSelect: 当前选中的tagName }
* @param {Object} context
* @param {Object} payload { pageSelect: 当前选中的tagName }
*/
closeOther ({ state, commit, dispatch }, { pageSelect } = {}) {
return new Promise(async resolve => {
@@ -323,7 +324,7 @@ export default {
/**
* @class opened
* @description 关闭所有 tag
* @param {Object} state vuex state
* @param {Object} context
*/
closeAll ({ state, commit, dispatch }) {
return new Promise(async resolve => {
@@ -346,14 +347,14 @@ export default {
/**
* @class keepAlive
* @description 从已经打开的页面记录中更新需要缓存的页面记录
* @param {Object} state vuex state
* @param {Object} state state
*/
keepAliveRefresh (state) {
state.keepAlive = state.opened.filter(item => isKeepAlive(item)).map(e => e.name)
},
/**
* @description 删除一个页面的缓存设置
* @param {Object} state vuex state
* @param {Object} state state
* @param {String} name name
*/
keepAliveRemove (state, name) {
@@ -367,7 +368,7 @@ export default {
},
/**
* @description 增加一个页面的缓存设置
* @param {Object} state vuex state
* @param {Object} state state
* @param {String} name name
*/
keepAlivePush (state, name) {
@@ -377,7 +378,7 @@ export default {
},
/**
* @description 清空页面缓存设置
* @param {Object} state vuex state
* @param {Object} state state
*/
keepAliveClean (state) {
state.keepAlive = []
@@ -385,7 +386,7 @@ export default {
/**
* @class current
* @description 设置当前激活的页面 fullPath
* @param {Object} state vuex state
* @param {Object} state state
* @param {String} fullPath new fullPath
*/
currentSet (state, fullPath) {
@@ -394,7 +395,7 @@ export default {
/**
* @class pool
* @description 保存 pool (候选池)
* @param {Object} state vuex state
* @param {Object} state state
* @param {Array} routes routes
*/
init (state, routes) {
@@ -5,7 +5,7 @@ export default {
mutations: {
/**
* @description 显示版本信息
* @param {Object} state vuex state
* @param {Object} state state
*/
versionShow () {
util.log.capsule('D2Admin', `v${process.env.VUE_APP_VERSION}`)
+3 -3
View File
@@ -16,14 +16,14 @@ export default {
mutations: {
/**
* @description 切换激活状态
* @param {Object} state vuex state
* @param {Object} state state
*/
toggle (state) {
state.active = !state.active
},
/**
* @description 设置激活模式
* @param {Object} state vuex state
* @param {Object} state state
* @param {Boolean} active active
*/
set (state, active) {
@@ -31,7 +31,7 @@ export default {
},
/**
* @description 初始化
* @param {Object} state vuex state
* @param {Object} state state
* @param {Array} menu menu
*/
init (state, menu) {
+4 -2
View File
@@ -10,6 +10,7 @@ export default {
actions: {
/**
* @description 将当前的设置应用到 element
* @param {Object} context
* @param {Boolean} refresh 是否在设置之后刷新页面
*/
apply ({ state, commit }, refresh) {
@@ -21,6 +22,7 @@ export default {
},
/**
* @description 确认已经加载组件尺寸设置 https://github.com/d2-projects/d2-admin/issues/198
* @param {Object} context
*/
isLoaded ({ state }) {
if (state.value) return Promise.resolve()
@@ -34,7 +36,7 @@ export default {
},
/**
* @description 设置尺寸
* @param {Object} state vuex state
* @param {Object} context
* @param {String} size 尺寸
*/
set ({ state, dispatch }, size) {
@@ -56,7 +58,7 @@ export default {
},
/**
* @description 从持久化数据读取尺寸设置
* @param {Object} state vuex state
* @param {Object} context
*/
load ({ state, dispatch }) {
return new Promise(async resolve => {
+3 -5
View File
@@ -12,7 +12,7 @@ export default {
getters: {
/**
* @description 返回当前的主题信息 不是一个名字 而是当前激活主题的所有数据
* @param {Object} state vuex state
* @param {Object} state state
*/
activeSetting (state) {
return state.list.find(theme => theme.name === state.activeName)
@@ -21,7 +21,6 @@ export default {
actions: {
/**
* @description 激活一个主题
* @param {Object} state vuex state
* @param {String} themeValue 需要激活的主题名称
*/
set ({ state, commit, dispatch }, themeName) {
@@ -42,8 +41,7 @@ export default {
})
},
/**
* @description 从持久化数据加载主题设置
* @param {Object} state vuex state
* @description 从持久化数据加载主题设置 * @param {Object} context
*/
load ({ state, commit, dispatch }) {
return new Promise(async resolve => {
@@ -77,7 +75,7 @@ export default {
mutations: {
/**
* @description 将 vuex 中的主题应用到 dom
* @param {Object} state vuex state
* @param {Object} state state
*/
dom (state) {
document.body.className = `theme-${state.activeName}`
@@ -10,7 +10,7 @@ export default {
actions: {
/**
* @description 设置开启状态
* @param {Object} state vuex state
* @param {Object} context
* @param {Boolean} active 新的状态
*/
set ({ state, dispatch }, active) {
@@ -30,7 +30,7 @@ export default {
},
/**
* 从数据库读取页面过渡动画设置
* @param {Object} state vuex state
* @param {Object} context
*/
load ({ state, dispatch }) {
return new Promise(async resolve => {
+1 -1
View File
@@ -9,7 +9,7 @@ export default {
mutations: {
/**
* @description 记录 UA
* @param {Object} state vuex state
* @param {Object} state state
*/
get (state) {
state.data = new UaParser().getResult()
+2 -2
View File
@@ -7,7 +7,7 @@ export default {
actions: {
/**
* @description 设置用户数据
* @param {Object} state vuex state
* @param {Object} context
* @param {*} info info
*/
set ({ state, dispatch }, info) {
@@ -27,7 +27,7 @@ export default {
},
/**
* @description 从数据库取用户数据
* @param {Object} state vuex state
* @param {Object} context
*/
load ({ state, dispatch }) {
return new Promise(async resolve => {