import { getTenantByWebsite } from '@/sheep/api/infra/tenant'; import { getTenantId } from '@/sheep/request'; import { defineStore } from 'pinia'; import $platform from '@/sheep/platform'; import $router from '@/sheep/router'; import user from './user'; import sys from './sys'; import { baseUrl, h5Url } from '@/sheep/config'; import { themeConfig } from '@/sheep/config/theme'; import captchaConfig from '@/sheep/config/captcha'; const app = defineStore({ id: 'app', state: () => ({ captchaEnable: captchaConfig.captchaEnable, // 验证码开关 info: { // 应用信息 name: '', // 商城名称 logo: '', // logo version: '', // 版本号 copyright: '', // 版权信息 I copytime: '', // 版权信息 II cdnurl: '', // 云存储域名 filesystem: '', // 云存储平台 }, platform: { share: { methods: [], // 支持的分享方式 forwardInfo: {}, // 默认转发信息 posterInfo: {}, // 海报信息 linkAddress: '', // 复制链接地址 }, bind_mobile: 0, // 登陆后绑定手机号提醒 (弱提醒,可手动关闭) }, template: { // 店铺装修模板 basic: {}, // 基本信息 home: { // 首页模板 style: {}, data: [], }, user: { // 个人中心模板 style: {}, data: [], }, }, shareInfo: {}, // 全局分享信息 has_wechat_trade_managed: 0, // 小程序发货信息管理 0 没有 || 1 有 }), actions: { // 获取Shopro应用配置和模板 async init(templateId = null) { // 检查网络 const networkStatus = await $platform.checkNetwork(); if (!networkStatus) { $router.error('NetworkError'); } // 检查配置 if (typeof baseUrl === 'undefined') { $router.error('EnvError'); } // 加载租户 await adaptTenant(); // 加载装修配置 await adaptTemplate(this.template, templateId); // TODO 芋艿:【初始化优化】未来支持管理后台可配;对应 https://api.shopro.sheepjs.com/shop/api/init if (true) { this.info = { name: '移动端', logo: 'https://static.iocoder.cn/ruoyi-vue-pro-logo.png', version: '2025.09', copyright: '全部开源,个人与企业可 100% 免费使用', copytime: 'Copyright© 2018-2025', cdnurl: 'https://file.sheepjs.com', // 云存储域名 filesystem: 'qcloud', // 云存储平台 }; this.platform = { share: { methods: ['forward', 'poster', 'link'], linkAddress: h5Url, posterInfo: { user_bg: '/static/img/shop/config/user-poster-bg.png', goods_bg: '/static/img/shop/config/goods-poster-bg.png', groupon_bg: '/static/img/shop/config/groupon-poster-bg.png', }, forwardInfo: { title: '', image: '', desc: '', }, }, bind_mobile: 0, }; this.has_wechat_trade_managed = 0; // 加载主题 const sysStore = sys(); // 强制设置为 primary 主题,清除可能的缓存 sysStore.setTheme('primary'); // 确保模板基础配置中也设置正确的主题 if (!this.template.basic.theme || this.template.basic.theme === 'orange') { this.template.basic.theme = 'primary'; } // 设置默认 tabbar 配置(如果没有从 API 获取到) if (!this.template.basic.tabbar || !this.template.basic.tabbar.items) { this.template.basic.tabbar = { style: { color: '#999999', activeColor: themeConfig.primary.main, bgColor: '#ffffff', bgType: 'color' }, mode: 1, // 使用图标模式 items: [ { text: '菜单', url: '/pages/index/menu', icon: 'sicon-goods-list', activeIcon: 'sicon-goods-list' }, { text: '我的', url: '/pages/index/user', icon: 'sicon-home', activeIcon: 'sicon-home' } ] }; } // 模拟用户登录 const userStore = user(); if (userStore.isLogin) { userStore.loginAfter(); } return Promise.resolve(true); } else { $router.error('InitError', res.msg || '加载失败'); } }, }, persist: { enabled: true, strategies: [ { key: 'app-store', }, ], }, }); /** 初始化租户编号 */ const adaptTenant = async () => { // 1. 获取当前租户 ID const oldTenantId = getTenantId(); let newTenantId = null; try { // 2.1 情况一:H5:根据 url 参数、域名来获取新的租户ID // #ifdef H5 // H5 环境下的处理逻辑 if (window?.location) { // 优先从 URL 查询参数获取 tenantId const urlParams = new URLSearchParams(window.location.search); newTenantId = urlParams.get('tenantId'); // 如果 URL 参数中没有,则通过 host 获取 if (!newTenantId && window.location.host) { const { data } = await getTenantByWebsite(window.location.host); newTenantId = data?.id; } } // #endif // 2.2 情况二:微信小程序:小程序环境下的处理逻辑 - 根据 appId 获取租户 // #ifdef MP const appId = uni.getAccountInfoSync()?.miniProgram?.appId; if (appId) { const { data } = await getTenantByWebsite(appId); newTenantId = data?.id; } // #endif // 3. 如果是新租户(不相等),则进行切换 // noinspection EqualityComparisonWithCoercionJS if (newTenantId && newTenantId != oldTenantId) { // 清理掉登录用户的 token const userStore = user(); userStore.setToken(); // 设置新的 tenantId 到本地存储 uni.setStorageSync('tenant-id', newTenantId); console.log('租户 ID 已更新:', `${oldTenantId} -> ${newTenantId}`); } } catch (error) { console.error('adaptTenant 执行失败:', error); } }; /** 初始化装修模版 */ const adaptTemplate = async (appTemplate, templateId) => { try { // TODO: 这里应该从真实的 API 获取模板配置 // const { data: diyTemplate } = templateId // ? await DiyApi.getDiyTemplate(templateId) // : await DiyApi.getUsedDiyTemplate(); // 暂时使用默认配置 const diyTemplate = null; // 模板不存在时使用默认配置 if (!diyTemplate) { console.log('使用默认装修模板配置'); // 设置默认主题为 primary if (!appTemplate.basic.theme) { appTemplate.basic.theme = 'primary'; } return; } const tabBar = diyTemplate?.property?.tabBar; if (tabBar) { appTemplate.basic.tabbar = tabBar; // TODO 商城装修没有对 tabBar 进行角标配置,测试角标需打开以下注释 // appTemplate.basic.tabbar.items.forEach((tabBar) => { // tabBar.dot = false // tabBar.badge = 100 // }) // appTemplate.basic.tabbar.badgeStyle = { // backgroundColor: '#882222', // } if (tabBar?.theme) { appTemplate.basic.theme = tabBar?.theme; } } appTemplate.home = diyTemplate?.home; appTemplate.user = diyTemplate?.user; } catch (error) { console.error('adaptTemplate 执行失败:', error); // 出错时也使用默认配置为 primary if (!appTemplate.basic.theme) { appTemplate.basic.theme = 'primary'; } } }; export default app;