用 VITE_MOCK_* 系列环境变量替换全局 VITE_USE_MOCK,各模块独立控制演示数据 启用,并新增 src/utils/mock-flags.ts 统一解析缺省值。文档库关闭演示库时 如实提示接口待接入,避免静默沿用本地数据或覆盖已保存内容。
102 lines
2.9 KiB
TypeScript
102 lines
2.9 KiB
TypeScript
import { computed, ref } from 'vue'
|
|
import { defineStore } from 'pinia'
|
|
|
|
import { getCampuses } from '@/api/management/organization'
|
|
import { mockFlags } from '@/utils/mock-flags'
|
|
import type { CampusRecord } from '@/api/management/types'
|
|
import type { WorkbenchCampus } from '@/api/workbench/types'
|
|
|
|
// 演示院区跟随组织数据开关:开着会把 mock 的 campusId 一并发给真实接口。
|
|
const useMockData = mockFlags.organization
|
|
|
|
const mockCampusRecords: CampusRecord[] = [
|
|
{ id: 'mock-campus-main', code: 'MAIN', name: '本部院区', status: 'ENABLED', sortNo: 1 },
|
|
{ id: 'mock-campus-east', code: 'EAST', name: '东院区', status: 'ENABLED', sortNo: 2 },
|
|
{ id: 'mock-campus-west', code: 'WEST', name: '西院区', status: 'ENABLED', sortNo: 3 },
|
|
]
|
|
|
|
function getEnabledCampuses(records: CampusRecord[]) {
|
|
return [...records]
|
|
.filter((campus) => campus.status !== 'DISABLED')
|
|
.sort(
|
|
(left, right) => left.sortNo - right.sortNo || left.name.localeCompare(right.name, 'zh-CN'),
|
|
)
|
|
}
|
|
|
|
export const useAppStore = defineStore('app', () => {
|
|
const environment = ref('接口联调环境')
|
|
const campusRecords = ref<CampusRecord[]>(
|
|
useMockData ? getEnabledCampuses(mockCampusRecords) : [],
|
|
)
|
|
const selectedCampusId = ref(useMockData ? (campusRecords.value[0]?.id ?? '') : '')
|
|
const campusLoading = ref(false)
|
|
const campusLoaded = ref(useMockData)
|
|
const campusLoadFailed = ref(false)
|
|
let campusRequest: Promise<void> | null = null
|
|
|
|
const campuses = computed<WorkbenchCampus[]>(() =>
|
|
campusRecords.value.map((campus) => campus.name),
|
|
)
|
|
const selectedCampus = computed<WorkbenchCampus>(
|
|
() => campusRecords.value.find((campus) => campus.id === selectedCampusId.value)?.name ?? '',
|
|
)
|
|
|
|
function selectCampus(id: string) {
|
|
if (campusRecords.value.some((campus) => campus.id === id)) {
|
|
selectedCampusId.value = id
|
|
}
|
|
}
|
|
|
|
function ensureSelectedCampus() {
|
|
if (!campusRecords.value.some((campus) => campus.id === selectedCampusId.value)) {
|
|
selectedCampusId.value = campusRecords.value[0]?.id ?? ''
|
|
}
|
|
}
|
|
|
|
async function loadCampuses(force = false): Promise<void> {
|
|
if (useMockData) {
|
|
return
|
|
}
|
|
|
|
if (!force && campusLoaded.value) {
|
|
return
|
|
}
|
|
|
|
if (campusRequest) {
|
|
return campusRequest
|
|
}
|
|
|
|
campusLoading.value = true
|
|
campusLoadFailed.value = false
|
|
const request = getCampuses()
|
|
.then((records) => {
|
|
campusRecords.value = getEnabledCampuses(records)
|
|
ensureSelectedCampus()
|
|
campusLoaded.value = true
|
|
})
|
|
.catch(() => {
|
|
campusLoadFailed.value = true
|
|
})
|
|
.finally(() => {
|
|
campusLoading.value = false
|
|
campusRequest = null
|
|
})
|
|
|
|
campusRequest = request
|
|
return request
|
|
}
|
|
|
|
return {
|
|
environment,
|
|
campuses,
|
|
campusRecords,
|
|
selectedCampusId,
|
|
selectedCampus,
|
|
campusLoading,
|
|
campusLoaded,
|
|
campusLoadFailed,
|
|
loadCampuses,
|
|
selectCampus,
|
|
}
|
|
})
|