Pārlūkot izejas kodu

🎨 修改细节问题,发布更新

快乐的梦鱼 2 dienas atpakaļ
vecāks
revīzija
52fe285f73

+ 4 - 0
src/api/BaseAppServerRequestModule.ts

@@ -76,10 +76,14 @@ export function reportError<T extends DataModel>(instance: RequestCoreInstance<T
 
 export const BaseAppServerRequestUrlManager = {
   urlConfigListeners: [] as { name: string, fn: (baseUrl: string) => void }[],
+  alreadyPushedUrl: '',
   pushUrlConfigListener(name: string, fn: (baseUrl: string) => void) {
     this.urlConfigListeners.push({ name, fn });
+    if (this.alreadyPushedUrl !== '')
+      fn(this.alreadyPushedUrl);
   },
   notifyUrlConfigUpdated(name: string, baseUrl: string) {
+    this.alreadyPushedUrl = baseUrl;
     this.urlConfigListeners.forEach(item => {
       if (item.name === name) {
         item.fn(baseUrl);

+ 1 - 1
src/api/CommonContent.ts

@@ -549,7 +549,7 @@ export class CommonContentApi extends AppServerRequestModule<DataModel> {
       fullurl: string,
       url: string
     }>((resolve, reject) => {
-      let url = RequestApiConfig.getConfig().BaseUrl + '/common/upload';
+      let url = this.config.baseUrl + '/common/upload';
       let req : RequestOptions = {
         method: 'POST',
         data: data,

+ 5 - 1
src/api/system/ConfigurationApi.ts

@@ -34,7 +34,11 @@ export class ConfigurationApi extends UpdateServerRequestModule<DataModel> {
    * @returns 
    */
   async getConfig() {
-    const isDev = getMpEnvVersion() === 'release' ? false : true;
+    const isDev = 
+      // #ifdef MP-WEIXIN
+      getMpEnvVersion() === 'release' ? false : 
+      // #endif
+      true;
     try {
       return (await this.get<{
         data: IConfigurationItem

+ 4 - 1
src/pages/article/data/CommonCategoryGlobalLoader.ts

@@ -32,7 +32,10 @@ export function useCommonCategoryGlobalLoader() {
       }
       //根据环境版本,使用正式配置或体验配置
       const category = (await CommonCategoryApi.getConfig(
-        getMpEnvVersion() === 'release' ? false : true
+        // #ifdef MP-WEIXIN
+        getMpEnvVersion() === 'release' ? false : 
+        // #endif
+        true
       )) as any as IHomeCommonCategoryDefine;
       if (category)
         commonCategoryData.value = category;

+ 13 - 7
src/pages/article/data/DefaultCategory.json

@@ -27,8 +27,8 @@
               "showTitle": false
             },
             {
-              "title": "遗产报你知",
-              "icon": "https://mn.wenlvti.net/uploads/20260205/3b440b15c9a583d201be9589ab6136aa.png",
+              "title": "文化遗产说",
+              "icon": "http://mnwh.wenlvti.net/uploads/20260206/ebb8c0f75d49ddb6afed633bece0ca50.png",
               "size": 50,
               "link": "/pages/article/data/list?pageConfigName=inhert",
               "style": "large-bg",
@@ -220,13 +220,19 @@
               "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],
+              "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
+              "pageHeadImage": "http://mnwh.wenlvti.net/uploads/20260206/0b799e1b1f2f6cc66f819a0a19fc0837.png",
+              "pageHeadImageWidth": 200
             },
             {
               "title": "乐游",
@@ -1036,7 +1042,7 @@
     },
     {
       "name": "inhert",
-      "title": "遗产报你知",
+      "title": "文化遗产说",
       "content": {
         "type": "CommonList",
         "props": {

+ 1 - 0
src/pages/article/data/editor/composables/usePageList.ts

@@ -19,6 +19,7 @@ function createHomePageTemplate(): IHomeCommonCategoryHomeDefine {
       homeBanner: '',
       homeButtons: [],
       categorys: [],
+      tabs: [],
     },
   };
 }

+ 118 - 3
src/pages/article/data/editor/editors/HomePropsEditor.vue

@@ -52,22 +52,137 @@
       <a-collapse-panel key="categorys" header="首页栏目">
         <NestCategoryEditor v-model:categorys="props.props.categorys" />
       </a-collapse-panel>
+
+      <a-collapse-panel key="tabs" header="首页 Tab 控制 (tabs)">
+        <template #extra>
+          <PlusOutlined @click.stop="addTab" />
+        </template>
+        <div v-for="(tab, i) in tabsList" :key="i" class="nested-item">
+          <a-form :labelCol="{ span: 6 }" size="small">
+            <a-form-item label="标签标题">
+              <a-input v-model:value="tab.title" />
+            </a-form-item>
+            <a-form-item label="标签类型">
+              <a-select v-model:value="tab.type" style="width: 100%">
+                <a-select-option value="home">首页</a-select-option>
+                <a-select-option value="list">内嵌列表页</a-select-option>
+                <a-select-option value="user">用户页</a-select-option>
+              </a-select>
+            </a-form-item>
+            <a-form-item label="图标 URL">
+              <IconEditor v-model="tab.icon" />
+            </a-form-item>
+            <a-form-item label="选中图标 URL">
+              <IconEditor v-model="tab.activeIcon" />
+            </a-form-item>
+            <a-form-item label="是否可见">
+              <a-checkbox v-model:checked="tab.visible" :indeterminate="tab.visible === undefined" />
+            </a-form-item>
+            <a-form-item label="是否凸起">
+              <a-checkbox v-model:checked="tab.hump" :indeterminate="tab.hump === undefined" />
+            </a-form-item>
+            <template v-if="tab.hump">
+              <a-form-item label="凸起高度 [上,下]">
+                <a-space>
+                  <a-input-number :value="getHumpHeight(tab, 0)" :min="0" placeholder="上" size="small" style="width: 80px" @update:value="setHumpHeight(tab, 0, $event)" />
+                  <a-input-number :value="getHumpHeight(tab, 1)" :min="0" placeholder="下" size="small" style="width: 80px" @update:value="setHumpHeight(tab, 1, $event)" />
+                </a-space>
+              </a-form-item>
+              <a-form-item label="凸起间距 [左,右]">
+                <a-space>
+                  <a-input-number :value="getHumpSpace(tab, 0)" :min="0" placeholder="左" size="small" style="width: 80px" @update:value="setHumpSpace(tab, 0, $event)" />
+                  <a-input-number :value="getHumpSpace(tab, 1)" :min="0" placeholder="右" size="small" style="width: 80px" @update:value="setHumpSpace(tab, 1, $event)" />
+                </a-space>
+              </a-form-item>
+              <a-form-item label="图标大小">
+                <a-input-number v-model:value="tab.iconSize" :min="1" style="width: 100%" />
+              </a-form-item>
+            </template>
+            <template v-if="tab.type === 'list'">
+              <a-form-item label="页面配置名">
+                <a-select
+                  v-model:value="tab.pageConfigName"
+                  placeholder="选择列表页"
+                  allow-clear
+                  style="width: 100%"
+                >
+                  <a-select-option v-for="p in pageListForSelect" :key="p.name" :value="p.name">
+                    {{ p.title }} ({{ p.name }})
+                  </a-select-option>
+                </a-select>
+              </a-form-item>
+              <a-form-item label="头部图片 URL">
+                <IconEditor
+                  :model-value="tab.pageHeadImage ?? ''"
+                  @update:model-value="(v) => (tab.pageHeadImage = v)"
+                />
+              </a-form-item>
+              <a-form-item label="头部图片宽度">
+                <a-input-number v-model:value="tab.pageHeadImageWidth" :min="1" style="width: 100%" />
+              </a-form-item>
+            </template>
+            <a-popconfirm title="确定要删除这个 Tab 吗?" @confirm="removeTab(i)">
+              <a-button type="text" danger size="small" @click.stop="">
+                <DeleteOutlined title="删除" />
+              </a-button>
+            </a-popconfirm>
+          </a-form>
+        </div>
+      </a-collapse-panel>
     </a-collapse>
   </div>
 </template>
 
 <script setup lang="ts">
-import { ref } from 'vue';
+import { ref, computed, inject, type Ref } from 'vue';
 import { PlusOutlined, DeleteOutlined } from '@ant-design/icons-vue';
-import type { IHomeCommonCategoryHomeDefine, IHomeCommonCategoryListTabNestCategoryItemDefine } from '../../CommonCategoryDefine';
+import type { IHomeCommonCategoryDefine, IHomeCommonCategoryHomeDefine, IHomeCommonCategoryListTabNestCategoryItemDefine } from '../../CommonCategoryDefine';
 import LinkPathEditor from '../components/LinkPathEditor.vue';
 import IconEditor from '../components/IconEditor.vue';
 import NestCategoryEditor from '../subpart/NestCategoryEditor.vue';
 
+type HomeTabItem = IHomeCommonCategoryHomeDefine['props']['tabs'][number];
+
 const props = defineProps<{
   props: IHomeCommonCategoryHomeDefine['props'];
 }>();
-const activeKeys = ref<string[]>(['homeButtons', 'categorys']);
+const pageList = inject<(Ref<IHomeCommonCategoryDefine['page'][0][]>)>('pageList', undefined as any);
+const activeKeys = ref<string[]>(['homeButtons', 'categorys', 'tabs']);
+
+const tabsList = computed(() => props.props.tabs ?? []);
+const pageListForSelect = computed(() => pageList.value?.filter((p) => p.name));
+
+function addTab(event: MouseEvent) {
+  event.stopPropagation();
+  props.props.tabs = props.props.tabs || [];
+  props.props.tabs.push({
+    title: '新 Tab',
+    icon: '',
+    activeIcon: '',
+    type: 'list',
+  });
+}
+function removeTab(i: number) {
+  props.props.tabs?.splice(i, 1);
+}
+function getHumpHeight(tab: HomeTabItem, index: 0 | 1): number {
+  const arr = tab.humpHeight ?? [0, 0];
+  return arr[index] ?? 0;
+}
+function setHumpHeight(tab: HomeTabItem, index: 0 | 1, value: number | null) {
+  const arr = tab.humpHeight ?? [0, 0];
+  tab.humpHeight = [...arr];
+  tab.humpHeight[index] = value ?? 0;
+}
+function getHumpSpace(tab: HomeTabItem, index: 0 | 1): number {
+  const arr = tab.humpSpace ?? [20, 20];
+  return arr[index] ?? 20;
+}
+function setHumpSpace(tab: HomeTabItem, index: 0 | 1, value: number | null) {
+  const arr = tab.humpSpace ?? [20, 20];
+  tab.humpSpace = [...arr];
+  tab.humpSpace[index] = value ?? 20;
+}
 
 function addHomeButton(event: MouseEvent) {
   event.stopPropagation();

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

@@ -114,13 +114,13 @@ const emit = defineEmits<{
 }>();
 
 const isDevValue = computed({
-  get: () => props.isDev,
-  set: (v: boolean) => emit('update:isDev', v),
+  get: () => props.isDev ? 'true' : 'false',
+  set: (v: boolean) => emit('update:isDev', Boolean(v)),
 });
 
 const envOptions = [
-  { value: true, label: '开发版' },
-  { value: false, label: '正式版' },
+  { value: 'true', label: '开发版' },
+  { value: 'false', label: '正式版' },
 ];
 </script>