用户模块-登录接口完整code

用户模块-登录接口完整code_第1张图片
Paste_Image.png
用户模块-登录接口完整code_第2张图片
Paste_Image.png
用户模块-登录接口完整code_第3张图片
Paste_Image.png

一、接口

-新建UserController
-在类上面,添加spring注解,@Controller,起到Controller作用
-在类上面,添加@RequestMapping("/user/"),把请求地址放到/user命名空间下
-构造类里登录函数login,参数username,password,session
-注释:用户登录
-添加@RequestMapping(value="Login.do",method=RequestMapping.POST),value和接口名保持一致,设置方法post
-添加RequestBody,在返回值的时候,自动通过springmvc的josn 插件将返回值序列化成josn ,通过插件的配置文件dispatche-servlet.xml看到bean(如图),点击bean所指向的类,打开没有看到supportMedicaTypes这个属性,打开其所继承的父类,发现supportMedicaTypes属性,且是个集合,因此在dispatche-servlet.xml中直接把要配置的application/josn注入到集合value里面,这样,MVC返回值通过responseBody注解自动序列化成 josn 。

用户模块-登录接口完整code_第4张图片
Paste_Image.png

-写service,调用mybatis的dao层

二、service层

-创建接口IUserService,便于维护,为AOP做准备,无论是静态代理或者是动态代理,还是后续发展成的AOP都用接口代理,也可以用czlib来代理class,但是这种方式没有接口扩展性强
-声明login接口

用户模块-登录接口完整code_第5张图片
Paste_Image.png

-创建实现类UserServiceImpl,注入实现方法

用户模块-登录接口完整code_第6张图片
Paste_Image.png

三、通用数据端响应对象【ServiceResponse、ResponseCode】

-common下创建类ServiceResponse

-用范型声明该类,传范型T,代表响应里面要封装的数据对象是什么类型,让它实现序列化接口Serializable
-声明三个属性:int status,String msg,T data,data代表我们将返回的范型使用对象,为了做成通用的,采用T 做一个范型,好处:返回时可以指定范型内容,也可以不指定类型

用户模块-登录接口完整code_第7张图片
Paste_Image.png

-构造方法,写成私有的,即外部不能new;几个私有的构造器,调用比较方便,规避String msg和String data的冲突(data的值可能会传进msg里)

用户模块-登录接口完整code_第8张图片
Paste_Image.png

-封装一个方法isSuccess,来确认这个响应是不是成功的响应,如果status是0则success,1则fail

Paste_Image.png

-用一个枚举来对数字归类

-在common创建enum枚举类ResponseCode

0-成功,1-出错,10-需要登录,2-不合法参数

用户模块-登录接口完整code_第9张图片
Paste_Image.png

-声明两个属性code,desc,写出构造器


用户模块-登录接口完整code_第10张图片
Paste_Image.png

-响应编码枚举类完成,扩展只需要继续编辑即可

-回到ServiceResponse

更改isSuccess方法,如果SUCCESS.getcode返回为0,即返回true
(其实isSuccess方法不是一直都是0值吗?)

Paste_Image.png

-创建三个公有构造器

用户模块-登录接口完整code_第11张图片
Paste_Image.png

-创建成功状态下的公有构造器,调用私有构造器,1.仅status,2、status+msg 3、status+data 4、status+msg+data;此时解决了上面提到的“传String data的冲突(data的值可能会传进msg里)”,因为public构造器里面传参使用 T类型,调用私有构造器时仅传入T类型的data里


用户模块-登录接口完整code_第12张图片
Paste_Image.png

--创建失败状态下和其他错误状态的公有构造器(但是这个errorCode是??)

用户模块-登录接口完整code_第13张图片
Paste_Image.png

--加工。三个属性int status,String msg,T data是序列化返回给前端,但是isSuccess是public,会显示在前端的josn里,所以要加一个@JosnIgnore注解,则该字段序列化之后不会显示在josn里面

用户模块-登录接口完整code_第14张图片
Paste_Image.png

--public 的get方法都会显示在josn里面

--注意:失败有时候不返回data,此时是有data-key的空节点,data-value是null,这种是不需要返回给前端的,控制方法:在类前面增加注解@JosnSerialize(include = JosnSerialize.Inclusion.NOT_NULL)
该注解作用,仅返回非空值,比如只需要返回status,那么msg和data为空就不会返回给前端
【保证序列化json的时候,null的对象,key也会消失】

用户模块-登录接口完整code_第15张图片
Paste_Image.png

四、继续编写service层和dao层mapper逻辑

-先把IUserService和UserServiceImpl中login的方法返回类型都改成ServiceResponse类型

用户模块-登录接口完整code_第16张图片
Paste_Image.png

-把mapper通过注解方式引进来

用户模块-登录接口完整code_第17张图片
Paste_Image.png

-编写UserMapper接口,增加checkUser方法

用户模块-登录接口完整code_第18张图片
Paste_Image.png

-编写UserMapperImpl,用#防止sql注入,会进行预编译

用户模块-登录接口完整code_第19张图片

-回到service,使用范型做的高可用的服务端相应类进行报错

用户模块-登录接口完整code_第20张图片
Paste_Image.png

-MD5不可逆转加密方法,先// to do MD5

-继续判断用户密码,编写mapper,返回值User,因为一旦登录成功,返回值是User
注意:Mybatis传多个参数需要用到@Param注解,写sql是要对应@Param注解里面的String

用户模块-登录接口完整code_第21张图片

-resultmap引用mapper顶部有自定义的,resulttype引用java本来有的类型(parametetype也是),parametetype为map(全称为:java.util.Map)型,因为会接收多个参数
注意:sql语句最好不要写成select *,因为实际开发过程中,表是会发生变化的,如果始终只是要两个字段,那么select *就不利于维护,要什么查什么
可以方便要查询的数据

用户模块-登录接口完整code_第22张图片
Paste_Image.png

-回到service层,处理密码错误情况和能成功登录的情况,setPassword是为了将返回值密码置为空

用户模块-登录接口完整code_第23张图片
Paste_Image.png

五、把service注入到controller上

-先声明,@service("iUserService")

用户模块-登录接口完整code_第24张图片
Paste_Image.png

-把service注解到controller

用户模块-登录接口完整code_第25张图片

-声明一个常量类,Const,当前用户

用户模块-登录接口完整code_第26张图片
Paste_Image.png

-在login方法里声明一个response,如果isSuccess为0,成功响应。
然后调用常量类的属性,设置session属性,两个参数

用户模块-登录接口完整code_第27张图片
Paste_Image.png

你可能感兴趣的:(用户模块-登录接口完整code)