PageSourceSearch

https://mabian.gov.cn/mbyzzzx/resource/js/write.js

js mabian.gov.cn collected 2026-10-02 21:57:28 UTC 26,653 bytes, 997 lines download raw bytes

1/**
2 * 我要写信页面 JavaScript
3 */
4
5var pageConfig = {
6  commonUrl: "https://www.mabian.gov.cn/mbyzzzx",
7  // API接口地址
8  api: {
9    checkLogin: "/secure/member/checkLogin", // 检查登录状态
10    getMailbox: "/front/mail/box/boxDetail?id=676425066991749", // 获取信箱配置
11    getInfoTypes: "/front/mail/box/mailTypeTree?source=SYNC", // 获取信件类别
12    generateCaptcha: "/front/verificationcode/generate", // 生成图片验证码
13    save: "/front/mail/box/write", // 保存信件
14    sendSmsCode: "/front/sendverifycode/phone", // 发送短信验证码(GET ?phone=xxx)
15  },
16};
17// 登录跳转地址
18pageConfig.loginUrl =
19  "https://www.leshan.gov.cn/auth/c/login.shtml?platform=zwfw&redirect_uri=" +
20  encodeURIComponent(pageConfig.commonUrl + "/wyxx/index.html");
21// 页面数据
22var pageData = {
23  infoTypes: [], // 信件类别列表
24  department: null, // 部门信息
25  validCodeReqNo: "", // 验证码/短信验证码请求号
26  isSubmitting: false, // 是否正在提交中
27  mailboxConfig: null, // 信箱配置
28  verifyType: 0, // 验证类型:0=不校验、1=短信验证码、2=图形验证码
29  userInfo: null, // 用户信息
30  smsCountdown: 0, // 短信倒计时剩余秒数
31  smsTimer: null, // 短信倒计时定时器
32};
33function showDisabledNotice() {
34  if (window.layer && layer.confirm) {
35    var w = "540px";
36    var h = "auto";
37    if (window.screen.width < 768) {
38      w = "90%";
39      h = "auto";
40    }
41    var cf = layer.confirm(
42      '<div style="margin-top:6px; font-size:14px; line-height:22px; text-align:left; text-indent:2em;">为进一步优化“心连心写信”功能服务质量,“心连心信箱”写信功能将于2025年11月26日至2026年7月17日进行升级改造。升级期间,该功能将暂时无法使用,为确保您的合理诉求得到及时处理,升级期间可通过以下渠道联系我们:心连心服务热线:0833-12345。带来的不便敬请谅解。</div>',
43      {
44        btn: ["关闭"],
45        title: false,
46        shade: 0.7,
47        area: [w, h],
48        shadeClose: true,
49      },
50      function () {
51        layer.close(cf);
52        history.go(-1);
53      },
54    );
55    return;
56  }
57  alert(
58    "为进一步优化“心连心写信”功能服务质量,“心连心信箱”写信功能将于2025年11月26日至2026年7月17日进行升级改造。升级期间,该功能将暂时无法使用,为确保您的合理诉求得到及时处理,升级期间可通过以下渠道联系我们:心连心服务热线:0833-12345。带来的不便敬请谅解。",
59  );
60  history.go(-1);
61}
62/**
63 * 页面初始化主流程
64 */
65function checkLoginAndRedirect(targetUrl) {
66  // 获取当前 URL 中的 token 参数(用于保持登录状态)
67  var urlParams = new URLSearchParams(window.location.search);
68  var tokenInUrl = urlParams.get("token");
69  var tokenInCookie = getCookieCommon("token");
70
71  // 只有当 Cookie 里没东西,且 URL 里有东西时,才存入
72  if (!tokenInCookie && tokenInUrl) {
73    setCookieCommon("token", tokenInUrl, 7);
74    console.log("检测到新登录,Token 已存入 cookie");
75  }
76  // 1. 先检查登录状态
77  checkLogin(function (userInfo) {
78    console.log("登录成功,已关闭弹窗");
79    // 登录验证通过后,继续初始化
80    pageData.userInfo = userInfo;
81
82    // 2. 获取信箱配置(包括是否启用验证码)
83    try {
84      window.location.href = targetUrl;
85    } catch (e) {
86      console.error("业务逻辑初始化报错,但登录已成功:", e);
87    }
88  });
89}
90function initPage() {
91  if (window.__WRITELETTER_DISABLED__) {
92    showDisabledNotice();
93    return;
94  }
95  console.log("页面初始化开始");
96  // 获取当前 URL 中的 token 参数(用于保持登录状态)
97  var urlParams = new URLSearchParams(window.location.search);
98  var token = urlParams.get("token") || "";
99
100  // 如果 URL 中有 token,存入 cookie
101  if (token) {
102    setCookieCommon("token", token, 7);
103    console.log("Token 已存入 cookie:", getCookieCommon("token"));
104  }
105
106  // 1. 先检查登录状态
107  checkLogin(function (userInfo) {
108    // 登录验证通过后,继续初始化
109    pageData.userInfo = userInfo;
110
111    // 2. 获取信箱配置(包括是否启用验证码)
112    getMailboxConfig(function () {
113      // 3. 设置当前时间
114      // setCurrentDate();
115
116      // 4. 填充用户信息
117      fillUserInfo(userInfo);
118
119      // 5. 加载信件类别
120      loadInfoTypes();
121
122      // 6. 加载部门信息
123      loadDepartmentInfo();
124
125      // 7. 根据验证类型控制显示
126      toggleVerifyUIs();
127
128      // 8. 如果是图形验证码 verifyType = 2,加载图片验证码
129      if (pageData.verifyType === 2) {
130        $("#validCode_form").show();
131        loadCaptcha();
132      }
133
134      // 9. 绑定事件
135      bindEvents();
136
137      console.log("页面初始化完成");
138    });
139  });
140}
141
142/**
143 * 设置当前日期
144 */
145function setCurrentDate() {
146  var now = new Date();
147  var year = now.getFullYear();
148  var month = String(now.getMonth() + 1).padStart(2, "0");
149  var day = String(now.getDate()).padStart(2, "0");
150
151  var dateStr = year + "-" + month + "-" + day;
152  $("#addtime").val(dateStr);
153}
154
155/**
156 * 填充用户信息到表单
157 */
158function fillUserInfo(userInfo) {
159  if (!userInfo) return;
160
161  // 填充姓名
162  if (userInfo.name && $("#author").val() === "") {
163    $("#author").val(userInfo.name);
164  }
165  // 填充其他可能的字段(如果表单中存在)
166  if (userInfo.phone && $("#tel1").length && $("#tel1").val() === "") {
167    $("#tel1").val(userInfo.phone);
168  }
169  if (
170    userInfo.idCardNumber &&
171    $("#idCard").length &&
172    $("#idCard").val() === ""
173  ) {
174    $("#idCard").val(userInfo.idCardNumber);
175  }
176
177  if (userInfo.email && $("#email").length && $("#email").val() === "") {
178    $("#email").val(userInfo.email);
179  }
180
181  console.log("用户信息已填充");
182}
183
184/**
185 * 加载信件类别
186 */
187function loadInfoTypes() {
188  console.log("开始加载信件类别...");
189
190  $.ajax({
191    url: pageConfig.api.getInfoTypes,
192    type: "GET",
193    dataType: "json",
194    xhrFields: {
195      withCredentials: true,
196    },
197    data: {
198      id: "703683639869509",
199    },
200    success: function (response) {
201      console.log("信件类别加载成功:", response);
202      if (response && response.code === 200) {
203        pageData.infoTypes = response.data;
204        renderInfoTypes(response.data);
205      }
206    },
207    error: function (xhr, status, error) {
208      console.error("加载信件类别失败:", error);
209    },
210  });
211}
212
213/**
214 * 渲染信件类别(从接口获取)
215 */
216function renderInfoTypes(infoTypes) {
217  var html = "";
218
219  $.each(infoTypes, function (index, item) {
220    var checked = index === 0 ? "checked" : "";
221    var radioId = "infoType_" + item.code;
222
223    html +=
224      '<input name="mailType" id="' +
225      radioId +
226      '" type="radio" value="' +
227      item.code +
228      '" ' +
229      checked +
230      ">";
231    html +=
232      '<label for="' +
233      radioId +
234      '"><span style="margin-right: 15px;">' +
235      item.name +
236      "</span></label>";
237  });
238
239  if (html === "") {
240    html = '<span style="color: #999;">暂无信件类别</span>';
241  }
242
243  $("#letterTypeContainer").html(html);
244}
245
246/**
247 * 设置固定收信人
248 */
249function loadDepartmentInfo() {
250  // 固定收信人为夹江县政府办公室
251  var departmentName = "马边彝族自治县政府办公室";
252  var departmentId = "32335960"; // 固定区域ID
253
254  // 设置区域信息
255  $("#bm1").val(departmentName);
256  $("#regionId").val(departmentId);
257
258  // 保存到页面数据
259  pageData.department = {
260    id: departmentId,
261    name: departmentName,
262  };
263}
264
265/**
266 * 切换验证区域显示
267 */
268function toggleVerifyUIs() {
269  if (pageData.verifyType === 2) {
270    // 图形验证码
271    $("#validCode_form").show();
272    $("#phone_form").hide();
273    $("#smsCode_form").hide();
274  } else if (pageData.verifyType === 1) {
275    // 短信验证码
276    $("#validCode_form").hide();
277    $("#phone_form").show();
278    $("#smsCode_form").show();
279  } else {
280    // 不校验
281    $("#validCode_form").hide();
282    $("#phone_form").hide();
283    $("#smsCode_form").hide();
284  }
285}
286
287/**
288 * 绑定页面事件
289 */
290function bindEvents() {
291  // 清理旧事件
292  $("#randImage").off("click");
293  $("#submitBtn").off("click");
294  $("#sendcode").off("click");
295
296  // 验证类型相关事件
297  if (pageData.verifyType === 2) {
298    // 图形验证码:点击刷新
299    $("#randImage").on("click", loadCaptcha);
300  } else if (pageData.verifyType === 1) {
301    // 短信验证码:发送验证码
302    $("#sendcode").on("click", function () {
303      sendSmsCode();
304    });
305  }
306
307  // 提交按钮
308  $("#submitBtn").on("click", submitForm);
309
310  // 信件内容长度验证
311  $("#content").on("blur", function () {
312    if (this.value.length > 1000) {
313      alert("对不起,超过1000字符,请简明描述你的问题!");
314    }
315  });
316}
317
318/**
319 * 加载图片验证码(verifyType=2)
320 */
321function loadCaptcha() {
322  if (pageData.verifyType !== 2) {
323    console.log("验证类型不是图形验证码,跳过加载");
324    return;
325  }
326
327  console.log("开始加载图形验证码...");
328
329  // 显示加载状态
330  var winpath = window.location.href;
331  var propath = window.location.pathname;
332  var pos = winpath.indexOf(propath);
333  var localpath = winpath.substring(0, pos);
334  var projectName = propath.substring(0, propath.substring(1).indexOf("/") + 1);
335  var url = localpath + projectName;
336
337  $("#randImage").attr("src", url + "/resource/picture/jiazai.gif");
338
339  $.ajax({
340    url: pageConfig.api.generateCaptcha,
341    type: "GET",
342    dataType: "json",
343    xhrFields: {
344      withCredentials: true,
345    },
346    success: function (result) {
347      console.log("验证码加载成功:", result);
348
349      if (result.code === 200 && result.data) {
350        pageData.validCodeReqNo = result.data.validCodeReqNo;
351        $("#randImage").attr("src", result.data.validCodeBase64);
352      } else {
353        console.error("验证码加载失败:", result.msg || "未知错误");
354        alert("验证码加载失败,请刷新页面重试");
355      }
356    },
357    error: function (xhr, status, error) {
358      console.error("验证码加载失败:", error);
359      alert("验证码加载失败,请刷新页面重试");
360    },
361  });
362}
363
364/**
365 * 发送短信验证码(verifyType=1)并启动倒计时
366 */
367function sendSmsCode() {
368  if (pageData.verifyType !== 1) return;
369
370  var $btn = $("#sendcode");
371  if ($btn.prop("disabled")) return;
372
373  var phone = $("#tel1").val().trim();
374  var phoneRe = /^1\d{10}$/;
375  if (!phoneRe.test(phone)) {
376    alert("请输入正确的11位手机号");
377    $("#tel1").focus();
378    return;
379  }
380
381  // 先禁用按钮,防抖
382  $btn.prop("disabled", true);
383
384  $.ajax({
385    url: pageConfig.api.sendSmsCode,
386    type: "GET",
387    dataType: "json",
388    data: { phone: phone },
389    xhrFields: { withCredentials: true },
390    success: function (res) {
391      console.log("短信发送返回:", res);
392      var ok = false;
393      if (res && res.code === 200) ok = true;
394
395      if (ok) {
396        // 保存请求号
397        if (res.data) {
398          pageData.validCodeReqNo = res.data;
399        }
400        alert("验证码已发送,请注意查收!");
401        startSmsCountdown($btn, 60);
402      } else {
403        var msg =
404          (res && (res.message || res.msg)) || "短信发送失败,请稍后重试";
405        alert(msg);
406        $btn.prop("disabled", false);
407      }
408    },
409    error: function (xhr, status, error) {
410      console.error("短信发送失败:", error);
411      alert("短信发送失败,请稍后重试");
412      $btn.prop("disabled", false);
413    },
414  });
415}
416
417/**
418 * 短信倒计时
419 */
420function startSmsCountdown($btn, seconds) {
421  pageData.smsCountdown = seconds;
422  updateSmsButton($btn);
423  pageData.smsTimer = setInterval(function () {
424    pageData.smsCountdown--;
425    if (pageData.smsCountdown <= 0) {
426      clearInterval(pageData.smsTimer);
427      pageData.smsTimer = null;
428      $btn.prop("disabled", false).val("获取验证码");
429    } else {
430      updateSmsButton($btn);
431    }
432  }, 1000);
433}
434
435function updateSmsButton($btn) {
436  $btn.val("重新获取(" + pageData.smsCountdown + "s)");
437}
438
439/**
440 * 提交表单
441 */
442function submitForm() {
443  // 防止重复提交
444  if (pageData.isSubmitting) {
445    console.log("正在提交中,请勿重复提交");
446    return false;
447  }
448
449  // 验证表单
450  if (!validateForm()) {
451    return false;
452  }
453
454  // 获取表单数据
455  var formData = getFormData();
456
457  console.log("提交数据:", formData);
458
459  // 设置提交状态
460  pageData.isSubmitting = true;
461  var $submitBtn = $("#submitBtn");
462  var originalBtnText = $submitBtn.text();
463  $submitBtn.prop("disabled", true).text("提交中...");
464
465  // 提交到后端
466  $.ajax({
467    url: pageConfig.api.save,
468    type: "POST",
469    data: formData,
470    timeout: 30000, // 30秒超时
471    xhrFields: {
472      withCredentials: true,
473    },
474    success: function (response) {
475      console.log("提交响应:", response);
476      // 处理成功响应
477      if (response && response.code === 200) {
478        alert("提交成功!您的信件已收到,信件编号:" + (response.data || ""));
479        // 清空表单
480        resetForm();
481      } else {
482        // 处理业务失败
483        var errorMsg =
484          response.message || response.msg || "提交失败,请稍后重试";
485        alert(errorMsg);
486        // 失败后根据类型刷新验证码
487        if (pageData.verifyType === 2) {
488          loadCaptcha();
489        }
490      }
491    },
492    error: function (xhr, status, error) {
493      console.error("提交失败:", { xhr: xhr, status: status, error: error });
494      alert("提交失败,请稍后重试");
495      if (pageData.verifyType === 2) {
496        loadCaptcha();
497      }
498    },
499    complete: function () {
500      // 恢复提交按钮状态
501      pageData.isSubmitting = false;
502      $submitBtn.prop("disabled", false).text(originalBtnText);
503    },
504  });
505}
506
507/**
508 * 重置表单
509 */
510function resetForm() {
511  // 只清空用户填写的字段,保留写信时间和收信人
512  $("#author").val(""); // 清空姓名
513  $("#address").val(""); // 清空联系地址
514  $("#title").val(""); // 清空信件主题
515  $("#content").val(""); // 清空信件内容
516
517  if (pageData.verifyType === 2) {
518    // 图形验证码
519    $("#captcha").val("");
520    loadCaptcha();
521  } else if (pageData.verifyType === 1) {
522    // 短信验证码
523    $("#tel1").val("");
524    $("#smsCode").val("");
525    // 重置短信按钮
526    if (pageData.smsTimer) {
527      clearInterval(pageData.smsTimer);
528      pageData.smsTimer = null;
529    }
530    pageData.smsCountdown = 0;
531    $("#sendcode").prop("disabled", false).val("获取验证码");
532  }
533
534  // 重新渲染信件类别(保持选中第一个)
535  if (pageData.infoTypes && pageData.infoTypes.length > 0) {
536    renderInfoTypes(pageData.infoTypes);
537  }
538
539  console.log("表单已重置(保留写信时间和收信人)");
540}
541
542/**
543 * 表单验证
544 */
545function validatePhone(value, label) {
546  if (!value) {
547    return { ok: false, errors: [label + "不能为空!"] };
548  }
549  if (!/^1\d{10}$/.test(value)) {
550    return { ok: false, errors: [label + "格式不正确,请输入11位手机号"] };
551  }
552  return { ok: true };
553}
554
555// 16.2 身份证号校验(基本格式)
556function validateIdCard(value, label) {
557  if (!value) {
558    return { ok: false, errors: [label + "不能为空!"] };
559  }
560  if (!/^\d{15}(\d{2}[0-9Xx])?$/.test(value)) {
561    return {
562      ok: false,
563      errors: [label + "格式不正确,请输入15或18位身份证号"],
564    };
565  }
566  return { ok: true };
567}
568
569// 16.3 邮箱校验
570function validateEmail(value, label) {
571  if (!value) {
572    return { ok: false, errors: [label + "不能为空!"] };
573  }
574  var re = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
575  if (!re.test(value)) {
576    return { ok: false, errors: [label + "格式不正确,请输入有效邮箱地址"] };
577  }
578  return { ok: true };
579}
580
581// 16.4 中文内容校验(姓名、地址、主题、内容)
582function validateChineseContent(value, label, maxLength) {
583  if (!value) {
584    return { ok: false, errors: [label + "不能为空!"] };
585  }
586
587  var cleaned = value
588    .replace(/[\x00-\x1F\x7F]+/g, "")
589    .replace(/\s+/g, " ")
590    .trim();
591  if (!cleaned) {
592    return { ok: false, errors: [label + "不能为空或全是无效字符!"] };
593  }
594
595  var chineseMatches = cleaned.match(/[\u4e00-\u9fff]/g);
596  if (!chineseMatches || chineseMatches.length < 2) {
597    return { ok: false, errors: [label + "无意义,请删除"] };
598  }
599
600  var punctList = [
601    ",",
602    "。",
603    "?",
604    "!",
605    ";",
606    ":",
607    "、",
608    ".",
609    ",",
610    ".",
611    "?",
612    "!",
613    ";",
614    ":",
615    "(",
616    ")",
617    "(",
618    ")",
619    "[",
620    "]",
621    "【",
622    "】",
623    "{",
624    "}",
625    "「",
626    "」",
627    "—",
628    "–",
629    "-",
630    "…",
631    "·",
632    '"',
633    "'",
634    "《",
635    "》",
636    "/",
637    "\\",
638  ];
639  var escapeForCharClass = function (s) {
640    return s.replace(/[-\\\]\^]/g, "\\$&");
641  };
642  var punctEscaped = punctList.map(escapeForCharClass).join("");
643  var allowedClass = "\\u4e00-\\u9fffA-Za-z0-9\\s" + punctEscaped;
644  var forbiddenSeqRe = new RegExp("[^" + allowedClass + "]+", "gu");
645  var forbiddenSeqMatches = cleaned.match(forbiddenSeqRe) || [];
646
647  var longForbidden = forbiddenSeqMatches.find(function (s) {
648    return s.length >= 5;
649  });
650  if (longForbidden) {
651    return {
652      ok: false,
653      errors: [label + "中存在连续无效字符:" + longForbidden + ",请删除"],
654    };
655  }
656
657  var maxRepeat = 1,
658    cur = 1,
659    char = "";
660  for (var i = 1; i < cleaned.length; i++) {
661    if (cleaned[i] === cleaned[i - 1]) {
662      cur++;
663      if (cur > maxRepeat) {
664        maxRepeat = cur;
665        char = cleaned[i];
666      }
667      if (maxRepeat >= 5) {
668        return {
669          ok: false,
670          errors: [
671            label +
672              "中字符 " +
673              char +
674              " 连续出现超过 " +
675              maxRepeat +
676              " 次,请删除多余重复",
677          ],
678        };
679      }
680    } else {
681      cur = 1;
682    }
683  }
684
685  var longLettersRe = /[A-Za-z]{5,}/g;
686  var longLettersMatch = cleaned.match(longLettersRe);
687  if (longLettersMatch) {
688    var example =
689      longLettersMatch[0].slice(0, 10) +
690      (longLettersMatch[0].length > 10 ? "..." : "");
691    return {
692      ok: false,
693      errors: [label + "中存在过长英文字母序列(" + example + "),请删除"],
694    };
695  }
696
697  var totalLen = cleaned.length;
698  var chineseRatio = totalLen > 0 ? chineseMatches.length / totalLen : 0;
699  if (chineseRatio < 0.6) {
700    return {
701      ok: false,
702      errors: [label + "汉字占比不足60%,请删除无意义内容"],
703    };
704  }
705
706  if (totalLen > maxLength) {
707    return {
708      ok: false,
709      errors: [label + "长度超过" + maxLength + "字符,请精简。"],
710    };
711  }
712
713  return { ok: true };
714}
715
716// 16.5 统一入口
717function validateField(rule) {
718  var el = document.getElementById(rule.id);
719  var value = el ? String(el.value).trim() : "";
720  var label = rule.label || rule.id;
721
722  if (!rule.required && !value) {
723    return { ok: true };
724  }
725
726  switch (rule.type) {
727    case "phone":
728      return validatePhone(value, label);
729    case "idCard":
730      return validateIdCard(value, label);
731    case "email":
732      return validateEmail(value, label);
733    case "chinese":
734    default:
735      return validateChineseContent(value, label, rule.maxLength || 1000);
736  }
737}
738
739// ============================================================
740// 17. 表单验证(整合校验方案二)
741// ============================================================
742function validateForm() {
743  var rules = [
744    {
745      id: "author",
746      label: "姓名",
747      required: true,
748      maxLength: 100,
749      type: "chinese",
750    },
751    {
752      id: "tel1",
753      label: "手机号",
754      required: true,
755      maxLength: 11,
756      type: "phone",
757    },
758    { id: "idCard", label: "身份证号", required: false, type: "idCard" },
759    {
760      id: "address",
761      label: "联系地址",
762      required: true,
763      maxLength: 100,
764      type: "chinese",
765    },
766    {
767      id: "title",
768      label: "信件主题",
769      required: true,
770      maxLength: 100,
771      type: "chinese",
772    },
773    {
774      id: "content",
775      label: "信件内容",
776      required: true,
777      maxLength: 1000,
778      type: "chinese",
779    },
780    // 如果页面有邮箱字段,取消注释:
781    // { id: "email",    label: "邮箱",     required: false,                type: 'email' }
782  ];
783
784  for (var i = 0; i < rules.length; i++) {
785    var result = validateField(rules[i]);
786    if (!result.ok) {
787      alert(result.errors.join("\n"));
788      var el = document.getElementById(rules[i].id);
789      if (el) el.focus();
790      return false;
791    }
792  }
793
794  // 附加验证(验证码、短信验证码)
795  if (pageData.verifyType === 2) {
796    var captcha = $("#captcha").val().trim();
797    if (!captcha) {
798      alert("请填写验证码!");
799      $("#captcha").focus();
800      return false;
801    }
802    if (captcha.length < 4) {
803      alert("验证码长度不正确!");
804      $("#captcha").focus();
805      return false;
806    }
807  } else if (pageData.verifyType === 1) {
808    var sms = $("#smsCode").val().trim();
809    if (!sms) {
810      alert("请填写短信验证码!");
811      $("#smsCode").focus();
812      return false;
813    }
814    if (!/^\d{4,6}$/.test(sms)) {
815      alert("短信验证码格式不正确!");
816      $("#smsCode").focus();
817      return false;
818    }
819  }
820
821  var mailType = $('input[name="mailType"]:checked').val();
822  if (!mailType) {
823    alert("请选择信件类别!");
824    return false;
825  }
826
827  return true;
828}
829
830/**
831 * 获取表单数据
832 */
833function getFormData() {
834  var formData = {
835    contactName: $("#author").val().trim(), // 姓名 → contactName
836    contactAddress: $("#address").val().trim(), // 联系地址 → contactAddress
837    mailType: $('input[name="mailType"]:checked').val(), // 信件类别 → mailType
838    regionId: $("#regionId").val(), // 区域ID(替代原 departmentId)
839    title: $("#title").val().trim(), // 主题
840    content: $("#content").val().trim(), // 信件内容
841    contactPhone: $("#tel1").val().trim(),
842    contactIdCard: $("#idCard").val().trim(),
843    mailBoxId: "842843295653967",
844  };
845
846  if (pageData.verifyType === 2) {
847    // 图形验证码
848    formData.validCode = $("#captcha").val().trim();
849    formData.validCodeReqNo = pageData.validCodeReqNo;
850  } else if (pageData.verifyType === 1) {
851    // 短信验证码:与图形验证码保持相同字段名 validCode
852    formData.contactPhone = $("#tel1").val().trim();
853    formData.validCode = $("#smsCode").val().trim();
854    formData.validCodeReqNo = pageData.validCodeReqNo || "";
855  }
856
857  return formData;
858}
859
860/**
861 * 检查登录状态
862 * @param {Function} callback - 登录成功后的回调函数,参数为用户信息
863 */
864function checkLogin(callback) {
865  console.log("开始检查登录状态...");
866
867  $.ajax({
868    url: pageConfig.api.checkLogin,
869    type: "GET",
870    dataType: "json",
871    xhrFields: {
872      withCredentials: true,
873    },
874    success: function (result) {
875      console.log("登录状态检查结果:", result);
876      if (result.code === 401) {
877        // 未登录,显示确认对话框
878        console.warn("用户未登录,显示登录确认对话框");
879        showLoginConfirm();
880      } else if (result.code === 200) {
881        // 登录成功
882        console.log("用户已登录");
883        if (callback && typeof callback === "function") {
884          callback(result.data || {});
885        }
886      }
887    },
888    error: function (xhr, status, error) {
889      console.error("登录检查请求失败:", error);
890      alert("网络错误,无法检查登录状态,请刷新页面重试");
891    },
892  });
893}
894
895/**
896 * 显示登录确认对话框
897 */
898function showLoginConfirm() {
899  // 使用 layer 弹框(统一样式)
900  var siteName =
901    $("meta[name='SiteName']").attr("content") ||
902    $("meta[name='application-name']").attr("content") ||
903    "马边彝族自治县政府办公室";
904  var w = "480px";
905  var h = "170px";
906
907  // 响应式适配
908  if (window.screen.width < 768) {
909    w = "90%";
910    h = "170px";
911  }
912
913  var cf = layer.confirm(
914    '<div style="margin-top:30px; font-size:16px;">您需要登录后才能使用"我要写信"功能,是否前往登录页面?</div>',
915    {
916      btn: ["前往登录", "返回上页"],
917      title: false,
918      shade: 0.7,
919      area: [w, h],
920      shadeClose: true,
921    },
922    function () {
923      // 点击"前往登录"按钮
924      layer.close(cf);
925      console.log("用户选择前往登录页");
926      window.location.href = pageConfig.loginUrl;
927    },
928    function () {
929      // 点击"返回上页"按钮
930      layer.close(cf);
931      console.log("用户选择返回上页");
932      history.go(-1);
933    },
934  );
935}
936
937/**
938 * 获取信箱配置(包括验证类型等)
939 * @param {Function} callback - 获取成功后的回调函数
940 */
941function getMailboxConfig(callback) {
942  console.log("开始获取信箱配置...");
943
944  $.ajax({
945    url: pageConfig.api.getMailbox,
946    type: "GET",
947    dataType: "json",
948    xhrFields: {
949      withCredentials: true,
950    },
951    success: function (result) {
952      console.log("信箱配置获取结果:", result);
953
954      if (result.code === 200 && result.data) {
955        // 保存信箱配置
956        pageData.mailboxConfig = result.data;
957
958        // 设置验证类型(0=不校验、1=短信验证码、2=图形验证码)
959        pageData.verifyType = result.data.verifyType || 0;
960
961        console.log(
962          "验证类型:",
963          pageData.verifyType,
964          "(0=不校验、1=短信验证码、2=图形验证码)",
965        );
966
967        if (callback && typeof callback === "function") {
968          callback();
969        }
970      } else {
971        console.warn("信箱配置获取失败,使用默认配置");
972        // 默认使用图形验证码(更安全)
973        pageData.verifyType = 2;
974
975        if (callback && typeof callback === "function") {
976          callback();
977        }
978      }
979    },
980    error: function (xhr, status, error) {
981      console.error("信箱配置获取请求失败:", error);
982      // 发生错误时,默认使用图形验证码(更安全)
983      pageData.verifyType = 2;
984
985      if (callback && typeof callback === "function") {
986        callback();
987      }
988    },
989  });
990}
991
992// 页面加载完成后初始化(兼容性处理)
993// $(document).ready(function () {
994//   console.log("jQuery ready");
995// });
996
997// 当页面完全加载后执行初始化(包括图片等资源)

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.