刚入职的小白写了一个登录的接口,但感觉写的很臃肿,请教一下大佬有没有可以优化的地方呢?

2022-03-15 15:28:38 +08:00
 zx9481
@Override
    public Response login(String params) {
        try {
            JSONObject jsonObject = JSON.parseObject(params);
            // 解密手机号码
            AesNewUtil aes = new AesNewUtil();
            String decMobile = aes.decrypt(jsonObject.getString("mobile"));
            // 获取 openId
            String openId = jsonObject.getString("openId");
            if (StringUtils.isEmpty(openId)) {
                return Response.fail(RespCode.PARAM_NULL);
            }
            logger.info("openId : {}", openId);
            // 查询代客用户表
            ValetUser valetUser = selectUserByMobile(decMobile);
            // 用户是否存在于白名单中
            if (null == valetUser) {
                return Response.fail(RespCode.NO_GET_INFO);
            } else {
                String userId = valetUser.getUserId();
                // 判断用户信息是否存在
                ValetUserInfo valetUserInfo = valetUserInfoMapper.selectByPrimaryKey(userId);
                if (null == valetUserInfo) {
                    // 保存用户信息
                    valetUserInfo = new ValetUserInfo();
                    valetUserInfo.setUserId(userId);
                    valetUserInfo.setOpenId(openId);
                    valetUserInfo.setCreateTime(DateUtils.getNowDate());
                    valetUserInfo.setUpdateTime(DateUtils.getNowDate());
                    valetUserInfoMapper.insertSelective(valetUserInfo);
                }
                // 获取 token
                String token = TokenUtil.generateToken(userId, decMobile, "app");
                cacheOpt.getOpt(Constants.CACHE_STR).opsForValue().set(Constants.USER_AUTH_PRIFIX + userId, token, 7, TimeUnit.DAYS);
//                cacheOpt.getOpt(Constants.CACHE_STR).opsForValue().set(Constants.LOGIN_MOBILE_AUTH_PRIFIX + userId, decMobile, 7, TimeUnit.DAYS);
//                logger.info((String) cacheOpt.getOpt(Constants.CACHE_STR).opsForValue().get(Constants.USER_AUTH_PRIFIX + valetUser.getUserId()));
                Map<String, Object> result = new HashMap<>();
                // 用户类型:0 无效,1 网格,2 客户经理,3 泛渠道,4 其他
                String userType = String.valueOf(valetUser.getUserType());
                if ("0".equals(userType)) {
                    userType = "无效";
                } else if ("1".equals(userType)) {
                    userType = "网格";
                } else if ("2".equals(userType)) {
                    userType = "客户经理";
                } else if ("3".equals(userType)) {
                    userType = "泛渠道";
                } else {
                    userType = "其他";
                }
                result.put("mobile", valetUser.getMobile());
                result.put("userName", valetUser.getUserName());
                result.put("cusName", valetUser.getCusName());
                result.put("userType", userType);
                result.put("operId", valetUser.getOperId());
                result.put("orgId", valetUser.getOrgId());
                result.put("merchantNum", valetUser.getMerchantNum());
                result.put("token", token);
                // 更新用户表登录时间
                valetUserMapper.updateLoginTimeByUserId(DateUtils.getNowDate(), userId);
                logger.info("登录成功 {}", decMobile);
                return Response.success("登录成功", result);
            }
        } catch (ValetappException e) {
            logger.error("登录失败 : " + e.getMessage());
            return Response.fail(RespCode.FAIL);
        }
    }
3458 次点击
所在节点    Java
36 条回复
lcy630409
2022-03-15 15:31:10 +08:00
写的很好,没问题。初学者 这样写很好的,能运行,让别人容易看懂就是好代码
SmaliYu
2022-03-15 15:32:55 +08:00
我觉得挺好,能用能看明白,别的都是锦上添花
Rache1
2022-03-15 15:33:09 +08:00
(⊙ˍ⊙),Java 被你写成了 JavaScript 的感觉,Java 强类型的优势全无了。

接收请求参数应该创建一个类型实体来,而不是直接在 JSON 对象上获取,响应也是。

userType 判断那块,可以用 Map 来处理。「用户是否存在于白名单中」,你那里 return 了 下面就可以不要 else 了,下面直接写在那个 if 外就可以了。
kosmosr
2022-03-15 15:36:36 +08:00
返回不要用 map 封装 很难维护 最好写一个返回的 vo 然后 userType 可以用枚举封装一下
356693212
2022-03-15 15:36:40 +08:00
@Rache1 所以前端看懂了 哈哈
sinnosong1
2022-03-15 15:38:15 +08:00
//用户类型:0 无效,1 网格,2 客户经理,3 泛渠道,4 其他 这里可以建个 enum ,后面需要扩充的时候再修改
Latin
2022-03-15 15:40:30 +08:00
所以楼主就是那个小白吗
chendy
2022-03-15 15:47:39 +08:00
json 解析都进业务层了,数据校验还需要自己 try catch ,楼主不是钓鱼拉血压的吧……
还有这个奇怪的 override ,是用了啥奇怪的框架还是写了一个毫无意义的 service 接口……
MoYi123
2022-03-15 15:48:16 +08:00
1. valetUserInfo.setCreateTime(DateUtils.getNowDate()); valetUserInfo.setUpdateTime(DateUtils.getNowDate());
创建时间和更新时间应该自动加, 手动加容易忘记.
2. 不要注释代码, 哪天想找回来 git 里有记录的.
ming159
2022-03-15 15:51:11 +08:00
代码 "臃肿" 并不是问题. 个人看法是 耦合度太高.无法应对需求变动,建议参考其它用户,权限,角色管理系统. 我个人认为存在的问题有这么几个
1. login 方法中的参数,未做比较严格的校验,如果客户端传入了 10 万字符长度的,你这里会不会卡?
2. 是否可以将参数校验单独提取为一个 方法? validator
3. 用户黑白名单与角色的功能是写死的,如果需求变动,是需要改代码的. 如果允许可以使用 apache shiro 这种成熟的权限框架,如果觉得重,也务必将 授权,鉴权 独立为两个模块,方便扩展.
hidemyself
2022-03-15 15:53:24 +08:00
valatUserInfo,userType 可以抽成一个函数
尽量不要用 map
最后的组装可以用 builder 或者 Beanutil 这种东西

当然以上都是吹毛求疵了,我个人会做成这样
LLaMA2
2022-03-15 15:54:13 +08:00
private final MemberService memberService;
public ResponseEntity<?> login(@NotNull final String mobile, @NotNull final String passwd) {
String decrptMobile = AesUtil.decrypt(mobile);
Member member = memberService.findByMobile(mobile);
if(BCrypt.check(passwd, member.passwd)) throw new LoginException('登录失败');
String token = TokenUtil.generate(decMobile);
LoginResp resp = LoginResp.builder()
.name(member.name)
.age(member.age)
.token(token)
.build();
ResponseEntity.status(HttpStatus.OK)
.header("token", token)
.body(resp);
}
storyxc
2022-03-15 15:57:34 +08:00
1. 不要用 Map 做方法参数 /返回值,建单独的 param/vo 类,否则以后维护接口的时候看到这么长一串参数会一脸懵逼
2. 代码里不要写 0 ,1 ,2 ,3 ,4 。。。这种魔法数字,建立常量 /枚举来维护这些值
janus77
2022-03-15 16:07:39 +08:00
初学这样写挺好的,后面就是抽离封装方法了。可以重复利用的功能抽成一个方法,比如白名单,用户存在,用户的类型,参数的 put ,用户登录的更新,这些抽成方法,然后去调用。
再进一步就要用到架构类的知识了,现在这样就行
bojue
2022-03-15 16:13:05 +08:00
{'0':'无效'}[userType]
pengtdyd
2022-03-15 16:40:08 +08:00
过来人的经验:能跑就行!!!
KK7890
2022-03-15 17:02:28 +08:00
看到了 论坛的大爱。。。。谢谢大家 虽然我看不懂
rootx
2022-03-15 17:06:50 +08:00
“又不是不能用”🌸🐔
zx9481
2022-03-15 17:14:43 +08:00
@Rache1 请问 userType 怎么用 map 处理呢?有点不太理解。
siweipancc
2022-03-15 17:17:04 +08:00
按我们组长的话“能用,不慢就行”

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/840507

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX