analysisItem.vue 19 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748
  1. <template>
  2. <div class="analysisItem">
  3. <div class="ai-header" v-show="data.jsonData.name != '词频词汇分析'">
  4. <div class="ai-h-left" @click="changeOpenItem(!openItem)">
  5. <span
  6. :class="['ai-h-l-icon', openItem ? 'ai-h-l-iconActive' : '']"
  7. ></span>
  8. <span class="ai-h-l-text" v-if="!editTitle">{{ data.jsonData.anotherName?data.jsonData.anotherName:data.jsonData.name }}</span>
  9. <div class="a_h_l_t_input" v-if="editTitle" @click.stop="() => {}">
  10. <el-form ref="form" :model="form" :rules="rules" label-position="top" @submit.native.prevent>
  11. <el-form-item prop="name">
  12. <el-input
  13. v-model="form.name"
  14. @blur="editNameCheckFn()"
  15. @keyup.enter.native="editNameCheckFn()"
  16. ref="editNameInputRef"
  17. placeholder="请输入新的名称"
  18. ></el-input>
  19. </el-form-item>
  20. <!-- @blur="editNameCheckFn()" -->
  21. </el-form>
  22. </div>
  23. <el-tooltip v-if="!editTitle" class="item" effect="light" content="修改名称" placement="top">
  24. <span class="a_h_l_edit" @click.stop="editTitleFn()">
  25. <img src="../../../../assets/icon/classroomObservation/editIcon2.svg">
  26. </span>
  27. </el-tooltip>
  28. </div>
  29. <div class="ai-h-right">
  30. <span style="width: 100px;" class="generateError" v-if="loadNum == 2"
  31. >优化失败
  32. </span>
  33. <span
  34. style="width: 100px"
  35. v-if="loadNum == 1"
  36. >
  37. <span v-if="loading" class="generate">
  38. <img :src="require('../../../../assets/icon/classroomObservation/generate.svg')">
  39. 生成中...
  40. </span>
  41. <span v-else class="generateSuccess">
  42. <img :src="require('../../../../assets/icon/classroomObservation/success.svg')">
  43. 生成完成
  44. </span>
  45. </span>
  46. <span
  47. v-if="loadNum == 0 && !openItem && tid"
  48. class="ai-h-r-icon4"
  49. @click="delBtn()"
  50. >
  51. <el-tooltip
  52. class="item"
  53. effect="light"
  54. content="删除"
  55. placement="top"
  56. >
  57. <img
  58. :src="
  59. require('../../../../assets/icon/classroomObservation/del.svg')
  60. "
  61. />
  62. </el-tooltip>
  63. </span>
  64. <span
  65. v-if="loadNum == 0 && openItem"
  66. :class="['ai-h-r-icon1', showIndex <= 0 ? 'ai_h_r_iconOpacity' : '']"
  67. @click="changeShowIndex(-1)"
  68. >
  69. <el-tooltip
  70. class="item"
  71. effect="light"
  72. content="上一个"
  73. placement="top"
  74. >
  75. <img
  76. :src="
  77. require('../../../../assets/icon/classroomObservation/back.svg')
  78. "
  79. />
  80. </el-tooltip>
  81. </span>
  82. <span
  83. v-if="loadNum != 1 && openItem"
  84. :class="[
  85. showIndex >= historyResult.length - 1 ? 'ai_h_r_iconOpacity' : '',
  86. ]"
  87. @click="changeShowIndex(1)"
  88. >
  89. <el-tooltip
  90. class="item"
  91. effect="light"
  92. content="下一个"
  93. placement="top"
  94. >
  95. <img
  96. :src="
  97. require('../../../../assets/icon/classroomObservation/back.svg')
  98. "
  99. />
  100. </el-tooltip>
  101. </span>
  102. <span v-if="loadNum != 1 && openItem && tid" @click="editBtn()">
  103. <el-tooltip
  104. class="item"
  105. effect="light"
  106. content="优化"
  107. placement="top"
  108. >
  109. <img
  110. :src="
  111. require('../../../../assets/icon/classroomObservation/edit.svg')
  112. "
  113. />
  114. </el-tooltip>
  115. </span>
  116. <span v-if="loadNum != 1 && openItem && tid && ['1', '2', '3'].includes(data.jsonData.echartsType)" @click="editEcharts()">
  117. <el-tooltip
  118. class="item"
  119. effect="light"
  120. content="生成图表"
  121. placement="top"
  122. >
  123. <img
  124. :src="
  125. require('../../../../assets/icon/classroomObservation/echartIcon.svg')
  126. "
  127. />
  128. </el-tooltip>
  129. </span>
  130. <!-- <span class="ai-h-r-icon4" @click.stop="delBtn()"></span> -->
  131. </div>
  132. </div>
  133. <div class="ai-main" v-if="openItem">
  134. <div class="a-m-brief" v-if="showBrief">
  135. {{ data.jsonData.result }}
  136. <!-- <mdView :text="data.jsonData.result" /> -->
  137. <!-- {{ data.jsonData.result }} -->
  138. </div>
  139. <eChartTemplate style="width: 100%;height: 400px;" :data="data.jsonData.eChartData" v-if="data.jsonData.eChartData"/>
  140. <mdView :text="data.jsonData.content"/>
  141. <div v-for="(item, index) in data.jsonData.dataFileList" :key="item.uid">
  142. <div v-if="imgTypeList.includes(checkFileType(item.url))">
  143. <img style="max-width: 100%" :src="item.url" alt="" />
  144. </div>
  145. <div v-else-if="checkFileType(item.url) == 'md'">
  146. <mdView :url="item.url" />
  147. </div>
  148. <div v-else-if="checkFileType(item.url) == 'json'">
  149. <pieChart :url="item.url" />
  150. </div>
  151. </div>
  152. <div v-for="(item, index) in data.jsonData.fileList" :key="item.uid">
  153. <div v-if="imgTypeList.includes(checkFileType(item.url))">
  154. <img style="max-width: 100%" :src="item.url" alt="" />
  155. </div>
  156. <div v-else-if="checkFileType(item.url) == 'md'">
  157. <mdView :url="item.url" />
  158. </div>
  159. <div v-else-if="checkFileType(item.url) == 'json'">
  160. <pieChart :url="item.url" />
  161. </div>
  162. </div>
  163. </div>
  164. <!-- <editNameDialog ref="editNameDialogRef" @success="changeNameSuccess"/> -->
  165. </div>
  166. </template>
  167. <script>
  168. import mdView from "./mdView.vue";
  169. import pieChart from "./pieChart.vue";
  170. import { v4 as uuidv4 } from "uuid";
  171. import eChartTemplate from "./eChartTemplate";
  172. // import editNameDialog from './editNameDialog.vue'
  173. export default {
  174. emits: ["delItem", "editItem", "saveItem"],
  175. components: {
  176. mdView,
  177. pieChart,
  178. eChartTemplate
  179. // editNameDialog
  180. },
  181. props: {
  182. data: {
  183. type: Object,
  184. default: () => {
  185. return {};
  186. },
  187. },
  188. dialogTagDataList: {
  189. type: Array,
  190. default: () => {
  191. return [];
  192. },
  193. },
  194. index: {
  195. type: Number,
  196. default: 0,
  197. },
  198. tid: {
  199. type: String,
  200. require: true,
  201. },
  202. fileId: {
  203. type: String,
  204. require: true,
  205. },
  206. showBrief:{
  207. type:Boolean,
  208. default:true,
  209. },
  210. bmData: {
  211. type: Object,
  212. default: () => {
  213. return {};
  214. },
  215. },
  216. },
  217. data() {
  218. return {
  219. openItem: false,
  220. loading: false,
  221. loadNum: 0,
  222. userId:this.$route.query['userid'],
  223. showIndex: 0,
  224. historyResult: [],
  225. imgTypeList: [
  226. "png",
  227. "jpg",
  228. "jpeg",
  229. "bmp",
  230. "gif",
  231. "webp",
  232. "psd",
  233. "svg",
  234. "tiff",
  235. ],
  236. oldData: {},
  237. form: {
  238. name: ""
  239. },
  240. editTitle: false,
  241. rules: {
  242. name: [
  243. { required: true, trigger: "change", message: "请输入新的名称" },
  244. {
  245. min: 1,
  246. max: 20,
  247. trigger: "change",
  248. message: "长度需在1-20个字符之间"
  249. }
  250. ]
  251. }
  252. };
  253. },
  254. computed: {
  255. checkFileType() {
  256. return (url) => {
  257. return url.split(".").pop();
  258. };
  259. },
  260. },
  261. watch: {
  262. // showIndex(){
  263. // let _copyData = JSON.parse(JSON.stringify(this.data));
  264. // _copyData.jsonData = this.historyResult[this.showIndex];
  265. // _copyData.json_data = JSON.stringify(_copyData.jsonData);
  266. // this.$emit("editItem", this.data.id, _copyData);
  267. // }
  268. },
  269. methods: {
  270. changeOpenItem(newValue) {
  271. if (this.loading == true && this.loadNum != 0)
  272. return this.$message("请稍后...");
  273. this.loadNum = 0;
  274. this.openItem = newValue;
  275. },
  276. editBtn() {
  277. this.$nextTick(() => {
  278. this.loading = true;
  279. this.openItem = false;
  280. this.loadNum = 1;
  281. let type = 0;//0 用agentId 1:用提示词 3:啥都没有
  282. let assistant = this.dialogTagDataList.find(
  283. (i) => i.id == this.data.jsonData.mId
  284. ) || this.dialogTagDataList.find(
  285. (i) => i.name == this.data.jsonData.name
  286. );
  287. let _msg = `使用文件检索的方式完整的去分析文件内容,并请完全按照要求输出。`
  288. if(!assistant){
  289. this.loading = false;
  290. this.loadNum = 2;
  291. type = 3;
  292. return this.$message.error("未找到对应的AI助手");
  293. }
  294. if (assistant.tips) {
  295. type = 1
  296. }else if(assistant.agentid){
  297. type = 0
  298. }else{
  299. this.loading = false;
  300. this.loadNum = 2;
  301. type = 3;
  302. return this.$message.error("未找到对应的AI助手");
  303. }
  304. if(assistant.agentid=='6b4a9650-48be-11ef-936b-12e77c4cb76b'){
  305. _msg = `使用文件检索的方式完整的去分析文件内容,并基于以下的课堂基本内容,使用cpote课程设计模型改编一堂同主题的课程。
  306. 课堂名称:${this.bmData.courseName} 搜课年级:${this.bmData.grade} 授课科目:${this.bmData.subject}`
  307. }
  308. // console.log('👇')
  309. // return console.log(_msg)
  310. let parm = {
  311. assistant_id: type==0?assistant.agentid:"f8e1ebb2-2e0d-11ef-8bf4-12e77c4cb76b",
  312. message:type==0?_msg:assistant.tips,
  313. session_name: uuidv4(),
  314. userId: this.userId,
  315. file_ids: this.fileId?[this.fileId]:'',
  316. model: "gpt-4o-2024-08-06",
  317. };
  318. // 👇
  319. // const _uid = uuidv4();
  320. // let parm = {
  321. // assistant_id: assistant ? assistant.value : null,
  322. // userId: this.userId, //602def61-005d-11ee-91d8-005056b86db5
  323. // message:
  324. // "请使用代码解析器获取文件,帮我根据要求完整的分析,输出请按照要求。",
  325. // session_name: new Date().getTime(),
  326. // uid: _uid,
  327. // file_ids: this.fileId ? [this.fileId] : [],
  328. // };
  329. if (!parm.assistant_id) {
  330. this.loading = false;
  331. this.loadNum = 2;
  332. return this.$message.error("未找到对应的AI助手");
  333. }
  334. // this.ajax
  335. // .post("https://gpt4.cocorobo.cn/ai_agent_park_chat_new", parm)
  336. // .then((res) => {
  337. // if (res.data.FunctionResponse.result == "发送成功") {
  338. // } else {
  339. // this.$message.warning(res.data.FunctionResponse.result);
  340. // }
  341. // })
  342. // .catch((err) => {
  343. // console.log(err);
  344. // });
  345. // this.getAtAuContent(_uid);
  346. // 👆
  347. this.ajax
  348. .post("https://gpt4.cocorobo.cn/ai_agent_park_chat", parm)
  349. .then((res) => {
  350. let _data = res.data.FunctionResponse;
  351. // if (
  352. // !_data.message ||
  353. // _data.message.indexOf("由于我无法直接访问您上传的文件内容") > -1
  354. // ) {
  355. // this.loading = false;
  356. // this.loadNum = 2;
  357. // // this.$message.error("AI无法识别优化");
  358. // return
  359. // }
  360. let _copyData = JSON.parse(JSON.stringify(this.data));
  361. // _copyData.jsonData.result = "";
  362. _copyData.jsonData.content = _data.message;
  363. _copyData.jsonData.dataFileList = [];
  364. _copyData.jsonData.fileList = [];
  365. _copyData.json_data = JSON.stringify(_copyData.jsonData);
  366. if (this.historyResult.length == 0) {
  367. this.historyResult.push(_copyData.jsonData);
  368. } else {
  369. this.historyResult.splice(
  370. this.showIndex + 1,
  371. 0,
  372. _copyData.jsonData
  373. );
  374. }
  375. this.changeShowIndex(1);
  376. this.loading = false;
  377. })
  378. .catch((err) => {
  379. this.loadNum = 2;
  380. // this.$message.error("AI无法识别优化");
  381. this.loading = false;
  382. });
  383. });
  384. },
  385. getAtAuContent(_uid, _text, _headUrl, _assistantName) {
  386. let _source = new EventSource(
  387. `https://gpt4.cocorobo.cn/question/${_uid}`
  388. ); //http://gpt4.cocorobo.cn:8011/question/ https://gpt4.cocorobo.cn/question/
  389. let _allText = "";
  390. let _mdText = "";
  391. let _copyData = JSON.parse(JSON.stringify(this.data));
  392. // _copyData.jsonData.result = "";
  393. _copyData.jsonData.content = "";
  394. _copyData.jsonData.dataFileList = [];
  395. _copyData.jsonData.fileList = [];
  396. if (this.historyResult.length == 0) {
  397. this.historyResult.push(_copyData.jsonData);
  398. } else {
  399. this.historyResult.splice(this.showIndex + 1, 0, _copyData.jsonData);
  400. }
  401. this.showIndex++;
  402. this.$emit("editItem", this.data.id, _copyData);
  403. // const md = new MarkdownIt();
  404. _source.onmessage = (_e) => {
  405. let _eData = JSON.parse(_e.data);
  406. if (_eData.content.replace("'", "").replace("'", "") == "[DONE]") {
  407. let _result = [];
  408. if ("result" in _eData) {
  409. _result = _eData.result;
  410. for (let i = 0; i < _result.length; i++) {
  411. _mdText = _mdText.replace(_result[i].text, _result[i].fileName);
  412. }
  413. }
  414. _mdText = _mdText.replace("_", "");
  415. _copyData.jsonData.content = _mdText;
  416. this.loading = false;
  417. this.loadNum = 0;
  418. this.$emit("editItem", this.data.id, _copyData);
  419. this.$emit("saveItem", this.data.id, _copyData);
  420. _source.close();
  421. } else {
  422. let _text = _eData.content.replace("'", "").replace("'", "");
  423. if (_allText == "") {
  424. _allText = _text.replace(/^\n+/, ""); //去掉回复消息中偶尔开头就存在的连续换行符
  425. } else {
  426. _allText += _text;
  427. }
  428. _mdText = _allText + "_";
  429. _mdText = _mdText.replace(/\\n/g, "\n");
  430. _mdText = _mdText.replace(/\\/g, "");
  431. if (_allText.split("```").length % 2 == 0) _mdText += "\n```\n";
  432. //转化返回的回复流数据
  433. // _mdText = md.render(_mdText);
  434. _copyData.jsonData.content = _mdText;
  435. this.$emit("editItem", this.data.id, _copyData);
  436. // 处理流数据
  437. }
  438. };
  439. },
  440. delBtn() {
  441. this.$confirm("确定删除?", "提示", {
  442. confirmButtonText: "确定",
  443. cancelButtonText: "取消",
  444. type: "error",
  445. }).then(() => {
  446. this.$emit("delItem", this.data.id);
  447. }).catch(_=>{
  448. console.log("取消")
  449. });
  450. },
  451. changeShowIndex(value) {
  452. if (this.historyResult.length == 0) return;
  453. if (value == -1) {
  454. if (this.showIndex > 0) this.showIndex--;
  455. } else if (value == 1) {
  456. if (this.showIndex < this.historyResult.length - 1) this.showIndex++;
  457. }
  458. let _copyData = JSON.parse(JSON.stringify(this.data));
  459. let _oldCopyDate = JSON.parse(JSON.stringify(this.data));
  460. _copyData.jsonData = this.historyResult[this.showIndex];
  461. _copyData.json_data = JSON.stringify(_copyData.jsonData);
  462. _oldCopyDate.json_data = JSON.stringify(_oldCopyDate.jsonData);
  463. // 一样就不用更新了
  464. if (JSON.stringify(_copyData) == JSON.stringify(_oldCopyDate)) return;
  465. // this.data = _copyData;
  466. this.$emit("editItem", this.data.id, _copyData);
  467. this.$emit("saveItem", this.data.id, _copyData);
  468. },
  469. // editTitle(){
  470. // this.$refs.editNameDialogRef.open(this.data.jsonData.anotherName?this.data.jsonData.anotherName:this.data.jsonData.name)
  471. // },
  472. changeNameSuccess(newName){
  473. let _copyData = JSON.parse(JSON.stringify(this.data));
  474. _copyData.jsonData.anotherName = newName;
  475. _copyData.json_data = JSON.stringify(_copyData.jsonData);
  476. this.$emit("editItem", this.data.id, _copyData);
  477. this.$emit("saveItem", this.data.id, _copyData);
  478. // this.$refs.editNameDialogRef.close();
  479. },
  480. editTitleFn() {
  481. if (!this.tid) return this.$message.info("请新建课堂,或选择历史课堂");
  482. this.form.name = this.data.jsonData.anotherName?this.data.jsonData.anotherName:this.data.jsonData.name;
  483. this.editTitle = true;
  484. this.$nextTick(() => {
  485. this.$refs.editNameInputRef.focus();
  486. });
  487. // this.$refs.editNameDialogRef.open(this.title)
  488. },
  489. editNameCheckFn() {
  490. if(!this.editTitle)return;
  491. this.$refs["form"].validate(valid => {
  492. if (valid) {
  493. this.editTitle = false;
  494. this.changeNameSuccess(this.form.name);
  495. } else {
  496. this.$nextTick(() => {
  497. this.$refs.editNameInputRef.focus();
  498. this.$message.error("该名称不符合规则")
  499. });
  500. }
  501. });
  502. },
  503. editEcharts(){
  504. console.log("生成图标")
  505. if(this.data.jsonData.echartsType == "1"){
  506. this.$message.info("词云图")
  507. }else if(this.data.jsonData.echartsType == "2"){
  508. this.$message.info("雷达图")
  509. }else if(this.data.jsonData.echartsType == "3"){
  510. this.$message.info("柱状图")
  511. }else{
  512. return this.$message.error("该模板不是图表模板")
  513. }
  514. }
  515. },
  516. mounted() {
  517. if (this.data.jsonData.content) {
  518. this.historyResult.push(this.data.jsonData);
  519. }
  520. },
  521. };
  522. </script>
  523. <style scoped>
  524. .analysisItem {
  525. width: 100%;
  526. height: auto;
  527. /* margin: 11.7px 0px; */
  528. padding-right: 10px;
  529. box-sizing: border-box;
  530. margin-bottom:10px ;
  531. border: 1px solid #E7E7E7;
  532. border-radius: 4px;
  533. transition: .3s;
  534. }
  535. .analysisItem:hover{
  536. border: 1px solid #3681FC;
  537. }
  538. .text1 {
  539. color: rgba(54, 129, 252, 1);
  540. }
  541. .text2 {
  542. color: rgba(23, 196, 105, 1);
  543. }
  544. .ai-header {
  545. width: 100%;
  546. height: 50px;
  547. display: flex;
  548. background-color: white;
  549. border-radius: 5px;
  550. }
  551. .ai-h-left {
  552. flex: 1;
  553. height: 100%;
  554. display: flex;
  555. align-items: center;
  556. box-sizing: border-box;
  557. padding: 0 10px;
  558. cursor: pointer;
  559. }
  560. .ai-h-l-icon {
  561. width: 16px;
  562. height: 16px;
  563. background: url("../../../../assets/icon/classroomObservation/right.svg")
  564. no-repeat;
  565. background-size: 100% 100%;
  566. margin-right: 10px;
  567. transition: 0.3s;
  568. }
  569. .ai-h-l-iconActive {
  570. transform: rotate(90deg);
  571. }
  572. .ai-h-l-text {
  573. font-size: 18px;
  574. }
  575. .ai-h-right {
  576. width: auto;
  577. height: 100%;
  578. display: flex;
  579. align-items: center;
  580. justify-content: space-around;
  581. position: relative;
  582. }
  583. .ai-h-right > span {
  584. width: 18px;
  585. height: 18px;
  586. background-size: 100% 100%;
  587. margin: 0 10px;
  588. cursor: pointer;
  589. }
  590. .ai-h-right > span > img {
  591. width: 18px;
  592. height: 18px;
  593. }
  594. .ai-h-r-icon1 {
  595. background: url("../../../../assets/icon/classroomObservation/back.svg");
  596. /* 镜像 */
  597. transform: scaleX(-1);
  598. }
  599. .ai-h-r-icon2 {
  600. background: url("../../../../assets/icon/classroomObservation/back.svg");
  601. }
  602. .ai_h_r_iconOpacity {
  603. opacity: 0.5;
  604. cursor: not-allowed !important;
  605. }
  606. .ai-h-r-icon3 {
  607. background: url("../../../../assets/icon/classroomObservation/edit.svg");
  608. /* display: none; */
  609. }
  610. .ai-header:hover .ai-h-r-icon4 {
  611. display: block;
  612. /* opacity: 1; */
  613. }
  614. .ai-h-r-icon4 {
  615. background: url("../../../../assets/icon/classroomObservation/del2.svg");
  616. /* position: absolute; */
  617. /* right: -40px; */
  618. display: none;
  619. /* opacity: 0; */
  620. /* transition: .3s; */
  621. }
  622. .analysisItem:hover .ai-h-r-icon4 {
  623. display: block;
  624. }
  625. .ai-main {
  626. width: 100%;
  627. height: auto;
  628. background-color: white;
  629. border-radius: 0 0 5px 5px;
  630. overflow: auto;
  631. box-sizing: border-box;
  632. padding: 10px 20px;
  633. }
  634. .a-m-brief {
  635. font-size: 16px;
  636. /* 斜体 */
  637. font-style: italic;
  638. margin-bottom: 10px;
  639. color: #6b798e;
  640. }
  641. td,
  642. th {
  643. padding: 10px;
  644. }
  645. .generate{
  646. color: #00000099;
  647. font-size: 16px;
  648. display: flex;
  649. align-items: center;
  650. }
  651. .generate>img{
  652. margin-right: 5px;
  653. width: 20px;
  654. height: 20px;
  655. }
  656. .generateSuccess{
  657. color: #17C469;
  658. font-size: 16px;
  659. display: flex;
  660. align-items: center;
  661. }
  662. .generateSuccess>img{
  663. margin-right: 5px;
  664. width: 20px;
  665. height: 20px;
  666. }
  667. .generateError{
  668. color: #e60012;
  669. font-size: 16px;
  670. display: flex;
  671. align-items: center;
  672. }
  673. .a_h_l_edit{
  674. width: 16px;
  675. height: 16px;
  676. margin-left: 10px;
  677. display: none;
  678. align-items: center;
  679. justify-content: center;
  680. }
  681. .a_h_l_edit>img{
  682. width: 100%;
  683. height: 100%;
  684. }
  685. .ai-h-left:hover .a_h_l_edit{
  686. display: flex;
  687. }
  688. .a_h_l_t_input {
  689. width: 25%;
  690. min-width: 220px;
  691. height: 100%;
  692. display: flex;
  693. align-items: center;
  694. }
  695. .a_h_l_t_input>>>.el-form{
  696. width: 100%;
  697. min-width: 220px;
  698. }
  699. .a_h_l_t_input>>>.el-form-item{
  700. margin-bottom: 0;
  701. }
  702. </style>