sms.ejs 18 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. <% include ./sub_menu.ejs %>
  2. <div class="panel-content" id="app">
  3. <div class="panel-title">
  4. <div class="title-main">
  5. <h2>认证手机</h2>
  6. </div>
  7. </div>
  8. <div class="content-wrap">
  9. <div class="c-body">
  10. <div class="sjs-height-0">
  11. <div class="row m-0 mt-3">
  12. <div class="col-6">
  13. <div class="card mb-3 ">
  14. <div class="card-body pt-3">
  15. <h6 class="card-title">认证手机</h6>
  16. <% if (accountData.auth_mobile !== '') { %>
  17. <!--已绑定手机-->
  18. <div class="form-group">
  19. <label><%- accountData.auth_mobile %></label>
  20. <% if (accountData.dsk_account) { %>
  21. <a href="javascript:void(0);" class="btn btn-sm btn-outline-secondary" data-container="body" data-toggle="popover" data-placement="bottom" data-content="先解绑大司空账号才能解绑认证手机" data-trigger="focus">解绑</a>
  22. <% } else { %>
  23. <a href="#remove-auth-mobile" class="btn btn-sm btn-outline-primary" data-toggle="modal" data-target="#remove-auth-mobile">解绑</a>
  24. <% } %>
  25. <a href="javascript:void(0);" class="btn btn-sm btn-outline-warning ml-2" id="change-mobile">修改手机</a>
  26. </div>
  27. <% } %>
  28. <!--绑定手机-->
  29. <% if (accountData.auth_mobile === '') { %><div class="alert alert-warning">认证手机用户找回密码操作,请优先设置。</div><% } %>
  30. <form id="mobile-form" <% if (accountData.auth_mobile !== '') { %>style="display: none" <% } %>>
  31. <div class="form-group">
  32. <label>认证手机</label>
  33. <div class="input-group mb-3">
  34. <input class="form-control form-control-sm" placeholder="输入11位手机号码" value="" name="auth_mobile" maxlength="11"/>
  35. <div class="input-group-append">
  36. <button class="btn btn-outline-secondary btn-sm" type="button" id="get-code">获取验证码</button>
  37. </div>
  38. </div>
  39. </div>
  40. <div class="form-group">
  41. <div class="input-group mb-3">
  42. <input class="form-control form-control-sm" type="text" readonly="readonly" name="code" placeholder="输入短信中的6位验证码" />
  43. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>">
  44. </div>
  45. </div>
  46. <button type="button" class="btn btn-secondary btn-sm disabled" id="bind-btn">确认绑定</button>
  47. <% if (accountData.auth_mobile !== '') { %><button type="button" class="btn btn-outline-secondary btn-sm" id="hide-bind-btn">取消</button><% } %>
  48. </form>
  49. <% if (accountData.auth_mobile !== '' && false) { %>
  50. <!--短信通知开关(已有认证手机后显示)-->
  51. <div class="mt-5">
  52. <h4>通知类型</h4>
  53. <p class="text-muted">勾选您需要接收的短信类型。</p>
  54. <form id="sms-form" method="post" action="/profile/sms/type?csrf=<%- ctx.csrf %>">
  55. <input type="hidden" name="_csrf_j" value="<%= ctx.csrf %>">
  56. <% const user_smsType = accountData.sms_type !== '' ? JSON.parse(accountData.sms_type) : null; %>
  57. <% for (const s in smsType) { %>
  58. <% if (smsType[s].sms) { %>
  59. <div class="form-group row">
  60. <label class="col-auto col-form-label"><%= smsType[s].name %>
  61. <!--<a href="#sms-view" data-toggle="modal" data-target="#sms-view" class="ml-2"><i class="fa fa-info-circle"></i></a>-->
  62. </label>
  63. <div class="col-5">
  64. <% for (const c of smsType[s].children) { %>
  65. <div class="form-check ">
  66. <input class="form-check-input" id="<%= s %>_<%- c.value %>" type="checkbox" name="<%= s %>[]" value="<%= c.value %>" <% if (user_smsType !== null && user_smsType[s] !== undefined && user_smsType[s].indexOf(c.value.toString()) !== -1) { %>checked<% } %>>
  67. <label class="form-check-label" for="<%= s %>_<%- c.value %>"><%= c.title %></label>
  68. </div>
  69. <% } %>
  70. </div>
  71. </div>
  72. <% } %>
  73. <% } %>
  74. <input name="type" value="1" type="hidden">
  75. <button type="submit" class="btn btn-primary btn-sm">确认修改</button>
  76. </form>
  77. </div>
  78. <% } %>
  79. </div>
  80. </div>
  81. <div class="card mb-3 ">
  82. <div class="card-body pt-3">
  83. <h6 class="card-title">大司空账号</h6>
  84. <div class="mb-3">
  85. <% if (!accountData.auth_mobile) { %>
  86. <div class="mb-3"><label for="">请先认证手机,再绑定大司空账号。</label></div>
  87. <% } else { %>
  88. <div <% if (accountData.dsk_account) { %>style="display: none"<% } %>>
  89. <div class="form-group">
  90. <div class="input-group mb-3">
  91. <input class="form-control form-control-sm" id="dak-mobile" readonly="" value="<%= accountData.auth_mobile %>">
  92. <div class="input-group-append">
  93. <button class="btn btn-outline-secondary btn-sm" id="change-dsk-mobile">更改账号</button>
  94. <button class="btn btn-outline-secondary btn-sm" style="display: none" id="reset-dsk-mobile">重置</button>
  95. </div>
  96. </div>
  97. </div>
  98. <div class="form-group mb-1">
  99. <div>
  100. <div class="form-check form-check-inline">
  101. <input class="form-check-input" type="radio" id="radio1" value="password" name="dskradio" checked>
  102. <label class="form-check-label" for="radio1" name="radio33">密码</label>
  103. </div>
  104. <div class="form-check form-check-inline">
  105. <input class="form-check-input" type="radio" id="radio2" value="code" name="dskradio">
  106. <label class="form-check-label" for="radio2">手机验证码</label>
  107. </div>
  108. </div>
  109. </div>
  110. <div class="form-group mb-3" id="dsk-pwd-div">
  111. <input class="form-control form-control-sm" name="dsk_pwd" value="" placeholder="请输入密码">
  112. </div>
  113. <div class="input-group mb-3" id="dsk-code-div" style="display: none">
  114. <input class="form-control form-control-sm" placeholder="输入短信中的6位验证码" value="" name="dsk_code" maxlength="6"/>
  115. <div class="input-group-append">
  116. <button class="btn btn-outline-secondary btn-sm" type="button" id="get-dsk-code">获取验证码</button>
  117. </div>
  118. </div>
  119. <button class="btn btn-sm btn-primary" id="dsk-bind-btn">确认绑定</button>
  120. <a class="btn btn-sm btn-outline-primary ml-2" href="//dsk.smartcost.com.cn/register" target="_blank">注册大司空账号</a>
  121. </div>
  122. <div class="form-group show-dsk-account" <% if (!accountData.dsk_account) { %>style="display: none"<% } %>>
  123. <label><%- accountData.dsk_account ? accountData.dsk_account.mobile : '' %></label>
  124. <a href="#remove-dsk-account" class="btn btn-sm btn-outline-primary" data-toggle="modal" data-target="#remove-dsk-account">解绑</a>
  125. </div>
  126. </div>
  127. <% } %>
  128. </div>
  129. </div>
  130. </div>
  131. </div>
  132. </div>
  133. </div>
  134. </div>
  135. </div>
  136. <div id="captcha-element"></div>
  137. <script type="text/javascript">
  138. const csrf = '<%= ctx.csrf %>';
  139. </script>
  140. <script>
  141. window.AliyunCaptchaConfig = {
  142. language: 'cn',
  143. // 必填,验证码示例所属地区,支持中国内地(cn)、新加坡(sgp)
  144. region: "cn",
  145. // 必填,身份标。开通阿里云验证码2.0后,您可以在控制台概览页面的实例基本信息卡片区域,获取身份标
  146. prefix: "n1styx",
  147. };
  148. </script>
  149. <script type="text/javascript" src="https://o.alicdn.com/captcha-frontend/aliyunCaptcha/AliyunCaptcha.js"></script>
  150. <script type="text/javascript" src="/public/js/profile.js"></script>
  151. <script>
  152. $(function () {
  153. // 更改账号
  154. $('#change-dsk-mobile').click(function () {
  155. $('#dak-mobile').attr('readonly', false);
  156. $('#change-dsk-mobile').hide();
  157. $('#reset-dsk-mobile').show();
  158. });
  159. // 重置账号
  160. $('#reset-dsk-mobile').click(function () {
  161. $('#dak-mobile').val('<%= accountData.auth_mobile %>');
  162. });
  163. // 切换密码/验证码
  164. $('input[name="dskradio"]').on('change', function () {
  165. if ($(this).val() === 'password') {
  166. $('#dsk-pwd-div').show();
  167. $('#dsk-code-div').hide();
  168. } else {
  169. $('#dsk-pwd-div').hide();
  170. $('#dsk-code-div').show();
  171. }
  172. });
  173. var captcha;
  174. // 弹出式,除region和prefix以外的参数
  175. window.initAliyunCaptcha({
  176. // 场景ID。根据步骤二新建验证场景后,您可以在验证码场景列表,获取该场景的场景ID
  177. SceneId: "1mqqisql",
  178. // 验证码模式,popup表示弹出式,embed表示嵌入式。无需修改
  179. mode: "popup",
  180. // 页面上预留的渲染验证码的元素,与原代码中预留的页面元素保持一致。
  181. element: "#captcha-element",
  182. // 触发验证码弹窗或无痕验证的元素
  183. button: "#get-dsk-code",
  184. // 验证码验证通过回调函数
  185. success: function (captchaVerifyParam) {
  186. // 入参为验签captchaVerifyParam
  187. // 1.向后端发起业务请求进行验证码验签captchaVerifyParam校验
  188. // 2.根据校验结果来进行业务处理
  189. // 3.如业务需要重新进行验证码验证,调用验证码初始化方法initAliyunCaptcha重新初始化验证码
  190. // if (isPosting2) {
  191. // return false;
  192. // }
  193. const mobile = $('#dak-mobile').val();
  194. if (!mobile) {
  195. toastr.error('请输入手机号');
  196. return false;
  197. }
  198. // 手机号验证
  199. if (!/^1[3456789]\d{9}$/.test(mobile)) {
  200. toastr.error('请输入正确的手机号');
  201. return false;
  202. }
  203. const btn = $('#get-dsk-code');
  204. postData('/profile/dsk/api', { type: 'sms', mobile: mobile, captchaVerifyParam }, function (response) {
  205. codeSuccess(btn);
  206. });
  207. },
  208. // 验证码验证不通过回调函数
  209. fail: function (result) {
  210. // 入参为不通过信息
  211. // 正常验证有效期内不需要做任何操作,验证码自动刷新,重新进行验证
  212. toastr.error(result);
  213. console.error(result);
  214. },
  215. // 绑定验证码实例回调函数,该回调会在验证码初始化成功后调用
  216. getInstance: function (instance) {
  217. captcha = instance;
  218. },
  219. // 滑块验证和一点即过的验证形态触发框体样式,支持自定义宽度和高度,单位为px。
  220. slideStyle: {
  221. width: 360,
  222. height: 40,
  223. },
  224. // ...其他参数,参考initAliyunCaptcha参数说明
  225. });
  226. // 获取验证码
  227. // $("#get-dsk-code").click(function() {
  228. // // if (isPosting2) {
  229. // // return false;
  230. // // }
  231. // const mobile = $('#dak-mobile').val();
  232. // if (!mobile) {
  233. // toastr.error('请输入手机号');
  234. // return false;
  235. // }
  236. // // 手机号验证
  237. // if (!/^1[3456789]\d{9}$/.test(mobile)) {
  238. // toastr.error('请输入正确的手机号');
  239. // return false;
  240. // }
  241. // const btn = $(this);
  242. //
  243. // postData('/profile/dsk/api', { type: 'sms', mobile: mobile }, function (response) {
  244. // codeSuccess(btn);
  245. // });
  246. //
  247. // // $.ajax({
  248. // // url: '/profile/dsk/api?_csrf_j=' + csrf,
  249. // // type: 'post',
  250. // // data: { type: 'code', mobile: mobile },
  251. // // dataTye: 'json',
  252. // // error: function() {
  253. // // isPosting2 = false;
  254. // // },
  255. // // beforeSend: function() {
  256. // // isPosting2 = true;
  257. // // },
  258. // // success: function(response) {
  259. // // isPosting2 = false;
  260. // // if (response.err === 0) {
  261. // // codeSuccess(btn);
  262. // // } else {
  263. // // toastr.error(response.msg);
  264. // // }
  265. // // }
  266. // // });
  267. // });
  268. $('#dsk-bind-btn').click(function () {
  269. const mobile = $('#dak-mobile').val();
  270. const pwd = $('#dsk-pwd-div input').val();
  271. const code = $('#dsk-code-div input').val();
  272. const type = $('input[name="dskradio"]:checked').val();
  273. if (!mobile) {
  274. toastr.error('请输入手机号');
  275. return false;
  276. }
  277. if (type !== 'password' && type !== 'code') {
  278. toastr.error('请选择验证方式');
  279. return false;
  280. }
  281. if (type === 'password' && !pwd) {
  282. toastr.error('请输入密码');
  283. return false;
  284. }
  285. if (type === 'code' && !code) {
  286. toastr.error('请输入验证码');
  287. return false;
  288. }
  289. const data = {
  290. type: 'bind',
  291. mobile,
  292. method: type === 'password' ? 1 : 2,
  293. value: type === 'password' ? pwd : code,
  294. }
  295. postData('/profile/dsk/api', data, function (response) {
  296. toastr.success('绑定大司空账号成功');
  297. setTimeout(function () {
  298. location.reload();
  299. }, 1000);
  300. });
  301. });
  302. $('#del-dsk-btn').click(function () {
  303. postData('/profile/dsk/api', { type: 'unbind' }, function (response) {
  304. toastr.success('解绑大司空账号成功');
  305. setTimeout(function () {
  306. location.reload();
  307. }, 1000);
  308. });
  309. });
  310. });
  311. </script>