useUserStorePageFilter.js 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172
  1. import {array, empty, func} from "@/uni_modules/uv-ui-tools/libs/function/test";
  2. import {useUserStore} from "@/hooks/useUserStore";
  3. import {toValue, computed, ref} from 'vue'
  4. import mxConfig from "@/common/mxConfig";
  5. export const storeGetterFilter = function (userStore, arraySource, refConfig) {
  6. if (!array(arraySource)) return []
  7. const results = arraySource.filter(menu => {
  8. // 不配置认为通配
  9. if (empty(menu["satisfyStoreGetters"])) return true
  10. // 过滤掉不满足getters
  11. const propReader = (getter) => {
  12. let prop = getter
  13. let opposite = false
  14. if (getter.startsWith('!')) {
  15. prop = getter.substring(1)
  16. opposite = true
  17. }
  18. const propArr = prop.split('.')
  19. let propResult = userStore
  20. for (const p of propArr) {
  21. if ([null, undefined].includes(propResult)) break
  22. propResult = toValue(propResult[p])
  23. }
  24. return !opposite ? propResult : !propResult
  25. }
  26. return !menu["satisfyAny"] ?
  27. menu["satisfyStoreGetters"].every(propReader) :
  28. menu["satisfyStoreGetters"].some(propReader)
  29. })
  30. return refConfig ?
  31. results.map(r => mergeConfigFn(userStore, r, refConfig)) :
  32. results
  33. }
  34. /*
  35. * 内部方法,合并带方法的配置文件,此方法在storeGetterFilter内部运行才有意义。
  36. * 不对外暴露此方法。
  37. * */
  38. const mergeConfigFn = function (userStore, obj, refConfig) {
  39. const target = {}
  40. Object.keys(obj).forEach(prop => {
  41. let val = obj[prop]
  42. if (func(val)) // 传入目标方法,以供方法内部引用同源参数,即方法内部可以和这里达到同样的运行结果。
  43. val = val(userStore, storeGetterFilter, refConfig)
  44. else if (array(val) && val.some(item => item && item['satisfyStoreGetters']))
  45. val = storeGetterFilter(userStore, val, refConfig)
  46. target[prop] = val
  47. })
  48. return target
  49. }
  50. export const useUserStorePageFilter = function (pageName) {
  51. // const data
  52. const propBanner = `index${pageName}Banner`
  53. const propMenu = `index${pageName}Menus`
  54. const propBlock = `index${pageName}Blocks`
  55. const propHeaderOption = `index${pageName}HeaderOption`
  56. // reactive data
  57. const userStore = useUserStore()
  58. const bannerImage = computed(() => mxConfig[propBanner])
  59. const menus = computed(() => storeGetterFilter(userStore, mxConfig[propMenu]))
  60. const blocks = computed(() => storeGetterFilter(userStore, mxConfig[propBlock], mxConfig))
  61. const headerOption = computed(() => mxConfig[propHeaderOption])
  62. return {
  63. bannerImage,
  64. menus,
  65. blocks,
  66. headerOption
  67. }
  68. }