index.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403
  1. <template>
  2. <div class="page-container">
  3. <el-form :model="queryParams" ref="queryForm" size="small" :inline="true" v-show="showSearch" label-width="68px" class="search-form_container">
  4. <el-form-item label="助手标题" prop="title">
  5. <el-input
  6. v-model="queryParams.title"
  7. placeholder="请输入标题"
  8. clearable
  9. @keyup.enter.native="handleQuery"
  10. />
  11. </el-form-item>
  12. <!-- <el-form-item label="类型" prop="category">
  13. <el-input
  14. v-model="queryParams.category"
  15. placeholder="请输入分类"
  16. clearable
  17. @keyup.enter.native="handleQuery"
  18. />
  19. </el-form-item> -->
  20. <el-form-item>
  21. <el-button type="primary" icon="search" size="small" @click="handleQuery">搜索</el-button>
  22. <el-button icon="refresh" size="small" @click="resetQuery">重置</el-button>
  23. </el-form-item>
  24. </el-form>
  25. <el-card shadow="never" body-class="card-table_container">
  26. <el-row :gutter="10" class="mb8">
  27. <el-col :span="1.5">
  28. <el-button
  29. type="primary"
  30. plain
  31. icon="plus"
  32. size="small"
  33. @click="handleAdd"
  34. >新增</el-button>
  35. </el-col>
  36. <el-col :span="1.5">
  37. <el-button
  38. type="success"
  39. plain
  40. icon="edit"
  41. size="small"
  42. :disabled="single"
  43. @click="handleUpdate"
  44. >修改</el-button>
  45. </el-col>
  46. <el-col :span="1.5">
  47. <el-button
  48. type="danger"
  49. plain
  50. icon="delete"
  51. size="small"
  52. :disabled="multiple"
  53. @click="handleDelete"
  54. >删除</el-button>
  55. </el-col>
  56. <el-col :span="1.5">
  57. <el-button
  58. type="warning"
  59. plain
  60. icon="download"
  61. size="small"
  62. @click="handleExport"
  63. >导出</el-button>
  64. </el-col>
  65. <right-toolbar v-model:showSearch="showSearch" @queryTable="getList"></right-toolbar>
  66. </el-row>
  67. <el-table v-loading="loading" :data="assistantList" @selection-change="handleSelectionChange">
  68. <el-table-column type="selection" width="55" align="center" />
  69. <el-table-column label="icon" align="center" prop="id" width="60">
  70. <template #default="scope">
  71. <img :src="scope.row.banner" alt="" style="width: 20px; display: inline-block; text-align: center;">
  72. </template>
  73. </el-table-column>
  74. <el-table-column label="助手标题" align="center" prop="title" />
  75. <el-table-column label="展示提示词" align="center" prop="content" width="300">
  76. <template #default="scope">
  77. <el-popover effect="light" trigger="hover" placement="top" width="600">
  78. <template #default>
  79. <div>{{ scope.row.content }}</div>
  80. </template>
  81. <template #reference>
  82. <el-tag style="display: block;">
  83. <p class="singe-line">{{ scope.row.content }}</p>
  84. </el-tag>
  85. </template>
  86. </el-popover>
  87. </template>
  88. </el-table-column>
  89. <el-table-column label="模型提示词" align="center" prop="prompt" width="300">
  90. <template #default="scope">
  91. <el-popover effect="light" trigger="hover" placement="top" width="600">
  92. <template #default>
  93. <div>{{ scope.row.prompt }}</div>
  94. </template>
  95. <template #reference>
  96. <p class="singe-line">{{ scope.row.prompt }}</p>
  97. </template>
  98. </el-popover>
  99. </template>
  100. </el-table-column>
  101. <el-table-column label="工具值" align="center" prop="tools" />
  102. <el-table-column label="类型" align="center" prop="category" />
  103. <el-table-column label="添加时间" align="center" prop="createTime" width="160"/>
  104. <el-table-column label="权重值" align="center" prop="sort" />
  105. <el-table-column label="操作" align="center" class-name="small-padding fixed-width" width="160">
  106. <template #default="scope">
  107. <el-button
  108. size="small"
  109. icon="edit"
  110. type="primary"
  111. text
  112. @click="handleUpdate(scope.row)"
  113. >修改</el-button>
  114. <el-button
  115. size="small"
  116. icon="delete"
  117. type="primary"
  118. text
  119. @click="handleDelete(scope.row)"
  120. >删除</el-button>
  121. </template>
  122. </el-table-column>
  123. </el-table>
  124. <pagination
  125. v-show="total > 0"
  126. :total="total"
  127. v-model:page="queryParams.pageNum"
  128. v-model:limit="queryParams.pageSize"
  129. @pagination="getList"
  130. />
  131. </el-card>
  132. <!-- 添加或修改信义智能体助手配置对话框 -->
  133. <el-dialog :title="title" v-model="open" width="900px" append-to-body>
  134. <el-form ref="form" :model="form" :rules="rules" label-width="120px">
  135. <el-form-item label="类型" prop="category">
  136. <el-input v-model="form.category" placeholder="请输入类型" />
  137. </el-form-item>
  138. <el-form-item label="助手标题" prop="title">
  139. <el-input v-model="form.title" placeholder="请输入标题" />
  140. </el-form-item>
  141. <el-form-item label="展示提示词">
  142. <el-input
  143. v-model="form.content"
  144. :rows="4"
  145. resize="none"
  146. type="textarea"
  147. placeholder="请输入展示提示词"
  148. />
  149. </el-form-item>
  150. <el-form-item label="模型提示词">
  151. <el-input
  152. v-model="form.prompt"
  153. :rows="4"
  154. resize="none"
  155. type="textarea"
  156. placeholder="请输入展示提示词"
  157. />
  158. </el-form-item>
  159. <el-form-item label="工具">
  160. <el-input
  161. v-model="form.tools"
  162. :rows="4"
  163. resize="none"
  164. placeholder="请输入工具名称"
  165. />
  166. </el-form-item>
  167. <el-form-item label="icon地址" prop="banner">
  168. <el-upload
  169. class="avatar-uploader"
  170. accept="image/gif,image/jpeg,image/jpg,image/bmp,image/png"
  171. :headers="headers"
  172. :action="path"
  173. :show-file-list="false"
  174. :on-success="handleAvatarSuccess"
  175. :before-upload="beforeAvatarUpload"
  176. >
  177. <img v-if="form.banner" :src="form.banner" class="avatar" />
  178. <el-icon v-else class="avatar-uploader-icon"><Plus /></el-icon>
  179. </el-upload>
  180. <!-- <el-input v-model="form.banner" placeholder="请输入banner地址" /> -->
  181. </el-form-item>
  182. <el-form-item label="排序" prop="sort">
  183. <el-input v-model="form.sort" placeholder="请输入排序" />
  184. </el-form-item>
  185. </el-form>
  186. <div slot="footer" class="dialog-footer">
  187. <el-button type="primary" @click="submitForm">确 定</el-button>
  188. <el-button @click="cancel">取 消</el-button>
  189. </div>
  190. </el-dialog>
  191. </div>
  192. </template>
  193. <script>
  194. import { listAssistant, getAssistant, delAssistant, addAssistant, updateAssistant } from "@/api/business/assistant";
  195. import { getToken } from "@/utils/auth";
  196. export default {
  197. name: "Assistant",
  198. data() {
  199. return {
  200. path: import.meta.env.VITE_APP_BASE_API + 'qiniuyun/upLoadImage',
  201. imageUrl: '',
  202. headers: {
  203. Authorization: 'Bearer ' + getToken()
  204. },
  205. // 遮罩层
  206. loading: true,
  207. // 选中数组
  208. ids: [],
  209. // 非单个禁用
  210. single: true,
  211. // 非多个禁用
  212. multiple: true,
  213. // 显示搜索条件
  214. showSearch: true,
  215. // 总条数
  216. total: 0,
  217. // 信义智能体助手配置表格数据
  218. assistantList: [],
  219. // 弹出层标题
  220. title: "",
  221. // 是否显示弹出层
  222. open: false,
  223. // 查询参数
  224. queryParams: {
  225. pageNum: 1,
  226. pageSize: 10,
  227. category: null,
  228. title: null,
  229. content: null,
  230. banner: null,
  231. sort: null,
  232. revision: null,
  233. },
  234. // 表单参数
  235. form: {},
  236. // 表单校验
  237. rules: {
  238. }
  239. };
  240. },
  241. created() {
  242. this.getList();
  243. },
  244. methods: {
  245. handleAvatarSuccess(res) {
  246. this.imageUrl = res.data;
  247. this.form.banner = res.data;
  248. },
  249. beforeAvatarUpload (rawFile){
  250. if (rawFile.size / 1024 / 1024 > 2) {
  251. ElMessage.error('图片大小最大 2MB!')
  252. return false
  253. }
  254. return true
  255. },
  256. /** 查询信义智能体助手配置列表 */
  257. getList() {
  258. this.loading = true;
  259. listAssistant(this.queryParams).then(response => {
  260. this.assistantList = response.rows;
  261. this.total = response.total;
  262. this.loading = false;
  263. });
  264. },
  265. // 取消按钮
  266. cancel() {
  267. this.open = false;
  268. this.reset();
  269. },
  270. // 表单重置
  271. reset() {
  272. this.form = {
  273. id: null,
  274. category: null,
  275. title: null,
  276. content: null,
  277. banner: null,
  278. sort: null,
  279. delFlag: null,
  280. revision: null,
  281. createBy: null,
  282. createTime: null,
  283. updateBy: null,
  284. updateTime: null,
  285. remark: null
  286. };
  287. this.resetForm("form");
  288. },
  289. /** 搜索按钮操作 */
  290. handleQuery() {
  291. this.queryParams.pageNum = 1;
  292. this.getList();
  293. },
  294. /** 重置按钮操作 */
  295. resetQuery() {
  296. this.resetForm("queryForm");
  297. this.handleQuery();
  298. },
  299. // 多选框选中数据
  300. handleSelectionChange(selection) {
  301. this.ids = selection.map(item => item.id)
  302. this.single = selection.length!==1
  303. this.multiple = !selection.length
  304. },
  305. /** 新增按钮操作 */
  306. handleAdd() {
  307. this.reset();
  308. this.open = true;
  309. this.title = "添加智慧办公";
  310. },
  311. /** 修改按钮操作 */
  312. handleUpdate(row) {
  313. this.reset();
  314. const id = row.id || this.ids
  315. getAssistant(id).then(response => {
  316. this.form = response.data;
  317. this.open = true;
  318. this.title = "修改智慧办公";
  319. });
  320. },
  321. /** 提交按钮 */
  322. submitForm() {
  323. this.$refs["form"].validate(valid => {
  324. if (valid) {
  325. if (this.form.id != null) {
  326. updateAssistant(this.form).then(response => {
  327. this.$modal.msgSuccess("修改成功");
  328. this.open = false;
  329. this.getList();
  330. });
  331. } else {
  332. addAssistant(this.form).then(response => {
  333. this.$modal.msgSuccess("新增成功");
  334. this.open = false;
  335. this.getList();
  336. });
  337. }
  338. }
  339. });
  340. },
  341. /** 删除按钮操作 */
  342. handleDelete(row) {
  343. const ids = row.id || this.ids;
  344. this.$modal.confirm('是否确认删除该数据项?').then(function() {
  345. return delAssistant(ids);
  346. }).then(() => {
  347. this.getList();
  348. this.$modal.msgSuccess("删除成功");
  349. }).catch(() => {});
  350. },
  351. /** 导出按钮操作 */
  352. handleExport() {
  353. this.download('business/assistant/export', {
  354. ...this.queryParams
  355. }, `assistant_${new Date().getTime()}.xlsx`)
  356. }
  357. }
  358. };
  359. </script>
  360. <style>
  361. .singe-line {
  362. line-height: 22px;
  363. text-overflow: ellipsis;
  364. overflow: hidden;
  365. word-break: break-all;
  366. white-space: nowrap;
  367. }
  368. .avatar-uploader .el-upload {
  369. border: 1px dashed var(--el-border-color);
  370. border-radius: 6px;
  371. cursor: pointer;
  372. position: relative;
  373. overflow: hidden;
  374. transition: var(--el-transition-duration-fast);
  375. }
  376. .avatar-uploader .el-upload:hover {
  377. border-color: var(--el-color-primary);
  378. }
  379. .el-icon.avatar-uploader-icon {
  380. font-size: 28px;
  381. color: #8c939d;
  382. width: 60px;
  383. height: 60px;
  384. text-align: center;
  385. }
  386. </style>
  387. <style scoped>
  388. .avatar-uploader .avatar {
  389. width: 60px;
  390. height: 60px;
  391. display: block;
  392. }
  393. </style>