step-experience-form.vue 8.3 KB

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