批量修复问题
This commit is contained in:
parent
c4b24bfc05
commit
76f90f50c0
@ -3,7 +3,7 @@ import request from "@/utils/request";
|
|||||||
// 获取所有菜单
|
// 获取所有菜单
|
||||||
export function getAllMenus() {
|
export function getAllMenus() {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/allmenu`,
|
url: `/backend/allmenu`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -11,7 +11,7 @@ export function getAllMenus() {
|
|||||||
//获取用户菜单
|
//获取用户菜单
|
||||||
export function getMenus(id){
|
export function getMenus(id){
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/menu/${parseInt(id)}`,
|
url: `/backend/menu/${parseInt(id)}`,
|
||||||
method: "get",
|
method: "get",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -19,7 +19,7 @@ export function getMenus(id){
|
|||||||
// 更新菜单状态
|
// 更新菜单状态
|
||||||
export function updateMenuStatus(menuId, status) {
|
export function updateMenuStatus(menuId, status) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/menu/status/${menuId}`,
|
url: `/backend/menu/status/${menuId}`,
|
||||||
method: "patch",
|
method: "patch",
|
||||||
data: { status },
|
data: { status },
|
||||||
});
|
});
|
||||||
@ -28,7 +28,7 @@ export function updateMenuStatus(menuId, status) {
|
|||||||
// 创建菜单
|
// 创建菜单
|
||||||
export function createMenu(menuData) {
|
export function createMenu(menuData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/createmenu`,
|
url: `/backend/createmenu`,
|
||||||
method: "post",
|
method: "post",
|
||||||
data: menuData,
|
data: menuData,
|
||||||
});
|
});
|
||||||
@ -37,7 +37,7 @@ export function createMenu(menuData) {
|
|||||||
// 更新菜单
|
// 更新菜单
|
||||||
export function updateMenu(menuId, menuData) {
|
export function updateMenu(menuId, menuData) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/updatemenu/${menuId}`,
|
url: `/backend/updatemenu/${menuId}`,
|
||||||
method: "put",
|
method: "put",
|
||||||
data: menuData,
|
data: menuData,
|
||||||
});
|
});
|
||||||
@ -46,7 +46,7 @@ export function updateMenu(menuId, menuData) {
|
|||||||
// 删除菜单
|
// 删除菜单
|
||||||
export function deleteMenu(menuId) {
|
export function deleteMenu(menuId) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/deletemenu/${menuId}`,
|
url: `/backend/deletemenu/${menuId}`,
|
||||||
method: "delete",
|
method: "delete",
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -2,28 +2,28 @@ import request from '@/utils/request';
|
|||||||
|
|
||||||
export function getModulesList() {
|
export function getModulesList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/list',
|
url: '/backend/modules/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getTenantList() {
|
export function getTenantList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/getTenantList',
|
url: '/backend/modules/getTenantList',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function getModuleDetail(id) {
|
export function getModuleDetail(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/modules/${id}`,
|
url: `/backend/modules/${id}`,
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function addModule(data) {
|
export function addModule(data) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules',
|
url: '/backend/modules',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -31,7 +31,7 @@ export function addModule(data) {
|
|||||||
|
|
||||||
export function editModule(id, data) {
|
export function editModule(id, data) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/modules/${id}`,
|
url: `/backend/modules/${id}`,
|
||||||
method: 'put',
|
method: 'put',
|
||||||
data,
|
data,
|
||||||
});
|
});
|
||||||
@ -39,14 +39,14 @@ export function editModule(id, data) {
|
|||||||
|
|
||||||
export function deleteModule(id) {
|
export function deleteModule(id) {
|
||||||
return request({
|
return request({
|
||||||
url: `/admin/modules/${id}`,
|
url: `/backend/modules/${id}`,
|
||||||
method: 'delete',
|
method: 'delete',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
export function batchDeleteModules(ids) {
|
export function batchDeleteModules(ids) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/batchDelete',
|
url: '/backend/modules/batchDelete',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { ids },
|
data: { ids },
|
||||||
});
|
});
|
||||||
@ -54,7 +54,7 @@ export function batchDeleteModules(ids) {
|
|||||||
|
|
||||||
export function changeModuleStatus(id, status) {
|
export function changeModuleStatus(id, status) {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/status',
|
url: '/backend/modules/status',
|
||||||
method: 'post',
|
method: 'post',
|
||||||
data: { id, status },
|
data: { id, status },
|
||||||
});
|
});
|
||||||
@ -62,7 +62,7 @@ export function changeModuleStatus(id, status) {
|
|||||||
|
|
||||||
export function getModulesSelectList() {
|
export function getModulesSelectList() {
|
||||||
return request({
|
return request({
|
||||||
url: '/admin/modules/select/list',
|
url: '/backend/modules/select/list',
|
||||||
method: 'get',
|
method: 'get',
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|||||||
@ -7,6 +7,7 @@ const defaultUser = {
|
|||||||
account: '',
|
account: '',
|
||||||
name: '',
|
name: '',
|
||||||
group_id: '',
|
group_id: '',
|
||||||
|
type: 'backend',
|
||||||
avatar: ''
|
avatar: ''
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -40,6 +41,7 @@ export const useAuthStore = defineStore('auth', () => {
|
|||||||
account: userInfo.account || '',
|
account: userInfo.account || '',
|
||||||
name: userInfo.name || '',
|
name: userInfo.name || '',
|
||||||
group_id: userInfo.group_id || '',
|
group_id: userInfo.group_id || '',
|
||||||
|
type: 'backend',
|
||||||
tid: userInfo.tid || '',
|
tid: userInfo.tid || '',
|
||||||
avatar: userInfo.avatar || ''
|
avatar: userInfo.avatar || ''
|
||||||
}
|
}
|
||||||
|
|||||||
@ -18,12 +18,8 @@
|
|||||||
<div class="copyright">© 2026 Yunzer 管理系统</div>
|
<div class="copyright">© 2026 Yunzer 管理系统</div>
|
||||||
</div>
|
</div>
|
||||||
<div class="login-panel">
|
<div class="login-panel">
|
||||||
<h2 class="login-title">欢迎登录</h2>
|
<h2 class="login-title">欢迎登录租户端</h2>
|
||||||
<div class="login-desc">请填写您的账号信息</div>
|
<div class="login-desc">请填写您的账号信息</div>
|
||||||
<div class="mode-switch">
|
|
||||||
<button class="mode-btn" :class="{ active: loginMode === 'password' }" @click="switchMode('password')">账号密码登录</button>
|
|
||||||
<button class="mode-btn" :class="{ active: loginMode === 'sms' }" @click="switchMode('sms')">手机号验证码登录</button>
|
|
||||||
</div>
|
|
||||||
<div class="form-group icon-input-group">
|
<div class="form-group icon-input-group">
|
||||||
<span class="input-icon">
|
<span class="input-icon">
|
||||||
<i class="fa-solid fa-building-columns"></i>
|
<i class="fa-solid fa-building-columns"></i>
|
||||||
@ -31,13 +27,13 @@
|
|||||||
<input v-model="tenant_name" type="text" placeholder="租户名称" autocomplete="tenant_name"
|
<input v-model="tenant_name" type="text" placeholder="租户名称" autocomplete="tenant_name"
|
||||||
class="input input-with-icon" />
|
class="input input-with-icon" />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loginMode === 'password'" class="form-group icon-input-group">
|
<div class="form-group icon-input-group">
|
||||||
<span class="input-icon">
|
<span class="input-icon">
|
||||||
<i class="fa-solid fa-user"></i>
|
<i class="fa-solid fa-user"></i>
|
||||||
</span>
|
</span>
|
||||||
<input v-model="account" type="text" placeholder="用户名" autocomplete="account" class="input input-with-icon" />
|
<input v-model="account" type="text" placeholder="用户名" autocomplete="account" class="input input-with-icon" />
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loginMode === 'password'" class="form-group icon-input-group">
|
<div class="form-group icon-input-group">
|
||||||
<span class="input-icon">
|
<span class="input-icon">
|
||||||
<i class="fa-solid fa-lock"></i>
|
<i class="fa-solid fa-lock"></i>
|
||||||
</span>
|
</span>
|
||||||
@ -49,13 +45,11 @@
|
|||||||
<i v-else class="fa-solid fa-eye-slash"></i>
|
<i v-else class="fa-solid fa-eye-slash"></i>
|
||||||
</span>
|
</span>
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loginMode === 'sms'" class="form-group icon-input-group">
|
<div v-if="openVerifyEnabled && verifyType === 'captcha'" class="form-group code-row">
|
||||||
<span class="input-icon">
|
<input v-model="captchaInput" type="text" placeholder="请输入4位验证码" class="input code-input" />
|
||||||
<i class="fa-solid fa-mobile-screen-button"></i>
|
<button class="code-btn" type="button" @click="generateCaptcha">{{ captchaText }}</button>
|
||||||
</span>
|
|
||||||
<input v-model="phone" type="text" placeholder="手机号" autocomplete="tel" class="input input-with-icon" />
|
|
||||||
</div>
|
</div>
|
||||||
<div v-if="loginMode === 'sms'" class="form-group code-row">
|
<div v-if="openVerifyEnabled && (verifyType === 'sms' || verifyType === 'email')" class="form-group code-row">
|
||||||
<input v-model="smsCode" type="text" placeholder="短信验证码" class="input code-input" />
|
<input v-model="smsCode" type="text" placeholder="短信验证码" class="input code-input" />
|
||||||
<button class="code-btn" :disabled="codeLoading || countdown > 0" @click="handleSendLoginCode">
|
<button class="code-btn" :disabled="codeLoading || countdown > 0" @click="handleSendLoginCode">
|
||||||
{{ countdown > 0 ? `${countdown}s` : (codeLoading ? "发送中..." : "发送验证码") }}
|
{{ countdown > 0 ? `${countdown}s` : (codeLoading ? "发送中..." : "发送验证码") }}
|
||||||
@ -64,14 +58,13 @@
|
|||||||
|
|
||||||
|
|
||||||
<!-- 极验验证码容器 -->
|
<!-- 极验验证码容器 -->
|
||||||
<div style="display: none;" v-if="showCaptchaContainer" class="geetest-container" ref="captchaContainer"></div>
|
<div style="display: none;" v-if="openVerifyEnabled && verifyType === 'geetest' && showCaptchaContainer" class="geetest-container" ref="captchaContainer"></div>
|
||||||
|
|
||||||
<div class="remember-me-row">
|
<div class="remember-me-row">
|
||||||
<label v-if="loginMode === 'password'" class="remember-me-label">
|
<label class="remember-me-label">
|
||||||
<input type="checkbox" v-model="rememberMe" class="remember-me-checkbox" @change="handleRememberMeChange" />
|
<input type="checkbox" v-model="rememberMe" class="remember-me-checkbox" @change="handleRememberMeChange" />
|
||||||
<span>记住我</span>
|
<span>记住我</span>
|
||||||
</label>
|
</label>
|
||||||
<span v-else></span>
|
|
||||||
<div class="action-links">
|
<div class="action-links">
|
||||||
<a class="register-link" @click.prevent="goRegister">注册账号</a>
|
<a class="register-link" @click.prevent="goRegister">注册账号</a>
|
||||||
<span class="divider">|</span>
|
<span class="divider">|</span>
|
||||||
@ -96,7 +89,7 @@
|
|||||||
import { ref, onMounted, nextTick, onUnmounted } from "vue";
|
import { ref, onMounted, nextTick, onUnmounted } from "vue";
|
||||||
import { useRouter } from "vue-router";
|
import { useRouter } from "vue-router";
|
||||||
import { useAuthStore } from "@/stores/auth";
|
import { useAuthStore } from "@/stores/auth";
|
||||||
import { login, getOpenVerify, getGeetest4Infos, sendLoginCode, loginBySms } from "@/api/login";
|
import { login, getOpenVerify, getGeetest4Infos, sendLoginCode } from "@/api/login";
|
||||||
import "@/assets/js/gt4.js";
|
import "@/assets/js/gt4.js";
|
||||||
import { ElMessageBox, ElMessage } from "element-plus";
|
import { ElMessageBox, ElMessage } from "element-plus";
|
||||||
|
|
||||||
@ -105,11 +98,13 @@ const authStore = useAuthStore();
|
|||||||
|
|
||||||
// --- 表单数据 ---
|
// --- 表单数据 ---
|
||||||
const tenant_name = ref("");
|
const tenant_name = ref("");
|
||||||
const loginMode = ref<"password" | "sms">("password");
|
const openVerifyEnabled = ref(true);
|
||||||
|
const verifyType = ref<"captcha" | "sms" | "geetest" | "email">("captcha");
|
||||||
const account = ref("");
|
const account = ref("");
|
||||||
const password = ref("");
|
const password = ref("");
|
||||||
const phone = ref("");
|
|
||||||
const smsCode = ref("");
|
const smsCode = ref("");
|
||||||
|
const captchaInput = ref("");
|
||||||
|
const captchaText = ref("");
|
||||||
const passwordVisible = ref(false);
|
const passwordVisible = ref(false);
|
||||||
const rememberMe = ref(false);
|
const rememberMe = ref(false);
|
||||||
const loading = ref(false);
|
const loading = ref(false);
|
||||||
@ -150,29 +145,11 @@ const cleanCaptchaInstance = () => {
|
|||||||
|
|
||||||
// --- 执行登录请求 ---
|
// --- 执行登录请求 ---
|
||||||
const performLoginRequest = async () => {
|
const performLoginRequest = async () => {
|
||||||
if (loginMode.value === "sms") {
|
|
||||||
const res = await loginBySms({
|
|
||||||
tenant_name: tenant_name.value,
|
|
||||||
phone: phone.value,
|
|
||||||
sms_code: smsCode.value,
|
|
||||||
});
|
|
||||||
if (res && res.code === 200) {
|
|
||||||
authStore.setLoginInfo(res.data);
|
|
||||||
const { useTabsStore } = await import("@/stores");
|
|
||||||
const tabsStore = useTabsStore();
|
|
||||||
tabsStore.resetTabs();
|
|
||||||
router.push({ path: "/home" });
|
|
||||||
ElMessage.success("登录成功!");
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
errorMsg.value = res.msg || "登录失败";
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
const res = await login({
|
const res = await login({
|
||||||
tenant_name: tenant_name.value,
|
tenant_name: tenant_name.value,
|
||||||
account: account.value,
|
account: account.value,
|
||||||
password: password.value
|
password: password.value,
|
||||||
|
code: smsCode.value
|
||||||
});
|
});
|
||||||
|
|
||||||
if (res && res.code === 200) {
|
if (res && res.code === 200) {
|
||||||
@ -205,9 +182,8 @@ const performLoginRequest = async () => {
|
|||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
const switchMode = (mode: "password" | "sms") => {
|
const generateCaptcha = () => {
|
||||||
loginMode.value = mode;
|
captchaText.value = `${Math.floor(1000 + Math.random() * 9000)}`;
|
||||||
errorMsg.value = "";
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const startCountdown = () => {
|
const startCountdown = () => {
|
||||||
@ -228,8 +204,8 @@ const handleSendLoginCode = async () => {
|
|||||||
errorMsg.value = "请输入租户名称";
|
errorMsg.value = "请输入租户名称";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!phone.value.trim()) {
|
if (!account.value.trim()) {
|
||||||
errorMsg.value = "请输入手机号";
|
errorMsg.value = "请输入用户名";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
codeLoading.value = true;
|
codeLoading.value = true;
|
||||||
@ -237,7 +213,8 @@ const handleSendLoginCode = async () => {
|
|||||||
try {
|
try {
|
||||||
const res = await sendLoginCode({
|
const res = await sendLoginCode({
|
||||||
tenant_name: tenant_name.value,
|
tenant_name: tenant_name.value,
|
||||||
phone: phone.value,
|
account: account.value,
|
||||||
|
channel: verifyType.value,
|
||||||
});
|
});
|
||||||
if (res && res.code === 200) {
|
if (res && res.code === 200) {
|
||||||
ElMessage.success("验证码已发送");
|
ElMessage.success("验证码已发送");
|
||||||
@ -366,52 +343,53 @@ const handleLogin = async () => {
|
|||||||
errorMsg.value = "请输入租户名称";
|
errorMsg.value = "请输入租户名称";
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (loginMode.value === "password") {
|
if (!account.value.trim()) {
|
||||||
if (!account.value.trim()) {
|
errorMsg.value = "请输入用户名";
|
||||||
errorMsg.value = "请输入用户名";
|
return;
|
||||||
return;
|
}
|
||||||
}
|
if (!password.value.trim()) {
|
||||||
if (!password.value.trim()) {
|
errorMsg.value = "请输入密码";
|
||||||
errorMsg.value = "请输入密码";
|
return;
|
||||||
return;
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (!phone.value.trim()) {
|
|
||||||
errorMsg.value = "请输入手机号";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
if (!smsCode.value.trim()) {
|
|
||||||
errorMsg.value = "请输入短信验证码";
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (loading.value) return;
|
if (loading.value) return;
|
||||||
loading.value = true;
|
loading.value = true;
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (loginMode.value === "password") {
|
const verifyRes = await getOpenVerify();
|
||||||
// 先判断是否开启验证
|
let openVerify = "0";
|
||||||
const verifyRes = await getOpenVerify();
|
let verifyTypeVal = "captcha";
|
||||||
let openVerify = "0";
|
if (verifyRes && verifyRes.code === 200 && Array.isArray(verifyRes.data)) {
|
||||||
|
verifyRes.data.forEach((item: any) => {
|
||||||
|
if (item.label === "openVerify") {
|
||||||
|
openVerify = item.value || "0";
|
||||||
|
}
|
||||||
|
if (item.label === "verifyType") {
|
||||||
|
verifyTypeVal = item.value || "captcha";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
openVerifyEnabled.value = openVerify === "1";
|
||||||
|
verifyType.value = verifyTypeVal as any;
|
||||||
|
|
||||||
if (verifyRes && verifyRes.code === 200 && Array.isArray(verifyRes.data)) {
|
if (openVerifyEnabled.value && verifyType.value === "captcha") {
|
||||||
verifyRes.data.forEach((item: any) => {
|
if (!captchaInput.value.trim()) {
|
||||||
if (item.label === "openVerify") {
|
errorMsg.value = "请输入验证码";
|
||||||
openVerify = item.value || "0";
|
return;
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
if (captchaInput.value.trim() !== captchaText.value) {
|
||||||
|
errorMsg.value = "验证码错误";
|
||||||
|
generateCaptcha();
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (openVerifyEnabled.value && (verifyType.value === "sms" || verifyType.value === "email") && !smsCode.value.trim()) {
|
||||||
|
errorMsg.value = "请输入验证码";
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// 如果开启了验证,使用极验4.0
|
if (openVerifyEnabled.value && verifyType.value === "geetest") {
|
||||||
if (openVerify === "1") {
|
await startGeetest4();
|
||||||
await startGeetest4();
|
|
||||||
} else {
|
|
||||||
// 直接登录
|
|
||||||
await performLoginRequest();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
// 直接登录
|
|
||||||
await performLoginRequest();
|
await performLoginRequest();
|
||||||
}
|
}
|
||||||
} catch (err: any) {
|
} catch (err: any) {
|
||||||
@ -451,6 +429,7 @@ onMounted(() => {
|
|||||||
password.value = localStorage.getItem("loginPassword") || "";
|
password.value = localStorage.getItem("loginPassword") || "";
|
||||||
rememberMe.value = true;
|
rememberMe.value = true;
|
||||||
}
|
}
|
||||||
|
generateCaptcha();
|
||||||
});
|
});
|
||||||
|
|
||||||
onUnmounted(() => {
|
onUnmounted(() => {
|
||||||
|
|||||||
Loading…
Reference in New Issue
Block a user