edit_member.html 35 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141
  1. {extend name="base"/}
  2. {block name="resources"}
  3. <link rel="stylesheet" type="text/css" href="__STATIC__/ext/layui/extend/cascader/cascader.css"/>
  4. <style>
  5. .layui-layer-content .form-wrap {padding: 0}
  6. .layui-layer-page .layui-layer-content {overflow-y: auto!important;}
  7. .layui-layout-admin .layui-body .body-content {background: none;padding: 0}
  8. .info-wrap {display: flex}
  9. .info-wrap .layui-card {flex: 1;margin-top: 0}
  10. .info-wrap .layui-card:first-child {margin-right: 15px}
  11. .member-info {display: flex}
  12. .member-info .headimg {margin-right: 15px;width: 70px;height: 70px;display: flex;align-items: center;justify-content: center;overflow: hidden}
  13. .member-info .headimg img {max-width: 100%;height: auto}
  14. .member-info .info {flex: 1;width: 0;display: flex;flex-wrap: wrap}
  15. .member-info .info .data-item {width: 50%;padding-right: 10px;box-sizing: border-box;line-height: 30px}
  16. .member-info .data-item .layui-icon {cursor: pointer}
  17. .layui-tab-content {padding: 0}
  18. .screen {margin: 15px 0}
  19. .select-level-layer .layui-layer-content {overflow: unset!important;}
  20. </style>
  21. {/block}
  22. {block name="main"}
  23. <div class="info-wrap">
  24. <div class="layui-card card-common card-brief">
  25. <div class="layui-card-header">
  26. <div>
  27. <span class="card-title">基本信息</span>
  28. </div>
  29. </div>
  30. <div class="layui-card-body">
  31. <div class="member-info">
  32. <div class="headimg">
  33. {notempty name="$member_info.data.headimg"}
  34. <img src="{:img($member_info.data.headimg)}" alt="">
  35. {else/}
  36. <img src="{:img('public/static/img/default_img/head.png')}" alt="">
  37. {/notempty}
  38. </div>
  39. <div class="info">
  40. <div class="data-item">
  41. <span>用户名:</span>
  42. <span>{$member_info.data.username}</span>
  43. </div>
  44. <div class="data-item">
  45. <span>昵称:</span>
  46. <span>{$member_info.data.nickname}</span>
  47. <i class="layui-icon text-color" style="margin-left: 5px;" onclick="editNickname(this)"> </i>
  48. </div>
  49. <div class="data-item">
  50. <span>手机号:</span>
  51. <span>{notempty name="$member_info.data.mobile"}{$member_info.data.mobile}{else/}暂无{/notempty}</span>
  52. <i class="layui-icon text-color" style="margin-left: 5px;" onclick="editMobile(this)"> </i>
  53. </div>
  54. {if $member_info.data.is_member}
  55. <div class="data-item">
  56. <span>会员码:</span>
  57. <span>{notempty name="$member_info.data.member_code"}{$member_info.data.member_code}{else/}--{/notempty}</span>
  58. </div>
  59. {/if}
  60. <div class="data-item">
  61. <span>真实姓名:</span>
  62. <span>{notempty name="$member_info.data.realname"}{$member_info.data.realname}{else/}暂无{/notempty}</span>
  63. <i class="layui-icon text-color" style="margin-left: 5px;" onclick="editRealname(this)"> </i>
  64. </div>
  65. <div class="data-item">
  66. <span>性别:</span>
  67. <span>
  68. {switch name="$member_info.data.sex"}
  69. {case value="0"}未知{/case}
  70. {case value="1"}男{/case}
  71. {case value="2"}女{/case}
  72. {/switch}
  73. </span>
  74. <i class="layui-icon text-color" style="margin-left: 5px;" onclick="editSex(this)"> </i>
  75. </div>
  76. <div class="data-item">
  77. <span data-value="{$member_info.data.birthday}">生日:</span>
  78. <span>{notempty name="$member_info.data.birthday"}{:date('Y-m-d', $member_info.data.birthday)}{else/}未知{/notempty}</span>
  79. <i class="layui-icon text-color" style="margin-left: 5px;" onclick="editBirthday(this)"> </i>
  80. </div>
  81. <div class="data-item">
  82. <span>会员等级:</span>
  83. <span>{$member_info.data.member_level_name}</span>
  84. <i class="layui-icon text-color" style="margin-left: 5px;" onclick="editMemberLevel(this)"> </i>
  85. </div>
  86. <div class="data-item">
  87. <span>注册时间:</span>
  88. <span>{:time_to_date($member_info.data.reg_time)}</span>
  89. </div>
  90. <div class="data-item">
  91. <span>来源渠道:</span>
  92. <span>{$member_info.data.login_type_name}</span>
  93. </div>
  94. <div class="data-item">
  95. <span>最后访问时间:</span>
  96. <span>{:time_to_date($member_info.data.last_visit_time)}</span>
  97. </div>
  98. <div class="data-item" style="width: 100%">
  99. <span>会员地址:</span>
  100. <span>{$member_info.data.full_address ? $member_info.data.full_address : '--'} {$member_info.data.address ? $member_info.data.address : ''}</span>
  101. <i class="layui-icon text-color" style="margin-left: 5px;" onclick="editMemberAddress(this)"> </i>
  102. </div>
  103. <input type="hidden" name="member_id" value="{$member_info.data.member_id}" />
  104. <input type="hidden" class="birthday" value="{$member_info.data.birthday}" />
  105. </div>
  106. </div>
  107. </div>
  108. </div>
  109. <div class="layui-card card-common card-brief">
  110. <div class="layui-card-header">
  111. <div>
  112. <span class="card-title">账户信息</span>
  113. </div>
  114. </div>
  115. <div class="layui-card-body">
  116. <div class="member-info">
  117. <div class="info">
  118. <div class="data-item">
  119. <span>储值余额:</span>
  120. <span id="member_balance">{:moneyFormat($member_info.data.balance)}</span>
  121. <!--<i class="layui-icon text-color" style="margin-left: 5px;" data-num="{$member_info.data.balance}" onclick="saveBalance(this)"> </i>-->
  122. </div>
  123. <div class="data-item">
  124. <span>现金余额:</span>
  125. <span>{:moneyFormat($member_info.data.balance_money)}</span>
  126. </div>
  127. <!-- <div class="data-item">-->
  128. <!-- <span>积分:</span>-->
  129. <!-- <span id="member_point">{:round($member_info.data.point)}</span>-->
  130. <!-- <i class="layui-icon text-color" style="margin-left: 5px;" data-num="{$member_info.data.point}" onclick="savePoint(this)"> </i>-->
  131. <!-- </div>-->
  132. <div class="data-item">
  133. <span>成长值:</span>
  134. <span id="member_growth">{$member_info.data.growth}</span>
  135. <i class="layui-icon text-color" style="margin-left: 5px;" data-num="{$member_info.data.growth}" onclick="saveGrowth(this)"> </i>
  136. </div>
  137. </div>
  138. </div>
  139. </div>
  140. </div>
  141. </div>
  142. <div class="layui-card card-common card-brief">
  143. <div class="layui-card-header">
  144. <div>
  145. <span class="card-title">账户明细</span>
  146. </div>
  147. </div>
  148. <div class="layui-card-body layui-tab layui-tab-brief" lay-filter="edit_user_tab">
  149. <ul class="layui-tab-title">
  150. <li class="layui-this" lay-id="basic_info">余额</li>
  151. <!-- <li lay-id="basic_info">积分</li>-->
  152. <li lay-id="basic_info">成长值</li>
  153. <li lay-id="basic_info">订单管理</li>
  154. <li lay-id="basic_info">收货地址</li>
  155. <li lay-id="basic_info">收藏记录</li>
  156. <li lay-id="basic_info">浏览记录</li>
  157. <li lay-id="basic_info">优惠券</li>
  158. {if addon_is_exit('cardservice') == 1 }
  159. <li lay-id="basic_info">卡项</li>
  160. {/if}
  161. </ul>
  162. <div class="layui-tab-content">
  163. <div class="layui-tab-item layui-show">
  164. <iframe src="{:url('shop/member/accountdetail',array('member_id'=>$member_info.data.member_id, 'account_type' => 'balance,balance_money'))}" style="width:100%;height:100vh;border:0"></iframe>
  165. </div>
  166. <div class="layui-tab-item">
  167. <iframe src="{:url('shop/member/accountdetail',array('member_id'=>$member_info.data.member_id, 'account_type' => 'point'))}" style="width:100%;height:100vh;border:0"></iframe>
  168. </div>
  169. <div class="layui-tab-item">
  170. <iframe src="{:url('shop/member/accountdetail',array('member_id'=>$member_info.data.member_id,'account_type' => 'growth'))}" style="width:100%;height:100vh;border:0"></iframe>
  171. </div>
  172. <div class="layui-tab-item">
  173. <iframe src="{:url('shop/member/order',array('member_id'=>$member_info.data.member_id))}" style="width:100%;height:100vh;border:0"></iframe>
  174. </div>
  175. <div class="layui-tab-item">
  176. <iframe src="{:url('shop/member/addressdetail',array('member_id'=>$member_info.data.member_id))}" style="width:100%;height:100vh;border:0"></iframe>
  177. </div>
  178. <div class="layui-tab-item">
  179. <iframe src="{:url('shop/goods/membergoodscollect',array('member_id'=>$member_info.data.member_id))}" style="width:100%;height:100vh;border:0"></iframe>
  180. </div>
  181. <div class="layui-tab-item">
  182. <iframe src="{:url('shop/goods/membergoodsbrowse',array('member_id'=>$member_info.data.member_id))}" style="width:100%;height:100vh;border:0"></iframe>
  183. </div>
  184. <div class="layui-tab-item">
  185. <iframe src="{:url('shop/member/membercoupon',array('member_id'=>$member_info.data.member_id))}" style="width:100%;height:100vh;border:0"></iframe>
  186. </div>
  187. {if addon_is_exit('cardservice') == 1 }
  188. <div class="layui-tab-item">
  189. <iframe src="{:addon_url('cardservice://shop/card/membergoodscard',array('member_id'=>$member_info.data.member_id))}" style="width:100%;height:100vh;border:0"></iframe>
  190. </div>
  191. {/if}
  192. </div>
  193. </div>
  194. </div>
  195. {/block}
  196. {block name="script"}
  197. <script>
  198. var birthday = $(".birthday").val();
  199. $("input[name=birthday]").attr("value", ns.time_to_date(birthday, "YYYY-MM-DD"));
  200. layui.extend({
  201. layCascader: '__STATIC__/ext/layui/extend/cascader/cascader'
  202. })
  203. var layCascader, areaTree = [];
  204. layui.use(['form', 'layCascader'], function() {
  205. var form = layui.form,
  206. repeat_flag = false; //防重复标识
  207. layCascader = layui.layCascader;
  208. form.render();
  209. /**
  210. * 表单验证
  211. */
  212. form.verify({
  213. mobile: function(value) {
  214. if (value == '') {
  215. return;
  216. }
  217. if (!ns.parse_mobile(value)) {
  218. return '请输入正确的手机号码!';
  219. }
  220. },
  221. isemail: function(value) {
  222. var reg = /^[a-z0-9]+([._\\-]*[a-z0-9])*@([a-z0-9]+[-a-z0-9]*[a-z0-9]+.){1,63}[a-z0-9]+$/;
  223. if (value == '') {
  224. return;
  225. }
  226. if (!reg.test(value)) {
  227. return '请输入正确的邮箱!';
  228. }
  229. }
  230. });
  231. var upload = new Upload({
  232. elem: '#headImg'
  233. });
  234. /**
  235. * 监听提交
  236. */
  237. form.on('submit(save)', function(data) {
  238. data.field.member_level_name = $(".member_level").find("option[value=" + data.field.member_level + "]").text();
  239. if (data.field.status == undefined) {
  240. data.field.status = 0;
  241. }
  242. // 删除图片
  243. if(!data.field.headimg) upload.delete();
  244. if(repeat_flag) return false;
  245. repeat_flag = true;
  246. $.ajax({
  247. url: ns.url("shop/member/editMember"),
  248. data: data.field,
  249. dataType: 'JSON', //服务器返回json格式数据
  250. type: 'POST', //HTTP请求类型
  251. success: function(res) {
  252. repeat_flag = false;
  253. if (res.code == 0) {
  254. layer.confirm('编辑成功', {
  255. title:'操作提示',
  256. btn: ['返回列表', '继续操作'],
  257. yes: function(){
  258. location.href = ns.url("shop/member/memberList")
  259. },
  260. btn2: function() {
  261. location.reload();
  262. }
  263. });
  264. }else{
  265. layer.msg(res.message);
  266. }
  267. }
  268. });
  269. });
  270. });
  271. function back() {
  272. location.href = ns.url("shop/member/memberList");
  273. }
  274. </script>
  275. <script>
  276. var date = {$member_info.data.reg_time};
  277. $(".reg-time").text(ns.time_to_date(date, "YYYY-MM-DD"));
  278. $("#member_point").text(parseInt("{$member_info.data.point}"));
  279. var form,
  280. table,
  281. laydate,
  282. laytpl;
  283. repeat_flag = false, //防重复标识
  284. currentDate = new Date(),
  285. minDate = "",
  286. reg = {
  287. required: /[\S]+/,
  288. mobile: /^1([38][0-9]|4[579]|5[0-3,5-9]|6[6]|7[0135678]|9[0-9])\d{8}$/
  289. };
  290. currentDate.setDate(currentDate.getDate() - 7);
  291. layui.use(['form', 'laydate', 'laytpl'], function() {
  292. form = layui.form;
  293. laydate = layui.laydate;
  294. laytpl = layui.laytpl;
  295. form.render();
  296. //开始时间
  297. laydate.render({
  298. elem: '#start_date',
  299. type: 'datetime'
  300. });
  301. //结束时间
  302. laydate.render({
  303. elem: '#end_date',
  304. type: 'datetime'
  305. });
  306. //根据账户类型获取来源类型
  307. form.on('select(account_type)', function (data) {
  308. $.ajax({
  309. type: "POST",
  310. url: ns.url("shop/member/getfromtype"),
  311. data: {type:data.value},
  312. dataType: 'JSON',
  313. success: function(res) {
  314. var html = '<option value="">请选择</option>';
  315. $.each(res,function(k,v){
  316. html += '<option value="'+k+'">'+v.type_name+'</option>';
  317. });
  318. $('.from_type').html(html);
  319. form.render();
  320. }
  321. });
  322. });
  323. /**
  324. * 重新渲染结束时间
  325. * */
  326. function reRender() {
  327. $("#reg_end_date").remove();
  328. $(".end-time").html('<input type="text" class="layui-input" name="reg_end_date" id="reg_end_date" placeholder="请输入结束时间">');
  329. laydate.render({
  330. elem: '#reg_end_date',
  331. min: minDate
  332. });
  333. }
  334. /**
  335. * 表单验证
  336. */
  337. form.verify({
  338. num: function(value) {
  339. var arrMen = value.split(".");
  340. var val = 0;
  341. if (arrMen.length == 2) {
  342. val = arrMen[1];
  343. }
  344. if (value == "") {
  345. return false;
  346. }
  347. if (val.length > 2) {
  348. return '保留小数点后两位'
  349. }
  350. }
  351. });
  352. /**
  353. * 监听提交
  354. */
  355. form.on('submit(search)', function(data) {
  356. table.reload({
  357. page: {
  358. curr: 1
  359. },
  360. where: data.field
  361. });
  362. return false;
  363. });
  364. form.on('submit(savePoint)', function(data) {
  365. if (repeat_flag) return false;
  366. repeat_flag = true;
  367. var point = {$member_info.data.point};
  368. if (data.field.adjust_num == 0) {
  369. layer.msg('调整数值不能为0');
  370. repeat_flag = false;
  371. return ;
  372. }
  373. if (point*1 + data.field.adjust_num*1 < 0) {
  374. layer.msg('积分不可以为负数');
  375. repeat_flag = false;
  376. return ;
  377. }
  378. $.ajax({
  379. type: "POST",
  380. url: ns.url("shop/member/adjustPoint"),
  381. data: data.field,
  382. dataType: 'JSON',
  383. success: function(res) {
  384. layer.msg(res.message);
  385. if (res.code == 0) {
  386. $("#member_point").html(res.data.point);
  387. $("#member_point").next().attr('data-num', res.data.point);
  388. layer.closeAll('page');
  389. table.reload();
  390. } else {
  391. repeat_flag = false;
  392. }
  393. }
  394. });
  395. });
  396. form.on('submit(saveBalance)', function(data) {
  397. if (repeat_flag) return false;
  398. repeat_flag = true;
  399. var balance = {$member_info.data.balance};
  400. if (data.field.adjust_num == 0) {
  401. layer.msg('调整数值不能为0');
  402. repeat_flag = false;
  403. return ;
  404. }
  405. if (balance*1 + data.field.adjust_num*1 < 0) {
  406. layer.msg('当前储值余额不可以为负数');
  407. repeat_flag = false;
  408. return ;
  409. }
  410. $.ajax({
  411. type: "POST",
  412. url: ns.url("shop/member/adjustBalance"),
  413. data: data.field,
  414. dataType: 'JSON',
  415. success: function(res) {
  416. layer.msg(res.message);
  417. if (res.code == 0) {
  418. // $("#member_balance").html(res.data.balance);
  419. // $("#member_balance").next().attr('data-num', res.data.balance);
  420. // layer.closeAll('page');
  421. // table.reload();
  422. location.reload();
  423. } else {
  424. repeat_flag = false;
  425. }
  426. }
  427. });
  428. });
  429. form.on('submit(saveGrowth)', function(data) {
  430. if (repeat_flag) return false;
  431. repeat_flag = true;
  432. var growth = {$member_info.data.growth};
  433. if (data.field.adjust_num == 0) {
  434. layer.msg('调整数值不能为0');
  435. repeat_flag = false;
  436. return ;
  437. }
  438. if (growth*1 + data.field.adjust_num*1 < 0) {
  439. layer.msg('成长值不可以为负数');
  440. repeat_flag = false;
  441. return;
  442. }
  443. $.ajax({
  444. type: "POST",
  445. url: ns.url("shop/member/adjustGrowth"),
  446. data: data.field,
  447. dataType: 'JSON',
  448. success: function(res) {
  449. layer.msg(res.message);
  450. if (res.code == 0) {
  451. $("#member_growth").html(res.data.growth);
  452. $("#member_growth").next().attr('data-num', res.data.growth);
  453. layer.closeAll('page');
  454. table.reload();
  455. } else {
  456. repeat_flag = false;
  457. }
  458. }
  459. });
  460. });
  461. form.on('checkbox(memberlevel)', function(data){
  462. $('#setMemberLevel input[type="checkbox"]').prop('checked', false);
  463. $(data.elem).prop('checked', true);
  464. form.render();
  465. })
  466. });
  467. function savePoint(e) {
  468. var point = $(e).attr('data-num');
  469. var data = {
  470. point : point
  471. };
  472. laytpl($("#point").html()).render(data, function(html) {
  473. layer.open({
  474. title: '调整积分',
  475. skin: 'layer-tips-class',
  476. type: 1,
  477. area: ['800px'],
  478. content: html,
  479. end: function () {
  480. repeat_flag = false;
  481. }
  482. });
  483. });
  484. $(".integral-bounced .amount input").on("input propertychange",function(val){
  485. var newIntegral = parseInt($(this).val());
  486. if (!isNaN(newIntegral)) $(this).val(newIntegral);
  487. var currIntegral = parseInt($(".integral-bounced .account-value").text());
  488. if (newIntegral + currIntegral < 0){
  489. layer.msg("调整数额与当前值积分数相加不能小于0");
  490. $(this).val(-currIntegral);
  491. return false;
  492. }
  493. })
  494. }
  495. function saveBalance(e) {
  496. var balance = $(e).attr('data-num');
  497. var data = {
  498. balance : balance
  499. };
  500. laytpl($("#balance").html()).render(data, function(html) {
  501. layer.open({
  502. title: '调整储值余额',
  503. skin: 'layer-tips-class',
  504. type: 1,
  505. area: ['800px'],
  506. content: html,
  507. end: function () {
  508. repeat_flag = false;
  509. }
  510. });
  511. });
  512. }
  513. function saveGrowth(e) {
  514. var growth = $(e).attr('data-num');
  515. var data = {
  516. growth : growth
  517. };
  518. laytpl($("#growth").html()).render(data, function(html) {
  519. layer.open({
  520. title: '调整成长值',
  521. skin: 'layer-tips-class',
  522. type: 1,
  523. area: ['800px'],
  524. content: html,
  525. end: function () {
  526. repeat_flag = false;
  527. }
  528. });
  529. });
  530. }
  531. function editMemberLevel(){
  532. laytpl($("#memberLevel").html()).render({}, function(html) {
  533. layer.open({
  534. title: '设置会员等级',
  535. skin: 'select-level-layer',
  536. type: 1,
  537. area: ['400px', '300px'],
  538. content: html,
  539. success: function(){
  540. form.render();
  541. form.on('radio(level_type)', function (data) {
  542. $('.level-type').hide();
  543. $('.level-type.type-' + data.value).show();
  544. })
  545. form.on('select(member_card)', function (data) {
  546. $('.member-card').hide();
  547. $('.member-card-' + data.value).show();
  548. })
  549. },
  550. btn: ['保存', '取消'],
  551. yes: function () {
  552. layer.confirm('是否确定变更该客户的会员等级?',{title: '会员等级变更确认'}, function(index){
  553. let data = {
  554. level_type: $('[name="level_type"]:checked').val() || 0,
  555. member_id: '{$member_info.data.member_id}'
  556. }
  557. data.level_id = data.level_type == 0 ? $('[name="member_level"]').val() : $('[name="member_card"]').val();
  558. if (data.level_id == 0) {
  559. layer.msg((data.level_type == 0 ? '请选择会员等级' : '请选择会员卡'));
  560. return;
  561. }
  562. if (data.level_type == 1) data.period_unit = $('[name="member_card_'+ data.level_id +'"]:checked').val();
  563. $.ajax({
  564. type: "POST",
  565. url: ns.url("shop/member/changememberlevel"),
  566. data: data,
  567. dataType: 'JSON',
  568. success: function(res) {
  569. if (res.code == 0) {
  570. location.reload();
  571. } else {
  572. layer.msg(res.message);
  573. }
  574. }
  575. });
  576. layer.closeAll();
  577. });
  578. }
  579. });
  580. });
  581. }
  582. function editNickname(event){
  583. var nickname = $(event).prev('span').text();
  584. var html = `<div class="layui-form form-wrap">
  585. <div class="layui-form-item">
  586. <label class="layui-form-label" style="width:auto"><span class="required">*</span>昵称:</label>
  587. <div class="layui-input-block" style="margin-left: 0;">
  588. <input name="nickname" type="text" lay-verify="required" value="`+ nickname +`" class="layui-input len-mid">
  589. </div>
  590. </div>
  591. </div>`;
  592. layer.open({
  593. title: '编辑昵称',
  594. skin: 'edit-member-layer',
  595. type: 1,
  596. area: '360px',
  597. content: html,
  598. success: function(){
  599. form.render();
  600. },
  601. btn: ['保存', '取消'],
  602. yes: function () {
  603. var data = {nickname: $.trim($('[name="nickname"]').val())};
  604. if (!reg.required.test(data.nickname)) {
  605. layer.msg('请输入昵称', {icon: 5});
  606. return;
  607. }
  608. editMember(data, function(res){
  609. if (res.code == 0) {
  610. $(event).prev('span').text(data.nickname);
  611. layer.closeAll();
  612. } else {
  613. layer.msg(res.message);
  614. }
  615. });
  616. }
  617. })
  618. }
  619. function editRealname(event){
  620. var realname = $.trim($(event).prev('span').text()) != '暂无' ? $.trim($(event).prev('span').text()) : '';
  621. var html = `<div class="layui-form form-wrap">
  622. <div class="layui-form-item">
  623. <label class="layui-form-label" style="width:auto"><span class="required">*</span>真实姓名:</label>
  624. <div class="layui-input-block" style="margin-left: 0;">
  625. <input name="realname" type="text" lay-verify="required" value="`+ realname +`" class="layui-input len-mid">
  626. </div>
  627. </div>
  628. </div>`;
  629. layer.open({
  630. title: '真实姓名',
  631. skin: 'edit-member-layer',
  632. type: 1,
  633. area: '380px',
  634. content: html,
  635. success: function(){
  636. form.render();
  637. },
  638. btn: ['保存', '取消'],
  639. yes: function () {
  640. var data = {realname: $.trim($('[name="realname"]').val())};
  641. if (!reg.required.test(data.realname)) {
  642. layer.msg('请输入真实姓名', {icon: 5});
  643. return;
  644. }
  645. editMember(data, function(res){
  646. if (res.code == 0) {
  647. $(event).prev('span').text(data.realname);
  648. layer.closeAll();
  649. } else {
  650. layer.msg(res.message);
  651. }
  652. });
  653. }
  654. })
  655. }
  656. function editMobile(event){
  657. var realname = $.trim($(event).prev('span').text()) != '暂无' ? $.trim($(event).prev('span').text()) : '';
  658. var html = `<div class="layui-form form-wrap">
  659. <div class="layui-form-item">
  660. <label class="layui-form-label" style="width:auto"><span class="required">*</span>手机号:</label>
  661. <div class="layui-input-block" style="margin-left: 0;">
  662. <input name="mobile" type="text" lay-verify="required" value="`+ realname +`" class="layui-input len-mid">
  663. </div>
  664. </div>
  665. </div>`;
  666. layer.open({
  667. title: '手机号',
  668. skin: 'edit-member-layer',
  669. type: 1,
  670. area: '380px',
  671. content: html,
  672. success: function(){
  673. form.render();
  674. },
  675. btn: ['保存', '取消'],
  676. yes: function () {
  677. var data = {mobile: $.trim($('[name="mobile"]').val())};
  678. if (!reg.required.test(data.mobile)) {
  679. layer.msg('手机号', {icon: 5});
  680. return;
  681. }
  682. if (!ns.parse_mobile(data.mobile)) {
  683. layer.msg('请输入正确的手机号', {icon: 5});
  684. return;
  685. }
  686. editMember(data, function(res){
  687. if (res.code == 0) {
  688. $(event).prev('span').text(data.mobile);
  689. layer.closeAll();
  690. } else {
  691. layer.msg(res.message);
  692. }
  693. });
  694. }
  695. })
  696. }
  697. function editBirthday(event){
  698. var birthday = $(event).prev('span').attr('data-value');
  699. var html = `<div class="layui-form form-wrap">
  700. <div class="layui-form-item">
  701. <label class="layui-form-label" style="width:auto"><span class="required">*</span>生日:</label>
  702. <div class="layui-input-block" style="margin-left: 0;">
  703. <input name="birthday" type="text" id="birthday" value="" class="layui-input len-mid">
  704. </div>
  705. </div>
  706. </div>`;
  707. layer.open({
  708. title: '生日',
  709. skin: 'edit-member-layer',
  710. type: 1,
  711. area: '360px',
  712. content: html,
  713. success: function(){
  714. laydate.render({
  715. elem: '#birthday',
  716. max: 0
  717. });
  718. form.render();
  719. },
  720. btn: ['保存', '取消'],
  721. yes: function () {
  722. var data = {birthday: $('[name="birthday"]').val()};
  723. if (!reg.required.test(data.birthday)) {
  724. layer.msg('请选择生日', {icon: 5});
  725. return;
  726. }
  727. editMember(data, function(res){
  728. if (res.code == 0) {
  729. $(event).prev('span').text(data.birthday);
  730. // $(event).prev('span').attr('data-value', data.sex);
  731. layer.closeAll();
  732. } else {
  733. layer.msg(res.message);
  734. }
  735. });
  736. }
  737. })
  738. }
  739. function editSex(event){
  740. var sex = $(event).prev('span').attr('data-value');
  741. var html = `<div class="layui-form form-wrap">
  742. <div class="layui-form-item">
  743. <label class="layui-form-label" style="width:auto"><span class="required">*</span>性别:</label>
  744. <div class="layui-input-block" style="margin-left: 0;">
  745. <input type="radio" name="sex" value="1" title="男" `+ (sex == 1 ? 'checked' : '') +`>
  746. <input type="radio" name="sex" value="2" title="女" `+ (sex == 2 ? 'checked' : '') +`>
  747. </div>
  748. </div>
  749. </div>`;
  750. layer.open({
  751. title: '性别',
  752. skin: 'edit-member-layer',
  753. type: 1,
  754. area: '270px',
  755. content: html,
  756. success: function(){
  757. form.render();
  758. },
  759. btn: ['保存', '取消'],
  760. yes: function () {
  761. var data = {sex: $('[name="sex"]:checked').val()};
  762. if (!data.sex) {
  763. layer.msg('请选择性别', {icon: 5});
  764. return;
  765. }
  766. editMember(data, function(res){
  767. if (res.code == 0) {
  768. $(event).prev('span').text($('[name="sex"]:checked').attr('title'));
  769. $(event).prev('span').attr('data-value', data.sex);
  770. layer.closeAll();
  771. } else {
  772. layer.msg(res.message);
  773. }
  774. });
  775. }
  776. })
  777. }
  778. function editMobile(event){
  779. var mobile = $.trim($(event).prev('span').text()) != '暂无' ? $.trim($(event).prev('span').text()) : '';
  780. var html = `<div class="layui-form form-wrap">
  781. <div class="layui-form-item">
  782. <label class="layui-form-label" style="width:auto"><span class="required">*</span>手机号:</label>
  783. <div class="layui-input-block" style="margin-left: 0;">
  784. <input name="mobile" type="number" value="`+ mobile +`" class="layui-input len-mid">
  785. </div>
  786. </div>
  787. </div>`;
  788. layer.open({
  789. title: '编辑手机号',
  790. skin: 'edit-member-layer',
  791. type: 1,
  792. area: '370px',
  793. content: html,
  794. success: function(){
  795. form.render();
  796. },
  797. btn: ['保存', '取消'],
  798. yes: function () {
  799. var data = {mobile: $('[name="mobile"]').val()};
  800. if (!reg.required.test(data.mobile)) {
  801. layer.msg('请输入手机号', {icon: 5});
  802. return;
  803. }
  804. if (!reg.mobile.test(data.mobile)) {
  805. layer.msg('请输入正确的手机号', {icon: 5});
  806. return;
  807. }
  808. editMember(data, function(res){
  809. if (res.code == 0) {
  810. $(event).prev('span').text(data.mobile);
  811. layer.closeAll();
  812. } else {
  813. layer.msg(res.message);
  814. }
  815. });
  816. }
  817. })
  818. }
  819. function editMember(data, callback){
  820. if(repeat_flag) return false;
  821. repeat_flag = true;
  822. data.member_id = '{$member_info.data.member_id}';
  823. $.ajax({
  824. url: ns.url("shop/member/editMember"),
  825. data: data,
  826. dataType: 'JSON', //服务器返回json格式数据
  827. type: 'POST', //HTTP请求类型
  828. success: function(res) {
  829. repeat_flag = false;
  830. typeof callback == 'function' && callback(res);
  831. }
  832. });
  833. }
  834. function editMemberAddress(event){
  835. var html = `<div class="layui-form form-wrap">
  836. <div class="layui-form-item">
  837. <label class="layui-form-label" style="width:auto"><span class="required">*</span>所在地区:</label>
  838. <div class="layui-input-inline len-mid" style="margin: 0;">
  839. <input name="full_address" type="text" lay-verify="required" value="{$member_info.data.full_address}" class="layui-input len-mid">
  840. </div>
  841. </div>
  842. </div>
  843. <input name="province_id" type="hidden" value="{$member_info.data.province_id}" class="layui-input len-mid">
  844. <input name="city_id" type="hidden" value="{$member_info.data.city_id}" class="layui-input len-mid">
  845. <input name="district_id" type="hidden" value="{$member_info.data.district_id}" class="layui-input len-mid">
  846. <div class="layui-form form-wrap">
  847. <div class="layui-form-item">
  848. <label class="layui-form-label" style="width:auto"><span class="required">*</span>详细地址:</label>
  849. <div class="layui-input-block" style="margin-left: 0;">
  850. <input name="address" type="text" lay-verify="required" value="{$member_info.data.address}" class="layui-input len-mid">
  851. </div>
  852. </div>
  853. </div>`;
  854. layer.open({
  855. title: '会员地址',
  856. skin: 'edit-member-layer',
  857. type: 1,
  858. area: '380px',
  859. content: html,
  860. success: function(){
  861. form.render();
  862. if (!areaTree.length) {
  863. $.ajax({
  864. url : ns.url("shop/express/getareatree"),
  865. dataType: 'JSON',
  866. type: 'POST',
  867. async: false,
  868. success: function(res) {
  869. areaTree = res.data;
  870. }
  871. })
  872. }
  873. var _cascader = layCascader({
  874. elem: $('[name="full_address"]'),
  875. options: areaTree,
  876. separator: '-',
  877. props: {
  878. value: 'id',
  879. label: 'name',
  880. children: 'children'
  881. }
  882. });
  883. {if !empty($member_info.data.full_address)}
  884. _cascader.setValue({$member_info.data.district_id});
  885. {/if}
  886. _cascader.changeEvent(function (value, node) {
  887. $('[name="province_id"]').val(node.path[0] ? node.path[0].data.id : 0)
  888. $('[name="city_id"]').val(node.path[1] ? node.path[1].data.id : 0)
  889. $('[name="district_id"]').val(node.path[2] ? node.path[2].data.id : 0)
  890. var fullAddress = [];
  891. node.path.forEach(function (item) {
  892. fullAddress.push(item.data.name);
  893. })
  894. $('[name="full_address"]').val(fullAddress.join('-'));
  895. });
  896. },
  897. btn: ['保存', '取消'],
  898. yes: function () {
  899. var data = {
  900. province_id: $.trim($('[name="province_id"]').val()),
  901. city_id: $.trim($('[name="city_id"]').val()),
  902. district_id: $.trim($('[name="district_id"]').val()),
  903. address: $.trim($('[name="address"]').val()),
  904. full_address: $.trim($('[name="full_address"]').val())
  905. };
  906. if (!reg.required.test(data.full_address)) {
  907. layer.msg('请选择所在地区', {icon: 5});
  908. return;
  909. }
  910. if (!reg.required.test(data.address)) {
  911. layer.msg('请输入详细地址', {icon: 5});
  912. return;
  913. }
  914. editMember(data, function(res){
  915. if (res.code == 0) {
  916. $(event).prev('span').text(data.realname);
  917. layer.closeAll();
  918. setTimeout(function(){
  919. location.reload()
  920. }, 1500)
  921. } else {
  922. layer.msg(res.message);
  923. }
  924. });
  925. }
  926. })
  927. }
  928. </script>
  929. <!-- 积分弹框html -->
  930. <script type="text/html" id="point">
  931. <div class="layui-form integral-bounced">
  932. <div class="layui-form-item">
  933. <label class="layui-form-label">当前积分:</label>
  934. <div class="layui-input-block account-value">{{ parseInt(d.point) }}</div>
  935. </div>
  936. <div class="layui-form-item">
  937. <label class="layui-form-label">调整数额:</label>
  938. <div class="layui-input-block amount">
  939. <input type="number" value="0" placeholder="请输入调整数额" name="adjust_num" lay-verify="num" class="layui-input len-short">
  940. </div>
  941. <span class="word-aux">调整数额与当前积分数相加不能小于0</span>
  942. </div>
  943. <div class="layui-form-item">
  944. <label class="layui-form-label">备注:</label>
  945. <div class="layui-input-block len-long">
  946. <textarea class="layui-textarea" name="remark" placeholder="请输入备注" maxlength="150"></textarea>
  947. </div>
  948. </div>
  949. <div class="form-row" style="margin-left: 200px;">
  950. <button class="layui-btn" lay-submit lay-filter="savePoint">确定</button>
  951. </div>
  952. <input type="hidden" name="member_id" value="{$member_info.data.member_id}" />
  953. <input type="hidden" name="point" value="{{ d.point }}" />
  954. </div>
  955. </script>
  956. <!-- 余额弹框html -->
  957. <script type="text/html" id="balance">
  958. <div class="layui-form">
  959. <div class="layui-form-item">
  960. <label class="layui-form-label">当前储值余额:</label>
  961. <div class="layui-input-block account-value">{{ d.balance }}</div>
  962. </div>
  963. <div class="layui-form-item">
  964. <label class="layui-form-label">调整数额:</label>
  965. <div class="layui-input-block">
  966. <input type="number" value="0" placeholder="请输入调整数额" name="adjust_num" lay-verify="num" class="layui-input len-short">
  967. </div>
  968. <span class="word-aux">调整数额与当前储值余额相加不能小于0</span>
  969. </div>
  970. <div class="layui-form-item">
  971. <label class="layui-form-label">备注:</label>
  972. <div class="layui-input-block len-long">
  973. <textarea class="layui-textarea" name="remark" placeholder="请输入备注" maxlength="150"></textarea>
  974. </div>
  975. </div>
  976. <div class="form-row" style="margin-left: 200px;">
  977. <button class="layui-btn" lay-submit lay-filter="saveBalance">确定</button>
  978. </div>
  979. <input type="hidden" name="member_id" value="{$member_info.data.member_id}" />
  980. <input type="hidden" name="point" value="{{ d.balance }}" />
  981. </div>
  982. </script>
  983. <!-- 成长值弹框html -->
  984. <script type="text/html" id="growth">
  985. <div class="layui-form">
  986. <div class="layui-form-item">
  987. <label class="layui-form-label">当前成长值:</label>
  988. <div class="layui-input-block account-value">{{ d.growth }}</div>
  989. </div>
  990. <div class="layui-form-item">
  991. <label class="layui-form-label">调整数额:</label>
  992. <div class="layui-input-block">
  993. <input type="number" value="0" placeholder="请输入调整数额" name="adjust_num" lay-verify="num" class="layui-input len-short">
  994. </div>
  995. <span class="word-aux">调整数额与当前成长值相加不能小于0</span>
  996. </div>
  997. <div class="layui-form-item">
  998. <label class="layui-form-label">备注:</label>
  999. <div class="layui-input-block len-long">
  1000. <textarea class="layui-textarea" name="remark" placeholder="请输入备注" maxlength="150"></textarea>
  1001. </div>
  1002. </div>
  1003. <div class="form-row" style="margin-left: 200px;">
  1004. <button class="layui-btn" lay-submit lay-filter="saveGrowth">确定</button>
  1005. </div>
  1006. <input type="hidden" name="member_id" value="{$member_info.data.member_id}" />
  1007. <input type="hidden" name="point" value="{{ d.growth }}" />
  1008. </div>
  1009. </script>
  1010. <script type="text/html" id="memberLevel">
  1011. <div class="layui-form" id="setMemberLevel">
  1012. <div class="layui-form-item">
  1013. <label class="layui-form-label sm">类型:</label>
  1014. <div class="layui-input-block">
  1015. <input type="radio" name="level_type" value="0" title="会员等级" checked lay-filter="level_type">
  1016. <input type="radio" name="level_type" value="1" title="会员卡" lay-filter="level_type">
  1017. </div>
  1018. </div>
  1019. <div class="level-type type-0">
  1020. <div class="layui-form-item">
  1021. <label class="layui-form-label sm">会员等级:</label>
  1022. <div class="layui-input-block len-mid">
  1023. <select name="member_level">
  1024. <option value="0">请选择会员等级</option>
  1025. {foreach name="member_level_list" item="vo"}
  1026. {if $vo.level_type eq 0}
  1027. <option value="{$vo.level_id}" {if $vo.level_id eq $member_info.data.member_level}selected{/if}>{$vo.level_name}</option>
  1028. {/if}
  1029. {/foreach}
  1030. </select>
  1031. </div>
  1032. </div>
  1033. </div>
  1034. <div class="level-type type-1" style="display: none">
  1035. <div class="layui-form-item">
  1036. <label class="layui-form-label sm">会员卡:</label>
  1037. <div class="layui-input-block len-mid">
  1038. <select name="member_card" lay-filter="member_card">
  1039. <option value="0">请选择会员卡</option>
  1040. {foreach name="member_level_list" item="vo"}
  1041. {if $vo.level_type eq 1}
  1042. <option value="{$vo.level_id}" {if $vo.level_id eq $member_info.data.member_level}selected{/if}>{$vo.level_name}</option>
  1043. {/if}
  1044. {/foreach}
  1045. </select>
  1046. </div>
  1047. </div>
  1048. {foreach name="member_level_list" item="vo"}
  1049. {if $vo.level_type eq 1}
  1050. <div class="layui-form-item member-card member-card-{$vo.level_id}" style="display: none">
  1051. <label class="layui-form-label sm">发卡规格:</label>
  1052. <div class="layui-input-block">
  1053. {foreach :json_decode($vo.charge_rule, true) as $key => $money}
  1054. <input type="radio" name="member_card_{$vo.level_id}" value="{$key}" title="{$level_time[$key]}/{$money}元" checked>
  1055. {/foreach}
  1056. </div>
  1057. </div>
  1058. {/if}
  1059. {/foreach}
  1060. </div>
  1061. </div>
  1062. </script>
  1063. {/block}