| | |
| | | VITE_NITRO_MOCK=false |
| | | |
| | | # ç§æ·å¼å
³ |
| | | VITE_APP_TENANT_ENABLE=true |
| | | # å¿
é¡»ä¸å端 yudao.tenant.enable ä¿æä¸è´ï¼åç«¯å·²æ¯ falseï¼å端å¼çä¼å¨ç»å½é¡µå¤åº |
| | | # ãè¯·éæ©ç§æ·ã䏿ï¼å¹¶ä¸æ¯ä¸ªè¯·æ±é½å¸¦ä¸ tenant-id 头ï¼ä¸å端å®é
è·ç模å¼çç¾ã |
| | | VITE_APP_TENANT_ENABLE=false |
| | | |
| | | # éªè¯ç çå¼å
³ |
| | | VITE_APP_CAPTCHA_ENABLE=false |
| | |
| | | VITE_BASE=/ |
| | | |
| | | # 请æ±è·¯å¾ |
| | | VITE_BASE_URL=http://36.213.90.123:9501 |
| | | VITE_BASE_URL=http://36.213.150.237:9007 |
| | | # æ¥å£å°å |
| | | VITE_GLOB_API_URL=http://36.213.90.123:9501/admin-api |
| | | VITE_GLOB_API_URL=http://36.213.150.237:9008/admin-api |
| | | # æä»¶ä¸ä¼ ç±»åï¼server - å端ä¸ä¼ ï¼ client - å端ç´è¿ä¸ä¼ ï¼ä»
æ¯æS3æå¡ |
| | | VITE_UPLOAD_TYPE=server |
| | | |
| | |
| | | */ |
| | | export const companies: Record<string, CompanyConfig> = { |
| | | TEST: { |
| | | name: 'æµè¯å
¬å¸', |
| | | logo: '/logos/TEST.png', |
| | | favicon: '/logos/TEST.ico', |
| | | apiUrl: 'http://36.213.90.123:9501/admin-api', |
| | | name: 'æ±èåè´¸ä¾é社', |
| | | logo: '/logos/JSSM.svg', |
| | | favicon: '/logos/JSSM.ico', |
| | | apiUrl: 'http://36.213.150.237:9007/admin-api', |
| | | }, |
| | | JHHG: { |
| | | name: 'å®å¤ä¹æ³åå·¥', |
| | |
| | | set "COMPANY=TEST" |
| | | |
| | | set "REMOTE_USER=root" |
| | | set "REMOTE_HOST=36.213.90.123" |
| | | set "REMOTE_HOST=36.213.150.237" |
| | | set "REMOTE_PORT=65022" |
| | | |
| | | set "PASSWORD=Xdrjkj@10086#" |
| | | set "PASSWORD=Sh@1008600" |
| | | |
| | | set "ZIP_FILE=dist.zip" |
| | | set "REMOTE_DIR=/data/project/mom/vue/test/dist" |
| | | set "REMOTE_DIR=/data/vue/mom/jssm/dist" |
| | | |
| | | set "SSH_OPTS=-o StrictHostKeyChecking=no -o ConnectTimeout=10 -o ServerAliveInterval=15 -o ServerAliveCountMax=3" |
| | | |
| | |
| | | "highlight.js": "catalog:", |
| | | "livekit-client": "^2.20.0", |
| | | "pinia": "catalog:", |
| | | "playwright": "^1.63.0", |
| | | "sortablejs": "catalog:", |
| | | "steady-xml": "catalog:", |
| | | "tinymce": "catalog:", |
| | |
| | | pinia: |
| | | specifier: 'catalog:' |
| | | version: 3.0.4(typescript@6.0.3)(vue@3.5.38(typescript@6.0.3)) |
| | | playwright: |
| | | specifier: ^1.63.0 |
| | | version: 1.63.0 |
| | | sortablejs: |
| | | specifier: 'catalog:' |
| | | version: 1.15.7 |
| | |
| | | |
| | | pkg-types@2.3.1: |
| | | resolution: {integrity: sha512-y+ichcgc2LrADuhLNAx8DFjVfgz91pRxfZdI3UDhxHvcVEZsenLO+7XaU5vOp0u/7V/wZ+plyuQxtrDlZJ+yeg==} |
| | | |
| | | playwright-core@1.63.0: |
| | | resolution: {integrity: sha512-rYCsBF/M5HjUch52bbtVONEFjv6Xu8sm8h72dNlR5bzIE1fvC/bxgspzkjSfU+MweEMmPM8KJebG6nnyxo5mCg==} |
| | | engines: {node: '>=20'} |
| | | hasBin: true |
| | | |
| | | playwright@1.63.0: |
| | | resolution: {integrity: sha512-+7ziBLidS4NaNCdt57SUDT+wYmmd5fmiQejUic/kb+YsYSCPyOOE9sebzMjNmQrsnNpDJqd4WHvV/8lfKfUDUg==} |
| | | engines: {node: '>=20'} |
| | | hasBin: true |
| | | |
| | | pluralize@8.0.0: |
| | | resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} |
| | |
| | | exsolve: 1.1.0 |
| | | pathe: 2.0.3 |
| | | |
| | | playwright-core@1.63.0: {} |
| | | |
| | | playwright@1.63.0: |
| | | dependencies: |
| | | playwright-core: 1.63.0 |
| | | |
| | | pluralize@8.0.0: {} |
| | | |
| | | pngjs@5.0.0: {} |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | <svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 64 64" width="64" height="64" role="img" aria-label="æ±èåè´¸"> |
| | | <defs> |
| | | <!-- èé主è²ï¼å·¦ä¸è§ç¥äº®ï¼å³ä¸è§æ²ä¸å»ï¼å½¢æä½ç§¯æ --> |
| | | <linearGradient id="jssmNavy" x1="0" y1="0" x2="0.85" y2="1"> |
| | | <stop offset="0%" stop-color="#1E4571"/> |
| | | <stop offset="52%" stop-color="#123156"/> |
| | | <stop offset="100%" stop-color="#0A1D35"/> |
| | | </linearGradient> |
| | | <!-- éè²ï¼ä¸äº®ä¸æ·±ï¼æ¨¡æéå±å
æ³½ --> |
| | | <linearGradient id="jssmGold" x1="0" y1="0" x2="0" y2="1"> |
| | | <stop offset="0%" stop-color="#EBD07E"/> |
| | | <stop offset="45%" stop-color="#D4AF37"/> |
| | | <stop offset="100%" stop-color="#B8901F"/> |
| | | </linearGradient> |
| | | </defs> |
| | | |
| | | <!-- ç¾å½¢å¾½æ ä¸»ä½ --> |
| | | <path d="M8 14 A6 6 0 0 1 14 8 H50 A6 6 0 0 1 56 14 V32 C56 46 45.5 55.5 32 60 C18.5 55.5 8 46 8 32 Z" |
| | | fill="url(#jssmNavy)"/> |
| | | <!-- å¤åéè¾¹ï¼æ·±è²èæ¯ä¸é å®å¾åè½®å» --> |
| | | <path d="M8 14 A6 6 0 0 1 14 8 H50 A6 6 0 0 1 56 14 V32 C56 46 45.5 55.5 32 60 C18.5 55.5 8 46 8 32 Z" |
| | | fill="none" stroke="url(#jssmGold)" stroke-width="1.5" opacity="0.9"/> |
| | | <!-- å
åé线ï¼å¢å å¾½ç« ç屿¬¡ --> |
| | | <path d="M12.5 15 A3.5 3.5 0 0 1 16 11.5 H48 A3.5 3.5 0 0 1 51.5 15 V32 C51.5 44 42.5 52.5 32 56.5 C21.5 52.5 12.5 44 12.5 32 Z" |
| | | fill="none" stroke="url(#jssmGold)" stroke-width="1" opacity="0.55"/> |
| | | |
| | | <!-- é¡¶é¨å¦æ¯ä¹æ --> |
| | | <path d="M32 15.6 L33.9 19 L32 22.4 L30.1 19 Z" fill="url(#jssmGold)"/> |
| | | |
| | | <!-- å±å¼ç书æ¬ï¼å·¦é¡µ --> |
| | | <path d="M31.2 29.5 C27.4 26.1 22.2 24.6 17.8 25.5 V41.4 C22.2 40.5 27.4 42 31.2 45.4 Z" |
| | | fill="url(#jssmGold)"/> |
| | | <!-- å±å¼ç书æ¬ï¼å³é¡µï¼ç¥æï¼æå¼å·¦å³å±æ¬¡ï¼ --> |
| | | <path d="M32.8 29.5 C36.6 26.1 41.8 24.6 46.2 25.5 V41.4 C41.8 40.5 36.6 42 32.8 45.4 Z" |
| | | fill="url(#jssmGold)" opacity="0.78"/> |
| | | <!-- 书è --> |
| | | <path d="M32 29.5 V45.4" stroke="#0A1D35" stroke-width="1.6" stroke-linecap="round" opacity="0.55"/> |
| | | </svg> |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | import type { PageParam, PageResult } from '..\..\..\..\packages\effects\request\src'; |
| | | import type { PageParam, PageResult } from '../../../../packages/effects/request/src'; |
| | | |
| | | import { requestClient } from '#/api/request'; |
| | | |
| | |
| | | id?: number; |
| | | title?: string; |
| | | content?: string; |
| | | coverUrl?: string; |
| | | /** |
| | | * å°é¢å¾æä»¶ç¼å·ï¼æå¤ 1 å¼ ï¼ |
| | | * |
| | | * å°é¢ä¸è½ä¸å¡è¡¨å段ï¼ç»ä¸èµ° system_storage_attachment ä¸é´è¡¨ï¼ |
| | | * ä¿åæ¶æäº¤ blobIdsï¼åæ¾æ¶è¯» attachmentListã |
| | | */ |
| | | blobIds?: number[]; |
| | | /** å°é¢å¾éä»¶å表ï¼å端è¿åï¼æå¤ 1 å¼ ï¼ */ |
| | | attachmentList?: SignupAttachment[]; |
| | | location?: string; |
| | | startTime?: string; |
| | | endTime?: string; |
| | |
| | | urlStr: string = location.href, |
| | | ): string { |
| | | if (!urlStr || !key) return ''; |
| | | const url = new URL(decodeURIComponent(urlStr)); |
| | | // hash è·¯ç±ï¼ç产æå»º VITE_ROUTER_HISTORY=hashï¼ä¸ï¼? åé¢çåæ°è½å¨ URL ç fragment éï¼ |
| | | // URL.searchParams 读ä¸å°ï¼åæ°ä¼è¢«è¯¯å¤æ"丢失"ãè¿éå
ææ # åè§£æï¼ |
| | | // history 模å¼ä¸å°åéæ²¡æ #ï¼èµ°åé»è¾ï¼è¡ä¸ºä¸åã |
| | | const normalized = urlStr.includes('#') ? urlStr.replace('#', '') : urlStr; |
| | | const url = new URL(decodeURIComponent(normalized)); |
| | | return url.searchParams.get(key) ?? ''; |
| | | } |
| | | |
| ¶Ô±ÈÐÂÎļþ |
| | |
| | | /** |
| | | * ä¿®æ£å端è¿åçé件访é®å°å |
| | | * |
| | | * åç«¯çæ url / previewURL / downloadURL æ¶ä¼å¸¦ä¸å®èªå·±é
ç½®ç访é®åå |
| | | * ï¼å½åå端é
çæ¯ 192.168.1.6:48080ï¼ãåªè¦è¯¥ååä¸å端ä¸åæºãæè
è¯¥ä¸»æº |
| | | * å¨å½åç½ç»éä¸å¯è¾¾ï¼`<img src>` å°±ä¼ç´æ¥å 载失败ï¼é¡µé¢ä¸è¡¨ç°ä¸ºãå¾ç䏿¾ç¤ºãã |
| | | * |
| | | * è¿éæè¿ç±»ç»å¯¹å°åæ¹åæç¸å¯¹ API åç¼çè·¯å¾ï¼è®©å®èµ°å½åç«ç¹çåæºè¯·æ±ï¼ |
| | | * å¼åç¯å¢ç» vite ç /admin-api 代ç转åå°å端ï¼ç产ç¯å¢ååç«¯åæºæ¶åæ ·æç«ã |
| | | * |
| | | * å·²ç»æ¯ç¸å¯¹è·¯å¾ãåæºå°åï¼ä»¥å data:/blob: ä¸å¾åæ ·è¿åã |
| | | */ |
| | | export function toAccessibleFileUrl(raw?: string): string { |
| | | if (!raw) { |
| | | return ''; |
| | | } |
| | | // ç¸å¯¹å°åãdata:ãblob: ç´æ¥æ¾è¡ |
| | | if (!/^https?:\/\//i.test(raw)) { |
| | | return raw; |
| | | } |
| | | try { |
| | | const url = new URL(raw); |
| | | // æ¬æ¥å°±åæºï¼æ éå¤ç |
| | | if (url.origin === window.location.origin) { |
| | | return raw; |
| | | } |
| | | const apiPrefix = (import.meta.env.VITE_GLOB_API_URL || '/admin-api').replace( |
| | | /\/+$/, |
| | | '', |
| | | ); |
| | | // å½ä¸ API åç¼æ¶ï¼æªååç¼åå
¶ä¹åçè·¯å¾ä¸æ¥è¯¢ä¸² |
| | | const at = url.pathname.indexOf(`${apiPrefix}/`); |
| | | if (at >= 0) { |
| | | return `${url.pathname.slice(at)}${url.search}`; |
| | | } |
| | | // 䏿¯æä»¶æ¥å£çå°åï¼ä¸åå¤ç |
| | | return raw; |
| | | } catch { |
| | | // URL è§£æå¤±è´¥æ¶ä¿æåå¼ï¼é¿å
æå¯ç¨å°åæ¹å |
| | | return raw; |
| | | } |
| | | } |
| | |
| | | import type { Recordable } from '@vben/types'; |
| | | |
| | | export * from './fileUrl'; |
| | | export * from './rangePickerProps'; |
| | | export * from './routerHelper'; |
| | | |
| | |
| | | wxcpLoading.value = true; |
| | | // 注æï¼type éè¦å
encode 䏿¬¡ï¼é
å social-login 页é¢ç getUrlValue() 使ç¨ï¼ |
| | | // å¦åä¼ä¸å¾®ä¿¡åè·³å type åæ°ä¼è¢«åæï¼å¯¼è´æ æ³è¯å«ç¤¾äº¤ç±»å |
| | | const redirectUri = `${location.origin}/auth/social-login?${encodeURIComponent( |
| | | // åè°å°åå¿
须带 hash åç¼ï¼çäº§ç¨ hash è·¯ç±ï¼VITE_ROUTER_HISTORY=hashï¼ï¼ |
| | | // å°äº # ä¼ä¸å¾®ä¿¡åè·³å vue-router ä¼è§£æå° /ï¼è½å°ç»å½é¡µè䏿¯ social-login é¡µé¢ |
| | | const hashPrefix = |
| | | import.meta.env.VITE_ROUTER_HISTORY === 'hash' ? '/#' : ''; |
| | | const redirectUri = `${location.origin}${hashPrefix}/auth/social-login?${encodeURIComponent( |
| | | `type=${WXCP_SOCIAL_TYPE}`, |
| | | )}`; |
| | | window.location.href = await socialAuthRedirect( |
| | |
| | | try { |
| | | // è®¡ç® redirectUri |
| | | // tricky: type éè¦å
encode 䏿¬¡ï¼å¦åééåè°ä¼ä¸¢å¤±ãé
å getUrlValue() ä½¿ç¨ |
| | | const redirectUri = `${location.origin}/profile?${encodeURIComponent(`type=${type}`)}`; |
| | | // hash è·¯ç±ï¼ç产æå»ºï¼ä¸å¿
须带 # åç¼ï¼å¦ååè·³å vue-router è§£æå° /ï¼è¿ä¸äºç»å®æµç¨ |
| | | const hashPrefix = import.meta.env.VITE_ROUTER_HISTORY === 'hash' ? '/#' : ''; |
| | | const redirectUri = `${location.origin}${hashPrefix}/profile?${encodeURIComponent(`type=${type}`)}`; |
| | | |
| | | // è¿è¡è·³è½¬ |
| | | window.location.href = await socialAuthRedirect(type, redirectUri); |
| | |
| | | help: 'å¡« 0 表示ä¸éåé¢', |
| | | }, |
| | | { |
| | | fieldName: 'coverUrl', |
| | | // å°é¢èµ°éä»¶ä¸é´è¡¨ï¼è¿éæäº¤ blobIdsï¼åæ¾è¯» attachmentListï¼è§ form.vue çæ å°å½æ°ï¼ |
| | | fieldName: 'blobIds', |
| | | label: 'å°é¢å¾', |
| | | component: 'Input', |
| | | componentProps: { placeholder: 'å°é¢å¾å°åï¼éå¡«ï¼', disabled: readonly }, |
| | | component: 'ImageUpload', |
| | | componentProps: { |
| | | valueKey: 'id', |
| | | maxNumber: 1, |
| | | multiple: false, |
| | | disabled: readonly, |
| | | }, |
| | | help: 'éå¡«ï¼å»ºè®® 16:9ï¼ä¿ååå±ç¤ºå¨æ´»å¨æ¥å页顶é¨', |
| | | formItemClass: 'col-span-2', |
| | | }, |
| | | { |
| | |
| | | getActivityPage, |
| | | publishActivity, |
| | | } from '#/api/wxcp/activity'; |
| | | import { toAccessibleFileUrl } from '#/utils'; |
| | | |
| | | import { |
| | | ACTIVITY_STATUS, |
| | |
| | | |
| | | function handleCreate() { |
| | | formModalApi.setData({ formType: 'create' }).open(); |
| | | } |
| | | |
| | | /** å表缩ç¥å¾åå°é¢éä»¶ç第ä¸å¼ ï¼æ²¡ä¼ å°é¢è¿å空串 */ |
| | | function coverUrlOf(row: WxCpActivityApi.Activity): string { |
| | | const cover = row.attachmentList?.[0]; |
| | | // å端è¿åçæ¯å®èªå·±é
ç½®ååçç»å¯¹å°åï¼éæ¹åæåæºè·¯å¾æè½è¢« <img> å è½½ |
| | | return toAccessibleFileUrl(cover?.url || cover?.previewURL); |
| | | } |
| | | |
| | | function handleDetail(row: WxCpActivityApi.Activity) { |
| | |
| | | </template> |
| | | |
| | | <template #title="{ row }"> |
| | | <Button type="link" class="p-0" @click="handleDetail(row)"> |
| | | {{ row.title }} |
| | | </Button> |
| | | <div class="flex items-center gap-2"> |
| | | <!-- å°é¢æ¥èªéä»¶ä¸é´è¡¨ï¼æªä¸ä¼ æ¶ä¸å ä½ --> |
| | | <img |
| | | v-if="coverUrlOf(row)" |
| | | :src="coverUrlOf(row)" |
| | | alt="å°é¢" |
| | | class="h-9 w-14 shrink-0 rounded object-cover" |
| | | /> |
| | | <Button type="link" class="p-0" @click="handleDetail(row)"> |
| | | {{ row.title }} |
| | | </Button> |
| | | </div> |
| | | </template> |
| | | |
| | | <template #signupCount="{ row }"> |
| | |
| | | import { Button, message } from 'ant-design-vue'; |
| | | |
| | | import { useVbenForm } from '#/adapter/form'; |
| | | import { toAccessibleFileUrl } from '#/utils'; |
| | | import { |
| | | createActivity, |
| | | getActivity, |
| | |
| | | wrapperClass: 'grid-cols-2', |
| | | }); |
| | | |
| | | /** |
| | | * ææ´»å¨è¯¦æ
æ å°æè¡¨åå¼ |
| | | * |
| | | * å°é¢å¨å端ä¸è½ä¸å¡è¡¨å段ï¼èæ¯åå¨éä»¶ä¸é´è¡¨éï¼ |
| | | * åæ¾æ¶è¦æ attachmentList 转æä¸ä¼ ç»ä»¶è½è¯å«çæä»¶å¯¹è±¡ã |
| | | */ |
| | | function activityToForm( |
| | | activity: WxCpActivityApi.Activity, |
| | | ): Record<string, unknown> { |
| | | const form: Record<string, unknown> = { ...activity }; |
| | | form.blobIds = (activity.attachmentList ?? []).map((item) => ({ |
| | | uid: String(item.id), |
| | | name: item.name || item.originalFilename || '', |
| | | url: toAccessibleFileUrl(item.url || item.previewURL), |
| | | status: 'done', |
| | | id: item.id, |
| | | })); |
| | | return form; |
| | | } |
| | | |
| | | /** |
| | | * æä¸ä¼ ç»ä»¶çå¼è§æ´æ blobId æ°ç» |
| | | * |
| | | * ImageUpload å¨ maxNumber=1 æ¶è¿åçæ¯å个å¼ï¼è䏿¯æ°ç»ï¼ï¼ |
| | | * å端ç¾åæ¯ List<Long>ï¼è¿éç»ä¸å
ææ°ç»åæäº¤ã |
| | | */ |
| | | function normalizeBlobIds(value: unknown): number[] { |
| | | const list = Array.isArray(value) |
| | | ? value |
| | | : value === '' || value === null || value === undefined |
| | | ? [] |
| | | : [value]; |
| | | return list |
| | | .map((item) => |
| | | item && typeof item === 'object' && 'id' in item |
| | | ? Number((item as { id: unknown }).id) |
| | | : Number(item), |
| | | ) |
| | | .filter((blobId) => Number.isFinite(blobId)); |
| | | } |
| | | |
| | | const [Modal, modalApi] = useVbenModal({ |
| | | async onOpenChange(isOpen: boolean) { |
| | | if (!isOpen) { |
| | |
| | | modalApi.lock(); |
| | | try { |
| | | const detail = await getActivity(data.id); |
| | | await formApi.setValues(detail as unknown as Record<string, unknown>); |
| | | await formApi.setValues(activityToForm(detail)); |
| | | } finally { |
| | | modalApi.unlock(); |
| | | } |
| | |
| | | } |
| | | submitting.value = true; |
| | | try { |
| | | const data = (await formApi.getValues()) as WxCpActivityApi.Activity; |
| | | const data = (await formApi.getValues()) as Record<string, unknown>; |
| | | const payload = { |
| | | ...data, |
| | | blobIds: normalizeBlobIds(data.blobIds), |
| | | } as WxCpActivityApi.Activity; |
| | | if (id.value) { |
| | | await updateActivity({ ...data, id: id.value }); |
| | | await updateActivity({ ...payload, id: id.value }); |
| | | message.success('ä¿®æ¹æå'); |
| | | } else { |
| | | await createActivity(data); |
| | | await createActivity(payload); |
| | | message.success('å建æåï¼è¯·å¨å表ä¸åå¸å忍é'); |
| | | } |
| | | await modalApi.close(); |
| | |
| | | } from 'ant-design-vue'; |
| | | |
| | | import { TableAction, useVbenVxeGrid } from '#/adapter/vxe-table'; |
| | | import { toAccessibleFileUrl } from '#/utils'; |
| | | import { |
| | | cancelSignup, |
| | | checkInSignup, |
| | |
| | | |
| | | function isImage(item: WxCpActivityApi.SignupAttachment) { |
| | | return (item.contentType || '').startsWith('image/'); |
| | | } |
| | | |
| | | /** å端éä»¶å°åå¸¦çæ¯å端èªå·±é
ç½®çååï¼æ¹åæåæºè·¯å¾åæè½è¢« <img> å è½½ */ |
| | | function fileUrl(item: WxCpActivityApi.SignupAttachment) { |
| | | return toAccessibleFileUrl(item.previewURL || item.url); |
| | | } |
| | | |
| | | /** ä¸è½½é¾æ¥åçï¼ä¼å
ç¨ downloadURL */ |
| | | function downloadUrl(item: WxCpActivityApi.SignupAttachment) { |
| | | return toAccessibleFileUrl(item.downloadURL || item.url); |
| | | } |
| | | |
| | | function formatSize(bytes?: number) { |
| | |
| | | </div> |
| | | <a |
| | | v-if="isImage(item)" |
| | | :href="item.previewURL || item.url" |
| | | :href="fileUrl(item)" |
| | | target="_blank" |
| | | rel="noopener noreferrer" |
| | | > |
| | | <img |
| | | :src="item.previewURL || item.url" |
| | | :src="fileUrl(item)" |
| | | alt="éä»¶é¢è§" |
| | | class="max-h-40 rounded object-contain" |
| | | /> |
| | | </a> |
| | | <a |
| | | :href="item.downloadURL || item.url" |
| | | :href="downloadUrl(item)" |
| | | target="_blank" |
| | | rel="noopener noreferrer" |
| | | class="text-xs text-blue-500 hover:underline" |