From 85c54d88f139096614aea4b06f2166cae27729d7 Mon Sep 17 00:00:00 2001 From: zhangwei <1504152376@qq.com> Date: 星期五, 22 八月 2025 10:11:19 +0800 Subject: [PATCH] 用户管理 --- src/views/login/index.vue | 258 ++++++++++++++++++++++++++++++++------------------ 1 files changed, 164 insertions(+), 94 deletions(-) diff --git a/src/views/login/index.vue b/src/views/login/index.vue index aebcc27..f79d52d 100644 --- a/src/views/login/index.vue +++ b/src/views/login/index.vue @@ -1,4 +1,4 @@ -<script setup lang="ts"> +<script setup lang="tsx"> import Motion from "./utils/motion"; import { useRouter } from "vue-router"; import { message } from "@/utils/message"; @@ -7,15 +7,26 @@ reactive, computed, ref, + Ref, + h, onMounted, defineAsyncComponent, onUnmounted, watch } from "vue"; -import { debounce } from "@pureadmin/utils"; +import { debounce, storageLocal } from "@pureadmin/utils"; import { useNav } from "@/layout/hooks/useNav"; import { useEventListener } from "@vueuse/core"; import type { FormInstance } from "element-plus"; +import { + ElForm, + ElFormItem, + ElRadioGroup, + ElRadio, + ElRow, + ElTag, + ElCol +} from "element-plus"; import { useLayout } from "@/layout/hooks/useLayout"; import { useUserStoreHook } from "@/store/modules/user"; import { initRouter, getTopMenu } from "@/router/utils"; @@ -25,12 +36,7 @@ import { useRoute } from "vue-router"; const route = useRoute(); - -// import dayIcon from "@/assets/svg/day.svg?component"; -// import darkIcon from "@/assets/svg/dark.svg?component"; -import Lock from "~icons/ri/lock-fill"; -import User from "~icons/ri/user-3-fill"; -import { captcha, phoneNumberCode, exRole } from "@/api/register/index.ts"; +import { captcha, phoneNumberCode, exRole } from "@/api/register/index"; defineOptions({ name: "Login" @@ -50,15 +56,18 @@ // 鑾峰彇楠岃瘉鐮� const getCaptcha = async () => { // if (!state.captchaEnabled) return; - state.ruleForm.code = ""; const res = await captcha(); - console.log(res); - state.captchaImage = "data:text/html;base64," + res.result?.img; state.expirySeconds = res.result?.expirySeconds; state.ruleForm.codeId = res.result?.id; }; +import { + addDialog, + closeDialog, + updateDialog, + closeAllDialog +} from "@/components/ReDialog"; const state = reactive({ isShowPassword: false, ruleForm: { @@ -66,9 +75,8 @@ nickName: "", phone: "", phoneVCode: "", - // tenantId: props.tenantInfo.id, code: "", - codeId: 0, + codeId: "", email: "", exRoleCode: "" }, @@ -111,49 +119,22 @@ expirySeconds: 60, // 楠岃瘉鐮佽繃鏈熸椂闂� phoneSeconds: 0, // 鎵嬫満楠岃瘉鐮佸�掕鏃� roleList: [], + myEnterpriseList: [], nowRole: {} }); +let secondCode = ""; +let secondId: Ref<string | number | boolean> = ref(""); // 楠岃瘉鐮佽繃鏈熻鏃跺櫒 let timer: any = null; let phonetimer: any = null; // 椤甸潰鍒濆鍖� onMounted(async () => { - // 鑻RL甯︽湁Token鍙傛暟锛堢涓夋柟鐧诲綍锛� - - // if (accessToken) await saveTokenAndInitRoutes(accessToken); - // watch( - // () => themeConfig.value.isLoaded, - // isLoaded => { - // if (isLoaded) { - // 鑾峰彇鐧诲綍閰嶇疆 - // state.hideTenantForLogin = themeConfig.value.hideTenantForLogin ?? true; - // state.secondVerEnabled = themeConfig.value.secondVer ?? true; - // state.captchaEnabled = themeConfig.value.captcha ?? true; - - // 鑾峰彇楠岃瘉鐮� getCaptcha(); - exRole().then(res => { - state.roleList = res.result; - const role = route.query; - if (role.code) { - state.nowRole = role; - } else { - state.nowRole = state.roleList[0]; - } - state.ruleForm.exRoleCode = state.nowRole?.code; - }); // 娉ㄥ唽楠岃瘉鐮佽繃鏈熻鏃跺櫒 - // if (state.captchaEnabled) { timer = setInterval(() => { if (state.expirySeconds > 0) state.expirySeconds -= 1; }, 1000); - - // } - // } - // }, - // { immediate: true } - // ); }); // 椤甸潰鍗歌浇 onUnmounted(() => { @@ -163,45 +144,170 @@ clearInterval(phonetimer); phonetimer = null; }); +const openDialog = () => { + addDialog({ + width: "30%", + title: "閫夋嫨鐧诲綍鍏徃", + contentRenderer: () => + h( + ElForm, + { + ref: ruleFormRef, + model: state.ruleForm, + rules: loginRules, + size: "large" + }, + { + default: () => { + return [ + h( + ElFormItem, + { prop: "exRoleCode", label: "" }, + { + default: () => { + return [ + h( + ElRadioGroup, + { + modelValue: secondId.value, + "onUpdate:modelValue": val => (secondId.value = val) + }, + // ElRadioGroup 鐨勫唴瀹规槸寰幆鐢熸垚鐨勶紝鐢ㄥ嚱鏁板寘瑁� + () => + state.myEnterpriseList.map(item => + h( + ElRow, + { style: { width: "100%" } }, + { + default: () => { + return [ + h( + ElCol, + { span: 24 }, + { + default: () => { + return [ + h( + ElRadio, + { + key: item.customerUserID, + value: item.customerUserID + }, + // ElRadio 鐨勫唴瀹规槸鍔ㄦ�佺殑锛岀敤鍑芥暟鍖呰9 + () => [ + // 鏂囨湰鐩存帴杩斿洖锛堜笉瑕佸祵濂楀嚱鏁帮級 + item.enterpriseName, + item.isManger + ? h( + ElTag, + { + type: "primary", + size: "small", + style: { + marginLeft: "8px", + alignSelf: "center" + } + }, + // ElTag 鐨勫唴瀹规槸闈欐�佹枃鏈紝鐩存帴杩斿洖 + { + default: () => "绠$悊鍛�" + } + ) + : null + ] + ) + ]; + } + } + ) + ]; + } + } + ) + ) + ) + ]; + } + } + ) + ]; + } + } + ), + // jsx 璇硶 锛堟敞鎰忓湪.vue鏂囦欢鍚敤jsx璇硶锛岄渶瑕佸湪script寮�鍚痩ang="tsx"锛� + closeCallBack: ({ options, args }) => { + if (args?.command === "cancel") { + // 鎮ㄧ偣鍑讳簡鍙栨秷鎸夐挳 + } else if (args?.command === "sure") { + let obj = { + phone: state.ruleForm.phone, + code: secondCode, + id: secondId.value + }; + useUserStoreHook() + .loginByUsername(obj) + .then(res => { + if (res?.code == 200) { + message("鐧诲綍鎴愬姛锛�", { type: "success" }); + router.replace({ + path: "/Index" + }); + } else { + message(res?.message, { type: "warning" }); + } + }); + } else { + } + } + }); +}; + +// 鐐瑰嚮鐧诲綍 const onLogin = async (formEl: FormInstance | undefined) => { if (!formEl) return; await formEl.validate(valid => { if (valid) { + let obj = { + phone: state.ruleForm.phone, + code: state.ruleForm.phoneVCode, + exRuleCode: state.ruleForm.exRoleCode + }; loading.value = true; useUserStoreHook() - .loginByUsername({ - phone: state.ruleForm.phone, - code: state.ruleForm.phoneVCode, - exRuleCode: state.ruleForm.exRoleCode - }) + .loginByUsername(obj) .then(res => { if (res.code == 200) { // 鑾峰彇鍚庣璺敱 return initRouter().then(() => { - console.log(res, "=-=-=-="); - if (!res.result.exRoles.hasFlsh) { - disabled.value = true; + let obj = res.result; + if (obj.theLastLogo) { router .replace({ - name: "RegisterNav", - query: { code: res?.result?.exRoles.code } + path: "/Index" }) .then(() => { message("鐧诲綍鎴愬姛", { type: "success" }); }) .finally(() => (disabled.value = false)); } else { - router.replace("welcome"); + state.myEnterpriseList = obj.customerExs; + secondCode = obj.code; + openDialog(); } }); } else { message(res?.message || "鐧诲綍澶辫触", { type: "error" }); } }) - .finally(() => (loading.value = false)); + .finally(() => { + loading.value = false; + disabled.value = false; + }); } }); }; + +// 鍙戦�佹墜鏈洪獙璇佺爜 const sendValidationCode = async () => { if (!state.ruleForm.phone) { return message("璇峰厛杈撳叆鎵嬫満鍙�", { type: "warning" }); @@ -239,26 +345,12 @@ <div class="wave"> <img width="400px" :src="logo1" class="logo1" /> </div> - <!-- <img :src="bg" class="wave" /> --> - <!-- <div class="flex-c absolute right-5 top-3"> --> - <!-- 涓婚 --> - <!-- <el-switch - v-model="dataTheme" - inline-prompt - :active-icon="dayIcon" - :inactive-icon="darkIcon" - @change="dataThemeChange" - /> - </div> --> <div class="login-container"> - <div class="img"> - <!-- <component :is="toRaw(illustration)" /> --> - </div> + <div class="img" /> <div class="login-box"> <div class="login-form"> - <!-- <avatar class="avatar" /> --> <Motion> - <h2 class="logintitle">{{ state.nowRole.name }}鐧诲綍</h2> + <h2 class="logintitle">鐧诲綍</h2> </Motion> <el-form @@ -267,18 +359,6 @@ :rules="loginRules" size="large" > - <!-- <Motion :delay="150"> - <el-form-item prop="exRoleCode"> - <el-radio-group v-model="state.ruleForm.exRoleCode"> - <el-radio - v-for="item in state.roleList" - :key="item.id" - :value="item.code" - >{{ item.name }}</el-radio - > - </el-radio-group> - </el-form-item> - </Motion> --> <Motion :delay="100"> <el-form-item :rules="[ @@ -331,16 +411,6 @@ </div> </el-col> </el-form-item> - - <!-- <el-form-item prop="password"> - <el-input - v-model="ruleForm.password" - clearable - show-password - placeholder="瀵嗙爜" - :prefix-icon="useRenderIcon(Lock)" - /> - </el-form-item> --> </Motion> <Motion :delay="150"> <el-form-item prop="phoneVCode"> @@ -354,7 +424,7 @@ <span id="suffix-span-2" ref="spanRef" - @click="sendValidationCode(state.ruleForm.phone)" + @click="sendValidationCode" > 鑾峰彇楠岃瘉鐮� </span> -- Gitblit v1.9.1