Forráskód Böngészése

📦 传承接口对接1

imengyu 2 hete
szülő
commit
73af73226c

+ 9 - 7
src/api/RequestModules.ts

@@ -6,16 +6,17 @@
  * * 自定义错误报告处理函数。
  */
 
-import { appendGetUrlParams, appendPostParams, isNullOrEmpty } from "@/common/request/utils/Utils";
+import { appendGetUrlParams, appendPostParams, checkIfStringAllEnglish, isNullOrEmpty } from "@/common/request/utils/Utils";
 import AppCofig, { isDev } from "../common/config/AppCofig";
 import RequestApiConfig from "../common/request/core/RequestApiConfig";
 import { RequestApiError, RequestApiResult, type RequestApiErrorType } from "../common/request/core/RequestApiResult";
-import { RequestCoreInstance, RequestOptions, Response } from "../common/request/core/RequestCore";
+import { RequestCoreInstance, RequestOptions } from "../common/request/core/RequestCore";
 import { defaultResponseDataGetErrorInfo, defaultResponseDataHandlerCatch } from "../common/request/core/RequestHandler";
 import type { DataModel, NewDataModel } from "@imengyu/js-request-transform";
 import type { KeyValue } from "@/common/utils/CommonUtils";
 import { useAuthStore } from "@/store/auth";
 import ApiCofig from "@/common/config/ApiCofig";
+import uniappImplementer, { Response } from "@/common/request/implementer/Uniapp";
 
 /**
  * 不报告错误的 code
@@ -40,14 +41,12 @@ function requestInceptor(url: string, req: RequestOptions) {
     req.header['token'] = autoStore.token;
     req.header['__token__'] = autoStore.token;
   }
-  req.header['Accept'] = 'application/x.ttcxx.v1+json';
   if (req.method == 'GET') {
     //追加GET参数
     url = appendGetUrlParams(url, 'main_body_id', ApiCofig.mainBodyId);
   } else {
     req.data = appendPostParams(req.data,'main_body_id', ApiCofig.mainBodyId);
   }
-
   return { newUrl: url, newReq: req };
 }
 //响应数据处理函数
@@ -110,9 +109,12 @@ function responseDataHandler<T extends DataModel>(response: Response, req: Reque
         let errCodeStr = '';
 
         if (typeof json.message === 'string') 
-          errString = '返回:' + json.message;
+          errString = json.message;
         if (typeof json.msg === 'string') 
-          errString += '返回:' + json.msg;
+          errString += json.msg;
+
+        if (checkIfStringAllEnglish(errString))
+          errString = '服务器返回:' + errString;
 
         //错误处理
         if (errString) {
@@ -207,7 +209,7 @@ export function reportError<T extends DataModel>(instance: RequestCoreInstance<T
  */
 export class AppServerRequestModule<T extends DataModel> extends RequestCoreInstance<T> {
   constructor() {
-    super();
+    super(uniappImplementer);
     this.config.baseUrl = RequestApiConfig.getConfig().BaseUrl;
     this.config.errCodes = []; //
     this.config.requestInceptor = requestInceptor;

+ 4 - 0
src/common/components/SimplePageContentLoader.vue

@@ -70,6 +70,10 @@ const props = defineProps({
     type: Boolean,
     default: false, 
   },
+  auotEmpty: {
+    type: Boolean,
+    default: false, 
+  },
   showEmpty: {
     type: Boolean,
     default: false, 

+ 6 - 2
src/common/composeabe/SimpleDataLoader.ts

@@ -9,6 +9,7 @@ export interface ISimpleDataLoader<T, P> extends ILoaderCommon<P> {
 export function useSimpleDataLoader<T, P = any>(
   loader: (params?: P) => Promise<T>,
   loadWhenMounted = true,
+  emptyIfArrayEmpty = true,
 )  : ISimpleDataLoader<T, P>
  {
 
@@ -25,7 +26,10 @@ export function useSimpleDataLoader<T, P = any>(
     try {
       const res = (await loader(params ?? lastParams)) as T;
       content.value = res;
-      loadStatus.value = 'finished';
+      if (Array.isArray(res) && emptyIfArrayEmpty && (res as any[]).length === 0)
+        loadStatus.value = 'nomore';
+      else
+        loadStatus.value = 'finished';
       loadError.value = '';
     } catch(e) {
       loadError.value = '' + e;
@@ -39,7 +43,7 @@ export function useSimpleDataLoader<T, P = any>(
     if (loadWhenMounted) {
       setTimeout(() => {
         loadData();
-      }, (0.5 + Math.random()) * 1000);
+      }, (0.5 + Math.random()) * 500);
     }
   })
 

+ 3 - 5
src/common/request/core/RequestApiConfig.ts

@@ -11,8 +11,8 @@
  * See License.txt in the project root for license information.
  */
 
-import ApiCofig from "../../config/ApiCofig";
-import { isDev } from "../../config/AppCofig";
+import ApiCofig from "@/common/config/ApiCofig";
+import { isDev } from "@/common/config/AppCofig";
 import type { KeyValue } from "@imengyu/js-request-transform/dist/DataUtils";
 
 interface ApiConfigInterface {
@@ -41,9 +41,7 @@ interface ApiConfigInterface {
 const defaultConfig = {
   BaseUrl: isDev ? ApiCofig.serverDev : ApiCofig.serverProd,
   DataDateFormat: 'YYYY-MM-DD HH:mm:ss',
-  DefaultHeader: {
-		'content-type': 'application/json',
-  },
+  DefaultHeader: {},
   EnableApiRequestLog: true,
   EnableApiDataLog: false,
 } as ApiConfigInterface;

+ 5 - 3
src/common/request/core/RequestApiResult.ts

@@ -21,6 +21,9 @@ export class RequestApiResult<T extends DataModel> {
   public code = 0;
   public message = '';
   public data: T|KeyValue|null = null;
+  /**
+   * 无类型数据
+   */
   public data2: any = null;
   public raw: any = null;
 
@@ -35,14 +38,13 @@ export class RequestApiResult<T extends DataModel> {
       this.data = new c().fromServerSide(data as KeyValue) as T;//转换data
     else if (typeof rawData !== 'undefined' && c)
       this.data = new c().fromServerSide(rawData as KeyValue) as T;//如果data为空则转换rawData
-    else {
+    else
       this.data = data as KeyValue as T; //原始数据
-      this.data2 = this.data;
-    }
     if (typeof rawData !== 'undefined')
       this.raw = rawData;
     else
       this.raw = this.data;
+    this.data2 = this.data;
   }
 
   /**

+ 28 - 102
src/common/request/core/RequestCore.ts

@@ -1,10 +1,12 @@
 import RequestApiConfig from './RequestApiConfig';
 import { DataModel, type NewDataModel } from '@imengyu/js-request-transform';
-import { isNullOrEmpty, stringHashCode } from '../utils/Utils';
+import { stringHashCode } from '../utils/Utils';
 import { RequestApiError, RequestApiResult } from './RequestApiResult';
 import { defaultResponseDataHandler, defaultResponseErrorHandler } from './RequestHandler';
 import type { HeaderType, QueryParams, TypeSaveable } from '../utils/AllType';
 import type { KeyValue } from '@imengyu/js-request-transform/dist/DataUtils';
+import type { RequestImplementer } from './RequestImplementer';
+import { FormData, type Response } from '../implementer/Uniapp';
 
 /**
  * API 请求核心
@@ -83,7 +85,7 @@ export interface RequestCacheConfig {
   cacheEnable: boolean,
 }
 
-interface CacheStorage {
+export interface RequestCacheStorage {
   time: number,
   data: TypeSaveable
 }
@@ -92,7 +94,7 @@ export class RequestOptions {
   /**
    * 请求的参数
    */
-  data?: string | object | ArrayBuffer;
+  data?: string | object | ArrayBuffer | FormData;
   /**
   * 设置请求的 header,header 中不能设置 Referer。
   */
@@ -127,62 +129,15 @@ export class RequestOptions {
   */
   firstIpv4?: boolean;
 }
-export class Response {
-  public constructor(url: string, data: unknown, options: {
-    headers: Record<string, unknown>,
-    status: number,
-  }, errMsg: string) {
-    this.errMsg = errMsg;
-    this.data = data;
-    this.url = url;
-    this.status = options.status;
-    this.headers = options.headers;
-    this.ok = options.status >= 200 && options.status <= 399;
-    this.statusText = `Status: ${options.status}`;
-  }
-
-  headers: Record<string, unknown>;
-  ok: boolean;
-  status: number;
-  statusText: string;
-  errMsg: string;
-  url: string;
-  data: unknown;
-
-  json() : Promise<any> {
-    return new Promise<any>((resolve, reject) => {
-      if (typeof this.data === 'undefined' || isNullOrEmpty(this.data)) {
-        resolve({});
-        return;
-      }
-      if (typeof this.data === 'object') {
-        resolve(this.data);
-        return;
-      }
-      let data = null;
-      
-      if (typeof this.data === 'string') {
-        try {
-          data = JSON.parse(this.data);
-        } catch(e) {
-          console.log('json error: ' + e,  this.data);
-          
-          reject(e);
-        }
-      } else {
-        data = this.data;
-      }
-
-      resolve(data);
-    })
-  }
-}
-
 /**
  * API 请求核心实例类,本类是对 fetch 的封装,提供了基本的请求功能。
  */
 export class RequestCoreInstance<T extends DataModel> {
 
+  constructor(implementer: RequestImplementer) {
+    this.implementer = implementer;
+  }
+
   /**
    * 当前请求实例的请求配置项
    */
@@ -197,6 +152,11 @@ export class RequestCoreInstance<T extends DataModel> {
   };
 
   /**
+   * 请求实现类
+   */
+  implementer: RequestImplementer;
+
+  /**
    * 检查是否需要报告错误
    */
   checkShouldReportError(err: RequestApiError) {
@@ -286,9 +246,7 @@ export class RequestCoreInstance<T extends DataModel> {
     if (cacheTime > 0) {
       requestHash = "RequestCache" + stringHashCode(url + req.method);
       //获取数据
-      const c = localStorage.getItem(requestHash);
-      if (c) {
-        const cacheData = JSON.parse(c) as CacheStorage; 
+      this.implementer.getCache(requestHash).then((cacheData) => {
         if (!cacheData) {
           callback(cacheTime, requestHash, null);
           return;
@@ -299,10 +257,11 @@ export class RequestCoreInstance<T extends DataModel> {
           return;
         }
         callback(cacheTime, requestHash, null);
-      }
-    } else {
+      }).catch(() => {
+        callback(cacheTime, requestHash, null);
+      }); 
+    } else
       callback(cacheTime, requestHash, null);
-    }
   }
 
   /**
@@ -323,6 +282,11 @@ export class RequestCoreInstance<T extends DataModel> {
         url = newUrl;
         req = newReq;
       }
+      if (req.data instanceof FormData) {
+        req.header['Content-Type'] = 'multipart/form-data';
+      } else if (typeof req.data === 'object' || req.data === undefined) {
+        req.header['Content-Type'] = 'application/json';
+      }
 
       if (RequestApiConfig.getConfig().EnableApiRequestLog)
         console.log(`[API Debugger] Q > ${apiName} [${req.method || 'GET'}] ` + url, req.data);
@@ -342,10 +306,10 @@ export class RequestCoreInstance<T extends DataModel> {
         this.requestAndResponse(url, req, apiName, modelClassCreator, (result) => {
           //保存缓存
           if (cacheTime > 0) {
-            localStorage.setItem(cacheKey, JSON.stringify({
+            this.implementer.setCache(cacheKey, {
               time: new Date().getTime() + cacheTime,
               data: result as unknown as TypeSaveable,
-            } as CacheStorage));
+            });
           }
         }).then((d) => {
           resolve(d);
@@ -356,49 +320,11 @@ export class RequestCoreInstance<T extends DataModel> {
     });
   }
 
-  /*private startRequest(url: string, init?: RequestOptions, timeout = 10000): Promise<Response> {
-    // 创建 AbortController 实例
-    const controller = new AbortController();
-    const { signal } = controller;
-
-    // 设置超时逻辑
-    const timeoutId = setTimeout(() => {
-      controller.abort(); // 超时后取消请求
-    }, timeout);
-
-    // 发起 fetch 请求
-    const response = fetch(url, { ...init, signal });
-
-    // 请求完成后清除超时
-    response.finally(() => clearTimeout(timeoutId));
-    return response
-  }*/
-
-  private startUniappRequest(url: string, init?: RequestOptions, timeout = 10000): Promise<Response> {
-    return new Promise<Response>((resolve, reject) => {
-      uni.request({
-        url: url,
-        timeout: timeout,
-        ...init,
-        success(res) {
-          const response = new Response(url, res.data, {
-            headers: res.header,
-            status: res.statusCode,
-          }, 'success');
-          resolve(response);
-        },
-        fail(res) {
-          reject(res);
-        },
-      })
-    });
-  }
-  
   //发送请求并且处理
   private requestAndResponse(url: string, req: RequestOptions, apiName: string, resultModelClass: NewDataModel|undefined, saveCache?: (result: unknown) => void) {
     return new Promise<RequestApiResult<T>>((resolve, reject) => {
       //发起请求
-      this.startUniappRequest(url, req, this.config.timeout).then((res) => {
+      this.implementer.doRequest(url, req, this.config.timeout).then((res) => {
         //响应拦截
         if (this.config.responseInceptor)
           res = this.config.responseInceptor(res);
@@ -447,7 +373,7 @@ export class RequestCoreInstance<T extends DataModel> {
    * @param querys 请求URL参数
    * @param cache 缓存参数
    */
-  post(url: string, data: KeyValue, apiName: string, querys?: QueryParams, modelClassCreator?: NewDataModel, cache?: RequestCacheConfig, headers?: KeyValue) {
+  post(url: string, data: KeyValue|FormData, apiName: string, querys?: QueryParams, modelClassCreator?: NewDataModel, cache?: RequestCacheConfig, headers?: KeyValue) {
     return this.request(this.makeUrl(url, querys), { method: 'POST', data, header: headers }, apiName, modelClassCreator, cache);
   }
   /**

+ 2 - 1
src/common/request/core/RequestHandler.ts

@@ -1,7 +1,8 @@
 import ApiConfig from "./RequestApiConfig";
 import { DataModel, type NewDataModel } from "@imengyu/js-request-transform";
 import { RequestApiError, type RequestApiErrorType, RequestApiResult } from "./RequestApiResult";
-import { RequestCoreInstance, RequestOptions, Response } from "./RequestCore";
+import { RequestCoreInstance, RequestOptions } from "./RequestCore";
+import type { Response } from "../implementer/Uniapp";
 
 /**
  * 请求错误与数据处理函数

+ 8 - 0
src/common/request/core/RequestImplementer.ts

@@ -0,0 +1,8 @@
+import type { Response } from "../implementer/Uniapp";
+import type { RequestCacheStorage, RequestOptions } from "./RequestCore";
+
+export interface RequestImplementer {
+  getCache(key: string): Promise<RequestCacheStorage|null>;
+  setCache(key: string, value: RequestCacheStorage|null): Promise<void>;
+  doRequest(url: string, init?: RequestOptions, timeout?: number): Promise<Response>;
+}

+ 153 - 0
src/common/request/implementer/Uniapp.ts

@@ -0,0 +1,153 @@
+import type { RequestCacheStorage, RequestOptions } from "../core/RequestCore";
+import type { RequestImplementer } from "../core/RequestImplementer";
+import { isNullOrEmpty } from "../utils/Utils";
+
+export class FormData implements Record<string, any> {
+  public constructor() {}
+
+  [index: string]: any;
+
+  // 添加字段
+  append(name: string, value: any) {
+    if (!this[name]) {
+      this[name] = [];
+    }
+    this[name].push(value);
+  }
+
+  // 获取字段值
+  get(name: string) {
+    if (this[name]) {
+      return this[name][0];
+    }
+    return null;
+  }
+
+  // 获取所有字段值
+  getAll(name: string) {
+    return this[name] || [];
+  }
+
+  // 删除字段
+  delete(name: string) {
+    delete this[name];
+  }
+
+  // 检查是否存在字段
+  has(name: string) {
+    return this[name] !== undefined;
+  }
+
+  // 设置字段值(覆盖原有值)
+  set(name: string, value: any) {
+    this[name] = value;
+  }
+
+  // 获取所有字段的键名
+  getKeys() {
+    return Object.keys(this);
+  }
+}
+export class Response {
+  public constructor(url: string, data: unknown, options: {
+    headers: Record<string, unknown>,
+    status: number,
+  }, errMsg: string) {
+    this.errMsg = errMsg;
+    this.data = data;
+    this.url = url;
+    this.status = options.status;
+    this.headers = options.headers;
+    this.ok = options.status >= 200 && options.status <= 399;
+  }
+
+  get statusText() {
+    return this.ok ? 'OK' : 'ERROR:' + this.status;
+  }
+
+  headers: Record<string, unknown>;
+  ok: boolean;
+  status: number;
+  errMsg: string;
+  url: string;
+  data: unknown;
+
+  json() : Promise<any> {
+    return new Promise<any>((resolve, reject) => {
+      if (typeof this.data === 'undefined' || isNullOrEmpty(this.data)) {
+        resolve({});
+        return;
+      }
+      if (typeof this.data === 'object') {
+        resolve(this.data);
+        return;
+      }
+      let data = null;
+      
+      if (typeof this.data === 'string') {
+        try {
+          data = JSON.parse(this.data);
+        } catch(e) {
+          console.log('json error: ' + e,  this.data);
+          
+          reject(e);
+        }
+      } else {
+        data = this.data;
+      }
+
+      resolve(data);
+    })
+  }
+}
+
+const uniappImplementer : RequestImplementer = {
+  getCache: function (key: string) {
+    return new Promise<RequestCacheStorage|null>((resolve, reject) => {
+      uni.getStorage({
+        key: key,
+        success: (res) => {
+          resolve(res.data ? JSON.parse(res.data) as RequestCacheStorage : null);
+        },
+        fail: (res) => {
+          resolve(null);
+        }
+      });
+    });
+  },
+  setCache: async function (key: string, value: RequestCacheStorage|null) {
+    return new Promise<void>((resolve, reject) => {
+      uni.setStorage({
+        key: key,
+        data: JSON.stringify(value),
+        success: (res) => {
+          resolve();
+        },
+        fail: (res) => {
+          resolve();
+        }
+      });
+    });
+  },
+  doRequest: function (url: string, init?: RequestOptions, timeout?: number): Promise<Response> {
+    return new Promise<Response>((resolve, reject) => {
+      uni.request({
+        url: url,
+        timeout: timeout,
+        ...init,
+        success(res) {
+          const response = new Response(url, res.data, {
+            headers: res.header,
+            status: res.statusCode,
+          }, 'success');
+          resolve(response);
+        },
+        fail(res) {
+          reject(res);
+        },
+      })
+    });
+  }
+};
+
+export default uniappImplementer;

+ 44 - 0
src/common/request/implementer/WebFetch.ts

@@ -0,0 +1,44 @@
+import type { RequestCacheStorage, RequestOptions } from "../core/RequestCore";
+import type { RequestImplementer } from "../core/RequestImplementer";
+
+const fetchImplementer : RequestImplementer = {
+  getCache: async function (key: string) {
+    const v = localStorage.getItem(key);
+    return v ? JSON.parse(v) as RequestCacheStorage : null;
+  },
+  setCache: async function (key: string, value: RequestCacheStorage|null) {
+    localStorage.setItem(key, JSON.stringify(value));
+  },
+  doRequest: function (url: string, init?: RequestOptions, timeout?: number): Promise<Response> {
+    // 创建 AbortController 实例
+    const controller = new AbortController();
+    const { signal } = controller;
+
+    // 设置超时逻辑
+    const timeoutId = setTimeout(() => {
+      controller.abort(); // 超时后取消请求
+    }, timeout);
+
+    let body : string|FormData|undefined;
+    if (init?.data instanceof FormData)
+      body = init.data; 
+    else if (typeof init?.data === 'object') {
+      body = JSON.stringify(init.data); 
+    }
+
+    // 发起 fetch 请求
+    const response = fetch(url, { 
+      headers: init?.header,
+      method: init?.method,
+      body,
+      signal 
+    });
+
+    // 请求完成后清除超时
+    response.finally(() => clearTimeout(timeoutId));
+    return response
+  }
+};
+
+
+export default fetchImplementer;

+ 9 - 1
src/common/request/utils/Utils.ts

@@ -14,6 +14,7 @@
 /* eslint-disable no-bitwise */
 import type { KeyValue } from "@imengyu/js-request-transform/dist/DataUtils";
 import type { TypeSaveable } from "./AllType";
+import { FormData } from "../implementer/Uniapp";
 
 export function isNullOrEmpty(val: unknown) {
   return !val || typeof val === 'undefined' || val === '';
@@ -45,6 +46,11 @@ export function stringHashCode(str: string) {
     return (a & a);
   }, 0));
 }
+
+export function checkIfStringAllEnglish(str: string) {
+  return /^[\x00-\x7F]+$/.test(str)
+}
+
 export function appendGetUrlParams(url: string, key: string, value: any) {
   if (!url.includes(`?${key}`) && !url.includes(`&${key}`)) {
     if (url.includes('?'))
@@ -55,7 +61,9 @@ export function appendGetUrlParams(url: string, key: string, value: any) {
   return url;
 }
 export function appendPostParams(source: any, key: string, value: any) {
-  if (typeof source === 'object' && source[key] === undefined)
+  if (source instanceof FormData && !source.has(key))
+    source.append(key, value);
+  else if (typeof source === 'object' && source[key] === undefined)
     source = { ...source, [key]: value };
   return source;
 }

+ 1 - 1
src/manifest.json

@@ -1,5 +1,5 @@
 {
-	"name": "xiangan",
+	"name": "mingnan",
 	"appid": "__UNI__971AA7D",
 	"description": "",
 	"versionName": "1.0.0",

+ 60 - 87
src/pages/inhert.vue

@@ -9,38 +9,42 @@
       
       <!-- 文物 -->
       <HomeTitle title="文物" showMore inWing />
-      <scroll-view scroll-x>
-        <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
-          <Box2LineLargeImageUserShadow
-            v-for="(item, i) in artifactData"
-            classNames="width-2-5 mr-2"
-            titleColor="title-text"
-            :key="i"
-            :title="item.title"
-            :image="item.image"
-            :likes="item.likes"
-            :comment="item.comment"
-          />
-        </view>
-      </scroll-view>
+      <SimplePageContentLoader :loader="artifactData">
+        <scroll-view scroll-x>
+          <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
+            <Box2LineLargeImageUserShadow
+              v-for="(item, i) in artifactData.content.value"
+              classNames="width-2-5 mr-2"
+              titleColor="title-text"
+              :key="i"
+              :title="item.title"
+              :image="item.image"
+              :likes="item.likes"
+              :comment="item.comment"
+            />
+          </view>
+        </scroll-view>
+      </SimplePageContentLoader>
 
       <!-- 非遗 -->
       <HomeTitle title="非遗" showMore inWing />
-      <scroll-view scroll-x>
-        <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
-          <Box2LineLargeImageUserShadow
-            v-for="(item, i) in intangibleData"
-            classNames="width-2-3 mr-2"
-            titleColor="title-text"
-            :key="i"
-            :title="item.title"
-            :desc="item.desc"
-            :image="item.image"
-            :bottomLocate="item.bottomLocate"
-            :bottomScore="item.bottomScore"
-          />
-        </view>
-      </scroll-view>
+      <SimplePageContentLoader :loader="intangibleData" >
+        <scroll-view scroll-x>
+          <view class="padding-wing-l pb-3 pt-3 d-flex flex-row overflow-visible align-stretch">
+            <Box2LineLargeImageUserShadow
+              v-for="(item, i) in intangibleData.content.value"
+              classNames="width-2-3 mr-2"
+              titleColor="title-text"
+              :key="i"
+              :title="item.title"
+              :desc="item.desc"
+              :image="item.image"
+              :bottomLocate="item.bottomLocate"
+              :bottomScore="item.bottomScore"
+            />
+          </view>
+        </scroll-view>
+      </SimplePageContentLoader>
 
       <!-- 闽南语在线课程 -->
       <HomeTitle title="闽南语在线课程" showMore inWing />
@@ -148,67 +152,36 @@ import Box2LineLargeImageUserShadow from './parts/Box2LineLargeImageUserShadow.v
 import Box2LinePlayRightArrow from './parts/Box2LinePlayRightArrow.vue';
 import Box1AudioPlay from './parts/Box1AudioPlay.vue';
 import Box2LineRightShadow from './parts/Box2LineRightShadow.vue';
+import { useSimpleDataLoader } from '@/common/composeabe/SimpleDataLoader';
+import UnmoveableContent from '@/api/inheritor/UnmoveableContent';
+import { GetContentListParams } from '@/api/CommonContent';
+import SimplePageContentLoader from '@/common/components/SimplePageContentLoader.vue';
+import ProjectsContent from '@/api/inheritor/ProjectsContent';
 
-const artifactData = [
-  { 
-    title: '闽南漆线雕', 
-    desc: '',
-    image: TestImage1,
-    likes: 123,
-    comment: 66,
-  },
-  { 
-    title: '茶艺传承作坊', 
-    desc: '', 
-    image: TestImage2,
-    likes: 123,
-    comment: 66,
-  },
-  { 
-    title: '闽南漆线雕', 
-    desc: '',
-    image: TestImage1,
-    likes: 123,
-    comment: 66,
-  },
-  { 
-    title: '茶艺传承作坊', 
+const artifactData = useSimpleDataLoader(async () => 
+  (await UnmoveableContent.getContentList(new GetContentListParams().setSelfValues({
+    type: GetContentListParams.TYPE_ARTICLE,
+    flag: 'recommend',
+  }), 1, 4)).list.map(p => ({
+    title: p.title, 
     desc: '', 
-    image: TestImage2,
-    likes: 123,
-    comment: 66,
-  },
-]
-const intangibleData = [
-  { 
-    title: '南安水头', 
-    desc: '千年古镇风情',
-    bottomLocate: '泉州市',
-    bottomScore: '5.0',
-    image: TestImage3,
-  },
-  { 
-    title: '南安水头', 
-    desc: '千年古镇风情',
-    bottomLocate: '泉州市',
+    image: p.image,
+    likes: p.likes,
+    comment: p.comments,
+  }))
+, true);
+const intangibleData = useSimpleDataLoader(async () => 
+  (await ProjectsContent.getContentList(new GetContentListParams().setSelfValues({
+    type: GetContentListParams.TYPE_ARTICLE,
+    flag: 'recommend',
+  }), 1, 4)).list.map(p => ({
+    title: p.title, 
+    desc: p.desc, 
+    image: p.image,
+    bottomLocate: p.area as string,
     bottomScore: '5.0',
-    image: TestImage4,
-  },
-  { 
-    title: '南安水头', 
-    desc: '千年古镇风情',
-    bottomLocate: '泉州市',
-    bottomScore: '5.0',
-    image: TestImage3,
-  },
-  { 
-    title: '南安水头', 
-    desc: '千年古镇风情',
-    bottomLocate: '泉州市',
-    bottomScore: '5.0',
-    image: TestImage4,
-  },
-]
+  }))
+, true);
 const corseData = [
   { 
     title: '南安水头', 

+ 2 - 2
src/pages/parts/Box2LineLargeImageUserShadow.vue

@@ -10,8 +10,8 @@
       <image class="width-60 mr-2" :src="userHead" mode="widthFix" />
       <text class="size-s">{{ userName }}</text>
     </view>
-    <text :class="`color-${titleColor}`">{{ title }}</text>
-    <text v-if="desc" class="color-second mt-2">{{ desc }}</text>
+    <text :class="`color-${titleColor} text-lines-1 mt-2`">{{ title }}</text>
+    <text v-if="desc" class="color-second text-lines-1 mt-2">{{ desc }}</text>
     <view v-if="likes !== undefined && comment !== undefined" class="d-flex flex-row mt-2">
       <image class="width-40 mr-2" :src="IconHeart" mode="widthFix" />
       <text class="size-s mr-3">{{ likes }}</text>

+ 1 - 1
src/store/auth.ts

@@ -22,7 +22,7 @@ export const useAuthStore = defineStore('auth', {
         this.expireAt = authInfo.expireAt;
 
         // 检查token是否过期,如果快要过期,则刷新token
-        if (Date.now() > this.expireAt - 1000 * 3600 * 5) {
+        if (Date.now() > this.expireAt + 1000 * 3600 * 5) {
           const refreshResult = await UserApi.refresh();
           this.loginResultHandle(refreshResult);
           this.userInfo = refreshResult.mainBodyUserInfo;