util.db.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. import low from 'lowdb'
  2. import LocalStorage from 'lowdb/adapters/LocalStorage'
  3. import { getUuid } from '@/utils/auth'
  4. import { cloneDeep } from 'lodash'
  5. import setting from '@/setting.js'
  6. const adapter = new LocalStorage(setting.globalKey)
  7. const db = low(adapter)
  8. db.defaults({
  9. sys: {
  10. public: {},
  11. user: {
  12. 'ghost-uuid': {}
  13. }
  14. },
  15. database: {}
  16. })
  17. .write()
  18. export default db
  19. /**
  20. * @description 检查路径是否存在 不存在的话初始化
  21. * @param {Object} payload dbName {String} 数据库名称
  22. * @param {Object} payload path {String} 路径
  23. * @param {Object} payload user {Boolean} 区分用户
  24. * @param {Object} payload validator {Function} 数据校验钩子 返回 true 表示验证通过
  25. * @param {Object} payload defaultValue {*} 初始化默认值
  26. * @returns {String} 可以直接使用的路径
  27. */
  28. export function pathInit({
  29. dbName = 'database',
  30. path = '',
  31. user = true,
  32. validator = () => true,
  33. defaultValue = ''
  34. }) {
  35. let uuid = getUuid()
  36. uuid = uuid === undefined || uuid === null || uuid === '' ? 'ghost-uuid' : (uuid + '')
  37. const currentPath = `${dbName}.${user ? `user.${uuid}` : 'public'}${path ? `.${path}` : ''}`
  38. const value = db.get(currentPath).value()
  39. if (!(value !== undefined && validator(value))) {
  40. db.set(currentPath, defaultValue)
  41. .write()
  42. }
  43. return currentPath
  44. }
  45. /**
  46. * @description 将数据存储到指定位置 | 路径不存在会自动初始化
  47. * @description 效果类似于取值 dbName.path = value
  48. * @param {Object} payload dbName {String} 数据库名称
  49. * @param {Object} payload path {String} 存储路径
  50. * @param {Object} payload value {*} 需要存储的值
  51. * @param {Object} payload user {Boolean} 是否区分用户
  52. */
  53. export function dbSet({
  54. dbName = 'database',
  55. path = '',
  56. value = '',
  57. user = false
  58. }) {
  59. db.set(pathInit({
  60. dbName,
  61. path,
  62. user
  63. }), value).write()
  64. }
  65. /**
  66. * @description 获取数据
  67. * @description 效果类似于取值 dbName.path || defaultValue
  68. * @param {Object} payload dbName {String} 数据库名称
  69. * @param {Object} payload path {String} 存储路径
  70. * @param {Object} payload defaultValue {*} 取值失败的默认值
  71. * @param {Object} payload user {Boolean} 是否区分用户
  72. */
  73. export function dbGet({
  74. dbName = 'database',
  75. path = '',
  76. defaultValue = '',
  77. user = false
  78. }) {
  79. return cloneDeep(db.get(pathInit({
  80. dbName,
  81. path,
  82. user,
  83. defaultValue
  84. })).value())
  85. }
  86. /**
  87. * @description 获取存储数据库对象
  88. * @param {Object} payload user {Boolean} 是否区分用户
  89. */
  90. export function database({
  91. dbName = 'database',
  92. path = '',
  93. user = false,
  94. validator = () => true,
  95. defaultValue = ''
  96. } = {}) {
  97. return db.get(pathInit({
  98. dbName, path, user, validator, defaultValue
  99. }))
  100. }