algcreate1.vue 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394
  1. <!-- -->
  2. <template>
  3. <div class=''>
  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-algs'}">算法管理</el-breadcrumb-item>
  7. <el-breadcrumb-item>新建传统算法</el-breadcrumb-item>
  8. </el-breadcrumb>
  9. <el-divider class="divi"></el-divider>
  10. <el-form :model="dataForm" :rules="dataRule" ref="dataForm" @keyup.enter.native="dataFormSubmit()"
  11. label-width="180px">
  12. <el-form-item label="传统算法名称" prop="algorithmName">
  13. <el-input v-model="dataForm.algorithmName" placeholder="请输入传统算法名称"></el-input>
  14. </el-form-item>
  15. <el-form-item label="类别" size="mini" prop="categoryId">
  16. <el-radio-group v-model="dataForm.categoryId">
  17. <el-radio v-for="category in categoryList" :key="category.categoryId" :label="category.categoryId">
  18. {{ category.categoryName }}
  19. </el-radio>
  20. </el-radio-group>
  21. </el-form-item>
  22. <el-form-item label="文件" size="mini">
  23. <el-upload
  24. class="upload-demo"
  25. action=""
  26. :before-remove="beforeRemove"
  27. multiple
  28. :limit="10"
  29. :on-exceed="handleExceed"
  30. :on-change="fileChange"
  31. :file-list="fileList"
  32. :auto-upload="false">
  33. <el-button size="small" type="primary">点击上传</el-button>
  34. <div slot="tip" class="el-upload__tip">请上传代码文件</div>
  35. </el-upload>
  36. </el-form-item>
  37. <el-form-item label="选择数据集:">
  38. <el-select v-model="datasetSelected" multiple placeholder="选择数据集">
  39. <el-option-group v-for="group in datasetOptions" :key="group.label" :label="group.label">
  40. <el-option
  41. v-for="item in group.dataset"
  42. :key="item.filename"
  43. :label="item.filename"
  44. :value="item.filename"
  45. >
  46. </el-option>
  47. </el-option-group>
  48. </el-select>
  49. </el-form-item>
  50. <!-- 算法参数设置 -->
  51. <el-form-item
  52. v-for="(algParameter, index) in dataForm.algParameters"
  53. :label="'输入参数' + (index+1)"
  54. :key="algParameter.key"
  55. :prop="'algParameters.' + index + '.value'"
  56. >
  57. <el-input v-model="algParameter.label" placeholder="请输入参数名"></el-input>
  58. <el-select v-model="algParameter.type" placeholder="请选择参数类别">
  59. <el-option
  60. v-for="item in algParameterOptions"
  61. :key="item.value"
  62. :label="item.label"
  63. :value="item.value">
  64. </el-option>
  65. </el-select>
  66. <el-button @click.prevent="removealgParameter(algParameter)">删除</el-button>
  67. </el-form-item>
  68. <el-form-item>
  69. <el-button @click="addalgParameter">新增输入参数</el-button>
  70. </el-form-item>
  71. <!-- 算法输出结果 -->
  72. <el-form-item
  73. v-for="(algResult, index) in dataForm.algResults"
  74. :label="'输出结果' + (index+1)"
  75. :key="algResult.key"
  76. :prop="'algResults.' + index + '.value'"
  77. >
  78. <el-input v-model="algResult.label" placeholder="请输入算法结果名"></el-input>
  79. <el-input v-model="algResult.value" placeholder="请输入算法结果文件名"></el-input>
  80. <!-- <el-select v-model="algResult.type" placeholder="请选择算法结果类别">
  81. <el-option
  82. v-for="item in algResultOptions"
  83. :key="item.value"
  84. :label="item.label"
  85. :value="item.value">
  86. </el-option>
  87. </el-select> -->
  88. <el-button @click.prevent="removealgResult(algResult)">删除</el-button>
  89. </el-form-item>
  90. <el-form-item>
  91. <el-button @click="addalgResult">新增算法输出</el-button>
  92. </el-form-item>
  93. <el-form-item label="描述信息" prop="remark">
  94. <el-input type="textarea" :autosize="{ minRows: 4, maxRows: 6}" placeholder="请输入内容" v-model="dataForm.remark">
  95. </el-input>
  96. </el-form-item>
  97. <!-- <el-form-item label="状态" size="mini" prop="status">
  98. <el-radio-group v-model="dataForm.status">
  99. <el-radio :label="0">禁用</el-radio>
  100. <el-radio :label="1">正常</el-radio>
  101. </el-radio-group>
  102. </el-form-item> -->
  103. <el-form-item style="float:right">
  104. <el-button @click="visible = false;redirectHandle()">取消</el-button>
  105. <el-button type="primary" @click="dataFormSubmit()">确定</el-button>
  106. </el-form-item>
  107. </el-form>
  108. </div>
  109. </template>
  110. <script>
  111. //这里可以导入其他文件(比如:组件,工具js,第三方插件js,json文件,图片文件等等)
  112. //例如:import 《组件名称》 from '《组件路径》';
  113. import { MessageBox } from 'element-ui'
  114. import { Message } from "element-ui"
  115. export default {
  116. created() {
  117. this.init();
  118. },
  119. data() {
  120. return {
  121. visible: false,
  122. // 获取所有类别列表
  123. categoryList: [],
  124. dataForm: {
  125. id: 0,
  126. algorithmName: "",
  127. categoryId: 1,
  128. algParameters:[
  129. {label:'',type:''}
  130. ],
  131. algResults:[
  132. {label:'',value:''}
  133. ],
  134. remark: "",
  135. },
  136. textarea2: "",
  137. fileList: [
  138. ],
  139. dataRule: {
  140. algorithmName: [
  141. { required: true, message: "名称不能为空", trigger: "blur" },
  142. ],
  143. },
  144. algParameterOptions:[
  145. {
  146. value: 'int',
  147. label: 'int'
  148. }, {
  149. value: 'string',
  150. label: 'string'
  151. }, {
  152. value: 'list',
  153. label: 'list'
  154. }
  155. ],
  156. algResultOptions:[
  157. {
  158. value: 'file',
  159. label: 'file'
  160. }
  161. ],
  162. datasetOptions: [
  163. {
  164. label:'静态数据集',
  165. dataset:[]
  166. },{
  167. label:'动态数据集',
  168. dataset:[]
  169. }
  170. ],
  171. datasetSelected: [],
  172. };
  173. },
  174. methods: {
  175. init() {
  176. this.dataForm.id = 0;
  177. this.fileList=[];
  178. this.$http({
  179. url: this.$http.adornUrl("/category/select"),
  180. method: "get",
  181. params: this.$http.adornParams(),
  182. })
  183. // 这块修改为获取类别
  184. .then(({ data }) => {
  185. this.categoryList = data && data.code === 0 ? data.list : [];
  186. })
  187. .then(() => {
  188. this.visible = true;
  189. this.$nextTick(() => {
  190. this.$refs["dataForm"].resetFields();
  191. });
  192. })
  193. // 这部分用不到
  194. .then(() => {
  195. if (this.dataForm.id) {
  196. this.$http({
  197. url: this.$http.adornUrl(`/algs/models/info/${this.dataForm.id}`),
  198. method: "get",
  199. params: this.$http.adornParams(),
  200. }).then(({ data }) => {
  201. if (data && data.code === 0) {
  202. this.dataForm.algorithmName = data.model.algorithmName;
  203. this.dataForm.categoryId = data.model.categoryId;
  204. this.dataForm.remark = data.model.remark;
  205. // 模板文件地址
  206. // this.dataForm.dfsUrlv = data.temp.dfsUrlv;
  207. }
  208. });
  209. }
  210. });
  211. //这块为获取所有静态数据集
  212. this.$http({
  213. url: this.$http.adornUrl("/dataset/listAll"),
  214. method: "get",
  215. params: this.$http.adornParams({
  216. }),
  217. }).then(({ data }) => {
  218. if (data && data.code === 0) {
  219. this.datasetOptions[0].dataset = data.list;
  220. } else {
  221. this.datasetOptions[0] = [];
  222. }
  223. });
  224. //这块为获取所有动态数据集
  225. this.$http({
  226. url: this.$http.adornUrl("/dataset/listAllDyDataset"),
  227. method: "get",
  228. params: this.$http.adornParams({
  229. }),
  230. }).then(({ data }) => {
  231. if (data && data.code === 0) {
  232. this.datasetOptions[1].dataset = data.list;
  233. } else {
  234. this.datasetOptions[1] = [];
  235. }
  236. });
  237. },
  238. redirectHandle(){
  239. this.$router.replace({ path: "/alg-algs" });
  240. },
  241. //新增算法参数
  242. addalgParameter(){
  243. this.dataForm.algParameters.push({
  244. type:'',
  245. key:Date.now()
  246. });
  247. },
  248. //新增算法结果
  249. addalgResult(){
  250. this.dataForm.algResults.push({
  251. value:'',
  252. key:Date.now()
  253. });
  254. },
  255. //删除算法参数
  256. removealgParameter(item){
  257. var index = this.dataForm.algParameters.indexOf(item)
  258. if (index !== -1) {
  259. this.dataForm.algParameters.splice(index, 1)
  260. }
  261. },
  262. //删除算法结果
  263. removealgResult(item){
  264. var index = this.dataForm.algResults.indexOf(item)
  265. if (index !== -1) {
  266. this.dataForm.algResults.splice(index, 1)
  267. }
  268. },
  269. // 表单提交
  270. dataFormSubmit() {
  271. var algParameterNames=[];
  272. var algParameterTypes=[];
  273. var algResultNames=[];
  274. var algResultValues=[];
  275. for(var i=0;i<this.dataForm.algParameters.length;i++){
  276. algParameterNames.push(this.dataForm.algParameters[i].label);
  277. algParameterTypes.push(this.dataForm.algParameters[i].type);
  278. }
  279. for(var i=0;i<this.dataForm.algResults.length;i++){
  280. algResultNames.push(this.dataForm.algResults[i].label);
  281. algResultValues.push(this.dataForm.algResults[i].value);
  282. }
  283. this.$refs["dataForm"].validate((valid) => {
  284. if (valid) {
  285. MessageBox.confirm(`是否新建传统算法?`, '提示', {
  286. confirmButtonText: '确定',
  287. cancelButtonText: '取消',
  288. type: 'warning'
  289. }).then(() => {
  290. let formData=new FormData();
  291. this.fileList.forEach(file=>{
  292. formData.append('file',file.raw);
  293. });
  294. formData.append("algorithmId",undefined);
  295. formData.append("algorithmName",this.dataForm.algorithmName);
  296. formData.append("remark",this.dataForm.remark);
  297. formData.append("categoryId",this.dataForm.categoryId);
  298. formData.append("uid",this.$store.state.user.id);
  299. formData.append("frameId",-1);
  300. formData.append("number",1);
  301. formData.append("dataSets",this.datasetSelected);
  302. formData.append("algParameterName",algParameterNames);
  303. formData.append("algParameterTypes",algParameterTypes);
  304. formData.append("algResultNames",algResultNames);
  305. formData.append("algResultLocations",algResultValues)
  306. this.$http({
  307. url: this.$http.adornUrl(
  308. `/algs/${!this.dataForm.id ? "save" : "update"}`
  309. ),
  310. method: "post",
  311. data:formData,
  312. }).then(({ data }) => {
  313. if (data && data.code === 0) {
  314. Message({
  315. message: "操作成功",
  316. type: "success",
  317. duration: 1500,
  318. onClose: () => {
  319. this.visible = false;
  320. this.$emit("refreshDataList");
  321. },
  322. });
  323. this.$router.replace({ path: "/alg-algs" });
  324. } else {
  325. Message.error(data.msg);
  326. }
  327. });
  328. }).catch(() => {})
  329. }
  330. });
  331. },
  332. // 以下4个函数是文件上传功能的
  333. handleExceed(files, fileList) {
  334. Message.warning(
  335. `当前限制选择 3 个文件,本次选择了 ${files.length} 个文件,共选择了 ${
  336. files.length + fileList.length
  337. } 个文件`
  338. );
  339. },
  340. beforeRemove(file, fileList) {
  341. return MessageBox.confirm(`确定移除 ${file.name}?`);
  342. },
  343. // 文件改变时
  344. fileChange(file, fileList) {
  345. this.fileList.push(file);
  346. },
  347. },
  348. };
  349. </script>
  350. <style>
  351. .divi {
  352. display: block;
  353. height: 1px;
  354. width: 100%;
  355. margin: 24px 0;
  356. background-color: #dcdfe6;
  357. position: relative;
  358. }
  359. .divi2 {
  360. display: block;
  361. height: 1px;
  362. width: 100%;
  363. position: relative;
  364. }
  365. .sele {
  366. border: 1px solid #409eff;
  367. border-radius: 5px;
  368. box-sizing: border-box;
  369. padding: 5px 0px;
  370. margin: 10px;
  371. }
  372. .el-input {
  373. width: 250px;
  374. }
  375. </style>