diff --git a/.gitignore b/.gitignore deleted file mode 100644 index a19f004..0000000 --- a/.gitignore +++ /dev/null @@ -1,11 +0,0 @@ -# ---> Vue -# gitignore template for Vue.js projects -# -# Recommended template: Node.gitignore - -# TODO: where does this rule come from? -docs/_book - -# TODO: where does this rule come from? -test/ - diff --git a/README.md b/README.md deleted file mode 100644 index ee60871..0000000 --- a/README.md +++ /dev/null @@ -1,2 +0,0 @@ -# zhican - diff --git a/zhican/.gitignore b/zhican/.gitignore new file mode 100644 index 0000000..b44788e --- /dev/null +++ b/zhican/.gitignore @@ -0,0 +1,7 @@ +node_modules +dist +.DS_Store +*.local +.env +.env.* +!.env.example diff --git a/zhican/admin/index.html b/zhican/admin/index.html new file mode 100644 index 0000000..ecc47c4 --- /dev/null +++ b/zhican/admin/index.html @@ -0,0 +1,13 @@ + + + + + + + 智能餐养管理系统 + + +
+ + + diff --git a/zhican/admin/package.json b/zhican/admin/package.json new file mode 100644 index 0000000..46ca5cf --- /dev/null +++ b/zhican/admin/package.json @@ -0,0 +1,29 @@ +{ + "name": "zhican-admin", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "dev": "vite", + "build": "vue-tsc --noEmit && vite build", + "preview": "vite preview" + }, + "dependencies": { + "ant-design-vue": "^4.2.6", + "vue": "^3.5.13", + "vue-router": "^4.5.0", + "pinia": "^2.3.0", + "axios": "^1.7.9", + "dayjs": "^1.11.13", + "@ant-design/icons-vue": "^7.0.1" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "typescript": "^5.7.2", + "vite": "^6.0.5", + "vue-tsc": "^2.2.0", + "sass": "^1.83.0", + "unplugin-vue-components": "^0.27.5", + "unplugin-auto-import": "^0.18.6" + } +} diff --git a/zhican/admin/src/App.vue b/zhican/admin/src/App.vue new file mode 100644 index 0000000..2fe0ed2 --- /dev/null +++ b/zhican/admin/src/App.vue @@ -0,0 +1,9 @@ + + + diff --git a/zhican/admin/src/api/index.ts b/zhican/admin/src/api/index.ts new file mode 100644 index 0000000..69d8a93 --- /dev/null +++ b/zhican/admin/src/api/index.ts @@ -0,0 +1,39 @@ +import request from '@/utils/request' + +// 绿色种采 - 土地环境 +export const landEnvApi = { + list: (params?: any) => request.get('/green-planting/land-env', { params }), + detail: (id: string) => request.get(`/green-planting/land-env/${id}`), + create: (data: any) => request.post('/green-planting/land-env', data), + update: (id: string, data: any) => request.put(`/green-planting/land-env/${id}`, data), + remove: (id: string) => request.delete(`/green-planting/land-env/${id}`), +} + +// 卫生供应 - 卫生检测 +export const hygieneTestApi = { + list: (params?: any) => request.get('/hygiene-supply/hygiene-test', { params }), + detail: (id: string) => request.get(`/hygiene-supply/hygiene-test/${id}`), + create: (data: any) => request.post('/hygiene-supply/hygiene-test', data), +} + +// 健康生产 - 食安监控 +export const foodSafetyApi = { + list: (params?: any) => request.get('/health-production/food-safety', { params }), + detail: (id: string) => request.get(`/health-production/food-safety/${id}`), +} + +// 营养用餐 - 用户管理 +export const userMgmtApi = { + list: (params?: any) => request.get('/nutrition-dining/users', { params }), + detail: (id: string) => request.get(`/nutrition-dining/users/${id}`), + create: (data: any) => request.post('/nutrition-dining/users', data), + update: (id: string, data: any) => request.put(`/nutrition-dining/users/${id}`, data), + remove: (id: string) => request.delete(`/nutrition-dining/users/${id}`), +} + +// 登录 +export const authApi = { + login: (data: { username: string; password: string }) => request.post('/auth/login', data), + logout: () => request.post('/auth/logout'), + profile: () => request.get('/auth/profile'), +} diff --git a/zhican/admin/src/assets/styles/global.scss b/zhican/admin/src/assets/styles/global.scss new file mode 100644 index 0000000..e1d448a --- /dev/null +++ b/zhican/admin/src/assets/styles/global.scss @@ -0,0 +1,22 @@ +* { + margin: 0; + padding: 0; + box-sizing: border-box; +} + +html, body, #app { + height: 100%; + font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, 'Helvetica Neue', Arial, + 'Noto Sans', sans-serif, 'Apple Color Emoji', 'Segoe UI Emoji', 'Segoe UI Symbol', + 'Noto Color Emoji'; +} + +::-webkit-scrollbar { + width: 6px; + height: 6px; +} + +::-webkit-scrollbar-thumb { + background: #d9d9d9; + border-radius: 3px; +} diff --git a/zhican/admin/src/auto-imports.d.ts b/zhican/admin/src/auto-imports.d.ts new file mode 100644 index 0000000..f6e2bab --- /dev/null +++ b/zhican/admin/src/auto-imports.d.ts @@ -0,0 +1,88 @@ +/* eslint-disable */ +/* prettier-ignore */ +// @ts-nocheck +// noinspection JSUnusedGlobalSymbols +// Generated by unplugin-auto-import +// biome-ignore lint: disable +export {} +declare global { + const EffectScope: typeof import('vue')['EffectScope'] + const acceptHMRUpdate: typeof import('pinia')['acceptHMRUpdate'] + const computed: typeof import('vue')['computed'] + const createApp: typeof import('vue')['createApp'] + const createPinia: typeof import('pinia')['createPinia'] + const customRef: typeof import('vue')['customRef'] + const defineAsyncComponent: typeof import('vue')['defineAsyncComponent'] + const defineComponent: typeof import('vue')['defineComponent'] + const defineStore: typeof import('pinia')['defineStore'] + const effectScope: typeof import('vue')['effectScope'] + const getActivePinia: typeof import('pinia')['getActivePinia'] + const getCurrentInstance: typeof import('vue')['getCurrentInstance'] + const getCurrentScope: typeof import('vue')['getCurrentScope'] + const h: typeof import('vue')['h'] + const inject: typeof import('vue')['inject'] + const isProxy: typeof import('vue')['isProxy'] + const isReactive: typeof import('vue')['isReactive'] + const isReadonly: typeof import('vue')['isReadonly'] + const isRef: typeof import('vue')['isRef'] + const mapActions: typeof import('pinia')['mapActions'] + const mapGetters: typeof import('pinia')['mapGetters'] + const mapState: typeof import('pinia')['mapState'] + const mapStores: typeof import('pinia')['mapStores'] + const mapWritableState: typeof import('pinia')['mapWritableState'] + const markRaw: typeof import('vue')['markRaw'] + const nextTick: typeof import('vue')['nextTick'] + const onActivated: typeof import('vue')['onActivated'] + const onBeforeMount: typeof import('vue')['onBeforeMount'] + const onBeforeRouteLeave: typeof import('vue-router')['onBeforeRouteLeave'] + const onBeforeRouteUpdate: typeof import('vue-router')['onBeforeRouteUpdate'] + const onBeforeUnmount: typeof import('vue')['onBeforeUnmount'] + const onBeforeUpdate: typeof import('vue')['onBeforeUpdate'] + const onDeactivated: typeof import('vue')['onDeactivated'] + const onErrorCaptured: typeof import('vue')['onErrorCaptured'] + const onMounted: typeof import('vue')['onMounted'] + const onRenderTracked: typeof import('vue')['onRenderTracked'] + const onRenderTriggered: typeof import('vue')['onRenderTriggered'] + const onScopeDispose: typeof import('vue')['onScopeDispose'] + const onServerPrefetch: typeof import('vue')['onServerPrefetch'] + const onUnmounted: typeof import('vue')['onUnmounted'] + const onUpdated: typeof import('vue')['onUpdated'] + const onWatcherCleanup: typeof import('vue')['onWatcherCleanup'] + const provide: typeof import('vue')['provide'] + const reactive: typeof import('vue')['reactive'] + const readonly: typeof import('vue')['readonly'] + const ref: typeof import('vue')['ref'] + const resolveComponent: typeof import('vue')['resolveComponent'] + const setActivePinia: typeof import('pinia')['setActivePinia'] + const setMapStoreSuffix: typeof import('pinia')['setMapStoreSuffix'] + const shallowReactive: typeof import('vue')['shallowReactive'] + const shallowReadonly: typeof import('vue')['shallowReadonly'] + const shallowRef: typeof import('vue')['shallowRef'] + const storeToRefs: typeof import('pinia')['storeToRefs'] + const toRaw: typeof import('vue')['toRaw'] + const toRef: typeof import('vue')['toRef'] + const toRefs: typeof import('vue')['toRefs'] + const toValue: typeof import('vue')['toValue'] + const triggerRef: typeof import('vue')['triggerRef'] + const unref: typeof import('vue')['unref'] + const useAttrs: typeof import('vue')['useAttrs'] + const useCssModule: typeof import('vue')['useCssModule'] + const useCssVars: typeof import('vue')['useCssVars'] + const useId: typeof import('vue')['useId'] + const useLink: typeof import('vue-router')['useLink'] + const useModel: typeof import('vue')['useModel'] + const useRoute: typeof import('vue-router')['useRoute'] + const useRouter: typeof import('vue-router')['useRouter'] + const useSlots: typeof import('vue')['useSlots'] + const useTemplateRef: typeof import('vue')['useTemplateRef'] + const watch: typeof import('vue')['watch'] + const watchEffect: typeof import('vue')['watchEffect'] + const watchPostEffect: typeof import('vue')['watchPostEffect'] + const watchSyncEffect: typeof import('vue')['watchSyncEffect'] +} +// for type re-export +declare global { + // @ts-ignore + export type { Component, ComponentPublicInstance, ComputedRef, DirectiveBinding, ExtractDefaultPropTypes, ExtractPropTypes, ExtractPublicPropTypes, InjectionKey, PropType, Ref, MaybeRef, MaybeRefOrGetter, VNode, WritableComputedRef } from 'vue' + import('vue') +} diff --git a/zhican/admin/src/components.d.ts b/zhican/admin/src/components.d.ts new file mode 100644 index 0000000..0f15aa8 --- /dev/null +++ b/zhican/admin/src/components.d.ts @@ -0,0 +1,75 @@ +/* eslint-disable */ +// @ts-nocheck +// Generated by unplugin-vue-components +// Read more: https://github.com/vuejs/core/pull/3399 +export {} + +/* prettier-ignore */ +declare module 'vue' { + export interface GlobalComponents { + AAlert: typeof import('ant-design-vue/es')['Alert'] + AAvatar: typeof import('ant-design-vue/es')['Avatar'] + ABadge: typeof import('ant-design-vue/es')['Badge'] + AButton: typeof import('ant-design-vue/es')['Button'] + ACard: typeof import('ant-design-vue/es')['Card'] + ACheckbox: typeof import('ant-design-vue/es')['Checkbox'] + ACheckboxGroup: typeof import('ant-design-vue/es')['CheckboxGroup'] + ACol: typeof import('ant-design-vue/es')['Col'] + AConfigProvider: typeof import('ant-design-vue/es')['ConfigProvider'] + ADatePicker: typeof import('ant-design-vue/es')['DatePicker'] + ADescriptions: typeof import('ant-design-vue/es')['Descriptions'] + ADescriptionsItem: typeof import('ant-design-vue/es')['DescriptionsItem'] + ADivider: typeof import('ant-design-vue/es')['Divider'] + ADrawer: typeof import('ant-design-vue/es')['Drawer'] + ADropdown: typeof import('ant-design-vue/es')['Dropdown'] + AEmpty: typeof import('ant-design-vue/es')['Empty'] + AForm: typeof import('ant-design-vue/es')['Form'] + AFormItem: typeof import('ant-design-vue/es')['FormItem'] + AInput: typeof import('ant-design-vue/es')['Input'] + AInputGroup: typeof import('ant-design-vue/es')['InputGroup'] + AInputNumber: typeof import('ant-design-vue/es')['InputNumber'] + AInputPassword: typeof import('ant-design-vue/es')['InputPassword'] + AInputSearch: typeof import('ant-design-vue/es')['InputSearch'] + ALayout: typeof import('ant-design-vue/es')['Layout'] + ALayoutContent: typeof import('ant-design-vue/es')['LayoutContent'] + ALayoutHeader: typeof import('ant-design-vue/es')['LayoutHeader'] + ALayoutSider: typeof import('ant-design-vue/es')['LayoutSider'] + AList: typeof import('ant-design-vue/es')['List'] + AListItem: typeof import('ant-design-vue/es')['ListItem'] + AListItemMeta: typeof import('ant-design-vue/es')['ListItemMeta'] + AMenu: typeof import('ant-design-vue/es')['Menu'] + AMenuItem: typeof import('ant-design-vue/es')['MenuItem'] + AModal: typeof import('ant-design-vue/es')['Modal'] + APageHeader: typeof import('ant-design-vue/es')['PageHeader'] + APopconfirm: typeof import('ant-design-vue/es')['Popconfirm'] + AProgress: typeof import('ant-design-vue/es')['Progress'] + ARadio: typeof import('ant-design-vue/es')['Radio'] + ARadioButton: typeof import('ant-design-vue/es')['RadioButton'] + ARadioGroup: typeof import('ant-design-vue/es')['RadioGroup'] + ARangePicker: typeof import('ant-design-vue/es')['RangePicker'] + ARate: typeof import('ant-design-vue/es')['Rate'] + ARow: typeof import('ant-design-vue/es')['Row'] + ASelect: typeof import('ant-design-vue/es')['Select'] + ASelectOption: typeof import('ant-design-vue/es')['SelectOption'] + ASlider: typeof import('ant-design-vue/es')['Slider'] + ASpace: typeof import('ant-design-vue/es')['Space'] + AStatistic: typeof import('ant-design-vue/es')['Statistic'] + AStep: typeof import('ant-design-vue/es')['Step'] + ASteps: typeof import('ant-design-vue/es')['Steps'] + ASubMenu: typeof import('ant-design-vue/es')['SubMenu'] + ASwitch: typeof import('ant-design-vue/es')['Switch'] + ATable: typeof import('ant-design-vue/es')['Table'] + ATabPane: typeof import('ant-design-vue/es')['TabPane'] + ATabs: typeof import('ant-design-vue/es')['Tabs'] + ATag: typeof import('ant-design-vue/es')['Tag'] + ATextarea: typeof import('ant-design-vue/es')['Textarea'] + ATooltip: typeof import('ant-design-vue/es')['Tooltip'] + ATree: typeof import('ant-design-vue/es')['Tree'] + ChartPanel: typeof import('./components/common/ChartPanel.vue')['default'] + RelatedModules: typeof import('./components/common/RelatedModules.vue')['default'] + RouterLink: typeof import('vue-router')['RouterLink'] + RouterView: typeof import('vue-router')['RouterView'] + StatCard: typeof import('./components/common/StatCard.vue')['default'] + StatusDot: typeof import('./components/common/StatusDot.vue')['default'] + } +} diff --git a/zhican/admin/src/components/common/ChartPanel.vue b/zhican/admin/src/components/common/ChartPanel.vue new file mode 100644 index 0000000..13a5838 --- /dev/null +++ b/zhican/admin/src/components/common/ChartPanel.vue @@ -0,0 +1,233 @@ + + + + + diff --git a/zhican/admin/src/components/common/RelatedModules.vue b/zhican/admin/src/components/common/RelatedModules.vue new file mode 100644 index 0000000..45ceddc --- /dev/null +++ b/zhican/admin/src/components/common/RelatedModules.vue @@ -0,0 +1,47 @@ + + + + + diff --git a/zhican/admin/src/components/common/StatCard.vue b/zhican/admin/src/components/common/StatCard.vue new file mode 100644 index 0000000..a953d59 --- /dev/null +++ b/zhican/admin/src/components/common/StatCard.vue @@ -0,0 +1,36 @@ + + + + + diff --git a/zhican/admin/src/components/common/StatusDot.vue b/zhican/admin/src/components/common/StatusDot.vue new file mode 100644 index 0000000..77cdb3e --- /dev/null +++ b/zhican/admin/src/components/common/StatusDot.vue @@ -0,0 +1,29 @@ + + + + + diff --git a/zhican/admin/src/env.d.ts b/zhican/admin/src/env.d.ts new file mode 100644 index 0000000..323c78a --- /dev/null +++ b/zhican/admin/src/env.d.ts @@ -0,0 +1,7 @@ +/// + +declare module '*.vue' { + import type { DefineComponent } from 'vue' + const component: DefineComponent<{}, {}, any> + export default component +} diff --git a/zhican/admin/src/layouts/MainLayout.vue b/zhican/admin/src/layouts/MainLayout.vue new file mode 100644 index 0000000..6df319b --- /dev/null +++ b/zhican/admin/src/layouts/MainLayout.vue @@ -0,0 +1,210 @@ + + + + + diff --git a/zhican/admin/src/main.ts b/zhican/admin/src/main.ts new file mode 100644 index 0000000..fec844f --- /dev/null +++ b/zhican/admin/src/main.ts @@ -0,0 +1,11 @@ +import { createApp } from 'vue' +import { createPinia } from 'pinia' +import router from './router' +import App from './App.vue' +import './assets/styles/global.scss' + +const app = createApp(App) + +app.use(createPinia()) +app.use(router) +app.mount('#app') diff --git a/zhican/admin/src/mock/data.ts b/zhican/admin/src/mock/data.ts new file mode 100644 index 0000000..261db71 --- /dev/null +++ b/zhican/admin/src/mock/data.ts @@ -0,0 +1,616 @@ +import { ref } from 'vue' + +// ==================== 通用工具 ==================== +export const randomId = () => Math.random().toString(36).slice(2, 10) +export const randomNum = (min: number, max: number) => Math.floor(Math.random() * (max - min + 1)) + min +export const randomFloat = (min: number, max: number, dec = 1) => +(Math.random() * (max - min) + min).toFixed(dec) +export const randomDate = (days = 30) => { + const d = new Date() + d.setDate(d.getDate() - randomNum(0, days)) + return d.toISOString().slice(0, 10) +} +export const randomTime = () => `${String(randomNum(0, 23)).padStart(2, '0')}:${String(randomNum(0, 59)).padStart(2, '0')}` +export const pick = (arr: T[]): T => arr[randomNum(0, arr.length - 1)] +export const pickMulti = (arr: T[], n: number): T[] => arr.sort(() => 0.5 - Math.random()).slice(0, n) + +// 状态标签 +export const statusMap: Record = { + normal: { color: 'green', text: '正常' }, + warning: { color: 'orange', text: '预警' }, + error: { color: 'red', text: '异常' }, + pending: { color: 'blue', text: '待处理' }, + processing: { color: 'cyan', text: '进行中' }, + done: { color: 'green', text: '已完成' }, + passed: { color: 'green', text: '合格' }, + failed: { color: 'red', text: '不合格' }, + reviewing: { color: 'orange', text: '审核中' }, + approved: { color: 'green', text: '已审核' }, + rejected: { color: 'red', text: '已驳回' }, + stored: { color: 'green', text: '已入库' }, + delivered: { color: 'blue', text: '已配送' }, + cooking: { color: 'orange', text: '烹制中' }, + served: { color: 'green', text: '已上餐' }, +} + +// ==================== 绿色种采 ==================== +const landNames = ['A区稻田', 'B区菜地', 'C区果园', 'D区养殖场', 'E区温室大棚', 'F区有机农场'] +const cropTypes = ['水稻', '小麦', '玉米', '番茄', '黄瓜', '青椒', '白菜', '萝卜', '苹果', '草莓'] +const soilTypes = ['黏土', '壤土', '沙壤土', '砂土'] +const supplierNames = ['绿源农业', '丰禾食品', '天然牧场', '鲜美水产', '有机之家', '大地农庄', '春风蔬果', '碧水渔业'] +const materialNames = ['有机大米', '土鸡蛋', '新鲜猪肉', '活鱼', '时令蔬菜', '有机牛奶', '散养鸡', '绿色面粉', '菜籽油', '食用盐'] + +export function genLandEnvData(n = 12) { + return Array.from({ length: n }, (_, i) => ({ + id: randomId(), + name: pick(landNames), + area: randomFloat(5, 200, 0) + '亩', + soilType: pick(soilTypes), + soilPH: randomFloat(5.5, 8.0), + humidity: randomFloat(30, 85, 0) + '%', + temperature: randomFloat(8, 35) + '°C', + organicMatter: randomFloat(1.5, 4.5) + '%', + status: pick(['normal', 'warning', 'error']), + lastCheck: randomDate(7), + crop: pick(cropTypes), + })) +} + +export function genPlantingMonitorData(n = 10) { + const stages = ['播种期', '发芽期', '生长期', '开花期', '结果期', '成熟期', '收获期'] + return Array.from({ length: n }, () => ({ + id: randomId(), + crop: pick(cropTypes), + land: pick(landNames), + stage: pick(stages), + plantDate: randomDate(90), + expectedHarvest: randomDate(-30), + growthRate: randomFloat(70, 100, 0) + '%', + healthScore: randomNum(60, 100), + pestAlert: pick([true, false, false, false]), + waterStatus: pick(['normal', 'warning']), + lastUpdate: randomDate(1) + ' ' + randomTime(), + images: [`/mock/crop${randomNum(1, 5)}.jpg`], + })) +} + +export function genHarvestData(n = 15) { + return Array.from({ length: n }, () => ({ + id: randomId(), + batchNo: 'HV' + randomDate(30).replace(/-/g, '') + randomNum(100, 999), + crop: pick(cropTypes), + land: pick(landNames), + harvestDate: randomDate(30), + quantity: randomFloat(100, 5000, 0) + 'kg', + quality: pick(['A', 'B', 'C']), + status: pick(['stored', 'pending', 'processing']), + inspector: pick(['张三', '李四', '王五']), + warehouse: pick(['1号仓', '2号仓', '3号冷库']), + remark: '', + })) +} + +export function genSupplierData(n = 8) { + return Array.from({ length: n }, (_, i) => ({ + id: randomId(), + name: supplierNames[i % supplierNames.length], + category: pick(['蔬菜', '肉类', '水产', '粮油', '蛋奶', '水果']), + contact: '1' + randomNum(30, 99) + String(randomNum(10000000, 99999999)), + address: pick(['上海市浦东新区', '江苏省南京市', '浙江省杭州市', '安徽省合肥市']) + '某路' + randomNum(1, 200) + '号', + qualification: pick(['approved', 'reviewing', 'rejected']), + rating: randomFloat(3.0, 5.0), + cooperationYears: randomNum(1, 10), + totalOrders: randomNum(50, 500), + lastDelivery: randomDate(10), + })) +} + +export function genProcurementData(n = 12) { + return Array.from({ length: n }, () => ({ + id: randomId(), + orderNo: 'PO' + randomDate(30).replace(/-/g, '') + randomNum(100, 999), + material: pick(materialNames), + supplier: pick(supplierNames), + quantity: randomFloat(50, 2000, 0) + 'kg', + unitPrice: '¥' + randomFloat(2, 80), + totalPrice: '¥' + randomFloat(500, 50000, 0), + orderDate: randomDate(30), + deliveryDate: randomDate(10), + status: pick(['pending', 'processing', 'done', 'approved']), + purchaser: pick(['采购员A', '采购员B', '采购员C']), + })) +} + +// ==================== 卫生供应 ==================== +const testItems = ['农药残留', '重金属', '微生物', '添加剂', '兽药残留'] +const vegetableNames = ['白菜', '萝卜', '番茄', '黄瓜', '茄子', '青椒', '芹菜', '菠菜', '土豆', '胡萝卜', '豆角', '西兰花'] +const meatNames = ['猪里脊', '鸡胸肉', '牛腱子', '羊腿肉', '鱼片', '虾仁'] + +export function genHygieneTestData(n = 15) { + return Array.from({ length: n }, () => ({ + id: randomId(), + batchNo: 'HT' + randomDate(14).replace(/-/g, '') + randomNum(100, 999), + material: pick([...vegetableNames, ...meatNames]), + testItem: pick(testItems), + testDate: randomDate(14), + result: pick(['passed', 'passed', 'passed', 'failed']), + value: randomFloat(0, 5) + 'mg/kg', + standard: '≤5mg/kg', + inspector: pick(['检测员A', '检测员B', '检测员C']), + report: `RPT${randomNum(10000, 99999)}`, + })) +} + +export function genRawStorageData(n = 14) { + return Array.from({ length: n }, () => ({ + id: randomId(), + batchNo: 'RS' + randomDate(14).replace(/-/g, '') + randomNum(100, 999), + material: pick([...vegetableNames, ...meatNames]), + supplier: pick(supplierNames), + quantity: randomFloat(20, 500, 0) + 'kg', + receiveDate: randomDate(14), + warehouse: pick(['毛菜仓A', '毛菜仓B', '冷库C']), + temperature: randomFloat(2, 8) + '°C', + status: pick(['stored', 'processing', 'pending']), + shelfLife: randomNum(1, 7) + '天', + receiver: pick(['仓管员A', '仓管员B']), + })) +} + +export function genCleanProcessData(n = 12) { + return Array.from({ length: n }, () => { + const raw = randomFloat(50, 300, 0) + const net = +(raw * randomFloat(0.6, 0.9)).toFixed(0) + return { + id: randomId(), + batchNo: 'CP' + randomDate(14).replace(/-/g, '') + randomNum(100, 999), + material: pick(vegetableNames), + rawWeight: raw + 'kg', + netWeight: net + 'kg', + lossRate: ((1 - net / raw) * 100).toFixed(1) + '%', + processLine: pick(['加工线1', '加工线2', '加工线3']), + startTime: randomDate(7) + ' ' + randomTime(), + endTime: randomDate(5) + ' ' + randomTime(), + operator: pick(['操作员A', '操作员B', '操作员C']), + status: pick(['processing', 'done']), + } + }) +} + +export function genCleanStorageData(n = 14) { + return Array.from({ length: n }, () => ({ + id: randomId(), + batchNo: 'CS' + randomDate(14).replace(/-/g, '') + randomNum(100, 999), + material: pick(vegetableNames), + quantity: randomFloat(10, 200, 0) + 'kg', + storeDate: randomDate(7), + warehouse: pick(['净菜仓A', '净菜仓B', '净菜冷库']), + temperature: randomFloat(0, 5) + '°C', + shelfLife: randomNum(1, 5) + '天', + status: pick(['stored', 'delivered', 'pending']), + remark: '', + })) +} + +export function genCleanInternalData(n = 10) { + return Array.from({ length: n }, () => ({ + id: randomId(), + orderNo: 'CI' + randomDate(7).replace(/-/g, '') + randomNum(100, 999), + material: pick(vegetableNames), + quantity: randomFloat(5, 100, 0) + 'kg', + requestDept: pick(['中餐厨房', '西餐厨房', '面点间', '凉菜间']), + requestDate: randomDate(7), + deliveryDate: randomDate(3), + status: pick(['pending', 'processing', 'delivered', 'done']), + handler: pick(['配送员A', '配送员B']), + })) +} + +export function genCleanExternalData(n = 10) { + return Array.from({ length: n }, () => ({ + id: randomId(), + orderNo: 'CE' + randomDate(14).replace(/-/g, '') + randomNum(100, 999), + customer: pick(['阳光餐厅', '幸福食堂', '社区超市', '学校食堂', '企业餐厅']), + items: pickMulti(vegetableNames, randomNum(2, 5)).join('、'), + totalWeight: randomFloat(20, 300, 0) + 'kg', + totalPrice: '¥' + randomFloat(200, 8000, 0), + orderDate: randomDate(14), + deliveryDate: randomDate(5), + status: pick(['pending', 'processing', 'delivered', 'done']), + address: '某市某区某路' + randomNum(1, 200) + '号', + })) +} + +// ==================== 食堂管理 ==================== +export const canteenNames = ['1号食堂', '2号食堂', '3号食堂'] + +export const canteenList = [ + { id: 'c1', name: '1号食堂', alias: '总部员工食堂', address: 'A栋1层', manager: '郑涛', phone: '010-1234-6001', capacity: 800, kitchenAreas: ['中餐A区', '中餐B区', '凉菜区'], mealLines: ['1号中餐线', '2号中餐线', '小吃窗口'], status: '营业中', createDate: '2020-05-01' }, + { id: 'c2', name: '2号食堂', alias: '研发楼食堂', address: 'B栋1层', manager: '何静', phone: '010-1234-6002', capacity: 500, kitchenAreas: ['西餐区', '面点区'], mealLines: ['3号西餐线', '面点窗口'], status: '营业中', createDate: '2021-03-01' }, + { id: 'c3', name: '3号食堂', alias: 'VIP接待餐厅', address: 'C栋2层', manager: '冯燕', phone: '010-1234-6003', capacity: 200, kitchenAreas: ['中餐A区'], mealLines: ['VIP餐线'], status: '营业中', createDate: '2022-01-15' }, +] + +export const kitchenToCanteen: Record = { + '中餐A区': '1号食堂', '中餐B区': '1号食堂', '凉菜区': '1号食堂', + '西餐区': '2号食堂', '面点区': '2号食堂', +} + +export const mealLineToCanteen: Record = { + '1号中餐线': '1号食堂', '2号中餐线': '1号食堂', '小吃窗口': '1号食堂', + '3号西餐线': '2号食堂', '面点窗口': '2号食堂', + 'VIP餐线': '3号食堂', + '1号餐线': '1号食堂', '2号餐线': '1号食堂', '3号餐线': '2号食堂', +} + +// ==================== 健康生产 ==================== +const dishNames = ['红烧肉', '清炒时蔬', '番茄鸡蛋', '糖醋里脊', '宫保鸡丁', '鱼香肉丝', '麻婆豆腐', '蒜蓉西兰花', '酸辣汤', '蛋炒饭', '紫菜蛋花汤', '水煮鱼', '回锅肉', '红烧茄子', '醋溜白菜', '干煸豆角', '凉拌黄瓜', '蒸鲈鱼', '炖牛腩', '小炒肉'] +const mealTypes = ['早餐', '午餐', '晚餐'] +const kitchenAreas = ['中餐A区', '中餐B区', '西餐区', '面点区', '凉菜区'] + +export function genFoodSafetyData(n = 10) { + return Array.from({ length: n }, () => { + const area = pick(kitchenAreas) + return { + id: randomId(), + area, + canteen: kitchenToCanteen[area] || pick(canteenNames), + type: pick(['环境卫生', '食材安全', '操作规范', '设备清洁', '人员健康']), + checkTime: randomDate(7) + ' ' + randomTime(), + result: pick(['passed', 'passed', 'passed', 'warning', 'failed']), + score: randomNum(70, 100), + inspector: pick(['督导员A', '督导员B', '督导员C']), + issues: pick(['无', '无', '台面未及时清理', '手套佩戴不规范', '温度偏高']), + camera: 'CAM-' + randomNum(1, 20).toString().padStart(2, '0'), + images: [], + } + }) +} + +export function genRecipePlanData() { + const days = ['周一', '周二', '周三', '周四', '周五', '周六', '周日'] + return days.map(day => ({ + day, + meals: mealTypes.map(meal => ({ + meal, + dishes: pickMulti(dishNames, meal === '早餐' ? 4 : 6).map(name => ({ + id: randomId(), + name, + calories: randomNum(100, 600) + 'kcal', + tags: pickMulti(['高蛋白', '低脂', '高纤维', '低糖', '补钙', '富铁'], randomNum(1, 3)), + })), + })), + })) +} + +export function genCleanOrderData(n = 12) { + return Array.from({ length: n }, () => { + const kitchen = pick(kitchenAreas) + return { + id: randomId(), + orderNo: 'CO' + randomDate(7).replace(/-/g, '') + randomNum(100, 999), + items: pickMulti(vegetableNames, randomNum(2, 5)).map(v => ({ name: v, qty: randomFloat(5, 50, 0) + 'kg' })), + kitchen, + canteen: kitchenToCanteen[kitchen] || pick(canteenNames), + mealType: pick(mealTypes), + orderDate: randomDate(7), + requiredDate: randomDate(3), + status: pick(['pending', 'processing', 'delivered', 'done']), + } + }) +} + +export function genCookByOrderData(n = 10) { + return Array.from({ length: n }, () => { + const kitchen = pick(kitchenAreas) + return { + id: randomId(), + orderNo: 'CK' + randomDate(3).replace(/-/g, '') + randomNum(100, 999), + dish: pick(dishNames), + quantity: randomNum(10, 200) + '份', + kitchen, + canteen: kitchenToCanteen[kitchen] || pick(canteenNames), + chef: pick(['主厨A', '主厨B', '厨师C', '厨师D']), + startTime: randomDate(1) + ' ' + randomTime(), + status: pick(['pending', 'cooking', 'done', 'served']), + mealType: pick(mealTypes), + temperature: randomFloat(60, 95) + '°C', + } + }) +} + +export function genServingMonitorData(n = 8) { + return Array.from({ length: n }, () => { + const mealLine = pick(['1号餐线', '2号餐线', '3号餐线', 'VIP餐线']) + return { + id: randomId(), + mealLine, + canteen: mealLineToCanteen[mealLine] || pick(canteenNames), + mealType: pick(mealTypes), + dishes: pickMulti(dishNames, randomNum(4, 8)), + servingStart: randomDate(1) + ' 11:00', + servingEnd: randomDate(1) + ' 13:00', + totalServed: randomNum(100, 800), + temperature: randomFloat(55, 75) + '°C', + status: pick(['pending', 'processing', 'done']), + monitor: pick(['值班员A', '值班员B']), + } + }) +} + +export function genSurplusData(n = 8) { + return Array.from({ length: n }, () => ({ + id: randomId(), + date: randomDate(7), + mealType: pick(mealTypes), + dish: pick(dishNames), + surplusQty: randomFloat(1, 30, 0) + 'kg', + disposal: pick(['员工餐', '捐赠', '堆肥', '废弃']), + handler: pick(['处置员A', '处置员B']), + remark: '', + })) +} + +export function genProductionStatsData() { + return { + today: { + totalDishes: randomNum(30, 60), + totalServings: randomNum(800, 2000), + materialsUsed: randomFloat(200, 800, 0) + 'kg', + wasteRate: randomFloat(2, 8) + '%', + }, + weeklyTrend: Array.from({ length: 7 }, (_, i) => ({ + day: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'][i], + servings: randomNum(600, 2000), + materials: randomNum(200, 800), + waste: randomNum(10, 60), + })), + topDishes: pickMulti(dishNames, 10).map(name => ({ + name, + servings: randomNum(50, 300), + satisfaction: randomFloat(3.5, 5.0), + })), + } +} + +// ==================== 营养用餐 ==================== +const nutrientNames = ['蛋白质', '脂肪', '碳水化合物', '膳食纤维', '维生素A', '维生素C', '钙', '铁', '锌'] + +export function genNutritionTestData(n = 12) { + return Array.from({ length: n }, () => ({ + id: randomId(), + dish: pick(dishNames), + testDate: randomDate(14), + calories: randomNum(100, 800) + 'kcal', + protein: randomFloat(2, 40) + 'g', + fat: randomFloat(1, 30) + 'g', + carbs: randomFloat(5, 80) + 'g', + fiber: randomFloat(0.5, 10) + 'g', + sodium: randomNum(100, 1500) + 'mg', + result: pick(['passed', 'passed', 'passed', 'warning']), + tester: pick(['营养师A', '营养师B']), + })) +} + +export function genFoodCompositionData(n = 20) { + return [...vegetableNames, ...meatNames].slice(0, n).map(name => ({ + id: randomId(), + name, + category: vegetableNames.includes(name) ? '蔬菜' : '肉类', + calories: randomNum(15, 250) + 'kcal/100g', + protein: randomFloat(0.5, 25) + 'g', + fat: randomFloat(0.1, 15) + 'g', + carbs: randomFloat(1, 30) + 'g', + fiber: randomFloat(0.3, 5) + 'g', + vitaminC: randomFloat(0, 80) + 'mg', + calcium: randomNum(5, 200) + 'mg', + iron: randomFloat(0.2, 8) + 'mg', + })) +} + +export function genDishInventoryData(n = 20) { + return dishNames.slice(0, n).map(name => ({ + id: randomId(), + name, + category: pick(['热菜', '凉菜', '汤品', '主食', '面点']), + calories: randomNum(100, 700) + 'kcal', + price: '¥' + randomFloat(8, 38, 0), + rating: randomFloat(3.5, 5.0), + orderCount: randomNum(50, 2000), + available: pick([true, true, true, false]), + image: `/mock/dish${randomNum(1, 10)}.jpg`, + tags: pickMulti(['高蛋白', '低脂', '高纤维', '低糖', '招牌', '新品', '热销'], randomNum(1, 3)), + })) +} + +export function genRecipeMgmtData(n = 8) { + return Array.from({ length: n }, () => ({ + id: randomId(), + name: `第${randomNum(1, 52)}周食谱`, + startDate: randomDate(30), + endDate: randomDate(10), + mealCount: randomNum(15, 21), + dishCount: randomNum(60, 120), + status: pick(['pending', 'approved', 'processing']), + creator: pick(['营养师A', '营养师B']), + avgCalories: randomNum(1800, 2500) + 'kcal/天', + })) +} + +export function genUserMgmtData(n = 15) { + const lastNames = ['张', '李', '王', '刘', '陈', '杨', '黄', '赵', '周', '吴'] + const firstNames = ['伟', '芳', '娜', '敏', '强', '磊', '洋', '艳', '勇', '军'] + return Array.from({ length: n }, () => ({ + id: randomId(), + name: pick(lastNames) + pick(firstNames) + pick(firstNames), + phone: '1' + randomNum(30, 99) + String(randomNum(10000000, 99999999)), + department: pick(['研发部', '市场部', '财务部', '人事部', '行政部', '销售部']), + mealCard: 'MC' + String(randomNum(100000, 999999)), + balance: '¥' + randomFloat(0, 2000, 2), + isMember: pick([true, true, false]), + totalOrders: randomNum(10, 500), + lastOrder: randomDate(7), + status: pick(['normal', 'normal', 'normal', 'warning']), + allergens: pickMulti(['花生', '牛奶', '鸡蛋', '海鲜', '大豆', '无'], 1), + })) +} + +export function genConsumptionData(n = 20) { + return Array.from({ length: n }, () => ({ + id: randomId(), + orderNo: 'OD' + randomDate(14).replace(/-/g, '') + randomNum(1000, 9999), + user: pick(['张伟', '李芳', '王娜', '刘敏', '陈强']), + mealType: pick(mealTypes), + dishes: pickMulti(dishNames, randomNum(1, 4)).join('、'), + totalPrice: '¥' + randomFloat(8, 60, 1), + payMethod: pick(['餐卡', '微信', '支付宝']), + date: randomDate(14), + time: randomTime(), + mealLine: pick(['1号餐线', '2号餐线', '3号餐线']), + })) +} + +export function genNutritionOrderData(n = 12) { + return Array.from({ length: n }, () => ({ + id: randomId(), + orderNo: 'NO' + randomDate(7).replace(/-/g, '') + randomNum(100, 999), + user: pick(['张伟', '李芳', '王娜', '刘敏', '陈强']), + mealType: pick(mealTypes), + targetCalories: randomNum(400, 800) + 'kcal', + dishes: pickMulti(dishNames, randomNum(2, 4)).map(d => ({ name: d, calories: randomNum(80, 400) + 'kcal' })), + totalCalories: randomNum(400, 800) + 'kcal', + nutritionScore: randomNum(70, 100), + date: randomDate(7), + status: pick(['pending', 'done', 'served']), + })) +} + +export function genMealLineData() { + return ['1号中餐线', '2号中餐线', '3号西餐线', 'VIP餐线', '面点窗口', '小吃窗口'].map(name => ({ + id: randomId(), + name, + canteen: mealLineToCanteen[name] || pick(canteenNames), + status: pick(['normal', 'normal', 'warning']), + todayDishes: randomNum(8, 20), + todayServed: randomNum(50, 500), + capacity: randomNum(200, 800) + '人/餐', + manager: pick(['负责人A', '负责人B', '负责人C']), + equipment: randomNum(3, 10) + '台', + rating: randomFloat(3.5, 5.0), + })) +} + +// ==================== Dashboard ==================== +export function genDashboardData() { + return { + // 核心 KPI + overview: { + todayOrders: randomNum(800, 2000), + todayRevenue: randomFloat(8000, 30000, 0), + activeUsers: randomNum(300, 1000), + satisfactionRate: randomFloat(88, 99), + wasteRate: randomFloat(2, 8), + nutritionScore: randomNum(75, 95), + orderGrowth: randomFloat(-5, 18), + revenueGrowth: randomFloat(-3, 15), + }, + // 各食堂运营数据 + canteenStats: canteenList.map(c => ({ + name: c.name, + alias: c.alias, + todayOrders: randomNum(150, 700), + todayRevenue: randomFloat(2000, 12000, 0), + todayServed: randomNum(100, 600), + capacity: c.capacity, + usageRate: randomFloat(40, 95), + satisfactionRate: randomFloat(85, 99), + wasteRate: randomFloat(1, 10), + topDish: pick(dishNames), + status: c.status, + mealLines: c.mealLines.length, + alerts: randomNum(0, 3), + })), + // 本周订单趋势 + weeklyOrders: Array.from({ length: 7 }, (_, i) => ({ + day: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'][i], + orders: randomNum(600, 2000), + revenue: randomNum(6000, 25000), + })), + // 餐次分布 + mealDistribution: [ + { type: '早餐', value: randomNum(200, 500) }, + { type: '午餐', value: randomNum(500, 1200) }, + { type: '晚餐', value: randomNum(300, 800) }, + ], + // 热门菜品 + topDishes: pickMulti(dishNames, 8).map(name => ({ + name, + orders: randomNum(50, 300), + rating: randomFloat(3.5, 5.0), + })), + // 供应链状态 + supplyChain: { + farmActive: randomNum(3, 6), + farmTotal: 6, + testPassRate: randomFloat(95, 100), + todayTests: randomNum(10, 30), + cleanProcessed: randomFloat(200, 600, 0), + cleanProcessUnit: 'kg', + stockDays: randomFloat(1.5, 5), + }, + // 营养概览 + nutritionOverview: { + avgCalories: randomNum(1800, 2200), + caloriesTarget: 2000, + avgProtein: randomNum(55, 85), + proteinTarget: 70, + avgFat: randomNum(45, 75), + fatTarget: 60, + avgCarbs: randomNum(250, 340), + carbsTarget: 300, + structureOk: pick([true, true, false]), + alertCount: randomNum(2, 12), + complianceRate: randomFloat(65, 92), + }, + // 营养趋势(7日) + nutritionTrend: Array.from({ length: 7 }, (_, i) => ({ + day: ['周一', '周二', '周三', '周四', '周五', '周六', '周日'][i], + calories: randomNum(1700, 2300), + target: 2000, + })), + // 系统告警 + alerts: Array.from({ length: 8 }, () => ({ + id: randomId(), + type: pick(['warning', 'error', 'normal']), + module: pick(['绿色种采', '卫生供应', '健康生产', '营养用餐', '系统管理']), + message: pick([ + '3号冷库温度偏高(8.5°C)', + '猪肉库存不足,预计明日缺货', + '2号加工线设备维护提醒', + 'A区菜地土壤湿度偏低', + '新批次蔬菜农残检测合格', + '本周食谱已审核通过', + '供应商"绿源农业"资质即将到期', + '2号食堂午餐蛋白质摄入偏低', + '张伟连续3日热量超标', + '研发部群体维C摄入不足', + '净菜库存低于安全线', + '1号食堂满意度低于目标值', + ]), + time: randomDate(3) + ' ' + randomTime(), + })), + // 食材用量 + materialUsage: vegetableNames.slice(0, 8).map(name => ({ + name, + used: randomNum(20, 200), + total: randomNum(200, 500), + })), + // 业务流水线实时状态 + pipeline: { + pendingHarvest: randomNum(0, 5), + pendingTest: randomNum(0, 8), + processing: randomNum(2, 10), + cooking: randomNum(5, 20), + serving: randomNum(3, 12), + delivered: randomNum(50, 200), + }, + } +} diff --git a/zhican/admin/src/router/index.ts b/zhican/admin/src/router/index.ts new file mode 100644 index 0000000..b66ea7f --- /dev/null +++ b/zhican/admin/src/router/index.ts @@ -0,0 +1,88 @@ +import { createRouter, createWebHistory } from 'vue-router' +import type { RouteRecordRaw } from 'vue-router' + +const modules: RouteRecordRaw[] = [ + // ========== 数据概览 ========== + { path: 'dashboard', name: 'dashboard', meta: { title: '数据概览', menuKey: 'dashboard' }, component: () => import('@/views/dashboard/index.vue') }, + { path: 'business-flow', name: 'business-flow', meta: { title: '业务流程', menuKey: 'business-flow' }, component: () => import('@/views/business-flow/index.vue') }, + + // ========== 绿色种采 ========== + { path: 'land-env', name: 'land-env', meta: { title: '土地环境', menuKey: 'land-env' }, component: () => import('@/views/green-planting/land-env/index.vue') }, + { path: 'planting-monitor', name: 'planting-monitor', meta: { title: '种养监控', menuKey: 'planting-monitor' }, component: () => import('@/views/green-planting/planting-monitor/index.vue') }, + { path: 'harvest-storage', name: 'harvest-storage', meta: { title: '收成入库', menuKey: 'harvest-storage' }, component: () => import('@/views/green-planting/harvest-storage/index.vue') }, + { path: 'supplier-mgmt', name: 'supplier-mgmt', meta: { title: '供商管理', menuKey: 'supplier-mgmt' }, component: () => import('@/views/green-planting/supplier-mgmt/index.vue') }, + { path: 'procurement-mgmt', name: 'procurement-mgmt', meta: { title: '采供管理', menuKey: 'procurement-mgmt' }, component: () => import('@/views/green-planting/procurement-mgmt/index.vue') }, + + // ========== 卫生供应 ========== + { path: 'hygiene-test', name: 'hygiene-test', meta: { title: '卫生检测', menuKey: 'hygiene-test' }, component: () => import('@/views/hygiene-supply/hygiene-test/index.vue') }, + { path: 'raw-storage', name: 'raw-storage', meta: { title: '毛菜入库', menuKey: 'raw-storage' }, component: () => import('@/views/hygiene-supply/raw-storage/index.vue') }, + { path: 'clean-process', name: 'clean-process', meta: { title: '净菜加工', menuKey: 'clean-process' }, component: () => import('@/views/hygiene-supply/clean-process/index.vue') }, + { path: 'clean-storage', name: 'clean-storage', meta: { title: '净菜入库', menuKey: 'clean-storage' }, component: () => import('@/views/hygiene-supply/clean-storage/index.vue') }, + { path: 'clean-internal', name: 'clean-internal', meta: { title: '净菜内供', menuKey: 'clean-internal' }, component: () => import('@/views/hygiene-supply/clean-internal/index.vue') }, + { path: 'clean-external', name: 'clean-external', meta: { title: '净菜外售', menuKey: 'clean-external' }, component: () => import('@/views/hygiene-supply/clean-external/index.vue') }, + + // ========== 健康生产 ========== + { path: 'food-safety', name: 'food-safety', meta: { title: '食安监控', menuKey: 'food-safety' }, component: () => import('@/views/health-production/food-safety/index.vue') }, + { path: 'recipe-plan', name: 'recipe-plan', meta: { title: '食谱规划', menuKey: 'recipe-plan' }, component: () => import('@/views/health-production/recipe-plan/index.vue') }, + { path: 'clean-order', name: 'clean-order', meta: { title: '净菜订单', menuKey: 'clean-order' }, component: () => import('@/views/health-production/clean-order/index.vue') }, + { path: 'clean-cabinet', name: 'clean-cabinet', meta: { title: '净菜进柜', menuKey: 'clean-cabinet' }, component: () => import('@/views/health-production/clean-cabinet/index.vue') }, + { path: 'clean-assemble', name: 'clean-assemble', meta: { title: '净菜组配', menuKey: 'clean-assemble' }, component: () => import('@/views/health-production/clean-assemble/index.vue') }, + { path: 'cook-by-order', name: 'cook-by-order', meta: { title: '按单烹制', menuKey: 'cook-by-order' }, component: () => import('@/views/health-production/cook-by-order/index.vue') }, + { path: 'serving-monitor', name: 'serving-monitor', meta: { title: '上餐监控', menuKey: 'serving-monitor' }, component: () => import('@/views/health-production/serving-monitor/index.vue') }, + { path: 'surplus-disposal', name: 'surplus-disposal', meta: { title: '余量处置', menuKey: 'surplus-disposal' }, component: () => import('@/views/health-production/surplus-disposal/index.vue') }, + { path: 'production-stats', name: 'production-stats', meta: { title: '生产统计', menuKey: 'production-stats' }, component: () => import('@/views/health-production/production-stats/index.vue') }, + + // ========== 营养用餐 ========== + { path: 'nutrition-test', name: 'nutrition-test', meta: { title: '营养检验', menuKey: 'nutrition-test' }, component: () => import('@/views/nutrition-dining/nutrition-test/index.vue') }, + { path: 'food-composition', name: 'food-composition', meta: { title: '食物成分', menuKey: 'food-composition' }, component: () => import('@/views/nutrition-dining/food-composition/index.vue') }, + { path: 'dish-inventory', name: 'dish-inventory', meta: { title: '餐品总库', menuKey: 'dish-inventory' }, component: () => import('@/views/nutrition-dining/dish-inventory/index.vue') }, + { path: 'algorithm-standard', name: 'algorithm-standard', meta: { title: '算法标准', menuKey: 'algorithm-standard' }, component: () => import('@/views/nutrition-dining/algorithm-standard/index.vue') }, + { path: 'recipe-mgmt', name: 'recipe-mgmt', meta: { title: '食谱管理', menuKey: 'recipe-mgmt' }, component: () => import('@/views/nutrition-dining/recipe-mgmt/index.vue') }, + { path: 'nutrition-order', name: 'nutrition-order', meta: { title: '营养点餐', menuKey: 'nutrition-order' }, component: () => import('@/views/nutrition-dining/nutrition-order/index.vue') }, + { path: 'user-mgmt', name: 'user-mgmt', meta: { title: '用户管理', menuKey: 'user-mgmt' }, component: () => import('@/views/nutrition-dining/user-mgmt/index.vue') }, + { path: 'meal-line', name: 'meal-line', meta: { title: '餐线管理', menuKey: 'meal-line' }, component: () => import('@/views/nutrition-dining/meal-line/index.vue') }, + { path: 'pickup-mgmt', name: 'pickup-mgmt', meta: { title: '取餐管理', menuKey: 'pickup-mgmt' }, component: () => import('@/views/nutrition-dining/pickup-mgmt/index.vue') }, + { path: 'consumption-mgmt', name: 'consumption-mgmt', meta: { title: '消费管理', menuKey: 'consumption-mgmt' }, component: () => import('@/views/nutrition-dining/consumption-mgmt/index.vue') }, + { path: 'nutrition-mgmt', name: 'nutrition-mgmt', meta: { title: '营养管理', menuKey: 'nutrition-mgmt' }, component: () => import('@/views/nutrition-dining/nutrition-mgmt/index.vue') }, + { path: 'ingredient-benefit', name: 'ingredient-benefit', meta: { title: '食材效益', menuKey: 'ingredient-benefit' }, component: () => import('@/views/nutrition-dining/ingredient-benefit/index.vue') }, + { path: 'terminal-mgmt', name: 'terminal-mgmt', meta: { title: '终端管理', menuKey: 'terminal-mgmt' }, component: () => import('@/views/nutrition-dining/terminal-mgmt/index.vue') }, + { path: 'model-mgmt', name: 'model-mgmt', meta: { title: '模型管理', menuKey: 'model-mgmt' }, component: () => import('@/views/nutrition-dining/model-mgmt/index.vue') }, + { path: 'flavor-innovation', name: 'flavor-innovation', meta: { title: '味养创新', menuKey: 'flavor-innovation' }, component: () => import('@/views/nutrition-dining/flavor-innovation/index.vue') }, + + // ========== 系统管理 ========== + { path: 'org-structure', name: 'org-structure', meta: { title: '组织机构', menuKey: 'org-structure' }, component: () => import('@/views/system/org-structure/index.vue') }, + { path: 'employee-mgmt', name: 'employee-mgmt', meta: { title: '员工管理', menuKey: 'employee-mgmt' }, component: () => import('@/views/system/employee-mgmt/index.vue') }, + { path: 'role-mgmt', name: 'role-mgmt', meta: { title: '角色管理', menuKey: 'role-mgmt' }, component: () => import('@/views/system/role-mgmt/index.vue') }, + { path: 'canteen-mgmt', name: 'canteen-mgmt', meta: { title: '食堂管理', menuKey: 'canteen-mgmt' }, component: () => import('@/views/system/canteen-mgmt/index.vue') }, +] + +const routes: RouteRecordRaw[] = [ + { + path: '/login', + name: 'login', + component: () => import('@/views/login/index.vue'), + }, + { + path: '/', + component: () => import('@/layouts/MainLayout.vue'), + redirect: '/dashboard', + children: modules, + }, +] + +const router = createRouter({ + history: createWebHistory(), + routes, +}) + +router.beforeEach((to, _from, next) => { + const token = localStorage.getItem('token') + if (to.name !== 'login' && !token) { + next({ name: 'login' }) + } else { + document.title = `${(to.meta.title as string) || ''} - 智能餐养` + next() + } +}) + +export default router diff --git a/zhican/admin/src/stores/user.ts b/zhican/admin/src/stores/user.ts new file mode 100644 index 0000000..3bddae9 --- /dev/null +++ b/zhican/admin/src/stores/user.ts @@ -0,0 +1,31 @@ +import { defineStore } from 'pinia' +import { ref } from 'vue' + +export interface UserInfo { + id: string + name: string + avatar?: string + role: string +} + +export const useUserStore = defineStore('user', () => { + const token = ref(localStorage.getItem('token') || '') + const userInfo = ref(null) + + function setToken(val: string) { + token.value = val + localStorage.setItem('token', val) + } + + function setUserInfo(info: UserInfo) { + userInfo.value = info + } + + function logout() { + token.value = '' + userInfo.value = null + localStorage.removeItem('token') + } + + return { token, userInfo, setToken, setUserInfo, logout } +}) diff --git a/zhican/admin/src/utils/request.ts b/zhican/admin/src/utils/request.ts new file mode 100644 index 0000000..7f02259 --- /dev/null +++ b/zhican/admin/src/utils/request.ts @@ -0,0 +1,40 @@ +import axios from 'axios' +import type { AxiosInstance, AxiosRequestConfig, AxiosResponse } from 'axios' +import { message } from 'ant-design-vue' + +const request: AxiosInstance = axios.create({ + baseURL: '/api', + timeout: 15000, +}) + +request.interceptors.request.use( + (config) => { + const token = localStorage.getItem('token') + if (token) { + config.headers.Authorization = `Bearer ${token}` + } + return config + }, + (error) => Promise.reject(error) +) + +request.interceptors.response.use( + (response: AxiosResponse) => { + const { code, msg, data } = response.data + if (code === 0) { + return data + } + message.error(msg || '请求失败') + return Promise.reject(new Error(msg)) + }, + (error) => { + if (error.response?.status === 401) { + localStorage.removeItem('token') + window.location.href = '/login' + } + message.error(error.message || '网络错误') + return Promise.reject(error) + } +) + +export default request diff --git a/zhican/admin/src/views/business-flow/index.vue b/zhican/admin/src/views/business-flow/index.vue new file mode 100644 index 0000000..923859a --- /dev/null +++ b/zhican/admin/src/views/business-flow/index.vue @@ -0,0 +1,849 @@ + + + + + diff --git a/zhican/admin/src/views/dashboard/index.vue b/zhican/admin/src/views/dashboard/index.vue new file mode 100644 index 0000000..4fcfed4 --- /dev/null +++ b/zhican/admin/src/views/dashboard/index.vue @@ -0,0 +1,425 @@ + + + + + diff --git a/zhican/admin/src/views/green-planting/harvest-storage/index.vue b/zhican/admin/src/views/green-planting/harvest-storage/index.vue new file mode 100644 index 0000000..f8b5211 --- /dev/null +++ b/zhican/admin/src/views/green-planting/harvest-storage/index.vue @@ -0,0 +1,211 @@ + + + diff --git a/zhican/admin/src/views/green-planting/land-env/index.vue b/zhican/admin/src/views/green-planting/land-env/index.vue new file mode 100644 index 0000000..395cda6 --- /dev/null +++ b/zhican/admin/src/views/green-planting/land-env/index.vue @@ -0,0 +1,187 @@ + + + + + diff --git a/zhican/admin/src/views/green-planting/planting-monitor/index.vue b/zhican/admin/src/views/green-planting/planting-monitor/index.vue new file mode 100644 index 0000000..85ab1b7 --- /dev/null +++ b/zhican/admin/src/views/green-planting/planting-monitor/index.vue @@ -0,0 +1,219 @@ + + + + + diff --git a/zhican/admin/src/views/green-planting/procurement-mgmt/index.vue b/zhican/admin/src/views/green-planting/procurement-mgmt/index.vue new file mode 100644 index 0000000..0c30c07 --- /dev/null +++ b/zhican/admin/src/views/green-planting/procurement-mgmt/index.vue @@ -0,0 +1,203 @@ + + + diff --git a/zhican/admin/src/views/green-planting/supplier-mgmt/index.vue b/zhican/admin/src/views/green-planting/supplier-mgmt/index.vue new file mode 100644 index 0000000..3117366 --- /dev/null +++ b/zhican/admin/src/views/green-planting/supplier-mgmt/index.vue @@ -0,0 +1,207 @@ + + + + + diff --git a/zhican/admin/src/views/health-production/clean-assemble/index.vue b/zhican/admin/src/views/health-production/clean-assemble/index.vue new file mode 100644 index 0000000..481ad25 --- /dev/null +++ b/zhican/admin/src/views/health-production/clean-assemble/index.vue @@ -0,0 +1,93 @@ + + + diff --git a/zhican/admin/src/views/health-production/clean-cabinet/index.vue b/zhican/admin/src/views/health-production/clean-cabinet/index.vue new file mode 100644 index 0000000..b6553bc --- /dev/null +++ b/zhican/admin/src/views/health-production/clean-cabinet/index.vue @@ -0,0 +1,138 @@ + + + + + diff --git a/zhican/admin/src/views/health-production/clean-order/index.vue b/zhican/admin/src/views/health-production/clean-order/index.vue new file mode 100644 index 0000000..b54b1b2 --- /dev/null +++ b/zhican/admin/src/views/health-production/clean-order/index.vue @@ -0,0 +1,107 @@ + + + diff --git a/zhican/admin/src/views/health-production/cook-by-order/index.vue b/zhican/admin/src/views/health-production/cook-by-order/index.vue new file mode 100644 index 0000000..8fa6556 --- /dev/null +++ b/zhican/admin/src/views/health-production/cook-by-order/index.vue @@ -0,0 +1,129 @@ + + + diff --git a/zhican/admin/src/views/health-production/food-safety/index.vue b/zhican/admin/src/views/health-production/food-safety/index.vue new file mode 100644 index 0000000..ab82bd8 --- /dev/null +++ b/zhican/admin/src/views/health-production/food-safety/index.vue @@ -0,0 +1,123 @@ + + + + + diff --git a/zhican/admin/src/views/health-production/production-stats/index.vue b/zhican/admin/src/views/health-production/production-stats/index.vue new file mode 100644 index 0000000..3d46817 --- /dev/null +++ b/zhican/admin/src/views/health-production/production-stats/index.vue @@ -0,0 +1,76 @@ + + + diff --git a/zhican/admin/src/views/health-production/recipe-plan/index.vue b/zhican/admin/src/views/health-production/recipe-plan/index.vue new file mode 100644 index 0000000..2ee0513 --- /dev/null +++ b/zhican/admin/src/views/health-production/recipe-plan/index.vue @@ -0,0 +1,110 @@ + + + + + diff --git a/zhican/admin/src/views/health-production/serving-monitor/index.vue b/zhican/admin/src/views/health-production/serving-monitor/index.vue new file mode 100644 index 0000000..bb4f814 --- /dev/null +++ b/zhican/admin/src/views/health-production/serving-monitor/index.vue @@ -0,0 +1,106 @@ + + + diff --git a/zhican/admin/src/views/health-production/surplus-disposal/index.vue b/zhican/admin/src/views/health-production/surplus-disposal/index.vue new file mode 100644 index 0000000..ec342eb --- /dev/null +++ b/zhican/admin/src/views/health-production/surplus-disposal/index.vue @@ -0,0 +1,146 @@ + + + diff --git a/zhican/admin/src/views/hygiene-supply/clean-external/index.vue b/zhican/admin/src/views/hygiene-supply/clean-external/index.vue new file mode 100644 index 0000000..28eddec --- /dev/null +++ b/zhican/admin/src/views/hygiene-supply/clean-external/index.vue @@ -0,0 +1,184 @@ + + + + + diff --git a/zhican/admin/src/views/hygiene-supply/clean-internal/index.vue b/zhican/admin/src/views/hygiene-supply/clean-internal/index.vue new file mode 100644 index 0000000..7c44e5c --- /dev/null +++ b/zhican/admin/src/views/hygiene-supply/clean-internal/index.vue @@ -0,0 +1,152 @@ + + + diff --git a/zhican/admin/src/views/hygiene-supply/clean-process/index.vue b/zhican/admin/src/views/hygiene-supply/clean-process/index.vue new file mode 100644 index 0000000..0098907 --- /dev/null +++ b/zhican/admin/src/views/hygiene-supply/clean-process/index.vue @@ -0,0 +1,130 @@ + + + + + diff --git a/zhican/admin/src/views/hygiene-supply/clean-storage/index.vue b/zhican/admin/src/views/hygiene-supply/clean-storage/index.vue new file mode 100644 index 0000000..5a2998b --- /dev/null +++ b/zhican/admin/src/views/hygiene-supply/clean-storage/index.vue @@ -0,0 +1,94 @@ + + + diff --git a/zhican/admin/src/views/hygiene-supply/hygiene-test/index.vue b/zhican/admin/src/views/hygiene-supply/hygiene-test/index.vue new file mode 100644 index 0000000..a1ee529 --- /dev/null +++ b/zhican/admin/src/views/hygiene-supply/hygiene-test/index.vue @@ -0,0 +1,155 @@ + + + + + diff --git a/zhican/admin/src/views/hygiene-supply/raw-storage/index.vue b/zhican/admin/src/views/hygiene-supply/raw-storage/index.vue new file mode 100644 index 0000000..81ead64 --- /dev/null +++ b/zhican/admin/src/views/hygiene-supply/raw-storage/index.vue @@ -0,0 +1,150 @@ + + + diff --git a/zhican/admin/src/views/login/index.vue b/zhican/admin/src/views/login/index.vue new file mode 100644 index 0000000..cb30700 --- /dev/null +++ b/zhican/admin/src/views/login/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/algorithm-standard/index.vue b/zhican/admin/src/views/nutrition-dining/algorithm-standard/index.vue new file mode 100644 index 0000000..bb2931a --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/algorithm-standard/index.vue @@ -0,0 +1,107 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/consumption-mgmt/index.vue b/zhican/admin/src/views/nutrition-dining/consumption-mgmt/index.vue new file mode 100644 index 0000000..7353d98 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/consumption-mgmt/index.vue @@ -0,0 +1,75 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/dish-inventory/index.vue b/zhican/admin/src/views/nutrition-dining/dish-inventory/index.vue new file mode 100644 index 0000000..f38c183 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/dish-inventory/index.vue @@ -0,0 +1,81 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/flavor-innovation/index.vue b/zhican/admin/src/views/nutrition-dining/flavor-innovation/index.vue new file mode 100644 index 0000000..80c79c8 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/flavor-innovation/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/food-composition/index.vue b/zhican/admin/src/views/nutrition-dining/food-composition/index.vue new file mode 100644 index 0000000..a35bb12 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/food-composition/index.vue @@ -0,0 +1,62 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/ingredient-benefit/index.vue b/zhican/admin/src/views/nutrition-dining/ingredient-benefit/index.vue new file mode 100644 index 0000000..d7a1b8c --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/ingredient-benefit/index.vue @@ -0,0 +1,63 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/meal-line/index.vue b/zhican/admin/src/views/nutrition-dining/meal-line/index.vue new file mode 100644 index 0000000..6461872 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/meal-line/index.vue @@ -0,0 +1,72 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/model-mgmt/index.vue b/zhican/admin/src/views/nutrition-dining/model-mgmt/index.vue new file mode 100644 index 0000000..c8dd2db --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/model-mgmt/index.vue @@ -0,0 +1,57 @@ + + + diff --git a/zhican/admin/src/views/nutrition-dining/nutrition-mgmt/index.vue b/zhican/admin/src/views/nutrition-dining/nutrition-mgmt/index.vue new file mode 100644 index 0000000..7ef1ab8 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/nutrition-mgmt/index.vue @@ -0,0 +1,722 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/nutrition-order/index.vue b/zhican/admin/src/views/nutrition-dining/nutrition-order/index.vue new file mode 100644 index 0000000..80bd246 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/nutrition-order/index.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/nutrition-test/index.vue b/zhican/admin/src/views/nutrition-dining/nutrition-test/index.vue new file mode 100644 index 0000000..fefe48c --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/nutrition-test/index.vue @@ -0,0 +1,90 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/pickup-mgmt/index.vue b/zhican/admin/src/views/nutrition-dining/pickup-mgmt/index.vue new file mode 100644 index 0000000..eb3d2da --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/pickup-mgmt/index.vue @@ -0,0 +1,73 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/recipe-mgmt/index.vue b/zhican/admin/src/views/nutrition-dining/recipe-mgmt/index.vue new file mode 100644 index 0000000..5fcea90 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/recipe-mgmt/index.vue @@ -0,0 +1,70 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/terminal-mgmt/index.vue b/zhican/admin/src/views/nutrition-dining/terminal-mgmt/index.vue new file mode 100644 index 0000000..0362539 --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/terminal-mgmt/index.vue @@ -0,0 +1,50 @@ + + + + + diff --git a/zhican/admin/src/views/nutrition-dining/user-mgmt/index.vue b/zhican/admin/src/views/nutrition-dining/user-mgmt/index.vue new file mode 100644 index 0000000..3d5bfde --- /dev/null +++ b/zhican/admin/src/views/nutrition-dining/user-mgmt/index.vue @@ -0,0 +1,83 @@ + + + + + diff --git a/zhican/admin/src/views/system/canteen-mgmt/index.vue b/zhican/admin/src/views/system/canteen-mgmt/index.vue new file mode 100644 index 0000000..c376f41 --- /dev/null +++ b/zhican/admin/src/views/system/canteen-mgmt/index.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/zhican/admin/src/views/system/employee-mgmt/index.vue b/zhican/admin/src/views/system/employee-mgmt/index.vue new file mode 100644 index 0000000..cb4ee24 --- /dev/null +++ b/zhican/admin/src/views/system/employee-mgmt/index.vue @@ -0,0 +1,299 @@ + + + + + diff --git a/zhican/admin/src/views/system/org-structure/index.vue b/zhican/admin/src/views/system/org-structure/index.vue new file mode 100644 index 0000000..e9fae22 --- /dev/null +++ b/zhican/admin/src/views/system/org-structure/index.vue @@ -0,0 +1,266 @@ + + + + + diff --git a/zhican/admin/src/views/system/role-mgmt/index.vue b/zhican/admin/src/views/system/role-mgmt/index.vue new file mode 100644 index 0000000..e3a4a19 --- /dev/null +++ b/zhican/admin/src/views/system/role-mgmt/index.vue @@ -0,0 +1,245 @@ + + + + + diff --git a/zhican/admin/tsconfig.json b/zhican/admin/tsconfig.json new file mode 100644 index 0000000..92ac739 --- /dev/null +++ b/zhican/admin/tsconfig.json @@ -0,0 +1,25 @@ +{ + "compilerOptions": { + "target": "ES2020", + "useDefineForClassFields": true, + "module": "ESNext", + "lib": ["ES2020", "DOM", "DOM.Iterable"], + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "jsx": "preserve", + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true, + "baseUrl": ".", + "paths": { + "@/*": ["src/*"] + } + }, + "include": ["src/**/*.ts", "src/**/*.tsx", "src/**/*.vue"], + "references": [{ "path": "./tsconfig.node.json" }] +} diff --git a/zhican/admin/tsconfig.node.json b/zhican/admin/tsconfig.node.json new file mode 100644 index 0000000..8e5b203 --- /dev/null +++ b/zhican/admin/tsconfig.node.json @@ -0,0 +1,18 @@ +{ + "compilerOptions": { + "target": "ES2022", + "lib": ["ES2023"], + "module": "ESNext", + "skipLibCheck": true, + "moduleResolution": "bundler", + "allowImportingTsExtensions": true, + "isolatedModules": true, + "moduleDetection": "force", + "noEmit": true, + "strict": true, + "noUnusedLocals": true, + "noUnusedParameters": true, + "noFallthroughCasesInSwitch": true + }, + "include": ["vite.config.ts"] +} diff --git a/zhican/admin/vite.config.ts b/zhican/admin/vite.config.ts new file mode 100644 index 0000000..50f5e08 --- /dev/null +++ b/zhican/admin/vite.config.ts @@ -0,0 +1,38 @@ +import { defineConfig } from 'vite' +import vue from '@vitejs/plugin-vue' +import Components from 'unplugin-vue-components/vite' +import AutoImport from 'unplugin-auto-import/vite' +import { AntDesignVueResolver } from 'unplugin-vue-components/resolvers' +import { resolve } from 'path' + +export default defineConfig({ + plugins: [ + vue(), + AutoImport({ + imports: ['vue', 'vue-router', 'pinia'], + dts: 'src/auto-imports.d.ts', + }), + Components({ + resolvers: [ + AntDesignVueResolver({ + importStyle: false, + }), + ], + dts: 'src/components.d.ts', + }), + ], + resolve: { + alias: { + '@': resolve(__dirname, 'src'), + }, + }, + server: { + port: 3000, + proxy: { + '/api': { + target: 'http://localhost:8080', + changeOrigin: true, + }, + }, + }, +}) diff --git a/zhican/miniprogram/app.js b/zhican/miniprogram/app.js new file mode 100644 index 0000000..f5e4fa1 --- /dev/null +++ b/zhican/miniprogram/app.js @@ -0,0 +1,14 @@ +App({ + globalData: { + userInfo: null, + baseUrl: 'https://api.example.com', + token: '', + }, + + onLaunch() { + const token = wx.getStorageSync('token') + if (token) { + this.globalData.token = token + } + }, +}) diff --git a/zhican/miniprogram/app.json b/zhican/miniprogram/app.json new file mode 100644 index 0000000..b3c2821 --- /dev/null +++ b/zhican/miniprogram/app.json @@ -0,0 +1,28 @@ +{ + "pages": [ + "pages/eat/index", + "pages/ask/index", + "pages/cook/index", + "pages/profile/index" + ], + "tabBar": { + "color": "#999", + "selectedColor": "#1890ff", + "backgroundColor": "#fff", + "borderStyle": "black", + "list": [ + { "pagePath": "pages/eat/index", "text": "吃" }, + { "pagePath": "pages/ask/index", "text": "问" }, + { "pagePath": "pages/cook/index", "text": "做" }, + { "pagePath": "pages/profile/index", "text": "我" } + ] + }, + "window": { + "backgroundTextStyle": "light", + "navigationBarBackgroundColor": "#1890ff", + "navigationBarTitleText": "智能餐养", + "navigationBarTextStyle": "white" + }, + "style": "v2", + "sitemapLocation": "sitemap.json" +} diff --git a/zhican/miniprogram/app.wxss b/zhican/miniprogram/app.wxss new file mode 100644 index 0000000..ab591da --- /dev/null +++ b/zhican/miniprogram/app.wxss @@ -0,0 +1,26 @@ +page { + background-color: #f5f5f5; + font-family: -apple-system, BlinkMacSystemFont, 'Helvetica Neue', Helvetica, 'PingFang SC', + 'Microsoft YaHei', Arial, sans-serif; + font-size: 28rpx; + color: #333; +} + +.container { + padding: 24rpx; +} + +.card { + background: #fff; + border-radius: 16rpx; + padding: 24rpx; + margin-bottom: 24rpx; + box-shadow: 0 2rpx 12rpx rgba(0, 0, 0, 0.05); +} + +.section-title { + font-size: 32rpx; + font-weight: bold; + margin-bottom: 16rpx; + color: #333; +} diff --git a/zhican/miniprogram/pages/ask/index.js b/zhican/miniprogram/pages/ask/index.js new file mode 100644 index 0000000..83760c5 --- /dev/null +++ b/zhican/miniprogram/pages/ask/index.js @@ -0,0 +1,53 @@ +let msgId = 0 + +const mockReplies = { + '今天吃什么好?': '根据您的健康档案,建议今天午餐选择:蒜蓉西兰花(95kcal,富含维生素C)+ 蒸鲈鱼(210kcal,高蛋白低脂)+ 杂粮饭(180kcal,高纤维)。总热量约485kcal,营养均衡。', + '如何减脂饮食?': '减脂饮食建议:\n1. 每日热量控制在1500-1800kcal\n2. 蛋白质占比30%(鸡胸肉、鱼虾)\n3. 减少精制碳水,多吃粗粮\n4. 蔬菜每餐不少于200g\n5. 少油少盐,清蒸水煮为主\n\n推荐今日菜品:清炒时蔬 + 蒸鲈鱼 + 凉拌黄瓜', + '蛋白质怎么补充?': '优质蛋白质来源推荐:\n- 鸡胸肉:每100g含蛋白质24g\n- 鱼类:每100g含蛋白质18-20g\n- 鸡蛋:每个约含6g蛋白质\n- 豆腐:每100g含蛋白质8g\n\n建议每日蛋白质摄入量:体重(kg)×1.2g。您可以在今天的菜单中选择宫保鸡丁或炖牛腩。', + '我的营养够吗?': '根据您近7天的用餐记录分析:\n- 热量:日均1850kcal(推荐2000kcal)略低\n- 蛋白质:日均65g(推荐72g)接近达标\n- 钙:日均680mg(推荐800mg)偏低\n- 维生素C:日均95mg(推荐100mg)达标\n\n建议增加奶制品和绿叶蔬菜摄入,补充钙质。', +} + +const defaultReply = '感谢您的提问!根据您的个人健康数据和饮食偏好,我建议您关注以下几点:\n1. 保持每餐营养均衡\n2. 注意蛋白质和蔬菜的搭配\n3. 适量控制油盐摄入\n\n如需更详细的建议,请告诉我您的具体需求。' + +Page({ + data: { + messages: [ + { id: msgId++, role: 'assistant', content: '您好!我是AI营养顾问,可以为您解答饮食和营养相关问题。试试问我"今天吃什么好?"' }, + ], + inputValue: '', + scrollToId: '', + quickQuestions: ['今天吃什么好?', '如何减脂饮食?', '蛋白质怎么补充?', '我的营养够吗?'], + }, + + onInput(e) { + this.setData({ inputValue: e.detail.value }) + }, + + askQuick(e) { + this.setData({ inputValue: e.currentTarget.dataset.q }) + this.sendMessage() + }, + + sendMessage() { + const content = this.data.inputValue.trim() + if (!content) return + + const userMsg = { id: msgId++, role: 'user', content } + const messages = [...this.data.messages, userMsg] + this.setData({ + messages, + inputValue: '', + scrollToId: 'msg-' + userMsg.id, + }) + + // 模拟 AI 思考延迟 + setTimeout(() => { + const reply = mockReplies[content] || defaultReply + const aiMsg = { id: msgId++, role: 'assistant', content: reply } + this.setData({ + messages: [...this.data.messages, aiMsg], + scrollToId: 'msg-' + aiMsg.id, + }) + }, 800) + }, +}) diff --git a/zhican/miniprogram/pages/ask/index.json b/zhican/miniprogram/pages/ask/index.json new file mode 100644 index 0000000..119b3fd --- /dev/null +++ b/zhican/miniprogram/pages/ask/index.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "问 - AI营养顾问" +} diff --git a/zhican/miniprogram/pages/ask/index.wxml b/zhican/miniprogram/pages/ask/index.wxml new file mode 100644 index 0000000..1c89339 --- /dev/null +++ b/zhican/miniprogram/pages/ask/index.wxml @@ -0,0 +1,30 @@ + + + AI 营养顾问 + + + + + {{item.content}} + + + + + + + {{item}} + + + + + + 发送 + + diff --git a/zhican/miniprogram/pages/ask/index.wxss b/zhican/miniprogram/pages/ask/index.wxss new file mode 100644 index 0000000..e26b2c7 --- /dev/null +++ b/zhican/miniprogram/pages/ask/index.wxss @@ -0,0 +1,80 @@ +.chat-list { + height: calc(100vh - 340rpx); + padding: 24rpx; +} + +.chat-item { + margin-bottom: 24rpx; + display: flex; +} + +.chat-item.user { + justify-content: flex-end; +} + +.chat-item.assistant { + justify-content: flex-start; +} + +.bubble { + max-width: 75%; + padding: 20rpx 28rpx; + border-radius: 16rpx; + font-size: 28rpx; + line-height: 1.6; +} + +.user .bubble { + background: #1890ff; + color: #fff; + border-bottom-right-radius: 4rpx; +} + +.assistant .bubble { + background: #fff; + color: #333; + border-bottom-left-radius: 4rpx; + box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06); +} + +.quick-questions { + display: flex; + flex-wrap: wrap; + padding: 0 24rpx; + gap: 16rpx; + margin-bottom: 16rpx; +} + +.quick-item { + font-size: 24rpx; + color: #1890ff; + background: rgba(24, 144, 255, 0.08); + padding: 10rpx 20rpx; + border-radius: 24rpx; + border: 1rpx solid rgba(24, 144, 255, 0.2); +} + +.input-bar { + display: flex; + padding: 16rpx 24rpx; + background: #fff; + align-items: center; + border-top: 1rpx solid #eee; +} + +.chat-input { + flex: 1; + background: #f5f5f5; + border-radius: 32rpx; + padding: 16rpx 24rpx; + font-size: 28rpx; +} + +.send-btn { + margin-left: 16rpx; + background: #1890ff; + color: #fff; + font-size: 28rpx; + padding: 14rpx 28rpx; + border-radius: 32rpx; +} diff --git a/zhican/miniprogram/pages/cook/index.js b/zhican/miniprogram/pages/cook/index.js new file mode 100644 index 0000000..1cd01b5 --- /dev/null +++ b/zhican/miniprogram/pages/cook/index.js @@ -0,0 +1,61 @@ +const mockFollowRecipes = [ + { id: 'f1', name: '红烧肉', image: '', description: '经典家常菜,肥而不腻', difficulty: '中等', duration: 45 }, + { id: 'f2', name: '蒜蓉西兰花', image: '', description: '低卡高纤维,健康首选', difficulty: '简单', duration: 10 }, + { id: 'f3', name: '番茄鸡蛋汤', image: '', description: '营养丰富,老少皆宜', difficulty: '简单', duration: 15 }, + { id: 'f4', name: '糖醋里脊', image: '', description: '酸甜可口,下饭神器', difficulty: '较难', duration: 30 }, + { id: 'f5', name: '蒸鲈鱼', image: '', description: '清淡鲜美,高蛋白低脂', difficulty: '中等', duration: 20 }, +] + +const mockMyRecipes = [ + { id: 'm1', name: '秘制卤鸡腿', description: '独家卤料配方,入味三分' }, + { id: 'm2', name: '凉拌三丝', description: '黄瓜丝+胡萝卜丝+粉丝,清爽开胃' }, +] + +const mockSharedRecipes = [ + { id: 's1', author: '美食达人小王', name: '低卡鸡胸肉沙拉', image: '', time: '2小时前', likes: 128, liked: false }, + { id: 's2', author: '营养师张姐', name: '五谷杂粮粥', image: '', time: '5小时前', likes: 86, liked: true }, + { id: 's3', author: '厨艺新星', name: '减脂版宫保鸡丁', image: '', time: '1天前', likes: 215, liked: false }, + { id: 's4', author: '健身小李', name: '高蛋白燕麦碗', image: '', time: '2天前', likes: 163, liked: true }, +] + +Page({ + data: { + mode: 'follow', + followRecipes: mockFollowRecipes, + myRecipes: mockMyRecipes, + sharedRecipes: mockSharedRecipes, + }, + + switchMode(e) { + this.setData({ mode: e.currentTarget.dataset.mode }) + }, + + viewRecipe(e) { + const id = e.currentTarget.dataset.id + const recipe = this.data.followRecipes.find(r => r.id === id) + wx.showModal({ + title: recipe.name, + content: `难度: ${recipe.difficulty}\n时间: ${recipe.duration}分钟\n\n${recipe.description}\n\n步骤:\n1. 准备食材\n2. 处理食材\n3. 烹饪制作\n4. 装盘上桌`, + showCancel: false, + }) + }, + + goCreate() { + wx.showToast({ title: '创作功能开发中', icon: 'none' }) + }, + + toggleLike(e) { + const id = e.currentTarget.dataset.id + const list = this.data.sharedRecipes.map(item => { + if (item.id === id) { + return { + ...item, + liked: !item.liked, + likes: item.liked ? item.likes - 1 : item.likes + 1, + } + } + return item + }) + this.setData({ sharedRecipes: list }) + }, +}) diff --git a/zhican/miniprogram/pages/cook/index.json b/zhican/miniprogram/pages/cook/index.json new file mode 100644 index 0000000..da300cc --- /dev/null +++ b/zhican/miniprogram/pages/cook/index.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "做 - 烹饪与分享" +} diff --git a/zhican/miniprogram/pages/cook/index.wxml b/zhican/miniprogram/pages/cook/index.wxml new file mode 100644 index 0000000..31fd64e --- /dev/null +++ b/zhican/miniprogram/pages/cook/index.wxml @@ -0,0 +1,61 @@ + + + + 照做 + 创作 + 分享 + + + + + + + {{item.name[0]}}{{item.name[1]}} + + + {{item.name}} + {{item.description}} + + {{item.difficulty}} + {{item.duration}}分钟 + + + + + + + + + + + 创建我的菜谱 + + + {{item.name}} + {{item.description}} + + + + + + + + {{item.name}} + + + + diff --git a/zhican/miniprogram/pages/cook/index.wxss b/zhican/miniprogram/pages/cook/index.wxss new file mode 100644 index 0000000..7bf5579 --- /dev/null +++ b/zhican/miniprogram/pages/cook/index.wxss @@ -0,0 +1,148 @@ +.tab-bar { + display: flex; + background: #fff; + border-radius: 16rpx; + margin-bottom: 24rpx; + overflow: hidden; +} + +.tab-item { + flex: 1; + text-align: center; + padding: 20rpx 0; + font-size: 28rpx; + color: #666; +} + +.tab-item.active { + color: #1890ff; + font-weight: bold; + border-bottom: 4rpx solid #1890ff; +} + +.recipe-follow-item { + display: flex; + align-items: center; +} + +.recipe-cover-placeholder { + width: 160rpx; + height: 120rpx; + border-radius: 12rpx; + margin-right: 20rpx; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.cover-text { + font-size: 32rpx; + color: #fff; + font-weight: bold; +} + +.recipe-detail { + flex: 1; +} + +.recipe-name { + font-size: 32rpx; + font-weight: bold; + display: block; +} + +.recipe-desc { + font-size: 26rpx; + color: #666; + display: block; +} + +.recipe-meta { + margin-top: 12rpx; + display: flex; + gap: 16rpx; + align-items: center; +} + +.meta-tag { + font-size: 22rpx; + color: #fa8c16; + background: rgba(250, 140, 22, 0.1); + padding: 4rpx 12rpx; + border-radius: 6rpx; +} + +.meta-time { + font-size: 24rpx; + color: #999; +} + +.create-entry { + display: flex; + flex-direction: column; + align-items: center; + justify-content: center; + height: 200rpx; +} + +.create-icon { + font-size: 64rpx; + color: #1890ff; + margin-bottom: 12rpx; +} + +.create-label { + font-size: 30rpx; + color: #1890ff; +} + +.share-header { + display: flex; + align-items: center; + gap: 16rpx; +} + +.author-avatar { + width: 64rpx; + height: 64rpx; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + color: #fff; + font-size: 28rpx; + font-weight: bold; +} + +.share-meta { + display: flex; + flex-direction: column; +} + +.author-name { + font-size: 28rpx; + font-weight: bold; +} + +.share-time { + font-size: 22rpx; + color: #999; +} + +.share-footer { + margin-top: 16rpx; + display: flex; + justify-content: flex-end; + gap: 32rpx; +} + +.like-btn, .share-btn { + font-size: 26rpx; + color: #999; + padding: 8rpx 16rpx; +} + +.like-btn.liked { + color: #ff4d4f; +} diff --git a/zhican/miniprogram/pages/eat/index.js b/zhican/miniprogram/pages/eat/index.js new file mode 100644 index 0000000..6af397c --- /dev/null +++ b/zhican/miniprogram/pages/eat/index.js @@ -0,0 +1,88 @@ +// 静态 Mock 数据 - 无需后端 +const mockRecipes = { + breakfast: [ + { id: 'b1', name: '杂粮粥', calories: 180, image: '', tags: ['低脂', '高纤维'] }, + { id: 'b2', name: '鸡蛋灌饼', calories: 320, image: '', tags: ['高蛋白'] }, + { id: 'b3', name: '豆浆油条', calories: 280, image: '', tags: ['经典'] }, + { id: 'b4', name: '水果沙拉', calories: 120, image: '', tags: ['低糖', '富维C'] }, + { id: 'b5', name: '蒸饺(6个)', calories: 350, image: '', tags: ['高蛋白'] }, + ], + lunch: [ + { id: 'l1', name: '红烧肉', calories: 520, image: '', tags: ['招牌', '高蛋白'] }, + { id: 'l2', name: '清炒时蔬', calories: 85, image: '', tags: ['低脂', '高纤维'] }, + { id: 'l3', name: '糖醋里脊', calories: 430, image: '', tags: ['热销'] }, + { id: 'l4', name: '番茄鸡蛋', calories: 180, image: '', tags: ['经典', '补钙'] }, + { id: 'l5', name: '蒜蓉西兰花', calories: 95, image: '', tags: ['低脂', '富维C'] }, + { id: 'l6', name: '宫保鸡丁', calories: 380, image: '', tags: ['高蛋白'] }, + { id: 'l7', name: '酸辣汤', calories: 110, image: '', tags: ['开胃'] }, + ], + dinner: [ + { id: 'd1', name: '蒸鲈鱼', calories: 210, image: '', tags: ['高蛋白', '低脂'] }, + { id: 'd2', name: '炖牛腩', calories: 450, image: '', tags: ['高蛋白', '补铁'] }, + { id: 'd3', name: '凉拌黄瓜', calories: 45, image: '', tags: ['低卡', '开胃'] }, + { id: 'd4', name: '紫菜蛋花汤', calories: 65, image: '', tags: ['补钙'] }, + { id: 'd5', name: '水煮鱼', calories: 380, image: '', tags: ['热销', '高蛋白'] }, + ], +} + +const mockNutrition = { + breakfast: { calories: 750, protein: 28, fat: 22, carbs: 105 }, + lunch: { calories: 1100, protein: 45, fat: 35, carbs: 140 }, + dinner: { calories: 850, protein: 38, fat: 25, carbs: 110 }, +} + +Page({ + data: { + currentTab: 'lunch', + recipes: [], + nutrition: {}, + orderVisible: false, + selectedDish: null, + orderCount: 1, + }, + + onLoad() { + this.loadRecipes() + }, + + switchTab(e) { + const tab = e.currentTarget.dataset.tab + this.setData({ currentTab: tab }) + this.loadRecipes() + }, + + loadRecipes() { + const tab = this.data.currentTab + this.setData({ + recipes: mockRecipes[tab] || [], + nutrition: mockNutrition[tab] || {}, + }) + }, + + orderDish(e) { + const id = e.currentTarget.dataset.id + const dish = this.data.recipes.find(r => r.id === id) + this.setData({ orderVisible: true, selectedDish: dish, orderCount: 1 }) + }, + + closeOrder() { + this.setData({ orderVisible: false, selectedDish: null }) + }, + + changeCount(e) { + const delta = parseInt(e.currentTarget.dataset.delta) + let count = this.data.orderCount + delta + if (count < 1) count = 1 + if (count > 10) count = 10 + this.setData({ orderCount: count }) + }, + + confirmOrder() { + const dish = this.data.selectedDish + wx.showToast({ + title: `已点 ${dish.name} x${this.data.orderCount}`, + icon: 'success', + }) + this.setData({ orderVisible: false }) + }, +}) diff --git a/zhican/miniprogram/pages/eat/index.json b/zhican/miniprogram/pages/eat/index.json new file mode 100644 index 0000000..393926c --- /dev/null +++ b/zhican/miniprogram/pages/eat/index.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "吃 - 食谱与点餐" +} diff --git a/zhican/miniprogram/pages/eat/index.wxml b/zhican/miniprogram/pages/eat/index.wxml new file mode 100644 index 0000000..84fd5aa --- /dev/null +++ b/zhican/miniprogram/pages/eat/index.wxml @@ -0,0 +1,69 @@ + + + 今日食谱 + + + 早餐 + 午餐 + 晚餐 + + + + + + {{item.name[0]}} + + + {{item.name}} + {{item.calories}} kcal + + {{tag}} + + + 点餐 + + + + 营养概览 + + + 热量 + {{nutrition.calories || '--'}} kcal + + + 蛋白质 + {{nutrition.protein || '--'}} g + + + 脂肪 + {{nutrition.fat || '--'}} g + + + 碳水 + {{nutrition.carbs || '--'}} g + + + + + + + + + {{selectedDish.name}} + {{selectedDish.calories}} kcal/份 + + + 数量 + + - + {{orderCount}} + + + + + + 总热量: {{selectedDish.calories * orderCount}} kcal + + 确认点餐 + + + diff --git a/zhican/miniprogram/pages/eat/index.wxss b/zhican/miniprogram/pages/eat/index.wxss new file mode 100644 index 0000000..dc0d1fc --- /dev/null +++ b/zhican/miniprogram/pages/eat/index.wxss @@ -0,0 +1,207 @@ +.tab-bar { + display: flex; + background: #fff; + border-radius: 16rpx; + margin-bottom: 24rpx; + overflow: hidden; +} + +.tab-item { + flex: 1; + text-align: center; + padding: 20rpx 0; + font-size: 28rpx; + color: #666; +} + +.tab-item.active { + color: #1890ff; + font-weight: bold; + border-bottom: 4rpx solid #1890ff; +} + +.recipe-item { + display: flex; + align-items: center; +} + +.recipe-img-placeholder { + width: 100rpx; + height: 100rpx; + border-radius: 12rpx; + margin-right: 20rpx; + display: flex; + align-items: center; + justify-content: center; + flex-shrink: 0; +} + +.img-text { + font-size: 36rpx; + color: #fff; + font-weight: bold; +} + +.recipe-info { + flex: 1; + min-width: 0; +} + +.recipe-name { + font-size: 30rpx; + font-weight: bold; + display: block; +} + +.recipe-cal { + font-size: 24rpx; + color: #999; + margin-top: 6rpx; + display: block; +} + +.recipe-tags { + margin-top: 8rpx; + display: flex; + flex-wrap: wrap; + gap: 8rpx; +} + +.tag { + display: inline-block; + font-size: 22rpx; + color: #1890ff; + background: rgba(24, 144, 255, 0.1); + padding: 4rpx 12rpx; + border-radius: 6rpx; +} + +.order-btn { + background: #1890ff; + color: #fff; + font-size: 26rpx; + padding: 12rpx 24rpx; + border-radius: 8rpx; + flex-shrink: 0; +} + +.nutrition-overview { + display: flex; + justify-content: space-around; +} + +.nutrition-item { + text-align: center; +} + +.nutrition-item .label { + font-size: 24rpx; + color: #999; + display: block; +} + +.nutrition-item .value { + font-size: 28rpx; + font-weight: bold; + color: #333; + margin-top: 8rpx; + display: block; +} + +/* 点餐弹窗 */ +.order-modal { + position: fixed; + top: 0; + left: 0; + right: 0; + bottom: 0; + z-index: 999; +} + +.order-mask { + position: absolute; + top: 0; + left: 0; + right: 0; + bottom: 0; + background: rgba(0, 0, 0, 0.5); +} + +.order-content { + position: absolute; + bottom: 0; + left: 0; + right: 0; + background: #fff; + border-radius: 24rpx 24rpx 0 0; + padding: 40rpx; +} + +.order-header { + margin-bottom: 32rpx; +} + +.order-title { + font-size: 36rpx; + font-weight: bold; + display: block; +} + +.order-cal { + font-size: 26rpx; + color: #999; + margin-top: 8rpx; + display: block; +} + +.order-count-row { + display: flex; + justify-content: space-between; + align-items: center; + padding: 20rpx 0; + border-top: 1rpx solid #f0f0f0; + border-bottom: 1rpx solid #f0f0f0; + font-size: 30rpx; +} + +.count-ctrl { + display: flex; + align-items: center; + gap: 24rpx; +} + +.count-btn { + width: 56rpx; + height: 56rpx; + border-radius: 50%; + background: #f5f5f5; + display: flex; + align-items: center; + justify-content: center; + font-size: 32rpx; + color: #333; +} + +.count-num { + font-size: 32rpx; + font-weight: bold; + min-width: 40rpx; + text-align: center; +} + +.order-total { + padding: 20rpx 0; + font-size: 28rpx; + color: #666; +} + +.order-confirm-btn { + background: #1890ff; + color: #fff; + text-align: center; + padding: 24rpx; + border-radius: 12rpx; + font-size: 32rpx; + font-weight: bold; + margin-top: 16rpx; +} diff --git a/zhican/miniprogram/pages/profile/index.js b/zhican/miniprogram/pages/profile/index.js new file mode 100644 index 0000000..bf323b5 --- /dev/null +++ b/zhican/miniprogram/pages/profile/index.js @@ -0,0 +1,55 @@ +Page({ + data: { + userInfo: null, + isLoggedIn: false, + balance: '¥ 568.50', + memberLevel: '黄金会员', + orderCount: 126, + healthScore: 85, + }, + + onLoad() { + // 模拟已登录状态 + this.setData({ + isLoggedIn: true, + userInfo: { + name: '张伟', + phone: '138****8888', + department: '研发部', + avatar: '', + }, + }) + }, + + login() { + // 模拟登录 + this.setData({ + isLoggedIn: true, + userInfo: { + name: '张伟', + phone: '138****8888', + department: '研发部', + avatar: '', + }, + }) + wx.showToast({ title: '登录成功', icon: 'success' }) + }, + + logout() { + wx.showModal({ + title: '提示', + content: '确认退出登录?', + success: (res) => { + if (res.confirm) { + this.setData({ isLoggedIn: false, userInfo: null }) + wx.showToast({ title: '已退出', icon: 'none' }) + } + }, + }) + }, + + goTo(e) { + const url = e.currentTarget.dataset.url + wx.showToast({ title: '功能开发中', icon: 'none' }) + }, +}) diff --git a/zhican/miniprogram/pages/profile/index.json b/zhican/miniprogram/pages/profile/index.json new file mode 100644 index 0000000..4ec55be --- /dev/null +++ b/zhican/miniprogram/pages/profile/index.json @@ -0,0 +1,3 @@ +{ + "navigationBarTitleText": "我的" +} diff --git a/zhican/miniprogram/pages/profile/index.wxml b/zhican/miniprogram/pages/profile/index.wxml new file mode 100644 index 0000000..017a852 --- /dev/null +++ b/zhican/miniprogram/pages/profile/index.wxml @@ -0,0 +1,98 @@ + + + + + + + {{userInfo.name[0]}} + + + {{userInfo.name}} + {{userInfo.department}} | {{userInfo.phone}} + + {{memberLevel}} + + + + + + ? + + + + + + + + {{balance}} + 余额 + + + {{orderCount}} + 累计订单 + + + {{healthScore}} + 健康评分 + + + + + + + + + + + 健康档案 + > + + + + + + 充值 + > + + + + + + 会员中心 + > + + + + + + 消费记录 + > + + + + + + + + + 过敏原设置 + > + + + + + + 设置 + > + + + + + + 关于 + > + + + + 退出登录 + diff --git a/zhican/miniprogram/pages/profile/index.wxss b/zhican/miniprogram/pages/profile/index.wxss new file mode 100644 index 0000000..83b26fe --- /dev/null +++ b/zhican/miniprogram/pages/profile/index.wxss @@ -0,0 +1,139 @@ +.user-card { + padding: 32rpx; +} + +.user-header { + display: flex; + align-items: center; +} + +.avatar-circle { + width: 120rpx; + height: 120rpx; + border-radius: 50%; + display: flex; + align-items: center; + justify-content: center; + margin-right: 24rpx; + flex-shrink: 0; +} + +.avatar-text { + font-size: 44rpx; + color: #fff; + font-weight: bold; +} + +.user-meta { + display: flex; + flex-direction: column; +} + +.nickname { + font-size: 36rpx; + font-weight: bold; +} + +.user-dept { + font-size: 24rpx; + color: #999; + margin-top: 6rpx; +} + +.member-badge { + margin-top: 8rpx; +} + +.member-tag { + display: inline-block; + font-size: 22rpx; + color: #fa8c16; + border: 1rpx solid #fa8c16; + background: rgba(250, 140, 22, 0.08); + border-radius: 6rpx; + padding: 4rpx 16rpx; +} + +.login-tip { + font-size: 28rpx; + color: #999; +} + +.user-stats { + display: flex; + justify-content: space-around; + margin-top: 32rpx; + padding-top: 24rpx; + border-top: 1rpx solid #f0f0f0; +} + +.stat-item { + text-align: center; +} + +.stat-value { + font-size: 34rpx; + font-weight: bold; + color: #333; + display: block; +} + +.stat-label { + font-size: 22rpx; + color: #999; + margin-top: 6rpx; + display: block; +} + +.menu-group { + padding: 0; +} + +.menu-item { + display: flex; + align-items: center; + padding: 24rpx 32rpx; + border-bottom: 1rpx solid #f5f5f5; +} + +.menu-item:last-child { + border-bottom: none; +} + +.menu-icon { + width: 56rpx; + height: 56rpx; + border-radius: 12rpx; + display: flex; + align-items: center; + justify-content: center; + margin-right: 20rpx; + flex-shrink: 0; +} + +.icon-text { + font-size: 26rpx; + color: #fff; + font-weight: bold; +} + +.menu-label { + flex: 1; + font-size: 30rpx; + color: #333; +} + +.arrow { + color: #ccc; + font-size: 28rpx; +} + +.logout-btn { + text-align: center; + color: #f5222d; + font-size: 30rpx; + padding: 28rpx; + margin-top: 32rpx; + background: #fff; + border-radius: 16rpx; +} diff --git a/zhican/miniprogram/project.config.json b/zhican/miniprogram/project.config.json new file mode 100644 index 0000000..82a4fc4 --- /dev/null +++ b/zhican/miniprogram/project.config.json @@ -0,0 +1,52 @@ +{ + "description": "项目配置文件", + "packOptions": { + "ignore": [], + "include": [] + }, + "setting": { + "bundle": false, + "userConfirmedBundleSwitch": false, + "urlCheck": true, + "scopeDataCheck": false, + "coverView": true, + "es6": true, + "postcss": true, + "compileHotReLoad": false, + "lazyloadPlaceholderEnable": false, + "preloadBackgroundData": false, + "minified": true, + "autoAudits": false, + "newFeature": false, + "uglifyFileName": false, + "uploadWithSourceMap": true, + "useIsolateContext": true, + "nodeModules": false, + "enhance": true, + "useMultiFrameRuntime": true, + "showShadowRootInWxmlPanel": true, + "packNpmManually": false, + "enableEngineNative": false, + "packNpmRelationList": [], + "minifyWXSS": true, + "showES6CompileOption": false, + "minifyWXML": true, + "babelSetting": { + "ignore": [], + "disablePlugins": [], + "outputPath": "" + }, + "compileWorklet": false, + "localPlugins": false, + "disableUseStrict": false, + "useCompilerPlugins": false, + "condition": false, + "swc": false, + "disableSWC": true + }, + "compileType": "miniprogram", + "condition": {}, + "appid": "touristappid", + "simulatorPluginLibVersion": {}, + "editorSetting": {} +} \ No newline at end of file diff --git a/zhican/miniprogram/project.private.config.json b/zhican/miniprogram/project.private.config.json new file mode 100644 index 0000000..c7a61d9 --- /dev/null +++ b/zhican/miniprogram/project.private.config.json @@ -0,0 +1,24 @@ +{ + "libVersion": "3.15.1", + "condition": {}, + "projectname": "miniprogram", + "setting": { + "urlCheck": true, + "coverView": true, + "lazyloadPlaceholderEnable": false, + "skylineRenderEnable": false, + "preloadBackgroundData": false, + "autoAudits": false, + "useApiHook": true, + "useApiHostProcess": true, + "showShadowRootInWxmlPanel": true, + "useStaticServer": false, + "useLanDebug": false, + "showES6CompileOption": false, + "compileHotReLoad": true, + "checkInvalidKey": true, + "ignoreDevUnusedFiles": true, + "bigPackageSizeSupport": false, + "useIsolateContext": true + } +} \ No newline at end of file diff --git a/zhican/miniprogram/sitemap.json b/zhican/miniprogram/sitemap.json new file mode 100644 index 0000000..1de189d --- /dev/null +++ b/zhican/miniprogram/sitemap.json @@ -0,0 +1,8 @@ +{ + "rules": [ + { + "action": "allow", + "page": "*" + } + ] +} diff --git a/zhican/miniprogram/utils/request.js b/zhican/miniprogram/utils/request.js new file mode 100644 index 0000000..2017112 --- /dev/null +++ b/zhican/miniprogram/utils/request.js @@ -0,0 +1,33 @@ +const app = getApp() + +const request = (options) => { + return new Promise((resolve, reject) => { + wx.request({ + url: app.globalData.baseUrl + options.url, + method: options.method || 'GET', + data: options.data || {}, + header: { + 'Content-Type': 'application/json', + Authorization: `Bearer ${app.globalData.token}`, + ...options.header, + }, + success(res) { + if (res.data.code === 0) { + resolve(res.data.data) + } else if (res.data.code === 401) { + wx.navigateTo({ url: '/pages/profile/index' }) + reject(new Error('未登录')) + } else { + wx.showToast({ title: res.data.msg || '请求失败', icon: 'none' }) + reject(new Error(res.data.msg)) + } + }, + fail(err) { + wx.showToast({ title: '网络错误', icon: 'none' }) + reject(err) + }, + }) + }) +} + +module.exports = { request } diff --git a/zhican/package-lock.json b/zhican/package-lock.json new file mode 100644 index 0000000..90d6941 --- /dev/null +++ b/zhican/package-lock.json @@ -0,0 +1,3237 @@ +{ + "name": "zhican", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "zhican", + "version": "1.0.0", + "workspaces": [ + "admin" + ] + }, + "admin": { + "name": "zhican-admin", + "version": "1.0.0", + "dependencies": { + "@ant-design/icons-vue": "^7.0.1", + "ant-design-vue": "^4.2.6", + "axios": "^1.7.9", + "dayjs": "^1.11.13", + "pinia": "^2.3.0", + "vue": "^3.5.13", + "vue-router": "^4.5.0" + }, + "devDependencies": { + "@vitejs/plugin-vue": "^5.2.1", + "sass": "^1.83.0", + "typescript": "^5.7.2", + "unplugin-auto-import": "^0.18.6", + "unplugin-vue-components": "^0.27.5", + "vite": "^6.0.5", + "vue-tsc": "^2.2.0" + } + }, + "node_modules/@ant-design/colors": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/@ant-design/colors/-/colors-6.0.0.tgz", + "integrity": "sha512-qAZRvPzfdWHtfameEGP2Qvuf838NhergR35o+EuVyB5XvSA98xod5r4utvi4TJ3ywmevm290g9nsCG5MryrdWQ==", + "license": "MIT", + "dependencies": { + "@ctrl/tinycolor": "^3.4.0" + } + }, + "node_modules/@ant-design/icons-svg": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/@ant-design/icons-svg/-/icons-svg-4.4.2.tgz", + "integrity": "sha512-vHbT+zJEVzllwP+CM+ul7reTEfBR0vgxFe7+lREAsAA7YGsYpboiq2sQNeQeRvh09GfQgs/GyFEvZpJ9cLXpXA==", + "license": "MIT" + }, + "node_modules/@ant-design/icons-vue": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/@ant-design/icons-vue/-/icons-vue-7.0.1.tgz", + "integrity": "sha512-eCqY2unfZK6Fe02AwFlDHLfoyEFreP6rBwAZMIJ1LugmfMiVgwWDYlp1YsRugaPtICYOabV1iWxXdP12u9U43Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-svg": "^4.2.1" + }, + "peerDependencies": { + "vue": ">=3.0.3" + } + }, + "node_modules/@antfu/utils": { + "version": "0.7.10", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.10.tgz", + "integrity": "sha512-+562v9k4aI80m1+VuMHehNJWLOFjBnXn3tdOitzD0il5b7smkSBal4+a3oKiQTbrwMmN/TBUMDvbdoWDehgOww==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/@babel/helper-string-parser": { + "version": "7.27.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", + "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.28.5", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.28.5.tgz", + "integrity": "sha512-qSs4ifwzKJSV39ucNjsvc6WVHs6b7S03sOh2OcHF9UHfVPqWWALUsNUVzhSBiItjRZoLHx7nIarVjqKVusUZ1Q==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/parser": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.29.2.tgz", + "integrity": "sha512-4GgRzy/+fsBa72/RZVJmGKPmZu9Byn8o4MoLpmNe1m8ZfYnz5emHLQz3U4gLud6Zwl0RZIcgiLD7Uq7ySFuDLA==", + "license": "MIT", + "dependencies": { + "@babel/types": "^7.29.0" + }, + "bin": { + "parser": "bin/babel-parser.js" + }, + "engines": { + "node": ">=6.0.0" + } + }, + "node_modules/@babel/runtime": { + "version": "7.29.2", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.29.2.tgz", + "integrity": "sha512-JiDShH45zKHWyGe4ZNVRrCjBz8Nh9TMmZG1kh4QTK8hCBTWBi8Da+i7s1fJw7/lYpM4ccepSNfqzZ/QvABBi5g==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/types": { + "version": "7.29.0", + "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.29.0.tgz", + "integrity": "sha512-LwdZHpScM4Qz8Xw2iKSzS+cfglZzJGvofQICy7W7v4caru4EaAmyUuO6BGrbyQ2mYV11W0U8j5mBhd14dd3B0A==", + "license": "MIT", + "dependencies": { + "@babel/helper-string-parser": "^7.27.1", + "@babel/helper-validator-identifier": "^7.28.5" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@ctrl/tinycolor": { + "version": "3.6.1", + "resolved": "https://registry.npmjs.org/@ctrl/tinycolor/-/tinycolor-3.6.1.tgz", + "integrity": "sha512-SITSV6aIXsuVNV3f3O0f2n/cgyEDWoSqtZMYiAmcsYHydcKrOz3gUxB/iXd/Qf08+IZX4KpgNbvUdMBmWz+kcA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/@emotion/hash": { + "version": "0.9.2", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.2.tgz", + "integrity": "sha512-MyqliTZGuOm3+5ZRSaaBGP3USLw6+EGykkwZns2EPC5g8jJ4z9OrdZY9apkl3+UP9+sdz76YYkwCKP5gh8iY3g==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.12.tgz", + "integrity": "sha512-Hhmwd6CInZ3dwpuGTF8fJG6yoWmsToE+vYgD4nytZVxcu1ulHpUQRAB1UJ8+N1Am3Mz4+xOByoQoSZf4D+CpkA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.12.tgz", + "integrity": "sha512-VJ+sKvNA/GE7Ccacc9Cha7bpS8nyzVv0jdVgwNDaR4gDMC/2TTRc33Ip8qrNYUcpkOHUT5OZ0bUcNNVZQ9RLlg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.12.tgz", + "integrity": "sha512-6AAmLG7zwD1Z159jCKPvAxZd4y/VTO0VkprYy+3N2FtJ8+BQWFXU+OxARIwA46c5tdD9SsKGZ/1ocqBS/gAKHg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.12.tgz", + "integrity": "sha512-5jbb+2hhDHx5phYR2By8GTWEzn6I9UqR11Kwf22iKbNpYrsmRB18aX/9ivc5cabcUiAT/wM+YIZ6SG9QO6a8kg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.12.tgz", + "integrity": "sha512-N3zl+lxHCifgIlcMUP5016ESkeQjLj/959RxxNYIthIg+CQHInujFuXeWbWMgnTo4cp5XVHqFPmpyu9J65C1Yg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.12.tgz", + "integrity": "sha512-HQ9ka4Kx21qHXwtlTUVbKJOAnmG1ipXhdWTmNXiPzPfWKpXqASVcWdnf2bnL73wgjNrFXAa3yYvBSd9pzfEIpA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.12.tgz", + "integrity": "sha512-gA0Bx759+7Jve03K1S0vkOu5Lg/85dou3EseOGUes8flVOGxbhDDh/iZaoek11Y8mtyKPGF3vP8XhnkDEAmzeg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.12.tgz", + "integrity": "sha512-TGbO26Yw2xsHzxtbVFGEXBFH0FRAP7gtcPE7P5yP7wGy7cXK2oO7RyOhL5NLiqTlBh47XhmIUXuGciXEqYFfBQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.12.tgz", + "integrity": "sha512-lPDGyC1JPDou8kGcywY0YILzWlhhnRjdof3UlcoqYmS9El818LLfJJc3PXXgZHrHCAKs/Z2SeZtDJr5MrkxtOw==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.12.tgz", + "integrity": "sha512-8bwX7a8FghIgrupcxb4aUmYDLp8pX06rGh5HqDT7bB+8Rdells6mHvrFHHW2JAOPZUbnjUpKTLg6ECyzvas2AQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.12.tgz", + "integrity": "sha512-0y9KrdVnbMM2/vG8KfU0byhUN+EFCny9+8g202gYqSSVMonbsCfLjUO+rCci7pM0WBEtz+oK/PIwHkzxkyharA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.12.tgz", + "integrity": "sha512-h///Lr5a9rib/v1GGqXVGzjL4TMvVTv+s1DPoxQdz7l/AYv6LDSxdIwzxkrPW438oUXiDtwM10o9PmwS/6Z0Ng==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.12.tgz", + "integrity": "sha512-iyRrM1Pzy9GFMDLsXn1iHUm18nhKnNMWscjmp4+hpafcZjrr2WbT//d20xaGljXDBYHqRcl8HnxbX6uaA/eGVw==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.12.tgz", + "integrity": "sha512-9meM/lRXxMi5PSUqEXRCtVjEZBGwB7P/D4yT8UG/mwIdze2aV4Vo6U5gD3+RsoHXKkHCfSxZKzmDssVlRj1QQA==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.12.tgz", + "integrity": "sha512-Zr7KR4hgKUpWAwb1f3o5ygT04MzqVrGEGXGLnj15YQDJErYu/BGg+wmFlIDOdJp0PmB0lLvxFIOXZgFRrdjR0w==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.12.tgz", + "integrity": "sha512-MsKncOcgTNvdtiISc/jZs/Zf8d0cl/t3gYWX8J9ubBnVOwlk65UIEEvgBORTiljloIWnBzLs4qhzPkJcitIzIg==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.12.tgz", + "integrity": "sha512-uqZMTLr/zR/ed4jIGnwSLkaHmPjOjJvnm6TVVitAa08SLS9Z0VM8wIRx7gWbJB5/J54YuIMInDquWyYvQLZkgw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.12.tgz", + "integrity": "sha512-xXwcTq4GhRM7J9A8Gv5boanHhRa/Q9KLVmcyXHCTaM4wKfIpWkdXiMog/KsnxzJ0A1+nD+zoecuzqPmCRyBGjg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.12.tgz", + "integrity": "sha512-Ld5pTlzPy3YwGec4OuHh1aCVCRvOXdH8DgRjfDy/oumVovmuSzWfnSJg+VtakB9Cm0gxNO9BzWkj6mtO1FMXkQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.12.tgz", + "integrity": "sha512-fF96T6KsBo/pkQI950FARU9apGNTSlZGsv1jZBAlcLL1MLjLNIWPBkj5NlSz8aAzYKg+eNqknrUJ24QBybeR5A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.12.tgz", + "integrity": "sha512-MZyXUkZHjQxUvzK7rN8DJ3SRmrVrke8ZyRusHlP+kuwqTcfWLyqMOE3sScPPyeIXN/mDJIfGXvcMqCgYKekoQw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/openharmony-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/openharmony-arm64/-/openharmony-arm64-0.25.12.tgz", + "integrity": "sha512-rm0YWsqUSRrjncSXGA7Zv78Nbnw4XL6/dzr20cyrQf7ZmRcsovpcRBdhD43Nuk3y7XIoW2OxMVvwuRvk9XdASg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.12.tgz", + "integrity": "sha512-3wGSCDyuTHQUzt0nV7bocDy72r2lI33QL3gkDNGkod22EsYl04sMf0qLb8luNKTOmgF/eDEDP5BFNwoBKH441w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.12.tgz", + "integrity": "sha512-rMmLrur64A7+DKlnSuwqUdRKyd3UE7oPJZmnljqEptesKM8wx9J8gx5u0+9Pq0fQQW8vqeKebwNXdfOyP+8Bsg==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.12.tgz", + "integrity": "sha512-HkqnmmBoCbCwxUKKNPBixiWDGCpQGVsrQfJoVGYLPT41XWF8lHuE5N6WhVia2n4o5QK5M4tYr21827fNhi4byQ==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.12.tgz", + "integrity": "sha512-alJC0uCZpTFrSL0CCDjcgleBXPnCrEAhTBILpeAp7M/OFgoqtAetfBzX0xM00MUsVVPpVjlPuMbREqnZCXaTnA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=18" + } + }, + "node_modules/@jridgewell/sourcemap-codec": { + "version": "1.5.5", + "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", + "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", + "license": "MIT" + }, + "node_modules/@nodelib/fs.scandir": { + "version": "2.1.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", + "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "2.0.5", + "run-parallel": "^1.1.9" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.stat": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", + "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/@nodelib/fs.walk": { + "version": "1.2.8", + "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", + "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.scandir": "2.1.5", + "fastq": "^1.6.0" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.5.6.tgz", + "integrity": "sha512-tmmZ3lQxAe/k/+rNnXQRawJ4NjxO2hqiOLTHvWchtGZULp4RyFeh6aU4XdOYBFe2KE1oShQTv4AblOs2iOrNnQ==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "dependencies": { + "detect-libc": "^2.0.3", + "is-glob": "^4.0.3", + "node-addon-api": "^7.0.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.5.6", + "@parcel/watcher-darwin-arm64": "2.5.6", + "@parcel/watcher-darwin-x64": "2.5.6", + "@parcel/watcher-freebsd-x64": "2.5.6", + "@parcel/watcher-linux-arm-glibc": "2.5.6", + "@parcel/watcher-linux-arm-musl": "2.5.6", + "@parcel/watcher-linux-arm64-glibc": "2.5.6", + "@parcel/watcher-linux-arm64-musl": "2.5.6", + "@parcel/watcher-linux-x64-glibc": "2.5.6", + "@parcel/watcher-linux-x64-musl": "2.5.6", + "@parcel/watcher-win32-arm64": "2.5.6", + "@parcel/watcher-win32-ia32": "2.5.6", + "@parcel/watcher-win32-x64": "2.5.6" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.5.6.tgz", + "integrity": "sha512-YQxSS34tPF/6ZG7r/Ih9xy+kP/WwediEUsqmtf0cuCV5TPPKw/PQHRhueUo6JdeFJaqV3pyjm0GdYjZotbRt/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.5.6.tgz", + "integrity": "sha512-Z2ZdrnwyXvvvdtRHLmM4knydIdU9adO3D4n/0cVipF3rRiwP+3/sfzpAwA/qKFL6i1ModaabkU7IbpeMBgiVEA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.5.6.tgz", + "integrity": "sha512-HgvOf3W9dhithcwOWX9uDZyn1lW9R+7tPZ4sug+NGrGIo4Rk1hAXLEbcH1TQSqxts0NYXXlOWqVpvS1SFS4fRg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.5.6.tgz", + "integrity": "sha512-vJVi8yd/qzJxEKHkeemh7w3YAn6RJCtYlE4HPMoVnCpIXEzSrxErBW5SJBgKLbXU3WdIpkjBTeUNtyBVn8TRng==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.5.6.tgz", + "integrity": "sha512-9JiYfB6h6BgV50CCfasfLf/uvOcJskMSwcdH1PHH9rvS1IrNy8zad6IUVPVUfmXr+u+Km9IxcfMLzgdOudz9EQ==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-musl/-/watcher-linux-arm-musl-2.5.6.tgz", + "integrity": "sha512-Ve3gUCG57nuUUSyjBq/MAM0CzArtuIOxsBdQ+ftz6ho8n7s1i9E1Nmk/xmP323r2YL0SONs1EuwqBp2u1k5fxg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.5.6.tgz", + "integrity": "sha512-f2g/DT3NhGPdBmMWYoxixqYr3v/UXcmLOYy16Bx0TM20Tchduwr4EaCbmxh1321TABqPGDpS8D/ggOTaljijOA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.5.6.tgz", + "integrity": "sha512-qb6naMDGlbCwdhLj6hgoVKJl2odL34z2sqkC7Z6kzir8b5W65WYDpLB6R06KabvZdgoHI/zxke4b3zR0wAbDTA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.5.6.tgz", + "integrity": "sha512-kbT5wvNQlx7NaGjzPFu8nVIW1rWqV780O7ZtkjuWaPUgpv2NMFpjYERVi0UYj1msZNyCzGlaCWEtzc+exjMGbQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.5.6.tgz", + "integrity": "sha512-1JRFeC+h7RdXwldHzTsmdtYR/Ku8SylLgTU/reMuqdVD7CtLwf0VR1FqeprZ0eHQkO0vqsbvFLXUmYm/uNKJBg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.5.6.tgz", + "integrity": "sha512-3ukyebjc6eGlw9yRt678DxVF7rjXatWiHvTXqphZLvo7aC5NdEgFufVwjFfY51ijYEWpXbqF5jtrK275z52D4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.5.6.tgz", + "integrity": "sha512-k35yLp1ZMwwee3Ez/pxBi5cf4AoBKYXj00CZ80jUz5h8prpiaQsiRPKQMxoLstNuqe2vR4RNPEAEcjEFzhEz/g==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.5.6", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.5.6.tgz", + "integrity": "sha512-hbQlYcCq5dlAX9Qx+kFb0FHue6vbjlf0FrNzSKdYK2APUf7tGfGxQCk2ihEREmbR6ZMc0MVAD5RIX/41gpUzTw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@rollup/pluginutils": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/@rollup/pluginutils/-/pluginutils-5.3.0.tgz", + "integrity": "sha512-5EdhGZtnu3V88ces7s53hhfK5KSASnJZv8Lulpc04cWO3REESroJXg73DFsOmgbU2BhwV0E20bu2IDZb3VKW4Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0", + "estree-walker": "^2.0.2", + "picomatch": "^4.0.2" + }, + "engines": { + "node": ">=14.0.0" + }, + "peerDependencies": { + "rollup": "^1.20.0||^2.0.0||^3.0.0||^4.0.0" + }, + "peerDependenciesMeta": { + "rollup": { + "optional": true + } + } + }, + "node_modules/@rollup/rollup-android-arm-eabi": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.60.1.tgz", + "integrity": "sha512-d6FinEBLdIiK+1uACUttJKfgZREXrF0Qc2SmLII7W2AD8FfiZ9Wjd+rD/iRuf5s5dWrr1GgwXCvPqOuDquOowA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-android-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.60.1.tgz", + "integrity": "sha512-YjG/EwIDvvYI1YvYbHvDz/BYHtkY4ygUIXHnTdLhG+hKIQFBiosfWiACWortsKPKU/+dUwQQCKQM3qrDe8c9BA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ] + }, + "node_modules/@rollup/rollup-darwin-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.60.1.tgz", + "integrity": "sha512-mjCpF7GmkRtSJwon+Rq1N8+pI+8l7w5g9Z3vWj4T7abguC4Czwi3Yu/pFaLvA3TTeMVjnu3ctigusqWUfjZzvw==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-darwin-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.60.1.tgz", + "integrity": "sha512-haZ7hJ1JT4e9hqkoT9R/19XW2QKqjfJVv+i5AGg57S+nLk9lQnJ1F/eZloRO3o9Scy9CM3wQ9l+dkXtcBgN5Ew==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ] + }, + "node_modules/@rollup/rollup-freebsd-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.60.1.tgz", + "integrity": "sha512-czw90wpQq3ZsAVBlinZjAYTKduOjTywlG7fEeWKUA7oCmpA8xdTkxZZlwNJKWqILlq0wehoZcJYfBvOyhPTQ6w==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-freebsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.60.1.tgz", + "integrity": "sha512-KVB2rqsxTHuBtfOeySEyzEOB7ltlB/ux38iu2rBQzkjbwRVlkhAGIEDiiYnO2kFOkJp+Z7pUXKyrRRFuFUKt+g==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ] + }, + "node_modules/@rollup/rollup-linux-arm-gnueabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.60.1.tgz", + "integrity": "sha512-L+34Qqil+v5uC0zEubW7uByo78WOCIrBvci69E7sFASRl0X7b/MB6Cqd1lky/CtcSVTydWa2WZwFuWexjS5o6g==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm-musleabihf": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.60.1.tgz", + "integrity": "sha512-n83O8rt4v34hgFzlkb1ycniJh7IR5RCIqt6mz1VRJD6pmhRi0CXdmfnLu9dIUS6buzh60IvACM842Ffb3xd6Gg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.60.1.tgz", + "integrity": "sha512-Nql7sTeAzhTAja3QXeAI48+/+GjBJ+QmAH13snn0AJSNL50JsDqotyudHyMbO2RbJkskbMbFJfIJKWA6R1LCJQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-arm64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.60.1.tgz", + "integrity": "sha512-+pUymDhd0ys9GcKZPPWlFiZ67sTWV5UU6zOJat02M1+PiuSGDziyRuI/pPue3hoUwm2uGfxdL+trT6Z9rxnlMA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-gnu/-/rollup-linux-loong64-gnu-4.60.1.tgz", + "integrity": "sha512-VSvgvQeIcsEvY4bKDHEDWcpW4Yw7BtlKG1GUT4FzBUlEKQK0rWHYBqQt6Fm2taXS+1bXvJT6kICu5ZwqKCnvlQ==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-loong64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loong64-musl/-/rollup-linux-loong64-musl-4.60.1.tgz", + "integrity": "sha512-4LqhUomJqwe641gsPp6xLfhqWMbQV04KtPp7/dIp0nzPxAkNY1AbwL5W0MQpcalLYk07vaW9Kp1PBhdpZYYcEw==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-gnu/-/rollup-linux-ppc64-gnu-4.60.1.tgz", + "integrity": "sha512-tLQQ9aPvkBxOc/EUT6j3pyeMD6Hb8QF2BTBnCQWP/uu1lhc9AIrIjKnLYMEroIz/JvtGYgI9dF3AxHZNaEH0rw==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-ppc64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-ppc64-musl/-/rollup-linux-ppc64-musl-4.60.1.tgz", + "integrity": "sha512-RMxFhJwc9fSXP6PqmAz4cbv3kAyvD1etJFjTx4ONqFP9DkTkXsAMU4v3Vyc5BgzC+anz7nS/9tp4obsKfqkDHg==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.60.1.tgz", + "integrity": "sha512-QKgFl+Yc1eEk6MmOBfRHYF6lTxiiiV3/z/BRrbSiW2I7AFTXoBFvdMEyglohPj//2mZS4hDOqeB0H1ACh3sBbg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-riscv64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.60.1.tgz", + "integrity": "sha512-RAjXjP/8c6ZtzatZcA1RaQr6O1TRhzC+adn8YZDnChliZHviqIjmvFwHcxi4JKPSDAt6Uhf/7vqcBzQJy0PDJg==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.60.1.tgz", + "integrity": "sha512-wcuocpaOlaL1COBYiA89O6yfjlp3RwKDeTIA0hM7OpmhR1Bjo9j31G1uQVpDlTvwxGn2nQs65fBFL5UFd76FcQ==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.60.1.tgz", + "integrity": "sha512-77PpsFQUCOiZR9+LQEFg9GClyfkNXj1MP6wRnzYs0EeWbPcHs02AXu4xuUbM1zhwn3wqaizle3AEYg5aeoohhg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-linux-x64-musl": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.60.1.tgz", + "integrity": "sha512-5cIATbk5vynAjqqmyBjlciMJl1+R/CwX9oLk/EyiFXDWd95KpHdrOJT//rnUl4cUcskrd0jCCw3wpZnhIHdD9w==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ] + }, + "node_modules/@rollup/rollup-openbsd-x64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openbsd-x64/-/rollup-openbsd-x64-4.60.1.tgz", + "integrity": "sha512-cl0w09WsCi17mcmWqqglez9Gk8isgeWvoUZ3WiJFYSR3zjBQc2J5/ihSjpl+VLjPqjQ/1hJRcqBfLjssREQILw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ] + }, + "node_modules/@rollup/rollup-openharmony-arm64": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-openharmony-arm64/-/rollup-openharmony-arm64-4.60.1.tgz", + "integrity": "sha512-4Cv23ZrONRbNtbZa37mLSueXUCtN7MXccChtKpUnQNgF010rjrjfHx3QxkS2PI7LqGT5xXyYs1a7LbzAwT0iCA==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openharmony" + ] + }, + "node_modules/@rollup/rollup-win32-arm64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.60.1.tgz", + "integrity": "sha512-i1okWYkA4FJICtr7KpYzFpRTHgy5jdDbZiWfvny21iIKky5YExiDXP+zbXzm3dUcFpkEeYNHgQ5fuG236JPq0g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-ia32-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.60.1.tgz", + "integrity": "sha512-u09m3CuwLzShA0EYKMNiFgcjjzwqtUMLmuCJLeZWjjOYA3IT2Di09KaxGBTP9xVztWyIWjVdsB2E9goMjZvTQg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-gnu": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-gnu/-/rollup-win32-x64-gnu-4.60.1.tgz", + "integrity": "sha512-k+600V9Zl1CM7eZxJgMyTUzmrmhB/0XZnF4pRypKAlAgxmedUA+1v9R+XOFv56W4SlHEzfeMtzujLJD22Uz5zg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@rollup/rollup-win32-x64-msvc": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.60.1.tgz", + "integrity": "sha512-lWMnixq/QzxyhTV6NjQJ4SFo1J6PvOX8vUx5Wb4bBPsEb+8xZ89Bz6kOXpfXj9ak9AHTQVQzlgzBEc1SyM27xQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ] + }, + "node_modules/@simonwep/pickr": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/@simonwep/pickr/-/pickr-1.8.2.tgz", + "integrity": "sha512-/l5w8BIkrpP6n1xsetx9MWPWlU6OblN5YgZZphxan0Tq4BByTCETL6lyIeY8lagalS2Nbt4F2W034KHLIiunKA==", + "license": "MIT", + "dependencies": { + "core-js": "^3.15.1", + "nanopop": "^2.1.0" + } + }, + "node_modules/@types/estree": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.8.tgz", + "integrity": "sha512-dWHzHa2WqEXI/O1E9OjrocMTKJl2mSrEolh1Iomrv6U+JuNwaHXsXx9bLu5gG7BUWFIN0skIQJQ/L1rIex4X6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/@vitejs/plugin-vue": { + "version": "5.2.4", + "resolved": "https://registry.npmjs.org/@vitejs/plugin-vue/-/plugin-vue-5.2.4.tgz", + "integrity": "sha512-7Yx/SXSOcQq5HiiV3orevHUFn+pmMB4cgbEkDYgnkUWb0WfeQ/wa2yFv6D5ICiCQOVpjA7vYDXrC7AGO8yjDHA==", + "dev": true, + "license": "MIT", + "engines": { + "node": "^18.0.0 || >=20.0.0" + }, + "peerDependencies": { + "vite": "^5.0.0 || ^6.0.0", + "vue": "^3.2.25" + } + }, + "node_modules/@volar/language-core": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/language-core/-/language-core-2.4.15.tgz", + "integrity": "sha512-3VHw+QZU0ZG9IuQmzT68IyN4hZNd9GchGPhbD9+pa8CVv7rnoOZwo7T8weIbrRmihqy3ATpdfXFnqRrfPVK6CA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/source-map": "2.4.15" + } + }, + "node_modules/@volar/source-map": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/source-map/-/source-map-2.4.15.tgz", + "integrity": "sha512-CPbMWlUN6hVZJYGcU/GSoHu4EnCHiLaXI9n8c9la6RaI9W5JHX+NqG+GSQcB0JdC2FIBLdZJwGsfKyBB71VlTg==", + "dev": true, + "license": "MIT" + }, + "node_modules/@volar/typescript": { + "version": "2.4.15", + "resolved": "https://registry.npmjs.org/@volar/typescript/-/typescript-2.4.15.tgz", + "integrity": "sha512-2aZ8i0cqPGjXb4BhkMsPYDkkuc2ZQ6yOpqwAuNwUoncELqoy5fRgOQtLR9gB0g902iS0NAkvpIzs27geVyVdPg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "path-browserify": "^1.0.1", + "vscode-uri": "^3.0.8" + } + }, + "node_modules/@vue/compiler-core": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-core/-/compiler-core-3.5.32.tgz", + "integrity": "sha512-4x74Tbtqnda8s/NSD6e1Dr5p1c8HdMU5RWSjMSUzb8RTcUQqevDCxVAitcLBKT+ie3o0Dl9crc/S/opJM7qBGQ==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/shared": "3.5.32", + "entities": "^7.0.1", + "estree-walker": "^2.0.2", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-dom/-/compiler-dom-3.5.32.tgz", + "integrity": "sha512-ybHAu70NtiEI1fvAUz3oXZqkUYEe5J98GjMDpTGl5iHb0T15wQYLR4wE3h9xfuTNA+Cm2f4czfe8B4s+CCH57Q==", + "license": "MIT", + "dependencies": { + "@vue/compiler-core": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/compiler-sfc": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-sfc/-/compiler-sfc-3.5.32.tgz", + "integrity": "sha512-8UYUYo71cP/0YHMO814TRZlPuUUw3oifHuMR7Wp9SNoRSrxRQnhMLNlCeaODNn6kNTJsjFoQ/kqIj4qGvya4Xg==", + "license": "MIT", + "dependencies": { + "@babel/parser": "^7.29.2", + "@vue/compiler-core": "3.5.32", + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32", + "estree-walker": "^2.0.2", + "magic-string": "^0.30.21", + "postcss": "^8.5.8", + "source-map-js": "^1.2.1" + } + }, + "node_modules/@vue/compiler-ssr": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/compiler-ssr/-/compiler-ssr-3.5.32.tgz", + "integrity": "sha512-Gp4gTs22T3DgRotZ8aA/6m2jMR+GMztvBXUBEUOYOcST+giyGWJ4WvFd7QLHBkzTxkfOt8IELKNdpzITLbA2rw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/compiler-vue2": { + "version": "2.7.16", + "resolved": "https://registry.npmjs.org/@vue/compiler-vue2/-/compiler-vue2-2.7.16.tgz", + "integrity": "sha512-qYC3Psj9S/mfu9uVi5WvNZIzq+xnXMhOwbTFKKDD7b1lhpnn71jXSFdTQ+WsIEk0ONCd7VV2IMm7ONl6tbQ86A==", + "dev": true, + "license": "MIT", + "dependencies": { + "de-indent": "^1.0.2", + "he": "^1.2.0" + } + }, + "node_modules/@vue/devtools-api": { + "version": "6.6.4", + "resolved": "https://registry.npmjs.org/@vue/devtools-api/-/devtools-api-6.6.4.tgz", + "integrity": "sha512-sGhTPMuXqZ1rVOk32RylztWkfXTRhuS7vgAKv0zjqk8gbsHkJ7xfFf+jbySxt7tWObEJwyKaHMikV/WGDiQm8g==", + "license": "MIT" + }, + "node_modules/@vue/language-core": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/@vue/language-core/-/language-core-2.2.12.tgz", + "integrity": "sha512-IsGljWbKGU1MZpBPN+BvPAdr55YPkj2nB/TBNGNC32Vy2qLG25DYu/NBN2vNtZqdRbTRjaoYrahLrToim2NanA==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/language-core": "2.4.15", + "@vue/compiler-dom": "^3.5.0", + "@vue/compiler-vue2": "^2.7.16", + "@vue/shared": "^3.5.0", + "alien-signals": "^1.0.3", + "minimatch": "^9.0.3", + "muggle-string": "^0.4.1", + "path-browserify": "^1.0.1" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@vue/reactivity": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/reactivity/-/reactivity-3.5.32.tgz", + "integrity": "sha512-/ORasxSGvZ6MN5gc+uE364SxFdJ0+WqVG0CENXaGW58TOCdrAW76WWaplDtECeS1qphvtBZtR+3/o1g1zL4xPQ==", + "license": "MIT", + "dependencies": { + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-core": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-core/-/runtime-core-3.5.32.tgz", + "integrity": "sha512-pDrXCejn4UpFDFmMd27AcJEbHaLemaE5o4pbb7sLk79SRIhc6/t34BQA7SGNgYtbMnvbF/HHOftYBgFJtUoJUQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/shared": "3.5.32" + } + }, + "node_modules/@vue/runtime-dom": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/runtime-dom/-/runtime-dom-3.5.32.tgz", + "integrity": "sha512-1CDVv7tv/IV13V8Nip1k/aaObVbWqRlVCVezTwx3K07p7Vxossp5JU1dcPNhJk3w347gonIUT9jQOGutyJrSVQ==", + "license": "MIT", + "dependencies": { + "@vue/reactivity": "3.5.32", + "@vue/runtime-core": "3.5.32", + "@vue/shared": "3.5.32", + "csstype": "^3.2.3" + } + }, + "node_modules/@vue/server-renderer": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/server-renderer/-/server-renderer-3.5.32.tgz", + "integrity": "sha512-IOjm2+JQwRFS7W28HNuJeXQle9KdZbODFY7hFGVtnnghF51ta20EWAZJHX+zLGtsHhaU6uC9BGPV52KVpYryMQ==", + "license": "MIT", + "dependencies": { + "@vue/compiler-ssr": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "vue": "3.5.32" + } + }, + "node_modules/@vue/shared": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/@vue/shared/-/shared-3.5.32.tgz", + "integrity": "sha512-ksNyrmRQzWJJ8n3cRDuSF7zNNontuJg1YHnmWRJd2AMu8Ij2bqwiiri2lH5rHtYPZjj4STkNcgcmiQqlOjiYGg==", + "license": "MIT" + }, + "node_modules/acorn": { + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.16.0.tgz", + "integrity": "sha512-UVJyE9MttOsBQIDKw1skb9nAwQuR5wuGD3+82K6JgJlm/Y+KI92oNsMNGZCYdDsVtRHSak0pcV5Dno5+4jh9sw==", + "dev": true, + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/alien-signals": { + "version": "1.0.13", + "resolved": "https://registry.npmjs.org/alien-signals/-/alien-signals-1.0.13.tgz", + "integrity": "sha512-OGj9yyTnJEttvzhTUWuscOvtqxq5vrhF7vL9oS0xJ2mK0ItPYP1/y+vCFebfxoEyAz0++1AIwJ5CMr+Fk3nDmg==", + "dev": true, + "license": "MIT" + }, + "node_modules/ant-design-vue": { + "version": "4.2.6", + "resolved": "https://registry.npmjs.org/ant-design-vue/-/ant-design-vue-4.2.6.tgz", + "integrity": "sha512-t7eX13Yj3i9+i5g9lqFyYneoIb3OzTvQjq9Tts1i+eiOd3Eva/6GagxBSXM1fOCjqemIu0FYVE1ByZ/38epR3Q==", + "license": "MIT", + "dependencies": { + "@ant-design/colors": "^6.0.0", + "@ant-design/icons-vue": "^7.0.0", + "@babel/runtime": "^7.10.5", + "@ctrl/tinycolor": "^3.5.0", + "@emotion/hash": "^0.9.0", + "@emotion/unitless": "^0.8.0", + "@simonwep/pickr": "~1.8.0", + "array-tree-filter": "^2.1.0", + "async-validator": "^4.0.0", + "csstype": "^3.1.1", + "dayjs": "^1.10.5", + "dom-align": "^1.12.1", + "dom-scroll-into-view": "^2.0.0", + "lodash": "^4.17.21", + "lodash-es": "^4.17.15", + "resize-observer-polyfill": "^1.5.1", + "scroll-into-view-if-needed": "^2.2.25", + "shallow-equal": "^1.0.0", + "stylis": "^4.1.3", + "throttle-debounce": "^5.0.0", + "vue-types": "^3.0.0", + "warning": "^4.0.0" + }, + "engines": { + "node": ">=12.22.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/ant-design-vue" + }, + "peerDependencies": { + "vue": ">=3.2.0" + } + }, + "node_modules/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "dev": true, + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/anymatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/array-tree-filter": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/array-tree-filter/-/array-tree-filter-2.1.0.tgz", + "integrity": "sha512-4ROwICNlNw/Hqa9v+rk5h22KjmzB1JGTMVKP2AKJBOCgb0yL0ASf0+YvCcLNNwquOHNX48jkeZIJ3a+oOQqKcw==", + "license": "MIT" + }, + "node_modules/async-validator": { + "version": "4.2.5", + "resolved": "https://registry.npmjs.org/async-validator/-/async-validator-4.2.5.tgz", + "integrity": "sha512-7HhHjtERjqlNbZtqNqy2rckN/SpOOlmDliet+lP7k+eKZEjPk3DgyeU9lIXLdeLz0uBbbVp+9Qdow9wJWgwwfg==", + "license": "MIT" + }, + "node_modules/asynckit": { + "version": "0.4.0", + "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", + "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", + "license": "MIT" + }, + "node_modules/axios": { + "version": "1.14.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-1.14.0.tgz", + "integrity": "sha512-3Y8yrqLSwjuzpXuZ0oIYZ/XGgLwUIBU3uLvbcpb0pidD9ctpShJd43KSlEEkVQg6DS0G9NKyzOvBfUtDKEyHvQ==", + "license": "MIT", + "dependencies": { + "follow-redirects": "^1.15.11", + "form-data": "^4.0.5", + "proxy-from-env": "^2.1.0" + } + }, + "node_modules/balanced-match": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", + "dev": true, + "license": "MIT" + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/brace-expansion": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.3.tgz", + "integrity": "sha512-MCV/fYJEbqx68aE58kv2cA/kiky1G8vux3OR6/jbS+jIMe/6fJWa0DTzJU7dqijOWYwHi1t29FlfYI9uytqlpA==", + "dev": true, + "license": "MIT", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "dev": true, + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/call-bind-apply-helpers": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", + "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/chokidar": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-4.0.3.tgz", + "integrity": "sha512-Qgzu8kfBvo+cA4962jnP1KkS6Dop5NS6g7R5LFYJr4b8Ub94PPQXUksCw9PvXoeXPRRddRNC5C1JQUR2SMGtnA==", + "dev": true, + "license": "MIT", + "dependencies": { + "readdirp": "^4.0.1" + }, + "engines": { + "node": ">= 14.16.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/combined-stream": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", + "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", + "license": "MIT", + "dependencies": { + "delayed-stream": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/compute-scroll-into-view": { + "version": "1.0.20", + "resolved": "https://registry.npmjs.org/compute-scroll-into-view/-/compute-scroll-into-view-1.0.20.tgz", + "integrity": "sha512-UCB0ioiyj8CRjtrvaceBLqqhZCVP+1B8+NWQhmdsm0VXOJtobBCf1dBQmebCCo34qZmUwZfIH2MZLqNHazrfjg==", + "license": "MIT" + }, + "node_modules/confbox": { + "version": "0.1.8", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.8.tgz", + "integrity": "sha512-RMtmw0iFkeR4YV+fUOSucriAQNb9g8zFR52MWCtl+cCZOFRNL6zeB395vPzFhEjjn4fMxXudmELnl/KF/WrK6w==", + "dev": true, + "license": "MIT" + }, + "node_modules/core-js": { + "version": "3.49.0", + "resolved": "https://registry.npmjs.org/core-js/-/core-js-3.49.0.tgz", + "integrity": "sha512-es1U2+YTtzpwkxVLwAFdSpaIMyQaq0PBgm3YD1W3Qpsn1NAmO3KSgZfu+oGSWVu6NvLHoHCV/aYcsE5wiB7ALg==", + "hasInstallScript": true, + "license": "MIT", + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/core-js" + } + }, + "node_modules/csstype": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.2.3.tgz", + "integrity": "sha512-z1HGKcYy2xA8AGQfwrn0PAy+PB7X/GSj3UVJW9qKyn43xWa+gl5nXmU4qqLMRzWVLFC8KusUX8T/0kCiOYpAIQ==", + "license": "MIT" + }, + "node_modules/dayjs": { + "version": "1.11.20", + "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.20.tgz", + "integrity": "sha512-YbwwqR/uYpeoP4pu043q+LTDLFBLApUP6VxRihdfNTqu4ubqMlGDLd6ErXhEgsyvY0K6nCs7nggYumAN+9uEuQ==", + "license": "MIT" + }, + "node_modules/de-indent": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/de-indent/-/de-indent-1.0.2.tgz", + "integrity": "sha512-e/1zu3xH5MQryN2zdVaF0OrdNLUbvWxzMbi+iNA6Bky7l1RoP8a2fIbRocyHclXt/arDrrR6lL3TqFD9pMQTsg==", + "dev": true, + "license": "MIT" + }, + "node_modules/debug": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.3.tgz", + "integrity": "sha512-RGwwWnwQvkVfavKVt22FGLw+xYSdzARwm0ru6DhTVA3umU5hZc28V3kO4stgYryrTlLpuvgI9GiijltAjNbcqA==", + "dev": true, + "license": "MIT", + "dependencies": { + "ms": "^2.1.3" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/delayed-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", + "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/detect-libc": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.1.2.tgz", + "integrity": "sha512-Btj2BOOO83o3WyH59e8MgXsxEQVcarkUOpEYrubB0urwnN10yQ364rsiByU11nZlqWYZm05i/of7io4mzihBtQ==", + "dev": true, + "license": "Apache-2.0", + "optional": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/dom-align": { + "version": "1.12.4", + "resolved": "https://registry.npmjs.org/dom-align/-/dom-align-1.12.4.tgz", + "integrity": "sha512-R8LUSEay/68zE5c8/3BDxiTEvgb4xZTF0RKmAHfiEVN3klfIpXfi2/QCoiWPccVQ0J/ZGdz9OjzL4uJEP/MRAw==", + "license": "MIT" + }, + "node_modules/dom-scroll-into-view": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/dom-scroll-into-view/-/dom-scroll-into-view-2.0.1.tgz", + "integrity": "sha512-bvVTQe1lfaUr1oFzZX80ce9KLDlZ3iU+XGNE/bz9HnGdklTieqsbmsLHe+rT2XWqopvL0PckkYqN7ksmm5pe3w==", + "license": "MIT" + }, + "node_modules/dunder-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", + "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.1", + "es-errors": "^1.3.0", + "gopd": "^1.2.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/entities": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/entities/-/entities-7.0.1.tgz", + "integrity": "sha512-TWrgLOFUQTH994YUyl1yT4uyavY5nNB5muff+RtWaqNVCAK408b5ZnnbNAUEWLTCpum9w6arT70i1XdQ4UeOPA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.12" + }, + "funding": { + "url": "https://github.com/fb55/entities?sponsor=1" + } + }, + "node_modules/es-define-property": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", + "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-errors": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", + "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-object-atoms": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", + "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/es-set-tostringtag": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", + "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", + "license": "MIT", + "dependencies": { + "es-errors": "^1.3.0", + "get-intrinsic": "^1.2.6", + "has-tostringtag": "^1.0.2", + "hasown": "^2.0.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/esbuild": { + "version": "0.25.12", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.12.tgz", + "integrity": "sha512-bbPBYYrtZbkt6Os6FiTLCTFxvq4tt3JKall1vRwshA3fdVztsLAatFaZobhkBC8/BrPetoa0oksYoKXoG4ryJg==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=18" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.25.12", + "@esbuild/android-arm": "0.25.12", + "@esbuild/android-arm64": "0.25.12", + "@esbuild/android-x64": "0.25.12", + "@esbuild/darwin-arm64": "0.25.12", + "@esbuild/darwin-x64": "0.25.12", + "@esbuild/freebsd-arm64": "0.25.12", + "@esbuild/freebsd-x64": "0.25.12", + "@esbuild/linux-arm": "0.25.12", + "@esbuild/linux-arm64": "0.25.12", + "@esbuild/linux-ia32": "0.25.12", + "@esbuild/linux-loong64": "0.25.12", + "@esbuild/linux-mips64el": "0.25.12", + "@esbuild/linux-ppc64": "0.25.12", + "@esbuild/linux-riscv64": "0.25.12", + "@esbuild/linux-s390x": "0.25.12", + "@esbuild/linux-x64": "0.25.12", + "@esbuild/netbsd-arm64": "0.25.12", + "@esbuild/netbsd-x64": "0.25.12", + "@esbuild/openbsd-arm64": "0.25.12", + "@esbuild/openbsd-x64": "0.25.12", + "@esbuild/openharmony-arm64": "0.25.12", + "@esbuild/sunos-x64": "0.25.12", + "@esbuild/win32-arm64": "0.25.12", + "@esbuild/win32-ia32": "0.25.12", + "@esbuild/win32-x64": "0.25.12" + } + }, + "node_modules/escape-string-regexp": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-5.0.0.tgz", + "integrity": "sha512-/veY75JbMK4j1yjvuUxuVsiS/hr/4iHs9FTT6cgTexxdE0Ly/glccBAkloH/DofkjRbZU3bnoj38mOmhkZ0lHw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/estree-walker": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-2.0.2.tgz", + "integrity": "sha512-Rfkk/Mp/DL7JVje3u18FxFujQlTNR2q6QfMSMB7AvCBx91NGj/ba3kCfza0f6dVDbw7YlRf/nDrn7pQrCCyQ/w==", + "license": "MIT" + }, + "node_modules/exsolve": { + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/exsolve/-/exsolve-1.0.8.tgz", + "integrity": "sha512-LmDxfWXwcTArk8fUEnOfSZpHOJ6zOMUJKOtFLFqJLoKJetuQG874Uc7/Kki7zFLzYybmZhp1M7+98pfMqeX8yA==", + "dev": true, + "license": "MIT" + }, + "node_modules/fast-glob": { + "version": "3.3.3", + "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.3.tgz", + "integrity": "sha512-7MptL8U0cqcFdzIzwOTHoilX9x5BrNqye7Z/LuC7kCMRio1EMSyqRK3BEAUD7sXRq4iT4AzTVuZdhgQ2TCvYLg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@nodelib/fs.stat": "^2.0.2", + "@nodelib/fs.walk": "^1.2.3", + "glob-parent": "^5.1.2", + "merge2": "^1.3.0", + "micromatch": "^4.0.8" + }, + "engines": { + "node": ">=8.6.0" + } + }, + "node_modules/fastq": { + "version": "1.20.1", + "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.20.1.tgz", + "integrity": "sha512-GGToxJ/w1x32s/D2EKND7kTil4n8OVk/9mycTc4VDza13lOvpUZTGX3mFSCtV9ksdGBVzvsyAVLM6mHFThxXxw==", + "dev": true, + "license": "ISC", + "dependencies": { + "reusify": "^1.0.4" + } + }, + "node_modules/fdir": { + "version": "6.5.0", + "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.5.0.tgz", + "integrity": "sha512-tIbYtZbucOs0BRGqPJkshJUYdL+SDH7dVM8gjy+ERp3WAUjLEFJE+02kanyHtwjWOnwrKYBiwAmM0p4kLJAnXg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12.0.0" + }, + "peerDependencies": { + "picomatch": "^3 || ^4" + }, + "peerDependenciesMeta": { + "picomatch": { + "optional": true + } + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "dev": true, + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/follow-redirects": { + "version": "1.15.11", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.11.tgz", + "integrity": "sha512-deG2P0JfjrTxl50XGCDyfI97ZGVCxIpfKYmfyrQ54n5FO/0gfIES8C/Psl6kWVDolizcaaxZJnTS0QSMxvnsBQ==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "license": "MIT", + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, + "node_modules/form-data": { + "version": "4.0.5", + "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.5.tgz", + "integrity": "sha512-8RipRLol37bNs2bhoV67fiTEvdTrbMUYcFTiy3+wuuOnUog2QBHCZWXDRijWQfAkhBj2Uf5UnVaiWwA5vdd82w==", + "license": "MIT", + "dependencies": { + "asynckit": "^0.4.0", + "combined-stream": "^1.0.8", + "es-set-tostringtag": "^2.1.0", + "hasown": "^2.0.2", + "mime-types": "^2.1.12" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/function-bind": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", + "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-intrinsic": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", + "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", + "license": "MIT", + "dependencies": { + "call-bind-apply-helpers": "^1.0.2", + "es-define-property": "^1.0.1", + "es-errors": "^1.3.0", + "es-object-atoms": "^1.1.1", + "function-bind": "^1.1.2", + "get-proto": "^1.0.1", + "gopd": "^1.2.0", + "has-symbols": "^1.1.0", + "hasown": "^2.0.2", + "math-intrinsics": "^1.1.0" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/get-proto": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", + "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", + "license": "MIT", + "dependencies": { + "dunder-proto": "^1.0.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "dev": true, + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/gopd": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", + "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-symbols": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", + "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/has-tostringtag": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", + "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", + "license": "MIT", + "dependencies": { + "has-symbols": "^1.0.3" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/hasown": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", + "license": "MIT", + "dependencies": { + "function-bind": "^1.1.2" + }, + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/he": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/he/-/he-1.2.0.tgz", + "integrity": "sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw==", + "dev": true, + "license": "MIT", + "bin": { + "he": "bin/he" + } + }, + "node_modules/immutable": { + "version": "5.1.5", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-5.1.5.tgz", + "integrity": "sha512-t7xcm2siw+hlUM68I+UEOK+z84RzmN59as9DZ7P1l0994DKUWV7UXBMQZVxaoMSRQ+PBZbHCOoBt7a2wxOMt+A==", + "dev": true, + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "dev": true, + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-plain-object": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/is-plain-object/-/is-plain-object-3.0.1.tgz", + "integrity": "sha512-Xnpx182SBMrr/aBik8y+GuR4U1L9FqMSojwDQwPMmxyC6bvEqly9UBCxhauBF5vNh2gwWJNX6oDV7O+OM4z34g==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/js-tokens": { + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.1.tgz", + "integrity": "sha512-mxa9E9ITFOt0ban3j6L5MpjwegGz6lBQmM1IJkWeBZGcMxto50+eWdjC/52xDbS2vy0k7vIMK0Fe2wfL9OQSpQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/local-pkg": { + "version": "0.5.1", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-0.5.1.tgz", + "integrity": "sha512-9rrA30MRRP3gBD3HTGnC6cDFpaE1kVDWxWgqWJUN0RvDNAo+Nz/9GxB+nHOH0ifbVFy0hSA1V6vFDvnx54lTEQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.3", + "pkg-types": "^1.2.1" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/lodash": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.18.1.tgz", + "integrity": "sha512-dMInicTPVE8d1e5otfwmmjlxkZoUpiVLwyeTdUsi/Caj/gfzzblBcCE5sRHV/AsjuCmxWrte2TNGSYuCeCq+0Q==", + "license": "MIT" + }, + "node_modules/lodash-es": { + "version": "4.18.1", + "resolved": "https://registry.npmjs.org/lodash-es/-/lodash-es-4.18.1.tgz", + "integrity": "sha512-J8xewKD/Gk22OZbhpOVSwcs60zhd95ESDwezOFuA3/099925PdHJ7OFHNTGtajL3AlZkykD32HykiMo+BIBI8A==", + "license": "MIT" + }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, + "node_modules/loose-envify/node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/magic-string": { + "version": "0.30.21", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.21.tgz", + "integrity": "sha512-vd2F4YUyEXKGcLHoq+TEyCjxueSeHnFxyyjNp80yg0XV4vUhnDer/lvvlqM/arB5bXQN5K2/3oinyCRyx8T2CQ==", + "license": "MIT", + "dependencies": { + "@jridgewell/sourcemap-codec": "^1.5.5" + } + }, + "node_modules/math-intrinsics": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", + "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", + "license": "MIT", + "engines": { + "node": ">= 0.4" + } + }, + "node_modules/merge2": { + "version": "1.4.1", + "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", + "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 8" + } + }, + "node_modules/micromatch": { + "version": "4.0.8", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", + "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", + "dev": true, + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/micromatch/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/mime-db": { + "version": "1.52.0", + "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", + "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/mime-types": { + "version": "2.1.35", + "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", + "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", + "license": "MIT", + "dependencies": { + "mime-db": "1.52.0" + }, + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/minimatch": { + "version": "9.0.9", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.9.tgz", + "integrity": "sha512-OBwBN9AL4dqmETlpS2zasx+vTeWclWzkblfZk7KTA5j3jeOONz/tRCnZomUyvNg83wL5Zv9Ss6HMJXAgL8R2Yg==", + "dev": true, + "license": "ISC", + "dependencies": { + "brace-expansion": "^2.0.2" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/mlly": { + "version": "1.8.2", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.8.2.tgz", + "integrity": "sha512-d+ObxMQFmbt10sretNDytwt85VrbkhhUA/JBGm1MPaWJ65Cl4wOgLaB1NYvJSZ0Ef03MMEU/0xpPMXUIQ29UfA==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.16.0", + "pathe": "^2.0.3", + "pkg-types": "^1.3.1", + "ufo": "^1.6.3" + } + }, + "node_modules/ms": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", + "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", + "dev": true, + "license": "MIT" + }, + "node_modules/muggle-string": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/muggle-string/-/muggle-string-0.4.1.tgz", + "integrity": "sha512-VNTrAak/KhO2i8dqqnqnAHOa3cYBwXEZe9h+D5h/1ZqFSTEFHdM65lR7RoIqq3tBBYavsOXV84NoHXZ0AkPyqQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/nanoid": { + "version": "3.3.11", + "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", + "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "bin": { + "nanoid": "bin/nanoid.cjs" + }, + "engines": { + "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" + } + }, + "node_modules/nanopop": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/nanopop/-/nanopop-2.4.2.tgz", + "integrity": "sha512-NzOgmMQ+elxxHeIha+OG/Pv3Oc3p4RU2aBhwWwAqDpXrdTbtRylbRLQztLy8dMMwfl6pclznBdfUhccEn9ZIzw==", + "license": "MIT" + }, + "node_modules/node-addon-api": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.1.tgz", + "integrity": "sha512-5m3bsyrjFWE1xf7nz7YXdN4udnVtXK6/Yfgn5qnahL6bCkf2yKt4k3nuTKAtT4r3IG8JNR2ncsIMdZuAzJjHQQ==", + "dev": true, + "license": "MIT", + "optional": true + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/path-browserify": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/path-browserify/-/path-browserify-1.0.1.tgz", + "integrity": "sha512-b7uo2UCUOYZcnF/3ID0lulOJi/bafxa1xPe7ZPsammBSpjSWQkjNxlt635YGS2MiR9GjvuXCtz2emr3jbsz98g==", + "dev": true, + "license": "MIT" + }, + "node_modules/pathe": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-2.0.3.tgz", + "integrity": "sha512-WUjGcAqP1gQacoQe+OBJsFA7Ld4DyXuUIjZ5cc75cLHvJ7dtNsTugphxIADwspS+AraAUePCKrSVtPLFj/F88w==", + "dev": true, + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", + "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz", + "integrity": "sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pinia": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/pinia/-/pinia-2.3.1.tgz", + "integrity": "sha512-khUlZSwt9xXCaTbbxFYBKDc/bWAGWJjOgvxETwkTN7KRm66EeT1ZdZj6i2ceh9sP2Pzqsbc704r2yngBrxBVug==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.3", + "vue-demi": "^0.14.10" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "typescript": ">=4.4.4", + "vue": "^2.7.0 || ^3.5.11" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/pkg-types": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.3.1.tgz", + "integrity": "sha512-/Jm5M4RvtBFVkKWRu2BLUTNP8/M2a+UwuAX+ae4770q1qVGtfjG+WTCupoZixokjmHiry8uI+dlY8KXYV5HVVQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.1.8", + "mlly": "^1.7.4", + "pathe": "^2.0.1" + } + }, + "node_modules/postcss": { + "version": "8.5.8", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.8.tgz", + "integrity": "sha512-OW/rX8O/jXnm82Ey1k44pObPtdblfiuWnrd8X7GJ7emImCOstunGbXUpp7HdBrFQX6rJzn3sPT397Wp5aCwCHg==", + "funding": [ + { + "type": "opencollective", + "url": "https://opencollective.com/postcss/" + }, + { + "type": "tidelift", + "url": "https://tidelift.com/funding/github/npm/postcss" + }, + { + "type": "github", + "url": "https://github.com/sponsors/ai" + } + ], + "license": "MIT", + "dependencies": { + "nanoid": "^3.3.11", + "picocolors": "^1.1.1", + "source-map-js": "^1.2.1" + }, + "engines": { + "node": "^10 || ^12 || >=14" + } + }, + "node_modules/proxy-from-env": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-2.1.0.tgz", + "integrity": "sha512-cJ+oHTW1VAEa8cJslgmUZrc+sjRKgAKl3Zyse6+PV38hZe/V6Z14TbCuXcan9F9ghlz4QrFr2c92TNF82UkYHA==", + "license": "MIT", + "engines": { + "node": ">=10" + } + }, + "node_modules/quansync": { + "version": "0.2.11", + "resolved": "https://registry.npmjs.org/quansync/-/quansync-0.2.11.tgz", + "integrity": "sha512-AifT7QEbW9Nri4tAwR5M/uzpBuqfZf+zwaEM/QkzEjj7NBuFD2rBuy0K3dE+8wltbezDV7JMA0WfnCPYRSYbXA==", + "dev": true, + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/antfu" + }, + { + "type": "individual", + "url": "https://github.com/sponsors/sxzz" + } + ], + "license": "MIT" + }, + "node_modules/queue-microtask": { + "version": "1.2.3", + "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", + "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-4.1.2.tgz", + "integrity": "sha512-GDhwkLfywWL2s6vEjyhri+eXmfH6j1L7JE27WhqLeYzoh/A3DBaYGEj2H/HFZCn/kMfim73FXxEJTw06WtxQwg==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 14.18.0" + }, + "funding": { + "type": "individual", + "url": "https://paulmillr.com/funding/" + } + }, + "node_modules/resize-observer-polyfill": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", + "integrity": "sha512-LwZrotdHOo12nQuZlHEmtuXdqGoOD0OhaxopaNFxWzInpEgaLWoVuAMbTzixuosCx2nEG58ngzW3vxdWoxIgdg==", + "license": "MIT" + }, + "node_modules/reusify": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.1.0.tgz", + "integrity": "sha512-g6QUff04oZpHs0eG5p83rFLhHeV00ug/Yf9nZM6fLeUrPguBTkTQOdpAWWspMh55TZfVQDPaN3NQJfbVRAxdIw==", + "dev": true, + "license": "MIT", + "engines": { + "iojs": ">=1.0.0", + "node": ">=0.10.0" + } + }, + "node_modules/rollup": { + "version": "4.60.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.60.1.tgz", + "integrity": "sha512-VmtB2rFU/GroZ4oL8+ZqXgSA38O6GR8KSIvWmEFv63pQ0G6KaBH9s07PO8XTXP4vI+3UJUEypOfjkGfmSBBR0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "1.0.8" + }, + "bin": { + "rollup": "dist/bin/rollup" + }, + "engines": { + "node": ">=18.0.0", + "npm": ">=8.0.0" + }, + "optionalDependencies": { + "@rollup/rollup-android-arm-eabi": "4.60.1", + "@rollup/rollup-android-arm64": "4.60.1", + "@rollup/rollup-darwin-arm64": "4.60.1", + "@rollup/rollup-darwin-x64": "4.60.1", + "@rollup/rollup-freebsd-arm64": "4.60.1", + "@rollup/rollup-freebsd-x64": "4.60.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.60.1", + "@rollup/rollup-linux-arm-musleabihf": "4.60.1", + "@rollup/rollup-linux-arm64-gnu": "4.60.1", + "@rollup/rollup-linux-arm64-musl": "4.60.1", + "@rollup/rollup-linux-loong64-gnu": "4.60.1", + "@rollup/rollup-linux-loong64-musl": "4.60.1", + "@rollup/rollup-linux-ppc64-gnu": "4.60.1", + "@rollup/rollup-linux-ppc64-musl": "4.60.1", + "@rollup/rollup-linux-riscv64-gnu": "4.60.1", + "@rollup/rollup-linux-riscv64-musl": "4.60.1", + "@rollup/rollup-linux-s390x-gnu": "4.60.1", + "@rollup/rollup-linux-x64-gnu": "4.60.1", + "@rollup/rollup-linux-x64-musl": "4.60.1", + "@rollup/rollup-openbsd-x64": "4.60.1", + "@rollup/rollup-openharmony-arm64": "4.60.1", + "@rollup/rollup-win32-arm64-msvc": "4.60.1", + "@rollup/rollup-win32-ia32-msvc": "4.60.1", + "@rollup/rollup-win32-x64-gnu": "4.60.1", + "@rollup/rollup-win32-x64-msvc": "4.60.1", + "fsevents": "~2.3.2" + } + }, + "node_modules/run-parallel": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", + "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", + "dev": true, + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "queue-microtask": "^1.2.2" + } + }, + "node_modules/sass": { + "version": "1.99.0", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.99.0.tgz", + "integrity": "sha512-kgW13M54DUB7IsIRM5LvJkNlpH+WhMpooUcaWGFARkF1Tc82v9mIWkCbCYf+MBvpIUBSeSOTilpZjEPr2VYE6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "chokidar": "^4.0.0", + "immutable": "^5.1.5", + "source-map-js": ">=0.6.2 <2.0.0" + }, + "bin": { + "sass": "sass.js" + }, + "engines": { + "node": ">=14.0.0" + }, + "optionalDependencies": { + "@parcel/watcher": "^2.4.1" + } + }, + "node_modules/scroll-into-view-if-needed": { + "version": "2.2.31", + "resolved": "https://registry.npmjs.org/scroll-into-view-if-needed/-/scroll-into-view-if-needed-2.2.31.tgz", + "integrity": "sha512-dGCXy99wZQivjmjIqihaBQNjryrz5rueJY7eHfTdyWEiR4ttYpsajb14rn9s5d4DY4EcY6+4+U/maARBXJedkA==", + "license": "MIT", + "dependencies": { + "compute-scroll-into-view": "^1.0.20" + } + }, + "node_modules/scule": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/scule/-/scule-1.3.0.tgz", + "integrity": "sha512-6FtHJEvt+pVMIB9IBY+IcCJ6Z5f1iQnytgyfKMhDKgmzYG+TeH/wx1y3l27rshSbLiSanrR9ffZDrEsmjlQF2g==", + "dev": true, + "license": "MIT" + }, + "node_modules/shallow-equal": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/shallow-equal/-/shallow-equal-1.2.1.tgz", + "integrity": "sha512-S4vJDjHHMBaiZuT9NPb616CSmLf618jawtv3sufLl6ivK8WocjAo58cXwbRV1cgqxH0Qbv+iUt6m05eqEa2IRA==", + "license": "MIT" + }, + "node_modules/source-map-js": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", + "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/strip-literal": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.1.tgz", + "integrity": "sha512-631UJ6O00eNGfMiWG78ck80dfBab8X6IVFB51jZK5Icd7XAs60Z5y7QdSd/wGIklnWvRbUNloVzhOKKmutxQ6Q==", + "dev": true, + "license": "MIT", + "dependencies": { + "js-tokens": "^9.0.1" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/stylis": { + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.3.6.tgz", + "integrity": "sha512-yQ3rwFWRfwNUY7H5vpU0wfdkNSnvnJinhF9830Swlaxl03zsOjCfmX0ugac+3LtK0lYSgwL/KXc8oYL3mG4YFQ==", + "license": "MIT" + }, + "node_modules/throttle-debounce": { + "version": "5.0.2", + "resolved": "https://registry.npmjs.org/throttle-debounce/-/throttle-debounce-5.0.2.tgz", + "integrity": "sha512-B71/4oyj61iNH0KeCamLuE2rmKuTO5byTOSVwECM5FA7TiAiAW+UqTKZ9ERueC4qvgSttUhdmq1mXC3kJqGX7A==", + "license": "MIT", + "engines": { + "node": ">=12.22" + } + }, + "node_modules/tinyglobby": { + "version": "0.2.15", + "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.15.tgz", + "integrity": "sha512-j2Zq4NyQYG5XMST4cbs02Ak8iJUdxRM0XI5QyxXuZOzKOINmWurp3smXu3y5wDcJrptwpSjgXHzIQxR0omXljQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "fdir": "^6.5.0", + "picomatch": "^4.0.3" + }, + "engines": { + "node": ">=12.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/SuperchupuDev" + } + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/typescript": { + "version": "5.9.3", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.3.tgz", + "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.6.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.6.3.tgz", + "integrity": "sha512-yDJTmhydvl5lJzBmy/hyOAA0d+aqCBuwl818haVdYCRrWV84o7YyeVm4QlVHStqNrrJSTb6jKuFAVqAFsr+K3Q==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport": { + "version": "3.14.6", + "resolved": "https://registry.npmjs.org/unimport/-/unimport-3.14.6.tgz", + "integrity": "sha512-CYvbDaTT04Rh8bmD8jz3WPmHYZRG/NnvYVzwD6V1YAlvvKROlAeNDUBhkBGzNav2RKaeuXvlWYaa1V4Lfi/O0g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@rollup/pluginutils": "^5.1.4", + "acorn": "^8.14.0", + "escape-string-regexp": "^5.0.0", + "estree-walker": "^3.0.3", + "fast-glob": "^3.3.3", + "local-pkg": "^1.0.0", + "magic-string": "^0.30.17", + "mlly": "^1.7.4", + "pathe": "^2.0.1", + "picomatch": "^4.0.2", + "pkg-types": "^1.3.0", + "scule": "^1.3.0", + "strip-literal": "^2.1.1", + "unplugin": "^1.16.1" + } + }, + "node_modules/unimport/node_modules/confbox": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.2.4.tgz", + "integrity": "sha512-ysOGlgTFbN2/Y6Cg3Iye8YKulHw+R2fNXHrgSmXISQdMnomY6eNDprVdW9R5xBguEqI954+S6709UyiO7B+6OQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/unimport/node_modules/estree-walker": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/estree-walker/-/estree-walker-3.0.3.tgz", + "integrity": "sha512-7RUKfXgSMMkzt6ZuXmqapOurLGPPfgj6l9uRZ7lRGolvk0y2yocc35LdcxKC5PQZdn2DMqioAQ2NoWcrTKmm6g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/estree": "^1.0.0" + } + }, + "node_modules/unimport/node_modules/local-pkg": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/local-pkg/-/local-pkg-1.1.2.tgz", + "integrity": "sha512-arhlxbFRmoQHl33a0Zkle/YWlmNwoyt6QNZEIJcqNbdrsix5Lvc4HyyI3EnwxTYlZYc32EbYrQ8SzEZ7dqgg9A==", + "dev": true, + "license": "MIT", + "dependencies": { + "mlly": "^1.7.4", + "pkg-types": "^2.3.0", + "quansync": "^0.2.11" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + } + }, + "node_modules/unimport/node_modules/local-pkg/node_modules/pkg-types": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-2.3.0.tgz", + "integrity": "sha512-SIqCzDRg0s9npO5XQ3tNZioRY1uK06lA41ynBC1YmFTmnY6FjUjVt6s4LoADmwoig1qqD0oK8h1p/8mlMx8Oig==", + "dev": true, + "license": "MIT", + "dependencies": { + "confbox": "^0.2.2", + "exsolve": "^1.0.7", + "pathe": "^2.0.3" + } + }, + "node_modules/unplugin": { + "version": "1.16.1", + "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.16.1.tgz", + "integrity": "sha512-4/u/j4FrCKdi17jaxuJA0jClGxB1AvU2hw/IuayPc4ay1XGaJs/rbb4v5WKwAjNifjmXK9PIFyuPiaK8azyR9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "acorn": "^8.14.0", + "webpack-virtual-modules": "^0.6.2" + }, + "engines": { + "node": ">=14.0.0" + } + }, + "node_modules/unplugin-auto-import": { + "version": "0.18.6", + "resolved": "https://registry.npmjs.org/unplugin-auto-import/-/unplugin-auto-import-0.18.6.tgz", + "integrity": "sha512-LMFzX5DtkTj/3wZuyG5bgKBoJ7WSgzqSGJ8ppDRdlvPh45mx6t6w3OcbExQi53n3xF5MYkNGPNR/HYOL95KL2A==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.1", + "magic-string": "^0.30.14", + "minimatch": "^9.0.5", + "unimport": "^3.13.4", + "unplugin": "^1.16.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@nuxt/kit": "^3.2.2", + "@vueuse/core": "*" + }, + "peerDependenciesMeta": { + "@nuxt/kit": { + "optional": true + }, + "@vueuse/core": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components": { + "version": "0.27.5", + "resolved": "https://registry.npmjs.org/unplugin-vue-components/-/unplugin-vue-components-0.27.5.tgz", + "integrity": "sha512-m9j4goBeNwXyNN8oZHHxvIIYiG8FQ9UfmKWeNllpDvhU7btKNNELGPt+o3mckQKuPwrE7e0PvCsx+IWuDSD9Vg==", + "dev": true, + "license": "MIT", + "dependencies": { + "@antfu/utils": "^0.7.10", + "@rollup/pluginutils": "^5.1.3", + "chokidar": "^3.6.0", + "debug": "^4.3.7", + "fast-glob": "^3.3.2", + "local-pkg": "^0.5.1", + "magic-string": "^0.30.14", + "minimatch": "^9.0.5", + "mlly": "^1.7.3", + "unplugin": "^1.16.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@babel/parser": "^7.15.8", + "@nuxt/kit": "^3.2.2", + "vue": "2 || 3" + }, + "peerDependenciesMeta": { + "@babel/parser": { + "optional": true + }, + "@nuxt/kit": { + "optional": true + } + } + }, + "node_modules/unplugin-vue-components/node_modules/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "dev": true, + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/unplugin-vue-components/node_modules/picomatch": { + "version": "2.3.2", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.2.tgz", + "integrity": "sha512-V7+vQEJ06Z+c5tSye8S+nHUfI51xoXIXjHQ99cQtKUkQqqO1kO/KCJUfZXuB47h/YBlDhah2H3hdUGXn8ie0oA==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/unplugin-vue-components/node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "dev": true, + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/vite": { + "version": "6.4.2", + "resolved": "https://registry.npmjs.org/vite/-/vite-6.4.2.tgz", + "integrity": "sha512-2N/55r4JDJ4gdrCvGgINMy+HH3iRpNIz8K6SFwVsA+JbQScLiC+clmAxBgwiSPgcG9U15QmvqCGWzMbqda5zGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "^0.25.0", + "fdir": "^6.4.4", + "picomatch": "^4.0.2", + "postcss": "^8.5.3", + "rollup": "^4.34.9", + "tinyglobby": "^0.2.13" + }, + "bin": { + "vite": "bin/vite.js" + }, + "engines": { + "node": "^18.0.0 || ^20.0.0 || >=22.0.0" + }, + "funding": { + "url": "https://github.com/vitejs/vite?sponsor=1" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + }, + "peerDependencies": { + "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", + "jiti": ">=1.21.0", + "less": "*", + "lightningcss": "^1.21.0", + "sass": "*", + "sass-embedded": "*", + "stylus": "*", + "sugarss": "*", + "terser": "^5.16.0", + "tsx": "^4.8.1", + "yaml": "^2.4.2" + }, + "peerDependenciesMeta": { + "@types/node": { + "optional": true + }, + "jiti": { + "optional": true + }, + "less": { + "optional": true + }, + "lightningcss": { + "optional": true + }, + "sass": { + "optional": true + }, + "sass-embedded": { + "optional": true + }, + "stylus": { + "optional": true + }, + "sugarss": { + "optional": true + }, + "terser": { + "optional": true + }, + "tsx": { + "optional": true + }, + "yaml": { + "optional": true + } + } + }, + "node_modules/vscode-uri": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/vscode-uri/-/vscode-uri-3.1.0.tgz", + "integrity": "sha512-/BpdSx+yCQGnCvecbyXdxHDkuk55/G3xwnC0GqY4gmQ3j+A+g8kzzgB4Nk/SINjqn6+waqw3EgbVF2QKExkRxQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/vue": { + "version": "3.5.32", + "resolved": "https://registry.npmjs.org/vue/-/vue-3.5.32.tgz", + "integrity": "sha512-vM4z4Q9tTafVfMAK7IVzmxg34rSzTFMyIe0UUEijUCkn9+23lj0WRfA83dg7eQZIUlgOSGrkViIaCfqSAUXsMw==", + "license": "MIT", + "dependencies": { + "@vue/compiler-dom": "3.5.32", + "@vue/compiler-sfc": "3.5.32", + "@vue/runtime-dom": "3.5.32", + "@vue/server-renderer": "3.5.32", + "@vue/shared": "3.5.32" + }, + "peerDependencies": { + "typescript": "*" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/vue-demi": { + "version": "0.14.10", + "resolved": "https://registry.npmjs.org/vue-demi/-/vue-demi-0.14.10.tgz", + "integrity": "sha512-nMZBOwuzabUO0nLgIcc6rycZEebF6eeUfaiQx9+WSk8e29IbLvPU9feI6tqW4kTo3hvoYAJkMh8n8D0fuISphg==", + "hasInstallScript": true, + "license": "MIT", + "bin": { + "vue-demi-fix": "bin/vue-demi-fix.js", + "vue-demi-switch": "bin/vue-demi-switch.js" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/antfu" + }, + "peerDependencies": { + "@vue/composition-api": "^1.0.0-rc.1", + "vue": "^3.0.0-0 || ^2.6.0" + }, + "peerDependenciesMeta": { + "@vue/composition-api": { + "optional": true + } + } + }, + "node_modules/vue-router": { + "version": "4.6.4", + "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.6.4.tgz", + "integrity": "sha512-Hz9q5sa33Yhduglwz6g9skT8OBPii+4bFn88w6J+J4MfEo4KRRpmiNG/hHHkdbRFlLBOqxN8y8gf2Fb0MTUgVg==", + "license": "MIT", + "dependencies": { + "@vue/devtools-api": "^6.6.4" + }, + "funding": { + "url": "https://github.com/sponsors/posva" + }, + "peerDependencies": { + "vue": "^3.5.0" + } + }, + "node_modules/vue-tsc": { + "version": "2.2.12", + "resolved": "https://registry.npmjs.org/vue-tsc/-/vue-tsc-2.2.12.tgz", + "integrity": "sha512-P7OP77b2h/Pmk+lZdJ0YWs+5tJ6J2+uOQPo7tlBnY44QqQSPYvS0qVT4wqDJgwrZaLe47etJLLQRFia71GYITw==", + "dev": true, + "license": "MIT", + "dependencies": { + "@volar/typescript": "2.4.15", + "@vue/language-core": "2.2.12" + }, + "bin": { + "vue-tsc": "bin/vue-tsc.js" + }, + "peerDependencies": { + "typescript": ">=5.0.0" + } + }, + "node_modules/vue-types": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/vue-types/-/vue-types-3.0.2.tgz", + "integrity": "sha512-IwUC0Aq2zwaXqy74h4WCvFCUtoV0iSWr0snWnE9TnU18S66GAQyqQbRf2qfJtUuiFsBf6qp0MEwdonlwznlcrw==", + "license": "MIT", + "dependencies": { + "is-plain-object": "3.0.1" + }, + "engines": { + "node": ">=10.15.0" + }, + "peerDependencies": { + "vue": "^3.0.0" + } + }, + "node_modules/warning": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/warning/-/warning-4.0.3.tgz", + "integrity": "sha512-rpJyN222KWIvHJ/F53XSZv0Zl/accqHR8et1kpaMTD/fLCRxtV8iX8czMzY7sVZupTI3zcUTg8eycS2kNF9l6w==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.0.0" + } + }, + "node_modules/webpack-virtual-modules": { + "version": "0.6.2", + "resolved": "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.2.tgz", + "integrity": "sha512-66/V2i5hQanC51vBQKPH4aI8NMAcBW59FVBs+rC7eGHupMyfn34q7rZIE+ETlJ+XTevqfUhVVBgSUNSW2flEUQ==", + "dev": true, + "license": "MIT" + }, + "node_modules/zhican-admin": { + "resolved": "admin", + "link": true + } + } +} diff --git a/zhican/package.json b/zhican/package.json new file mode 100644 index 0000000..093fa0f --- /dev/null +++ b/zhican/package.json @@ -0,0 +1,13 @@ +{ + "name": "zhican", + "version": "1.0.0", + "private": true, + "description": "智能餐养系统 - 前端项目", + "workspaces": [ + "admin" + ], + "scripts": { + "admin:dev": "npm run dev -w admin", + "admin:build": "npm run build -w admin" + } +}