feat: migrate app routes and business modules
This commit is contained in:
@@ -0,0 +1,89 @@
|
||||
const CURRENT_GENEALOGY_KEY = 'jiapu_current_genealogy_id'
|
||||
const CURRENT_GENEALOGY_INVALIDATED_KEY = 'jiapu_current_genealogy_invalidated'
|
||||
|
||||
const normalizeGenealogyId = (genealogyId) => {
|
||||
if (typeof genealogyId !== 'string') {
|
||||
throw new TypeError('当前家谱 ID 必须是词法字符串')
|
||||
}
|
||||
if (!genealogyId || genealogyId.trim() !== genealogyId || /[\u0000-\u001f\u007f]/.test(genealogyId)) {
|
||||
throw new TypeError('当前家谱 ID 必须是无边界空白的非空字符串')
|
||||
}
|
||||
return genealogyId
|
||||
}
|
||||
|
||||
const markCurrentGenealogyInvalidated = () => {
|
||||
uni.removeStorageSync(CURRENT_GENEALOGY_KEY)
|
||||
uni.setStorageSync(CURRENT_GENEALOGY_INVALIDATED_KEY, '1')
|
||||
}
|
||||
|
||||
const readCurrentGenealogyInvalidated = () => {
|
||||
const stored = uni.getStorageSync(CURRENT_GENEALOGY_INVALIDATED_KEY)
|
||||
if (stored === '' || stored === null || stored === undefined) return false
|
||||
if (stored !== '1') uni.setStorageSync(CURRENT_GENEALOGY_INVALIDATED_KEY, '1')
|
||||
return true
|
||||
}
|
||||
|
||||
const readCurrentGenealogyId = () => {
|
||||
const stored = uni.getStorageSync(CURRENT_GENEALOGY_KEY)
|
||||
if (stored === '' || stored === null || stored === undefined) return ''
|
||||
try {
|
||||
return normalizeGenealogyId(stored)
|
||||
} catch {
|
||||
// 旧版本或损坏的存储值不应继续流入路由和权限判断。发现异常时只清理
|
||||
// 这一唯一键;下一次取得可用家谱列表后再按确定顺序建立新上下文。
|
||||
markCurrentGenealogyInvalidated()
|
||||
return ''
|
||||
}
|
||||
}
|
||||
|
||||
export const genealogyContext = {
|
||||
getCurrentGenealogyId: readCurrentGenealogyId,
|
||||
setCurrentGenealogyId: (genealogyId) => {
|
||||
const normalizedId = normalizeGenealogyId(genealogyId)
|
||||
uni.setStorageSync(CURRENT_GENEALOGY_KEY, normalizedId)
|
||||
uni.removeStorageSync(CURRENT_GENEALOGY_INVALIDATED_KEY)
|
||||
return normalizedId
|
||||
},
|
||||
invalidateCurrentGenealogyId: () => {
|
||||
markCurrentGenealogyInvalidated()
|
||||
return ''
|
||||
},
|
||||
isCurrentGenealogyInvalidated: readCurrentGenealogyInvalidated,
|
||||
clearCurrentGenealogyId: () => {
|
||||
uni.removeStorageSync(CURRENT_GENEALOGY_KEY)
|
||||
uni.removeStorageSync(CURRENT_GENEALOGY_INVALIDATED_KEY)
|
||||
},
|
||||
reconcileCurrentGenealogyId: (availableIds, preferredId = '') => {
|
||||
if (!Array.isArray(availableIds)) {
|
||||
throw new TypeError('可用家谱 ID 必须是数组')
|
||||
}
|
||||
const normalizedIds = availableIds.map(normalizeGenealogyId)
|
||||
if (new Set(normalizedIds).size !== normalizedIds.length) {
|
||||
throw new TypeError('可用家谱列表包含重复 ID')
|
||||
}
|
||||
const normalizedPreferredId = preferredId === ''
|
||||
? ''
|
||||
: normalizeGenealogyId(preferredId)
|
||||
const storedId = readCurrentGenealogyId()
|
||||
if (normalizedPreferredId) {
|
||||
if (!normalizedIds.includes(normalizedPreferredId)) {
|
||||
markCurrentGenealogyInvalidated()
|
||||
return ''
|
||||
}
|
||||
return genealogyContext.setCurrentGenealogyId(normalizedPreferredId)
|
||||
}
|
||||
if (storedId) {
|
||||
if (!normalizedIds.includes(storedId)) {
|
||||
markCurrentGenealogyInvalidated()
|
||||
return ''
|
||||
}
|
||||
return genealogyContext.setCurrentGenealogyId(storedId)
|
||||
}
|
||||
if (readCurrentGenealogyInvalidated()) return ''
|
||||
if (!normalizedIds.length) {
|
||||
uni.removeStorageSync(CURRENT_GENEALOGY_KEY)
|
||||
return ''
|
||||
}
|
||||
return genealogyContext.setCurrentGenealogyId(normalizedIds[0])
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user