Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
corporate-culture-qd
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
王立鹏
corporate-culture-qd
Commits
7d0ad70f
Commit
7d0ad70f
authored
Sep 24, 2026
by
lijiabin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【需求 25171】feat: 帖子发布支持选填主标签和副标签
parent
9621cb79
Hide whitespace changes
Inline
Side-by-side
Showing
2 changed files
with
33 additions
and
2 deletions
+33
-2
types.ts
src/api/article/types.ts
+3
-0
PostForm.vue
src/views/publishLongArticle/components/PostForm.vue
+30
-2
No files found.
src/api/article/types.ts
View file @
7d0ad70f
...
@@ -63,6 +63,9 @@ export interface AddOrUpdatePostDto extends OfficialPushFields {
...
@@ -63,6 +63,9 @@ export interface AddOrUpdatePostDto extends OfficialPushFields {
type
?:
ArticleTypeEnum
.
POST
type
?:
ArticleTypeEnum
.
POST
// 1是隐藏
// 1是隐藏
regionHide
?:
BooleanFlag
regionHide
?:
BooleanFlag
// 主/副标签,都选填,不选就不传或者传空数组
mainTagId
?:
number
|
string
tagList
?:
{
tagId
:
number
;
sort
:
number
}[]
}
}
/**
/**
...
...
src/views/publishLongArticle/components/PostForm.vue
View file @
7d0ad70f
...
@@ -5,7 +5,20 @@
...
@@ -5,7 +5,20 @@
<UploadFile
class=
"w-fit"
v-model=
"form.faceUrl"
:limit=
"1"
:aspect-ratio=
"3 / 2"
crop
/>
<UploadFile
class=
"w-fit"
v-model=
"form.faceUrl"
:limit=
"1"
:aspect-ratio=
"3 / 2"
crop
/>
</el-form-item>
</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"
>
<template
v-if=
"userInfo.isOfficialAccount"
>
<el-form-item
label=
"推送给"
>
<el-form-item
label=
"推送给"
>
<div
class=
"w-full flex items-center gap-2"
>
<div
class=
"w-full flex items-center gap-2"
>
...
@@ -101,7 +114,7 @@
...
@@ -101,7 +114,7 @@
*
*
* 帖子的特殊规则:
* 帖子的特殊规则:
* - 封面图:官方账号 / 管理员必填;普通用户选填(专栏、专访不管身份都必填,问吧、实践用的是"图片"不是"封面图")
* - 封面图:官方账号 / 管理员必填;普通用户选填(专栏、专访不管身份都必填,问吧、实践用的是"图片"不是"封面图")
* -
不分类:没有主/副标签,也
没有关联栏目
* -
主/副标签:跟专栏/专访/问吧/实践不一样,都是选填,一个都不选也能发布,
没有关联栏目
* - 只有官方账号才看得到"推送"配置(推送给谁 / 推送类型 / 推送摘要),非官方账号完全没有这些字段
* - 只有官方账号才看得到"推送"配置(推送给谁 / 推送类型 / 推送摘要),非官方账号完全没有这些字段
* - 没有"插入视频"功能,这个只有专栏、专访的官方账号才有
* - 没有"插入视频"功能,这个只有专栏、专访的官方账号才有
* - 发布时间、官方账号的 IP 显示设置:所有类型都一样,这里也自己维护一份
* - 发布时间、官方账号的 IP 显示设置:所有类型都一样,这里也自己维护一份
...
@@ -109,6 +122,7 @@
...
@@ -109,6 +122,7 @@
import
type
{
FormInstance
,
FormItemRule
}
from
'element-plus'
import
type
{
FormInstance
,
FormItemRule
}
from
'element-plus'
import
{
BooleanFlag
,
SendTypeEnum
}
from
'@/constants'
import
{
BooleanFlag
,
SendTypeEnum
}
from
'@/constants'
import
UploadFile
from
'@/components/common/UploadFile/index.vue'
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
DeptUserPicker
from
'@/components/common/DeptUserPicker/index.vue'
import
type
{
DepartmentUserSelection
}
from
'@/components/common/DepartmentUserModal/types'
import
type
{
DepartmentUserSelection
}
from
'@/components/common/DepartmentUserModal/types'
import
type
{
ArticleItemDto
}
from
'@/api/article/types'
import
type
{
ArticleItemDto
}
from
'@/api/article/types'
...
@@ -122,6 +136,8 @@ const { userInfo } = storeToRefs(userStore)
...
@@ -122,6 +136,8 @@ const { userInfo } = storeToRefs(userStore)
const
formRef
=
useTemplateRef
<
FormInstance
>
(
'formRef'
)
const
formRef
=
useTemplateRef
<
FormInstance
>
(
'formRef'
)
const
[
form
,
resetForm
]
=
useResetData
({
const
[
form
,
resetForm
]
=
useResetData
({
faceUrl
:
''
,
faceUrl
:
''
,
mainTagId
:
''
,
tagList
:
[]
as
number
[],
isPushAll
:
BooleanFlag
.
YES
,
isPushAll
:
BooleanFlag
.
YES
,
pushType
:
SendTypeEnum
.
IMMEDIATE
,
pushType
:
SendTypeEnum
.
IMMEDIATE
,
pushTime
:
''
,
pushTime
:
''
,
...
@@ -150,6 +166,14 @@ const faceUrlRules = computed<FormItemRule[]>(() =>
...
@@ -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
[]
>
=
{
const
rules
:
Record
<
string
,
FormItemRule
[]
>
=
{
pushType
:
[{
required
:
true
,
message
:
'请选择推送类型'
,
trigger
:
'trigger'
}],
pushType
:
[{
required
:
true
,
message
:
'请选择推送类型'
,
trigger
:
'trigger'
}],
pushTime
:
[{
required
:
true
,
message
:
'请选择推送时间'
,
trigger
:
'trigger'
}],
pushTime
:
[{
required
:
true
,
message
:
'请选择推送时间'
,
trigger
:
'trigger'
}],
...
@@ -182,6 +206,8 @@ defineExpose({
...
@@ -182,6 +206,8 @@ defineExpose({
validate
:
()
=>
formRef
.
value
!
.
validate
(),
validate
:
()
=>
formRef
.
value
!
.
validate
(),
getSubmitData
:
()
=>
({
getSubmitData
:
()
=>
({
faceUrl
:
form
.
value
.
faceUrl
,
faceUrl
:
form
.
value
.
faceUrl
,
mainTagId
:
form
.
value
.
mainTagId
,
tagList
:
buildTagList
(),
sendType
:
form
.
value
.
sendType
,
sendType
:
form
.
value
.
sendType
,
sendTime
:
form
.
value
.
sendTime
,
sendTime
:
form
.
value
.
sendTime
,
regionHide
:
form
.
value
.
regionHide
,
regionHide
:
form
.
value
.
regionHide
,
...
@@ -197,6 +223,8 @@ defineExpose({
...
@@ -197,6 +223,8 @@ defineExpose({
}),
}),
setEchoData
:
(
data
:
ArticleItemDto
)
=>
{
setEchoData
:
(
data
:
ArticleItemDto
)
=>
{
form
.
value
.
faceUrl
=
data
.
faceUrl
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
.
sendType
=
data
.
sendType
form
.
value
.
sendTime
=
data
.
sendTime
form
.
value
.
sendTime
=
data
.
sendTime
form
.
value
.
regionHide
=
data
.
regionHide
form
.
value
.
regionHide
=
data
.
regionHide
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment