step-skills.vue 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386
  1. <template>
  2. <div class="sign-new-skills" id="skill">
  3. <header class="sign-new-header">
  4. <div class="sign-new-header-title">技能</div>
  5. <span>
  6. <el-button @click="handleAdd" type="text" icon="el-icon-plus"
  7. >添加</el-button
  8. >
  9. </span>
  10. </header>
  11. <div v-if="skills.length > 0">
  12. <template v-for="(item, idx) in skills">
  13. <div
  14. v-if="editingItem.indexOf(idx) < 0"
  15. :key="item.skill_name"
  16. class="show"
  17. >
  18. <h4>
  19. <span>{{
  20. `技能名称: ${item.skill_name} 经验自评:${item.skill_level}分 `
  21. }}</span>
  22. <el-button @click="editItem(idx)" type="text">编辑</el-button>
  23. </h4>
  24. </div>
  25. <div v-else :key="`skill_${item.skill_id}`" class="edit">
  26. <el-form
  27. ref="form"
  28. :rules="rules"
  29. :model="item"
  30. label-width="80px"
  31. label-position="left"
  32. >
  33. <div class="header">
  34. <el-form-item label="技能名称:" prop="skill_name">
  35. <el-cascader
  36. v-model="item.skill_name"
  37. :show-all-levels="false"
  38. :placeholder="item.skill_name || '请选择单个技能'"
  39. :options="skillList"
  40. :props="{ expandTrigger: 'hover', emitPath: 'false' }"
  41. />
  42. </el-form-item>
  43. <el-form-item label="经验自评:" prop="skill_level">
  44. <el-select
  45. :style="{ width: '130px' }"
  46. v-model="item.skill_level"
  47. placeholder="选择分数"
  48. >
  49. <el-option
  50. v-for="level in 5"
  51. :label="`${level}分`"
  52. :key="level"
  53. :value="level"
  54. ></el-option>
  55. </el-select>
  56. </el-form-item>
  57. <span class="tips">1分为新入门,5分为满分</span>
  58. </div>
  59. </el-form>
  60. <div class="sign-new-skill-btn">
  61. <span class="opts">
  62. <el-button type="danger" @click="handleDelete(item, idx)"
  63. >删除</el-button
  64. >
  65. <el-button type="info" @click="handleCancel(item, idx)"
  66. >取消</el-button
  67. >
  68. <el-button type="primary" @click="onSubmit(item, idx)"
  69. >保存</el-button
  70. >
  71. </span>
  72. </div>
  73. </div>
  74. </template>
  75. </div>
  76. <div v-else class="empty">点击右上角“添加”按钮添加技能</div>
  77. </div>
  78. </template>
  79. <script>
  80. import uploader from "@/components/uploader";
  81. import instance from "../../plugins/axios";
  82. export default {
  83. data() {
  84. return {
  85. // editing: true,
  86. editingItem: [],
  87. rules: {
  88. // skill_name: [{ required: true, message: "请输入技能全名", trigger: "blur" }]
  89. },
  90. init: {
  91. skill_name: "123",
  92. skill_level: "",
  93. skill_id: ""
  94. },
  95. skills: [
  96. // {
  97. // skill_name: "Javscript",
  98. // skill_level: "5"
  99. // }
  100. ],
  101. originSkills: [],
  102. current: null,
  103. skillList: [],
  104. loadingSkill: false
  105. };
  106. },
  107. components: {
  108. uploader
  109. },
  110. computed: {},
  111. watch: {},
  112. async mounted() {
  113. this.getData();
  114. this.fetchSkill();
  115. },
  116. methods: {
  117. async getData() {
  118. let res = await this.$axios.$post("/api/user_skills/list_by_user");
  119. this.skills = res.data || [];
  120. },
  121. async onSubmit(item, idx) {
  122. this.cnzz("签约", "签约页面+技能保存", "");
  123. console.log("submit!", item);
  124. if (!item.skill_name) {
  125. this.$message.error("请填写技能名称!");
  126. return;
  127. }
  128. if (!item.skill_level) {
  129. this.$message.error("请选择技能自评!");
  130. return;
  131. }
  132. if (item.skill_name.indexOf(",") > -1) {
  133. const skills = item.skill_name.split(",");
  134. console.log(skills);
  135. item.skill_name = skills[skills.length - 1];
  136. console.log("--------------", item.skill_name);
  137. }
  138. if (item.skill_name instanceof Array && item.skill_name.length > 0) {
  139. item.skill_name = item.skill_name[item.skill_name.length - 1];
  140. }
  141. const data = {
  142. skill_level: item.skill_level,
  143. skill_name: item.skill_name
  144. };
  145. if (item.skill_id) {
  146. data.skill_id = item.skill_id;
  147. }
  148. if (item.id) {
  149. data.id = item.id;
  150. }
  151. const res = await this.$axios.$post("/api/user_skills/save", data);
  152. if (res.status === 1) {
  153. this.$message.success("保存成功!");
  154. this.init = {
  155. skill_name: "",
  156. skill_level: "",
  157. skill_id: ""
  158. };
  159. this.editingItem = [];
  160. this.originSkills.splice(idx, 1, item);
  161. } else {
  162. // this.$message.error(res.info);
  163. }
  164. },
  165. async fetchSkill(keyword) {
  166. this.loadingSkill = true;
  167. const res = await this.$axios.$post("api/userSkills/getSkillList", {
  168. keyword
  169. });
  170. this.loadingSkill = false;
  171. const data = res.data || [];
  172. this.skillList = data.map(it => {
  173. let children = [];
  174. if (it.child && it.child.length > 0)
  175. children = it.child.map(child => ({
  176. label: child.skill_name,
  177. value: child.skill_name
  178. }));
  179. return {
  180. value: it.occupation_name,
  181. label: it.occupation_name,
  182. children: children
  183. };
  184. });
  185. },
  186. handleAdd() {
  187. if (this.editingItem.length > 0 && !this.skills[this.editingItem[0]].id) {
  188. this.$message.error("请先保存现有修改");
  189. return;
  190. }
  191. this.skills.push(this.init);
  192. this.editingItem = [this.skills.length - 1];
  193. },
  194. async handleDelete(item, idx) {
  195. const deleteComplete = () => {
  196. this.$message({
  197. type: "success",
  198. message: "删除成功!"
  199. });
  200. this.skills.splice(idx, 1);
  201. this.editingItem = [];
  202. };
  203. this.$confirm("确认删除该技能?", "提示", {
  204. confirmButtonText: "确定",
  205. cancelButtonText: "取消",
  206. type: "warning"
  207. })
  208. .then(async () => {
  209. if (item.id) {
  210. const res = await this.$axios.$post("/api/user_skills/delete", {
  211. id: item.id
  212. });
  213. if (res.status === 1) {
  214. deleteComplete();
  215. this.getData();
  216. }
  217. } else {
  218. deleteComplete();
  219. }
  220. })
  221. .catch(err => {
  222. console.log(err);
  223. this.$message({
  224. type: "info",
  225. message: "已取消删除"
  226. });
  227. });
  228. },
  229. handleCancel(item, idx) {
  230. this.editingItem = [];
  231. if (!item.skill_id) {
  232. this.skills.splice(idx, 1);
  233. }
  234. },
  235. editItem(idx) {
  236. console.log("editItem:" + idx);
  237. this.editingItem = [idx];
  238. }
  239. }
  240. };
  241. </script>
  242. <style lang="scss" scoped>
  243. .sign-new-skills {
  244. header .el-icon-plus {
  245. font-size: 18px;
  246. }
  247. .edit {
  248. padding: 20px 0;
  249. .header {
  250. display: flex;
  251. align-items: center;
  252. .tips {
  253. margin-right: 5px;
  254. }
  255. }
  256. > form {
  257. .el-form-item {
  258. margin-bottom: 0;
  259. }
  260. .header {
  261. display: flex;
  262. justify-content: space-between;
  263. align-items: center;
  264. margin-bottom: 10px;
  265. }
  266. .opts {
  267. display: flex;
  268. align-items: center;
  269. .el-button {
  270. margin-left: 5px;
  271. }
  272. }
  273. .el-select,
  274. .el-input {
  275. width: 136px;
  276. margin-right: 10px;
  277. .el-input--suffix .el-input__inner {
  278. padding-right: 0;
  279. }
  280. }
  281. .to {
  282. margin-right: 10px;
  283. }
  284. .times {
  285. .el-checkbox {
  286. width: 88px;
  287. }
  288. .el-input {
  289. width: 136px;
  290. }
  291. }
  292. .content {
  293. display: flex;
  294. justify-content: space-between;
  295. align-items: flex-start;
  296. margin-top: 10px;
  297. .el-textarea {
  298. display: flex;
  299. width: 766px;
  300. height: 162px;
  301. }
  302. }
  303. }
  304. }
  305. .show {
  306. padding: 23px 0 23px 0;
  307. border-bottom: 1px solid #ebeef5;
  308. &:last-of-type {
  309. border: 0;
  310. }
  311. h4 {
  312. display: flex;
  313. justify-content: space-between;
  314. height: 44px;
  315. font-size: 14px;
  316. font-family: PingFangSC-Medium;
  317. font-weight: 500;
  318. /* color: #308eff; */
  319. line-height: 44px;
  320. }
  321. p {
  322. margin-top: 8px;
  323. font-size: 14px;
  324. font-family: PingFangSC-Regular;
  325. font-weight: 400;
  326. color: rgba(102, 102, 102, 1);
  327. line-height: 24px;
  328. }
  329. }
  330. .empty {
  331. margin: 112px auto 104px;
  332. font-size: 27px;
  333. font-family: PingFangSC-Regular;
  334. font-weight: 400;
  335. text-align: center;
  336. color: rgba(205, 205, 205, 1);
  337. line-height: 38px;
  338. }
  339. footer p {
  340. margin-top: 15px;
  341. width: 766px;
  342. font-size: 12px;
  343. font-family: PingFangSC-Regular;
  344. font-weight: 400;
  345. color: rgba(145, 154, 167, 1);
  346. line-height: 17px;
  347. }
  348. }
  349. .sign-new-skill-btn {
  350. margin-top: 24px;
  351. text-align: right;
  352. }
  353. </style>
  354. <style lang="scss">
  355. .sign-new-skills {
  356. .el-form-item__label {
  357. line-height: 40px;
  358. }
  359. }
  360. </style>