addTeach.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344
  1. <template>
  2. <div>
  3. <el-alert title="教材信息" :closable="false" class="alert" type="info" />
  4. <el-form
  5. :model="form"
  6. :inline="true"
  7. label-width="120px"
  8. class="form"
  9. ref="form"
  10. >
  11. <el-row>
  12. <el-col :span="12">
  13. <el-form-item
  14. label="教材名称"
  15. prop="name"
  16. :rules="[
  17. {
  18. required: true,
  19. message: '请输入教材名称',
  20. trigger: 'blur',
  21. },
  22. ]"
  23. >
  24. <el-input v-model="form.name" style="width: 260px"></el-input>
  25. </el-form-item>
  26. </el-col>
  27. <el-col :span="12">
  28. <el-form-item
  29. label="适用分部"
  30. prop="organId"
  31. :rules="[
  32. {
  33. required: true,
  34. message: '请选择适用分部',
  35. trigger: 'change',
  36. },
  37. ]"
  38. >
  39. <select-all
  40. style="width: 260px"
  41. v-model.trim="form.organId"
  42. class="organSelect"
  43. filterable
  44. placeholder="请选择分部"
  45. multiple
  46. clearable
  47. >
  48. <el-option
  49. v-for="(item, index) in selects.branchs"
  50. :key="index"
  51. :label="item.name"
  52. :value="item.id"
  53. ></el-option>
  54. </select-all>
  55. </el-form-item>
  56. </el-col>
  57. </el-row>
  58. <el-row>
  59. <el-form-item
  60. label="教材封面图"
  61. prop="coverImg"
  62. :rules="[
  63. {
  64. required: true,
  65. message: '请上传教材封面图',
  66. trigger: 'blur',
  67. },
  68. ]"
  69. label-width="120px"
  70. >
  71. <!-- v-show="!form.coverImg" -->
  72. <upload
  73. class="uploadImg"
  74. v-model="form.coverImg"
  75. :imageWidthM="210"
  76. :imageHeightM="268"
  77. ref="uploadImg"
  78. ></upload>
  79. <!-- <img v-show="form.coverImg" :src="form.coverImg" alt="" width="105px" height="134px" @click="uploadImg"/> -->
  80. <p style="color: red">
  81. 请上传210*268像素,大小2M以内,格式为jpg、png、gif图片
  82. </p>
  83. </el-form-item>
  84. </el-row>
  85. <el-alert
  86. title="教材曲目分类"
  87. :closable="false"
  88. class="alert"
  89. type="info"
  90. />
  91. <div class="treeWrap">
  92. <el-button type="primary" @click="addCate" class="addCateBtn"
  93. >添加分类</el-button
  94. >
  95. <el-tree
  96. :data="form.sysMusicScoreCategoriesList"
  97. node-key="index"
  98. default-expand-all
  99. :expand-on-click-node="false"
  100. draggable
  101. accordion
  102. ref="tree"
  103. :props="treeProps"
  104. :allow-drop="allowDrop"
  105. >
  106. >
  107. <span class="custom-tree-node" slot-scope="{ node, data }">
  108. <span :class="node.level == 1 ? 'title' : ''">{{
  109. node.label
  110. }}</span>
  111. <span>
  112. <i class="el-icon-edit" @click="() => editItem(data)"></i>
  113. <i
  114. class="el-icon-remove-outline"
  115. @click="() => removeItem(node, data)"
  116. ></i>
  117. <i
  118. class="el-icon-circle-plus-outline"
  119. v-if="node.level == 1"
  120. @click="() => appendItem(data)"
  121. ></i>
  122. </span>
  123. </span>
  124. </el-tree>
  125. </div>
  126. </el-form>
  127. </div>
  128. </template>
  129. <script>
  130. import Upload from "@/components/Upload/index";
  131. import {
  132. addsysMusicScore,
  133. getSysMusicScoreDetail,
  134. resetsysMusicScore,
  135. } from "../api";
  136. export default {
  137. props: ["activeRow"],
  138. components: {
  139. Upload,
  140. },
  141. data() {
  142. return {
  143. form: {
  144. organId: [],
  145. name: null,
  146. coverImg: "",
  147. sysMusicScoreCategoriesList: [],
  148. delCategoriesIds: [],
  149. },
  150. index: 0,
  151. treeProps: {
  152. children: "sysMusicScoreCategoriesList",
  153. label: "name",
  154. },
  155. };
  156. },
  157. async mounted() {
  158. await this.$store.dispatch("setBranchs");
  159. if (this.activeRow?.id) {
  160. try {
  161. const res = await getSysMusicScoreDetail({ id: this.activeRow.id });
  162. this.form.name = res.data.name;
  163. this.form.organId = res.data.organId.split(",").map((item) => {
  164. return Number(item);
  165. });
  166. this.form.coverImg = res.data.coverImg;
  167. this.form.sysMusicScoreCategoriesList = this.recursionDate(
  168. res.data.sysMusicScoreCategoriesList
  169. )||[];
  170. } catch (e) {}
  171. }
  172. },
  173. methods: {
  174. // 递归遍历数组
  175. recursionDate(arr) {
  176. // 这里来了
  177. if (arr.length > 0) {
  178. let newArr = [];
  179. for (let i = 0; i < arr.length; i++) {
  180. let obj = {
  181. ...arr[i],
  182. index: arr[i].id,
  183. };
  184. if (
  185. arr[i].sysMusicScoreCategoriesList &&
  186. arr[i].sysMusicScoreCategoriesList.length > 0
  187. ) {
  188. obj.sysMusicScoreCategoriesList = this.recursionDate(
  189. arr[i].sysMusicScoreCategoriesList
  190. );
  191. }
  192. newArr.push(obj);
  193. }
  194. return newArr;
  195. }
  196. },
  197. appendItem(data) {
  198. this.$prompt("请输入教材名称", "提示", {
  199. confirmButtonText: "确定",
  200. cancelButtonText: "取消",
  201. closeOnClickModal: false,
  202. inputPattern: /^.{1,30}$/,
  203. inputErrorMessage: "请输入1到15个汉字或字符",
  204. })
  205. .then(({ value }) => {
  206. this.index += 1;
  207. // this.form.data.push({ index: `xxx${this.index}`, label: value });
  208. const newChild = {
  209. index: `xxx${this.index}`,
  210. name: value,
  211. sysMusicScoreCategoriesList: [],
  212. };
  213. if (!data.sysMusicScoreCategoriesList) {
  214. this.$set(data, "sysMusicScoreCategoriesList", []);
  215. }
  216. data.sysMusicScoreCategoriesList.push(newChild);
  217. })
  218. .catch(() => {});
  219. },
  220. removeItem(node, data) {
  221. const parent = node.parent;
  222. const children = parent.data.sysMusicScoreCategoriesList || parent.data;
  223. const index = children.findIndex((d) => {
  224. this.form.delCategoriesIds.push(data.id);
  225. return d.id === data.id;
  226. });
  227. children.splice(index, 1);
  228. this.form.delCategoriesIds = [...new Set(this.form.delCategoriesIds)];
  229. },
  230. editItem(data) {
  231. this.$prompt("请输入修改的教材曲目名称", "提示", {
  232. confirmButtonText: "确定",
  233. cancelButtonText: "取消",
  234. closeOnClickModal: false,
  235. inputValue: data.name,
  236. inputPattern: /^.{1,30}$/,
  237. inputErrorMessage: "请输入1到15个汉字或字符",
  238. })
  239. .then(({ value }) => {
  240. data.name = value;
  241. // this.form.data.push({ index: `xxx${this.index}`, label: value });
  242. })
  243. .catch(() => {});
  244. },
  245. addCate() {
  246. this.$prompt("请输入教材曲目名称", "提示", {
  247. confirmButtonText: "确定",
  248. cancelButtonText: "取消",
  249. closeOnClickModal: false,
  250. inputPattern: /^.{1,30}$/,
  251. inputErrorMessage: "请输入1到15个汉字或字符",
  252. })
  253. .then(({ value }) => {
  254. this.index += 1;
  255. this.form.sysMusicScoreCategoriesList.push({
  256. index: `xxx${this.index}`,
  257. name: value,
  258. });
  259. })
  260. .catch(() => {});
  261. // this.form.data.push({})
  262. },
  263. addSubmit() {
  264. this.$refs.form.validate(async (flag) => {
  265. if (flag) {
  266. let { organId, delCategoriesIds, ...rest } = this.form;
  267. let obj = {
  268. ...rest,
  269. organId: organId.join(","),
  270. delCategoriesIds: delCategoriesIds.join(","),
  271. };
  272. try {
  273. if (this.activeRow?.id) {
  274. obj.id = this.activeRow.id;
  275. const resut = await resetsysMusicScore(obj);
  276. this.$message.success("修改成功");
  277. this.$emit("getList");
  278. this.$emit("close");
  279. } else {
  280. const resut = await addsysMusicScore(obj);
  281. this.$message.success("添加成功");
  282. this.$emit("getList");
  283. this.$emit("close");
  284. }
  285. } catch (e) {
  286. console.log(e);
  287. }
  288. }
  289. });
  290. },
  291. uploadImg() {
  292. this.$refs.uploadImg.$refs.upload.submit();
  293. },
  294. allowDrop(draggingNode, dropNode, type) {
  295. let flag = true
  296. // console.log(type, dropNode, draggingNode);
  297. if (draggingNode.childNodes.length > 0 && type == "inner") {
  298. flag = false;
  299. } else {
  300. if (dropNode.level != 1&& type == "inner") {
  301. flag = false;
  302. }
  303. }
  304. return flag
  305. },
  306. },
  307. computed: {},
  308. };
  309. </script>
  310. <style lang="scss" scoped>
  311. .alert {
  312. margin-bottom: 20px;
  313. }
  314. .form {
  315. /deep/.el-form-item {
  316. margin-right: 0 !important;
  317. }
  318. }
  319. .addCateBtn {
  320. margin-bottom: 20px;
  321. }
  322. .custom-tree-node {
  323. .title {
  324. font-size: 16px;
  325. }
  326. font-size: 14px;
  327. i {
  328. // font-size: 20px;
  329. margin-left: 5px;
  330. }
  331. }
  332. .uploadImg {
  333. /deep/.avatar {
  334. width: 105px;
  335. height: 134px;
  336. }
  337. }
  338. </style>