Explorar o código

📦 下载自查评估表PDF和佐证资料上传

快乐的梦鱼 hai 4 días
pai
achega
d8b185d4cb

+ 7 - 0
package-lock.json

@@ -28,6 +28,7 @@
         "@imengyu/js-request-transform": "^0.3.7",
         "ant-design-vue": "^4.2.6",
         "async-validator": "^4.2.5",
+        "crypto-js": "^4.2.0",
         "parse5": "^8.0.0",
         "pinia": "^3.0.1",
         "tslib": "^2.8.1",
@@ -12975,6 +12976,12 @@
         "node": "*"
       }
     },
+    "node_modules/crypto-js": {
+      "version": "4.2.0",
+      "resolved": "https://registry.npmmirror.com/crypto-js/-/crypto-js-4.2.0.tgz",
+      "integrity": "sha512-KALDyEYgpY+Rlob/iriUtjV6d5Eq+Y191A5g4UqLAi8CyGP9N1+FdVbkc1SxKc2r4YAYqG8JzO2KGL+AizD70Q==",
+      "license": "MIT"
+    },
     "node_modules/css-font-size-keywords": {
       "version": "1.0.0",
       "resolved": "https://registry.npmjs.org/css-font-size-keywords/-/css-font-size-keywords-1.0.0.tgz",

+ 1 - 0
package.json

@@ -56,6 +56,7 @@
     "@imengyu/js-request-transform": "^0.3.7",
     "ant-design-vue": "^4.2.6",
     "async-validator": "^4.2.5",
+    "crypto-js": "^4.2.0",
     "parse5": "^8.0.0",
     "pinia": "^3.0.1",
     "tslib": "^2.8.1",

+ 75 - 4
src/api/collect/AssessmentContent.ts

@@ -212,8 +212,9 @@ export class SelfAssessmentDetail extends DataModel<SelfAssessmentDetail> {
       level: { clientSide: 'number', serverSide: 'string' },
       awardTime: { clientSide: 'date', serverSide: 'string' },
       checkItems: {
-        clientSide: 'array',
-        clientSideChildDataModel: SelfAssessmentCheckItemAnswer,
+        customToClientFn: (value) => {
+          return transformArrayDataModel(SelfAssessmentCheckItemAnswer, transformSomeToArray(value), 'data');
+        },
         customToServerFn: (value) => {
           return (value as SelfAssessmentCheckItemAnswer[])
             .filter(item => item.count > 0)
@@ -329,6 +330,42 @@ export class AgreementDetail extends DataModel<AgreementDetail> {
   updatetime = new Date();
 }
 
+/** 证明材料附件类型(saveAnnex `type`) */
+export const CheckAnnexType = {
+  Image: 1,
+  Video: 2,
+  Audio: 3,
+  Document: 4,
+  Other: 5,
+  ExternalLink: 6,
+} as const;
+
+export function getCheckAnnexType(mimetype: string) {
+  if (mimetype.startsWith('image/')) return CheckAnnexType.Image;
+  if (mimetype.startsWith('video/')) return CheckAnnexType.Video;
+  if (mimetype.startsWith('audio/')) return CheckAnnexType.Audio;
+  if (mimetype.startsWith('application/pdf')) return CheckAnnexType.Document;
+  return CheckAnnexType.Other;
+}
+
+export type CheckAnnexTypeValue = (typeof CheckAnnexType)[keyof typeof CheckAnnexType];
+
+/** 证明材料修改与新增请求体(POST /ich/check/saveAnnex) */
+export interface SaveCheckAnnexPayload {
+  /** 记录 ID,修改时必填 */
+  id?: number;
+  name: string;
+  formId: number;
+  url: string;
+  /** 1=图片,2=视频,3=音频,4=文档,5=其他附件,6=外部链接 */
+  type: CheckAnnexTypeValue | number;
+  desc?: string;
+  mimetype?: string;
+  attachId?: number;
+  /** 文件大小,单位 KB */
+  fileSize?: number;
+}
+
 export type IchCheckPaginated<T> = {
   total: number;
   perPage: number;
@@ -338,13 +375,12 @@ export type IchCheckPaginated<T> = {
 };
 
 function normalizePaginated<T extends DataModel>(rowClass: new () => T, raw: KeyValue): IchCheckPaginated<T> {
-  const rows = Array.isArray(raw.data) ? (raw.data as KeyValue[]) : [];
   return {
     total: Number(raw.total ?? 0),
     perPage: Number(raw.per_page ?? 0),
     currentPage: Number(raw.current_page ?? 0),
     lastPage: Number(raw.last_page ?? 0),
-    data: transformArrayDataModel(rowClass, rows, 'data'),
+    data: transformArrayDataModel(rowClass, transformSomeToArray(raw.data), 'data'),
   };
 }
 
@@ -428,6 +464,41 @@ export class AssessmentContentApi extends AppServerRequestModule<DataModel> {
   }
 
   /**
+   * 下载自查评估表PDF
+   */
+  async downloadSelfAssessmentPdf(id: number) {
+    return new Promise<string>((resolve, reject) => {
+      uni.downloadFile({
+        url: `${this.config.baseUrl}/pdf/create?id=${id}`,
+        success: (res) => {
+          resolve(res.tempFilePath);
+        },
+        fail: (err) => {
+          reject(err);
+        },
+      });
+    });
+  }
+
+  /**
+   * 证明材料修改与新增
+   * POST `/ich/check/saveAnnex`
+   */
+  async saveAnnex(payload: SaveCheckAnnexPayload) {
+    return this.post('/ich/check/saveAnnex', '证明材料保存', {
+      id: payload.id,
+      name: payload.name,
+      form_id: payload.formId,
+      url: payload.url,
+      type: payload.type,
+      desc: payload.desc,
+      mimetype: payload.mimetype,
+      attach_id: payload.attachId,
+      filesize: payload.fileSize,
+    });
+  }
+
+  /**
    * 传承人基础信息(默认当前用户;管理员可传 userId)
    */
   async getInheritorBasic(userId?: number) {

+ 106 - 0
src/common/components/upload/AliOssUploadCo.ts

@@ -0,0 +1,106 @@
+import { Base64Utils, RandomUtils, StringUtils } from "@imengyu/imengyu-utils";
+import { hmacSha1Base64 } from "./hmac";
+import type { UploaderAction, UploaderItem } from "@/components/form/Uploader";
+
+const client = {
+  region: 'oss-cn-shenzhen',
+  accessKeyId: 'LTAI5t5e7wAQ1FvUA4LCsNs5',
+  accessKeySecret: 'lhF0SimpatPMHNjmjtIKsWsYwTmJhx',
+  bucket: 'minnanwenhua', 
+};
+
+function generatePolicyAndSignature(key: string, accessKeySecret: string) {
+  try {
+    const expiration = new Date(Date.now() + 3600 * 1000).toISOString();
+    const policyText = {
+      expiration: expiration,
+      conditions: [
+        ["content-length-range", 0, 10485760 * 256], // 256MB限制
+        ["starts-with", "$key", key.substring(0, key.lastIndexOf('/') + 1)]
+      ]
+    };
+    const policyBase64 = Base64Utils.encode(JSON.stringify(policyText));
+    const signature = hmacSha1(policyBase64, accessKeySecret);
+    return {
+      policy: policyBase64,
+      signature: signature
+    };
+  } catch (error) {
+    console.error("生成policy和signature失败:", error);
+    throw error;
+  }
+}
+function hmacSha1(message: string, key: string) {
+  try {
+    return hmacSha1Base64(message, key);
+  } catch (error) {
+    console.error("HMAC-SHA1签名生成失败:", error);
+    throw error;
+  }
+}
+
+function uploadOSS(uploadPath: string, filePath: string, cancelHandler: { cancel: () => void }, onProgress?: (progress: number) => void) {
+  return new Promise<string>((resolve, reject) => {
+
+    const key = uploadPath;
+    const { policy, signature } = generatePolicyAndSignature(key, client.accessKeySecret);
+
+    const formData = {
+      key,
+      policy: policy,
+      OSSAccessKeyId: client.accessKeyId,
+      signature: signature,
+      success_action_status: '200'
+    };
+
+    const task = uni.uploadFile({
+      url: `https://${client.bucket}.${client.region}.aliyuncs.com`,
+      filePath,
+      name: 'file',
+      formData,
+      success: res => {
+        if (res.statusCode === 200 || res.statusCode === 204) {
+          resolve(`https://${client.bucket}.${client.region}.aliyuncs.com/${uploadPath}`)
+        } else {
+          reject(new Error('上传失败' + res.statusCode))
+        }
+      },
+      fail: reject,
+      complete: () => {}
+    })
+    task.onProgressUpdate(({ progress }) => onProgress?.(progress));
+
+    cancelHandler.cancel = () => {
+      task.abort();
+    };
+  })
+}
+
+export function useAliOssUploadCo(
+  subPath: string, 
+  onFinish?: (res: string, item: UploaderItem) => void
+) {
+  return (action: UploaderAction) => {
+    const name = StringUtils.path.getFileName(action.item.filePath);
+    const uploadPath = `${subPath}/${name.split('.')[0]}-${RandomUtils.genNonDuplicateID(26)}.${StringUtils.path.getFileExt(name)}`;  
+    const cancelHandler: { cancel: () => void } = {
+      cancel: () => {},
+    };    
+    uploadOSS(uploadPath, action.item.filePath, cancelHandler,(progress) => {
+      action.onProgress?.(progress)
+    }).then((res) => {  
+      action.onFinish?.({
+        uploadedUrl: res,
+        previewUrl: res,
+      }, '上传成功');
+      onFinish?.(res, action.item);
+    }).catch((err) => {
+      action.onError?.(err);
+    });
+    return () => {
+      //取消上传
+      cancelHandler.cancel();
+    };
+  }
+}
+

+ 9 - 0
src/common/components/upload/hmac.ts

@@ -0,0 +1,9 @@
+import CryptoJS from 'crypto-js'
+
+export function hmacSha1Base64(text: string, secret: string) {
+  const hash = CryptoJS.HmacSHA1(text, secret)
+  return CryptoJS.enc.Base64.stringify(hash)
+}
+export function hmacSha1Hex(text: string, secret: string) {
+  return CryptoJS.HmacSHA1(text, secret).toString(CryptoJS.enc.Hex)
+}

+ 126 - 0
src/common/components/upload/mimes.ts

@@ -0,0 +1,126 @@
+import { StringUtils } from '@imengyu/imengyu-utils';
+
+/**
+ * 常见扩展名 → MIME(用于 OSS Content-Type、saveAnnex `mimetype` 等)
+ * 未收录的扩展名请按需追加。
+ */
+export const EXTENSION_TO_MIME: Readonly<Record<string, string>> = {
+  // 图片
+  jpg: 'image/jpeg',
+  jpeg: 'image/jpeg',
+  jpe: 'image/jpeg',
+  png: 'image/png',
+  gif: 'image/gif',
+  bmp: 'image/bmp',
+  webp: 'image/webp',
+  svg: 'image/svg+xml',
+  ico: 'image/x-icon',
+  heic: 'image/heic',
+  heif: 'image/heif',
+  avif: 'image/avif',
+  tif: 'image/tiff',
+  tiff: 'image/tiff',
+
+  // 视频
+  mp4: 'video/mp4',
+  m4v: 'video/x-m4v',
+  webm: 'video/webm',
+  mov: 'video/quicktime',
+  qt: 'video/quicktime',
+  wmv: 'video/x-ms-wmv',
+  avi: 'video/x-msvideo',
+  flv: 'video/x-flv',
+  mkv: 'video/x-matroska',
+  '3gp': 'video/3gpp',
+  '3g2': 'video/3gpp2',
+  ts: 'video/mp2t',
+
+  // 音频
+  mp3: 'audio/mpeg',
+  m4a: 'audio/mp4',
+  aac: 'audio/aac',
+  wav: 'audio/wav',
+  wave: 'audio/wav',
+  ogg: 'audio/ogg',
+  opus: 'audio/opus',
+  flac: 'audio/flac',
+  wma: 'audio/x-ms-wma',
+  amr: 'audio/amr',
+  aiff: 'audio/aiff',
+  aif: 'audio/aiff',
+
+  // 文档
+  txt: 'text/plain',
+  rtf: 'application/rtf',
+  pdf: 'application/pdf',
+  doc: 'application/msword',
+  docx: 'application/vnd.openxmlformats-officedocument.wordprocessingml.document',
+  xls: 'application/vnd.ms-excel',
+  xlsx: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet',
+  csv: 'text/csv',
+  ppt: 'application/vnd.ms-powerpoint',
+  pptx: 'application/vnd.openxmlformats-officedocument.presentationml.presentation',
+  odt: 'application/vnd.oasis.opendocument.text',
+  ods: 'application/vnd.oasis.opendocument.spreadsheet',
+  odp: 'application/vnd.oasis.opendocument.presentation',
+  md: 'text/markdown',
+  markdown: 'text/markdown',
+
+  // Web / 数据
+  html: 'text/html',
+  htm: 'text/html',
+  css: 'text/css',
+  js: 'text/javascript',
+  mjs: 'text/javascript',
+  json: 'application/json',
+  xml: 'application/xml',
+  yaml: 'application/yaml',
+  yml: 'application/yaml',
+
+  // 压缩包
+  zip: 'application/zip',
+  rar: 'application/vnd.rar',
+  '7z': 'application/x-7z-compressed',
+  gz: 'application/gzip',
+  tar: 'application/x-tar',
+};
+
+const DEFAULT_MIME = 'application/octet-stream';
+
+/** 规范化扩展名:去前导点、小写 */
+export function normalizeFileExtension(extOrPath: string): string {
+  const raw = extOrPath.includes('.')
+    ? StringUtils.path.getFileExt(extOrPath)
+    : extOrPath;
+  return raw.replace(/^\./, '').toLowerCase();
+}
+
+/** 仅根据扩展名(可带或不带 `.`,也可传完整路径)解析 MIME */
+export function getMimeTypeFromExtension(extOrPath: string): string {
+  const ext = normalizeFileExtension(extOrPath);
+  return EXTENSION_TO_MIME[ext] ?? DEFAULT_MIME;
+}
+
+/**
+ * 根据本地路径或 URL 推断 MIME(依赖扩展名)
+ */
+export function getMimeType(filePath: string): string {
+  if (!filePath)
+    return DEFAULT_MIME;
+  return getMimeTypeFromExtension(filePath);
+}
+
+/** 是否图片类 MIME */
+export function isImageMime(mime: string): boolean {
+  return mime.startsWith('image/');
+}
+
+/** 是否视频类 MIME */
+export function isVideoMime(mime: string): boolean {
+  return mime.startsWith('video/');
+}
+
+/** 是否音频类 MIME */
+export function isAudioMime(mime: string): boolean {
+  return mime.startsWith('audio/');
+}

+ 7 - 0
src/components/basic/Text.vue

@@ -89,6 +89,11 @@ export interface TextProps {
    */
   wrap?: boolean,
   /**
+   * 单词换行方式
+   * @default 'normal'
+   */
+  wordBreak?: 'normal'|'break-all'|'break-word',
+  /**
    * 行数限制
    */
   lines?: number,
@@ -225,6 +230,8 @@ const style = computed(() => {
     if (s)
       o.fontSize = s + 'rpx';
   }
+  if (props.wordBreak)
+    o.wordBreak = props.wordBreak;
 
   const rs = {
     ...o,

+ 2 - 2
src/components/form/UploaderListItem.vue

@@ -59,8 +59,8 @@
     <FlexRow v-if="isListStyle" :flex="1" align="center">
       <Width :size="20" />
       <FlexCol :flex="1">
-        <Text :fontSize="26" :text="StringUtils.path.getFileName(item.filePath)" />
-        <Text :fontSize="22" :text="item.message" />
+        <Text :fontSize="26" :text="StringUtils.path.getFileName(item.filePath)" wrap wordBreak="break-all" />
+        <Text :fontSize="22" :text="item.message" wrap wordBreak="break-all" />
         <Height :size="10" /> 
         <Progress :progressColor="selectStyleType(item.state, 'notstart', {
           notstart: 'primary',

+ 0 - 7
src/pages.json

@@ -323,13 +323,6 @@
             "navigationBarTitleText": "自查评估表列表",
             "enablePullDownRefresh": false
           }
-        },
-        {
-          "path": "assessment/evidence-list",
-          "style": {
-            "navigationBarTitleText": "佐证资料上传",
-            "enablePullDownRefresh": false
-          }
         }
       ]
     }

+ 8 - 3
src/pages/collect/assessment/argeement-sign.vue

@@ -267,15 +267,20 @@ async function saveAgreement() {
   submitLoading.value = false;
 }
 async function downloadAgreement() {
+  alert({
+    title: '抱歉',
+    content: '抱歉,暂未开放导出功能,有需要打印传承协议的请联系客服,我们会为您打印。',
+  });
+  /*
   const detail = currentAgreement.value;
   try {
     assertNotNull(detail, 'currentAgreement is null');
-    throw new Error('没这个接口');
+    throw new Error('抱歉');
   } catch (error) {
     alert({
-      title: '保存传承协议失败',
+      title: '导出失败',
       content: formatError(error),
     });
-  }
+  }*/
 }
 </script>

+ 4 - 0
src/pages/collect/assessment/components/EvaluationFormBlock.vue

@@ -6,7 +6,9 @@
   >
     <template #insertion="{ data }">
       <FlexCol v-if="data.name === 'insertCheckList'">
+        <Divider />
         <H3>自查项目选择</H3>
+        <Height :height="30" />
         <FlexCol gap="gap.md">
           <FlexCol v-for="(item, index) in checkItemList" :key="item.id" gap="gap.md">
             <FlexRow justify="space-between" align="center">
@@ -59,6 +61,8 @@ import { SelfAssessmentCheckItemAnswer, type CheckItemInfo, type SelfAssessmentD
 import type { IDynamicFormOptions } from '@/components/dynamic';
 import { ArrayUtils } from '@imengyu/imengyu-utils';
 import Tag from '@/components/display/Tag.vue';
+import Divider from '@/components/display/Divider.vue';
+import Height from '@/components/layout/space/Height.vue';
 
 const props = defineProps<{   
   currentForm: SelfAssessmentDetail;

+ 53 - 8
src/pages/collect/assessment/evaluation-form.vue

@@ -11,17 +11,29 @@
             <Height :height="30" />
             <Button type="primary" @click="createForm">去填写评估表</Button>
           </Result>
-          <FlexCol v-else gap="gap.md">
+          <FlexCol v-else gap="gap.lg">
             <EvaluationFormBlock
               :currentForm="(currentForm as SelfAssessmentDetail)"
               :formOptions="formOptions"
               :checkItemList="(checkItemList as CheckItemInfo[])"
               :currentFormCheckItems="(currentFormCheckItems as SelfAssessmentCheckItemAnswer[])"
             />
-            <FlexRow align="center" justify="space-between">
+            <FlexRow align="flex-end" justify="space-between">
               <H3>自评总分</H3>
-              <Text fontSize="44rpx" fontFamily="HUNdin1451" :text="`${totalPoints}分`" />
+              <Text fontSize="50rpx" color="#315816" fontFamily="HUNdin1451" :text="`${totalPoints}分`" />
             </FlexRow>
+            <Divider />
+            <H3>佐证资料上传</H3>
+            <Result v-if="!currentForm?.id" status="info" title="请先保存评估表后再上传佐证资料" />
+            <Uploader
+              v-else
+              :upload="assessmentAnnexUpload"
+              :max-upload-count="9"
+              :max-file-size="20 * 1024 * 1024"
+              list-type="list"
+            />
+            <Height :height="30" />
+            <Divider />
             <Button type="primary" block :loading="submitLoading" @click="saveForm">保存评估表</Button>
             <Button :loading="submitLoading" @click="downloadForm">下载评估表PDF</Button>
           </FlexCol>
@@ -37,12 +49,14 @@ import { computed, ref } from 'vue';
 import { useSimpleDataLoader } from '@/components/composeabe/loader/SimpleDataLoader';
 import { useAuthStore } from '@/store/auth';
 import { useLoadQuerys } from '@/components/composeabe/LoadQuerys';
-import { assertNotNull, formatError, waitTimeOut } from '@imengyu/imengyu-utils';
+import { useAliOssUploadCo } from '@/common/components/upload/AliOssUploadCo';
+import { assertNotNull, formatError, StringUtils, waitTimeOut } from '@imengyu/imengyu-utils';
 import { toast, alert } from '@/components/dialog/CommonRoot';
 import AssessmentContentApi, {
   SelfAssessmentDetail,
   CheckItemInfo,
   SelfAssessmentCheckItemAnswer,
+  getCheckAnnexType,
 } from '@/api/collect/AssessmentContent';
 import CommonRoot from '@/components/dialog/CommonRoot.vue';
 import Button from '@/components/basic/Button.vue';
@@ -60,6 +74,9 @@ import type { FieldProps } from '@/components/form/Field.vue';
 import type { SignatureFieldProps } from '@/components/form/SignatureField.vue';
 import { useImageSimpleUploadCo } from '@/common/components/upload/ImageUploadCo';
 import EvaluationFormBlock from './components/EvaluationFormBlock.vue';
+import Uploader from '@/components/form/Uploader.vue';
+import { getMimeType } from '@/common/components/upload/mimes';
+import Divider from '@/components/display/Divider.vue';
 
 let loaded = false;
 
@@ -76,8 +93,22 @@ const currentForm = ref<SelfAssessmentDetail | null>(null);
 const currentFormCheckItems = ref<SelfAssessmentCheckItemAnswer[]>([]);
 const authStore = useAuthStore();
 
-const formRef = ref<IDynamicFormRef | null>(null);
+const assessmentAnnexUpload = useAliOssUploadCo('assessment/annex', async (res, item) => {
+  assertNotNull(currentForm.value, 'currentForm is null');
+  const mimetype = getMimeType(item.filePath);
+  await AssessmentContentApi.saveAnnex({
+    name: '佐证资料' + StringUtils.path.getFileName(item.filePath),
+    formId: currentForm.value.id,
+    url: res,
+    type: getCheckAnnexType(mimetype),
+    mimetype: mimetype,
+    fileSize: item.size
+      ? Math.max(1, Math.ceil(item.size / 1024))
+      : undefined,
+  });
+});
 
+const formRef = ref<IDynamicFormRef | null>(null);
 const formOptions : IDynamicFormOptions = {
   formAdditionaProps: {
     labelFlex: 4,
@@ -219,6 +250,9 @@ const formOptions : IDynamicFormOptions = {
           },
           additionalProps: {
             upload: useImageSimpleUploadCo(),
+            previewImageProps: {
+              width: '400rpx',
+            }
           } as SignatureFieldProps,
         }
       ],
@@ -294,18 +328,30 @@ async function saveForm() {
     assertNotNull(detail, 'currentForm is null');
     await AssessmentContentApi.saveSelfAssessment(detail as SelfAssessmentDetail);
     toast('保存评估表成功');
+
+    await waitTimeOut(1000);
+    await loader.reload();
   } catch (error) {
     alert({
       title: '保存评估表失败',
       content: formatError(error),
     });
   }
+
   submitLoading.value = false;
 }
 async function downloadForm() {
+  if (!currentForm.value?.id) {
+    toast('请先保存评估表后再下载PDF');
+    return;
+  }
   try {
     assertNotNull(currentForm.value, 'currentForm is null');
-    throw new Error('没这个接口');
+    const pdfPath = await AssessmentContentApi.downloadSelfAssessmentPdf(currentForm.value.id);
+    uni.openDocument({
+      filePath: pdfPath,
+      fileType: 'pdf',
+    });
   } catch (error) {
     alert({
       title: '下载评估表失败',
@@ -316,7 +362,6 @@ async function downloadForm() {
 
 const loader = useSimpleDataLoader(async () => {
   await waitTimeOut(1000);
-  console.log('load');
   
   if (querys.value.id > 0) {
     const detail = await AssessmentContentApi.getSelfAssessmentDetail(querys.value.id);
@@ -331,10 +376,10 @@ const loader = useSimpleDataLoader(async () => {
   if (list.data.length > 0) {
     const detail = await AssessmentContentApi.getSelfAssessmentDetail(list.data[0].id);
     currentForm.value = detail;
+    console.log('load', currentForm.value);
     await loadCheckItems();
   } else {
     currentForm.value = null;
-    createForm();
   }
   return currentForm.value;
 }, false);

+ 0 - 34
src/pages/collect/assessment/evidence-list.vue

@@ -1,34 +0,0 @@
-<template>
-  <FlexCol padding="space.lg">
-    <SearchBar v-model="search" @search="loader.reload()" placeholder="输入关键词搜索" />
-    <SimplePageContentLoader :loader="loader">
-      <template v-if="loader.isFinished.value">
-
-      </template>
-    </SimplePageContentLoader>
-    <XBarSpace />
-  </FlexCol>
-</template>
-
-<script setup lang="ts">
-import { ref } from 'vue';
-import { useSimplePageListLoader } from '@/components/composeabe/loader/SimplePageListLoader';
-import AssessmentContentApi from '@/api/collect/AssessmentContent';
-import FlexCol from '@/components/layout/FlexCol.vue';
-import SimplePageContentLoader from '@/components/loader/SimplePageContentLoader.vue';
-import XBarSpace from '@/components/layout/space/XBarSpace.vue';
-import Text from '@/components/basic/Text.vue';
-import Icon from '@/components/basic/Icon.vue';
-import SearchBar from '@/components/form/SearchBar.vue';
-import Touchable from '@/components/feedback/Touchable.vue';
-import { navTo } from '@/components/utils/PageAction';
-
-const search = ref('');
-const loader = useSimplePageListLoader(10, async (page, pageSize) => {
-  
-  return {
-    list: [],
-    total: 0,
-  };
-});
-</script>

+ 0 - 1
src/pages/collect/inheritor.vue

@@ -34,7 +34,6 @@
       <CellGroup round>
       <Cell icon="https://mncdn.wenlvti.net/uploads/20250313/9fb29e8bdb66490034145c90f892773a.png" title="传承协议签名" showArrow touchable @click="navTo('assessment/argeement-sign')" />
       <Cell icon="https://mncdn.wenlvti.net/uploads/20250313/66d4665b1da5075e60148312469b2630.png" title="自查评估表" showArrow touchable @click="navTo('assessment/evaluation-form')" />
-      <Cell icon="https://mncdn.wenlvti.net/uploads/20250313/66d4665b1da5075e60148312469b2630.png" title="佐证资料上传" showArrow touchable @click="navTo('assessment/evidence-list')" />
       </CellGroup>
       <!-- <CellGroup round>
         <Cell icon="https://mncdn.wenlvti.net/uploads/20250313/1366973c061bf98594036e42c0344593.png" title="非遗项目资料采集" showArrow touchable @click="navTo('forms/ich')" />