Skip to content

Commit 7b6abf9

Browse files
committed
exercise record
1 parent 5ec1b5b commit 7b6abf9

4 files changed

Lines changed: 1143 additions & 155 deletions

File tree

src/views/forum.vue

Lines changed: 7 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -78,14 +78,21 @@
7878
</div>
7979
</div>
8080
</div>
81+
<CreatePostDialog ref="createPostDialogRef" />
8182
</template>
8283

8384
<script setup>
8485
import { ref } from 'vue'
8586
import { Search, Plus, ChatDotRound, Sunny, QuestionFilled, Medal, View, ChatRound, Star } from '@element-plus/icons-vue'
87+
import CreatePostDialog from "@/views/forum/CreatePostDialog.vue";
8688
8789
const searchText = ref('')
8890
const activeCategory = ref('1')
91+
const createPostDialogRef = ref(null)
92+
93+
const createPost = () => {
94+
createPostDialogRef.value.dialogVisible = true
95+
}
8996
9097
// 模拟的帖子数据
9198
const posts = ref([
@@ -115,10 +122,6 @@ const posts = ref([
115122
}
116123
])
117124
118-
const createPost = () => {
119-
// 实现发帖逻辑
120-
}
121-
122125
const handleCategorySelect = (key) => {
123126
activeCategory.value = key
124127
// 根据分类加载帖子
Lines changed: 116 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,116 @@
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

Comments
 (0)