profile_cert.js 22 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432
  1. /**
  2. * 账号相关js
  3. *
  4. * @author CaiAoLin
  5. * @date 2018/1/26
  6. * @version
  7. */
  8. $(document).ready(function() {
  9. autoFlashHeight();
  10. $('#addCert').click(function() {
  11. postData('/profile/cert/save', { type: 'add_cert' }, function(result) {
  12. console.log(result);
  13. const html = insertCertHtml(result.total, result.data);
  14. $('#certs').prepend(html);
  15. });
  16. });
  17. $('body').on('click', '#certs .add-jx-btn', function() {
  18. const _self = $(this);
  19. postData('/profile/cert/save', { type: 'add_jx', id: $(this).parents('.one-cert').data('cid') }, function(result) {
  20. console.log(result);
  21. const html = insertJxHtml(result.data, result.jxData);
  22. _self.parents('.pull-right').siblings('.all-jx').prepend(html);
  23. console.log(_self.parents('.pull-right').siblings('.all-jx').children('.one-jx').eq(0).find('.jx-date'));
  24. _self.parents('.pull-right').siblings('.all-jx').children('.one-jx').eq(0).find('.jx-date').datepicker({
  25. onShow: function (res) {
  26. res.$el.attr('readOnly', true);
  27. },
  28. onHide: function (res, animationCompleted) {
  29. if(animationCompleted) {
  30. res.$el.attr('readOnly', false);
  31. const val = res.$el.val();
  32. const oldVal = res.$el.attr('data-old-date') || '';
  33. // 日期格式判断
  34. if (val !== '') {
  35. const valArr = val.split(' ~ ');
  36. for (const v of valArr) {
  37. if (!(isNaN(v) && !isNaN(Date.parse(v)))) {
  38. toastr.error('日期格式有误!');
  39. res.$el.val(oldVal);
  40. if (oldVal === '') {
  41. res.clear();
  42. } else {
  43. const showDate = [];
  44. for (const v of oldVal.split(' ~ ')) {
  45. showDate.push(new Date(v));
  46. }
  47. res.selectDate(new Date(oldVal));
  48. }
  49. return;
  50. }
  51. }
  52. }
  53. if(val !== oldVal) {
  54. const data = {
  55. id: res.$el.parents('.one-cert').data('cid'),
  56. jxid: res.$el.parents('.one-jx').data('jxid'),
  57. key: 'date',
  58. value: val,
  59. };
  60. updateJxDataFun(data);
  61. res.$el.attr('data-old-date', val);
  62. }
  63. }
  64. }
  65. });
  66. });
  67. });
  68. $('body').on('change', '#certs select', function() {
  69. const value = parseInt($(this).val());
  70. const key = $(this).data('type');
  71. const update_data = {
  72. id: $(this).parents('.one-cert').data('cid'),
  73. key,
  74. value,
  75. };
  76. if (key === 'type') {
  77. let html = '';
  78. if (value === 0) {
  79. update_data.other = {
  80. key: 'name',
  81. value: null,
  82. };
  83. html = '<option value="0">请选择</option>';
  84. } else {
  85. update_data.other = {
  86. key: 'name',
  87. value: certSourceConst[showCol4ObjArray(certTypeConst, value, 'value', 'source')][0].value,
  88. };
  89. html = changeSourceHtml(certSourceConst[showCol4ObjArray(certTypeConst, value, 'value', 'source')]);
  90. }
  91. $(this).parents('.one-cert-msg').find('.select-cert-name').html(html);
  92. }
  93. console.log(update_data);
  94. postData('/profile/cert/save', { type: 'update_cert', update_data }, function(result) {
  95. console.log(result);
  96. });
  97. });
  98. function changeSourceHtml(source = []) {
  99. let html = '';
  100. for (const s of source) {
  101. html += `<option value="${s.value}">${s.name}</option>`;
  102. }
  103. return html;
  104. }
  105. $('body').on('change', '#certs .one-cert-msg input[type="text"]', function() {
  106. const value = $(this).val();
  107. const key = $(this).data('type');
  108. const update_data = {
  109. id: $(this).parents('.one-cert').data('cid'),
  110. key,
  111. value,
  112. };
  113. console.log(update_data);
  114. postData('/profile/cert/save', { type: 'update_cert', update_data }, function(result) {
  115. console.log(result);
  116. });
  117. });
  118. $('body').on('change', '#certs .one-jx input[type="text"]', function() {
  119. const value = $(this).val();
  120. const key = $(this).data('type');
  121. const update_data = {
  122. id: $(this).parents('.one-cert').data('cid'),
  123. jxid: $(this).parents('.one-jx').data('jxid'),
  124. key,
  125. value,
  126. };
  127. console.log(update_data);
  128. updateJxDataFun(update_data);
  129. });
  130. // 设置默认值
  131. $('.jx-date').each(function() {
  132. const defaultValue = $(this).val(); // 获取当前元素的 value 属性作为默认值
  133. if (defaultValue) {
  134. // 初始化日期选择器,并设置默认值
  135. const showDate = [];
  136. for (const v of defaultValue.split(' ~ ')) {
  137. showDate.push(new Date(v));
  138. }
  139. $(this).datepicker().data('datepicker').selectDate(showDate);
  140. }
  141. });
  142. $('body .jx-date').datepicker({
  143. onShow: function (res) {
  144. res.$el.attr('readOnly', true);
  145. },
  146. onHide: function (res, animationCompleted) {
  147. if(animationCompleted) {
  148. res.$el.attr('readOnly', false);
  149. const val = res.$el.val();
  150. const oldVal = res.$el.attr('data-old-date') || '';
  151. console.log(val, oldVal);
  152. // 日期格式判断
  153. if (val !== '') {
  154. const valArr = val.split(' ~ ');
  155. for (const v of valArr) {
  156. if (!(isNaN(v) && !isNaN(Date.parse(v)))) {
  157. toastr.error('日期格式有误!');
  158. res.$el.val(oldVal);
  159. if (oldVal === '') {
  160. res.clear();
  161. } else {
  162. const showDate = [];
  163. for (const v of oldVal.split(' ~ ')) {
  164. showDate.push(new Date(v));
  165. }
  166. res.selectDate(new Date(oldVal));
  167. }
  168. return;
  169. }
  170. }
  171. }
  172. if(val !== oldVal) {
  173. const data = {
  174. id: res.$el.parents('.one-cert').data('cid'),
  175. jxid: res.$el.parents('.one-jx').data('jxid'),
  176. key: 'date',
  177. value: val,
  178. };
  179. updateJxDataFun(data);
  180. res.$el.attr('data-old-date', val);
  181. }
  182. }
  183. }
  184. });
  185. $('body').on('click', '#certs .del-cert-btn', function() {
  186. $('#delete-cert-cid').val($(this).attr('data-cid'));
  187. $('#delete-cert-jxid').val($(this).attr('data-jxid'));
  188. if ($(this).attr('data-filename')) {
  189. console.log($(this).attr('data-filename'), $(this).attr('data-jxid'));
  190. const txt = $(this).attr('data-jxid') ? '培训证明:' : '证书附件:';
  191. $('#delete-cert-title').text(txt + $(this).attr('data-filename'));
  192. $('#delete-cert-type').val('file');
  193. } else {
  194. $('#delete-cert-title').text($(this).parents('.modal-header').find('b').text());
  195. $('#delete-cert-type').val('cert');
  196. }
  197. });
  198. $('#delete-cert-btn').click(function() {
  199. const data = {
  200. id: $('#delete-cert-cid').val(),
  201. jxid: $('#delete-cert-jxid').val(),
  202. type: $('#delete-cert-type').val(),
  203. };
  204. console.log(data);
  205. const _self = $(this);
  206. postData('/profile/cert/save', { type: 'del_cert', delete_data: data }, function(result) {
  207. _self.parents('.modal').modal('hide');
  208. if (data.type === 'file') {
  209. if (data.jxid) {
  210. $(`.one-cert[data-cid="${data.id}"] .one-jx[data-jxid="${data.jxid}"]`).find('.file-show').html('<input type="file" class="jx-file-upload">');
  211. } else {
  212. $(`.one-cert[data-cid="${data.id}"]`).find('.one-cert-msg').find('.file-show').html('<input type="file" class="cert-file-upload">');
  213. }
  214. } else {
  215. if (data.jxid) {
  216. $(`.one-cert[data-cid="${data.id}"] .one-jx[data-jxid="${data.jxid}"]`).remove();
  217. // 教育信息重新排序
  218. for (let i = 0; i < $(`.one-cert[data-cid="${data.id}"] .one-jx`).length; i++) {
  219. $(`.one-cert[data-cid="${data.id}"] .one-jx`).eq(i).find('.jx-num').text($(`.one-cert[data-cid="${data.id}"] .one-jx`).length - i);
  220. }
  221. } else {
  222. $(`.one-cert[data-cid="${data.id}"]`).remove();
  223. // 证书信息重新排序
  224. for (let i = 0; i < $(`#certs .one-cert`).length; i++) {
  225. $(`#certs .one-cert`).eq(i).find('.cert-num').text($(`#certs .one-cert`).length - i);
  226. }
  227. }
  228. }
  229. });
  230. });
  231. // 上传证书附件
  232. $('body').on('change', '#certs .cert-file-upload', function () {
  233. const file = this.files[0];
  234. const formData = new FormData();
  235. if (file === undefined) {
  236. toastr.error('未选择上传文件!');
  237. $(this).val('');
  238. return false;
  239. }
  240. const ext = file.name.toLowerCase().split('.').splice(-1)[0];
  241. const imgStr = /(jpg|jpeg|png|bmp|BMP|JPG|PNG|JPEG|pdf|PDF)$/;
  242. if (!imgStr.test(ext)) {
  243. toastr.error('请上传正确的图片或pdf格式文件');
  244. $(this).val('');
  245. return
  246. }
  247. const filesize = file.size;
  248. if (filesize > 30 * 1024 * 1024) {
  249. toastr.error('上传的文件大小不能超过30MB!');
  250. $(this).val('');
  251. return false;
  252. }
  253. const id = $(this).parents('.one-cert').data('cid');
  254. formData.append('type', 'upload_cert');
  255. formData.append('id', id);
  256. formData.append('file', file);
  257. console.log(formData);
  258. $(this).val('');
  259. const _self = $(this).parents('.file-show');
  260. postDataWithFile('/profile/cert/upload', formData, function (result) {
  261. _self.html(`<div class="col-form-label">
  262. <a href="${fujianOssPath + result.file_path}" target="_blank">${result.file_name}</a> &nbsp;<a href="#del-cert" data-cid="${id}" data-jxid="" data-filename="${result.file_name}" data-toggle="modal" data-target="#del-cert" class="del-cert-btn text-danger">删除</a>
  263. </div>`);
  264. });
  265. });
  266. // 上传证书附件
  267. $('body').on('change', '#certs .jx-file-upload', function () {
  268. const file = this.files[0];
  269. const formData = new FormData();
  270. if (file === undefined) {
  271. toastr.error('未选择上传文件!');
  272. $(this).val('');
  273. return false;
  274. }
  275. const ext = file.name.toLowerCase().split('.').splice(-1)[0];
  276. const imgStr = /(jpg|jpeg|png|bmp|BMP|JPG|PNG|JPEG|pdf|PDF)$/;
  277. if (!imgStr.test(ext)) {
  278. toastr.error('请上传正确的图片或pdf格式文件');
  279. $(this).val('');
  280. return
  281. }
  282. const filesize = file.size;
  283. if (filesize > 30 * 1024 * 1024) {
  284. toastr.error('上传的文件大小不能超过30MB!');
  285. $(this).val('');
  286. return false;
  287. }
  288. const id = $(this).parents('.one-cert').data('cid');
  289. const jxid = $(this).parents('.one-jx').data('jxid');
  290. formData.append('type', 'upload_jx');
  291. formData.append('id', id);
  292. formData.append('jxid', jxid);
  293. formData.append('file', file);
  294. console.log(formData);
  295. $(this).val('');
  296. const _self = $(this).parents('.file-show');
  297. postDataWithFile('/profile/cert/upload', formData, function (result) {
  298. _self.html(`<div class="col-form-label">
  299. <a href="${fujianOssPath + result.file_path}" target="_blank">${result.file_name}</a> &nbsp;<a href="#del-cert" data-cid="${id}" data-jxid="${jxid}" data-filename="${result.file_name}" data-toggle="modal" data-target="#del-cert" class="del-cert-btn text-danger">删除</a>
  300. </div>`);
  301. });
  302. })
  303. function updateJxDataFun(data) {
  304. console.log(data);
  305. postData('/profile/cert/save', { type: 'update_jx', update_data: data }, function(result) {
  306. // console.log(result);
  307. });
  308. }
  309. function insertJxHtml(data, jxdata) {
  310. const html = `
  311. <div class="one-jx" data-jxid="${jxdata.id}">
  312. <div class="card mt-3">
  313. <div class="modal-header">
  314. <b>继续教育<span class="jx-num">${data.edu_json.length}</span></b>
  315. <div class="pull-right">
  316. <a href="#del-cert" data-cid="${data.id}" data-jxid="${jxdata.id}" data-toggle="modal" data-target="#del-cert" class="del-cert-btn text-danger">删除</a>
  317. </div>
  318. </div>
  319. <div class="card-body">
  320. <div class="form-group row">
  321. <label for="uname" class="ml-3 col-form-label">培训时间:</label>
  322. <div class="col-sm-10">
  323. <input data-language="zh" data-old-date="${jxdata.date}" data-type="date" placeholder="请选择时间" type="text" data-range="true" data-multiple-dates-separator=" ~ " class="jx-date datepicker-here form-control form-control-sm" value="${jxdata.date ? jxdata.date : ''}">
  324. </div>
  325. </div>
  326. <div class="form-group row">
  327. <label for="uname" class="ml-3 col-form-label">培训单位:</label>
  328. <div class="col-sm-10">
  329. <input type="text" class="form-control form-control-sm" data-type="unit" value="${jxdata.unit ? jxdata.unit : ''}">
  330. </div>
  331. </div>
  332. <div class="form-group row">
  333. <label for="uname" class="ml-3 col-form-label">培训证明:</label>
  334. <div class="col-sm-10 file-show">
  335. <input type="file" class="jx-file-upload">
  336. </div>
  337. </div>
  338. </div>
  339. </div>
  340. </div>`;
  341. return html;
  342. }
  343. function insertCertHtml(i, data) {
  344. let typeHtml = ``;
  345. for (const r of certTypeConst) {
  346. typeHtml += `<option value="${r.value}">${r.name}</option>`;
  347. }
  348. const html = `<div class="col-6 mt-3 one-cert" data-cid="${data.id}">
  349. <div class="card">
  350. <div class="modal-header">
  351. <b>证书信息<span class="cert-num">${i}</span></b>
  352. <div class="pull-right">
  353. <a href="#del-cert" data-cid="${data.id}" data-jxid="" data-toggle="modal" data-target="#del-cert" class="del-cert-btn text-danger">删除</a>
  354. </div>
  355. </div>
  356. <div class="card-body">
  357. <b>持证情况:</b>
  358. <div class="m-3 one-cert-msg">
  359. <div class="form-group row">
  360. <label for="uname" class="ml-3 col-form-label">证件名称:</label>
  361. <div class="row col-sm-10 pr-0">
  362. <div class="col-6 pr-0">
  363. <select class="form-control form-control-sm select-cert-type" data-type="type">
  364. <option value="0">请选择</option>
  365. ${typeHtml}
  366. </select>
  367. </div>
  368. <div class="col-6 pr-0">
  369. <select class="form-control form-control-sm select-cert-name" data-type="name">
  370. <option value="0">请选择</option>
  371. </select>
  372. </div>
  373. </div>
  374. </div>
  375. <div class="form-group row">
  376. <label for="uname" class="ml-3 col-form-label">证件编号:</label>
  377. <div class="col-sm-10">
  378. <input type="text" class="form-control form-control-sm" data-type="code" value="${data.code ? data.code : ''}">
  379. </div>
  380. </div>
  381. <div class="form-group row">
  382. <label for="uname" class="ml-3 col-form-label">注册单位:</label>
  383. <div class="col-sm-10">
  384. <input type="text" class="form-control form-control-sm" data-type="reg_unit" value="${data.reg_unit ? data.reg_unit : ''}">
  385. </div>
  386. </div>
  387. <div class="form-group row">
  388. <label for="uname" class="ml-3 col-form-label">技术职称:</label>
  389. <div class="col-sm-10">
  390. <input type="text" class="form-control form-control-sm" data-type="job_title" value="${data.job_title ? data.job_title : ''}">
  391. </div>
  392. </div>
  393. <div class="form-group row">
  394. <label for="uname" class="ml-3 col-form-label">证书附件:</label>
  395. <div class="col-sm-10 file-show">
  396. <input type="file" class="cert-file-upload">
  397. </div>
  398. </div>
  399. </div>
  400. <div>
  401. <b>继续教育情况:</b>
  402. <div class="pull-right">
  403. <a href="javascript:void(0);" class="add-jx-btn">+添加</a>
  404. </div>
  405. <div class="all-jx">
  406. </div>
  407. </div>
  408. </div>
  409. </div>
  410. </div>`;
  411. return html;
  412. }
  413. function showCol4ObjArray(arr, col, key, showKey) {
  414. if (!col) return '';
  415. const obj = _.find(arr, { [key]: col });
  416. return obj ? obj[showKey] : '';
  417. }
  418. });