Commit 1b0fe358 authored by 郭铭瑶's avatar 郭铭瑶 🤘

导出活动详情及修改活动

parent 65527759
import { saveAs } from 'file-saver'
import { Packer, Document, Paragraph, HeadingLevel, TextRun } from 'docx'
import {
Packer,
Document,
Paragraph,
HeadingLevel,
TextRun,
ImageRun,
} from 'docx'
function createHeading(text: string): Paragraph {
return new Paragraph({
......@@ -19,24 +26,52 @@ function createText(text: string): Paragraph {
})
}
function createDocument(data: any[], labelKey: string) {
async function createImage(key: string, urls: string[]) {
const blobs = await Promise.all(
urls.map(async (url) => await fetch(url).then((r: any) => r.blob())),
)
return new Paragraph({
children: [
new TextRun({ text: `${key}:` }),
...blobs.map(
(blob) =>
new ImageRun({
data: blob,
transformation: {
width: 100,
height: 100,
},
}),
),
],
})
}
async function createDocument(data: any[], labelKey: string) {
function arrayToString(e: unknown) {
if (Array.isArray(e)) return e.join(',')
return e
}
return new Document({
sections: data.map((item) => {
sections: await Promise.all(
data.map(async (item) => {
const keys = Object.keys(item)
return {
children: [
createHeading(item[labelKey]),
...keys.map((key) => {
...(await Promise.all(
keys.map(async (key) => {
if (key === '居住地址') return createText('')
if (key.startsWith('_')) return createText('')
if (key.includes('照片'))
return await createImage(key, item[key])
return createText(`${key}${arrayToString(item[key])}`)
}),
)),
],
}
}),
),
})
}
......@@ -46,12 +81,12 @@ function createDocument(data: any[], labelKey: string) {
* @param labelKey 每个section的title取值
* @param defaultFileName 默认导出名字(可选)
*/
export default function useExportFile(
export default async function useExportFile(
data: any[],
labelKey: string,
defaultFileName: string = '导出',
) {
const doc = createDocument(data, labelKey)
const doc = await createDocument(data, labelKey)
Packer.toBlob(doc).then((blob) => {
saveAs(blob, `${defaultFileName}.docx`)
})
......
......@@ -35,6 +35,13 @@ export async function usePostActivity(params: QueryProps) {
})
return res && res.data && res.data.result
}
export async function usePutActivity(params: QueryProps) {
const res = await ajax.put({
url: api.ACTIVITY,
params,
})
return res && res.data && res.data.result
}
export async function useFetchArea(params: QueryProps) {
const res = await ajax.get({
url: api.AREA,
......
......@@ -124,7 +124,10 @@ const activityList = ref([])
const fetchList = useDebounce(async (query?: string) => {
activityList.value =
(await useFetchActivity({ q: query }))?.map((item: any) => item.extra) || []
(await useFetchActivity({ q: query }))?.map((item: any) => ({
id: item.id,
...item.extra,
})) || []
})
onMounted(() => {
fetchList()
......@@ -224,7 +227,17 @@ const columns = [
},
},
{ title: '活动地址', key: '活动地址' },
{ title: '出席率', key: '出席率' },
{
title: '出席率',
key: '出席率',
render(row: any) {
return h(
'span',
{},
{ default: () => (row['出席率'] ? `${row['出席率']}%` : '') },
)
},
},
{ title: '参与人数', key: '实际参与人数' },
{
title: ' ',
......
This diff is collapsed.
<template>
<Map ref="map" />
<!-- <Map ref="map" /> -->
<NavBar @focus="showTag = false" @blur="showTag = true" />
<BasicInfo :visible="showTag" />
<div v-if="showReset" class="reset" @click="resetMap">
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment