@jctrans-materials/comps-vue3 1.0.42-beta.1 → 1.0.42-beta.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.esm.js CHANGED
@@ -11252,6 +11252,7 @@ function useThirdPartyLogin$1(config) {
11252
11252
  }
11253
11253
  };
11254
11254
  const handleLoginSuccess = (res) => {
11255
+ var _a;
11255
11256
  const data = res.data || res;
11256
11257
  console.log("🍉 处理登录结果:", data);
11257
11258
  loginResult.value = data;
@@ -11265,6 +11266,10 @@ function useThirdPartyLogin$1(config) {
11265
11266
  (data == null ? void 0 : data.thirdPartyInfo) || {},
11266
11267
  (data == null ? void 0 : data.mobileEmailList) || []
11267
11268
  );
11269
+ setThirdPartySessions$1(
11270
+ (data == null ? void 0 : data.thirdPartyInfo) || {},
11271
+ (data == null ? void 0 : data.mobileEmailList) || []
11272
+ );
11268
11273
  if (list.length > 0) {
11269
11274
  console.log("👉 进入绑定流程");
11270
11275
  bindList.value = list;
@@ -11275,11 +11280,17 @@ function useThirdPartyLogin$1(config) {
11275
11280
  console.log("👉 直接登录成功,准备跳转");
11276
11281
  isBindDialogVisible.value = false;
11277
11282
  isRegisterVisible.value = false;
11283
+ setTokenAll(data.result);
11284
+ if ((_a = data.result) == null ? void 0 : _a.improveComp) {
11285
+ if (config.onNeedComplete) {
11286
+ config.onNeedComplete(data);
11287
+ }
11288
+ return;
11289
+ }
11278
11290
  if (unref(config.test)) {
11279
11291
  logTestLoginResult("第三方(Facebook/LinkedIn)登录", data);
11280
11292
  return;
11281
11293
  }
11282
- setTokenAll(data.result);
11283
11294
  if (config.onSuccess) {
11284
11295
  config.onSuccess(data);
11285
11296
  } else {
@@ -12706,6 +12717,7 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
12706
12717
  disabledTabs.mobile = false;
12707
12718
  codeVerifyUuid.value = "";
12708
12719
  verifyData.value = null;
12720
+ verifyVisible.value = false;
12709
12721
  loading.value = false;
12710
12722
  }
12711
12723
  return (_ctx, _cache) => {
@@ -12909,7 +12921,7 @@ const _sfc_main$z = /* @__PURE__ */ defineComponent({
12909
12921
  };
12910
12922
  }
12911
12923
  });
12912
- const index$4 = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["__scopeId", "data-v-b332b345"]]);
12924
+ const index$4 = /* @__PURE__ */ _export_sfc(_sfc_main$z, [["__scopeId", "data-v-3f11f601"]]);
12913
12925
  const __vite_glob_0_4 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
12914
12926
  __proto__: null,
12915
12927
  default: index$4
@@ -22357,13 +22369,13 @@ const _sfc_main$e = /* @__PURE__ */ defineComponent({
22357
22369
  onClick: applyJoin
22358
22370
  }, [
22359
22371
  createTextVNode(toDisplayString(register_join_in.value) + " ", 1),
22360
- _cache[0] || (_cache[0] = createStaticVNode('<svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-2da35046><g id="icon/more/8" clip-path="url(#clip0_1016_6109)" data-v-2da35046><path id="Vector 79" d="M2 3L5 6L2 9" stroke="white" stroke-linejoin="round" data-v-2da35046></path></g><defs data-v-2da35046><clipPath id="clip0_1016_6109" data-v-2da35046><rect width="8" height="12" fill="white" data-v-2da35046></rect></clipPath></defs></svg>', 1))
22372
+ _cache[0] || (_cache[0] = createStaticVNode('<svg width="8" height="12" viewBox="0 0 8 12" fill="none" xmlns="http://www.w3.org/2000/svg" data-v-d15f8d69><g id="icon/more/8" clip-path="url(#clip0_1016_6109)" data-v-d15f8d69><path id="Vector 79" d="M2 3L5 6L2 9" stroke="white" stroke-linejoin="round" data-v-d15f8d69></path></g><defs data-v-d15f8d69><clipPath id="clip0_1016_6109" data-v-d15f8d69><rect width="8" height="12" fill="white" data-v-d15f8d69></rect></clipPath></defs></svg>', 1))
22361
22373
  ])
22362
22374
  ]);
22363
22375
  };
22364
22376
  }
22365
22377
  });
22366
- const ApplyJoinBtn = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-2da35046"]]);
22378
+ const ApplyJoinBtn = /* @__PURE__ */ _export_sfc(_sfc_main$e, [["__scopeId", "data-v-d15f8d69"]]);
22367
22379
  const _sfc_main$d = {
22368
22380
  name: "RegisterForm",
22369
22381
  components: {
@@ -22393,29 +22405,50 @@ const _sfc_main$d = {
22393
22405
  "third-party-click",
22394
22406
  "register-step-change"
22395
22407
  ],
22408
+ // =========================================================================
22409
+ // Computed - 派生状态,根据表单数据和选中城市动态计算
22410
+ // =========================================================================
22396
22411
  computed: {
22412
+ // 用户协议是否已勾选(仅读取 agree 字段值,用于外部快速判断)
22397
22413
  isAgree() {
22398
22414
  return this.form.agree;
22399
22415
  },
22416
+ // countryId - 从 city 对象的 raw 数据中提取国家 ID
22417
+ // 数据来源兼容两种结构:
22418
+ // 1. 直接选择城市:city.raw.country.id
22419
+ // 2. 搜索结果:city.raw.city.countryId
22420
+ // 用于区分国内/海外,驱动手机号/邮箱切换以及区号数据加载
22400
22421
  countryId() {
22401
22422
  var _a, _b, _c, _d, _e, _f, _g;
22402
22423
  return ((_c = (_b = (_a = this.form.city) == null ? void 0 : _a.raw) == null ? void 0 : _b.country) == null ? void 0 : _c.id) || ((_g = (_f = (_e = (_d = this.form) == null ? void 0 : _d.city) == null ? void 0 : _e.raw) == null ? void 0 : _f.city) == null ? void 0 : _g.countryId);
22403
22424
  },
22425
+ // cityId - 从 city 对象中提取城市 ID,提交注册时作为必填参数之一
22404
22426
  cityId() {
22405
22427
  var _a;
22406
22428
  return (_a = this.form.city) == null ? void 0 : _a.id;
22407
22429
  },
22430
+ // currentCountryIsChina - 判断当前所选城市是否在中国(countryId === 1)
22431
+ // 中国 → 显示手机号输入区(区号下拉 + 手机号);海外 → 显示企业邮箱输入区
22432
+ // 同时考虑 resistCompanyInfo(申请加入已有公司时传入的预设国家信息)
22408
22433
  currentCountryIsChina() {
22409
22434
  var _a;
22410
22435
  const id = this.countryId || ((_a = this.resistCompanyInfo) == null ? void 0 : _a.countryId);
22411
22436
  return [1].includes(Number(id));
22412
22437
  },
22438
+ // currentCompanyLabel - 根据中英文环境和国家动态切换公司名输入框的 placeholder 标签
22439
+ // 中国 + 中文 → "公司中文名称";海外 + 中文 → "公司英文名称"
22440
+ // 中国 + 英文 → "Company Name in Chinese";海外 + 英文 → "Company Name in English"
22413
22441
  currentCompanyLabel() {
22414
22442
  return this.isEn ? this.currentCountryIsChina ? "Company Name in Chinese" : "Company Name in English" : this.currentCountryIsChina ? "公司中文名称" : "公司英文名称";
22415
22443
  },
22444
+ // isTraderSector - 判断当前选择的行业是否为"货主"(Trade)
22445
+ // 货主行业无需填写公司名,Step2 中直接跳过公司名输入,仅展示勾选协议
22416
22446
  isTraderSector() {
22417
22447
  return this.form.sector === "Trade";
22418
22448
  },
22449
+ // codeInputLabel - 动态生成验证码输入框上方的提示标签
22450
+ // 根据国内/海外分别显示 "验证码已发送至手机号 138****0000" 或 "验证码已发送至邮箱 t***@example.com"
22451
+ // 通过工具函数 buildCodeInputLabel 拼接展示文案,支持中英文切换
22419
22452
  codeInputLabel() {
22420
22453
  return buildCodeInputLabel({
22421
22454
  isChina: this.currentCountryIsChina,
@@ -22425,47 +22458,74 @@ const _sfc_main$d = {
22425
22458
  });
22426
22459
  }
22427
22460
  },
22461
+ // 当注册步骤切换时,通知父组件更新 Banner 显隐状态
22428
22462
  watch: {
22429
22463
  registerStep(newVal) {
22430
22464
  this.$emit("register-step-change", newVal);
22431
22465
  }
22432
22466
  },
22467
+ // =========================================================================
22468
+ // data - 表单数据、校验规则、业务状态
22469
+ // =========================================================================
22433
22470
  data() {
22434
22471
  return {
22472
+ // 验证码是否可发送(由联系方式校验通过后置为 true)
22435
22473
  codeReady: false,
22436
- // 记录公司是否已注册的状态,用于 UI 展示申请加入逻辑
22474
+ // 公司查重结果:是否已存在英文/中文公司名,用于展示"申请加入"按钮
22437
22475
  companyResistEn: false,
22438
22476
  companyResistCn: false,
22477
+ // 滑块验证通过后保存的验证数据(uuid + code),用于获取验证码和提交注册
22439
22478
  verifyData: {},
22440
- // 注册分步状态:1 或 2
22479
+ // 注册分步状态:1(城市+联系方式) 或 2(验证码+行业+公司+协议)
22441
22480
  registerStep: 1,
22442
- // Step 1 进入 Step 2 时快照联系方式,用于返回 Step 1 时判断是否需要重置验证码
22481
+ // Step 1 进入 Step 2 时快照当前联系方式,返回 Step 1 时用于判断是否需重置验证码
22443
22482
  step1AccountSnapshot: "",
22483
+ // ===== 注册表单字段 =====
22444
22484
  form: {
22445
22485
  city: null,
22486
+ // 城市选择器绑定值(JcSearch 对象)
22446
22487
  cityId: "",
22488
+ // 城市 ID
22447
22489
  companyName: "",
22490
+ // 公司名称(中文或英文,取决于国家)
22448
22491
  countryId: "",
22492
+ // 国家 ID(从城市数据中提取)
22449
22493
  email: "",
22494
+ // 海外用户的邮箱
22450
22495
  phone: "",
22496
+ // 国内用户的手机号
22451
22497
  code: "",
22498
+ // 4 位验证码
22452
22499
  sector: "Logistics",
22500
+ // 行业类型,默认"货代"
22453
22501
  agree: false,
22502
+ // 是否同意用户协议
22454
22503
  useKq: false,
22504
+ // 是否使用快企查重(ChineseCompanySearch 组件回传)
22455
22505
  kqCode: "",
22506
+ // 快企查重编码
22456
22507
  kqInfo: null,
22508
+ // 快企查重返回的公司信息对象
22457
22509
  areaCode: "+86",
22510
+ // 手机区号(默认中国 +86)
22458
22511
  nameCn: "",
22512
+ // 中文姓名(申请加入已有公司时使用)
22459
22513
  nameEn: "",
22514
+ // 英文姓名
22460
22515
  firstName: "",
22516
+ // 名(海外用户申请加入已有公司时使用)
22461
22517
  lastName: ""
22518
+ // 姓(海外用户申请加入已有公司时使用)
22462
22519
  },
22520
+ // 行业类型选项列表(由接口动态获取,本地默认为三个选项)
22463
22521
  sectors: [
22464
22522
  { cn: "货代", en: "Freight Forwarder", value: "Logistics" },
22465
22523
  { cn: "货主", en: "Trader", value: "Trade" },
22466
22524
  { cn: "衍生产品供应商", en: "Vendor", value: "Service" }
22467
22525
  ],
22526
+ // ===== 表单校验规则 =====
22468
22527
  rules: {
22528
+ // city: 城市必选,change 和 blur 时触发
22469
22529
  city: [
22470
22530
  {
22471
22531
  required: true,
@@ -22473,6 +22533,7 @@ const _sfc_main$d = {
22473
22533
  trigger: ["change", "blur"]
22474
22534
  }
22475
22535
  ],
22536
+ // companyName: 公司名校验(货主行业跳过;通过 validateCompanyName 进行业务校验)
22476
22537
  companyName: [
22477
22538
  {
22478
22539
  required: true,
@@ -22486,6 +22547,7 @@ const _sfc_main$d = {
22486
22547
  trigger: "blur"
22487
22548
  }
22488
22549
  ],
22550
+ // nameCn: 中文姓名校验(仅在"已有公司 + 中国区"场景下生效),调用 validateName 校验中文名
22489
22551
  nameCn: [
22490
22552
  {
22491
22553
  required: true,
@@ -22499,6 +22561,7 @@ const _sfc_main$d = {
22499
22561
  trigger: "blur"
22500
22562
  }
22501
22563
  ],
22564
+ // firstName: 名校验(仅在"已有公司 + 海外区"场景下生效),调用 validateName 校验英文名
22502
22565
  firstName: [
22503
22566
  {
22504
22567
  required: true,
@@ -22512,6 +22575,7 @@ const _sfc_main$d = {
22512
22575
  trigger: "blur"
22513
22576
  }
22514
22577
  ],
22578
+ // lastName: 姓校验(仅在"已有公司 + 海外区"场景下生效)
22515
22579
  lastName: [
22516
22580
  {
22517
22581
  required: true,
@@ -22525,6 +22589,7 @@ const _sfc_main$d = {
22525
22589
  trigger: "blur"
22526
22590
  }
22527
22591
  ],
22592
+ // email: 邮箱格式校验(仅在海外区生效),调用 validateUserEmail 验证
22528
22593
  email: [
22529
22594
  {
22530
22595
  required: true,
@@ -22532,6 +22597,7 @@ const _sfc_main$d = {
22532
22597
  trigger: "blur"
22533
22598
  }
22534
22599
  ],
22600
+ // phone: 手机号格式校验(仅在中国区生效),调用 validateUserMobilefive 验证
22535
22601
  phone: [
22536
22602
  {
22537
22603
  required: true,
@@ -22539,6 +22605,7 @@ const _sfc_main$d = {
22539
22605
  trigger: "blur"
22540
22606
  }
22541
22607
  ],
22608
+ // code: 4 位验证码校验,调用 validateVerifyCode 验证格式和必填
22542
22609
  code: [
22543
22610
  {
22544
22611
  required: true,
@@ -22546,6 +22613,7 @@ const _sfc_main$d = {
22546
22613
  trigger: "blur"
22547
22614
  }
22548
22615
  ],
22616
+ // agree: 用户协议复选框必勾选,未勾选时显示提示
22549
22617
  agree: [
22550
22618
  {
22551
22619
  required: true,
@@ -22564,27 +22632,38 @@ const _sfc_main$d = {
22564
22632
  }
22565
22633
  ]
22566
22634
  },
22635
+ // 验证码倒计时中,防止用户重复发送
22567
22636
  isCounting: false,
22637
+ // 区号列表数据(从接口获取)
22568
22638
  areaCodeData: [],
22639
+ // 短信验证码发送后返回的 UID,提交注册时需回传后端
22569
22640
  mobileUid: "",
22570
- // 存储短信验证码凭证
22641
+ // 邮箱验证码发送后返回的 UID,提交注册时需回传后端
22571
22642
  emailUid: "",
22572
- // 存储邮箱验证码凭证
22643
+ // 是否展示已有公司卡片(true → 申请加入模式;false → 新设公司模式)
22573
22644
  hasResistCompany: false,
22645
+ // 已有公司信息对象(compId, compNameCn, compNameEn, cityNameCn 等)
22574
22646
  resistCompanyInfo: null,
22575
- // 存储接口返回的已有公司信息
22647
+ // 提交中状态,防止重复点击注册按钮
22576
22648
  loading: false
22577
22649
  };
22578
22650
  },
22651
+ // =========================================================================
22652
+ // 生命周期 - 初始化时获取区号、行业字典、并检查是否有 compKey 邀请
22653
+ // =========================================================================
22579
22654
  mounted() {
22580
22655
  this.getAreaCodeData();
22581
22656
  this.findDict();
22582
22657
  this.inviteJoinGetComp();
22583
22658
  },
22659
+ // =========================================================================
22660
+ // Methods - 业务方法
22661
+ // =========================================================================
22584
22662
  methods: {
22585
22663
  go2Agreement: go2Agreement$1,
22586
22664
  getAuthSessionItems,
22587
22665
  go2Policy: go2Policy$1,
22666
+ // ===== 受邀加入公司:通过 sessionStorage 中的 compKey 获取已有公司信息 =====
22588
22667
  async inviteJoinGetComp() {
22589
22668
  const sessions = getAuthSessionItems();
22590
22669
  const key = sessions.compKey;
@@ -22593,6 +22672,7 @@ const _sfc_main$d = {
22593
22672
  this.hasResistCompany = true;
22594
22673
  this.resistCompanyInfo = res.data;
22595
22674
  },
22675
+ // ===== 获取行业类型字典(从接口动态获取,与本地默认值合并) =====
22596
22676
  findDict() {
22597
22677
  findDictApi({
22598
22678
  dictType: "cmc_company_industry_sector"
@@ -22614,10 +22694,12 @@ const _sfc_main$d = {
22614
22694
  }).catch((err) => {
22615
22695
  });
22616
22696
  },
22697
+ // ===== 切换公司名时重置查重状态(清除之前的"已有公司"标记) =====
22617
22698
  handleChangeCompany() {
22618
22699
  this.companyResistCn = false;
22619
22700
  this.companyResistEn = false;
22620
22701
  },
22702
+ // ===== 取消加入已有公司 → 恢复到新设公司模式,清空所有相关状态 =====
22621
22703
  handleCancelJoin() {
22622
22704
  this.hasResistCompany = false;
22623
22705
  this.companyResistCn = false;
@@ -22629,8 +22711,8 @@ const _sfc_main$d = {
22629
22711
  this.form.firstName = "";
22630
22712
  this.form.lastName = "";
22631
22713
  },
22714
+ // ===== 选择行业类型 → 若切换为"货主",清空所有公司相关信息(货主不需要填公司) =====
22632
22715
  handleSelectSector(value) {
22633
- this.form.sector = value;
22634
22716
  if (value === "Trade") {
22635
22717
  this.form.companyName = "";
22636
22718
  this.form.useKq = false;
@@ -22646,16 +22728,17 @@ const _sfc_main$d = {
22646
22728
  this.form.lastName = "";
22647
22729
  }
22648
22730
  },
22649
- // 点击申请加入按钮
22731
+ // ===== 申请加入已有公司按钮 → 切换为"已有公司"卡片模式,清除公司名校验错误 =====
22650
22732
  handleApplyJoinClick() {
22651
22733
  this.hasResistCompany = true;
22652
22734
  this.$nextTick(() => {
22653
22735
  this.$refs.registerFormRef.clearValidate("companyName");
22654
22736
  });
22655
22737
  },
22656
- /**
22657
- * 注册 Step 1:进入 Step 2
22658
- */
22738
+ // ===== [Step 1 → Step 2] 校验城市+联系方式后进入验证码/公司信息页面 =====
22739
+ // 1. 根据国家判断校验城市+手机(中国)还是城市+邮箱(海外)
22740
+ // 2. 校验通过后,快照当前联系方式用于后续"返回"时的智能判断
22741
+ // 3. 切换到 Step 2,清除所有校验错误提示
22659
22742
  handleNextStep() {
22660
22743
  const step1Fields = this.currentCountryIsChina ? ["city", "phone"] : ["city", "email"];
22661
22744
  this.$refs.registerFormRef.validateField(step1Fields, (isValid) => {
@@ -22667,9 +22750,10 @@ const _sfc_main$d = {
22667
22750
  });
22668
22751
  });
22669
22752
  },
22670
- /**
22671
- * 注册 Step 2:返回 Step 1
22672
- */
22753
+ // ===== [Step 2 → Step 1] 智能返回:已加入公司→取消加入;联系方式变化→重置验证码 =====
22754
+ // 两种返回路径:
22755
+ // 1. 当前处于"已有公司"卡片模式 → 取消加入,回到公司名输入界面
22756
+ // 2. 正常返回 Step 1:比对当前联系方式与快照,若发生变化则重置验证码状态
22673
22757
  handleBackToStep1() {
22674
22758
  if (this.hasResistCompany) {
22675
22759
  this.handleCancelJoin();
@@ -22684,9 +22768,14 @@ const _sfc_main$d = {
22684
22768
  this.$refs.registerFormRef.clearValidate();
22685
22769
  });
22686
22770
  },
22687
- /**
22688
- * 重置验证码相关状态
22689
- */
22771
+ // ===== 重置验证码所有相关状态 =====
22772
+ // 清空以下所有验证码相关的表单数据与 UI 状态:
22773
+ // - form.code:输入的 4 位验证码
22774
+ // - mobileUid / emailUid:滑块验证成功后服务端返回的 UID(用于验证码校验)
22775
+ // - verifyData:滑块验证组件的数据对象(含 ticket、randstr 等)
22776
+ // - codeReady:验证码输入框是否就绪(控制滑块重新弹出)
22777
+ // - isCounting:倒计时状态(停止倒计时)
22778
+ // 触发时机:用户返回 Step 1 且联系方式发生变化时
22690
22779
  resetVerifyState() {
22691
22780
  this.form.code = "";
22692
22781
  this.mobileUid = "";
@@ -22695,6 +22784,9 @@ const _sfc_main$d = {
22695
22784
  this.codeReady = false;
22696
22785
  this.isCounting = false;
22697
22786
  },
22787
+ // ===== 获取 IP 定位城市 + 区号列表 =====
22788
+ // 1. 调用 IP 定位 API 获取用户当前城市,自动填充城市选择器
22789
+ // 2. 调用区号列表 API 获取全球区号数据
22698
22790
  async getAreaCodeData() {
22699
22791
  var _a, _b, _c;
22700
22792
  const res1 = await getLocalIpDataApi();
@@ -22727,6 +22819,7 @@ const _sfc_main$d = {
22727
22819
  const res = await findPAreaCodeApi();
22728
22820
  this.areaCodeData = res.data.data.records;
22729
22821
  },
22822
+ // ===== 清空城市 → 重置验证码 + 公司查重 + 姓名等所有相关状态 =====
22730
22823
  handleClearCity() {
22731
22824
  this.resetVerifyState();
22732
22825
  this.companyResistEn = false;
@@ -22737,6 +22830,12 @@ const _sfc_main$d = {
22737
22830
  this.form.firstName = "";
22738
22831
  this.form.lastName = "";
22739
22832
  },
22833
+ // ===== 选择城市 → 处理城市/国家变化后的副作用 =====
22834
+ // 1. 提取城市 ID 和国家 ID
22835
+ // 2. 重置验证码状态(城市变化后需重新获取验证码)
22836
+ // 3. 非 compKey 邀请场景下,重置公司查重状态
22837
+ // 4. 若国家发生变化,清空公司名和快企信息(避免中英文公司名残留)
22838
+ // 5. 触发城市和公司名校验
22740
22839
  handleSelectCity(e) {
22741
22840
  var _a, _b, _c, _d;
22742
22841
  const prevCountryId = this.form.countryId;
@@ -22766,14 +22865,25 @@ const _sfc_main$d = {
22766
22865
  this.$refs.registerFormRef.validateField("city");
22767
22866
  });
22768
22867
  },
22868
+ // ===== 校验单个表单字段 =====
22869
+ // 用于在字段值变化时做局部校验(blur 事件触发),而非全量 validate
22870
+ // 特殊逻辑:当校验的是 email 或 phone 字段且校验通过,自动将 codeReady 置为 true,
22871
+ // 允许用户点击发送验证码;若校验失败则 codeReady 为 false,按钮保持禁用
22769
22872
  validateField(field) {
22770
- if (!this.$refs.registerFormRef) return;
22771
22873
  this.$refs.registerFormRef.validateField(field, (isValid) => {
22772
22874
  if (field === "email" || field === "phone") {
22773
22875
  this.codeReady = isValid;
22774
22876
  }
22775
22877
  });
22776
22878
  },
22879
+ // ===== 发送验证码 =====
22880
+ // 根据当前国家选择 API:中国 → sendMobileCodeApi(短信),海外 → sendEmailCodeApi(邮箱)
22881
+ // 参数说明:
22882
+ // captchaData:滑块验证通过后传入的数据
22883
+ // - uuid:滑块会话标识(注册提交时需与验证码一起回传)
22884
+ // - code:滑块验证码
22885
+ // startTimer:CodeInput 组件提供的倒计时启动函数(仅在接口成功时调用,避免失败时锁死按钮)
22886
+ // 成功后将返回的 verifyCode 存入 mobileUid/emailUid,用于后续注册提交时的校验回传
22777
22887
  handleGetCode({ captchaData, startTimer }) {
22778
22888
  this.verifyData = captchaData;
22779
22889
  const params = {
@@ -22808,6 +22918,19 @@ const _sfc_main$d = {
22808
22918
  });
22809
22919
  console.log("发送注册验证码");
22810
22920
  },
22921
+ // ===== 提交注册:全量校验后构建 payload,分流至"新设公司"或"申请加入" =====
22922
+ // 执行步骤:
22923
+ // 1. 全量表单校验(el-form validate)
22924
+ // 2. 检查是否已获取验证码(verifyData.uuid 必须存在,否则提示"请先获取验证码")
22925
+ // 3. 构建通用提交参数:appId、session 来源信息(clickSource/activityCode/referenceUserId/empNo)、
22926
+ // 行业类型(industrySector)、滑块验证数据(uuid/code)、项目 ID、注册入口标记
22927
+ // 4. 根据联系方式类型分支:
22928
+ // - MOBILE(中国区):区号 + 加密后的手机号 + 验证码 + 验证码 UUID
22929
+ // - EMAIL(海外区):邮箱地址 + 验证码 + 验证码 UUID
22930
+ // 5. 分流到具体提交方法:
22931
+ // - hasResistCompany=true → handleApplyJoinSubmit(申请加入已有公司)
22932
+ // - hasResistCompany=false → handleNewCompanySubmit(新设公司注册)
22933
+ // - 同时收集 session 中的国家/城市/公司名缓存,供注册后写入
22811
22934
  handleRegister() {
22812
22935
  this.$refs.registerFormRef.validate((valid) => {
22813
22936
  var _a;
@@ -22863,9 +22986,14 @@ const _sfc_main$d = {
22863
22986
  }
22864
22987
  });
22865
22988
  },
22866
- /**
22867
- * 逻辑 A:新设公司注册
22868
- */
22989
+ // ===== [A 路径] 新设公司注册 =====
22990
+ // 构建注册 payload 并调用注册 API:
22991
+ // 1. 合并基础参数 + 城市(cityId)/ 国家(countryId)/ 行业(industrySector)
22992
+ // 2. 非货主行业:附加公司名(中国→compNameCn,海外→compNameEn)+ 快企查重信息
22993
+ // (注意:kqInfo 中若含 compId 字段需排除,避免与新接口的 compId 语义冲突)
22994
+ // 3. 货主行业:不提交公司名称相关字段
22995
+ // 4. 根据 session 中的 uniqueCode 判断调用普通注册 API 或第三方绑定注册 API
22996
+ // 注册成功后统一调用 handlePostRegister 处理响应分流
22869
22997
  async handleNewCompanySubmit(baseData) {
22870
22998
  const sessionStorageItems = this.getAuthSessionItems();
22871
22999
  const registerPayload = {
@@ -22904,9 +23032,14 @@ const _sfc_main$d = {
22904
23032
  this.loading = false;
22905
23033
  }
22906
23034
  },
22907
- /**
22908
- * 逻辑 B:申请加入公司提交
22909
- */
23035
+ // ===== [B 路径] 申请加入已有公司 =====
23036
+ // 构建申请 payload 并调用注册 API:
23037
+ // 1. 携带已有公司 ID(compId),来源:公司查重匹配或 compKey 邀请链接
23038
+ // 2. 申请者姓名:中国区提交 nameCn;海外区拼接 firstName + lastName 为 nameEn
23039
+ // 3. 移除与新设公司相关的字段(industrySector、compNameEn/Cn、countryId、cityId 等),
23040
+ // 因为加入已有公司无需新建公司信息
23041
+ // 4. 根据 uniqueCode 判断调用普通注册 API 或第三方绑定注册 API
23042
+ // 注册成功后统一调用 handlePostRegister 处理响应分流
22910
23043
  async handleApplyJoinSubmit(baseData) {
22911
23044
  const sessionStorageItems = this.getAuthSessionItems();
22912
23045
  const applyPayload = {
@@ -22951,6 +23084,10 @@ const _sfc_main$d = {
22951
23084
  this.loading = false;
22952
23085
  }
22953
23086
  },
23087
+ // ===== 延迟跳转工具函数 =====
23088
+ // 先清除 sessionStorage 中的认证缓存数据(路径、来源等),再执行页面跳转
23089
+ // delayInput 支持传入毫秒数或数字字符串,经 normalizeDelayMs 统一转换为毫秒
23090
+ // 典型用法:注册成功后延迟 1000ms 跳转到 redirectPath
22954
23091
  executeRedirectWithDelay(redirectPath, delayInput) {
22955
23092
  const delayMs = normalizeDelayMs(delayInput);
22956
23093
  setTimeout(() => {
@@ -22958,6 +23095,17 @@ const _sfc_main$d = {
22958
23095
  handleRedirect$1(redirectPath);
22959
23096
  }, delayMs);
22960
23097
  },
23098
+ // ===== 注册成功后的统一后处理 =====
23099
+ // 根据接口返回的 res.data 分三种情况处理:
23100
+ // 1. improveComp 存在(第三方登录注册后需要完善公司信息)
23101
+ // → 不入库 tgc,不做跳转,直接 emit need-complete 事件,
23102
+ // 由父组件切换到 CompleteInfoForm 完善信息
23103
+ // 2. redirect 为 true(注册成功直接登录)
23104
+ // → 写入 tgc 凭证到 Cookie(30 天有效期)
23105
+ // → emit register-success,携带流控对象(redirect/preventDefault 方法)
23106
+ // 如果父组件没有调用 redirect 或 preventDefault,则内部自动跳转到 redirectPath
23107
+ // 3. redirect 为 false(注册提交成功但需要审核)
23108
+ // → 提示"注册成功,请等待审核",不做跳转,关闭弹窗或保持当前状态
22961
23109
  handlePostRegister(res) {
22962
23110
  const sessionStorageItems = this.getAuthSessionItems();
22963
23111
  console.log("🍉 ~ RegisterForm.vue:749 ~ res.data:", res.data);
@@ -23463,7 +23611,7 @@ function _sfc_render$3(_ctx, _cache, $props, $setup, $data, $options) {
23463
23611
  }, 8, ["model", "rules"])
23464
23612
  ]);
23465
23613
  }
23466
- const RegisterForm = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["render", _sfc_render$3], ["__scopeId", "data-v-f13d1db1"]]);
23614
+ const RegisterForm = /* @__PURE__ */ _export_sfc(_sfc_main$d, [["render", _sfc_render$3], ["__scopeId", "data-v-4ae4e4b8"]]);
23467
23615
  const _imports_0$3 = "data:image/webp;base64,UklGRs4CAABXRUJQVlA4WAoAAAAQAAAAJwAAJwAAQUxQSFoBAAABN6KgbRtmp+3Gn/RDEBEEkzTVdowBQKcP3554FoBl23ba5llJyswNJ2VumGWofOY/p8qSit8R/Z8A+a8elYOpw8ta7XyzQK0aYSpXkxxr+l5TIvLMOMTaaw75atjrjVMg6apzYNuvnZH3q2Wxbl7NYR4Ddz6qB+/b4lxd8llHbmrIR018WxYu3QboXfHdMLae0xXZtvhGY+x52WHLcCHeNxRfOfR5Fu/tpdZaJ1mWZeOiA0zFL+w9j/I9NSffY5NUvmeVwTfp8PxNbrn9HRbs2zo8fU3Muq3K6EtK5JFtkzT6ilPmUrji+CvueSh64OULVMJJ0TamEq7JXBx7vAZTCVWXbcNlqBdm4nxFthPmGrPrJj2SvRBXUBdPNcTUvdQTXIu3eoP+gVt1hWlKyLaBQaNs275awvJIwlYeDaBH/f40BXQnkuCVq7HBmr5VI/naaP+iWj1bl98fVlA4IE4BAAAQBwCdASooACgAPi0ShkKhoQ42SgAMAWJZWxKQyHAkNc+PADbI89n6J94A3jAJQK0xA6Tk60mYtNspcySSE/tFIADM///yqf//Kgv//ywQt7g1bu7h+xw3tKfdFW3YSP2h0iF6VIn4CTXLv//vM//94Jv//ee+S0E0m6xnEgxdBDf7ewX/lL4BgZWe2EfgOrK0pMN4Qy5uWqWBS4KWWUfrCz0nMK/H/I4/+XhdD+65pGbyiKvih/6tn//ciDb/uimjajMDV4Q/Xe6/5j9xYKcn08xURQpu0wODf/+3SuKUFZLR0yHKFUmWQGuB/RhP/o3UFQW2JYdAdLNwvjre+S6H5X//i0Kc3jhiy9mLmUsuJ+4/5++fwdGZUbaTBUfk9QB9rjsVLVNwQW2lzccI98O08eePpfHRQKN1FzjT/cMehMc50hgx//o3l7EokAAA";
23468
23616
  const _imports_1$2 = "data:image/webp;base64,UklGRhACAABXRUJQVlA4WAoAAAAQAAAAGAAAFwAAQUxQSOcAAAABgINt27HlzZxs1+i945+yudmaXJMm27btmmzbtm094f2+L88RMQHoH0ivGDZ+dTufRGOhwhmw/QIfT5NlyDEEHdz1zdzA5sDmTZ4EKeWJp2may+JdpEray5o7HRnnPYCzy2e43uvNSQvW5CfhcwDY1eKWK4CX3WgRAt0NzG7T6At8vGkUw3FXXX8YGLkf9c+8rLBeOI2gxyD51juA6+5ZuFjaej6YvL3vEsEhxb5nuOicA8KHHlECg1QHMzfnukeCszhGAgY6hBCT+RTuvkMWUWQz7XsGgPs2OUSdS9Uv2N0tWOIT/l4AVlA4IAIBAACwBwCdASoZABgAPjESh0KiIQ39VgAQAYJbACdM5JkB+meFg2gDaAN0l4AD9QPSA/wHuJ/sl6KYX31WXITTIqQjhEf+VVEAAP0cZ9TkuKczs9Y1za4WaelqmDJ+pg5xRI8RGqa0Xf/vA/xc/Jt7352wODrO+GBNH/+k0H/0IZkEP/+9kflw8xfZOvuJnYDve0V1+ez//9tEgIWxjEjRen4x7s8w+Gha3PQxumTkBwxFTp+YlQXvZzWdZW3wRP0nsu895denVK5N8FE8Zg23a9118GTARL99uq+SY4/E8PeGs/GKL4ufe2EdSmq0ixJ9pxRZOAX/4XkoyRtaDa35BrgAAAA=";
23469
23617
  const _hoisted_1$c = { class: "login-wx" };
@@ -23590,6 +23738,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
23590
23738
  fetchWxCode();
23591
23739
  };
23592
23740
  const processLoginSuccess = async (loginData) => {
23741
+ var _a;
23593
23742
  if (loginData.result) {
23594
23743
  setTokenAll(loginData.result);
23595
23744
  }
@@ -23614,6 +23763,10 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
23614
23763
  fetchWxCode();
23615
23764
  }
23616
23765
  } else {
23766
+ if ((_a = loginData.result) == null ? void 0 : _a.improveComp) {
23767
+ emit("need-complete", loginData.result.improveComp);
23768
+ return;
23769
+ }
23617
23770
  completeRedirect(loginData.redirectPath);
23618
23771
  }
23619
23772
  };
@@ -23705,7 +23858,7 @@ const _sfc_main$c = /* @__PURE__ */ defineComponent({
23705
23858
  };
23706
23859
  }
23707
23860
  });
23708
- const WechatLogin = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__scopeId", "data-v-39252503"]]);
23861
+ const WechatLogin = /* @__PURE__ */ _export_sfc(_sfc_main$c, [["__scopeId", "data-v-84a63da0"]]);
23709
23862
  const _sfc_main$b = {
23710
23863
  name: "LoginTypeSwitcher",
23711
23864
  components: {
@@ -23814,7 +23967,7 @@ function _sfc_render$2(_ctx, _cache, $props, $setup, $data, $options) {
23814
23967
  _: 1
23815
23968
  }, 8, ["model-value", "onChange"]);
23816
23969
  }
23817
- const LoginTypeSwitcher = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["render", _sfc_render$2], ["__scopeId", "data-v-1dd50882"]]);
23970
+ const LoginTypeSwitcher = /* @__PURE__ */ _export_sfc(_sfc_main$b, [["render", _sfc_render$2], ["__scopeId", "data-v-ed6d6ee4"]]);
23818
23971
  const _imports_0$2 = "data:image/webp;base64,UklGRhgCAABXRUJQVlA4WAoAAAAQAAAALwAALwAAQUxQSKIAAAABgFZbb9xIEATBUAyhEAqhDBIGNgOXQaEIgiAYwtfZtM3+LyImgP4d+1BAVqvCAx8OLsECo3CFAfMo0ODsecsz88SjeXD/vNQjedOzPgDCuqfl0bRNKsBiEa5APD+aTCWI2l0AnZ3ehTnKW+9dgIp/Kf146Aa2PM5egI8Ns66WwwOBq70JvmyE6jVsIPwIOpB4xuyMXU5jbhlnDF0lSm/03whWUDggUAEAAPALAJ0BKjAAMAA+LRKGQqGhDjduAAwBYlsAMgdwP4BoK/wA4aTvN+x2I4/APyq/oHuA/gHOJ7gD9XfMA6QDrYP0z9gD9APRQ/ZD4FP219gD9UARvMpbMuVN2542MibJh8RTb2jFdmX4AP7/8PzX//KRnpdaTTuezU2wfPVue6zvilNiLydYqgogCDf+z+cTn0sw++BUMUAXW/ykOXcyNB2xLlv/9baGU9jTlskvg+1Mv/puM3RR2VkkR8nzfym/nfxZ64t/3bWsauPme9EKHGYBBZv8u8jT/DUfv3hKs//3THxis4v6eWcTTUpo9W6e2PurHwS2B16ei/If+Ww23FLqmd3jWPwTwBTDBEJ3HBZfQftnPWpA9rY4f//0skE1+0YwOJB/my/FIk/GCZloGHd/7iN//8vNjd/zOhSoSRNP6Xtp1K0Qc6nr99ilYAAAAA==";
23819
23972
  const _imports_1$1 = "data:image/webp;base64,UklGRiQBAABXRUJQVlA4WAoAAAAQAAAALwAALwAAQUxQSL8AAAABcFXbVtygAAdPSGKgDqIgMVAMgAIcxEdRAApQcJ0E3tD5LyLYuG0jSXKOaqvMPsL9Ha6xASWTFT5hMHmbKphYTJIwNRlAYFz0ZMB4PDiqHrB+XhpHMT4TIOtZOJhbp0OUOCcy1XDo75yrSk6UONkFJb71XIAWhxs/aFYm7qhkV5PvDmWYa1lGV2s4Wwd6OcM6RlE+dOaZZrpEXD5BoOr3d+sQWTfFkxAbhATAOF1DN6cKD1TD3cncipS2uz9DBwBWUDggPgAAAFADAJ0BKjAAMAA+JQ6FQqGHjAYAkS0gABSWHJn8435xRpEAAP7//k4XP//7dtNf5ihlI///6OQD//9v7AAA";
23820
23973
  const _hoisted_1$a = { class: "wechat-choose-type" };
@@ -23882,7 +24035,7 @@ const _sfc_main$a = /* @__PURE__ */ defineComponent({
23882
24035
  };
23883
24036
  }
23884
24037
  });
23885
- const WechatChooseType = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-09068331"]]);
24038
+ const WechatChooseType = /* @__PURE__ */ _export_sfc(_sfc_main$a, [["__scopeId", "data-v-f485c6be"]]);
23886
24039
  const _imports_0$1 = "data:image/webp;base64,UklGRkYDAABXRUJQVlA4WAoAAAAQAAAATwAATwAAQUxQSK0BAAABkJVtT55JrwQkRAISIqEOBgl1sDhoHVAHXQdIQEIkICH780ETOodzEBETgJ+MA3FKG8fvIaQiOm5lCy/j2vVx4RdxVdtKLwmH2pfwBmrqKbQeifr2bTUSdd/WIlH/HpcqOuxnyjJT9/0aqISFkg47AaCJGwDOgeaFZPQb/7dR/I9HSsuwjsuHapaXKRMaAZCOawBQJvoyMqN3PvqEypGrzsZFgvrLmShgXXYrjMDHLSLS6rGR3+ZUCVy7TtfklVz6Dq76XJIPe0gMh9oW8iAHIWpqLeSAbhdJ1L5Hh8ssB1HPTnZsJTjUV4IZxChFHUrartG5nf2TZju2EdQRAaifCgAe9GCG22QnHQoA7J8SAAw02wWxiPtIv4AgnyqAX6NmBxID1Am9S9ehlKqTwQ4kjxpkxj46gORJha6YPBCuR32FzQXxQYOswD7ng457heAj/8ndPmnYF6hwjaoqCUDglEspRAskn1Ml4WF1E/huCY/ZjZ1MT6eM9UNzufBGEocaXgFqZhdem412vJiqCb8JiJdM9f/OdwHg/a4i0soeQZeqvO4pi8bvBWD8PAwAVlA4IHIBAACQDQCdASpQAFAAPjESh0KiIQzPMmYQAYJYgDTVCv5F+Mf4gb4DJX+Sz7l/ANsR/t26P/QD/AegB1gH9L/gHoV9YB+tfoUf7T/efAf+sP68fAV+m//U1vlDvsJaoYWahGVgTNJjQto23T3wmPTWzB6ZzMk6AwAA/v7uqgr/9ZP//7blAnmnE6lioCaVp1+WnldB5HpBbYjxc1NG5XU54UvD9kf2w/pZ7/42ltzXYtGbK1//nqr8tjkze5eVKps78/9WExTMn4pKTe3c8mpsuj8YwNG+XmxN6qsxIT2EwKQHnE5z8J/+pe+1IL/r1o8YBWTv7H+OAb1dnyF/HIBfP7w3V0JsIK9k9luJE6Inls4/P8XLinjMj63/lB+fL9Mg/9VBqi1r084wLn/+c3RisrFoveLUv2I5xww1R/MwdnWNwJwQ8oKLyHlGl0b3UxrGhAtGoS5KzFv4B538wnEyq7d8a9J8x7Ua1ZythfCc5mNgAAAA";
23887
24040
  const _imports_2 = "data:image/webp;base64,UklGRtgAAABXRUJQVlA4WAoAAAAQAAAAHwAAHwAAQUxQSG8AAAABcFXbVq2cCEQ4EYxABBtIhNvg0kAaEMEIJwoRiLB86/b5GxETYP9n6T1rGiyaBULjMJPEAvaaDOwkdgBWSRrAKH4rxsOTq3NzbfD0/Cr+eACzZk/XHl+Bluz5DlRTBnRTOuCSAmHSBlU0xlbzdwIAVlA4IEIAAABwAwCdASogACAAPjESjEYiENDKACADBLSAACWH58lev5ur/aAA/iw///2p6j//i/2//+H8FPIH///0cbN//9v7AAA=";
23888
24041
  function useAuthLogin(options = {}) {
@@ -24197,7 +24350,6 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
24197
24350
  const emits = __emit;
24198
24351
  const {
24199
24352
  loading: loadingBtn,
24200
- // 将 Hook 的 loading 重命名为 loadingBtn
24201
24353
  handleBindSubmit
24202
24354
  } = useAuthLogin({
24203
24355
  appId: "ERA",
@@ -24583,7 +24735,7 @@ const _sfc_main$9 = /* @__PURE__ */ defineComponent({
24583
24735
  };
24584
24736
  }
24585
24737
  });
24586
- const WechatBindLogin = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__scopeId", "data-v-d48138a4"]]);
24738
+ const WechatBindLogin = /* @__PURE__ */ _export_sfc(_sfc_main$9, [["__scopeId", "data-v-a39fbac2"]]);
24587
24739
  const _sfc_main$8 = {
24588
24740
  name: "CompleteInfoForm",
24589
24741
  components: {
@@ -24612,6 +24764,10 @@ const _sfc_main$8 = {
24612
24764
  verifyData: {},
24613
24765
  codeReady: false,
24614
24766
  codeSent: false,
24767
+ mobileCodeReady: false,
24768
+ emailCodeReady: false,
24769
+ mobileCodeSent: false,
24770
+ emailCodeSent: false,
24615
24771
  mobileUid: "",
24616
24772
  emailUid: "",
24617
24773
  areaCodeData: [],
@@ -24633,7 +24789,8 @@ const _sfc_main$8 = {
24633
24789
  phone: "",
24634
24790
  areaCode: "+86",
24635
24791
  email: "",
24636
- code: "",
24792
+ mobileCode: "",
24793
+ emailCode: "",
24637
24794
  useKq: false,
24638
24795
  kqCode: "",
24639
24796
  kqInfo: null
@@ -24690,7 +24847,14 @@ const _sfc_main$8 = {
24690
24847
  trigger: "blur"
24691
24848
  }
24692
24849
  ],
24693
- code: [
24850
+ mobileCode: [
24851
+ {
24852
+ required: true,
24853
+ validator: (rule, value, cb) => validateVerifyCode$1(rule, value, cb, this.isEn),
24854
+ trigger: "blur"
24855
+ }
24856
+ ],
24857
+ emailCode: [
24694
24858
  {
24695
24859
  required: true,
24696
24860
  validator: (rule, value, cb) => validateVerifyCode$1(rule, value, cb, this.isEn),
@@ -24701,29 +24865,44 @@ const _sfc_main$8 = {
24701
24865
  };
24702
24866
  },
24703
24867
  computed: {
24868
+ // 当前城市所属国家 ID
24704
24869
  countryId() {
24705
24870
  var _a, _b, _c, _d;
24706
24871
  return ((_c = (_b = (_a = this.form.city) == null ? void 0 : _a.raw) == null ? void 0 : _b.country) == null ? void 0 : _c.id) || ((_d = this.resistCompanyInfo) == null ? void 0 : _d.countryId);
24707
24872
  },
24873
+ // 当前城市 ID
24708
24874
  cityId() {
24709
24875
  var _a;
24710
24876
  return (_a = this.form.city) == null ? void 0 : _a.id;
24711
24877
  },
24878
+ // 当前国家是否为中国
24712
24879
  currentCountryIsChina() {
24713
24880
  const id = this.countryId;
24714
24881
  return [1].includes(Number(id));
24715
24882
  },
24883
+ // 公司名称输入框标签文字
24716
24884
  currentCompanyLabel() {
24717
24885
  return this.isEn ? this.currentCountryIsChina ? "Company Name in Chinese" : "Company Name in English" : this.currentCountryIsChina ? "公司中文名称" : "公司英文名称";
24718
24886
  },
24887
+ /**
24888
+ * 是否显示手机验证码区域
24889
+ * 条件:渲染就绪 && 中国区 && 当前用户未绑定手机号
24890
+ * 已绑定手机号的用户无需再次验证
24891
+ */
24719
24892
  isShowMobileCode() {
24720
24893
  if (!this.isReady) return false;
24721
24894
  return this.currentCountryIsChina && !this.currentUserMobile;
24722
24895
  },
24896
+ /**
24897
+ * 是否显示邮箱验证码区域
24898
+ * 条件:渲染就绪 && 当前用户未绑定邮箱
24899
+ * 已绑定邮箱的用户无需再次验证
24900
+ */
24723
24901
  isShowEmailCode() {
24724
24902
  if (!this.isReady) return false;
24725
24903
  return !this.currentUserEmail;
24726
24904
  },
24905
+ // 验证码输入组件标签
24727
24906
  codeInputLabel() {
24728
24907
  return buildCodeInputLabel({
24729
24908
  isChina: this.currentCountryIsChina,
@@ -24804,41 +24983,51 @@ const _sfc_main$8 = {
24804
24983
  },
24805
24984
  validateField(field) {
24806
24985
  this.$refs.formRef.validateField(field, (isValid) => {
24807
- if (field === "phone" || field === "email") {
24808
- this.codeReady = isValid;
24809
- this.codeSent = false;
24810
- if (field === "phone") {
24811
- this.mobileUid = "";
24812
- } else {
24813
- this.emailUid = "";
24814
- }
24986
+ if (field === "phone") {
24987
+ this.mobileCodeReady = isValid;
24988
+ this.mobileCodeSent = false;
24989
+ this.mobileUid = "";
24990
+ } else if (field === "email") {
24991
+ this.emailCodeReady = isValid;
24992
+ this.emailCodeSent = false;
24993
+ this.emailUid = "";
24815
24994
  }
24816
24995
  });
24817
24996
  },
24818
- handleGetCode({ captchaData, startTimer }) {
24997
+ /**
24998
+ * 发送验证码
24999
+ * @param captchaData - 滑块验证返回的 { uuid, code }
25000
+ * @param type - 'mobile' 发送手机验证码 | 'email' 发送邮箱验证码
25001
+ * 根据 type 参数选择不同的 API,成功后设置对应的 codeSent/Uid 状态,
25002
+ * 接口成功后才调用 startTimer 启动倒计时
25003
+ */
25004
+ handleGetCode({ captchaData, startTimer }, type = "mobile") {
25005
+ var _a;
24819
25006
  this.verifyData = captchaData;
25007
+ const isMobile = type === "mobile";
24820
25008
  const params = {
24821
- target: this.isShowMobileCode ? this.form.phone : this.form.email,
25009
+ target: isMobile ? this.form.phone : this.form.email,
24822
25010
  uuid: captchaData.uuid,
24823
25011
  code: captchaData.code
24824
25012
  };
24825
- const api2 = this.isShowMobileCode ? sendMobileCodeApi : sendEmailCodeApi;
24826
- if (this.isShowMobileCode) {
25013
+ const api2 = isMobile ? sendMobileCodeApi : sendEmailCodeApi;
25014
+ if (isMobile) {
24827
25015
  params.areaCode = this.form.areaCode;
24828
- params.areaCodeCountryId = this.areaCodeData.find(
25016
+ params.areaCodeCountryId = (_a = this.areaCodeData.find(
24829
25017
  (item) => item.telCode === this.form.areaCode
24830
- ).id;
25018
+ )) == null ? void 0 : _a.id;
24831
25019
  }
24832
25020
  api2(params).then((res) => {
24833
- var _a;
24834
- const verifyCode = ((_a = res.data.data) == null ? void 0 : _a.verifyCode) || res.data.verifyCode;
25021
+ var _a2;
25022
+ const verifyCode = ((_a2 = res.data.data) == null ? void 0 : _a2.verifyCode) || res.data.verifyCode;
24835
25023
  if (res.data.code === 0 && verifyCode) {
24836
- if (this.isShowMobileCode) {
25024
+ if (isMobile) {
24837
25025
  this.mobileUid = verifyCode;
25026
+ this.mobileCodeSent = true;
24838
25027
  } else {
24839
25028
  this.emailUid = verifyCode;
25029
+ this.emailCodeSent = true;
24840
25030
  }
24841
- this.codeSent = true;
24842
25031
  startTimer();
24843
25032
  ElMessage.success(this.isEn ? "Code Sent" : "验证码已发送");
24844
25033
  } else {
@@ -24853,7 +25042,7 @@ const _sfc_main$8 = {
24853
25042
  handleSubmit() {
24854
25043
  this.$refs.formRef.validate((valid) => {
24855
25044
  if (!valid) return;
24856
- if ((this.isShowMobileCode || this.isShowEmailCode) && !this.codeSent) {
25045
+ if (this.isShowMobileCode && !this.mobileCodeSent || this.isShowEmailCode && !this.emailCodeSent) {
24857
25046
  ElMessage.warning(
24858
25047
  this.isEn ? "Please send the verification code first" : "请先发送验证码"
24859
25048
  );
@@ -24866,8 +25055,13 @@ const _sfc_main$8 = {
24866
25055
  }
24867
25056
  });
24868
25057
  },
24869
- // 逻辑 A:新设公司提交 (原有逻辑)
25058
+ /**
25059
+ * 逻辑 A:新设公司提交
25060
+ * 组装城市、公司名、行业、手机/邮箱验证码数据,
25061
+ * 调用 completeCompRedirectApi 完成完善信息
25062
+ */
24870
25063
  handleNewSubmit() {
25064
+ var _a;
24871
25065
  this.loading = true;
24872
25066
  const payload = {
24873
25067
  cityId: this.form.cityId,
@@ -24877,14 +25071,14 @@ const _sfc_main$8 = {
24877
25071
  nameEn: !this.currentCountryIsChina ? this.form.companyName : "",
24878
25072
  mobile: this.form.phone,
24879
25073
  mobileVerificationCodeUuid: this.mobileUid,
24880
- mobileVerificationCodeVal: this.isShowMobileCode ? this.form.code : "",
25074
+ mobileVerificationCodeVal: this.isShowMobileCode ? this.form.mobileCode : "",
24881
25075
  areaCode: this.form.areaCode,
24882
- areaCodeCountryId: this.areaCodeData.find(
25076
+ areaCodeCountryId: (_a = this.areaCodeData.find(
24883
25077
  (item) => item.telCode === this.form.areaCode
24884
- ).id,
25078
+ )) == null ? void 0 : _a.id,
24885
25079
  email: this.form.email,
24886
25080
  emailVerificationCodeUuid: this.emailUid,
24887
- emailVerificationCodeVal: this.isShowEmailCode ? this.form.code : "",
25081
+ emailVerificationCodeVal: this.isShowEmailCode ? this.form.emailCode : "",
24888
25082
  toSys: "ERA",
24889
25083
  path: (window == null ? void 0 : window.location.pathname) || "/",
24890
25084
  ...this.form.kqInfo
@@ -24896,12 +25090,21 @@ const _sfc_main$8 = {
24896
25090
  } else {
24897
25091
  ElMessage.error(res.data.msg);
24898
25092
  }
25093
+ }).catch(() => {
25094
+ ElMessage.error(
25095
+ this.isEn ? "Submission failed" : "提交失败,请重试"
25096
+ );
24899
25097
  }).finally(() => {
24900
25098
  this.loading = false;
24901
25099
  });
24902
25100
  },
24903
- // 逻辑 B:申请加入公司提交 (参考 RegisterForm 逻辑)
25101
+ /**
25102
+ * 逻辑 B:申请加入已有公司提交
25103
+ * 传入已有公司 compId + 用户姓名 + 验证码,调用 completeJoinCompanyRedirectApi
25104
+ * 成功后写入 tgc Cookie 并执行页面重定向
25105
+ */
24904
25106
  handleJoinSubmit() {
25107
+ var _a;
24905
25108
  this.loading = true;
24906
25109
  const payload = {
24907
25110
  compId: this.resistCompanyInfo.compId,
@@ -24910,17 +25113,17 @@ const _sfc_main$8 = {
24910
25113
  industrySector: this.form.sector,
24911
25114
  // 验证码信息
24912
25115
  areaCode: this.form.areaCode,
24913
- areaCodeCountryId: this.areaCodeData.find(
25116
+ areaCodeCountryId: (_a = this.areaCodeData.find(
24914
25117
  (item) => item.telCode === this.form.areaCode
24915
- ).id,
25118
+ )) == null ? void 0 : _a.id,
24916
25119
  account: this.isShowMobileCode ? this.form.phone : this.form.email,
24917
25120
  type: this.isShowMobileCode ? "MOBILE" : "EMAIL",
24918
25121
  mobile: this.form.phone,
24919
25122
  mobileVerificationCodeUuid: this.mobileUid,
24920
- mobileVerificationCodeVal: this.isShowMobileCode ? this.form.code : "",
25123
+ mobileVerificationCodeVal: this.isShowMobileCode ? this.form.mobileCode : "",
24921
25124
  email: this.form.email,
24922
25125
  emailVerificationCodeUuid: this.emailUid,
24923
- emailVerificationCodeVal: this.isShowEmailCode ? this.form.code : "",
25126
+ emailVerificationCodeVal: this.isShowEmailCode ? this.form.emailCode : "",
24924
25127
  toSys: getAppId() || "ERA",
24925
25128
  path: (window == null ? void 0 : window.location.pathname) || "/"
24926
25129
  };
@@ -24994,7 +25197,7 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
24994
25197
  createElementVNode("div", _hoisted_2$6, [
24995
25198
  createElementVNode("div", _hoisted_3$6, toDisplayString($props.isEn ? "Complete Your Information" : "完善企业信息"), 1),
24996
25199
  createElementVNode("div", _hoisted_4$6, [
24997
- _cache[15] || (_cache[15] = createElementVNode("img", {
25200
+ _cache[17] || (_cache[17] = createElementVNode("img", {
24998
25201
  src: "https://resources.jctrans.com/res/era/pc/img/icon_gantan.png",
24999
25202
  alt: ""
25000
25203
  }, null, -1)),
@@ -25027,7 +25230,7 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25027
25230
  placeholder: $props.isEn ? "Location(City)" : "请输入公司所在城市",
25028
25231
  onSelect: $options.handleSelectCity
25029
25232
  }, {
25030
- prefix: withCtx(() => [..._cache[16] || (_cache[16] = [
25233
+ prefix: withCtx(() => [..._cache[18] || (_cache[18] = [
25031
25234
  createElementVNode("i", { class: "icon-auth-location" }, null, -1)
25032
25235
  ])]),
25033
25236
  _: 1
@@ -25058,7 +25261,7 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25058
25261
  "onUpdate:existStatus": $options.handleCompanyExistStatus,
25059
25262
  onChange: $options.handleChangeCompany
25060
25263
  }, {
25061
- prefix: withCtx(() => [..._cache[17] || (_cache[17] = [
25264
+ prefix: withCtx(() => [..._cache[19] || (_cache[19] = [
25062
25265
  createElementVNode("i", { class: "icon-auth-company" }, null, -1)
25063
25266
  ])]),
25064
25267
  _: 1
@@ -25120,7 +25323,7 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25120
25323
  label: $options.currentCountryIsChina ? $props.isEn ? "Your Full Name in Chinese" : "您的中文名称" : $props.isEn ? "Your Full Name in English" : "您的名称",
25121
25324
  placeholder: $props.isEn ? "Please enter your name to prove your identity" : "请输入您的姓名,以证明您的身份"
25122
25325
  }, {
25123
- prefix: withCtx(() => [..._cache[18] || (_cache[18] = [
25326
+ prefix: withCtx(() => [..._cache[20] || (_cache[20] = [
25124
25327
  createElementVNode("i", { class: "icon-auth-user" }, null, -1)
25125
25328
  ])]),
25126
25329
  _: 1
@@ -25153,7 +25356,7 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25153
25356
  maxlength: "15"
25154
25357
  }, {
25155
25358
  prefix: withCtx(() => [
25156
- _cache[19] || (_cache[19] = createElementVNode("i", { class: "icon-auth-phone" }, null, -1)),
25359
+ _cache[21] || (_cache[21] = createElementVNode("i", { class: "icon-auth-phone" }, null, -1)),
25157
25360
  createVNode(_component_el_form_item, {
25158
25361
  prop: "areaCode",
25159
25362
  class: "tel-areacode",
@@ -25190,24 +25393,24 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25190
25393
  ]),
25191
25394
  _: 1
25192
25395
  }, 512),
25193
- createVNode(_component_el_form_item, { prop: "code" }, {
25396
+ createVNode(_component_el_form_item, { prop: "mobileCode" }, {
25194
25397
  default: withCtx(() => [
25195
25398
  createVNode(_component_CodeInput, {
25196
- modelValue: $data.form.code,
25197
- "onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => $data.form.code = $event),
25399
+ modelValue: $data.form.mobileCode,
25400
+ "onUpdate:modelValue": _cache[11] || (_cache[11] = ($event) => $data.form.mobileCode = $event),
25198
25401
  label: $options.codeInputLabel,
25199
25402
  placeholder: $props.isEn ? "Enter 4 Verification Code" : "请输入4位数字验证码",
25200
- ready: $data.codeReady,
25403
+ ready: $data.mobileCodeReady,
25201
25404
  "is-en": $props.isEn,
25202
25405
  "show-icon": "",
25203
25406
  "form-type-color": "4",
25204
- onSend: $options.handleGetCode
25407
+ onSend: _cache[12] || (_cache[12] = (data) => $options.handleGetCode(data, "mobile"))
25205
25408
  }, {
25206
- prefix: withCtx(() => [..._cache[20] || (_cache[20] = [
25409
+ prefix: withCtx(() => [..._cache[22] || (_cache[22] = [
25207
25410
  createElementVNode("i", { class: "icon-verify" }, null, -1)
25208
25411
  ])]),
25209
25412
  _: 1
25210
- }, 8, ["modelValue", "label", "placeholder", "ready", "is-en", "onSend"])
25413
+ }, 8, ["modelValue", "label", "placeholder", "ready", "is-en"])
25211
25414
  ]),
25212
25415
  _: 1
25213
25416
  })
@@ -25220,12 +25423,12 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25220
25423
  default: withCtx(() => [
25221
25424
  createVNode(_component_JcFloatInput, {
25222
25425
  modelValue: $data.form.email,
25223
- "onUpdate:modelValue": _cache[12] || (_cache[12] = ($event) => $data.form.email = $event),
25426
+ "onUpdate:modelValue": _cache[13] || (_cache[13] = ($event) => $data.form.email = $event),
25224
25427
  label: $props.isEn ? "Business Email Address" : "企业邮箱",
25225
25428
  placeholder: $props.isEn ? "Business Email Address, QQ Mail is not available" : "请输入您的企业邮箱,暂不支持QQ邮箱",
25226
- onBlur: _cache[13] || (_cache[13] = ($event) => $options.validateField("email"))
25429
+ onBlur: _cache[14] || (_cache[14] = ($event) => $options.validateField("email"))
25227
25430
  }, {
25228
- prefix: withCtx(() => [..._cache[21] || (_cache[21] = [
25431
+ prefix: withCtx(() => [..._cache[23] || (_cache[23] = [
25229
25432
  createElementVNode("i", { class: "icon-auth-email" }, null, -1)
25230
25433
  ])]),
25231
25434
  _: 1
@@ -25233,24 +25436,24 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25233
25436
  ]),
25234
25437
  _: 1
25235
25438
  }),
25236
- createVNode(_component_el_form_item, { prop: "code" }, {
25439
+ createVNode(_component_el_form_item, { prop: "emailCode" }, {
25237
25440
  default: withCtx(() => [
25238
25441
  createVNode(_component_CodeInput, {
25239
- modelValue: $data.form.code,
25240
- "onUpdate:modelValue": _cache[14] || (_cache[14] = ($event) => $data.form.code = $event),
25442
+ modelValue: $data.form.emailCode,
25443
+ "onUpdate:modelValue": _cache[15] || (_cache[15] = ($event) => $data.form.emailCode = $event),
25241
25444
  label: $options.codeInputLabel,
25242
25445
  placeholder: $props.isEn ? "Enter 4 Verification Code" : "请输入4位数字验证码",
25243
- ready: $data.codeReady,
25446
+ ready: $data.emailCodeReady,
25244
25447
  "is-en": $props.isEn,
25245
25448
  "show-icon": "",
25246
25449
  "form-type-color": "4",
25247
- onSend: $options.handleGetCode
25450
+ onSend: _cache[16] || (_cache[16] = (data) => $options.handleGetCode(data, "email"))
25248
25451
  }, {
25249
- prefix: withCtx(() => [..._cache[22] || (_cache[22] = [
25452
+ prefix: withCtx(() => [..._cache[24] || (_cache[24] = [
25250
25453
  createElementVNode("i", { class: "icon-verify" }, null, -1)
25251
25454
  ])]),
25252
25455
  _: 1
25253
- }, 8, ["modelValue", "label", "placeholder", "ready", "is-en", "onSend"])
25456
+ }, 8, ["modelValue", "label", "placeholder", "ready", "is-en"])
25254
25457
  ]),
25255
25458
  _: 1
25256
25459
  })
@@ -25258,7 +25461,7 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25258
25461
  createVNode(_component_el_button, {
25259
25462
  class: "submit-btn register-btn register-btn-is-active",
25260
25463
  loading: $data.loading,
25261
- disabled: ($options.isShowMobileCode || $options.isShowEmailCode) && !$data.codeSent,
25464
+ disabled: $options.isShowMobileCode && !$data.mobileCodeSent || $options.isShowEmailCode && !$data.emailCodeSent,
25262
25465
  onClick: $options.handleSubmit
25263
25466
  }, {
25264
25467
  default: withCtx(() => [
@@ -25271,7 +25474,7 @@ function _sfc_render$1(_ctx, _cache, $props, $setup, $data, $options) {
25271
25474
  }, 8, ["model", "rules"])
25272
25475
  ]);
25273
25476
  }
25274
- const CompleteInfoForm = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["render", _sfc_render$1], ["__scopeId", "data-v-1844ec39"]]);
25477
+ const CompleteInfoForm = /* @__PURE__ */ _export_sfc(_sfc_main$8, [["render", _sfc_render$1], ["__scopeId", "data-v-8d245598"]]);
25275
25478
  const _hoisted_1$7 = { class: "auth-footer-box" };
25276
25479
  const _sfc_main$7 = /* @__PURE__ */ defineComponent({
25277
25480
  __name: "FooterBox",
@@ -25320,7 +25523,7 @@ const _sfc_main$7 = /* @__PURE__ */ defineComponent({
25320
25523
  };
25321
25524
  }
25322
25525
  });
25323
- const FooterBox = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-de818a5b"]]);
25526
+ const FooterBox = /* @__PURE__ */ _export_sfc(_sfc_main$7, [["__scopeId", "data-v-00dec381"]]);
25324
25527
  const _hoisted_1$6 = { class: "forget-password-wrapper" };
25325
25528
  const _hoisted_2$5 = { class: "forgot-pwd-container" };
25326
25529
  const _hoisted_3$5 = { class: "header-title" };
@@ -25478,13 +25681,12 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
25478
25681
  }
25479
25682
  loading.value = true;
25480
25683
  try {
25481
- const { MD5 } = await Promise.resolve().then(() => index$6);
25482
25684
  const { data: res } = await resetPasswordApi({
25483
25685
  id: userData.value.id,
25484
25686
  account: userData.value.account,
25485
25687
  codeId: codeUid.value,
25486
25688
  codeValue: formB.code,
25487
- password: MD5(formB.password).toString(),
25689
+ password: cryptoJsExports.MD5(formB.password).toString(),
25488
25690
  ...verifyData.value
25489
25691
  });
25490
25692
  if (res.code === 0) {
@@ -25695,7 +25897,7 @@ const _sfc_main$6 = /* @__PURE__ */ defineComponent({
25695
25897
  };
25696
25898
  }
25697
25899
  });
25698
- const ForgetPassword = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-74e2cbb2"]]);
25900
+ const ForgetPassword = /* @__PURE__ */ _export_sfc(_sfc_main$6, [["__scopeId", "data-v-9dd4814c"]]);
25699
25901
  const _hoisted_1$5 = { class: "auth-bottom-tip" };
25700
25902
  const _sfc_main$5 = /* @__PURE__ */ defineComponent({
25701
25903
  __name: "AuthBottomTip",
@@ -25743,7 +25945,7 @@ const _sfc_main$5 = /* @__PURE__ */ defineComponent({
25743
25945
  };
25744
25946
  }
25745
25947
  });
25746
- const AuthBottomTip = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-db3be545"]]);
25948
+ const AuthBottomTip = /* @__PURE__ */ _export_sfc(_sfc_main$5, [["__scopeId", "data-v-b4421e4f"]]);
25747
25949
  const _imports_0 = "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1767855712095'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='9362'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cpath%20fill='currentcolor'%20d='M113.242353%20250.217412l356.352%20356.412235a60.235294%2060.235294%200%200%200%2080.655059%204.156235l4.577882-4.156235%20356.111059-356.171294c1.204706%204.397176%201.987765%208.914824%202.409412%2013.552941l0.240941%206.987294v481.882353c0%2042.345412-32.768%2077.101176-74.270118%2080.112941l-6.023529%200.240942H190.765176a80.293647%2080.293647%200%200%201-80.112941-74.330353l-0.180706-6.02353v-481.882353c0-4.818824%200.421647-9.456941%201.204706-14.034823l1.505883-6.746353z%20m720.052706-59.512471c4.818824%200%209.637647%200.421647%2014.215529%201.204706l6.866824%201.566118-342.136471%20342.13647-342.256941-342.13647c4.397176-1.204706%209.035294-2.048%2013.673412-2.409412l7.107764-0.361412h642.529883z'%20p-id='9363'%3e%3c/path%3e%3c/svg%3e";
25748
25950
  const _imports_1 = "data:image/svg+xml,%3c?xml%20version='1.0'%20standalone='no'?%3e%3c!DOCTYPE%20svg%20PUBLIC%20'-//W3C//DTD%20SVG%201.1//EN'%20'http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd'%3e%3csvg%20t='1767855760413'%20class='icon'%20viewBox='0%200%201024%201024'%20version='1.1'%20xmlns='http://www.w3.org/2000/svg'%20p-id='9516'%20xmlns:xlink='http://www.w3.org/1999/xlink'%20width='200'%20height='200'%3e%3cpath%20d='M694.874353%20918.949647c-57.825882-2.108235-221.726118-24.696471-393.336471-196.367059-171.610353-171.550118-194.258824-335.450353-196.367058-393.33647-3.252706-88.124235%2064.271059-173.778824%20142.336-207.209412a59.030588%2059.030588%200%200%201%2058.006588%206.324706c64.210824%2046.863059%20108.604235%20117.639529%20146.672941%20173.357176%2017.227294%2025.178353%2013.071059%2059.512471-10.24%2079.75153L363.52%20439.717647a19.275294%2019.275294%200%200%200-5.722353%2024.696471c17.709176%2032.346353%2049.332706%2080.353882%2085.473882%20116.495058%2036.141176%2036.141176%2086.437647%2069.752471%20120.952471%2089.509648a19.395765%2019.395765%200%200%200%2025.840941-6.445177l50.959059-77.703529c19.516235-25.961412%2056.018824-31.623529%2082.582588-13.251765%2056.500706%2039.092706%20122.458353%2082.642824%20170.706824%20144.444235a59.030588%2059.030588%200%200%201%207.589647%2059.632941c-33.611294%2078.426353-118.663529%20145.167059-207.088941%20141.914353z'%20p-id='9517'%3e%3c/path%3e%3c/svg%3e";
25749
25951
  const _hoisted_1$4 = { class: "bind-container" };
@@ -25996,6 +26198,18 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
25996
26198
  res.data.data
25997
26199
  );
25998
26200
  const data = res.data.data;
26201
+ if (data.subCode === "USER_HAS_OTHER_BIND" || res.data.subCode === "USER_HAS_OTHER_BIND") {
26202
+ ElMessage.error(
26203
+ props.isEn ? "Bound to other user" : "该账号已绑定其他用户"
26204
+ );
26205
+ return;
26206
+ }
26207
+ if (data.result) {
26208
+ setTokenAll(data.result);
26209
+ }
26210
+ if (data.tgc) {
26211
+ api$1.set("tgc", data.tgc, { expires: 30 });
26212
+ }
25999
26213
  emit("login-success", {
26000
26214
  ...data || {},
26001
26215
  accountType: ((_a = currentUser.value) == null ? void 0 : _a.accountType) || ((_b = currentUser.value) == null ? void 0 : _b.email) || ((_c = currentUser.value) == null ? void 0 : _c.mobile),
@@ -26229,9 +26443,9 @@ const _sfc_main$4 = /* @__PURE__ */ defineComponent({
26229
26443
  };
26230
26444
  }
26231
26445
  });
26232
- const ThirdBindLogin = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-42f093a7"]]);
26446
+ const ThirdBindLogin = /* @__PURE__ */ _export_sfc(_sfc_main$4, [["__scopeId", "data-v-e8b08f1c"]]);
26233
26447
  const _sfc_main$3 = {
26234
- name: "RegisterForm",
26448
+ name: "ThirdRegisterForm",
26235
26449
  components: {
26236
26450
  ElDialog,
26237
26451
  ElForm,
@@ -26260,34 +26474,43 @@ const _sfc_main$3 = {
26260
26474
  "register-step-change"
26261
26475
  ],
26262
26476
  computed: {
26477
+ // 是否同意用户协议
26263
26478
  isAgree() {
26264
26479
  return this.form.agree;
26265
26480
  },
26481
+ // 当前选择的城市所属国家 ID
26266
26482
  countryId() {
26267
26483
  var _a, _b, _c;
26268
26484
  return (_c = (_b = (_a = this.form.city) == null ? void 0 : _a.raw) == null ? void 0 : _b.country) == null ? void 0 : _c.id;
26269
26485
  },
26486
+ // 当前选择的城市 ID
26270
26487
  cityId() {
26271
26488
  var _a;
26272
26489
  return (_a = this.form.city) == null ? void 0 : _a.id;
26273
26490
  },
26491
+ // 当前国家是否为中国(countryId=1 为中国),影响表单字段与验证码发送方式
26274
26492
  currentCountryIsChina() {
26275
26493
  var _a;
26276
26494
  const id = this.countryId || ((_a = this.resistCompanyInfo) == null ? void 0 : _a.countryId);
26277
26495
  return [1].includes(Number(id));
26278
26496
  },
26497
+ // 公司名称输入框的 placeholder 文字,根据语言和地区动态切换
26279
26498
  currentCompanyLabel() {
26280
26499
  return this.isEn ? this.currentCountryIsChina ? "Company Name in Chinese" : "Company Name in English" : this.currentCountryIsChina ? "公司中文名称" : "公司英文名称";
26281
26500
  },
26501
+ // 是否选择了"货主(Trader)"行业类型,货主不需要填写公司名称
26282
26502
  isTraderSector() {
26283
26503
  return this.form.sector === "Trade";
26284
26504
  },
26505
+ // 是否显示邮箱绑定按钮(海外区 && 有第三方邮箱验证列表)
26285
26506
  showEmailBindBtn() {
26286
26507
  return !this.currentCountryIsChina && this.thirdPartyEmailVerifyList.length > 0;
26287
26508
  },
26509
+ // 是否显示手机号绑定按钮(中国区 && 有第三方手机验证列表)
26288
26510
  showMobileBindBtn() {
26289
26511
  return this.currentCountryIsChina && this.thirdPartyMobileVerifyList.length > 0;
26290
26512
  },
26513
+ // 验证码输入组件的标签文字,根据地区自动拼接手机号/邮箱
26291
26514
  codeInputLabel() {
26292
26515
  return buildCodeInputLabel({
26293
26516
  isChina: this.currentCountryIsChina,
@@ -26459,6 +26682,10 @@ const _sfc_main$3 = {
26459
26682
  type === "email" ? this.thirdPartyEmailVerifyList : this.thirdPartyMobileVerifyList
26460
26683
  );
26461
26684
  },
26685
+ /**
26686
+ * Step 1 → Step 2:校验城市 + 联系方式(手机/邮箱)后进入第 2 步
26687
+ * 同时快照当前联系方式,用于返回 Step 1 时的变更检测
26688
+ */
26462
26689
  handleNextStep() {
26463
26690
  const step1Fields = this.currentCountryIsChina ? ["city", "phone"] : ["city", "email"];
26464
26691
  this.$refs.registerFormRef.validateField(step1Fields, (isValid) => {
@@ -26470,6 +26697,11 @@ const _sfc_main$3 = {
26470
26697
  });
26471
26698
  });
26472
26699
  },
26700
+ /**
26701
+ * Step 2 → Step 1:返回到第 1 步
26702
+ * - 如果处于"已加入公司"状态,则回到公司名输入界面(取消加入)
26703
+ * - 如果联系方式有变更,重置验证码相关状态
26704
+ */
26473
26705
  handleBackToStep1() {
26474
26706
  if (this.hasResistCompany) {
26475
26707
  this.handleCancelJoin();
@@ -26629,6 +26861,13 @@ const _sfc_main$3 = {
26629
26861
  }
26630
26862
  });
26631
26863
  },
26864
+ /**
26865
+ * 发送验证码
26866
+ * - 滑块验证成功后的回调,接收 captchaData(含 uuid + code)
26867
+ * - 根据 currentCountryIsChina 选择 sendMobileCodeApi 或 sendEmailCodeApi
26868
+ * - 成功后保存 verifyCode UUID(mobileUid/emailUid),用于注册时提交
26869
+ * - 接口成功后才调用 startTimer() 启动倒计时,避免失败时按钮被锁
26870
+ */
26632
26871
  handleGetCode({ captchaData, startTimer }) {
26633
26872
  this.verifyData = captchaData;
26634
26873
  const params = {
@@ -26662,6 +26901,12 @@ const _sfc_main$3 = {
26662
26901
  console.error(err);
26663
26902
  });
26664
26903
  },
26904
+ /**
26905
+ * 注册提交入口
26906
+ * 1. 表单整体校验
26907
+ * 2. 组装提交数据(区分手机号/邮箱、拼接第三方登录信息)
26908
+ * 3. 业务分流:hasResistCompany ? 申请加入公司 : 新设公司注册
26909
+ */
26665
26910
  handleRegister() {
26666
26911
  this.$refs.registerFormRef.validate((valid) => {
26667
26912
  var _a;
@@ -26746,6 +26991,7 @@ const _sfc_main$3 = {
26746
26991
  const res = await registerThirdPartyCustomizedApi(registerPayload);
26747
26992
  this.handlePostRegister(res);
26748
26993
  } catch (err) {
26994
+ console.error("ThirdRegisterForm handleNewCompanySubmit error:", err);
26749
26995
  this.loading = false;
26750
26996
  }
26751
26997
  },
@@ -26784,6 +27030,7 @@ const _sfc_main$3 = {
26784
27030
  const res = await registerThirdPartyCustomizedApi(applyPayload);
26785
27031
  this.handlePostRegister(res);
26786
27032
  } catch (err) {
27033
+ console.error("ThirdRegisterForm handleApplyJoinSubmit error:", err);
26787
27034
  this.loading = false;
26788
27035
  }
26789
27036
  },
@@ -26794,6 +27041,14 @@ const _sfc_main$3 = {
26794
27041
  handleRedirect$1(redirectPath);
26795
27042
  }, delayMs);
26796
27043
  },
27044
+ /**
27045
+ * 注册成功后的处理流程
27046
+ * 1. 写入登录凭证(tgc Cookie + token)
27047
+ * 2. improveComp 检查:如果后端返回 improveComp 标记,说明需要完善公司信息,
27048
+ * 则 emit need-complete 事件并 return,不执行重定向
27049
+ * 3. 正常流程:emit register-success 事件(包含 redirect/preventDefault 流控能力),
27050
+ * 如果父组件未处理则自动执行重定向
27051
+ */
26797
27052
  handlePostRegister(res) {
26798
27053
  const sessionStorageItems = this.getAuthSessionItems();
26799
27054
  if (res.data.code === 0) {
@@ -27286,7 +27541,7 @@ function _sfc_render(_ctx, _cache, $props, $setup, $data, $options) {
27286
27541
  }, 8, ["model", "rules"])
27287
27542
  ]);
27288
27543
  }
27289
- const ThirdRegisterForm = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render], ["__scopeId", "data-v-6b5a903b"]]);
27544
+ const ThirdRegisterForm = /* @__PURE__ */ _export_sfc(_sfc_main$3, [["render", _sfc_render], ["__scopeId", "data-v-fda6eabc"]]);
27290
27545
  function useLoginForm(options) {
27291
27546
  const { isEn, loginType } = options;
27292
27547
  const loginFormRef = ref();
@@ -27686,7 +27941,8 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
27686
27941
  isUserClosed,
27687
27942
  startLogin,
27688
27943
  handleBindThirdParty,
27689
- resetBindRegisterState
27944
+ resetBindRegisterState,
27945
+ resetState: resetThirdPartyState
27690
27946
  } = useThirdPartyLogin$1({
27691
27947
  appId,
27692
27948
  isEn,
@@ -27700,6 +27956,12 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
27700
27956
  });
27701
27957
  currentVisible.value = false;
27702
27958
  executeRedirect(loginData);
27959
+ },
27960
+ onNeedComplete: (loginData) => {
27961
+ handleNeedComplete({
27962
+ mode: "login",
27963
+ accountType: resolveAccountType(thirdType.value || "")
27964
+ });
27703
27965
  }
27704
27966
  });
27705
27967
  watch(isUserClosed, (val) => {
@@ -27791,6 +28053,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
27791
28053
  resetAuthSessionItems();
27792
28054
  resetGioSessionItems();
27793
28055
  resetBindRegisterState();
28056
+ resetThirdPartyState();
27794
28057
  }
27795
28058
  function handleNeedComplete(options = {}) {
27796
28059
  const mode2 = (options == null ? void 0 : options.mode) === "register" ? "register" : "login";
@@ -28265,7 +28528,7 @@ const _sfc_main$2 = /* @__PURE__ */ defineComponent({
28265
28528
  };
28266
28529
  }
28267
28530
  });
28268
- const index$2 = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-1899ec69"]]);
28531
+ const index$2 = /* @__PURE__ */ _export_sfc(_sfc_main$2, [["__scopeId", "data-v-80de1603"]]);
28269
28532
  const __vite_glob_0_16 = /* @__PURE__ */ Object.freeze(/* @__PURE__ */ Object.defineProperty({
28270
28533
  __proto__: null,
28271
28534
  default: index$2
@@ -29364,7 +29627,9 @@ const {
29364
29627
  AirLineSearch,
29365
29628
  SeaLineSearch,
29366
29629
  LineCascader,
29367
- JcImg
29630
+ JcImg,
29631
+ ForgotPasswordDialog,
29632
+ ChangePasswordDialog
29368
29633
  } = components;
29369
29634
  let installed = false;
29370
29635
  const index = {
@@ -29387,8 +29652,10 @@ export {
29387
29652
  AirCarrierSearch,
29388
29653
  AirLineSearch,
29389
29654
  ApplyDataDialog,
29655
+ ChangePasswordDialog,
29390
29656
  ChineseCompanySearch,
29391
29657
  CodeInput,
29658
+ ForgotPasswordDialog,
29392
29659
  GlobalModal,
29393
29660
  GoogleInput,
29394
29661
  JcCarrierSearch,