Files
shencaisuan/html/apply.html
T
2026-06-12 21:36:58 +08:00

386 lines
14 KiB
HTML

<!doctype html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title id="page-title">神彩算 - 专家申请</title>
<script src="../public/css/layui/layui.js"></script>
<script src="../config.js"></script>
<script src="../utils/ApiClient.js"></script>
<script src="../utils/DateUtil.js"></script>
<script src="../utils/CommonUtil.js"></script>
<link rel="stylesheet" href="../public/css/layui/css/layui.css" />
<link rel="stylesheet" href="../public/css/public.css" />
<link rel="stylesheet" href="../public/css/apply.css" />
</head>
<body>
<nav class="topbar" id="navbar">
<div class="topbar__inner">
<a href="index.html" class="topbar__brand">
<img src="../images/home-logo.png" alt="神彩算" class="topbar__logo" />
</a>
<div class="topbar__nav" id="navLotteryItems">
<a href="index.html" class="topbar__nav-link">首页</a>
</div>
<div class="topbar__user">
<div id="notLoggedInBox" class="topbar__guest">
<a href="login.html" class="topbar__btn topbar__btn--ghost">登录</a>
<a href="reg.html" class="topbar__btn topbar__btn--primary">免费注册</a>
</div>
<div id="loggedInBox" class="topbar__logged apply-hidden">
<a href="usercenter.html" class="topbar__profile">
<img id="userAvatar" src="../public/img/userimg.png" alt="" class="topbar__avatar" />
<div class="topbar__meta">
<span id="userName" class="topbar__uname">用户</span>
<span id="userLevel" class="topbar__ubadge">会员</span>
</div>
</a>
<button class="topbar__btn topbar__btn--logout" onclick="logout()">退出登录</button>
</div>
</div>
</div>
</nav>
<main class="apply-page">
<div class="cxz-breadcrumb">
<a href="index.html">首页</a>
<span class="sep">&gt;</span>
<a href="usercenter.html">个人中心</a>
<span class="sep">&gt;</span>
<span>专家申请</span>
</div>
<section class="apply-shell">
<div class="apply-hero">
<div>
<h1>申请成为专家</h1>
<p>提交身份资料和个人简介,审核通过后即可发布专家预测内容。</p>
</div>
<div class="apply-user-card">
<span>当前账号</span>
<strong id="currentUsername">--</strong>
</div>
</div>
<div class="apply-layout">
<aside class="apply-side">
<h2>申请说明</h2>
<ul>
<li>资料需真实有效,身份证照片需清晰完整。</li>
<li>简介用于审核您的分析经验和内容方向。</li>
<li>审核通过后,可在个人中心发布相关预测文章。</li>
</ul>
</aside>
<section class="apply-card">
<div class="apply-section-title">
<span></span>
资料上传
</div>
<div class="apply-upload-grid">
<button class="apply-upload-card" type="button" onclick="triggerUpload('uploadFront')">
<span class="apply-upload-plus" id="idCardFrontPlus">+</span>
<img class="apply-upload-preview" id="idCardFrontPreview" alt="身份证正面" />
<strong>身份证正面</strong>
<em>点击上传</em>
</button>
<button class="apply-upload-card" type="button" onclick="triggerUpload('uploadBack')">
<span class="apply-upload-plus" id="idCardBackPlus">+</span>
<img class="apply-upload-preview" id="idCardBackPreview" alt="身份证反面" />
<strong>身份证反面</strong>
<em>点击上传</em>
</button>
</div>
<input
class="apply-file-input"
type="file"
id="uploadFront"
accept="image/png,image/jpeg"
onchange="handleFileUpload(this, 'front')"
/>
<input
class="apply-file-input"
type="file"
id="uploadBack"
accept="image/png,image/jpeg"
onchange="handleFileUpload(this, 'back')"
/>
<div class="apply-section-title apply-intro-title">
<span></span>
个人简介
</div>
<textarea
class="apply-intro-textarea"
id="introTextarea"
placeholder="请输入个人简介"
oninput="updateIntro(this)"
></textarea>
<div class="apply-intro-count">
<span id="introCount">0</span> / <span id="introMinCount">80</span> 字(最低)
</div>
<button class="apply-submit" id="applyBtn" type="button" onclick="submitApply()">提交申请</button>
</section>
</div>
</section>
</main>
<footer class="site-footer">
<div class="site-footer__inner">
<img src="../images/home-logo.png" alt="神彩算" class="site-footer__logo" />
<p id="copyright-info">神彩算以开奖数据、免费文章、资讯推荐为核心</p>
<div class="site-footer__meta">
<a id="beian" href="https://beian.miit.gov.cn/" target="_blank">工信部备案号</a>
<span id="additional-info">本站仅供数据分析参考</span>
</div>
</div>
</footer>
<button class="gotop" id="backTop" type="button" onclick="window.scrollTo({ top: 0, behavior: 'smooth' })"></button>
<script>
var updateData = {
idCardFrontId: "",
idCardBackId: "",
intro: "",
};
var expertIntroMinLength = 80;
layui.use(["layer", "jquery"], function () {
var $ = layui.$;
CommonUtil.loadPageConfig({ ads: false, links: false });
renderLoginState();
renderNav();
loadExpertApplyConfig();
CommonUtil.requireAuth(function () {
loadUserDetail();
});
$(window).on("scroll", function () {
$("#backTop").toggleClass("is-visible", $(window).scrollTop() > 320);
});
function renderLoginState() {
var token = CommonUtil.getAuthToken();
if (!token) {
$("#notLoggedInBox").show();
$("#loggedInBox").hide();
return;
}
$("#notLoggedInBox").hide();
$("#loggedInBox").css("display", "flex");
CommonUtil.getCurrentUserDetail(function (data) {
if (!data) return;
$("#userName").text(data.nickName || data.username || "用户");
$("#userLevel").text(CommonUtil.getUserLevelText ? CommonUtil.getUserLevelText(data) : "会员");
if (data.avatar) $("#userAvatar").attr("src", data.avatar);
});
}
function renderNav() {
ApiClient.post("/api/web/menu/getFormatList", {}).then(function (res) {
if (res.code !== 0 && res.code !== 200) return;
var list = ApiClient.asArray(ApiClient.pickData(res, []));
var $nav = $("#navLotteryItems");
$nav.find(".topbar__nav-link").not(":first").remove();
$.each(list, function (i, item) {
var code = item.suoxie || item.code || item.id || "";
var name = item.name || item.menuName || "";
if (!code || !name) return;
$nav.append(
'<a href="cai.html?id=' +
encodeURIComponent(code) +
'" class="topbar__nav-link">' +
safeText(name) +
"</a>"
);
});
});
}
function loadUserDetail() {
CommonUtil.getCurrentUserDetail(function (data) {
if (!data) return;
$("#currentUsername").text(data.nickName || data.username || data.phoneNumber || "用户");
var isExpert =
data.expert === true ||
data.regularExpert === true ||
data.isExpert === 1 ||
data.isExpert === "1";
if (isExpert) {
$("#applyBtn").text("已申请").prop("disabled", true);
}
});
}
});
function safeText(value) {
return CommonUtil.escapeHtml ? CommonUtil.escapeHtml(value) : String(value || "");
}
function isApiSuccess(res) {
return res && (res.code === 0 || res.code === 200);
}
function firstValue(source, keys, fallback) {
for (var i = 0; i < keys.length; i += 1) {
var key = keys[i];
if (source && source[key] !== undefined && source[key] !== null && source[key] !== "") {
return source[key];
}
}
return fallback === undefined ? "" : fallback;
}
function loadExpertApplyConfig() {
ApiClient.get(ApiClient.API.expertConfig)
.then(function (res) {
var data = ApiClient.pickData(res, {}) || {};
var minLength = Number(
firstValue(
data,
["bioMinLength", "introMinLength", "minBioLength", "minIntroLength", "bio_min_length"],
80
)
);
if (Number.isFinite(minLength) && minLength > 0) {
expertIntroMinLength = minLength;
}
})
.catch(function () {})
.finally(function () {
$("#introMinCount").text(expertIntroMinLength);
$("#introTextarea").attr("placeholder", "请输入个人简介(不低于" + expertIntroMinLength + "字)");
});
}
window.triggerUpload = function (inputId) {
var input = document.getElementById(inputId);
if (input) input.click();
};
function getUploadFileId(res) {
var data = ApiClient.pickData(res, null);
if (data === null || data === undefined || data === "") return "";
if (typeof data === "string" || typeof data === "number") return String(data);
return String(
firstValue(
data,
["objectId", "fileId", "id", "ossId", "resourceId", "attachmentId", "file_id"],
""
)
);
}
function getUploadFileUrl(res, file) {
var data = ApiClient.pickData(res, null);
if (data && typeof data === "object") {
return firstValue(data, ["url", "fileUrl", "fullUrl", "previewUrl"], "");
}
return URL.createObjectURL(file);
}
window.handleFileUpload = function (input, type) {
var file = input.files && input.files[0];
if (!file) return;
if (!/^image\//.test(file.type || "")) {
layui.layer.msg("请选择图片文件", { icon: 2 });
input.value = "";
return;
}
if (file.size > 5 * 1024 * 1024) {
layui.layer.msg("文件大小不能超过5MB", { icon: 2 });
input.value = "";
return;
}
var formData = new FormData();
formData.append("file", file);
var uploadUrl =
type === "front" ? ApiClient.API.expertUploadIdCardFront : ApiClient.API.expertUploadIdCardBack;
var plusId = type === "front" ? "idCardFrontPlus" : "idCardBackPlus";
var previewId = type === "front" ? "idCardFrontPreview" : "idCardBackPreview";
ApiClient.post(uploadUrl, formData)
.then(function (res) {
if (!isApiSuccess(res)) {
layui.layer.msg(res.msg || "上传失败", { icon: 2 });
return;
}
var fileId = getUploadFileId(res);
if (!fileId) {
layui.layer.msg("上传返回缺少文件编号", { icon: 2 });
return;
}
if (type === "front") updateData.idCardFrontId = fileId;
else updateData.idCardBackId = fileId;
$("#" + plusId).hide();
$("#" + previewId).attr("src", getUploadFileUrl(res, file)).show();
layui.layer.msg("上传成功", { icon: 1, time: 1000 });
})
.catch(function () {
layui.layer.msg("上传失败,请稍后重试", { icon: 2 });
})
.finally(function () {
input.value = "";
});
};
window.updateIntro = function (textarea) {
updateData.intro = textarea.value;
$("#introCount").text(textarea.value.length);
};
window.submitApply = function () {
CommonUtil.requireAuth(function () {
if (!updateData.intro || updateData.intro.trim().length < expertIntroMinLength) {
layui.layer.msg("个人简介不能低于" + expertIntroMinLength + "字", { icon: 2 });
return;
}
if (!updateData.idCardFrontId) {
layui.layer.msg("请上传身份证正面", { icon: 2 });
return;
}
if (!updateData.idCardBackId) {
layui.layer.msg("请上传身份证反面", { icon: 2 });
return;
}
var btn = document.getElementById("applyBtn");
btn.textContent = "申请中...";
btn.disabled = true;
ApiClient.post(ApiClient.API.expertApply, {
bio: updateData.intro.trim(),
idCardFrontImage: updateData.idCardFrontId,
idCardBackImage: updateData.idCardBackId,
})
.then(function (res) {
if (isApiSuccess(res)) {
layui.layer.msg(
"资料上传成功,请等待审核通过",
{ icon: 1, time: 1800 },
function () {
window.location.href = "usercenter.html";
}
);
} else {
layui.layer.msg(res.msg || "申请失败", { icon: 2 });
btn.textContent = "提交申请";
btn.disabled = false;
}
})
.catch(function () {
layui.layer.msg("网络错误,请稍后重试", { icon: 2 });
btn.textContent = "提交申请";
btn.disabled = false;
});
});
};
</script>
</body>
</html>