1+ <template >
2+ <el-dialog
3+ v-model =" dialogVisible"
4+ title =" 发布新帖子"
5+ width =" 50%"
6+ :before-close =" handleClose"
7+ >
8+ <el-form :model =" form" :rules =" rules" ref =" formRef" label-width =" 80px" >
9+ <el-form-item label =" 标题" prop =" title" >
10+ <el-input v-model =" form.title" placeholder =" 请输入标题" />
11+ </el-form-item >
12+
13+ <el-form-item label =" 板块" prop =" category" >
14+ <el-select v-model =" form.category" placeholder =" 选择板块" >
15+ <el-option label =" 健康讨论" value =" 1" />
16+ <el-option label =" 生活分享" value =" 2" />
17+ <el-option label =" 问题解答" value =" 3" />
18+ <el-option label =" 经验交流" value =" 4" />
19+ </el-select >
20+ </el-form-item >
21+
22+ <el-form-item label =" 内容" prop =" content" >
23+ <el-input
24+ v-model =" form.content"
25+ type =" textarea"
26+ rows =" 6"
27+ placeholder =" 请输入帖子内容"
28+ />
29+ </el-form-item >
30+
31+ <el-form-item label =" 图片" >
32+ <el-upload
33+ action =" #"
34+ list-type =" picture-card"
35+ :auto-upload =" false"
36+ :on-change =" handleImageChange"
37+ >
38+ <el-icon ><Plus /></el-icon >
39+ </el-upload >
40+ </el-form-item >
41+ </el-form >
42+
43+ <template #footer >
44+ <span class =" dialog-footer" >
45+ <el-button @click =" handleClose" >取消</el-button >
46+ <el-button type =" primary" @click =" submitForm" >发布</el-button >
47+ </span >
48+ </template >
49+ </el-dialog >
50+ </template >
51+
52+ <script setup>
53+ import { ref , reactive } from ' vue'
54+ import { Plus } from ' @element-plus/icons-vue'
55+ import { ElMessage } from ' element-plus'
56+
57+ const dialogVisible = ref (false )
58+ const formRef = ref (null )
59+
60+ const form = reactive ({
61+ title: ' ' ,
62+ category: ' ' ,
63+ content: ' ' ,
64+ images: []
65+ })
66+
67+ const rules = {
68+ title: [
69+ { required: true , message: ' 请输入标题' , trigger: ' blur' },
70+ { min: 3 , max: 50 , message: ' 标题长度在3到50个字符之间' , trigger: ' blur' }
71+ ],
72+ category: [
73+ { required: true , message: ' 请选择板块' , trigger: ' change' }
74+ ],
75+ content: [
76+ { required: true , message: ' 请输入内容' , trigger: ' blur' },
77+ { min: 10 , message: ' 内容不能少于10个字符' , trigger: ' blur' }
78+ ]
79+ }
80+
81+ const handleImageChange = (file ) => {
82+ form .images .push (file .raw )
83+ }
84+
85+ const handleClose = () => {
86+ dialogVisible .value = false
87+ form .title = ' '
88+ form .category = ' '
89+ form .content = ' '
90+ form .images = []
91+ }
92+
93+ const submitForm = async () => {
94+ if (! formRef .value ) return
95+
96+ await formRef .value .validate ((valid ) => {
97+ if (valid) {
98+ // TODO: 实现发帖逻辑
99+ ElMessage .success (' 发布成功' )
100+ handleClose ()
101+ }
102+ })
103+ }
104+
105+ defineExpose ({
106+ dialogVisible
107+ })
108+ </script >
109+
110+ <style scoped>
111+ .dialog-footer {
112+ display : flex ;
113+ justify-content : flex-end ;
114+ gap : 12px ;
115+ }
116+ </style >
0 commit comments