微信小程序页面迁移校验之前 P5任务处理之前

This commit is contained in:
Neo
2026-03-09 01:19:21 +08:00
parent 263bf96035
commit 6e20987d2f
1112 changed files with 153824 additions and 219694 deletions

View File

@@ -0,0 +1,8 @@
{
"navigationBarTitleText": "申请访问权限",
"navigationStyle": "custom",
"usingComponents": {
"t-icon": "tdesign-miniprogram/icon/icon",
"t-loading": "tdesign-miniprogram/loading/loading"
}
}

View File

@@ -0,0 +1,146 @@
import { request } from "../../utils/request"
Page({
data: {
statusBarHeight: 0,
siteCode: "",
role: "",
phone: "",
employeeNumber: "",
nickname: "",
submitting: false,
},
onLoad() {
const { statusBarHeight } = wx.getSystemInfoSync()
this.setData({ statusBarHeight })
},
onShow() {
this._checkAccess()
},
/** 校验用户身份:无 token 跳登录,非 new/rejected 跳对应页 */
async _checkAccess() {
const token = wx.getStorageSync("token")
if (!token) {
wx.reLaunch({ url: "/pages/login/login" })
return
}
try {
const data = await request({
url: "/api/xcx/me",
method: "GET",
needAuth: true,
})
const app = getApp<IAppOption>()
app.globalData.authUser = {
userId: data.user_id,
status: data.status,
nickname: data.nickname,
}
wx.setStorageSync("userId", data.user_id)
wx.setStorageSync("userStatus", data.status)
switch (data.status) {
case "new":
break
case "rejected":
wx.reLaunch({ url: "/pages/no-permission/no-permission" })
break
case "approved":
wx.reLaunch({ url: "/pages/mvp/mvp" })
break
case "pending":
wx.reLaunch({ url: "/pages/reviewing/reviewing" })
break
case "disabled":
wx.reLaunch({ url: "/pages/no-permission/no-permission" })
break
}
} catch {
// 网络错误不阻塞,允许用户继续填表
}
},
onBack() {
wx.navigateBack({ fail: () => wx.reLaunch({ url: "/pages/login/login" }) })
},
/* 原生 input 的 bindinput 事件 */
onSiteCodeInput(e: WechatMiniprogram.Input) {
this.setData({ siteCode: e.detail.value })
},
onRoleInput(e: WechatMiniprogram.Input) {
this.setData({ role: e.detail.value })
},
onPhoneInput(e: WechatMiniprogram.Input) {
this.setData({ phone: e.detail.value })
},
onEmployeeNumberInput(e: WechatMiniprogram.Input) {
this.setData({ employeeNumber: e.detail.value })
},
onNicknameInput(e: WechatMiniprogram.Input) {
this.setData({ nickname: e.detail.value })
},
async onSubmit() {
if (this.data.submitting) return
const { siteCode, role, phone, nickname, employeeNumber } = this.data
if (!siteCode.trim()) {
wx.showToast({ title: "请输入球房ID", icon: "none" })
return
}
if (!role.trim()) {
wx.showToast({ title: "请输入申请身份", icon: "none" })
return
}
if (!/^\d{11}$/.test(phone)) {
wx.showToast({ title: "请输入11位手机号", icon: "none" })
return
}
if (!nickname.trim()) {
wx.showToast({ title: "请输入昵称", icon: "none" })
return
}
this.setData({ submitting: true })
try {
await request({
url: "/api/xcx/apply",
method: "POST",
data: {
site_code: siteCode.trim(),
applied_role_text: role.trim(),
phone,
employee_number: employeeNumber.trim() || undefined,
nickname: nickname.trim(),
},
needAuth: true,
})
wx.showToast({ title: "申请已提交", icon: "success" })
setTimeout(() => {
wx.reLaunch({ url: "/pages/reviewing/reviewing" })
}, 800)
} catch (err: any) {
const msg =
err?.data?.detail ||
(err?.statusCode === 409
? "您已有待审核的申请"
: err?.statusCode === 422
? "表单信息有误,请检查"
: "提交失败,请稍后重试")
wx.showToast({ title: msg, icon: "none" })
} finally {
this.setData({ submitting: false })
}
},
})

View File

@@ -0,0 +1,107 @@
<!-- pages/apply/apply.wxml — 按 H5 原型结构迁移 -->
<view class="page" style="padding-top: {{statusBarHeight}}px;">
<!-- 顶部导航栏 -->
<view class="navbar">
<view class="navbar-back" bindtap="onBack">
<t-icon name="chevron-left" size="35rpx" color="#4b4b4b" />
</view>
<text class="navbar-title">申请访问权限</text>
</view>
<!-- 主体内容 -->
<view class="main">
<!-- 欢迎卡片 + 审核流程(整合) -->
<view class="welcome-card">
<view class="welcome-header">
<view class="welcome-icon-box">
<t-icon name="check-circle-filled" size="42rpx" color="#fff" />
</view>
<view class="welcome-text">
<text class="welcome-title">欢迎加入球房运营助手</text>
<text class="welcome-desc">请填写申请信息,等待管理员审核</text>
</view>
</view>
<!-- 审核流程步骤条 -->
<view class="steps-bar">
<view class="steps-row">
<view class="step-item">
<view class="step-circle step-circle--active">1</view>
<text class="step-label step-label--active">提交申请</text>
</view>
<view class="step-line"></view>
<view class="step-item">
<view class="step-circle">2</view>
<text class="step-label">等待审核</text>
</view>
<view class="step-line"></view>
<view class="step-item">
<view class="step-circle">3</view>
<text class="step-label">审核通过</text>
</view>
<view class="step-line"></view>
<view class="step-item">
<view class="step-circle">4</view>
<text class="step-label">开始使用</text>
</view>
</view>
</view>
</view>
<!-- 表单区域 -->
<view class="form-card">
<!-- 球房ID -->
<view class="form-item form-item--border">
<view class="form-label">
<text class="required">*</text>
<text>球房ID</text>
</view>
<input class="form-input" type="text" placeholder="请输入球房ID" value="{{siteCode}}" maxlength="5" bindinput="onSiteCodeInput" />
</view>
<!-- 申请身份 -->
<view class="form-item form-item--border">
<view class="form-label">
<text class="required">*</text>
<text>申请身份</text>
</view>
<input class="form-input" type="text" placeholder="请输入申请身份(如:助教、店长等)" value="{{role}}" bindinput="onRoleInput" />
</view>
<!-- 手机号 -->
<view class="form-item form-item--border">
<view class="form-label">
<text class="required">*</text>
<text>手机号</text>
</view>
<input class="form-input" type="number" placeholder="请输入手机号" value="{{phone}}" maxlength="11" bindinput="onPhoneInput" />
</view>
<!-- 编号(选填) -->
<view class="form-item form-item--border">
<view class="form-label">
<text>编号</text>
<text class="optional-tag">选填</text>
</view>
<input class="form-input" type="text" placeholder="请输入编号" value="{{employeeNumber}}" maxlength="50" bindinput="onEmployeeNumberInput" />
</view>
<!-- 昵称 -->
<view class="form-item">
<view class="form-label">
<text class="required">*</text>
<text>昵称</text>
</view>
<input class="form-input" type="text" placeholder="请输入昵称" value="{{nickname}}" maxlength="50" bindinput="onNicknameInput" />
</view>
</view>
</view>
<!-- 底部按钮 -->
<view class="bottom-area">
<text class="form-tip">请认真填写,信息不完整可能导致审核不通过</text>
<view class="submit-btn {{submitting ? 'submit-btn--disabled' : ''}}" bindtap="onSubmit">
<t-loading wx:if="{{submitting}}" theme="circular" size="32rpx" color="#fff" />
<text wx:else class="submit-btn-text">提交申请</text>
</view>
<text class="bottom-tip">审核通常需要 1-3 个工作日</text>
</view>
</view>
<dev-fab />

View File

@@ -0,0 +1,271 @@
/* pages/apply/apply.wxss — H5 px × 2 × 0.875 精确转换 */
.page {
min-height: 100vh;
background: linear-gradient(135deg, #e0f2fe 0%, #f0f9ff 50%, #ecfeff 100%);
display: flex;
flex-direction: column;
box-sizing: border-box;
font-weight: 400;
-webkit-font-smoothing: antialiased;
}
/* ---- 顶部导航栏 h-11=44px→78rpx ---- */
.navbar {
height: 78rpx;
display: flex;
align-items: center;
justify-content: center;
position: sticky;
top: 0;
z-index: 10;
background: rgba(255, 255, 255, 0.95);
border-bottom: 1rpx solid rgba(229, 231, 235, 0.5);
}
.navbar-back {
position: absolute;
left: 28rpx;
padding: 8rpx;
}
/* text-base=16px→28rpx */
.navbar-title {
font-size: 28rpx;
font-weight: 500;
color: #242424;
letter-spacing: 0.5rpx;
}
/* ---- 主体内容 p-4=16px→28rpx ---- */
.main {
flex: 1;
padding: 28rpx;
padding-bottom: 380rpx;
}
/* ---- 欢迎卡片 p-5=20px→36rpx, rounded-2xl=16px→28rpx ---- */
.welcome-card {
background: linear-gradient(135deg, #0052d9, #60a5fa);
border-radius: 28rpx;
padding: 36rpx;
margin-bottom: 28rpx;
box-shadow: 0 14rpx 36rpx rgba(0, 82, 217, 0.2);
}
/* gap-4=16px→28rpx, mb-4=16px→28rpx */
.welcome-header {
display: flex;
align-items: center;
gap: 28rpx;
margin-bottom: 28rpx;
}
/* w-12 h-12=48px→84rpx, rounded-xl=12px→22rpx */
.welcome-icon-box {
width: 84rpx;
height: 84rpx;
min-width: 84rpx;
background: rgba(255, 255, 255, 0.2);
border-radius: 22rpx;
display: flex;
align-items: center;
justify-content: center;
}
.welcome-text {
display: flex;
flex-direction: column;
gap: 8rpx;
}
/* text-lg=18px→32rpx */
.welcome-title {
font-size: 32rpx;
font-weight: 600;
color: #ffffff;
}
/* text-sm=14px→24rpx */
.welcome-desc {
font-size: 24rpx;
color: rgba(255, 255, 255, 0.8);
font-weight: 300;
}
/* ---- 审核流程步骤条 p-4=16px→28rpx, rounded-xl=12px→22rpx ---- */
.steps-bar {
background: rgba(255, 255, 255, 0.1);
border-radius: 22rpx;
padding: 28rpx;
}
.steps-row {
display: flex;
align-items: center;
}
.step-item {
display: flex;
flex-direction: column;
align-items: center;
gap: 10rpx;
}
/* w-7 h-7=28px→50rpx, text-xs=12px→22rpx */
.step-circle {
width: 50rpx;
height: 50rpx;
border-radius: 50%;
background: rgba(255, 255, 255, 0.2);
display: flex;
align-items: center;
justify-content: center;
font-size: 22rpx;
font-weight: 500;
color: rgba(255, 255, 255, 0.7);
}
.step-circle--active {
background: #ffffff;
color: #0052d9;
font-weight: 600;
}
/* text-xs=12px→22rpx */
.step-label {
font-size: 18rpx;
color: rgba(255, 255, 255, 0.6);
white-space: nowrap;
}
.step-label--active {
color: rgba(255, 255, 255, 0.9);
}
/* h-0.5=2px→4rpx, mx-2=8px→14rpx */
.step-line {
flex: 1;
height: 4rpx;
background: rgba(255, 255, 255, 0.3);
margin: 0 10rpx;
margin-bottom: 24rpx;
}
/* ---- 表单卡片 rounded-2xl=16px→28rpx ---- */
.form-card {
background: #ffffff;
border-radius: 28rpx;
overflow: hidden;
box-shadow: 0 8rpx 28rpx rgba(0, 0, 0, 0.04);
}
/* px-5=20px→36rpx, py-4=16px→28rpx+2rpx 视觉补偿 */
.form-item {
padding: 30rpx 36rpx;
}
.form-item--border {
border-bottom: 2rpx solid #f3f3f3;
}
/* text-sm=14px→24rpx, mb-2=8px→14rpx */
.form-label {
display: flex;
align-items: center;
gap: 4rpx;
margin-bottom: 14rpx;
font-size: 24rpx;
font-weight: 500;
color: #242424;
}
/* text-sm=14px→24rpx */
.required {
color: #e34d59;
font-size: 24rpx;
}
/* text-xs=12px→22rpx */
.optional-tag {
font-size: 20rpx;
color: #a6a6a6;
font-weight: 400;
margin-left: 10rpx;
}
/* px-4=16px→28rpx, py-3=12px→22rpx, rounded-xl=12px→22rpx, text-sm=14px→24rpx
小程序 input 组件内部有压缩py 加 4rpx 补偿到视觉等高 */
.form-input {
width: 100%;
height: 80rpx;
padding: 0 28rpx;
background: #f8f8f8;
border-radius: 22rpx;
border: 2rpx solid #f3f3f3;
font-size: 24rpx;
font-weight: 300;
color: #242424;
box-sizing: border-box;
}
.form-input::placeholder {
color: #c5c5c5;
font-weight: 300;
}
/* ---- 表单提示(移入底部固定区) ---- */
.form-tip {
display: block;
text-align: center;
font-size: 20rpx;
color: #a6a6a6;
margin-bottom: 18rpx;
font-weight: 300;
}
/* ---- 底部提交 p-4=16px→28rpx, pb-8=32px→56rpx ---- */
.bottom-area {
position: fixed;
left: 0;
right: 0;
bottom: 0;
padding: 28rpx;
padding-bottom: calc(56rpx + env(safe-area-inset-bottom));
background: rgba(255, 255, 255, 0.95);
border-top: 2rpx solid #f3f3f3;
z-index: 10;
}
/* py-4=16px→28rpx (用padding代替固定高度), rounded-xl=12px→22rpx, text-base=16px→28rpx */
.submit-btn {
width: 100%;
padding: 28rpx 0;
display: flex;
align-items: center;
justify-content: center;
background: linear-gradient(135deg, #0052d9, #3b82f6);
border-radius: 22rpx;
box-shadow: 0 10rpx 28rpx rgba(0, 82, 217, 0.3);
}
.submit-btn--disabled {
opacity: 0.6;
}
/* text-base=16px→28rpx */
.submit-btn-text {
font-size: 28rpx;
font-weight: 500;
color: #ffffff;
}
/* text-xs=12px→22rpx, mt-3=12px→22rpx */
.bottom-tip {
display: block;
text-align: center;
font-size: 20rpx;
color: #c5c5c5;
margin-top: 22rpx;
font-weight: 300;
}