123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172 |
- import {array, empty, func} from "@/uni_modules/uv-ui-tools/libs/function/test";
- import {useUserStore} from "@/hooks/useUserStore";
- import {toValue, computed, ref} from 'vue'
- import mxConfig from "@/common/mxConfig";
- export const storeGetterFilter = function (userStore, arraySource, refConfig) {
- if (!array(arraySource)) return []
- const results = arraySource.filter(menu => {
- // 不配置认为通配
- if (empty(menu["satisfyStoreGetters"])) return true
- // 过滤掉不满足getters
- const propReader = (getter) => {
- let prop = getter
- let opposite = false
- if (getter.startsWith('!')) {
- prop = getter.substring(1)
- opposite = true
- }
- const propArr = prop.split('.')
- let propResult = userStore
- for (const p of propArr) {
- if ([null, undefined].includes(propResult)) break
- propResult = toValue(propResult[p])
- }
- return !opposite ? propResult : !propResult
- }
- return !menu["satisfyAny"] ?
- menu["satisfyStoreGetters"].every(propReader) :
- menu["satisfyStoreGetters"].some(propReader)
- })
- return refConfig ?
- results.map(r => mergeConfigFn(userStore, r, refConfig)) :
- results
- }
- /*
- * 内部方法,合并带方法的配置文件,此方法在storeGetterFilter内部运行才有意义。
- * 不对外暴露此方法。
- * */
- const mergeConfigFn = function (userStore, obj, refConfig) {
- const target = {}
- Object.keys(obj).forEach(prop => {
- let val = obj[prop]
- if (func(val)) // 传入目标方法,以供方法内部引用同源参数,即方法内部可以和这里达到同样的运行结果。
- val = val(userStore, storeGetterFilter, refConfig)
- else if (array(val) && val.some(item => item && item['satisfyStoreGetters']))
- val = storeGetterFilter(userStore, val, refConfig)
- target[prop] = val
- })
- return target
- }
- export const useUserStorePageFilter = function (pageName) {
- // const data
- const propBanner = `index${pageName}Banner`
- const propMenu = `index${pageName}Menus`
- const propBlock = `index${pageName}Blocks`
- const propHeaderOption = `index${pageName}HeaderOption`
- // reactive data
- const userStore = useUserStore()
- const bannerImage = computed(() => mxConfig[propBanner])
- const menus = computed(() => storeGetterFilter(userStore, mxConfig[propMenu]))
- const blocks = computed(() => storeGetterFilter(userStore, mxConfig[propBlock], mxConfig))
- const headerOption = computed(() => mxConfig[propHeaderOption])
- return {
- bannerImage,
- menus,
- blocks,
- headerOption
- }
- }
|