Knowledge.vue 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182
  1. <template>
  2. <div class="knowledge-container">
  3. <el-tabs v-model="state.queryParams.Attribution" @tab-change="knowledgeRetrievalPaged">
  4. <el-tab-pane label="中心知识库" name="中心知识库"> </el-tab-pane>
  5. <el-tab-pane label="部门知识库" name="部门知识库"> </el-tab-pane>
  6. </el-tabs>
  7. <el-autocomplete
  8. v-model="state.queryParams.Keyword"
  9. :fetch-suggestions="querySearchAsync"
  10. placeholder="关键词"
  11. @select="handleSelect"
  12. class="mr10 w100 knowledge-input"
  13. clearable
  14. value-key="title"
  15. >
  16. <template #prefix>
  17. <SvgIcon name="ele-Search" size="16px" />
  18. </template>
  19. <template #suffix>
  20. <el-button class="knowledge-search-button" type="primary" :loading="state.loading" round @click="knowledgeRetrievalPaged">
  21. <SvgIcon name="ele-Search" size="16px" color="#fff" />
  22. </el-button>
  23. </template>
  24. </el-autocomplete>
  25. <div class="mt10 retrieval-content" v-loading="state.loading">
  26. <el-empty description="暂无数据" v-if="!state.knowledgeList.length" class="mb20">
  27. <template #image>
  28. <span></span>
  29. </template>
  30. </el-empty>
  31. <el-scrollbar>
  32. <div v-for="(v, i) in state.knowledgeList" :key="i" class="retrieval-content-item" @click="onPreview(v)">
  33. <h4 class="mb10 text-no-wrap">{{ v.title }}</h4>
  34. <div class="text-ellipsis2">{{ v.summary }}</div>
  35. <div class="flex-center-between mt10 color-info">
  36. <div>
  37. <span class="mr10">创建部门:{{ v.creatorOrgName }}</span>
  38. <span>创建时间:{{ formatDate(v.creationTime, 'YYYY-mm-dd HH:MM:SS') }}</span>
  39. </div>
  40. <div class="flex-center-align">
  41. <span class="flex-center-align"><SvgIcon name="ele-StarFilled" size="18px" class="mr3" />{{ v.score }}</span>
  42. <!-- <span class="flex-center-align ml10"><SvgIcon name="ele-ChatDotSquare" size="16px" class="mr3" />{{ v.commentNum }}</span>-->
  43. <span class="flex-center-align ml10"><SvgIcon name="ele-View" size="16px" class="mr3" />{{ v.pageView }}</span>
  44. </div>
  45. </div>
  46. </div>
  47. </el-scrollbar>
  48. </div>
  49. </div>
  50. <!-- 分页 -->
  51. <pagination
  52. :total="state.knowledgeTotal"
  53. v-model:page="state.queryParams.PageIndex"
  54. v-model:limit="state.queryParams.PageSize"
  55. @pagination="knowledgeRetrievalPaged"
  56. :pageSizes="[5, 10, 15, 20]"
  57. layout="total, prev, pager, next"
  58. class="pt10"
  59. />
  60. </template>
  61. <script setup lang="ts" name="orderAcceptKnowledge">
  62. // 定义变量内容
  63. import { onMounted, reactive, ref } from 'vue';
  64. import { useRoute, useRouter } from 'vue-router';
  65. import { formatDate } from '/@/utils/formatTime';
  66. import { knowledgeRetrieval } from '/@/api/knowledge/retrieval';
  67. import { ElMessage } from 'element-plus';
  68. const props = defineProps({
  69. type: {
  70. // 知识库类型 (中心|部门)
  71. type: String,
  72. default: '',
  73. },
  74. formData: {
  75. // 表单填写的数据
  76. type: Object,
  77. default: () => {
  78. return {};
  79. },
  80. },
  81. });
  82. const state = reactive<any>({
  83. loading: false, // 知识检索加载状态
  84. knowledgeList: [],
  85. knowledgeTotal: 0,
  86. queryParams: {
  87. PageIndex: 1,
  88. PageSize: 5,
  89. Keyword: null,
  90. Attribution: '中心知识库',
  91. },
  92. });
  93. // 知识检索
  94. const knowledgeRetrievalPaged = async () => {
  95. // state.queryParams.Keyword = props.formData.hotSpotName ?? '';
  96. try {
  97. state.loading = true;
  98. const res: any = await knowledgeRetrieval(state.queryParams);
  99. state.knowledgeList = res.result?.items ?? [];
  100. state.knowledgeTotal = res.result?.total ?? 0;
  101. state.loading = false;
  102. } catch (error) {
  103. state.loading = false;
  104. }
  105. };
  106. const querySearchAsync = (queryString: string | null, cb: (arg: any) => void) => {
  107. if (queryString) {
  108. state.loading = true;
  109. knowledgeRetrieval({
  110. ...state.queryParams,
  111. Keyword: queryString,
  112. })
  113. .then((res: any) => {
  114. state.loading = false;
  115. cb(res.result?.items ?? []);
  116. })
  117. .catch(() => {
  118. state.loading = false;
  119. cb([]);
  120. });
  121. } else {
  122. cb([]);
  123. }
  124. };
  125. const handleSelect = (item: Record<string, any>) => {
  126. state.queryParams.Keyword = item.title;
  127. knowledgeRetrievalPaged();
  128. };
  129. const router = useRouter(); // 路由
  130. const route = useRoute(); // 路由
  131. // 预览知识
  132. const onPreview = (row: any) => {
  133. if (!router.hasRoute('knowledgePreview')) {
  134. ElMessage.warning('未找到知识查看页面');
  135. return;
  136. }
  137. router.push({
  138. name: 'knowledgePreview',
  139. params: {
  140. id: row.id,
  141. tagsViewName: '知识查看',
  142. },
  143. });
  144. };
  145. onMounted(() => {
  146. knowledgeRetrievalPaged();
  147. });
  148. defineExpose({
  149. knowledgeRetrievalPaged,
  150. });
  151. </script>
  152. <style scoped lang="scss">
  153. .knowledge-container {
  154. position: relative;
  155. :deep(.el-input__wrapper) {
  156. border-radius: 20px;
  157. background: var(--hotline-bg-main-color);
  158. }
  159. .knowledge-search-button {
  160. height: calc(100% - 6px);
  161. }
  162. .retrieval-content {
  163. &-item {
  164. border-bottom: var(--el-border);
  165. padding: 5px 15px;
  166. margin-bottom: 10px;
  167. cursor: pointer;
  168. &:last-child {
  169. margin-bottom: 0;
  170. border: none;
  171. }
  172. &:hover {
  173. color: var(--el-color-primary);
  174. }
  175. }
  176. }
  177. }
  178. </style>