Przeglądaj źródła

[feat]
增加游记的话题模块

chenchen 1 miesiąc temu
rodzic
commit
1302b05194

+ 3 - 0
src/api/generated/index.ts

@@ -69,6 +69,8 @@ import TourProjectGroupPurchaseDetailController from './tourProjectGroupPurchase
 import TourProjectGroupPurchaseApplyController from './tourProjectGroupPurchaseApplyController';
 import TourProjectGroupPurchaseBannerController from './tourProjectGroupPurchaseBannerController';
 import TourProjectGroupPurchaseRebateController from './tourProjectGroupPurchaseRebateController';
+import TourTravelNotesTopicController from './tourTravelNotesTopicController';
+
 export {
   SysUserController,
   SysDeptController,
@@ -141,4 +143,5 @@ export {
   TourProjectGroupPurchaseApplyController,
   TourProjectGroupPurchaseBannerController,
   TourProjectGroupPurchaseRebateController,
+  TourTravelNotesTopicController,
 };

+ 43 - 0
src/api/generated/tourTravelNotesTopicController.ts

@@ -0,0 +1,43 @@
+import { BaseController } from '@/api/BaseController';
+import { RequestOption } from '@/common/http/types';
+import { ANY_OBJECT } from '@/types/generic';
+import { TableData } from '@/common/types/table';
+import { useUrlBuilder } from '@/common/hooks/useUrl';
+import TourTravelNotesTopic from '@/types/table/tourTravelNotesTopic';
+import { API_CONTEXT } from '../config';
+
+const { buildGetUrl } = useUrlBuilder();
+
+export interface TourTravelNotesTopicData extends TourTravelNotesTopic {
+  __cascade_add_temp_id__?: string | number | undefined;
+}
+
+export default class TourTravelNotesTopicController extends BaseController {
+  static list(params: ANY_OBJECT, httpOptions?: RequestOption) {
+    return super.post<TableData<TourTravelNotesTopicData>>(API_CONTEXT + '/app/tourTravelNotesTopic/list', params, httpOptions);
+  }
+  static view(params: ANY_OBJECT, httpOptions?: RequestOption) {
+    return super.get<TourTravelNotesTopicData>(API_CONTEXT + '/app/tourTravelNotesTopic/view', params, httpOptions);
+  }
+  static export(params: ANY_OBJECT, fileName: string) {
+    return super.download(API_CONTEXT + '/app/tourTravelNotesTopic/export', params, fileName);
+  }
+  static import(params: ANY_OBJECT) {
+    return super.upload(API_CONTEXT + '/app/tourTravelNotesTopic/import', params);
+  }
+  static printUrl(params: ANY_OBJECT) {
+    return buildGetUrl(API_CONTEXT + '/app/tourTravelNotesTopic/print', params);
+  }
+  static add(params: ANY_OBJECT, httpOptions?: RequestOption) {
+    return super.post(API_CONTEXT + '/app/tourTravelNotesTopic/add', params, httpOptions);
+  }
+  static update(params: ANY_OBJECT, httpOptions?: RequestOption) {
+    return super.post(API_CONTEXT + '/app/tourTravelNotesTopic/update', params, httpOptions);
+  }
+  static delete(params: ANY_OBJECT, httpOptions?: RequestOption) {
+    return super.post(API_CONTEXT + '/app/tourTravelNotesTopic/delete', params, httpOptions);
+  }
+  static deleteBatch(params: ANY_OBJECT, httpOptions?: RequestOption) {
+    return super.post(API_CONTEXT + '/app/tourTravelNotesTopic/deleteBatch', params, httpOptions);
+  }
+}

+ 298 - 0
src/pages/tourTravelNotesTopic/editTourTravelNotesTopic.vue

@@ -0,0 +1,298 @@
+<template>
+  <div class="dialog-box" style="position: relative">
+    <el-scrollbar class="custom-scroll content-box">
+      <el-form
+        ref="editTourTravelNotesTopicRef"
+        :model="formData"
+        :size="layoutStore.defaultFormItemSize"
+        :rules="rules"
+        label-width="120px"
+        label-position="right"
+        @submit.prevent
+      >
+        <el-row :gutter="16">
+          <el-col :span="14">
+            <el-form-item label="话题名称" prop="TourTravelNotesTopic.name">
+              <el-input
+                class="input-item"
+                v-model="formData.TourTravelNotesTopic.name"
+                type="text"
+                placeholder=""
+                :clearable="true"
+                :show-word-limit="false"
+                maxlength=""
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="14">
+            <el-form-item label="是否启用" prop="TourTravelNotesTopic.enable">
+              <el-select
+                class="input-item"
+                v-model="formData.TourTravelNotesTopic.enable"
+                placeholder=""
+                :clearable="true"
+                :filterable="true"
+                @visible-change="enableWidget.onVisibleChange"
+              >
+                <el-option
+                  v-for="item in enableWidgetDropdownList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="热度值" prop="TourTravelNotesTopic.hotValue">
+              <el-input-number
+                class="input-item"
+                v-model="formData.TourTravelNotesTopic.hotValue"
+                placeholder=""
+                :clearable="true"
+                :step="1"
+                :controls="true"
+              />
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+    </el-scrollbar>
+    <el-row class="footer-box" type="flex" justify="end" align="middle">
+      <el-button :size="layoutStore.defaultFormItemSize" @click="onCancel()">取消</el-button>
+      <el-button :size="layoutStore.defaultFormItemSize" type="primary" @click="onUpdateClick()">保存</el-button>
+    </el-row>
+  </div>
+</template>
+
+<script lang="ts">
+export default {
+  name: 'editTourTravelNotesTopic',
+};
+</script>
+
+<script setup lang="ts">
+import { DialogProp } from '@/components/Dialog/types';
+import * as validateRules from '@/common/utils/validate';
+import { VxeColumn, VxeTable } from 'vxe-table';
+import { ANY_OBJECT } from '@/types/generic';
+import { DictData, DictionaryBase } from '@/common/staticDict/types';
+import { ElMessage, ElMessageBox, UploadFile } from 'element-plus';
+import { useRoute, useRouter } from 'vue-router';
+import { useCommon } from '@/common/hooks/useCommon';
+import { useLayoutStore, useStaticDictStore } from '@/store';
+import { useDownload } from '@/common/hooks/useDownload';
+import { useDropdown } from '@/common/hooks/useDropdown';
+import { DropdownOptions, ListData } from '@/common/types/list';
+import { useTable } from '@/common/hooks/useTable';
+import { TableOptions } from '@/common/types/pagination';
+import { useUpload } from '@/common/hooks/useUpload';
+import { useUploadWidget } from '@/common/hooks/useUploadWidget';
+import { DictionaryController } from '@/api/system';
+import { treeDataTranslate, findItemFromList, findTreeNodePath, findTreeNode, stringCase } from '@/common/utils';
+import { TourTravelNotesTopicData } from '@/api/generated/tourTravelNotesTopicController';
+import { TourTravelNotesTopicController } from '@/api/generated';
+
+const router = useRouter();
+const route = useRoute();
+const layoutStore = useLayoutStore();
+const { downloadFile } = useDownload();
+const { getUploadHeaders, getUploadActionUrl, fileListToJson, parseUploadData, getPictureList } = useUpload();
+const { 
+  Delete,
+  Search,
+  Edit,
+  Plus,
+  Refresh,
+  Picture,
+  Dialog,
+  mainContextHeight,
+  clientHeight,
+  checkPermCodeExist,
+  parseParams,
+  parseArrayParams,
+  formatDateByStatsType,
+  getDateRangeFilter,
+} = useCommon();
+// 静态字典
+const { staticDict: StaticDict } = useStaticDictStore();
+
+const props = withDefaults(
+  defineProps<{
+    subPage?: number | string | boolean;
+    id?: ANY_OBJECT;
+    saveOnSubmit?: boolean;
+    rowData?: ANY_OBJECT;
+    // 当使用Dialog.show弹出组件时,须定义该prop属性,以便对dialog进行回调
+    dialog?: DialogProp<ANY_OBJECT[]>;
+  }>(),
+  {
+    subPage: 0,
+    id: undefined,
+    saveOnSubmit: true,
+    rowData: undefined,
+    dialog: undefined,
+  },
+);
+
+const editTourTravelNotesTopicRef = ref();
+// 表单数据定义
+type EditTourTravelNotesTopicData = {
+  TourTravelNotesTopic: TourTravelNotesTopicData;
+};
+// 表单数据
+const formData = reactive<EditTourTravelNotesTopicData>({
+  TourTravelNotesTopic: {
+    // 主键id
+    id: undefined,
+    // 话题名称
+    name: undefined,
+    // 是否启用,0否,1是
+    enable: undefined,
+    // 创建用户
+    createUserId: undefined,
+    // 创建时间
+    createTime: undefined,
+    // 更新用户
+    updateUserId: undefined,
+    // 更新时间
+    updateTime: undefined,
+    // 删除标记(1: 正常 -1: 已删除)
+    dataState: undefined,
+    // 热度值
+    hotValue: undefined,
+  },
+},
+);
+// 表单验证规则
+const rules = reactive({
+  'TourTravelNotesTopic.hotValue': [
+  ],
+  'TourTravelNotesTopic.name': [
+  ],
+  'TourTravelNotesTopic.enable': [
+  ],
+});
+
+const onCancel = () => {
+  if (props.dialog) {
+    props.dialog.cancel();
+  }
+};
+
+const isEdit = computed(() => {
+  return props.saveOnSubmit ? props.id != null : props.rowData != null;
+});
+
+// 初始化页面数据
+const loadTourTravelNotesTopicData = () => {
+  return new Promise<void>((resolve, reject) => {
+    if (!isEdit.value) {
+      resolve();
+      return;
+    }
+    if (!props.saveOnSubmit && props.rowData != null) {
+      formData.TourTravelNotesTopic = JSON.parse(JSON.stringify(props.rowData));
+      resolve();
+      return;
+    }
+    let params: ANY_OBJECT = {
+      id: props.id
+    };
+    TourTravelNotesTopicController.view(params).then(res => {
+      formData.TourTravelNotesTopic = { ...res.data };
+      resolve();
+    }).catch(e => {
+      reject(e);
+    });
+  });
+};
+/**
+ * 是否启用下拉数据获取函数
+ */
+const loadEnableDropdownList = (): Promise<ListData<DictData>> => {
+  return Promise.resolve({
+    dataList: StaticDict.Enable.getList(),
+  });
+};
+// 是否启用配置参数
+const enableOptions: DropdownOptions<DictData> = {
+  loadData: loadEnableDropdownList,
+  isTree: false,
+};
+// 是否启用下拉组件
+const enableWidget = useDropdown(enableOptions);
+const { dropdownList: enableWidgetDropdownList } = enableWidget
+const onUploadError = () => {
+  ElMessage.error('文件上传失败');
+};
+const onUploadLimit = () => {
+  ElMessage.error('已经超出最大上传个数限制');
+};
+const refreshEditTourTravelNotesTopic = () => {
+  // 刷新段落
+};
+/**
+ * 重置过滤值
+ */
+const resetEditTourTravelNotesTopic = () => {
+  refreshEditTourTravelNotesTopic();
+};
+/**
+ * 重置所有过滤值
+ */
+const resetFilter = () => {
+  resetEditTourTravelNotesTopic();
+};
+/**
+ * 保存
+ */
+const onUpdateClick = () => {
+  editTourTravelNotesTopicRef.value.validate((valid) => {
+    if (!valid) return;
+    // 级联操作
+    if (!props.saveOnSubmit) {
+      let retFormData = {
+        ...formData.TourTravelNotesTopic
+      };
+    retFormData.enableDictMap = findItemFromList(enableWidgetDropdownList.value, retFormData.enable, 'id');
+  props.dialog?.submit(retFormData);
+      return;
+    }
+    let params: ANY_OBJECT = {
+      tourTravelNotesTopicDto: {
+        id: formData.TourTravelNotesTopic.id,
+        hotValue: formData.TourTravelNotesTopic.hotValue,
+        name: formData.TourTravelNotesTopic.name,
+        enable: formData.TourTravelNotesTopic.enable,
+        createUserId: formData.TourTravelNotesTopic.createUserId,
+        createTime: formData.TourTravelNotesTopic.createTime,
+        updateUserId: formData.TourTravelNotesTopic.updateUserId,
+        updateTime: formData.TourTravelNotesTopic.updateTime,
+      }
+    };
+
+    let httpCall = isEdit.value ? TourTravelNotesTopicController.update : TourTravelNotesTopicController.add;
+    httpCall(params).then(res => {
+      ElMessage.success('保存成功');
+      props.dialog?.submit();
+    }).catch(e => {
+      // TODO: 异常处理
+      console.error(e);
+    });
+  });
+};
+const formInit = () => {
+  loadTourTravelNotesTopicData().then(res => {
+    enableWidget.onVisibleChange(true).catch(e => {console.error(e)});
+    if (isEdit.value) refreshEditTourTravelNotesTopic();
+  }).catch(e => {
+    // TODO: 异常处理
+    console.error(e);
+  });
+};
+
+onMounted(() => {
+  formInit();
+});
+</script>

+ 369 - 0
src/pages/tourTravelNotesTopic/formTourTravelNotesTopic.vue

@@ -0,0 +1,369 @@
+<template>
+  <div class="page-box" style="position: relative;">
+    <el-form
+      ref="formTourTravelNotesTopicRef"
+      :size="layoutStore.defaultFormItemSize"
+      label-width="120px"
+      label-position="right"
+      @submit.prevent
+    >
+      <filter-box :item-width="350" @search="refreshFormTourTravelNotesTopic()" @reset="resetFormTourTravelNotesTopic">
+        <el-form-item label="话题名称">
+          <el-input
+            class="filter-item"
+            v-model="formFilter.nameFilter"
+            type="text"
+            placeholder=""
+            :clearable="true"
+            :show-word-limit="false"
+            maxlength=""
+          />
+        </el-form-item>
+        <el-form-item label="是否启用">
+          <el-select
+            class="filter-item"
+            v-model="formFilter.enableFilter"
+            placeholder=""
+            :clearable="true"
+            :filterable="true"
+            @visible-change="enableFilterWidget.onVisibleChange"
+          >
+            <el-option
+              v-for="item in enableFilterWidgetDropdownList"
+              :key="item.id"
+              :label="item.name"
+              :value="item.id"
+            />
+          </el-select>
+        </el-form-item>
+        <el-form-item label="热度值">
+          <input-number-range
+            class="filter-item"
+            v-model="formFilter.hotValueFilter"
+            startPlaceholder=""
+            endPlaceholder=""
+            :step="1"
+          />
+        </el-form-item>
+      </filter-box>
+    </el-form>
+    <table-box
+      ref="tourTravelNotesTopic"
+      class="page-table"
+      :data="tourTravelNotesTopicWidgetDataList"
+      :size="layoutStore.defaultFormItemSize"
+      :row-config="{isCurrent: false, isHover: true}"
+      :seq-config="{startIndex: ((tourTravelNotesTopicWidgetCurrentPage - 1) * tourTravelNotesTopicWidgetPageSize)}"
+      :sort-config="{remote: true}"
+      :hasExtend="true"
+      @sort-change="tourTravelNotesTopicWidget.onSortChange"
+      @refresh="tourTravelNotesTopicWidget.refreshTable()"
+    >
+      <template #operator>
+        <el-button
+          type="primary"
+          :size="layoutStore.defaultFormItemSize"
+          :disabled="!checkPermCodeExist('formTourTravelNotesTopic:formTourTravelNotesTopic:add')"
+          @click="onAddClick()"
+          >
+          新增
+        </el-button>
+      </template>
+      <vxe-column title="序号" type="seq" :index="tourTravelNotesTopicWidget.getTableIndex" :width="80" />
+      <vxe-column title="话题名称" field="name" />
+      <vxe-column title="是否启用" field="enableDictMap.name" />
+      <vxe-column title="热度值" field="hotValue" />
+      <vxe-column title="操作" fixed="right">
+        <template v-slot="scope">
+          <el-button
+            link
+            type="primary"
+            :size="layoutStore.defaultFormItemSize"
+            @click.stop="onEditClick(scope.row)"
+            :disabled="!checkPermCodeExist('formTourTravelNotesTopic:formTourTravelNotesTopic:edit')"
+          >
+            编辑
+          </el-button>
+          <el-button
+            link
+            type="primary"
+            :size="layoutStore.defaultFormItemSize"
+            @click.stop="onDeleteClick(scope.row)"
+            :disabled="!checkPermCodeExist('formTourTravelNotesTopic:formTourTravelNotesTopic:delete')"
+          >
+            删除
+          </el-button>
+        </template>
+      </vxe-column>
+      <template slot="empty">
+        <div class="table-empty unified-font">
+          <img src="@/assets/img/empty.png">
+          <span>暂无数据</span>
+        </div>
+      </template>
+      <!-- 分页 -->
+      <template #pagination>
+        <el-row type="flex" justify="end" style="margin-top: 10px;">
+          <el-pagination
+            :total="tourTravelNotesTopicWidgetTotalCount"
+            :current-page="tourTravelNotesTopicWidgetCurrentPage"
+            :page-size="tourTravelNotesTopicWidgetPageSize"
+            :page-sizes="[10, 20, 50, 100]"
+            layout="total, prev, pager, next, sizes"
+            @current-change="tourTravelNotesTopicWidget.onCurrentPageChange"
+            @size-change="tourTravelNotesTopicWidget.onPageSizeChange">
+          </el-pagination>
+        </el-row>
+      </template>
+    </table-box>
+    <label v-if="subPage" class="page-close-box" @click="onCancel()">
+      <img src="@/assets/img/back2.png" alt="">
+    </label>
+  </div>
+</template>
+
+<script lang="ts">
+export default {
+  name: 'formTourTravelNotesTopic',
+};
+</script>
+
+<script setup lang="ts">
+import * as validateRules from '@/common/utils/validate';
+import { VxeColumn, VxeTable } from 'vxe-table';
+import { ANY_OBJECT } from '@/types/generic';
+import { DictData, DictionaryBase } from '@/common/staticDict/types';
+import { ElMessage, ElMessageBox, UploadFile } from 'element-plus';
+import { useRoute, useRouter } from 'vue-router';
+import { useCommon } from '@/common/hooks/useCommon';
+import { useLayoutStore, useStaticDictStore } from '@/store';
+import { useDownload } from '@/common/hooks/useDownload';
+import { useDropdown } from '@/common/hooks/useDropdown';
+import { DropdownOptions, ListData } from '@/common/types/list';
+import { useTable } from '@/common/hooks/useTable';
+import { TableOptions } from '@/common/types/pagination';
+import { useUpload } from '@/common/hooks/useUpload';
+import { useUploadWidget } from '@/common/hooks/useUploadWidget';
+import { DictionaryController } from '@/api/system';
+import { treeDataTranslate, findItemFromList, findTreeNodePath, findTreeNode, stringCase } from '@/common/utils';
+import { TourTravelNotesTopicData } from '@/api/generated/tourTravelNotesTopicController';
+import { TourTravelNotesTopicController } from '@/api/generated';
+import EditTourTravelNotesTopic from '@/pages/tourTravelNotesTopic/editTourTravelNotesTopic.vue';
+
+const router = useRouter();
+const route = useRoute();
+const layoutStore = useLayoutStore();
+const { downloadFile } = useDownload();
+const { getUploadHeaders, getUploadActionUrl, fileListToJson, parseUploadData, getPictureList } = useUpload();
+const { 
+  Delete,
+  Search,
+  Edit,
+  Plus,
+  Refresh,
+  Picture,
+  Dialog,
+  mainContextHeight,
+  clientHeight,
+  checkPermCodeExist,
+  parseParams,
+  parseArrayParams,
+  formatDateByStatsType,
+  getDateRangeFilter,
+} = useCommon();
+// 静态字典
+const { staticDict: StaticDict } = useStaticDictStore();
+
+const props = withDefaults(
+  defineProps<{
+    subPage?: number | string | boolean;
+  }>(),
+  {
+    subPage: 0,
+  },
+);
+
+const formFilter = reactive({
+  // 话题名称
+  nameFilter: undefined,
+  // 是否启用
+  enableFilter: undefined,
+  // 热度值
+  hotValueFilter: [],
+});
+const formFilterCopy = reactive({
+  // 话题名称
+  nameFilter: undefined,
+  // 是否启用
+  enableFilter: undefined,
+  // 热度值
+  hotValueFilter: [],
+});
+
+const onCancel = () => {
+  router.go(-1);
+  layoutStore.removeCachePage(route.fullPath as string);
+  route.meta.refreshParentCachedPage = true;
+};
+
+const onResume = () => {
+  refreshFormTourTravelNotesTopic();
+};
+
+/**
+ * 表格组件数据获取函数,返回Promise
+ */
+const loadTourTravelNotesTopicWidgetData = (params: ANY_OBJECT) => {
+  if (params == null) params = {};
+  params = {
+    ...params,
+    tourTravelNotesTopicDtoFilter: {
+      name: formFilter.nameFilter,
+      enable: formFilter.enableFilter,
+      hotValueStart: Array.isArray(formFilter.hotValueFilter) ? formFilter.hotValueFilter[0] : formFilter.hotValueFilter,
+      hotValueEnd: Array.isArray(formFilter.hotValueFilter) ? formFilter.hotValueFilter[1] : formFilter.hotValueFilter,
+    }
+  };
+  return new Promise((resolve, reject) => {
+    TourTravelNotesTopicController.list(params).then(res => {
+      resolve({
+        dataList: res.data.dataList,
+        totalCount: res.data.totalCount
+      });
+    }).catch(e => {
+      reject(e);
+    });
+  });
+};
+/**
+ * 表格组件数据获取检测函数,返回true正常获取数据,返回false停止获取数据
+ */
+const loadTourTravelNotesTopicVerify = () => {
+  formFilterCopy.nameFilter = formFilter.nameFilter;
+  formFilterCopy.enableFilter = formFilter.enableFilter;
+  formFilterCopy.hotValueFilter = formFilter.hotValueFilter;
+  return true;
+};
+/**
+ * 新增
+ */
+const onAddClick = (row?: TourTravelNotesTopicData) => {
+  let params: ANY_OBJECT = {
+  };
+
+  Dialog
+    .show('新增', EditTourTravelNotesTopic, { area: ['900px', '700px'] }, { ...params, subPage: true })
+    .then(res => {
+      tourTravelNotesTopicWidget.refreshTable();
+    }).catch(e => {
+      // TODO: 异常处理
+      console.error(e);
+    });
+};
+/**
+ * 编辑
+ */
+const onEditClick = (row?: TourTravelNotesTopicData) => {
+  let params: ANY_OBJECT = {
+    id: row?.id,
+  };
+
+  Dialog
+    .show('编辑', EditTourTravelNotesTopic, { area: ['900px', '700px'] }, { ...params, subPage: true })
+    .then(res => {
+      tourTravelNotesTopicWidget.refreshTable();
+    }).catch(e => {
+      // TODO: 异常处理
+      console.error(e);
+    });
+};
+/**
+ * 删除
+ */
+const onDeleteClick = (row?: TourTravelNotesTopicData) => {
+  let params: ANY_OBJECT = {
+    id: row?.id,
+  };
+
+  ElMessageBox.confirm('是否删除该条数据?').then(res => {
+    TourTravelNotesTopicController.delete(params).then(res => {
+      ElMessage.success('删除成功');
+      tourTravelNotesTopicWidget.refreshTable(false, 1);
+    }).catch(e => {
+      // TODO: 异常处理
+      console.error(e);
+    });
+  }).catch(e => {
+    // TODO: 异常处理
+    console.error(e);
+  });
+};
+// 表格组件表格组件参数
+const tourTravelNotesTopicOptions: TableOptions<TourTravelNotesTopicData> = {
+  loadTableData: loadTourTravelNotesTopicWidgetData,
+  verifyTableParameter: loadTourTravelNotesTopicVerify,
+  paged: true,
+  rowSelection: false,
+  orderFieldName: undefined,
+  ascending: true,
+};
+// 表格组件表格组件
+const tourTravelNotesTopic = ref();
+const tourTravelNotesTopicWidget = useTable(tourTravelNotesTopicOptions);
+const {
+  dataList: tourTravelNotesTopicWidgetDataList,
+  currentPage: tourTravelNotesTopicWidgetCurrentPage,
+  pageSize: tourTravelNotesTopicWidgetPageSize,
+  totalCount: tourTravelNotesTopicWidgetTotalCount,
+} = tourTravelNotesTopicWidget;
+/**
+ * 是否启用下拉数据获取函数
+ */
+const loadEnableFilterDropdownList = (): Promise<ListData<DictData>> => {
+  return Promise.resolve({
+    dataList: StaticDict.Enable.getList(),
+  });
+};
+// 是否启用配置参数
+const enableFilterOptions: DropdownOptions<DictData> = {
+  loadData: loadEnableFilterDropdownList,
+  isTree: false,
+};
+// 是否启用下拉组件
+const enableFilterWidget = useDropdown(enableFilterOptions);
+const { dropdownList: enableFilterWidgetDropdownList } = enableFilterWidget
+const refreshFormTourTravelNotesTopic = () => {
+  // 刷新段落
+  tourTravelNotesTopicWidget.refreshTable();
+};
+/**
+ * 重置过滤值
+ */
+const resetFormTourTravelNotesTopic = () => {
+  formFilter.nameFilter = undefined;
+  formFilterCopy.nameFilter = undefined;
+  formFilter.enableFilter = undefined;
+  formFilterCopy.enableFilter = undefined;
+  formFilter.hotValueFilter = undefined;
+  formFilterCopy.hotValueFilter = undefined;
+  refreshFormTourTravelNotesTopic();
+};
+/**
+ * 重置所有过滤值
+ */
+const resetFilter = () => {
+  resetFormTourTravelNotesTopic();
+};
+const formInit = () => {
+  enableFilterWidget.onVisibleChange(true).catch(e => {console.error(e)});
+  refreshFormTourTravelNotesTopic();
+};
+
+onMounted(() => {
+  formInit();
+});
+
+onActivated(() => {
+  onResume();
+});
+</script>

+ 2 - 0
src/pages/tourismTravelNotesWrite/formTourismTravelNotesWrite.vue

@@ -171,6 +171,7 @@
       <vxe-column title="人均费用" field="averageCost" />
       <vxe-column title="出行方式" field="travelModeDictMap.name" />
       <vxe-column title="审核状态" field="stateDictMap.name" />
+      <vxe-column title="是否原创" field="isOriginalDictMap.name" />
       <vxe-column title="创建时间" field="createTime">
         <template v-slot="scope">
           <span>{{ formatDateByStatsType(scope.row.createTime, 'day') }}</span>
@@ -182,6 +183,7 @@
         </template>
       </vxe-column>
       <vxe-column title="目的地" field="endPlaceDictMap.name" />
+      <vxe-column title="提及的话题" field="tourTravelNotesTopicRelationName" />
       <vxe-column title="操作" fixed="right">
         <template v-slot="scope">
           <el-button

+ 59 - 28
src/pages/tourismTravelNotesWrite/viewTravelNotesInfo.vue

@@ -11,6 +11,19 @@
         @submit.prevent
       >
         <el-row :gutter="16">
+          <el-col :span="12">
+            <el-form-item label="图片展示" prop="TourismProjectTravelNotesWrite.imgUrls">
+              <div class="image-gallery">
+                <el-image
+                  v-for="(image, index) in formData.TourismProjectTravelNotesWrite.imgUrls"
+                  :key="index"
+                  :src="image"
+                  class="image-item"
+                  width="10%"
+                />
+              </div>
+            </el-form-item>
+          </el-col>
           <el-col :span="24">
             <el-form-item label="项目标题" prop="TourismProjectTravelNotesWrite.projectTitle">
               <el-input
@@ -182,7 +195,7 @@
               </el-upload> -->
             </el-form-item>
           </el-col>
-          <el-col :span="24">
+          <!-- <el-col :span="24">
             <el-form-item
               label="发布游记的banner图"
               prop="TourismProjectTravelNotesWrite.travelNotesBanner"
@@ -196,7 +209,7 @@
                 />
               </div>
 
-              <!-- <el-upload
+              <el-upload
                 class="upload-image-item"
                 name="uploadFile"
                 :headers="getUploadHeaders"
@@ -221,10 +234,10 @@
                   />
                 </div>
                 <i v-else class="el-icon-plus upload-image-item"></i>
-              </el-upload> -->
+              </el-upload>
             </el-form-item>
-          </el-col>
-          <el-col :span="24">
+          </el-col> -->
+          <!-- <el-col :span="24">
             <el-form-item label="项目简述" prop="TourismProjectTravelNotesWrite.remarks">
               <el-input
                 class="input-item"
@@ -238,7 +251,7 @@
                 :readonly="true"
               />
             </el-form-item>
-          </el-col>
+          </el-col> -->
           <el-form-item label="详细内容">
             <div>
               <template v-for="item in formData.TourismProjectTravelNotesWrite.travelNotesContent">
@@ -319,7 +332,22 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="24">
+          <el-col :span="12">
+            <el-form-item label="提及的话题" prop="TourismProjectTravelNotesWrite.tourTravelNotesTopicRelationName">
+              <el-input
+                class="input-item"
+                v-model="formData.TourismProjectTravelNotesWrite.tourTravelNotesTopicRelationName"
+                type="textarea"
+                placeholder=""
+                :clearable="true"
+                :show-word-limit="false"
+                maxlength=""
+                :disabled="true"
+                :readonly="true"
+              />
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
             <el-form-item label="审核状态" prop="TourismProjectTravelNotesWrite.state">
               <el-select
                 class="input-item"
@@ -352,6 +380,25 @@
             </el-form-item>
           </el-col>
           <el-col :span="12" v-show="formData.TourismProjectTravelNotesWrite.state == 3">
+            <el-form-item label="是否原创" prop="TourismProjectTravelNotesWrite.isOriginal">
+              <el-select
+                class="input-item"
+                v-model="formData.TourismProjectTravelNotesWrite.isOriginal"
+                placeholder=""
+                :clearable="true"
+                :filterable="true"
+                @visible-change="isOriginalWidget.onVisibleChange"
+              >
+                <el-option
+                  v-for="item in isOriginalWidgetDropdownList"
+                  :key="item.id"
+                  :label="item.name"
+                  :value="item.id"
+                />
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12" v-show="formData.TourismProjectTravelNotesWrite.state == 3">
             <el-form-item label="标签" prop="TourismProjectTravelNotesWrite.noteLabel">
               <el-input
                 class="input-item"
@@ -422,25 +469,6 @@
               />
             </el-form-item>
           </el-col>
-          <el-col :span="12" v-show="formData.TourismProjectTravelNotesWrite.state == 3">
-            <el-form-item label="是否原创" prop="TourismProjectTravelNotesWrite.isOriginal">
-              <el-select
-                class="input-item"
-                v-model="formData.TourismProjectTravelNotesWrite.isOriginal"
-                placeholder=""
-                :clearable="true"
-                :filterable="true"
-                @visible-change="isOriginalWidget.onVisibleChange"
-              >
-                <el-option
-                  v-for="item in isOriginalWidgetDropdownList"
-                  :key="item.id"
-                  :label="item.name"
-                  :value="item.id"
-                />
-              </el-select>
-            </el-form-item>
-          </el-col>
         </el-row>
       </el-form>
     </el-scrollbar>
@@ -595,6 +623,8 @@ const formData = reactive<ViewTravelNotesInfoData>({
     autoAuditStatus: undefined,
     // 自动审核未通过原因
     autoRejectReason: undefined,
+    // 提及的话题
+    tourTravelNotesTopicRelationName: undefined,
     // 出行方式
     travelMode: undefined,
     // 目的地
@@ -603,8 +633,8 @@ const formData = reactive<ViewTravelNotesInfoData>({
     tourismTravelNotesContentWriteList: [],
     // 游玩人数
     travelNumber: undefined,
-    // 出行方式
-    travelMode: undefined,
+    //游记中的图片
+    imgUrls: undefined
   },
 });
 // 表单验证规则
@@ -997,6 +1027,7 @@ const onSaveClick = () => {
         updateUserId: formData.TourismProjectTravelNotesWrite.updateUserId,
         updateTime: formData.TourismProjectTravelNotesWrite.updateTime,
         tourismTavelNotesUrl: formData.TourismProjectTravelNotesWrite.tourismTavelNotesUrl,
+        tourTravelNotesTopicRelationName: formData.TourismProjectTravelNotesWrite.tourTravelNotesTopicRelationName,
       },
     };
 

+ 7 - 0
src/router/systemRouters.ts

@@ -712,6 +712,13 @@ export const routers: Array<RouteRecordRaw> = [
         props: getProps,
         meta: {title: '聊天群聊消息管理', keepalive: true}
       },
+      {
+        path: 'formTourTravelNotesTopic',
+        component: () => import('@/pages/tourTravelNotesTopic/formTourTravelNotesTopic.vue'),
+        name: 'formTourTravelNotesTopic',
+        props: getProps,
+        meta: {title: '游记话题信息', keepalive: true}
+      },
     ],
   },
   // TODO 第三方接入路由

+ 25 - 0
src/types/table/tourTravelNotesTopic.d.ts

@@ -0,0 +1,25 @@
+import { DictData } from '@/common/staticDict/types';
+
+interface TourTravelNotesTopic {
+  // 主键id
+  id?: number | undefined;
+  // 话题名称
+  name?: string | undefined;
+  // 是否启用,0否,1是
+  enable?: number | undefined;
+  enableDictMap?: DictData,
+  // 创建用户
+  createUserId?: number | undefined;
+  // 创建时间
+  createTime?: string | undefined;
+  // 更新用户
+  updateUserId?: number | undefined;
+  // 更新时间
+  updateTime?: string | undefined;
+  // 删除标记(1: 正常 -1: 已删除)
+  dataState?: number | undefined;
+  // 热度值
+  hotValue?: number | undefined;
+}
+
+export default TourTravelNotesTopic;

+ 4 - 0
src/types/table/tourismProjectTravelNotesWrite.d.ts

@@ -73,6 +73,10 @@ interface TourismProjectTravelNotesWrite {
   travelNotesContent?: Array;
   // 游玩人数
   travelNumber?: string | undefined;
+  // 提及的话题
+  tourTravelNotesTopicRelationName?: string | undefined;
+  //游记中的图片
+  imgUrls?: Array;
 }
 
 export default TourismProjectTravelNotesWrite;