experience-form.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267
  1. <template>
  2. <div class="edit">
  3. <el-form ref="form" :rules="rules" :model="item" label-width="147px">
  4. <div class="header">
  5. <!-- <el-date-picker
  6. v-model="item.date"
  7. type="daterange"
  8. range-separator="至"
  9. start-placeholder="开始日期"
  10. end-placeholder="结束日期"
  11. value-format="yyyy-MM-dd"
  12. ></el-date-picker>-->
  13. <date-range class="range" v-model="item.date"></date-range>
  14. <el-select
  15. v-model="item.company"
  16. allow-create
  17. filterable
  18. remote
  19. reserve-keyword
  20. placeholder="请输入公司名称"
  21. :remote-method="fetchCompany"
  22. :loading="loadingCompany"
  23. >
  24. <el-option
  25. v-for="item in companys"
  26. :key="item.label"
  27. :label="item.label"
  28. :value="item.label"
  29. ></el-option>
  30. </el-select>
  31. <el-select
  32. v-model="item.title"
  33. allow-create
  34. filterable
  35. remote
  36. reserve-keyword
  37. placeholder="请输入职位"
  38. :remote-method="fetchTitle"
  39. :loading="loadingTitle"
  40. >
  41. <el-option
  42. v-for="item in titles"
  43. :key="item.label"
  44. :label="item.label"
  45. :value="item.label"
  46. ></el-option>
  47. </el-select>
  48. <span class="opts">
  49. <el-button type="danger" @click="handleDelete(item, idx)">删除</el-button>
  50. <el-button type="info" @click="handleCancel(item, idx)">取消</el-button>
  51. <el-button type="primary" @click="handleConfirm(item, idx)">保存</el-button>
  52. </span>
  53. </div>
  54. <div class="content">
  55. <el-input
  56. type="textarea"
  57. :rows="7"
  58. placeholder="请从主要工作内容、成就等方面,描述你的工作经历,字数不少于60字符"
  59. v-model="item.description"
  60. ></el-input>
  61. <uploader
  62. :imageUrl="item.work_certify_img"
  63. title="工作证明"
  64. @change="val => handleImageUrl(idx, val)"
  65. ></uploader>
  66. </div>
  67. <footer>
  68. <p>注:有效的工作证明包括:工牌/入职通知邮件/在职证明/公司邮箱截图/公司获奖证书/钉钉截图/离职证明/社保公积金证明等(其中之一即可,截图中需同时出现公司信息和个人信息,才能作为有效工作证明,并与目前公司相一致)</p>
  69. </footer>
  70. </el-form>
  71. </div>
  72. </template>
  73. <script>
  74. import uploader from "@/components/uploader";
  75. import dateRange from "@/components/date-range";
  76. export default {
  77. props: ["idx", "item", "handleDelete", "handleCancel", "handleConfirm"],
  78. components: {
  79. uploader,
  80. dateRange
  81. },
  82. data() {
  83. return {
  84. rules: {
  85. // date: [
  86. // {
  87. // required: true,
  88. // message: "请设置开始时间/结束时间",
  89. // trigger: "change"
  90. // }
  91. // ],
  92. // company: [
  93. // {
  94. // required: true,
  95. // message: "请设置公司名称/职位",
  96. // trigger: "change"
  97. // }
  98. // ],
  99. // title: [
  100. // {
  101. // required: true,
  102. // message: "请设置公司名称/职位",
  103. // trigger: "change"
  104. // }
  105. // ],
  106. // description: [
  107. // { min: 60, message: "经历描述不少于60字符", trigger: "blur" }
  108. // ]
  109. name: [
  110. {
  111. required: true,
  112. message: "作品名称不得为空",
  113. trigger: "blur"
  114. },
  115. { max: 50, message: "作品名称不得超过50字符", trigger: "blur" },
  116. {
  117. validator: (rule, value, callback) => {
  118. if (/[&¥%\/\*]+/.test(value)) {
  119. callback(new Error("作品名称不包含特殊字符"));
  120. } else {
  121. callback();
  122. }
  123. },
  124. trigger: "blur"
  125. }
  126. ],
  127. description: [
  128. {
  129. required: true,
  130. message: "作品简介不得为空",
  131. trigger: "blur"
  132. },
  133. { min: 60, message: "作品简介不得低于60字符", trigger: "blur" }
  134. ],
  135. industry_id: [
  136. {
  137. required: true,
  138. message: "行业类型不得为空",
  139. trigger: "change"
  140. }
  141. ],
  142. function_ops: [
  143. {
  144. required: true,
  145. message: "关键功能不得为空",
  146. trigger: "change"
  147. }
  148. ],
  149. duty: [
  150. {
  151. required: true,
  152. message: "作品职责不得为空",
  153. trigger: "blur"
  154. },
  155. { min: 15, message: "作品职责不得低于15字符", trigger: "blur" },
  156. { max: 200, message: "作品职责不得高于200字符", trigger: "blur" }
  157. ]
  158. },
  159. companys: [],
  160. loadingCompany: false,
  161. titles: [],
  162. loadingTitle: false
  163. };
  164. },
  165. computed: {},
  166. async mounted() {},
  167. methods: {
  168. async handleSubmit(idx) {
  169. this.$refs["form"].validate(async valid => {
  170. if (valid) {
  171. console.log("submit!", this.item);
  172. const item = this.item;
  173. this.onSubmit(this.item, idx);
  174. } else {
  175. console.log("error submit!!");
  176. return false;
  177. }
  178. });
  179. },
  180. async fetchCompany(keyword) {
  181. this.loadingCompany = true;
  182. const res = await this.$axios.$post("/api/simple_data/select_company", {
  183. keyword
  184. });
  185. this.loadingCompany = false;
  186. const data = res.data || [];
  187. this.companys = data.map(it => ({ value: it.id, label: it.name }));
  188. },
  189. async fetchTitle(keyword) {
  190. this.loadingTitle = true;
  191. const res = await this.$axios.$post("/api/simple_data/select_title", {
  192. keyword
  193. });
  194. this.loadingTitle = false;
  195. const data = res.data || [];
  196. this.titles = data.map(it => ({ value: it.id, label: it.name }));
  197. },
  198. handleImageUrl(idx, url) {
  199. this.item.work_certify_img = url;
  200. }
  201. }
  202. };
  203. </script>
  204. <style lang="scss" scoped>
  205. .edit {
  206. padding: 20px;
  207. > form {
  208. .header {
  209. display: flex;
  210. justify-content: space-between;
  211. align-items: center;
  212. margin-bottom: 10px;
  213. }
  214. .opts {
  215. display: flex;
  216. align-items: center;
  217. .el-button {
  218. margin-left: 5px;
  219. }
  220. }
  221. .el-select,
  222. .el-input {
  223. width: 136px;
  224. margin-right: 10px;
  225. .el-input--suffix .el-input__inner {
  226. padding-right: 0;
  227. }
  228. }
  229. .to {
  230. margin-right: 10px;
  231. }
  232. .times {
  233. .el-checkbox {
  234. width: 88px;
  235. }
  236. .el-input {
  237. width: 136px;
  238. }
  239. }
  240. .content {
  241. display: flex;
  242. justify-content: space-between;
  243. align-items: flex-start;
  244. margin-top: 10px;
  245. .el-textarea {
  246. display: flex;
  247. width: 766px;
  248. height: 162px;
  249. }
  250. }
  251. }
  252. footer {
  253. margin-top: 10px;
  254. p {
  255. margin-top: 15px;
  256. width: 766px;
  257. font-size: 12px;
  258. font-family: PingFangSC-Regular;
  259. font-weight: 400;
  260. color: rgba(145, 154, 167, 1);
  261. line-height: 17px;
  262. }
  263. }
  264. }
  265. </style>