常见问题~

1、什么是RESTful风格的后端接口?

前后端分离的项目中,很重要的一块是前后端项目数据的交互。在项目中,我们可以使用ResultFul规范来编写统一的前后端交互接口,即我们之前所写的Controller。

一、 什么是Restful
Restful【规范】是一种面向资源的架构风格,可以简单理解为:使用URL名词定位资源,用HTTP动词【GET,POST,DELETE,PUT,PATCH】描述操作。客户端使用GET,POST,PUT,DELETE,PATCH来表示操作方式的动词对服务端资源进行操作。一般情况下:

GET:获取资源

POST:添加资源【也可以用于更新资源】

PUT:更新资源【也可以用于添加资源】

DELETE:用来删除资源

PATCH:用来做批量操作

2、开发一个功能需要经历那些流程?

1. 开发流程
正常的项目开发流程大致是:

先整理出当前项目涉及的数据的类型
例如:电商类包含用户、商品、购物车、订单等
再列举各种数据类型涉及的数据操作
例如:用户类型涉及注册、登录等
再挑选相对简单的数据类型先处理
简单的易于实现,且可以积累经验
在各数据类型涉及的数据操作中,大致遵循增、查、删、改的开发顺序
只有先增,还可能查、删、改
只有查了以后,才能明确有哪些数据,才便于实现删、改
删和改相比,删一般更加简单,所以先开发删,再开发改
在开发具体的数据操作时,应该大致遵循持久层 >> 业务逻辑层 >> 控制器层 >> 前端页面的开发顺序
2. 管理员登录-持久层
2.1. 创建或配置
如果是整个项目第1次开发持久层,在Spring Boot项目中,需要配置:

使用@MapperScan配置接口所在的根包

在配置文件中通过mybatis.mapper-locations配置XML文件的位置
如果第1次处理某种类型数据的持久层访问,需要:

创建接口

创建XML文件
本次需要开发的“管理员登录”并不需要再做以上操作

2.2. 规划需要执行的SQL语句
需要执行的SQL语句大致是:

select * from ams_admin where username=?
1
由于在ams_admin表中有大量字段,同时,不允许使用星号表示字段列表,则以上SQL语句应该细化为:

select id, username, password, nickname, avatar, is_enable from ams_admin where username=?
1
提示:理论上,还应该查出login_count,当登录成功后,还应该更新login_count、gmt_last_login等数据,此次暂不考虑。

2.3. 在接口中添加抽象方法(含创建必要的VO类)
提示:所有的查询结果,都应该使用VO类,而不要使用实体类,根据阿里的开发规范,每张数据表中都应该有id、gmt_create、gmt_modified这3个字段,而gmt_create、gmt_modified这2个字段都是用于特殊情况下排查问题的,一般情况下均不会使用,所以,如果使用实体类,必然存在多余的属性,同时,由于不使用星号作为字段列表,则一般也不会查询这2个字段的值,会导致实体类对象中永远至少存在2个属性为null。

根据以上提示,以前已经写好的getByUsername()是不规范的,应该调整已存在此方法,本次并不需要添加新的抽象方法。

mn="password" property="password" />
    <result column="nickname" property="nickname" />
    <result column="avatar" property="avatar" />
    <result column="is_enable" property="isEnable" />


2.5. 编写并执行测试
此次并不需要编写新的测试,使用原有的测试即可!

注意:由于本次是修改了原“增加管理员”就已经使用的功能,应该检查原功能是否可以正常运行。

3. 管理员登录-业务逻辑层
3.1. 创建
如果第1次处理某种类型数据的业务逻辑层访问,需要:

创建接口
创建类,实现接口,并在类上添加@Service注解
本次需要开发的“管理员登录”并不需要再做以上操作
3.2. 在接口中添加抽象方法(含创建必要的DTO类)
在设计抽象方法时,如果参数的数量超过1个,且多个参数具有相关性(是否都是客户端提交的,或是否都是控制器传递过来的等),就应该封装!

在处理登录时,需要客户端提交用户名和密码,则可以将用户名、密码封装起来:
4. 管理员登录-控制器层
4.1. 创建
如果是整个项目第1次开发控制器层,需要:

创建统一处理异常的类

添加@RestControllerAdvice
创建统一的响应结果类型及相关类型

例如:JsonResult及State
如果第1次处理某种类型数据的控制器层访问,需要:
创建控制器类

添加@RestController
添加@RequestMapping
本次需要开发的“管理员登录”并不需要再做以上操作
4.2. 添加处理请求的方法,验证请求参数的基本有效性
在AdminLoginDTO的各属性上添加验证基本有效性的注解,例如:

package cn.tedu.boot.demo.pojo.dto;

import lombok.Data;

import javax.validation.constraints.NotNull;
import java.io.Serializable;

@Data
public class AdminLoginDTO implements Serializable {
    
    @NotNull(message = "登录失败,请提交用户名!") // 新增
    private String username;
    
    @NotNull(message = "登录失败,请提交密码!") // 新增
    private String password;
    

在AdminController中添加处理请求的方法:

@RequestMapping("/login") // 暂时使用@RequestMapping,后续改成@PostMapping
public JsonResult<AdminSimpleVO> login(@Validated AdminLoginDTO adminLoginDTO) {
    AdminSimpleVO adminSimpleVO = adminService.login(adminLoginDTO);
    return JsonResult.ok(adminSimpleVO);
}
4.3. 处理异常(按需)
先在State中添加新创建的异常对应枚举:

public enum State {

    OK(200),
    ERR_USERNAME(201),
    ERR_PASSWORD(202),
    ERR_STATE(203), // 新增
    ERR_BAD_REQUEST(400),
    ERR_INSERT(500);
    
    // ===== 原有其它代码 =====
}
在GlobalExceptionHandler的handleServiceException()方法中添加更多分支,针对各异常进行判断,并响应不同结果:

@ExceptionHandler(ServiceException.class)
public JsonResult<Void> handleServiceException(ServiceException e) {
    if (e instanceof UsernameDuplicateException) {
        return JsonResult.fail(State.ERR_USERNAME, e.getMessage());
    } else if (e instanceof UserNotFoundException) {                // 从此行起,是新增的
        return JsonResult.fail(State.ERR_USERNAME, e.getMessage());
    } else if (e instanceof UserStateException) {
        return JsonResult.fail(State.ERR_STATE, e.getMessage());
    } else if (e instanceof PasswordNotMatchException) {
        return JsonResult.fail(State.ERR_PASSWORD, e.getMessage());    // 新增结束标记
    } else {
        return JsonResult.fail(State.ERR_INSERT, e.getMessage());
    }
3、开发分页功能前端至少需要传输什么参数过来,后台简化分页开发的插件叫什么?怎么用?

一、使用前端表格插件进行分页
例如用bootstrap的拓展table组件,注意设置其分页属性时设置为“client”,

即是 sidePagination:"client", //客户端分页,如果改成server就是服务端分页。

对应的table组件会直接解析你的提供的数据进行分页操作。

优点:实现简单,直接设置前端table组件的参数即可。

缺点:从其实现原理上即可看出,这个数据是用户请求一次,服务器会将该表的所有数据返回到前端,刷新界面和点击下一页的操作的时候都会重复以上操作。显示数据的速度会因为网络带宽、服务器压力等而变慢。
4、新增部门的逻辑?

4.1点击“新增部门按钮,弹出新增部门对话框,输入部门名称,点击 "保存" ,将部门信息保存到数据库。

4.2开发新增部门的接

4.3开发对应的功能

4.31接受请求参数

4.32调用service新增部门部门

4.33响应

4.35

补充基础属性

4.36

调用mapper接口执行新增操作

4.37 inster into dept valuse

5、部门删除的逻辑?

5.1接收请求参数id

5.2调用service删除部门

5.3相应

5.4调用mapper 接口执行删除操作

5.5delete from dept where id=?

5.6数据库

6、部门查询的逻辑?

6.1查看资料,条件分页查询的接口文档

6.1.接收参数page、pagesize、name、gender、begin、end2.调用service进行分页条件查询获取PageBean

6.2.1.使用PageHelper完成分页条件查询
2.封装PageBean对象,返回

6.31. select * from emp wherename like ? and gender= ? and entrydatebetween ? and ? ;
3.响应

7、员工查询的逻辑?怎么实现分页查询的?

传递参数:当前页码 page
每页展示记录数 pageSize

8、员工删除怎么实现的?

8.1.接收请求参数id

8.2.调用service删除部门


8.3.响应

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值