快乐的梦鱼 3 dagar sedan
förälder
incheckning
1324722a72

+ 18 - 13
src/App.vue

@@ -2,17 +2,16 @@
 import { onLaunch } from '@dcloudio/uni-app'
 import { useAuthStore } from './store/auth'
 import { configTheme } from './components/theme/ThemeDefine';
-import { RequestApiConfig } from '@imengyu/imengyu-utils';
-import ApiCofig from './common/config/ApiCofig';
-import { isDev } from './common/config/AppCofig';
+import { LogUtils } from '@imengyu/imengyu-utils';
 import { useCommonCategoryGlobalLoader } from './pages/article/data/CommonCategoryGlobalLoader';
+import { useAppConfiguration } from './api/system/useAppConfiguration';
 
+const TAG = 'App';
 const authStore = useAuthStore();
 const { loadCommonCategory } = useCommonCategoryGlobalLoader();
+const { loadAppConfiguration } = useAppConfiguration();
 
-onLaunch(async () => {
-  console.log('App Launch');
-
+function loadFontFace() {
   uni.loadFontFace({
     global: true,
     family: "SongtiSCBlack",
@@ -23,17 +22,23 @@ onLaunch(async () => {
     family: "HUNdin1451",
     source: 'url("https://mncdn.wenlvti.net/app_static/minnan/fonts/HUN-din1451.woff")',
   });
+}
 
-  await authStore.loadLoginState();
-  await loadCommonCategory();
-})
+onLaunch(async () => {
+  LogUtils.printLog(TAG, 'info', 'App Launch');
 
-RequestApiConfig.setConfig({
-  ...RequestApiConfig.getConfig(),
-  BaseUrl: isDev ? ApiCofig.server.Dev : ApiCofig.server.Prod,
-})
+  //加载配置
+  await loadAppConfiguration();
+
+  //加载字体
+  loadFontFace();
 
+  //加载登录状态
+  await authStore.loadLoginState();
 
+  //加载系统分类
+  await loadCommonCategory();
+})
 
 configTheme(false, (theme, darkTheme) => {
   theme.colorConfigs.default.primary = '#d9492e';

+ 21 - 1
src/api/BaseAppServerRequestModule.ts

@@ -74,10 +74,30 @@ export function reportError<T extends DataModel>(instance: RequestCoreInstance<T
   }
 }
 
+export const BaseAppServerRequestUrlManager = {
+  urlConfigListeners: [] as { name: string, fn: (baseUrl: string) => void }[],
+  pushUrlConfigListener(name: string, fn: (baseUrl: string) => void) {
+    this.urlConfigListeners.push({ name, fn });
+  },
+  notifyUrlConfigUpdated(name: string, baseUrl: string) {
+    this.urlConfigListeners.forEach(item => {
+      if (item.name === name) {
+        item.fn(baseUrl);
+      }
+    });
+  },
+}
+
 export class BaseAppServerRequestModule<T extends DataModel> extends RequestCoreInstance<T> {
   constructor(baseUrl: string) {
     super(UniappImplementer);
-    this.config.baseUrl = baseUrl;
+    if (!baseUrl.startsWith('http')) {
+      BaseAppServerRequestUrlManager.pushUrlConfigListener(baseUrl, (baseUrl: string) => {
+        this.config.baseUrl = baseUrl;
+      });
+    } else {
+      this.config.baseUrl = baseUrl;
+    }
     this.config.errCodes = [];
     //请求拦截器
     this.config.requestInterceptor = (url, req) => {

+ 1 - 3
src/api/RequestModules.ts

@@ -4,10 +4,8 @@
  * * 不同服务器的请求模块。
  */
 
-import ApiCofig from "@/common/config/ApiCofig";
 import type { DataModel, NewDataModel } from "@imengyu/js-request-transform";
 import { BaseAppServerRequestModule } from "./BaseAppServerRequestModule";
-import { isDev } from "@/common/config/AppCofig";
 import { defaultResponseDataHandlerCatch, RequestApiError, RequestApiResult, RequestCoreInstance, RequestOptions, RequestResponse, type RequestApiInfoStruct } from "@imengyu/imengyu-utils";
 
 /**
@@ -15,7 +13,7 @@ import { defaultResponseDataHandlerCatch, RequestApiError, RequestApiResult, Req
  */
 export class AppServerRequestModule<T extends DataModel> extends BaseAppServerRequestModule<T> {
   constructor() {
-    super(isDev ? ApiCofig.server.Dev : ApiCofig.server.Prod);
+    super('base-app-server');
   }
 }
 

+ 52 - 0
src/api/system/ConfigurationApi.ts

@@ -0,0 +1,52 @@
+import { UpdateServerRequestModule } from '@/api/RequestModules';
+import { getMpEnvVersion } from '@/common/utils/MpVersions';
+import { LogUtils } from '@imengyu/imengyu-utils';
+import { DataModel } from '@imengyu/js-request-transform';
+import DefaultConfiguration from './DefaultConfiguration.json';
+
+export const CommonConfigurationConfig = {
+  /**
+   * 应用id
+   */
+  appId: 2,
+  appConfigId: {
+    dev: 7,
+    prod: 6,
+  },
+  getAppConfigId(isDev: boolean) {
+    return isDev ? this.appConfigId.dev : this.appConfigId.prod;
+  },
+}
+
+export interface IConfigurationItem {
+  baseServerUrl: string,
+  articleMark: string,
+}
+
+export class ConfigurationApi extends UpdateServerRequestModule<DataModel> {
+
+  constructor() {
+    super();
+  }
+
+  /**
+   * 获取当前配置,有缓存,会根据激活的历史版本获取对应配置
+   * @returns 
+   */
+  async getConfig() {
+    const isDev = getMpEnvVersion() === 'release' ? false : true;
+    try {
+      return (await this.get<{
+        data: IConfigurationItem
+      }>('/app-configuration-get', '获取配置', {
+        name: CommonConfigurationConfig.getAppConfigId(isDev),
+        appId: CommonConfigurationConfig.appId,
+        })).data!.data;
+    } catch (error) {
+      LogUtils.printLog("ConfigurationApi", 'error', '获取配置失败,使用默认配置', error);
+      return DefaultConfiguration;
+    }
+  }
+}
+
+export default new ConfigurationApi();

+ 4 - 0
src/api/system/DefaultConfiguration.json

@@ -0,0 +1,4 @@
+{
+  "baseServerUrl": "https://mnwh.wenlvti.net/api",
+  "articleMark": "以上内容摘自:"
+}

+ 31 - 0
src/api/system/useAppConfiguration.ts

@@ -0,0 +1,31 @@
+import { LogUtils } from "@imengyu/imengyu-utils";
+import { inject, provide, ref, type Ref } from "vue";
+import { BaseAppServerRequestUrlManager } from "../BaseAppServerRequestModule";
+import ConfigurationApi, { type IConfigurationItem } from "./ConfigurationApi";
+
+export const APP_CONFIGURATION_KEY = Symbol('APP_CONFIGURATION_KEY');
+
+const TAG = 'useAppConfiguration';
+
+export function useAppConfiguration() {
+  const appConfiguration = ref<IConfigurationItem | null>(null);
+
+  async function loadAppConfiguration() {
+    //获取配置
+    const config = await ConfigurationApi.getConfig();
+    LogUtils.printLog(TAG, 'info', '获取配置', config);
+    appConfiguration.value = config;
+    BaseAppServerRequestUrlManager.notifyUrlConfigUpdated('base-app-server', config.baseServerUrl);
+  }
+
+  provide(APP_CONFIGURATION_KEY, appConfiguration);
+
+  return {
+    loadAppConfiguration,
+    appConfiguration,
+  };
+}
+
+export function injectAppConfiguration() {
+  return inject(APP_CONFIGURATION_KEY) as Ref<IConfigurationItem | null>;
+}

+ 0 - 4
src/common/config/ApiCofig.ts

@@ -3,10 +3,6 @@
  * 说明:后端接口配置
  */
 export default {
-  server: {
-    Dev: 'https://mn.wenlvti.net/api',
-    Prod: 'https://mn.wenlvti.net/api',
-  },
   mainBodyId: 1,
   platformId: 327,
   /**

+ 8 - 0
src/common/utils/MpVersions.ts

@@ -0,0 +1,8 @@
+export function getIsDevtoolsPlatform () {
+  return uni.getSystemInfoSync().platform === 'devtools';
+}
+export function getMpEnvVersion() {
+  const accountInfo = uni.getAccountInfoSync();
+  const envVersion = accountInfo.miniProgram.envVersion;
+  return envVersion;
+}

+ 7 - 1
src/pages/article/data/CommonCategoryDetail.vue

@@ -28,7 +28,10 @@
             :content="content.content"
           />
           <text v-if="!(content.intro || content.content)">暂无简介</text>
-          <text v-if="content.from" class="size-s color-text-content-second mr-2 ">以上内容摘自:{{ content.from }}</text>
+          <text v-if="content.from" class="size-s color-text-content-second mr-2 ">
+            {{ appConfiguration?.articleMark }}
+            {{ content.from }}
+          </text>
         </template>
         <template v-else-if="tabRenderDefines[tabCurrentId].type === 'images'">
           <!-- 图片 -->
@@ -152,6 +155,7 @@ import CommonCategoryDetailContentBlocks from './CommonCategoryDetailContentBloc
 import ImageGrid from '@/pages/parts/ImageGrid.vue';
 import CommonCategoryListBlock from './CommonCategoryListBlock.vue';
 import { navTo } from '@/components/utils/PageAction';
+import { injectAppConfiguration } from '@/api/system/useAppConfiguration';
 
 export interface CommonCategoryDetailProps extends DetailTabPageProps {
   /**
@@ -195,6 +199,8 @@ const props = defineProps({
   },
 })
 
+const appConfiguration = injectAppConfiguration();
+
 const loadState = ref(false);
 const errorMessage = ref('');
 const currentCommonCategoryDefine = ref<IHomeCommonCategoryDefine['page'][0]>();

+ 8 - 3
src/pages/article/data/CommonCategoryGlobalLoader.ts

@@ -3,6 +3,7 @@ import { showError } from "@/common/composeabe/ErrorDisplay";
 import DefaultCofig from "./DefaultCategory.json";
 import type { IHomeCommonCategoryDefine } from "./CommonCategoryDefine";
 import CommonCategoryApi from "./api/CommonCategoryApi";
+import { getIsDevtoolsPlatform, getMpEnvVersion } from "@/common/utils/MpVersions";
 
 // 全局加载默认分类
 
@@ -24,11 +25,15 @@ export function useCommonCategoryGlobalLoader() {
   async function loadCommonCategory() {
     uni.showLoading({ title: '加载中' });
     try {
-      /* if (uni.getSystemInfoSync().platform === 'devtools') {
+      //本地开发时,使用默认配置
+      if (getIsDevtoolsPlatform()) {
         commonCategoryData.value = DefaultCofig as IHomeCommonCategoryDefine;
         return;
-      } */
-      const category = (await CommonCategoryApi.getConfig()) as any as IHomeCommonCategoryDefine;
+      }
+      //根据环境版本,使用正式配置或体验配置
+      const category = (await CommonCategoryApi.getConfig(
+        getMpEnvVersion() === 'release' ? false : true
+      )) as any as IHomeCommonCategoryDefine;
       if (category)
         commonCategoryData.value = category;
       else

+ 58 - 10
src/pages/article/data/DefaultCategory.json

@@ -12,7 +12,7 @@
           "homeButtons": [
             {
               "title": "常识一点通",
-              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/home/Button71.png",
+              "icon": "https://mn.wenlvti.net/uploads/20260205/ccc542ae733ba89a887541839241d533.png",
               "size": 50,
               "link": "/pages/article/data/list?pageConfigName=explore",
               "style": "large-bg",
@@ -20,7 +20,7 @@
             },
             {
               "title": "闽南新鲜事",
-              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/home/Button72.png",
+              "icon": "https://mn.wenlvti.net/uploads/20260205/c1bfe5a093217f00f775af0b6ff60398.png",
               "size": 50,
               "link": "/pages/article/data/list?pageConfigName=news",
               "style": "large-bg",
@@ -28,7 +28,7 @@
             },
             {
               "title": "遗产报你知",
-              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/home/Button73.png",
+              "icon": "https://mn.wenlvti.net/uploads/20260205/3b440b15c9a583d201be9589ab6136aa.png",
               "size": 50,
               "link": "/pages/article/data/list?pageConfigName=inhert",
               "style": "large-bg",
@@ -36,7 +36,7 @@
             },
             {
               "title": "文化新视角",
-              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/home/Button74.png",
+              "icon": "https://mn.wenlvti.net/uploads/20260206/b96b9353f7a458fee33c3b1028921607.png",
               "size": 50,
               "link": "/pages/article/data/list?pageConfigName=research",
               "style": "large-bg",
@@ -44,7 +44,7 @@
             },
             {
               "title": "世界走透透",
-              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/home/Button75.png",
+              "icon": "https://mn.wenlvti.net/uploads/20260205/28273ceae512f8f5f9a615acead54d4e.png",
               "size": 50,
               "link": "/pages/article/data/list?pageConfigName=communicate",
               "style": "large-bg",
@@ -52,7 +52,7 @@
             },
             {
               "title": "来厦门逛逛",
-              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/home/Button76.png",
+              "icon": "https://mn.wenlvti.net/uploads/20260205/69c0b025d566811dc275fb76198a619c.png",
               "size": 50,
               "link": "/pages/article/data/list?pageConfigName=travel",
               "style": "large-bg",
@@ -198,6 +198,51 @@
               "type": "small-grid2",
               "visible": true
             }
+          ],
+          "tabs": [
+            {
+              "title": "首页",
+              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_home_off.png",
+              "activeIcon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_home_on.png",
+              "type": "home"
+            },
+            {
+              "title": "资讯",
+              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_discover_off.png",
+              "activeIcon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_discover_on.png",
+              "type": "list",
+              "pageConfigName": "explore",
+              "pageHeadImage": "https://mn.wenlvti.net/app_static/minnan/images/discover/Title2.png",
+              "pageHeadImageWidth": 210
+            },
+            {
+              "title": "传承",
+              "icon": "https://mn.wenlvti.net/app_static/minnan/images/tabs/icon_inhert_off.png",
+              "activeIcon": "https://mn.wenlvti.net/app_static/minnan/images/tabs/icon_inhert_on.png",
+              "hump": true,
+              "humpHeight": [0,0],
+              "humpSpace": [20,20],
+              "iconSize": 140,
+              "type": "list",
+              "pageConfigName": "inhert",
+              "pageHeadImage": "https://mn.wenlvti.net/app_static/minnan/images/inhert/Title.png",
+              "pageHeadImageWidth": 110
+            },
+            {
+              "title": "乐游",
+              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_shop_off.png",
+              "activeIcon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_shop_on.png",
+              "type": "list",
+              "pageConfigName": "travel",
+              "pageHeadImage": "https://mn.wenlvti.net/app_static/minnan/images/travel/Title4.png",
+              "pageHeadImageWidth": 210
+            },
+            {
+              "title": "我的",
+              "icon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_profile_off.png",
+              "activeIcon": "https://mncdn.wenlvti.net/app_static/minnan/images/tabs/icon_profile_on.png",
+              "type": "user"
+            }
           ]
         }
       }
@@ -1049,7 +1094,7 @@
                   "type": "horizontal-large"
                 },
                 {
-                  "text": "保护单位",
+                  "text": "非遗保护单位",
                   "data": {
                     "type": "serializedApi",
                     "name": "UnitContent"
@@ -1057,8 +1102,11 @@
                   "dataSolve": [
                     "ich"
                   ],
-                  "morePage": "/pages/inhert/unit/list",
-                  "type": "simple-text"
+                  "morePage": "",
+                  "type": "simple-text",
+                  "detailsPage": "disabled",
+                  "itemType": "simple-text",
+                  "showMore": true
                 },
                 {
                   "text": "非遗传习中心(所)",
@@ -1643,7 +1691,7 @@
               "prefix": "以下照片由传承人提供"
             },
             {
-              "text": "视频",
+              "text": "资料影像",
               "type": "video"
             },
             {

+ 33 - 19
src/pages/article/data/api/CommonCategoryApi.ts

@@ -7,8 +7,22 @@ export const CommonCategoryConfig = {
    * 应用id
    */
   appId: 2,
-  appConfigId: 3,
-  accessKey: '3hSiTCiGNiF2c3yyB6JNtA4eEf2jX8Yi2w87W2F6FYxH2W7e',
+  appConfig: {
+    dev: {
+      id: 3,
+      accessKey: '3hSiTCiGNiF2c3yyB6JNtA4eEf2jX8Yi2w87W2F6FYxH2W7e',
+    },
+    prod: {
+      id: 5,
+      accessKey: 'Cn7rTk8dtdciZsicrebKrrtwF44HFYmhc6NpSFdnD38d4XMS',
+    },
+  },
+  getAppConfigId: (isDev: boolean) => {
+    return isDev ? CommonCategoryConfig.appConfig.dev.id : CommonCategoryConfig.appConfig.prod.id;
+  },
+  getAccessKey: (isDev: boolean) => {
+    return isDev ? CommonCategoryConfig.appConfig.dev.accessKey : CommonCategoryConfig.appConfig.prod.accessKey;
+  },
 }
 
 export interface ICommonCategoryConfigItem {
@@ -29,19 +43,19 @@ export class CommonCategoryApi extends UpdateServerRequestModule<DataModel> {
    * 获取当前配置,有缓存,会根据激活的历史版本获取对应配置
    * @returns 
    */
-  async getConfig() {
+  async getConfig(isDev: boolean) {
     return (await this.get<ICommonCategoryConfigHistoryItem>('/app-configuration-get', '获取配置', {
-      name: CommonCategoryConfig.appConfigId,
+      name: CommonCategoryConfig.getAppConfigId(isDev),
       appId: CommonCategoryConfig.appId,
-      accessKey: CommonCategoryConfig.accessKey,
+      accessKey: CommonCategoryConfig.getAccessKey(isDev),
     })).data!.data as IHomeCommonCategoryDefine;
   }
   /**
    * 获取顶级配置,不使用缓存
    * @returns 
    */
-  async getConfigWithoutCache() {
-    return (await this.get<ICommonCategoryConfigItem>('/app-configuration/' + CommonCategoryConfig.appConfigId, '获取配置')).data;
+  async getConfigWithoutCache(isDev: boolean) {
+    return (await this.get<ICommonCategoryConfigItem>('/app-configuration/' + CommonCategoryConfig.getAppConfigId(isDev), '获取配置')).data;
   }
   /**
    * 编辑配置
@@ -50,12 +64,12 @@ export class CommonCategoryApi extends UpdateServerRequestModule<DataModel> {
    * @param name 历史版本名称:为空时使用默认名称
    * @returns 
    */
-  async editConfig(json: ICommonCategoryConfigHistoryItem['data'], name?: string, saveToHistoryId?: number) {
-    return (await this.post(`/app-configuration-edit/${CommonCategoryConfig.appConfigId}?saveToHistoryId=${saveToHistoryId ?? ''}`, '编辑配置', {
-      id: CommonCategoryConfig.appConfigId,
+  async editConfig(isDev: boolean, json: ICommonCategoryConfigHistoryItem['data'], name?: string, saveToHistoryId?: number) {
+    return (await this.post(`/app-configuration-edit/${CommonCategoryConfig.getAppConfigId(isDev)}?saveToHistoryId=${saveToHistoryId ?? ''}`, '编辑配置', {
+      id: CommonCategoryConfig.getAppConfigId(isDev),
       name,
       data: json,
-      accessKey: CommonCategoryConfig.accessKey,
+      accessKey: CommonCategoryConfig.getAccessKey(isDev),
     })).data;
   }
   /**
@@ -64,7 +78,7 @@ export class CommonCategoryApi extends UpdateServerRequestModule<DataModel> {
    * @param pageSize 页大小
    * @returns 
    */
-  async getConfigHistoryList(page: number, pageSize = 10) {
+  async getConfigHistoryList(isDev: boolean, page: number, pageSize = 10) {
     return (await this.get<{
       allCount: number;
       allPage: number;
@@ -73,7 +87,7 @@ export class CommonCategoryApi extends UpdateServerRequestModule<DataModel> {
       pageIndex: number;
       pageSize: number;
     }>(
-      `/app-configuration-history/${page}/${pageSize}?appConfigurationId=${CommonCategoryConfig.appConfigId}`,
+      `/app-configuration-history/${page}/${pageSize}?appConfigurationId=${CommonCategoryConfig.getAppConfigId(isDev)}`,
       '获取配置历史版本列表'
     )).data;
   }
@@ -82,10 +96,10 @@ export class CommonCategoryApi extends UpdateServerRequestModule<DataModel> {
    * @param id 历史版本id
    * @returns 
    */
-  async deleteConfigHistory(id: number) {
+  async deleteConfigHistory(isDev: boolean, id: number) {
     return (await this.delete(`/app-configuration-history/${id}`, '删除配置历史版本', {
-      accessKey: CommonCategoryConfig.accessKey,
-      appConfigurationId: CommonCategoryConfig.appConfigId,
+      accessKey: CommonCategoryConfig.getAccessKey(isDev),
+      appConfigurationId: CommonCategoryConfig.getAppConfigId(isDev),
     })).data;
   }
   /**
@@ -93,10 +107,10 @@ export class CommonCategoryApi extends UpdateServerRequestModule<DataModel> {
    * @param historyId 历史版本id
    * @returns 
    */
-  async setActiveConfigHistory(historyId: number) {
+  async setActiveConfigHistory(isDev: boolean, historyId: number) {
     return (await this.post(`/app-configuration-set-active-history`, '设置配置历史版本为活动版本', {
-      accessKey: CommonCategoryConfig.accessKey,
-      id: CommonCategoryConfig.appConfigId,
+      accessKey: CommonCategoryConfig.getAccessKey(isDev),
+      id: CommonCategoryConfig.getAppConfigId(isDev),
       historyId,
     })).data;
   }

+ 65 - 0
src/pages/article/data/defines/Home.ts

@@ -58,5 +58,70 @@ export interface IHomeCommonCategoryHomeDefine {
      * 首页分类项
      */
     categorys: IHomeCommonCategoryListTabNestCategoryItemDefine[],
+    /**
+     * 首页Tab控制
+     */
+    tabs: {
+      /**
+       * 标签标题
+       */
+      title: string,
+      /**
+       * 标签图标
+       */
+      icon: string,
+      /**
+       * 选中时的图标
+       */
+      activeIcon: string,
+      /**
+       * 是否凸起
+       * @default false
+       */
+      hump?: boolean,
+      /**
+       * 凸起高度
+       * @default [0,0]
+       */
+      humpHeight?: number[],
+      /**
+       * 凸起间距
+       * @default [20,20]
+       */
+      humpSpace?: number[],
+      /**
+       * 图标大小
+       */
+      iconSize?: number,
+      /**
+       * 标签是否可见
+       * @default true
+       */
+      visible?: boolean,
+      /**
+       * 标签跳转链接
+       * * home: 首页
+       * * list: 内嵌列表页
+       * * user: 用户页
+       * @default 'list'
+       */
+      type: 'home'|'list'|'user',
+      /**
+       * 标签页面配置名称,在type为list时有效
+       */
+      pageConfigName?: string,
+      /**
+       * 标签页面头部图片,在type为list时有效
+       */
+      pageHeadImage?: string,
+      /**
+       * 标签页面头部图片宽度,在type为list时有效
+       */
+      pageHeadImageWidth?: number,
+      /**
+       * 标签页面头部图片样式,在type为list时有效
+       */
+      pageHeadImageStyle?: Record<string, any>,
+    }[],
   },
 }

+ 2 - 0
src/pages/article/data/editor/MiniProgramEditor.vue

@@ -6,6 +6,7 @@
         :current-config="currentConfig"
         :current-history-id="currentHistoryId"
         :current-show-config-name="currentShowConfigName"
+        v-model:is-dev="isDev"
         v-model:save-as-modal-visible="saveAsModalVisible"
         v-model:save-as-version-name="saveAsVersionName"
         :save-as-loading="saveAsLoading"
@@ -78,6 +79,7 @@ const {
   currentConfig,
   currentHistoryId,
   currentShowConfigName,
+  isDev,
   saveAsModalVisible,
   saveAsVersionName,
   saveAsLoading,

+ 15 - 6
src/pages/article/data/editor/composables/useEditorConfig.ts

@@ -1,4 +1,4 @@
-import { computed, ref } from 'vue';
+import { computed, ref, watch } from 'vue';
 import { message, Modal } from 'ant-design-vue';
 import { ObjectUtils } from '@imengyu/imengyu-utils';
 import type { IHomeCommonCategoryDefine } from '../../CommonCategoryDefine';
@@ -20,6 +20,8 @@ export function useEditorConfig() {
   const historyList = ref<IHistoryListItem[]>([]);
   const currentConfig = ref<ICommonCategoryConfigItem>();
   const currentHistoryId = ref<number>(0);
+  /** 是否使用开发版接口(true=开发版,false=正式版) */
+  const isDev = ref(true);
 
   const currentShowConfigName = computed(() => {
     if (currentHistoryId.value === 0) return '默认配置';
@@ -33,7 +35,7 @@ export function useEditorConfig() {
 
   async function loadEditorJson(selectDefault = false) {
     try {
-      currentConfig.value = await CommonCategoryApi.getConfigWithoutCache();
+      currentConfig.value = await CommonCategoryApi.getConfigWithoutCache(isDev.value);
       if (!currentConfig.value) throw new Error('加载基础配置失败');
       if (selectDefault) currentHistoryId.value = currentConfig.value.activeHistoryId;
       if (currentHistoryId.value > 0) {
@@ -57,7 +59,7 @@ export function useEditorConfig() {
 
   async function loadEditorJsonHistorys() {
     try {
-      const res = await CommonCategoryApi.getConfigHistoryList(1, 10);
+      const res = await CommonCategoryApi.getConfigHistoryList(isDev.value, 1, 10);
       const items = res?.items ?? [];
       historyList.value = Array.isArray(items) ? items : [];
     } catch (error) {
@@ -83,6 +85,7 @@ export function useEditorConfig() {
     try {
       const saveToHistoryId = currentHistoryId.value === 0 ? undefined : currentHistoryId.value;
       await CommonCategoryApi.editConfig(
+        isDev.value,
         currentEditorJson.value,
         undefined,
         saveToHistoryId
@@ -109,7 +112,7 @@ export function useEditorConfig() {
     }
     saveAsLoading.value = true;
     try {
-      await CommonCategoryApi.editConfig(currentEditorJson.value, name, 0);
+      await CommonCategoryApi.editConfig(isDev.value, currentEditorJson.value, name, 0);
       message.success('已另存为历史版本');
       saveAsModalVisible.value = false;
       await loadEditorJsonHistorys();
@@ -124,7 +127,7 @@ export function useEditorConfig() {
   }
 
   async function setActiveHistory() {
-    await CommonCategoryApi.setActiveConfigHistory(currentHistoryId.value);
+    await CommonCategoryApi.setActiveConfigHistory(isDev.value, currentHistoryId.value);
     message.success('设置为激活版本成功');
   }
 
@@ -133,7 +136,7 @@ export function useEditorConfig() {
       title: '删除历史版本',
       content: '确定要删除该历史版本吗?',
       onOk: async () => {
-        await CommonCategoryApi.deleteConfigHistory(currentHistoryId.value);
+        await CommonCategoryApi.deleteConfigHistory(isDev.value, currentHistoryId.value);
         message.success('删除历史版本成功');
         await loadEditorJsonHistorys();
         await loadEditorJson(true);
@@ -156,6 +159,11 @@ export function useEditorConfig() {
     await loadEditorJson(true);
   }
 
+  watch(isDev, async () => {
+    await loadEditorJsonHistorys();
+    await loadEditorJson(true);
+  });
+
   return {
     currentEditorJson,
     selectedPage,
@@ -163,6 +171,7 @@ export function useEditorConfig() {
     currentConfig,
     currentHistoryId,
     currentShowConfigName,
+    isDev,
     saveAsModalVisible,
     saveAsVersionName,
     saveAsLoading,

+ 24 - 1
src/pages/article/data/editor/subpart/EditorToolbar.vue

@@ -1,6 +1,12 @@
 <template>
   <div class="editor-toolbar">
     <a-space>
+      <span class="toolbar-label">环境:</span>
+      <a-select
+        v-model:value="isDevValue"
+        style="width: 100px"
+        :options="envOptions"
+      />
       <a-dropdown>
         <a-button>
           加载
@@ -77,15 +83,17 @@
 </template>
 
 <script setup lang="ts">
+import { computed } from 'vue';
 import { DownOutlined, DownloadOutlined, InfoCircleFilled } from '@ant-design/icons-vue';
 import type { IHistoryListItem } from '../composables/useEditorConfig';
 import type { ICommonCategoryConfigItem } from '../../api/CommonCategoryApi';
 
-defineProps<{
+const props = defineProps<{
   historyList: IHistoryListItem[];
   currentConfig?: ICommonCategoryConfigItem;
   currentHistoryId: number;
   currentShowConfigName: string;
+  isDev: boolean;
   saveAsModalVisible: boolean;
   saveAsVersionName: string;
   saveAsLoading: boolean;
@@ -100,9 +108,20 @@ const emit = defineEmits<{
   (e: 'set-active'): void;
   (e: 'delete-history'): void;
   (e: 'export'): void;
+  (e: 'update:isDev', v: boolean): void;
   (e: 'update:saveAsModalVisible', v: boolean): void;
   (e: 'update:saveAsVersionName', v: string): void;
 }>();
+
+const isDevValue = computed({
+  get: () => props.isDev,
+  set: (v: boolean) => emit('update:isDev', v),
+});
+
+const envOptions = [
+  { value: true, label: '开发版' },
+  { value: false, label: '正式版' },
+];
 </script>
 
 <style scoped>
@@ -114,4 +133,8 @@ const emit = defineEmits<{
   justify-content: space-between;
   align-items: center;
 }
+.toolbar-label {
+  color: rgba(0, 0, 0, 0.65);
+  font-size: 14px;
+}
 </style>

+ 13 - 9
src/pages/article/details.vue

@@ -45,11 +45,14 @@
               :content="loader.content.value.content"
             />
             <text v-if="emptyContent">暂无简介</text>
-            <text v-if="loader.content.value.from" class="size-s color-text-content-second mr-2 ">以上内容摘自:{{ loader.content.value.from }}</text>
+            <text v-if="loader.content.value.from" class="size-s color-text-content-second mr-2 ">
+              {{ appConfiguration?.articleMark }}
+              {{ loader.content.value?.from }}
+            </text>
           </view>
           
           <!-- 推荐 -->
-          <view v-if="recommendListLoader.content.value?.length" class="d-flex flex-col p-3">
+          <view v-if="recommendListLoader.content.value?.length && querys.showRecommend" class="d-flex flex-col p-3">
             <text class="size-base text-bold mb-3">相关推荐</text>
             <Box2LineImageRightShadow
               class="w-100"
@@ -82,13 +85,10 @@ import type { GetContentDetailItem } from "@/api/CommonContent";
 import { onShareTimeline, onShareAppMessage } from "@dcloudio/uni-app";
 import { DataDateUtils } from "@imengyu/js-request-transform";
 import { useSimplePageContentLoader } from "@/common/composeabe/SimplePageContentLoader";
-import { useSwiperImagePreview } from "@/common/composeabe/SwiperImagePreview";
 import { useLoadQuerys } from "@/common/composeabe/LoadQuerys";
-import NewsIndexContent from "@/api/news/NewsIndexContent";
-import SimplePageContentLoader from "@/common/components/SimplePageContentLoader.vue";
-import ContentNote from "../parts/ContentNote.vue";
-import Parse from "@/components/display/parse/Parse.vue";
 import { computed } from "vue";
+import { StringUtils } from "@imengyu/imengyu-utils";
+import { injectAppConfiguration } from "@/api/system/useAppConfiguration";
 import { useSimpleDataLoader } from "@/common/composeabe/SimpleDataLoader";
 import { navTo } from "@/components/utils/PageAction";
 import CommonContent, { GetContentListParams } from "@/api/CommonContent";
@@ -103,7 +103,10 @@ import IconPowerpoint from '@/components/images/files/powerpoint.png';
 import IconUnknown from '@/components/images/files/unknown.png';
 import IconWord from '@/components/images/files/word.png';
 import IconPdf from '@/components/images/files/pdf.png';
-import { StringUtils } from "@imengyu/imengyu-utils";
+import NewsIndexContent from "@/api/news/NewsIndexContent";
+import SimplePageContentLoader from "@/common/components/SimplePageContentLoader.vue";
+import ContentNote from "../parts/ContentNote.vue";
+import Parse from "@/components/display/parse/Parse.vue";
 import Icon from "@/components/basic/Icon.vue";
 import FlexCol from "@/components/layout/FlexCol.vue";
 import Footer from "@/components/display/Footer.vue";
@@ -122,7 +125,7 @@ const loader = useSimplePageContentLoader<
   return res;
 });
 
-const { onPreviewImage } = useSwiperImagePreview(() => loader.content.value?.images || [])
+const appConfiguration = injectAppConfiguration();
 
 const emptyContent = computed(() => (loader.content.value?.content || '').trim() === '')
 const archiveInfo = computed(() => {
@@ -229,6 +232,7 @@ const { querys } = useLoadQuerys({
   id: 0,
   mainBodyColumnId: 0,
   modelId: 0,
+  showRecommend: true,
 }, (t) => loader.loadData(t));
 
 function getPageShareData() {

+ 155 - 0
src/pages/home/home.vue

@@ -0,0 +1,155 @@
+<template>
+  <view class="home-container page-home d-flex flex-col bg-base">
+    <template v-if="pageDefine">
+      <NImage 
+        innerClass="main-banner position-absolute"
+        width="100%"
+        :src="pageContentDefine?.props.homeBanner"
+        :showFailed="false"
+        mode="widthFix"
+      />
+      <view class="content d-flex flex-col wing-l">
+
+        <view class="shadow-base radius-l border-all-base main-banner-box mb-25">
+          <image 
+            class="logo"
+            src="https://mncdn.wenlvti.net/app_static/minnan/images/home/MainLogo1.png"
+          />
+          <view>
+            <text class="title">{{pageContentDefine?.props.title || ''}}</text>
+            <text>{{pageContentDefine?.props.subTitle || ''}}</text>
+          </view>
+          <image 
+            class="footer"
+            src="https://mncdn.wenlvti.net/app_static/minnan/images/home/MainBanner3.png"
+            mode="widthFix"
+          />
+        </view>
+        
+        <view class="position-relative d-flex flex-row flex-wrap justify-between mt-25 row-gap-sss">
+          <HomeButton
+            v-for="item in pageContentDefine?.props.homeButtons || []"
+            :key="item.title"
+            :title="item.showTitle !== false ? item.title : ''"
+            :icon="item.icon"
+            :size="item.size"
+            :buttonStyle="item.style"
+            @click="navTo(item.link)"
+          />
+        </view>
+
+        <!-- 分栏 -->
+        <CommonCategoryBlocks :categoryDefine="categoryDefine" />
+      </view>
+    </template>
+  </view>
+</template>
+
+<script setup lang="ts">
+import { computed } from 'vue';
+import { onShareTimeline, onShareAppMessage } from '@dcloudio/uni-app';
+import { navTo } from '@/components/utils/PageAction';
+import { CommonCategoryListTabNestCategoryDataToContent, type IHomeCommonCategoryDefine, type IHomeCommonCategoryHomeDefine } from '../article/data/CommonCategoryDefine';
+import NImage from '@/components/basic/Image.vue';
+import HomeButton from '../parts/HomeButton.vue';
+import CommonCategoryBlocks from '../article/data/CommonCategoryBlocks.vue';
+import type { CategoryDefine } from '../article/data/CommonCategoryBlocks';
+
+const props = defineProps<{
+  pageDefine: IHomeCommonCategoryDefine['page'][0],
+  pageContentDefine: IHomeCommonCategoryHomeDefine,
+}>();
+const categoryDefine = computed(() => props.pageContentDefine.props.categorys
+  .filter((item) => item.visible !== false)
+  .map((item) => {
+    return {
+      ...item,
+      showTitle: item.showTitle !== false,
+      title: item.text,
+      content: CommonCategoryListTabNestCategoryDataToContent(
+        item.data, item
+      ),
+      type: item.type as CategoryDefine['type'],
+    }
+  })
+);
+
+onShareTimeline(() => {
+  return {}; 
+})
+onShareAppMessage(() => {
+  return {}; 
+})
+</script>
+
+<style lang="scss">
+.page-home {
+
+  .main-banner {
+    top: -100rpx;
+  }
+  .content {
+    margin-top: 360rpx;
+  }
+  .main-banner-box {
+    position: relative;
+    display: flex;
+    flex-direction: row;
+    align-items: center;
+    justify-content: space-around;
+    overflow: hidden;
+    background: linear-gradient(180deg, #f9efe5 0%, #ebcab5 100%), #F7F3E8;
+    padding: 50rpx 20rpx;
+    font-family: "SongtiSCBlack";
+    color: #432A04;
+
+    > view {
+      display: flex;
+      flex-direction: column;
+      margin-left: -20rpx;
+      margin-right: 60rpx;
+    }
+
+    .logo {
+      width: 140rpx;
+      height: 85rpx;
+      margin-left: -10rpx;
+      margin-right: 0rpx;
+    }
+    
+    .title {
+      font-size: 47rpx;
+      letter-spacing: -0.15rem;
+    }
+    text {
+      font-size: 36rpx;
+      letter-spacing: -0.04rem;
+      margin-top: 10rpx;
+    }
+    .more {
+      margin-top: 30rpx;
+      padding: 10rpx 18rpx;
+      width: 180rpx;
+
+      &.badge {
+        background-image: url('https://mncdn.wenlvti.net/app_static/minnan/images/home/MainBanner.png');
+        background-size: 100% auto;
+        background-repeat: no-repeat;
+      }
+
+      text {
+        font-family: initial;
+        font-size: 30rpx;
+      }
+    }
+    .footer {
+      position: absolute;
+      right: -10rpx;
+      bottom: -10rpx;
+      width: 220rpx;
+      z-index: 2;
+      height: auto;
+    }
+  }
+}
+</style>

+ 63 - 134
src/pages/home/index.vue

@@ -1,82 +1,80 @@
 <template>
-  <view class="home-container page-home d-flex flex-col bg-base">
-    <template v-if="pageDefine">
-      <NImage 
-        innerClass="main-banner position-absolute"
-        width="100%"
-        :src="pageContentDefine?.props.homeBanner"
-        :showFailed="false"
-        mode="widthFix"
+  <view v-for="(tab, i) in tabsDefine" :key="tab.title">
+    <view v-show="currentTab === i">
+      <Home v-if="tab.type === 'home' && pageDefine" 
+        :pageDefine="pageDefine" 
+        :pageContentDefine="pageContentDefine" 
       />
-      <view class="content d-flex flex-col wing-l">
-
-        <view class="shadow-base radius-l border-all-base main-banner-box mb-25">
-          <image 
-            class="logo"
-            src="https://mncdn.wenlvti.net/app_static/minnan/images/home/MainLogo1.png"
-          />
-          <view>
-            <text class="title">{{pageContentDefine?.props.title || ''}}</text>
-            <text>{{pageContentDefine?.props.subTitle || ''}}</text>
-          </view>
-          <image 
-            class="footer"
-            src="https://mncdn.wenlvti.net/app_static/minnan/images/home/MainBanner3.png"
-            mode="widthFix"
-          />
-        </view>
-        
-        <view class="position-relative d-flex flex-row flex-wrap justify-between mt-25 row-gap-sss">
-          <HomeButton
-            v-for="item in pageContentDefine?.props.homeButtons || []"
-            :key="item.title"
-            :title="item.showTitle !== false ? item.title : ''"
-            :icon="item.icon"
-            :size="item.size"
-            :buttonStyle="item.style"
-            @click="navTo(item.link)"
-          />
-        </view>
-
-        <!-- 分栏 -->
-        <CommonCategoryBlocks :categoryDefine="categoryDefine" />
-      </view>
-    </template>
+      <FlexCol v-else-if="tab.type === 'list'">
+        <StatusBarSpace backgroundColor="background.page" />
+        <NavBar leftButton="custom" backgroundColor="background.page">
+          <template #left>
+            <Image
+              v-if="tab.pageHeadImage"
+              :src="tab.pageHeadImage"
+              :width="tab.pageHeadImageWidth"
+              mode="widthFix"
+              :innerStyle="{ 
+                marginLeft: '30rpx', marginTop: '30rpx' ,
+                ...(tab.pageHeadImageStyle || {}),
+              }"
+            />
+          </template>
+        </NavBar>
+        <CommonCategoryList :pageConfigName="tab.pageConfigName" />
+        <Height :height="150" />
+      </FlexCol>
+      <User v-else-if="tab.type === 'user'" />
+    </view>
   </view>
-  <Tabbar v-if="!isEditorPreview" :current="0" />
+  <TabBar
+    v-model:selectedTabIndex="currentTab"
+    :fixed="!isEditorPreview"
+    xbarSpace
+    :innerStyle="{
+      zIndex: 999 ,
+      boxShadow: '0 -2rpx 4rpx rgba(0, 0, 0, 0.1)',
+      backdropFilter: 'blur(10px)',
+      backgroundColor: 'rgba(246, 242, 231, 0.7)',
+    }"
+  >
+    <TabBarItem 
+      v-for="tab in tabsDefine"
+      :key="tab.title"
+      :icon="tab.icon"
+      :activeIcon="tab.activeIcon"
+      :hump="tab.hump"
+      :humpHeight="tab.humpHeight"
+      :humpSpace="tab.humpSpace"
+      :iconSize="tab.iconSize"
+      :text="tab.title"
+    />
+  </TabBar>
 </template>
 
 <script setup lang="ts">
-import { computed, inject } from 'vue';
+import { computed, inject, ref } from 'vue';
 import { onShareTimeline, onShareAppMessage } from '@dcloudio/uni-app';
-import { navTo } from '@/components/utils/PageAction';
 import { injectCommonCategory } from '../article/data/CommonCategoryGlobalLoader';
-import { CommonCategoryListTabNestCategoryDataToContent, type IHomeCommonCategoryHomeDefine } from '../article/data/CommonCategoryDefine';
-import Tabbar from '@/common/components/tabs/Tabbar.vue';
-import NImage from '@/components/basic/Image.vue';
-import HomeButton from '../parts/HomeButton.vue';
-import CommonCategoryBlocks from '../article/data/CommonCategoryBlocks.vue';
-import type { CategoryDefine } from '../article/data/CommonCategoryBlocks';
+import { type IHomeCommonCategoryHomeDefine } from '../article/data/CommonCategoryDefine';
+import TabBar from '@/components/nav/TabBar.vue';
+import TabBarItem from '@/components/nav/TabBarItem.vue';
+import FlexCol from '@/components/layout/FlexCol.vue';
+import StatusBarSpace from '@/components/layout/space/StatusBarSpace.vue';
+import NavBar from '@/components/nav/NavBar.vue';
+import Image from '@/components/basic/Image.vue';
+import Height from '@/components/layout/space/Height.vue';
+import CommonCategoryList from '../article/data/CommonCategoryList.vue';
+import Home from './home.vue';
+import User from '../user/index.vue';
 
 const commonCategory = injectCommonCategory();
 const pageDefine = computed(() => commonCategory.value.page.find((p) => p.name === 'home'));
 const pageContentDefine = computed(() => pageDefine.value?.content as IHomeCommonCategoryHomeDefine);
 const isEditorPreview = inject('editorPreviewMark', false);
 
-const categoryDefine = computed(() => pageContentDefine.value?.props.categorys
-  .filter((item) => item.visible !== false)
-  .map((item) => {
-    return {
-      ...item,
-      showTitle: item.showTitle !== false,
-      title: item.text,
-      content: CommonCategoryListTabNestCategoryDataToContent(
-        item.data, item
-      ),
-      type: item.type as CategoryDefine['type'],
-    }
-  })
-);
+const tabsDefine = computed(() => pageContentDefine.value?.props.tabs.filter((item) => item.visible !== false));
+const currentTab = ref(0);
 
 onShareTimeline(() => {
   return {}; 
@@ -87,73 +85,4 @@ onShareAppMessage(() => {
 </script>
 
 <style lang="scss">
-.page-home {
-
-  .main-banner {
-    top: -100rpx;
-  }
-  .content {
-    margin-top: 360rpx;
-  }
-  .main-banner-box {
-    position: relative;
-    display: flex;
-    flex-direction: row;
-    align-items: center;
-    justify-content: space-around;
-    overflow: hidden;
-    background: linear-gradient(180deg, #f9efe5 0%, #ebcab5 100%), #F7F3E8;
-    padding: 50rpx 20rpx;
-    font-family: "SongtiSCBlack";
-    color: #432A04;
-
-    > view {
-      display: flex;
-      flex-direction: column;
-      margin-left: -20rpx;
-      margin-right: 60rpx;
-    }
-
-    .logo {
-      width: 140rpx;
-      height: 85rpx;
-      margin-left: -10rpx;
-      margin-right: 0rpx;
-    }
-    
-    .title {
-      font-size: 47rpx;
-      letter-spacing: -0.15rem;
-    }
-    text {
-      font-size: 36rpx;
-      letter-spacing: -0.04rem;
-      margin-top: 10rpx;
-    }
-    .more {
-      margin-top: 30rpx;
-      padding: 10rpx 18rpx;
-      width: 180rpx;
-
-      &.badge {
-        background-image: url('https://mncdn.wenlvti.net/app_static/minnan/images/home/MainBanner.png');
-        background-size: 100% auto;
-        background-repeat: no-repeat;
-      }
-
-      text {
-        font-family: initial;
-        font-size: 30rpx;
-      }
-    }
-    .footer {
-      position: absolute;
-      right: -10rpx;
-      bottom: -10rpx;
-      width: 220rpx;
-      z-index: 2;
-      height: auto;
-    }
-  }
-}
 </style>

+ 5 - 5
src/pages/user/index.vue

@@ -125,19 +125,19 @@ function doLogout() {
   });
 }
 function goContributeList() {
-  requireLogin(() => navTo('contribute/list'), '登录后才能投稿哦!');
+  requireLogin(() => navTo('/pages/user/contribute/list'), '登录后才能投稿哦!');
 }
 function goCollectList() {
-  requireLogin(() => navTo('collect/index'), '登录后才能查看收藏哦!');
+  requireLogin(() => navTo('/pages/user/collect/index'), '登录后才能查看收藏哦!');
 }
 function goContribute() {
-  requireLogin(() => navTo('contribute/submit'), '登录后才能投稿哦!');
+  requireLogin(() => navTo('/pages/user/contribute/submit'), '登录后才能投稿哦!');
 }
 function goUserProfile() {
   if (authStore.isLogged)
-    navTo('profile/index');
+    navTo('/pages/user/profile/index');
   else
-    navTo('login');
+    navTo('/pages/user/login');
 }
 </script>
 

+ 8 - 7
src/pages/video/details.vue

@@ -32,7 +32,7 @@
           </view>
 
           <!-- 推荐视频 -->
-          <view v-if="recommendListLoader.content.value?.length" class="d-flex flex-col p-3">
+          <view v-if="recommendListLoader.content.value?.length && querys.showRecommend" class="d-flex flex-col p-3">
             <text class="size-base text-bold mb-3">推荐视频</text>
             <Box2LineImageRightShadow
               class="w-100"
@@ -62,21 +62,21 @@
 
 <script setup lang="ts">
 import type { GetContentDetailItem } from "@/api/CommonContent";
+import { navTo } from "@/components/utils/PageAction";
+import { computed } from "vue";
+import { useLoadQuerys } from "@/common/composeabe/LoadQuerys";
+import { useSimpleDataLoader } from "@/common/composeabe/SimpleDataLoader";
 import { useSimplePageContentLoader } from "@/common/composeabe/SimplePageContentLoader";
+import { onShareAppMessage, onShareTimeline } from "@dcloudio/uni-app";
+import { DataDateUtils } from "@imengyu/js-request-transform";
 import NewsIndexContent from "@/api/news/NewsIndexContent";
 import SimplePageContentLoader from "@/common/components/SimplePageContentLoader.vue";
-import { useLoadQuerys } from "@/common/composeabe/LoadQuerys";
-import { DataDateUtils } from "@imengyu/js-request-transform";
 import ContentNote from "../parts/ContentNote.vue";
 import Parse from "@/components/display/parse/Parse.vue";
-import { useSimpleDataLoader } from "@/common/composeabe/SimpleDataLoader";
 import CommonContent, { GetContentListParams } from "@/api/CommonContent";
 import Box2LineImageRightShadow from "../parts/Box2LineImageRightShadow.vue";
 import AppCofig from "@/common/config/AppCofig";
-import { navTo } from "@/components/utils/PageAction";
-import { computed } from "vue";
 import LikeFooter from "../parts/LikeFooter.vue";
-import { onShareAppMessage, onShareTimeline } from "@dcloudio/uni-app";
 import ArticleCorrect from "../parts/ArticleCorrect.vue";
 
 const loader = useSimplePageContentLoader<
@@ -136,6 +136,7 @@ const { querys } = useLoadQuerys({
   id: 0,
   mainBodyColumnId: 0,
   modelId: 0,
+  showRecommend: true,
 }, (t) => loader.loadData(t));
 </script>