Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
C
corporateCulture-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
王立鹏
corporateCulture-qd
Commits
0f477de8
Commit
0f477de8
authored
Feb 05, 2026
by
lijiabin
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
【需求 20331】 feat: 优化案例库相关内容
1:后台的案例库应用状态[已使用],禁止用户在前台编辑 2:[审核通过]的案例库,用户在前台编辑提交时二次提示
parent
c8a47b69
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
163 additions
and
134 deletions
+163
-134
types.ts
src/api/case/types.ts
+8
-1
index.vue
src/views/publishCase/index.vue
+35
-13
selfCase.vue
src/views/userPage/components/selfCase.vue
+120
-120
No files found.
src/api/case/types.ts
View file @
0f477de8
/**
* 添加或更新案例库DTO
*/
import
{
TagTypeEnum
,
TagLevelEnum
,
BooleanFlag
,
ReleaseStatusTypeEnum
}
from
'@/constants'
import
{
TagTypeEnum
,
TagLevelEnum
,
BooleanFlag
,
ReleaseStatusTypeEnum
,
AuditStatusEnum
,
}
from
'@/constants'
type
TagItemDto
=
{
tagId
:
number
...
...
@@ -31,4 +37,5 @@ export interface CaseDetailDto {
cultureKeywordSub
:
string
[]
sceneKeywordMain
:
string
sceneKeywordSub
:
string
[]
isAudit
:
AuditStatusEnum
}
src/views/publishCase/index.vue
View file @
0f477de8
...
...
@@ -96,6 +96,7 @@
class=
"px-6 py-2 bg-blue-500 hover:bg-blue-600 rounded-lg text-white text-sm font-medium shadow-sm hover:shadow-md transition-all duration-200"
type=
"primary"
@
click=
"handleSubmit(ReleaseStatusTypeEnum.PUBLISH)"
:loading=
"loading"
>
提交
</el-button>
...
...
@@ -113,7 +114,13 @@ import type { AddOrUpdateCaseDto } from '@/api'
import
SelectTags
from
'@/components/common/SelectTags/index.vue'
import
type
{
FormInstance
}
from
'element-plus'
import
type
{
TagItemDto
}
from
'@/api'
import
{
TagTypeEnum
,
TagLevelEnum
,
BooleanFlag
,
ReleaseStatusTypeEnum
}
from
'@/constants'
import
{
TagTypeEnum
,
TagLevelEnum
,
BooleanFlag
,
ReleaseStatusTypeEnum
,
AuditStatusEnum
,
}
from
'@/constants'
import
{
selectDepOrUser
}
from
'@/utils'
import
{
useUserStore
}
from
'@/stores'
import
{
storeToRefs
}
from
'pinia'
...
...
@@ -122,7 +129,7 @@ const router = useRouter()
const
userStore
=
useUserStore
()
const
{
userInfo
}
=
storeToRefs
(
userStore
)
const
formRef
=
useTemplateRef
<
FormInstance
>
(
'formRef'
)
const
loading
=
ref
(
false
)
const
rules
=
{
title
:
[{
required
:
true
,
message
:
'请输入标题'
,
trigger
:
'blur'
}],
content
:
[{
required
:
true
,
message
:
'请输入内容'
,
trigger
:
'blur'
}],
...
...
@@ -164,14 +171,7 @@ const handleCancel = () => {
router
.
back
()
}
// 预览
// const handlePreview = () => {
// console.log('预览', form)
// ElMessage.success('预览功能待实现')
// }
// 保存草稿
// 保存
const
transformData
=
(
releaseStatus
:
ReleaseStatusTypeEnum
):
AddOrUpdateCaseDto
=>
{
const
{
mainTagId
,
...
...
@@ -224,15 +224,30 @@ const transformData = (releaseStatus: ReleaseStatusTypeEnum): AddOrUpdateCaseDto
return
obj
}
const
showSubmitGuide
=
ref
(
false
)
// 提交
const
handleSubmit
=
async
(
releaseStatus
:
ReleaseStatusTypeEnum
)
=>
{
await
formRef
.
value
?.
validate
()
console
.
log
(
'form'
,
{
...
transformData
(
releaseStatus
)
})
const
res
=
await
addOrUpdateCase
({
...
transformData
(
releaseStatus
)
})
if
(
res
)
{
if
(
showSubmitGuide
.
value
)
{
await
ElMessageBox
.
confirm
(
'该案例库已审核通过,修改后需重新审核,确定提交吗?'
,
'提示'
,
{
confirmButtonText
:
'确定'
,
cancelButtonText
:
'取消'
,
type
:
'warning'
,
})
}
loading
.
value
=
true
try
{
await
addOrUpdateCase
({
...
transformData
(
releaseStatus
)
})
ElMessage
.
success
(
'提交成功'
)
resetForm
()
router
.
back
()
}
catch
(
error
)
{
console
.
log
(
'error'
,
error
)
}
finally
{
loading
.
value
=
false
}
}
...
...
@@ -340,6 +355,13 @@ onActivated(async () => {
}
form
.
value
=
obj
console
.
log
(
'form'
,
form
.
value
)
// 已经同意的案例库 二次修改需要提示
if
(
data
.
isAudit
===
AuditStatusEnum
.
AGREED
)
{
showSubmitGuide
.
value
=
true
}
else
{
showSubmitGuide
.
value
=
false
}
}
else
{
showSubmissionGuide
()
}
...
...
src/views/userPage/components/selfCase.vue
View file @
0f477de8
...
...
@@ -50,12 +50,25 @@
>
待审核
</el-tag
>
<el-tag
v-else-if=
"item.isAudit === AuditStatusEnum.AGREED"
v-else-if=
"
item.isAudit === AuditStatusEnum.AGREED &&
item.isUse === UsageStatusEnum.UNUSABLE
"
type=
"success"
size=
"small"
>
已通过
</el-tag
>
<el-tag
v-else
type=
"warning"
>
已驳回
</el-tag>
<el-tag
v-else-if=
"item.isAudit === AuditStatusEnum.REJECTED"
type=
"warning"
>
已驳回
</el-tag
>
<el-tag
v-else-if=
"
item.isAudit === AuditStatusEnum.AGREED && item.isUse === UsageStatusEnum.USED
"
type=
"success"
size=
"small"
>
已使用
</el-tag
>
</span>
<!--
<span
class=
"mr-2"
>
浏览
{{
item
.
viewCount
}}
</span>
<span
class=
"mr-2"
>
点赞
{{
item
.
replyCount
}}
</span>
...
...
@@ -66,23 +79,9 @@
<!-- Meta Info -->
<div
class=
"flex items-center text-gray-400 text-sm ml-4"
>
<el-button
type=
"primary"
link
@
click=
"handleEdit(item)"
>
{{
searchParams
.
releaseStatus
===
ReleaseStatusTypeEnum
.
PUBLISH
&&
item
.
isAudit
!==
AuditStatusEnum
.
UNAUDITED
?
'查看'
:
'编辑'
}}
</el-button>
<el-button
v-if=
"
searchParams.releaseStatus === ReleaseStatusTypeEnum.DRAFT ||
(searchParams.releaseStatus === ReleaseStatusTypeEnum.PUBLISH &&
item.isAudit === AuditStatusEnum.UNAUDITED)
"
type=
"danger"
link
@
click=
"handleDelete(item)"
<el-button
type=
"primary"
link
@
click=
"handleView(item)"
>
查看
</el-button>
<el-button
type=
"primary"
link
@
click=
"handleEdit(item)"
>
编辑
</el-button>
<el-button
v-if=
"showDelBtn(item)"
type=
"danger"
link
@
click=
"handleDelete(item)"
>
删除
</el-button
>
</div>
...
...
@@ -114,7 +113,7 @@
import
{
getSelfCaseList
,
deleteCase
,
getCaseDetail
}
from
'@/api'
import
{
usePageSearch
}
from
'@/hooks'
import
dayjs
from
'dayjs'
import
{
ReleaseStatusTypeEnum
,
AuditStatusEnum
}
from
'@/constants'
import
{
ReleaseStatusTypeEnum
,
AuditStatusEnum
,
UsageStatusEnum
}
from
'@/constants'
import
type
{
TabPaneName
}
from
'element-plus'
import
type
{
SelfCaseItemDto
}
from
'@/api/user/types'
const
router
=
useRouter
()
...
...
@@ -139,121 +138,122 @@ const { list, loading, searchParams, total, goToPage, changePageSize, refresh }
},
)
const
handleEdit
=
async
(
item
:
SelfCaseItemDto
)
=>
{
if
(
searchParams
.
value
.
releaseStatus
===
ReleaseStatusTypeEnum
.
PUBLISH
&&
item
.
isAudit
!==
AuditStatusEnum
.
UNAUDITED
)
{
// 根据 id获取详情数据
const
{
data
}
=
await
getCaseDetail
(
item
.
id
)
console
.
log
(
data
)
// 打开弹窗 查看详情
const
formData
=
{
title
:
data
.
title
,
content
:
data
.
content
,
keywords
:
[
data
.
cultureKeywordMain
,
...(
data
.
cultureKeywordSub
||
[])].
filter
(
Boolean
),
scenes
:
[
data
.
sceneKeywordMain
,
...(
data
.
sceneKeywordSub
||
[])].
filter
(
Boolean
),
departments
:
data
.
depNameList
.
filter
(
Boolean
),
syncPublish
:
data
.
isSync
?
'是'
:
'否'
,
}
console
.
log
(
formData
)
const
showDelBtn
=
(
item
:
SelfCaseItemDto
)
=>
{
return
(
searchParams
.
value
.
releaseStatus
===
ReleaseStatusTypeEnum
.
DRAFT
||
(
searchParams
.
value
.
releaseStatus
===
ReleaseStatusTypeEnum
.
PUBLISH
&&
item
.
isAudit
===
AuditStatusEnum
.
UNAUDITED
)
)
}
ElMessageBox
({
title
:
'案例详情'
,
message
:
(
<
div
class
=
"max-h-500px overflow-y-auto px-4"
>
{
/* 标题 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
标题
<
/div
>
<
div
class
=
"bg-gray-50 rounded-lg px-4 py-3 text-gray-700"
>
{
formData
.
title
}
<
/div
>
const
handleView
=
async
(
item
:
SelfCaseItemDto
)
=>
{
// 根据 id获取详情数据
const
{
data
}
=
await
getCaseDetail
(
item
.
id
)
console
.
log
(
data
)
// 打开弹窗 查看详情
const
formData
=
{
title
:
data
.
title
,
content
:
data
.
content
,
keywords
:
[
data
.
cultureKeywordMain
,
...(
data
.
cultureKeywordSub
||
[])].
filter
(
Boolean
),
scenes
:
[
data
.
sceneKeywordMain
,
...(
data
.
sceneKeywordSub
||
[])].
filter
(
Boolean
),
departments
:
data
.
depNameList
.
filter
(
Boolean
),
syncPublish
:
data
.
isSync
?
'是'
:
'否'
,
}
ElMessageBox
({
title
:
'案例详情'
,
message
:
(
<
div
class
=
"w-400px max-h-500px overflow-y-auto px-4"
>
{
/* 标题 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
标题
<
/div
>
<
div
class
=
"bg-gray-50 rounded-lg px-4 py-3 text-gray-700"
>
{
formData
.
title
}
<
/div
>
<
/div
>
{
/* 内容 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
内容
<
/div
>
<
div
class
=
"bg-gray-50 rounded-lg px-4 py-3 text-gray-700 min-h-80px whitespace-pre-wrap break-words"
>
{
formData
.
content
}
<
/div
>
{
/* 内容 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
内容
<
/div
>
<
div
class
=
"bg-gray-50 rounded-lg px-4 py-3 text-gray-700 min-h-80px whitespace-pre-wrap break-words"
>
{
formData
.
content
}
<
/div
>
<
/div
>
{
/* 文化关键词 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
文化关键词
<
/div
>
{
/* 文化关键词 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
文化关键词
<
/div
>
<
div
class
=
"flex flex-wrap gap-2"
>
{
formData
.
keywords
.
map
((
keyword
,
index
)
=>
(
<
span
key
=
{
index
}
class
=
"px-3 py-1.5 bg-blue-50 text-blue-600 rounded-md text-13px"
>
{
keyword
}
<
/span
>
))}
<
/div
>
<
/div
>
{
/* 关联场景 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2"
>
关联场景
<
/div
>
{
formData
.
scenes
.
length
>
0
?
(
<
div
class
=
"flex flex-wrap gap-2"
>
{
formData
.
keywords
.
map
((
keyword
,
index
)
=>
(
{
formData
.
scenes
.
map
((
scene
,
index
)
=>
(
<
span
key
=
{
index
}
class
=
"px-3 py-1.5 bg-blue-50 text-blue-600 rounded-md text-13px"
>
{
keyword
}
{
scene
}
<
/span
>
))}
<
/div
>
<
/div
>
)
:
(
<
div
class
=
"text-gray-400 text-13px"
>
暂无
<
/div
>
)}
<
/div
>
{
/* 关联场景 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2"
>
关联场景
<
/div
>
{
formData
.
scenes
.
length
>
0
?
(
<
div
class
=
"flex flex-wrap gap-2"
>
{
formData
.
scenes
.
map
((
scene
,
index
)
=>
(
<
span
key
=
{
index
}
class
=
"px-3 py-1.5 bg-blue-50 text-blue-600 rounded-md text-13px"
>
{
scene
}
<
/span
>
))}
<
/div
>
)
:
(
<
div
class
=
"text-gray-400 text-13px"
>
暂无
<
/div
>
)}
<
/div
>
{
/* 关联部门 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2"
>
关联部门
<
/div
>
{
formData
.
departments
.
length
>
0
?
(
<
div
class
=
"flex flex-wrap gap-2"
>
{
formData
.
departments
.
map
((
dept
,
index
)
=>
(
<
span
key
=
{
index
}
class
=
"px-3 py-1.5 bg-gray-50 text-gray-700 rounded-md text-13px"
>
{
dept
}
<
/span
>
))}
<
/div
>
)
:
(
<
div
class
=
"text-gray-400 text-13px"
>
暂无
<
/div
>
)}
<
/div
>
{
/* 关联部门 */
}
<
div
class
=
"mb-5"
>
<
div
class
=
"text-13px text-gray-500 mb-2"
>
关联部门
<
/div
>
{
formData
.
departments
.
length
>
0
?
(
<
div
class
=
"flex flex-wrap gap-2"
>
{
formData
.
departments
.
map
((
dept
,
index
)
=>
(
<
span
key
=
{
index
}
class
=
"px-3 py-1.5 bg-gray-50 text-gray-700 rounded-md text-13px"
>
{
dept
}
<
/span
>
))}
<
/div
>
)
:
(
<
div
class
=
"text-gray-400 text-13px"
>
暂无
<
/div
>
)}
{
/* 是否同步发布到实践 */
}
<
div
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
是否同步发布到实践
<
/div
>
{
/* 是否同步发布到实践 */
}
<
div
>
<
div
class
=
"text-13px text-gray-500 mb-2 flex items-center"
>
<
span
class
=
"text-red-500 mr-1"
>*<
/span
>
是否同步发布到实践
<
/div
>
<
div
class
=
"px-4 py-2.5 bg-gray-50 rounded-lg text-gray-700 inline-block"
>
{
formData
.
syncPublish
}
<
/div
>
<
div
class
=
"px-4 py-2.5 bg-gray-50 rounded-lg text-gray-700 inline-block"
>
{
formData
.
syncPublish
}
<
/div
>
<
/div
>
),
confirmButtonText
:
'确定'
,
showCancelButton
:
false
,
customClass
:
'form-detail-dialog'
,
})
}
else
{
router
.
push
(
`/publishCase?id=
${
item
.
id
}
`
)
}
<
/div
>
),
confirmButtonText
:
'确定'
,
showCancelButton
:
false
,
customClass
:
'form-detail-dialog'
,
})
}
const
handleEdit
=
async
(
item
:
SelfCaseItemDto
)
=>
{
if
(
item
.
isAudit
===
AuditStatusEnum
.
AGREED
&&
item
.
isUse
===
UsageStatusEnum
.
USED
)
return
ElMessage
.
warning
(
'案例已使用,无法编辑'
)
router
.
push
(
`/publishCase?id=
${
item
.
id
}
`
)
}
const
handleDelete
=
async
(
item
:
SelfCaseItemDto
)
=>
{
...
...
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