| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244 |
- <template>
- <a-card :bordered="false">
- <a-space>
- <a-input-search
- v-model:value="searchFormState.postTitle"
- placeholder="请输入名称关键词"
- enter-button
- allowClear
- @search="onSearch"
- />
- <a-select
- v-model:value="typeValue"
- show-search
- placeholder="所有分类"
- style="width: 200px"
- :options="typeOptions"
- :filter-option="filterOption"
- @change="handleChange"
- ></a-select>
- <a-select
- v-model:value="typeValueEx"
- allowClear
- placeholder="请选择"
- style="width: 200px"
- :options="typeOptionsEx"
- @change="handleChangeEx"
- ></a-select>
- <a-radio-group v-model:value="searchFormState.sortOrder" button-style="solid">
- <a-radio-button
- v-for="module in moduleTypeList"
- :key="module.id"
- :value="module.id"
- @click="moduleClock(module.id)"
- >
- {{ module.title }}
- </a-radio-button>
- </a-radio-group>
- <a-button type="primary" @click="formRef.onOpen(undefined, searchFormState.sortOrder)">
- <template #icon><plus-outlined /></template>
- 创建新主题
- </a-button>
- </a-space>
- <s-table ref="table" :columns="columns" :data="loadData" :row-key="(record) => record.id" :custom-row="customRow">
- <template #bodyCell="{ column, record }">
- <template v-if="column.dataIndex === 'postTitle'">
- <div class="forum-list-title">{{ record.postTitle }}</div>
- <div class="forum-list-type">{{ record.typeName }}</div>
- <div class="forum-list-content one-line" v-html="record.postContent"></div>
- </template>
- <template v-if="column.dataIndex === 'lastReplyUserAvatar'">
- <a-tooltip :title="record.lastReplyUserNickName" placement="top">
- <a-avatar :src="record.lastReplyUserAvatar"></a-avatar>
- </a-tooltip>
- </template>
- <template v-if="column.dataIndex === 'lastReplyTime'">
- <div>{{ formatDateTime(record.lastReplyTime) }}</div>
- </template>
- </template>
- </s-table>
- </a-card>
- <Form ref="formRef" @successful="table.refresh(true)" />
- </template>
- <script setup name="forumList">
- import forumApi from '@/api/forum/forumApi'
- import Form from './form.vue'
- import { parseTime } from '@/utils/exam'
- import { useRoute, useRouter } from 'vue-router'
- const route = useRoute()
- const router = useRouter()
- const formRef = ref()
- let searchFormState = reactive({
- sortOrder: 0,
- postTitle: '',
- postType: route.query.postType ?? null
- })
- const table = ref(null)
- const moduleTypeList = ref([
- {
- title: '最新',
- id: 0
- },
- {
- title: '热门',
- id: 1
- }
- ])
- const columns = [
- {
- title: '主题',
- dataIndex: 'postTitle'
- },
- {
- title: '最后回复人',
- dataIndex: 'lastReplyUserAvatar',
- align: 'center',
- width: 100
- },
- {
- title: '回复量',
- dataIndex: 'replyCount',
- align: 'center',
- width: 100
- },
- {
- title: '浏览量',
- dataIndex: 'viewCount',
- align: 'center',
- width: 100
- },
- {
- title: '最后回复时间',
- dataIndex: 'lastReplyTime',
- align: 'center',
- width: 120
- }
- ]
- const typeValue = ref('所有分类')
- const typeOptions = ref([])
- const handleChange = (value) => {
- exType.value = false
- typeValueEx.value = ''
- searchFormState.typeId = value
- table.value.refresh(true)
- }
- const filterOption = (input, option) => {
- return option.value.toLowerCase().indexOf(input.toLowerCase()) >= 0
- }
- function formatDateTime(val) {
- if (!val) return ''
- return parseTime(val, '{y}-{m}-{d} {h}:{i}:{s}')
- }
- // 查询
- const onSearch = () => {
- typeValueEx.value = ''
- exType.value = false
- table.value.refresh(true)
- }
- function customRow(record) {
- return {
- onClick: () => itemSelect(record)
- }
- }
- function itemSelect(record) {
- router.push({
- path: '/forum/detail',
- query: {
- postId: record.postId,
- postType: route.query.postType ?? ''
- }
- })
- }
- function getTypeList() {
- forumApi.forumTypeList().then((data) => {
- typeOptions.value = data.map((r) => {
- return {
- label: r.typeName,
- value: r.typeId,
- ...r
- }
- })
- })
- }
- getTypeList()
- const typeValueEx = ref('')
- const exType = ref(false)
- const typeOptionsEx = ref([
- {
- label: '我发布的',
- value: 1
- },
- {
- label: '我回复的',
- value: 2
- },
- {
- label: '关于我的',
- value: 3
- },
- {
- label: '我点赞的',
- value: 4
- }
- ])
- const handleChangeEx = (value) => {
- if (value) {
- exType.value = true
- } else {
- exType.value = false
- typeValueEx.value = ''
- }
- table.value.refresh(true)
- }
- const loadData = (parameter) => {
- if (exType.value) {
- return forumApi.moreList(Object.assign(parameter, {postExtend:typeValueEx.value})).then((data) => {
- if (data) {
- return data
- } else {
- return []
- }
- })
- } else {
- return forumApi.forumList(Object.assign(parameter, searchFormState)).then((data) => {
- if (data) {
- return data
- } else {
- return []
- }
- })
- }
- }
- // 切换应用标签查询菜单列表
- const moduleClock = (value) => {
- exType.value = false
- typeValueEx.value = ''
- searchFormState.sortOrder = value
- table.value.refresh(true)
- }
- </script>
- <style scoped>
- .forum-list-title {
- font-size: 16px;
- font-weight: bold;
- }
- .forum-list-type {
- font-size: 12px;
- }
- .forum-list-content {
- font-size: 14px;
- color: #696969;
- }
- .one-line {
- display: -webkit-box;
- -webkit-box-orient: vertical;
- -webkit-line-clamp: 1;
- overflow: hidden;
- }
- </style>
|