train-create-tradition.vue 13 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421
  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 :to="{ path: '/alg-train'}">算法任务</el-breadcrumb-item>
  7. <el-breadcrumb-item>新建算法任务</el-breadcrumb-item>
  8. </el-breadcrumb>
  9. <el-divider class="divi"></el-divider>
  10. <el-tabs v-model="activeName">
  11. <el-tab-pane label="信息选择" name="first">
  12. <el-form :model="dataForm" :rules="dataRule" ref="dataForm" label-width="180px">
  13. <el-form-item label="算法任务名称" prop="missName">
  14. <el-input v-model="dataForm.missName" placeholder="请输入算法任务名称" @change="missNameChange()"></el-input>
  15. </el-form-item>
  16. <el-form-item label="选择类别" prop="calssSelected">
  17. <el-select v-model="dataForm.calssSelected" placeholder="选择类别" @change="getAlgs(dataForm.calssSelected)">
  18. <el-option v-for="data in classification" :key="data.categoryName" :label="data.categoryName" :value="data.categoryName">
  19. </el-option>
  20. </el-select>
  21. </el-form-item>
  22. <el-form-item label="选择算法" prop="algSelected">
  23. <el-select v-model="dataForm.algSelected" placeholder="选择算法" @change="getFiles()">
  24. <el-option v-for="data in algs" :key="data.algorithmId" :label="data.algorithmName" :value="data.algorithmId">
  25. </el-option>
  26. </el-select>
  27. </el-form-item>
  28. <el-form-item label="指定主运行文件" prop="fileSelected">
  29. <el-select v-model="dataForm.fileSelected" placeholder="选择主运行文件" @change="fileChange()">
  30. <el-option v-for="data in fileList" :key="data.filename" :label="data.filename" :value="data.filename">
  31. </el-option>
  32. </el-select>
  33. </el-form-item>
  34. <el-form-item label="描述信息" prop="remark">
  35. <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 6}" placeholder="请输入内容"
  36. v-model="dataForm.remark">
  37. </el-input>
  38. </el-form-item>
  39. <el-form-item style="float:right">
  40. <el-button type="primary" @click="activeName='second'">下一步</el-button>
  41. </el-form-item>
  42. </el-form>
  43. </el-tab-pane>
  44. <el-tab-pane label="资源设置" name="second">
  45. <el-form :rules="dataRule" ref="dataset" label-width="180px">
  46. <el-form-item label="指定cpu">
  47. <el-select v-model="cpuSelected" multiple placeholder="选择容器运行在哪些cpu上">
  48. <el-option v-for="data in cpus" :key="data.value" :label="data.value" :value="data.value">
  49. </el-option>
  50. </el-select>
  51. </el-form-item>
  52. <el-form-item label="内存大小" prop="memorySelected">
  53. <el-select v-model="dataForm.memorySelected" placeholder="选择内存大小" @change="memoryChange()">
  54. <el-option v-for="data in memorys" :key="data.value" :label="data.label" :value="data.value">
  55. </el-option>
  56. </el-select>
  57. </el-form-item>
  58. <el-form-item style="float:right">
  59. <el-button @click="activeName='first'">返回</el-button>
  60. <el-button type="primary" @click="activeName='third'">下一步</el-button>
  61. </el-form-item>
  62. </el-form>
  63. </el-tab-pane>
  64. <el-tab-pane label="完成" name="third">
  65. <el-form :model="dataForm" :rules="dataRule" ref="dataForm" label-width="180px" :disabled="true">
  66. <el-form-item label="算法任务名称" prop="missName">
  67. <el-input v-model="dataForm.missName" placeholder="请输入算法任务名称"></el-input>
  68. </el-form-item>
  69. <el-form-item label="选择类别" prop="calssSelected">
  70. <el-select v-model="dataForm.calssSelected" placeholder="选择类别">
  71. <el-option v-for="data in classification" :key="data.categoryName" :label="data.categoryName" :value="data.categoryName">
  72. </el-option>
  73. </el-select>
  74. </el-form-item>
  75. <el-form-item label="选择算法" prop="algSelected">
  76. <el-select v-model="dataForm.algSelected" placeholder="选择算法">
  77. <el-option v-for="data in algs" :key="data.algorithmId" :label="data.algorithmName" :value="data.algorithmId">
  78. </el-option>
  79. </el-select>
  80. </el-form-item>
  81. <el-form-item label="指定主运行文件" prop="fileSelected">
  82. <el-select v-model="dataForm.fileSelected" placeholder="选择主运行文件">
  83. <el-option v-for="data in fileList" :key="data.filename" :label="data.filename" :value="data.filename">
  84. </el-option>
  85. </el-select>
  86. </el-form-item>
  87. <el-form-item label="描述信息" prop="remark">
  88. <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 6}" placeholder="请输入内容"
  89. v-model="dataForm.remark">
  90. </el-input>
  91. </el-form-item>
  92. <el-form-item label="指定cpu">
  93. <el-select v-model="cpuSelected" multiple placeholder="选择容器运行在那些cpu上">
  94. <el-option v-for="data in cpus" :key="data.value" :label="data.value" :value="data.value">
  95. </el-option>
  96. </el-select>
  97. </el-form-item>
  98. <el-form-item label="内存大小" prop="memorySelected">
  99. <el-select v-model="dataForm.memorySelected" placeholder="选择内存大小">
  100. <el-option v-for="data in memorys" :key="data.value" :label="data.label" :value="data.value">
  101. </el-option>
  102. </el-select>
  103. </el-form-item>
  104. </el-form>
  105. <el-form>
  106. <el-form-item style="float:right">
  107. <el-button @click="activeName='second'">返回</el-button>
  108. <el-button type="primary" @click="dataFormSubmit()">完成</el-button>
  109. </el-form-item>
  110. </el-form>
  111. </el-tab-pane>
  112. </el-tabs>
  113. </div>
  114. </template>
  115. <script>
  116. //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  117. //例如:import 《组件名称》 from '《组件路径》';
  118. import { MessageBox } from 'element-ui'
  119. import { Message } from "element-ui"
  120. export default {
  121. created() {
  122. this.init();
  123. },
  124. activated() {
  125. this.init();
  126. },
  127. data() {
  128. return {
  129. loading:false,
  130. classification: [],
  131. algs:[],
  132. value1: [],
  133. value2: [],
  134. fileList: [
  135. ],
  136. activeName: "first",
  137. cpuSelected:[],
  138. cpus:[
  139. {
  140. value:0,
  141. },
  142. {
  143. value:1,
  144. }
  145. ],
  146. memorys:[
  147. {
  148. value: 512,
  149. label: "512MB",
  150. },
  151. {
  152. value: 1024,
  153. label: "1GB",
  154. },
  155. {
  156. value: 2048,
  157. label: "2GB",
  158. },
  159. {
  160. value: 4096,
  161. label: "4GB",
  162. },
  163. {
  164. value: 8192,
  165. label: "8GB",
  166. },
  167. ],
  168. visible: false,
  169. dataForm: {
  170. id: 0,
  171. missName: "",
  172. remark: "",
  173. calssSelected:null,
  174. fileSelected:'',
  175. algSelected: null,
  176. memorySelected:null,
  177. },
  178. textarea2: "",
  179. dataRule: {
  180. missName: [
  181. { required: true, message: "名称不能为空", trigger: "blur" },
  182. ],
  183. calssSelected: [
  184. { required: true, message: "类别不能为空", trigger: "blur" },
  185. ],
  186. algSelected: [
  187. { required: true, message: "算法不能为空", trigger: "blur" },
  188. ],
  189. memorySelected: [
  190. { required: true, message: "内存不能为空", trigger: "blur" },
  191. ],
  192. fileSelected: [
  193. { required: true, message: "主运行文件不能为空", trigger: "blur" },
  194. ],
  195. },
  196. };
  197. },
  198. methods: {
  199. init() {
  200. this.activeName="first";
  201. this.dataForm.missName='';
  202. this.dataForm.algSelected=null;
  203. this.dataForm.calssSelected=null,
  204. this.dataForm.fileSelected='',
  205. this.dataForm.memorySelected=null,
  206. this.dataForm.remark='',
  207. this.value1= [];
  208. this.value2= [];
  209. this.cpuSelected=[];
  210. this.dataForm.id = 0;
  211. //获取所有类别选项
  212. this.$http({
  213. url: this.$http.adornUrl("/category/select"),
  214. method: "get",
  215. }).then(({ data }) => {
  216. this.classification = data.list;
  217. });
  218. /* //获取算法
  219. this.$http({
  220. url: this.$http.adornUrl("/algs/list"),
  221. method: "get",
  222. params: this.$http.adornParams({
  223. page: 1,
  224. limit: 10,
  225. algorithmName: "",
  226. }),
  227. }).then(({ data }) => {
  228. this.algs = data.page.list;
  229. }); */
  230. },
  231. redirectHandle() {
  232. this.$router.replace({ path: "/alg-train" });
  233. },
  234. // 表单提交
  235. dataFormSubmit() {
  236. this.$refs["dataForm"].validate((valid) => {
  237. if (valid) {
  238. this.loading=true;
  239. let cpus=this.cpuSelected.join(',');
  240. this.$http({
  241. url: this.$http.adornUrl('/algstrain/save'),
  242. method: "post",
  243. data: this.$http.adornData({
  244. missName: this.dataForm.missName,
  245. classificationtag: this.dataForm.calssSelected,
  246. remark: this.dataForm.remark,
  247. uid: this.$store.state.user.id,
  248. algorithmId:this.dataForm.algSelected,
  249. fileSelected:this.dataForm.fileSelected,
  250. memory:this.dataForm.memorySelected,
  251. setCpus:cpus
  252. }),
  253. }).then(({ data }) => {
  254. if (data && data.code === 0) {
  255. Message({
  256. message: "操作成功",
  257. type: "success",
  258. duration: 1500,
  259. onClose: () => {
  260. this.visible = false;
  261. },
  262. });
  263. this.loading=false;
  264. this.$router.replace({ path: "/alg-train" });
  265. } else {
  266. Message.error(data.msg);
  267. }
  268. });
  269. }
  270. });
  271. },
  272. //当选择的类别改变时,先清空所选算法,再重新获得所选新类别对应的算法
  273. getAlgs(calssSelected){
  274. // console.log(calssSelected);
  275. // this.$refs["dataForm"].validate();
  276. this.dataForm.algSelected=null;
  277. this.dataForm.fileSelected=null;
  278. if (calssSelected != null && calssSelected != "") {
  279. this.$http({
  280. url: this.$http.adornUrl("/algs/selectOnCreateMission"),
  281. method: "get",
  282. params: this.$http.adornParams({
  283. classificationtag: calssSelected,
  284. frameId:-1
  285. }),
  286. }).then(({ data }) => {
  287. if (data && data.code === 0) {
  288. this.algs = data.list;
  289. } else {
  290. this.algs = [];
  291. }
  292. }).catch((e)=>{});
  293. }
  294. },
  295. //当选择的算法改变时,先清空所选文件,再重新获得所选新算法对应的文件
  296. getFiles(){
  297. // this.$refs["dataForm"].validate();
  298. this.dataForm.fileSelected=null;
  299. this.$http({
  300. url: this.$http.adornUrl("/algs/listFiles"),
  301. method: "get",
  302. params: this.$http.adornParams({
  303. algId:this.dataForm.algSelected,
  304. }),
  305. }).then(({ data }) => {
  306. if (data && data.code === 0) {
  307. this.fileList = data.fileList;
  308. } else {
  309. this.fileList = [];
  310. }
  311. });
  312. },
  313. //当训练任务名称改变时,对表单进行验证
  314. missNameChange(){
  315. // this.$refs["dataForm"].validate();
  316. },
  317. //当选择的文件改变时,对表单进行验证
  318. fileChange(){
  319. // this.$refs["dataForm"].validate();
  320. },
  321. //当选择的内存改变时,对表单进行验证
  322. memoryChange(){
  323. // this.$refs["dataForm"].validate();
  324. },
  325. //去重
  326. unique(arr) {
  327. var ss = [];
  328. for (var i = 0; i < arr.length; i++) {
  329. ss[i] = arr[i].categoryName;
  330. }
  331. return Array.from(new Set(ss));
  332. },
  333. // 以下4个函数是文件上传功能的
  334. handleRemove(file, fileList) {
  335. console.log(file, fileList);
  336. },
  337. handlePreview(file) {
  338. console.log(file);
  339. },
  340. handleExceed(files, fileList) {
  341. Message.warning(
  342. `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
  343. files.length + fileList.length
  344. } 个文件`
  345. );
  346. },
  347. beforeRemove(file, fileList) {
  348. return MessageBox.confirm(`确定移除 ${file.name}?`);
  349. },
  350. },
  351. };
  352. </script>
  353. <style scoped>
  354. .divi {
  355. display: block;
  356. height: 1px;
  357. width: 100%;
  358. margin: 24px 0;
  359. background-color: #dcdfe6;
  360. position: relative;
  361. }
  362. .divi2 {
  363. display: block;
  364. height: 1px;
  365. width: 100%;
  366. position: relative;
  367. }
  368. .sele {
  369. border: 1px solid #409eff;
  370. border-radius: 5px;
  371. box-sizing: border-box;
  372. padding: 5px 0px;
  373. margin: 10px;
  374. }
  375. </style>