diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/request/EmailLoginRequest.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/request/EmailLoginRequest.java new file mode 100644 index 00000000..aba84cc8 --- /dev/null +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/model/request/EmailLoginRequest.java @@ -0,0 +1,59 @@ +/* + * Copyright (c) 2022-present Charles7c Authors. All Rights Reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package top.charles7c.cnadmin.auth.model.request; + +import java.io.Serializable; + +import javax.validation.constraints.NotBlank; +import javax.validation.constraints.Pattern; + +import lombok.Data; + +import io.swagger.v3.oas.annotations.media.Schema; + +import org.hibernate.validator.constraints.Length; + +import top.charles7c.cnadmin.common.constant.RegexConsts; + +/** + * 邮箱登录信息 + * + * @author Charles7c + * @since 2023/10/23 20:15 + */ +@Data +@Schema(description = "邮箱登录信息") +public class EmailLoginRequest implements Serializable { + + private static final long serialVersionUID = 1L; + + /** + * 邮箱 + */ + @Schema(description = "邮箱", example = "123456789@qq.com") + @NotBlank(message = "邮箱不能为空") + @Pattern(regexp = RegexConsts.EMAIL, message = "邮箱格式错误") + private String email; + + /** + * 验证码 + */ + @Schema(description = "验证码", example = "888888") + @NotBlank(message = "验证码不能为空") + @Length(max = 6, message = "验证码非法") + private String captcha; +} diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/LoginService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/LoginService.java index 2b39ca57..a7738af5 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/LoginService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/LoginService.java @@ -31,7 +31,7 @@ import me.zhyd.oauth.model.AuthUser; public interface LoginService { /** - * 用户登录 + * 账号登录 * * @param username * 用户名 @@ -39,7 +39,16 @@ public interface LoginService { * 密码 * @return 令牌 */ - String login(String username, String password); + String accountLogin(String username, String password); + + /** + * 邮箱登录 + * + * @param email + * 邮箱 + * @return 令牌 + */ + String emailLogin(String email); /** * 三方账号登录 diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java index 970d8fa0..d5e098b8 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/auth/service/impl/LoginServiceImpl.java @@ -76,11 +76,19 @@ public class LoginServiceImpl implements LoginService { private final UserSocialService userSocialService; @Override - public String login(String username, String password) { + public String accountLogin(String username, String password) { UserDO user = userService.getByUsername(username); - CheckUtils.throwIfNull(user, "用户名或密码错误"); + CheckUtils.throwIfNull(user, "用户名或密码不正确"); Long userId = user.getId(); - CheckUtils.throwIfNotEqual(SecureUtils.md5Salt(password, userId.toString()), user.getPassword(), "用户名或密码错误"); + CheckUtils.throwIfNotEqual(SecureUtils.md5Salt(password, userId.toString()), user.getPassword(), "用户名或密码不正确"); + this.checkUserStatus(user); + return this.login(user); + } + + @Override + public String emailLogin(String email) { + UserDO user = userService.getByEmail(email); + CheckUtils.throwIfNull(user, "此邮箱未绑定本系统账号"); this.checkUserStatus(user); return this.login(user); } @@ -187,6 +195,6 @@ public class LoginServiceImpl implements LoginService { private void checkUserStatus(UserDO user) { CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, user.getStatus(), "此账号已被禁用,如有疑问,请联系管理员"); DeptDetailVO deptDetailVO = deptService.get(user.getDeptId()); - CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, deptDetailVO.getStatus(), "此账号部门已被禁用,如有疑问,请联系管理员"); + CheckUtils.throwIfEqual(DisEnableStatusEnum.DISABLE, deptDetailVO.getStatus(), "此账号所属部门已被禁用,如有疑问,请联系管理员"); } } diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java index 1b77c049..e2e7751e 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/mapper/UserMapper.java @@ -40,6 +40,16 @@ public interface UserMapper extends DataPermissionMapper { @Select("SELECT * FROM `sys_user` WHERE `username` = #{username}") UserDO selectByUsername(@Param("username") String username); + /** + * 根据邮箱查询 + * + * @param email + * 邮箱 + * @return 用户信息 + */ + @Select("SELECT * FROM `sys_user` WHERE `email` = #{email}") + UserDO selectByEmail(@Param("email") String email); + /** * 根据 ID 查询昵称 * diff --git a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java index d7376f9c..14e8c15a 100644 --- a/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java +++ b/continew-admin-system/src/main/java/top/charles7c/cnadmin/system/service/UserService.java @@ -118,6 +118,15 @@ public interface UserService extends BaseService deptIds) { return baseMapper.lambdaQuery().in(UserDO::getDeptId, deptIds).count(); diff --git a/continew-admin-ui/src/api/auth/login.ts b/continew-admin-ui/src/api/auth/login.ts index 85b8207e..12eb7752 100644 --- a/continew-admin-ui/src/api/auth/login.ts +++ b/continew-admin-ui/src/api/auth/login.ts @@ -6,7 +6,6 @@ const BASE_URL = '/auth'; export interface LoginReq { phone?: string; - email?: string; username?: string; password?: string; captcha: string; @@ -17,8 +16,17 @@ export interface LoginRes { token: string; } -export function login(req: LoginReq) { - return axios.post(`${BASE_URL}/login`, req); +export function accountLogin(req: LoginReq) { + return axios.post(`${BASE_URL}/account`, req); +} + +export interface EmailLoginReq { + email: string; + captcha: string; +} + +export function emailLogin(req: EmailLoginReq) { + return axios.post(`${BASE_URL}/email`, req); } export function logout() { @@ -34,9 +42,9 @@ export function listRoute() { } export function socialAuth(source: string) { - return axios.get(`${BASE_URL}/${source}`); + return axios.get(`/oauth/${source}`); } export function socialLogin(source: string, req: any) { - return axios.post(`${BASE_URL}/${source}`, req); + return axios.post(`/oauth/${source}`, req); } diff --git a/continew-admin-ui/src/store/modules/user/index.ts b/continew-admin-ui/src/store/modules/user/index.ts index f26e5402..660a0b6e 100644 --- a/continew-admin-ui/src/store/modules/user/index.ts +++ b/continew-admin-ui/src/store/modules/user/index.ts @@ -1,10 +1,12 @@ import { defineStore } from 'pinia'; import { - login as userLogin, + LoginReq, + EmailLoginReq, + accountLogin as userAccountLogin, + emailLogin as userEmailLogin, socialLogin as userSocialLogin, logout as userLogout, getUserInfo, - LoginReq, } from '@/api/auth/login'; import { getImageCaptcha as getCaptcha } from '@/api/common/captcha'; import { setToken, clearToken } from '@/utils/auth'; @@ -42,10 +44,21 @@ const useUserStore = defineStore('user', { return getCaptcha(); }, - // 用户登录 - async login(req: LoginReq) { + // 账号登录 + async accountLogin(req: LoginReq) { try { - const res = await userLogin(req); + const res = await userAccountLogin(req); + setToken(res.data.token); + } catch (err) { + clearToken(); + throw err; + } + }, + + // 邮箱登录 + async emailLogin(req: EmailLoginReq) { + try { + const res = await userEmailLogin(req); setToken(res.data.token); } catch (err) { clearToken(); diff --git a/continew-admin-ui/src/views/login/components/account-login.vue b/continew-admin-ui/src/views/login/components/account-login.vue index 6b3f3830..a347e03f 100644 --- a/continew-admin-ui/src/views/login/components/account-login.vue +++ b/continew-admin-ui/src/views/login/components/account-login.vue @@ -124,7 +124,7 @@ if (!errors) { loading.value = true; userStore - .login({ + .accountLogin({ username: values.username, password: encryptByRsa(values.password) || '', captcha: values.captcha, diff --git a/continew-admin-ui/src/views/login/components/email-login.vue b/continew-admin-ui/src/views/login/components/email-login.vue index 490ea7de..c001d4ca 100644 --- a/continew-admin-ui/src/views/login/components/email-login.vue +++ b/continew-admin-ui/src/views/login/components/email-login.vue @@ -6,6 +6,7 @@ layout="vertical" size="large" class="login-form" + @submit="handleLogin" > {{ $t('login.button') }}(即将开放) + >{{ $t('login.button') }} @@ -40,11 +41,15 @@