experience-form.vue 7.5 KB

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