123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199 |
- import { PropType, defineComponent, onMounted, reactive, ref } from 'vue';
- import styles from './suggestion-list.module.less';
- import {
- NInput,
- NSelect,
- NScrollbar,
- NSpin,
- NThing,
- NImageGroup,
- NSpace,
- NImage,
- NButton
- } from 'naive-ui';
- import { batchSetRead, getSysSuggestionList } from './api';
- import CDatePicker from '../../CDatePicker';
- import TheEmpty from '../../TheEmpty';
- import { useDebounceFn, useThrottleFn } from '@vueuse/core';
- import { eventGlobal, getTimes } from '/src/utils';
- export default defineComponent({
- name: 'suggestion-list',
- props: {
- typeList: {
- type: Array as PropType<any[]>,
- default: () => []
- }
- },
- setup(props) {
- const state = reactive({
- suggestionTypeList: [] as any,
- loading: false,
- finshed: false, // 是否加载完
- pagination: {
- page: 1,
- rows: 20
- },
- searchGroup: {
- suggestionTypeId: null,
- timer: null as any
- },
- tableList: [] as any,
- show: false,
- item: {} as any
- });
- const getList = async () => {
- try {
- if (state.pagination.page === 1) {
- state.loading = true;
- }
- const { timer, ...res } = state.searchGroup;
- const { data } = await getSysSuggestionList({
- ...state.searchGroup,
- ...res,
- ...getTimes(timer, ['startTime', 'endTime'])
- });
- state.loading = false;
- const tempRows = data.rows || [];
- tempRows.forEach((row: any) => {
- const imgList =
- (row.attachmentUrls && row.attachmentUrls.split(',')) || [];
- row.imgList = imgList;
- });
- if (state.pagination.page === 1) {
- state.tableList = tempRows;
- } else {
- state.tableList.push(...tempRows);
- }
- state.finshed = data.pages <= data.current ? true : false;
- } catch {
- state.loading = false;
- }
- };
- const throttledFnSearch = useDebounceFn(item => {
- state.pagination.page = state.pagination.page + 1;
- state.pagination.page = 1;
- state.tableList = [];
- state.searchGroup = Object.assign(state.searchGroup, item);
- getList();
- }, 100);
- const throttledFn = useThrottleFn(() => {
- state.pagination.page = state.pagination.page + 1;
- getList();
- }, 500);
- const getBatchSetRead = async () => {
- try {
- await batchSetRead({ messageType: 'SYS_SUGGEST_FEEDBACK_TEACHER' });
- eventGlobal.emit('onSuggestionRead');
- } catch {
- //
- }
- };
- onMounted(() => {
- props.typeList.forEach((item: any) => {
- state.suggestionTypeList.push({
- label: item.name,
- value: item.id
- });
- });
- getBatchSetRead();
- getList();
- });
- return () => (
- <div class={styles.suggestionList}>
- <div class={styles.attendClassSearch}>
- <NSelect
- placeholder="反馈类型"
- clearable
- options={
- [
- { label: '反馈类型', value: null },
- ...state.suggestionTypeList
- ] as any
- }
- v-model:value={state.searchGroup.suggestionTypeId}
- />
- <CDatePicker
- v-model:value={state.searchGroup.timer}
- separator={'至'}
- start-placeholder="反馈开始日期"
- end-placeholder="反馈结束日期"
- type="daterange"
- clearable={true}
- timerValue={state.searchGroup.timer}></CDatePicker>
- <NButton type="primary" class="searchBtn" onClick={throttledFnSearch}>
- 搜索
- </NButton>
- </div>
- <NScrollbar
- class={styles.classList}
- onScroll={(e: any) => {
- const clientHeight = e.target?.clientHeight;
- const scrollTop = e.target?.scrollTop;
- const scrollHeight = e.target?.scrollHeight;
- // 是否到底,是否加载完
- if (
- clientHeight + scrollTop + 20 >= scrollHeight &&
- !state.finshed &&
- !state.loading
- ) {
- throttledFn();
- }
- }}>
- <NSpin show={state.loading}>
- <div
- class={[
- styles.listSection,
- !state.loading && state.tableList.length <= 0
- ? styles.emptySection
- : ''
- ]}>
- {state.tableList.map((item: any) => (
- <div>
- <NThing class={[styles.thingItem, 'isFull']}>
- <div class={styles.item}>
- <span>反馈类型:</span>
- {item.suggestionTypeName}
- </div>
- <div class={styles.item}>
- <span>反馈内容:</span>
- {item.content}
- </div>
- {item.imgList && item.imgList.length > 0 && (
- <div class={styles.item}>
- <NImageGroup class={styles.IMageWraps}>
- {item.imgList?.map((item: any, index: number) => (
- <NImage
- class={[styles.ShowImg]}
- src={item}
- objectFit="cover"></NImage>
- ))}
- </NImageGroup>
- </div>
- )}
- {item.handleStatus && (
- <div class={styles.itemResult}>
- <span>处理结果:</span>
- {item.handleAttitude === 'NO'
- ? '感谢你对音乐数字课堂的关注与支持,我们会认真处理您的反馈,尽快修复和完善相关功能!'
- : item.feedbackContent}
- </div>
- )}
- </NThing>
- </div>
- ))}
- {!state.loading && state.tableList.length <= 0 && <TheEmpty />}
- </div>
- </NSpin>
- </NScrollbar>
- </div>
- );
- }
- });
|