main
			
			
		
		
							parent
							
								
									7f8fabd46e
								
							
						
					
					
						commit
						d714db0891
					
				@ -0,0 +1,9 @@ | 
				
			|||||||
 | 
					package wusthelper.data.dao.mapper; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.baomidou.mybatisplus.core.mapper.BaseMapper; | 
				
			||||||
 | 
					import org.apache.ibatis.annotations.Mapper; | 
				
			||||||
 | 
					import wusthelper.data.entity.UserBasic; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Mapper | 
				
			||||||
 | 
					public interface UserBasicMapper extends BaseMapper<UserBasic> { | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,54 @@ | 
				
			|||||||
 | 
					package wusthelper.data.entity; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import lombok.AllArgsConstructor; | 
				
			||||||
 | 
					import lombok.Builder; | 
				
			||||||
 | 
					import lombok.Data; | 
				
			||||||
 | 
					import lombok.NoArgsConstructor; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import java.time.LocalDateTime; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					@Data | 
				
			||||||
 | 
					@Builder | 
				
			||||||
 | 
					@NoArgsConstructor | 
				
			||||||
 | 
					@AllArgsConstructor | 
				
			||||||
 | 
					public class UserBasic { | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * uid | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private Long uid; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * 学号 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private String stuNum; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * 教务处密码 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private String officialPwd;// 官方
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * 图书馆密码 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private String libPwd; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * 物理实验系统密码 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private String physicsPwd; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * create_time | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private LocalDateTime createTime; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * update_time | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private LocalDateTime updateTime; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * deleted | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    private Integer deleted; | 
				
			||||||
 | 
					} | 
				
			||||||
@ -0,0 +1,99 @@ | 
				
			|||||||
 | 
					package wusthelper.web.service.campus; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
				
			||||||
 | 
					import com.github.yitter.idgen.YitIdHelper; | 
				
			||||||
 | 
					import org.springframework.stereotype.Service; | 
				
			||||||
 | 
					import wusthelper.data.dao.mapper.StudentMapper; | 
				
			||||||
 | 
					import wusthelper.data.dao.mapper.UserBasicMapper; | 
				
			||||||
 | 
					import wusthelper.data.entity.Student; | 
				
			||||||
 | 
					import wusthelper.data.entity.UserBasic; | 
				
			||||||
 | 
					import wusthelper.web.data.entity.CookieType; | 
				
			||||||
 | 
					import wusthelper.web.service.campus.graduate.GraduateCookieService; | 
				
			||||||
 | 
					import wusthelper.web.service.campus.undergrad.UndergradCookieService; | 
				
			||||||
 | 
					import wusthelper.web.service.cookie.CookieManager; | 
				
			||||||
 | 
					import wusthelper.web.util.PasswordCodec; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					/** | 
				
			||||||
 | 
					 * 通用的用户登录信息服务,包括登录和(已存储的)用户信息获取等,同时自动存入新用户基本()信息 | 
				
			||||||
 | 
					 */ | 
				
			||||||
 | 
					@Service | 
				
			||||||
 | 
					public class GeneralUserLoginService { | 
				
			||||||
 | 
					    private final UserBasicMapper studentMapper; | 
				
			||||||
 | 
					    private final PasswordCodec passwordCodec; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private final UndergradCookieService undergradCookieService; | 
				
			||||||
 | 
					    private final GraduateCookieService graduateCookieService; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public GeneralUserLoginService(UserBasicMapper studentMapper, | 
				
			||||||
 | 
					                                   PasswordCodec passwordCodec, | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					                                   UndergradCookieService undergradCookieService, | 
				
			||||||
 | 
					                                   GraduateCookieService graduateCookieService) { | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.studentMapper = studentMapper; | 
				
			||||||
 | 
					        this.passwordCodec = passwordCodec; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        this.undergradCookieService = undergradCookieService; | 
				
			||||||
 | 
					        this.graduateCookieService = graduateCookieService; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    public enum UserType {Undergrad, Graduate} | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    /** | 
				
			||||||
 | 
					     * 登录验证,同时自动存库(基本信息) | 
				
			||||||
 | 
					     * | 
				
			||||||
 | 
					     * @param username 用户名(即学号) | 
				
			||||||
 | 
					     * @param password 密码(明文原文) | 
				
			||||||
 | 
					     * @param userType 用户类型,现在有本科生和研究生 | 
				
			||||||
 | 
					     * @return 用户信息 | 
				
			||||||
 | 
					     */ | 
				
			||||||
 | 
					    public UserBasic login(String username, String password, UserType userType) { | 
				
			||||||
 | 
					        var cookie = switch (userType) { | 
				
			||||||
 | 
					            case Undergrad -> undergradCookieService.getLoginCookie(username, password); | 
				
			||||||
 | 
					            case Graduate -> graduateCookieService.getLoginCookie(username, password); | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var cookieType = switch (userType) { | 
				
			||||||
 | 
					            case Undergrad -> CookieType.Undergrad; | 
				
			||||||
 | 
					            case Graduate -> CookieType.Graduate; | 
				
			||||||
 | 
					        }; | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        // 保存cookie,并将用户基本信息存库
 | 
				
			||||||
 | 
					        CookieManager.store(username, cookie, cookieType); | 
				
			||||||
 | 
					        return this.saveOrUpdateUser(username, password, userType); | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					    private UserBasic saveOrUpdateUser(String username, String password, UserType userType) { | 
				
			||||||
 | 
					        var query = new QueryWrapper<UserBasic>() | 
				
			||||||
 | 
					                .eq("stu_num", username) | 
				
			||||||
 | 
					                .eq("deleted", 0) | 
				
			||||||
 | 
					                .last("limit 1"); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        var user = studentMapper.selectOne(query); | 
				
			||||||
 | 
					        if (user != null) { | 
				
			||||||
 | 
					            var encrypted = passwordCodec.encode(password); | 
				
			||||||
 | 
					            user.setOfficialPwd(encrypted); | 
				
			||||||
 | 
					            if (userType == UserType.Undergrad) { | 
				
			||||||
 | 
					                user.setLibPwd(encrypted); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					            studentMapper.update(user, query); | 
				
			||||||
 | 
					        } else { | 
				
			||||||
 | 
					            var uid = YitIdHelper.nextId(); | 
				
			||||||
 | 
					            user = UserBasic.builder() | 
				
			||||||
 | 
					                    .uid(uid) | 
				
			||||||
 | 
					                    .stuNum(username) | 
				
			||||||
 | 
					                    .build(); | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            var encrypted = passwordCodec.encode(password); | 
				
			||||||
 | 
					            user.setOfficialPwd(encrypted); | 
				
			||||||
 | 
					            if (userType == UserType.Undergrad) { | 
				
			||||||
 | 
					                user.setLibPwd(encrypted); | 
				
			||||||
 | 
					            } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					            studentMapper.insert(user); | 
				
			||||||
 | 
					        } | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					        return user; | 
				
			||||||
 | 
					    } | 
				
			||||||
 | 
					} | 
				
			||||||
@ -1,116 +0,0 @@ | 
				
			|||||||
package wusthelper.web.service.campus; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; | 
					 | 
				
			||||||
import com.github.yitter.idgen.YitIdHelper; | 
					 | 
				
			||||||
import org.springframework.stereotype.Service; | 
					 | 
				
			||||||
import wusthelper.code.ServiceCode; | 
					 | 
				
			||||||
import wusthelper.data.dao.mapper.StudentMapper; | 
					 | 
				
			||||||
import wusthelper.data.entity.Student; | 
					 | 
				
			||||||
import wusthelper.web.data.entity.CookieType; | 
					 | 
				
			||||||
import wusthelper.web.exception.ServiceException; | 
					 | 
				
			||||||
import wusthelper.web.rpc.graduate.GraduateStudentInfoRemote; | 
					 | 
				
			||||||
import wusthelper.web.rpc.undergrad.UndergradStudentInfoRemote; | 
					 | 
				
			||||||
import wusthelper.web.service.campus.graduate.GraduateCookieService; | 
					 | 
				
			||||||
import wusthelper.web.service.campus.undergrad.UndergradCookieService; | 
					 | 
				
			||||||
import wusthelper.web.service.cookie.CookieManager; | 
					 | 
				
			||||||
import wusthelper.web.util.Converter; | 
					 | 
				
			||||||
import wusthelper.web.util.PasswordCodec; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
/** | 
					 | 
				
			||||||
 * 通用的用户信息服务,包括登录和(已存储的)用户信息获取等,同时自动存入新用户信息 | 
					 | 
				
			||||||
 */ | 
					 | 
				
			||||||
@Service | 
					 | 
				
			||||||
public class GeneralUserService { | 
					 | 
				
			||||||
    private final StudentMapper studentMapper; | 
					 | 
				
			||||||
    private final PasswordCodec passwordCodec; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private final UndergradCookieService undergradCookieService; | 
					 | 
				
			||||||
    private final GraduateCookieService graduateCookieService; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private final GraduateStudentInfoRemote graduateStudentInfoRemote; | 
					 | 
				
			||||||
    private final UndergradStudentInfoRemote undergradStudentInfoRemote; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public GeneralUserService(StudentMapper studentMapper, | 
					 | 
				
			||||||
                              PasswordCodec passwordCodec, | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                              UndergradCookieService undergradCookieService, | 
					 | 
				
			||||||
                              GraduateCookieService graduateCookieService, | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
                              GraduateStudentInfoRemote graduateStudentInfoRemote, | 
					 | 
				
			||||||
                              UndergradStudentInfoRemote undergradStudentInfoRemote) { | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        this.studentMapper = studentMapper; | 
					 | 
				
			||||||
        this.passwordCodec = passwordCodec; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        this.undergradCookieService = undergradCookieService; | 
					 | 
				
			||||||
        this.graduateCookieService = graduateCookieService; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        this.graduateStudentInfoRemote = graduateStudentInfoRemote; | 
					 | 
				
			||||||
        this.undergradStudentInfoRemote = undergradStudentInfoRemote; | 
					 | 
				
			||||||
    } | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    public enum UserType {Undergrad, Graduate} | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    /** | 
					 | 
				
			||||||
     * 登录验证并获取用户信息,同时自动存库 | 
					 | 
				
			||||||
     * | 
					 | 
				
			||||||
     * @param username 用户名(即学号) | 
					 | 
				
			||||||
     * @param password 密码(明文原文) | 
					 | 
				
			||||||
     * @param userType 用户类型,现在有本科生和研究生 | 
					 | 
				
			||||||
     * @return 用户信息 | 
					 | 
				
			||||||
     */ | 
					 | 
				
			||||||
    public Student login(String username, String password, UserType userType) { | 
					 | 
				
			||||||
        var cookie = switch (userType) { | 
					 | 
				
			||||||
            case Undergrad -> undergradCookieService.getLoginCookie(username, password); | 
					 | 
				
			||||||
            case Graduate -> graduateCookieService.getLoginCookie(username, password); | 
					 | 
				
			||||||
        }; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        var cookieType = switch (userType) { | 
					 | 
				
			||||||
            case Undergrad -> CookieType.Undergrad; | 
					 | 
				
			||||||
            case Graduate -> CookieType.Graduate; | 
					 | 
				
			||||||
        }; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // 保存cookie,并获取用户信息并存库(基本的操作,非异步,信息获取失败意味登陆失败)
 | 
					 | 
				
			||||||
        CookieManager.store(username, cookie, cookieType); | 
					 | 
				
			||||||
        return this.saveOrUpdateUser(username, cookie, password, userType); | 
					 | 
				
			||||||
    } | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
    private Student saveOrUpdateUser(String username, String cookie, String password, UserType userType) { | 
					 | 
				
			||||||
        var rpcResp = switch (userType) { | 
					 | 
				
			||||||
            case Undergrad -> undergradStudentInfoRemote.get(cookie); | 
					 | 
				
			||||||
            case Graduate -> graduateStudentInfoRemote.get(cookie); | 
					 | 
				
			||||||
        }; | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        if (rpcResp.code() != ServiceCode.Ok) { | 
					 | 
				
			||||||
            ServiceException.of(rpcResp.code()); | 
					 | 
				
			||||||
        } | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        var studentInfo = rpcResp.data(); | 
					 | 
				
			||||||
        var student = Converter.convert(studentInfo); | 
					 | 
				
			||||||
        if (student.getStuNum() == null) { | 
					 | 
				
			||||||
            student.setStuNum(username); | 
					 | 
				
			||||||
        } | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        var query = new QueryWrapper<Student>() | 
					 | 
				
			||||||
                .eq("stu_num", username) | 
					 | 
				
			||||||
                .eq("deleted", 0); | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        // (按学号)检查用户信息是否已经存在数据库中,已存在则更新,否则新增信息
 | 
					 | 
				
			||||||
        var studentExists = studentMapper.exists(query); | 
					 | 
				
			||||||
        if (studentExists) { | 
					 | 
				
			||||||
            studentMapper.update(student, query); | 
					 | 
				
			||||||
        } else { | 
					 | 
				
			||||||
            student.setId(YitIdHelper.nextId()); | 
					 | 
				
			||||||
            var encrypted = passwordCodec.encode(password); | 
					 | 
				
			||||||
            student.setJwcPwd(encrypted); | 
					 | 
				
			||||||
            if (userType == UserType.Undergrad) { | 
					 | 
				
			||||||
                student.setLibPwd(encrypted); | 
					 | 
				
			||||||
            } | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
            studentMapper.insert(student); | 
					 | 
				
			||||||
        } | 
					 | 
				
			||||||
 | 
					 | 
				
			||||||
        return student; | 
					 | 
				
			||||||
    } | 
					 | 
				
			||||||
} | 
					 | 
				
			||||||
@ -1 +1 @@ | 
				
			|||||||
Subproject commit 367ddbb930b50cadbb56bd97acee05d721b9427b | 
					Subproject commit 0ca9d1a48da91b30933a3dd35e3428bb5207078f | 
				
			||||||
					Loading…
					
					
				
		Reference in new issue