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

导出活动详情及修改活动

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