train.vue 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682
  1. <!-- -->
  2. <template>
  3. <div class='' v-loading="loading" element-loading-text="正在处理">
  4. <el-breadcrumb class="divi2" separator-class="el-icon-arrow-right">
  5. <el-breadcrumb-item :to="{ path: '/' }">首页</el-breadcrumb-item>
  6. <el-breadcrumb-item>算法任务</el-breadcrumb-item>
  7. </el-breadcrumb>
  8. <el-divider class="divi"></el-divider>
  9. <el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
  10. <el-form-item>
  11. <el-button v-if="isAuth('train:save')" type="primary" @click="addHandle()">新建任务</el-button>
  12. </el-form-item>
  13. <el-form-item>
  14. <el-input v-model="dataForm.missName" placeholder="请输入任务名称" clearable
  15. @keyup.enter.native="pageIndex = 1;getDataList()"></el-input>
  16. </el-form-item>
  17. <el-form-item>
  18. <el-button @click="pageIndex = 1;getDataList()">查询</el-button>
  19. </el-form-item>
  20. <el-form-item>
  21. <el-tag>筛选:</el-tag>
  22. <el-select v-model="classificationtag" clearable placeholder="类别" size="mini" style="width: 130px;"
  23. @change="pageIndex = 1;getDataList2()">
  24. <el-option v-for="data in classification" :key="data" :label="data" :value="data">
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item>
  29. <!-- <el-button @click="algorithmTrainCompare()">任务对比</el-button>-->
  30. </el-form-item>
  31. </el-form>
  32. <el-table :data="dataList" border v-loading="dataListLoading" @selection-change="selectionChangeHandle"
  33. style="width: 100%;">
  34. <!-- 不允许多选 -->
  35. <el-table-column type="selection" header-align="center" align="center" width="50"></el-table-column>
  36. <!-- <el-table-column prop="algorithmTrainingId" header-align="center" align="center" width="80" label="任务ID">
  37. </el-table-column> -->
  38. <el-table-column label="序号" header-align="center" align="center" width="80" type="index" :index='(index)=>{return (index+1) + (this.pageIndex-1)*this.pageSize}'> </el-table-column>
  39. <el-table-column prop="missName" header-align="center" align="center" label="任务名称"></el-table-column>
  40. <el-table-column prop="algFrameId" header-align="center" align="center" label="算法类别">
  41. <template slot-scope="scope">
  42. <el-tag v-if="scope.row.algFrameId === -1" size="small">抗干扰算法</el-tag>
  43. <el-tag v-else size="small">干扰算法</el-tag>
  44. </template>
  45. </el-table-column>
  46. <!-- <el-table-column prop="categoryName" header-align="center" align="center" label="分类"></el-table-column>-->
  47. <el-table-column prop="username" header-align="center" align="center" label="创建人"></el-table-column>
  48. <el-table-column prop="missStatus" header-align="center" align="center" label="状态">
  49. <template slot-scope="scope">
  50. <el-tag v-if="scope.row.missStatus === 0" size="small" type="danger">停止</el-tag>
  51. <el-tag v-else-if="scope.row.missStatus === 1" size="small">待开始</el-tag>
  52. <el-tag v-else-if="scope.row.missStatus === 2" size="small" type="success">运行中</el-tag>
  53. <el-tag v-else-if="scope.row.missStatus === 4" size="small" type="success">已发布</el-tag>
  54. <el-tag v-else-if="scope.row.missStatus === 5" size="small">已申请发布</el-tag>
  55. <el-tag v-else-if="scope.row.missStatus === 6" size="small" type="danger">申请被驳回</el-tag>
  56. <el-tag v-else-if="scope.row.missStatus === 7" size="small">暂停中</el-tag>
  57. <el-tag v-else size="small" type="success">已结束</el-tag>
  58. </template>
  59. </el-table-column>
  60. <el-table-column prop="missCreationTime" header-align="center" align="center" width="180" label="开始时间"
  61. :formatter="missCreationTimeFormat">
  62. </el-table-column>
  63. <el-table-column prop="missStopTime" header-align="center" align="center" width="180" label="停止时间"
  64. :formatter="missStopTimeFormat">
  65. </el-table-column>
  66. <el-table-column id="shua" prop="" header-align="center" align="center" width="300" label="用时"
  67. :formatter="timeUsedHandle">
  68. </el-table-column>
  69. <el-table-column prop="remark" header-align="center" align="center" width="180" label="备注">
  70. </el-table-column>
  71. <el-table-column fixed="right" header-align="center" align="center" width="300" label="操作">
  72. <template slot-scope="scope">
  73. <el-button v-if="isAuth('train:list')" type="text" size="small" :disabled="scope.row.missStatus==7?true:false"
  74. @click="watch(scope.row.algorithmTrainingId,scope.row.missStatus)">
  75. 查看
  76. </el-button>
  77. <!-- <el-button type="text" size="small"
  78. @click="install(scope.row.algorithmTrainingId)">安装</el-button> -->
  79. <el-button v-if="isAuth('train:run')" type="text" size="small"
  80. @click="runtrain(scope.row.algorithmTrainingId,scope.row.algFrameId,scope.row.algorithmId)">{{ scope.row.hasRun !==null ? '再次运行' : '运行' }}</el-button>
  81. <el-button v-if="isAuth('train:stop')" type="text" size="small" :disabled="scope.row.missStatus==2?false:true"
  82. @click="pauseHandle(scope.row.algorithmTrainingId)">暂停</el-button>
  83. <el-button v-if="isAuth('train:rerun')" type="text" size="small" :disabled="scope.row.missStatus==7?false:true"
  84. @click="unpauseHandle(scope.row.algorithmTrainingId)">继续</el-button>
  85. <el-button v-if="isAuth('train:publish')" type="text" size="small" :disabled="scope.row.missStatus==3?false:true"
  86. @click="publish(scope.row.algorithmTrainingId)">发布</el-button>
  87. <el-button type="text" size="small" class="warningButton"
  88. @click="deleteMissHandle(scope.row.algorithmTrainingId)">删除</el-button>
  89. </template>
  90. </el-table-column>
  91. </el-table>
  92. <el-pagination @size-change="sizeChangeHandle" @current-change="currentChangeHandle" :current-page="pageIndex"
  93. :page-sizes="[10, 20, 50, 100]" :page-size="pageSize" :total="totalPage"
  94. layout="total, sizes, prev, pager, next, jumper">
  95. </el-pagination>
  96. <!-- 弹窗, 新增 / 修改 -->
  97. <TrainAdd v-if="addVisible" ref="addS"></TrainAdd>
  98. <Publish v-if="publishVisible" ref="algPublish"></Publish>
  99. <SelectAlgPara v-if="selectAlgParaVisibel" ref="selectAlgPara"></SelectAlgPara>
  100. </div>
  101. </template>
  102. <script>
  103. //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  104. //例如:import 《组件名称》 from '《组件路径》';
  105. // import AddOrUpdate from "./dataset-add-or-update";
  106. // import Watch from "./dataset-watch";
  107. // import Add from "./dataset-add";
  108. // import Add from "./train-add";
  109. // import Add from "./train-add";
  110. // import TrainAdd from './train-add.vue';
  111. import TrainAdd from './train-add.vue';
  112. import Publish from "./alg-publish.vue"
  113. import SelectAlgPara from "./select-algpara.vue"
  114. import { MessageBox } from 'element-ui'
  115. import { Message } from "element-ui"
  116. export default {
  117. //import引入的组件需要注入到对象中才能使用
  118. data() {
  119. return {
  120. loading:false,
  121. timer:null,
  122. dataForm: {
  123. missName: "",
  124. },
  125. // flag: 0,
  126. // tempList: [],
  127. dataList: [],
  128. pageIndex: 1,
  129. pageSize: 10,
  130. totalPage: 0,
  131. dataListLoading: false,
  132. dataListSelections: [],
  133. addOrUpdateVisible: false,
  134. newWatchVisible: false,
  135. addVisible: false,
  136. classificationtag: "",
  137. missStatus: null,
  138. classification: [],
  139. publishVisible:false,
  140. selectAlgParaVisibel:false
  141. };
  142. },
  143. components: {
  144. TrainAdd,
  145. Publish,
  146. SelectAlgPara
  147. },
  148. activated() {
  149. this.getDataList();
  150. //定时器
  151. /* this.timer=window.setInterval(()=>{
  152. setTimeout(()=>{
  153. console.log("执行定时任务");
  154. this.getDataList();
  155. },0)
  156. },1000); */
  157. },
  158. //切换路由时,清除定时器
  159. beforeRouteLeave(to, from, next){
  160. next();
  161. if (this.timer) {
  162. clearInterval(this.timer);
  163. this.timer = null;
  164. }
  165. },
  166. methods: {
  167. // startInterval() {
  168. // setInterval(() => {
  169. // if(this.flag % 2){
  170. // this.dataList = [];
  171. // console.log(this.tempList);
  172. // console.log(this.dataList);
  173. // console.log("ok");
  174. // }else{
  175. // this.dataList = this.tempList;
  176. // console.log(this.tempList);
  177. // // this.dataListLoading = true;
  178. // console.log(this.dataList);
  179. // console.log("no");
  180. // }
  181. // this.flag = this.flag + 1;
  182. // }, 1000);
  183. // },
  184. // 获取数据列表
  185. getDataList() {
  186. this.dataListLoading = true;
  187. this.classificationtag = '';
  188. this.missStatus = null;
  189. this.$http({
  190. url: this.$http.adornUrl("/category/select"),
  191. method: "get",
  192. }).then(({ data }) => {
  193. this.classification = this.unique(data.list);
  194. });
  195. this.$http({
  196. url: this.$http.adornUrl("/algstrain/list"),
  197. method: "get",
  198. params: this.$http.adornParams({
  199. page: this.pageIndex,
  200. limit: this.pageSize,
  201. missName: this.dataForm.missName,
  202. }),
  203. }).then(({ data }) => {
  204. if (data && data.code === 0) {
  205. this.dataList = data.page.list;
  206. this.totalPage = data.page.totalCount;
  207. this.statusunique = this.unique(data.page.list);
  208. } else {
  209. this.dataList = [];
  210. this.totalPage = 0;
  211. }
  212. this.dataListLoading = false;
  213. });
  214. },
  215. //筛选查询
  216. getDataList2() {
  217. this.dataListLoading = true;
  218. if(this.classificationtag===''){
  219. this.classificationtag=null;
  220. }
  221. this.$http({
  222. url: this.$http.adornUrl("/algstrain/list"),
  223. method: "get",
  224. params: this.$http.adornParams({
  225. page: this.pageIndex,
  226. limit: this.pageSize,
  227. missName: this.dataForm.missName,
  228. classificationtag: this.classificationtag,
  229. missStatus: this.missStatus
  230. }),
  231. }).then(({ data }) => {
  232. if (data && data.code === 0) {
  233. this.dataList = data.page.list;
  234. this.totalPage = data.page.totalCount;
  235. } else {
  236. this.dataList = [];
  237. this.totalPage = 0;
  238. }
  239. this.dataListLoading = false;
  240. });
  241. },
  242. timeFn(d1) {
  243. //di作为一个变量传进来
  244. //如果时间格式是正确的,那下面这一步转化时间格式就可以不用了
  245. var dateBegin = new Date(d1.replace(/-/g, "/")); //将-转化为/,使用new Date
  246. var dateEnd = new Date(); //获取当前时间
  247. var dateDiff = dateEnd.getTime() - dateBegin.getTime(); //时间差的毫秒数
  248. var dayDiff = Math.floor(dateDiff / (24 * 3600 * 1000)); //计算出相差天数
  249. var leave1 = dateDiff % (24 * 3600 * 1000); //计算天数后剩余的毫秒数
  250. var hours = Math.floor(leave1 / (3600 * 1000)); //计算出小时数
  251. //计算相差分钟数
  252. var leave2 = leave1 % (3600 * 1000); //计算小时数后剩余的毫秒数
  253. var minutes = Math.floor(leave2 / (60 * 1000)); //计算相差分钟数
  254. //计算相差秒数
  255. var leave3 = leave2 % (60 * 1000); //计算分钟数后剩余的毫秒数
  256. var seconds = Math.round(leave3 / 1000);
  257. console.log(
  258. " 相差 " +
  259. dayDiff +
  260. "天 " +
  261. hours +
  262. "小时 " +
  263. minutes +
  264. " 分钟" +
  265. seconds +
  266. " 秒"
  267. );
  268. console.log(
  269. dateDiff + "时间差的毫秒数",
  270. dayDiff + "计算出相差天数",
  271. leave1 + "计算天数后剩余的毫秒数",
  272. hours + "计算出小时数",
  273. minutes + "计算相差分钟数",
  274. seconds + "计算相差秒数"
  275. );
  276. return (
  277. dayDiff + "计算出相差天数",
  278. hours + "计算出小时数",
  279. minutes + "计算相差分钟数",
  280. seconds + "计算相差秒数"
  281. );
  282. },
  283. //通过开始时间计算用时
  284. timeUsedHandle(row, column) {
  285. if (row.missCreationTime === null || row.missStopTime === null) {
  286. return "-";
  287. } else {
  288. const missCreationTime = new Date(row.missCreationTime);
  289. const missStopTime = new Date(row.missStopTime);
  290. const timeDifference = missStopTime - missCreationTime; // 差值为毫秒
  291. if (!isNaN(timeDifference)) {
  292. const seconds = Math.floor((timeDifference / 1000) % 60);
  293. const minutes = Math.floor((timeDifference / (1000 * 60)) % 60);
  294. const hours = Math.floor((timeDifference / (1000 * 60 * 60)) % 24);
  295. const displayTime = `${hours}小时 ${minutes}分钟 ${seconds}秒`;
  296. return displayTime;
  297. } else {
  298. return "时间差计算出错";
  299. }
  300. }
  301. },
  302. missCreationTimeFormat(row, column){
  303. if (row.missCreationTime === null) {
  304. return "-";
  305. } else{
  306. return row.missCreationTime;
  307. }
  308. },
  309. missStopTimeFormat(row, column){
  310. if (row.missStopTime === null) {
  311. return "-";
  312. } else{
  313. return row.missStopTime;
  314. }
  315. },
  316. missStatusHandle(row, column) {
  317. if (row.missStatus === 0) {
  318. return "停止";
  319. } else {
  320. return "正在运行";
  321. }
  322. },
  323. //去重
  324. unique(arr) {
  325. var ss = [];
  326. for (var i = 0; i < arr.length; i++) {
  327. ss[i] = arr[i].categoryName;
  328. }
  329. return Array.from(new Set(ss));
  330. },
  331. // 每页数
  332. sizeChangeHandle(val) {
  333. this.pageSize = val;
  334. this.pageIndex = 1;
  335. this.getDataList();
  336. },
  337. // 当前页
  338. currentChangeHandle(val) {
  339. this.pageIndex = val;
  340. this.getDataList();
  341. },
  342. // 多选
  343. selectionChangeHandle(val) {
  344. this.dataListSelections = val;
  345. },
  346. // 查看
  347. watch(id,missStatus) {
  348. /* this.newWatchVisible = true;
  349. this.$nextTick(() => {
  350. this.$refs.newWatch.init(id);
  351. }); */
  352. this.$router.replace({ path: "/train-watch" ,query:{algorithmTrainingId:id,missStatus:missStatus}});
  353. },
  354. //保存tensorboard文件
  355. saveTensorboardFile(id){
  356. this.$http({
  357. url:this.$http.adornUrl('/algstrain/saveTensorboardFile'),
  358. method:'get',
  359. params:this.$http.adornParams({
  360. algorithmTrainingId:id
  361. }),
  362. }).then(({data})=>{
  363. });
  364. },
  365. //对比两个训练任务的tensorboard图像
  366. algorithmTrainCompare(){
  367. if(this.dataListSelections.length<2){
  368. Message.error('请选择两个算法任务进行对比');
  369. return;
  370. }
  371. this.loading=true;
  372. var algTrainIds=new Array();
  373. for(var i=0;i<this.dataListSelections.length;i++){
  374. algTrainIds[i]=this.dataListSelections[i].algorithmTrainingId;
  375. }
  376. console.log(algTrainIds);
  377. this.$http({
  378. url:this.$http.adornUrl('/algstrain/algorithmTrainCompare'),
  379. method:'post',
  380. data: this.$http.adornData(algTrainIds,false),
  381. }).then(({data})=>{
  382. if(data&&data.code===0){
  383. this.loading=false;
  384. this.$router.replace({ name: 'traincompare',query:{port:data.port,containerId:data.containerId} });
  385. }else{
  386. this.loading=false;
  387. Message.error('对比失败');
  388. }
  389. });
  390. },
  391. //安装所上传的依赖包----------------------仅做测试,后续合并到其他方法后,需删除该方法
  392. install(id){
  393. this.$http({
  394. url:this.$http.adornUrl('/algstrain/installWhl'),
  395. method:'get',
  396. params:this.$http.adornParams({
  397. algorithmTrainingId:id
  398. }),
  399. }).then(({data})=>{
  400. console.log("安装成功");
  401. });
  402. },
  403. // 运行任务
  404. runtrain(id,algFrameId,algorithmId) {
  405. /* if(algFrameId!=-1){
  406. this.$http({
  407. url:this.$http.adornUrl('/algstrain/changeMissStatus'),
  408. method:'get',
  409. params:this.$http.adornParams({
  410. algorithmTrainingId:id
  411. }),
  412. }).then(({data})=>{
  413. this.getDataList();
  414. });
  415. this.$http({
  416. url:this.$http.adornUrl('/algstrain/startTraining'),
  417. method:'get',
  418. params:this.$http.adornParams({
  419. algorithmTrainingId:id
  420. }),
  421. }).then(({data})=>{
  422. });
  423. }else{
  424. this.selectAlgParaVisibel=true;
  425. this.$nextTick(() => {
  426. this.$refs.selectAlgPara.init(id,algorithmId);
  427. });
  428. } */
  429. MessageBox.confirm(`是否运行该算法任务?`, '提示', {
  430. confirmButtonText: '确定',
  431. cancelButtonText: '取消',
  432. type: 'warning'
  433. }).then(() => {
  434. this.$http({
  435. url:this.$http.adornUrl('/algstrain/changeMissStatus'),
  436. method:'get',
  437. params:this.$http.adornParams({
  438. algorithmTrainingId:id
  439. }),
  440. }).then(({data})=>{
  441. this.getDataList();
  442. console.log("this.dataList1111", this.dataList);
  443. // this.dataList.forEach(item=>{
  444. // if (item.algorithmTrainingId === id) {
  445. // this.$set(item, 'missStopTime', '-'); // 确保 Vue 能捕捉到这个变化
  446. // }
  447. // })
  448. this.$http({
  449. url:this.$http.adornUrl('/algstrain/startTraining'),
  450. method:'get',
  451. params:this.$http.adornParams({
  452. algorithmTrainingId:id
  453. }),
  454. }).then(({data})=>{
  455. if(data && data.code === 0){
  456. Message({
  457. type: 'success',
  458. message: '运行成功',
  459. });
  460. } else {
  461. Message.error(data.msg);
  462. }
  463. this.getDataList();
  464. });
  465. });
  466. }).catch(() => {})
  467. },
  468. // 重新运行任务
  469. reruntrain(id) {},
  470. //算法发布
  471. publish(id){
  472. this.publishVisible=true;
  473. this.$nextTick(()=>{
  474. this.$refs.algPublish.init(id);
  475. });
  476. },
  477. // 这里处理新建任务
  478. addHandle() {
  479. // this.addVisible = true;
  480. this.$nextTick(() => {
  481. this.$router.replace({ path: "/mission-create" });
  482. });
  483. },
  484. //暂停训练任务
  485. pauseHandle(id){
  486. MessageBox.confirm('此操作将暂停该算法任务, 是否继续?', '提示', {
  487. confirmButtonText: '确定',
  488. cancelButtonText: '取消',
  489. type: 'warning'
  490. }).then(() => {
  491. this.loading=true;
  492. this.$http({
  493. url:this.$http.adornUrl('/algstrain/pauseMiss'),
  494. method:'get',
  495. params:this.$http.adornParams({
  496. algorithmTrainingId:id
  497. }),
  498. }).then(({data})=>{
  499. this.getDataList();
  500. Message({
  501. type: 'success',
  502. message: '暂停成功'
  503. });
  504. this.loading=false;
  505. });
  506. }).catch(() => {
  507. Message({
  508. type: 'info',
  509. message: '已取消暂停'
  510. });
  511. });
  512. },
  513. //恢复已暂停的训练任务
  514. unpauseHandle(id){
  515. MessageBox.confirm(`是否继续运行该算法任务?`, '提示', {
  516. confirmButtonText: '确定',
  517. cancelButtonText: '取消',
  518. type: 'warning'
  519. }).then(() => {
  520. this.loading=true;
  521. this.$http({
  522. url:this.$http.adornUrl('/algstrain/unpauseMiss'),
  523. method:'get',
  524. params:this.$http.adornParams({
  525. algorithmTrainingId:id
  526. }),
  527. }).then(({data})=>{
  528. this.getDataList();
  529. Message({
  530. type: 'success',
  531. message: '已继续运行'
  532. });
  533. this.loading=false;
  534. });
  535. }).catch(() => {})
  536. },
  537. // 处理停止任务
  538. deleteHandle(id) {
  539. var deleteHandle = id
  540. ? [id]
  541. : this.dataListSelections.map((item) => {
  542. return item.deleteHandle;
  543. });
  544. MessageBox.confirm(
  545. `确定对[id=${deleteHandle.join(",")}]进行[${
  546. id ? "停止" : "批量停止"
  547. }]操作?`,
  548. "提示",
  549. {
  550. confirmButtonText: "确定",
  551. cancelButtonText: "取消",
  552. type: "warning",
  553. }
  554. )
  555. .then(() => {
  556. this.$http({
  557. url: this.$http.adornUrl("/algs/delete"),
  558. method: "post",
  559. data: this.$http.adornData(deleteHandle, false),
  560. }).then(({ data }) => {
  561. if (data && data.code === 0) {
  562. Message({
  563. message: "操作成功",
  564. type: "success",
  565. duration: 1500,
  566. onClose: () => {
  567. this.getDataList();
  568. },
  569. });
  570. this.pageIndex = 1;
  571. getDataList();
  572. } else {
  573. Message.error(data.msg);
  574. }
  575. });
  576. })
  577. .catch(() => {});
  578. },
  579. //处理删除任务
  580. deleteMissHandle(id) {
  581. MessageBox.confirm('此操作将删除该算法任务, 是否继续?', '提示', {
  582. confirmButtonText: '确定',
  583. cancelButtonText: '取消',
  584. type: 'warning'
  585. }).then(() => {
  586. this.loading=true;
  587. this.$http({
  588. url:this.$http.adornUrl('/algstrain/deleteById'),
  589. method:'get',
  590. params:this.$http.adornParams({
  591. algorithmTrainingId:id
  592. }),
  593. }).then(({data})=>{
  594. this.getDataList();
  595. Message({
  596. type: 'success',
  597. message: '删除成功!'
  598. });
  599. this.loading=false;
  600. });
  601. }).catch(() => {
  602. Message({
  603. type: 'info',
  604. message: '已取消删除'
  605. });
  606. });
  607. },
  608. },
  609. };
  610. </script>
  611. <style scoped>
  612. .divi {
  613. display: block;
  614. height: 1px;
  615. width: 100%;
  616. margin: 24px 0;
  617. background-color: #dcdfe6;
  618. position: relative;
  619. }
  620. .divi2 {
  621. display: block;
  622. height: 1px;
  623. width: 100%;
  624. position: relative;
  625. }
  626. .sele {
  627. border: 1px solid #409eff;
  628. border-radius: 5px;
  629. box-sizing: border-box;
  630. padding: 5px 0px;
  631. margin: 10px;
  632. }
  633. .warningButton{
  634. color: #F56C6C;
  635. }
  636. </style>