feat(tender): 企业注册与 h5 对齐(一站式表单 + 证件上传 + OCR 回填);修复登录/注册代理路由 404

- 新增 app/components/HjcEnterpriseForm.vue:与 h5 EnterpriseForm 行为一致的共享表单,
  字段集 / 必填规则 / OCR 回填 / 提示文案逐条对齐
- register.vue:一站式注册,一次性提交企业 + 经办人 + 授权 + 证件材料;
  企业联系电话、企业地址选填,其余(含企业邮箱)必填,4 类证件必传
- tender/qualification.vue:改用共享组件,补「经办人身份证号」,
  以真实文件上传 + OCR 取代原「证件 URL 文本框」;
  审核中(0)/已通过(1) 只读,驳回(2)/未提交(-1) 可编辑重提
- 新增 server/api/tender/upload.post.ts(multipart 原样转发 → /hjc/auth/upload,匿名,
  登录前后均可用)与 server/api/tender/ocr/recognize.post.ts(→ /hjc/ocr/recognize)
- 修正 datetime-local(YYYY-MM-DDTHH:mm)与后端 yyyy-MM-dd HH:mm:ss 的格式转换
- fix: server/api/tender/auth/{login,register}.post.ts 实际路由为 /api/tender/auth/*,
  而客户端调用 /api/tender/{login,register},导致登录与注册此前均 404;
  已按文件注释与同级接口约定移至扁平路径 server/api/tender/{login,register}.post.ts
- register / login / enterprise-save 三个代理改为原样透传 ApiResult{code,message,data},
  useHjcAuth 与资质页按 code===0 判定,避免后端校验失败信息被吞掉
This commit is contained in:
2026-09-10 13:12:21 +08:00
parent 0f3fa3c050
commit 5e7372d0c7
9 changed files with 521 additions and 139 deletions
+27 -18
View File
@@ -13,29 +13,38 @@ export function useHjcAuth() {
}
async function login(enterpriseName: string, password: string) {
const res: any = await $fetch('/api/tender/login', {
method: 'POST',
body: { enterpriseName, password }
})
if (res?.access_token) {
token.value = res.access_token
user.value = res.user || null
return { ok: true, user: res.user }
try {
const res: any = await $fetch('/api/tender/login', {
method: 'POST',
body: { enterpriseName, password }
})
// mp-api 统一返回 ApiResult{code,message,data}code===0 成功
if (res?.code === 0 && res.data?.access_token) {
token.value = res.data.access_token
user.value = res.data.user || null
return { ok: true, user: res.data.user }
}
return { ok: false, message: res?.message || '登录失败' }
} catch (e: any) {
return { ok: false, message: e?.data?.statusMessage || e?.message || '登录失败' }
}
return { ok: false, message: res?.message || '登录失败' }
}
async function register(payload: Record<string, any>) {
const res: any = await $fetch('/api/tender/register', {
method: 'POST',
body: payload
})
if (res?.access_token) {
token.value = res.access_token
user.value = res.user || null
return { ok: true, user: res.user }
try {
const res: any = await $fetch('/api/tender/register', {
method: 'POST',
body: payload
})
if (res?.code === 0 && res.data?.access_token) {
token.value = res.data.access_token
user.value = res.data.user || null
return { ok: true, user: res.data.user }
}
return { ok: false, message: res?.message || '注册失败' }
} catch (e: any) {
return { ok: false, message: e?.data?.statusMessage || e?.message || '注册失败' }
}
return { ok: false, message: res?.message || '注册失败' }
}
function logout() {