admin_web/apps/web-antd/src/views/operation/activity/activity-add.vue
hahwu b1383a7091
Some checks failed
CI / Test (ubuntu-latest) (push) Has been cancelled
CI / Test (windows-latest) (push) Has been cancelled
CI / Lint (ubuntu-latest) (push) Has been cancelled
CI / Lint (windows-latest) (push) Has been cancelled
CI / Check (ubuntu-latest) (push) Has been cancelled
CI / Check (windows-latest) (push) Has been cancelled
CodeQL / Analyze (${{ matrix.language }}) (none, javascript-typescript) (push) Has been cancelled
Deploy Website on push / Deploy Push Playground Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Docs Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Antd Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Element Ftp (push) Has been cancelled
Deploy Website on push / Deploy Push Naive Ftp (push) Has been cancelled
Release Drafter / update_release_draft (push) Has been cancelled
CI / CI OK (push) Has been cancelled
活动优化
2026-03-23 17:12:06 +08:00

177 lines
4.3 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<script lang="ts" setup>
import { useVbenForm, useVbenModal } from '@vben/common-ui';
import { Image } from "ant-design-vue";
import { Tag } from 'ant-design-vue';
import { ref } from "vue";
import { addActivityApi } from '#/api/core/activity';
import type { EditActivityParam } from '#/api/core/activity';
import { getUnixTime } from '#/store/util';
interface MailItem {
Id: string | number;
Num: number;
url?: string;
}
let items = ref<MailItem[]>([]);
defineOptions({
name: 'DetailMailModal',
});
const [Form, FormApi] = useVbenForm({
// 所有表单项共用,可单独在表单内覆盖
commonConfig: {
// 所有表单项
componentProps: {
class: 'w-full h-full',
},
},
// 使用 tailwindcss grid布局
// 提交函数
// 垂直布局label和input在不同行值为vertical
layout: 'horizontal',
showDefaultActions: false,
// 水平布局label和input在同一行
schema: [
{
component: 'Select',
fieldName: 'type',
label: '活动类型',
componentProps: {
options: [
{
label: '挖矿活动',
value: 1,
},
{
label: '猜颜色',
value: 2,
},
{
label: '赛跑活动',
value: 3,
},
{
label: '限时特惠礼包',
value: 4,
},
{
label: '买一赠一礼包',
value: 5,
},
{
label: '超值加购礼包',
value: 6,
},
{
label: '好友合作活动',
value: 7,
},
],
},
},
{
component: 'Input',
fieldName: 'level',
label: '解锁等级',
componentProps: {
},
},
{
component: 'DatePicker',
fieldName: 'start_time',
label: '开始时间',
componentProps: {
showTime: true,
valueFormat: 'YYYY-MM-DD HH:mm:ss',
},
},
{
component: 'DatePicker',
fieldName: 'end_time',
label: '结束时间',
componentProps: {
showTime: true,
valueFormat: 'YYYY-MM-DD HH:mm:ss',
},
},
{
component: 'Input',
fieldName: 'title',
label: '活动标题',
rules: 'required',
},
{
component: 'Input',
fieldName: 'mail_title',
label: '回收邮件标题',
rules: 'required',
},
{
component: 'Input',
fieldName: 'mail_content',
label: '回收邮件内容',
},
{
component: 'Textarea',
fieldName: 'cfg',
label: '配置',
defaultValue: '{}',
componentProps: {
type: 'textarea',
rows: 8,
},
},
{
component: 'Textarea',
defaultValue: '{}',
fieldName: 'extra',
label: '额外配置',
},
],
});
const [Modal, modalApi] = useVbenModal({
confirmText: '提交',
onConfirm: async () => {
const values = await FormApi.getValues();
const mMdata = modalApi.getData();
const cfgjson = JSON.parse(values.cfg);
const params: EditActivityParam = {
AppId: mMdata.AppId,
Cfg: {
id: 0,
type: values.type,
start_time: values.start_time ? getUnixTime(values.start_time) : 0,
end_time: values.end_time ? getUnixTime(values.end_time) : 0,
title: values.title,
level: values.level,
mail_title: values.mail_title,
mail_content: values.mail_content,
cfg: JSON.stringify(cfgjson),
extra: values.extra,
},
};
await addActivityApi(params);
modalApi.close();
},
});
</script>
<template>
<Modal :width="800" title="邮件详情">
<Form>
<template #items>
<div class="flex flex-wrap items-center justify-center">
<div v-for="item in items" :key="item.Id" class="flex items-center gap-1">
<template v-if="item.url">
<Image :src="item.url" width="30px" />
</template>
<template v-else>
<Tag class="w-[45px] h-[30px] flex items-center justify-center text-xs">
{{ item.Id }}
</Tag>
</template>
<span>x{{ item.Num }}</span>
</div>
</div>
</template>
</Form>
</Modal>
</template>