index.vue 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147
  1. <template>
  2. <div class="knowledge-retrieval-container layout-pd">
  3. <el-card shadow="never">
  4. <div class="input-box">
  5. <el-input v-model="state.queryParams.Keyword" placeholder="关键词" class="input-with-select" @input="queryList" clearable>
  6. <template #prepend>
  7. <el-select v-model="state.queryParams.RetrievalType" size="large" placeholder="请选择" style="width: 100px">
  8. <el-option v-for="item in state.typeList" :key="item.value" :label="item.label" :value="item.value" class="w1" />
  9. </el-select>
  10. </template>
  11. <template #append>
  12. <el-button type="primary" size="large" class="btn" :loading="state.loading" @click="queryList" v-auth="'knowledge:process:query'"
  13. >搜索</el-button
  14. >
  15. </template>
  16. </el-input>
  17. </div>
  18. <el-divider />
  19. <div v-loading="state.loading">
  20. <template v-if="state.retrievalList.length && state.queryParams.Keyword">
  21. <div v-for="(v, i) in state.retrievalList" :key="i" class="retrieval-content-item" @click="onPreview(v)" title="查看详情">
  22. <h4 class="mb10">{{ v.title }}</h4>
  23. <div class="text-ellipsis2" v-html="queryTitleLight(v.content)"></div>
  24. </div>
  25. </template>
  26. <template v-else>
  27. <Empty type="search" description="暂无结果" />
  28. </template>
  29. </div>
  30. <!-- 分页 -->
  31. <pagination
  32. :total="state.total"
  33. v-model:page="state.queryParams.PageIndex"
  34. v-model:limit="state.queryParams.PageSize"
  35. @pagination="queryList"
  36. />
  37. </el-card>
  38. </div>
  39. </template>
  40. <script setup lang="ts" name="knowledgeRetrieval">
  41. import {reactive} from 'vue';
  42. import {useRouter} from 'vue-router';
  43. import {ElMessage} from 'element-plus';
  44. import {auth} from '/@/utils/authFunction';
  45. import {knowledgeRetrieval} from '/@/api/knowledge/retrieval';
  46. const state = reactive<any>({
  47. queryParams: {
  48. // 查询条件
  49. PageIndex: 1,
  50. PageSize: 10,
  51. Keyword: '',
  52. RetrievalType: 0,
  53. },
  54. total: 0,
  55. loading: false,
  56. typeList: [
  57. {
  58. label: '全文',
  59. value: 0,
  60. },
  61. {
  62. label: '标题',
  63. value: 1,
  64. },
  65. {
  66. label: '正文',
  67. value: 2,
  68. },
  69. ],
  70. retrievalList: [],
  71. });
  72. const router = useRouter();
  73. // 预览
  74. const onPreview = (row: any) => {
  75. router.push({
  76. name: 'knowledgePreview',
  77. params: {
  78. id: row.id,
  79. isAddPv: 'isAddPv',
  80. tagsViewName: '知识预览',
  81. },
  82. });
  83. };
  84. const queryTitleLight = (titleInfo: string) => {
  85. return titleInfo.replace(
  86. new RegExp(state.queryParams.Keyword, 'g'),
  87. `<span style="color:var(--el-color-danger)">${state.queryParams.Keyword}</span>`
  88. );
  89. };
  90. const queryList = () => {
  91. if (!auth('knowledge:process:query')) ElMessage.error('抱歉,您没有权限知识检索');
  92. else {
  93. if(!state.queryParams.Keyword) {
  94. state.retrievalList = [];
  95. state.total = 0;
  96. return;
  97. }
  98. state.loading = true;
  99. state.retrievalList = [];
  100. state.total = 0;
  101. knowledgeRetrieval(state.queryParams)
  102. .then((res: any) => {
  103. state.retrievalList = res.result?.items ?? [];
  104. state.total = res.result?.total ?? 0;
  105. state.loading = false;
  106. })
  107. .catch(() => {
  108. state.loading = false;
  109. state.retrievalList = [];
  110. state.total = 0;
  111. });
  112. }
  113. }
  114. </script>
  115. <style scoped lang="scss">
  116. .knowledge-retrieval-container {
  117. .input-box {
  118. width: 80%;
  119. margin: 10px auto;
  120. .input-with-select {
  121. :deep(.el-input-group__prepend) {
  122. background-color: var(--el-fill-color-blank);
  123. }
  124. }
  125. }
  126. .retrieval-content {
  127. &-item {
  128. border: var(--el-border);
  129. border-radius: var(--el-border-radius-base);
  130. padding: 20px;
  131. margin-bottom: 20px;
  132. cursor: pointer;
  133. &:last-child {
  134. margin-bottom: 0;
  135. }
  136. &:hover {
  137. box-shadow: 0 0 0 1px var(--el-color-primary) inset;
  138. }
  139. }
  140. }
  141. }
  142. </style>