Commit 7d0ad70f by lijiabin

【需求 25171】feat: 帖子发布支持选填主标签和副标签

parent 9621cb79
......@@ -63,6 +63,9 @@ export interface AddOrUpdatePostDto extends OfficialPushFields {
type?: ArticleTypeEnum.POST
// 1是隐藏
regionHide?: BooleanFlag
// 主/副标签,都选填,不选就不传或者传空数组
mainTagId?: number | string
tagList?: { tagId: number; sort: number }[]
}
/**
......
......@@ -5,7 +5,20 @@
<UploadFile class="w-fit" v-model="form.faceUrl" :limit="1" :aspect-ratio="3 / 2" crop />
</el-form-item>
<!-- 帖子没有标签、没有关联栏目——只有官方账号才有推送配置 -->
<!-- 主/副标签:帖子跟专栏/专访/问吧/实践不一样,都是选填,不选也能发布 -->
<el-form-item label="主标签">
<SelectTags v-model="form.mainTagId" class="w-full" />
</el-form-item>
<el-form-item label="副标签 (最多3个)">
<SelectTags
v-model="form.tagList"
:filter-tags-fn="filterTagsFn"
:max-selected-tags="3"
class="w-full"
/>
</el-form-item>
<!-- 帖子没有关联栏目——只有官方账号才有推送配置 -->
<template v-if="userInfo.isOfficialAccount">
<el-form-item label="推送给">
<div class="w-full flex items-center gap-2">
......@@ -101,7 +114,7 @@
*
* 帖子的特殊规则:
* - 封面图:官方账号 / 管理员必填;普通用户选填(专栏、专访不管身份都必填,问吧、实践用的是"图片"不是"封面图")
* - 不分类:没有主/副标签,也没有关联栏目
* - 主/副标签:跟专栏/专访/问吧/实践不一样,都是选填,一个都不选也能发布,没有关联栏目
* - 只有官方账号才看得到"推送"配置(推送给谁 / 推送类型 / 推送摘要),非官方账号完全没有这些字段
* - 没有"插入视频"功能,这个只有专栏、专访的官方账号才有
* - 发布时间、官方账号的 IP 显示设置:所有类型都一样,这里也自己维护一份
......@@ -109,6 +122,7 @@
import type { FormInstance, FormItemRule } from 'element-plus'
import { BooleanFlag, SendTypeEnum } from '@/constants'
import UploadFile from '@/components/common/UploadFile/index.vue'
import SelectTags from '@/components/common/SelectTags/index.vue'
import DeptUserPicker from '@/components/common/DeptUserPicker/index.vue'
import type { DepartmentUserSelection } from '@/components/common/DepartmentUserModal/types'
import type { ArticleItemDto } from '@/api/article/types'
......@@ -122,6 +136,8 @@ const { userInfo } = storeToRefs(userStore)
const formRef = useTemplateRef<FormInstance>('formRef')
const [form, resetForm] = useResetData({
faceUrl: '',
mainTagId: '',
tagList: [] as number[],
isPushAll: BooleanFlag.YES,
pushType: SendTypeEnum.IMMEDIATE,
pushTime: '',
......@@ -150,6 +166,14 @@ const faceUrlRules = computed<FormItemRule[]>(() =>
: [],
)
const filterTagsFn = (allTags: any[]) => allTags.filter((tag) => tag.id !== Number(form.value.mainTagId))
// 主/副标签都选填,合并成 tagList 时要把没选的部分过滤掉,不能硬凑一个空 tagId
const buildTagList = () =>
[form.value.mainTagId, ...form.value.tagList]
.filter((id) => id !== '' && id !== undefined && id !== null)
.map((tagId, index) => ({ tagId: Number(tagId), sort: index }))
const rules: Record<string, FormItemRule[]> = {
pushType: [{ required: true, message: '请选择推送类型', trigger: 'trigger' }],
pushTime: [{ required: true, message: '请选择推送时间', trigger: 'trigger' }],
......@@ -182,6 +206,8 @@ defineExpose({
validate: () => formRef.value!.validate(),
getSubmitData: () => ({
faceUrl: form.value.faceUrl,
mainTagId: form.value.mainTagId,
tagList: buildTagList(),
sendType: form.value.sendType,
sendTime: form.value.sendTime,
regionHide: form.value.regionHide,
......@@ -197,6 +223,8 @@ defineExpose({
}),
setEchoData: (data: ArticleItemDto) => {
form.value.faceUrl = data.faceUrl
form.value.mainTagId = data.tagIdList?.[0] ? String(data.tagIdList[0]) : ''
form.value.tagList = data.tagIdList?.slice(1) || []
form.value.sendType = data.sendType
form.value.sendTime = data.sendTime
form.value.regionHide = data.regionHide
......
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