以新增用户为例子解释前后端整体连接方式详解(Service、Mapper、Controller、Entity)
目录
2、添加用户表单校验:(这里明显是简介版本,还有很大的优化空间)
3、点击表单里的确 定按钮通过 submitForm() 方法 来提交表单内容实现增加用户:
1、C层--控制层(Conroller层):Controller
2、M层--业务层(Model层):Service——Serviceimpl
3、M层--业务层(Model层):Mapper——Mapper.xml
4、V层--视图层(View层):在Controller里操作完返回前端去做具体的显示
2、配置好Datasource---在application-druid.yml中
3、配置Mybatis---在application.yml中
前端
1、点击新增用户按钮执行 handleAdd() 方法
<el-col :span="1.5">
<el-button
type="primary"
plain
icon="el-icon-plus"
size="mini"
@click="handleAdd"
v-hasPermi="['system:user:add']"
>新增</el-button>
</el-col>
/** 新增按钮操作 */
handleAdd() {
this.reset();
getUser().then(response => {
this.postOptions = response.posts;
this.roleOptions = response.roles;
this.open = true;
this.title = "添加用户";
this.form.password = this.initPassword;
});
},
2、添加用户表单校验:(这里明显是简介版本,还有很大的优化空间)
// 表单校验
rules: {
userName: [
{ required: true, message: "用户名称不能为空", trigger: "blur" },
{ min: 2, max: 20, message: '用户名称长度必须介于 2 和 20 之间', trigger: 'blur' }
],
nickName: [
{ required: true, message: "用户昵称不能为空", trigger: "blur" }
],
password: [
{ required: true, message: "用户密码不能为空", trigger: "blur" },
{ min: 5, max: 20, message: '用户密码长度必须介于 5 和 20 之间', trigger: 'blur' }
],
email: [
{
type: "email",
message: "请输入正确的邮箱地址",
trigger: ["blur", "change"]
}
],
phonenumber: [
{
pattern: /^1[3|4|5|6|7|8|9][0-9]\d{8}$/,
message: "请输入正确的手机号码",
trigger: "blur"
}
]
}
3、点击表单里的确 定按钮通过 submitForm() 方法 来提交表单内容实现增加用户:
这里测试的是添加用户,所以放上addUser()的js代码。
<el-button type="primary" @click="submitForm">确 定</el-button>
/** 提交按钮 */
submitForm: function() {
this.$refs["form"].validate(valid => {
if (valid) {
if (this.form.userId != undefined) {
updateUser(this.form).then(response => {
this.$modal.msgSuccess("修改成功");
this.open = false;
this.getList();
});
} else {
addUser(this.form).then(response => {
this.$modal.msgSuccess("新增成功");
this.open = false;
this.getList();
});
}
}
});
},
// 新增用户
export function addUser(data) {
return request({
url: '/system/user',
method: 'post',
data: data
})
}
后端
1、C层--控制层(Conroller层):Controller
先通过@RequestMapping("/system/user")找到对应的
com.ruoyi.web.controller.system.SysUserController.java中的 add()方法
/**
* 新增用户
*/
@PreAuthorize("@ss.hasPermi('system:user:add')") //限定操作的权限
@Log(title = "用户管理", businessType = BusinessType.INSERT) //将增加用户记入日志管理
@PostMapping //映射@RequestMapping的位置
public AjaxResult add(@Validated @RequestBody SysUser user)
{//判断账号唯一性
if (UserConstants.NOT_UNIQUE.equals(userService.checkUserNameUnique(user.getUserName())))
{
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,登录账号已存在");
}//判断手机号码唯一性
else if (StringUtils.isNotEmpty(user.getPhonenumber())
&& UserConstants.NOT_UNIQUE.equals(userService.checkPhoneUnique(user)))
{
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,手机号码已存在");
}//判断邮箱账号唯一性
else if (StringUtils.isNotEmpty(user.getEmail())
&& UserConstants.NOT_UNIQUE.equals(userService.checkEmailUnique(user)))
{
return AjaxResult.error("新增用户'" + user.getUserName() + "'失败,邮箱账号已存在");
}
user.setCreateBy(getUsername());
//使用SecurityUtils里的方法对输入的明文密码进行一层加密处理方便存入数据库
user.setPassword(SecurityUtils.encryptPassword(user.getPassword()));
//结束Controller层处理进入Service层再进入Mapper层操作完返回前端去吧
return toAjax(userService.insertUser(user));
}
解释@Validated注解:主要是对某数据进行统一校验,如果数据异常则会统一抛出异常,方便异常中心统一处理。具体的校验方式写在Bean层里。比如这里的SysUser 就是com.ruoyi.common.core.domain.entity.SysUser.java 里有具体的数据格式限制
官方文档解释:后台手册 | RuoYi
Spring注解之@validated的使用 - 山高我为峰 - 博客园
解释@RequestBody注解:主要是将前端传过来的Json数据弄成String数据处理
2、M层--业务层(Model层):Service——Serviceimpl
ISysUserService 对应 SysUserServiceImpl
/**
* 新增用户信息
*
* @param user 用户信息
* @return 结果
*/
public int insertUser(SysUser user);
/**
* 新增保存用户信息
*
* @param user 用户信息
* @return 结果
*/
@Override
@Transactional
public int insertUser(SysUser user)
{
// 新增用户信息
int rows = userMapper.insertUser(user);
// 新增用户岗位关联
insertUserPost(user);
// 新增用户与角色管理
insertUserRole(user);
return rows;
}
@Transactional 注解:主要用于事务管理Ruoyi框架学习--事务_迷人的小松子的博客-CSDN博客
3、M层--业务层(Model层):Mapper——Mapper.xml
SysUserMapper 对应 SysUserMapper.xml
/**
* 新增用户信息
*
* @param user 用户信息
* @return 结果
*/
public int insertUser(SysUser user);
mapper.xml就是直接对数据库进行操作了。
<insert id="insertUser" parameterType="SysUser" useGeneratedKeys="true" keyProperty="userId">
insert into sys_user(
<if test="userId != null and userId != 0">user_id,</if>
<if test="deptId != null and deptId != 0">dept_id,</if>
<if test="userName != null and userName != ''">user_name,</if>
<if test="nickName != null and nickName != ''">nick_name,</if>
<if test="email != null and email != ''">email,</if>
<if test="avatar != null and avatar != ''">avatar,</if>
<if test="phonenumber != null and phonenumber != ''">phonenumber,</if>
<if test="sex != null and sex != ''">sex,</if>
<if test="password != null and password != ''">password,</if>
<if test="status != null and status != ''">status,</if>
<if test="createBy != null and createBy != ''">create_by,</if>
<if test="remark != null and remark != ''">remark,</if>
create_time
)values(
<if test="userId != null and userId != ''">#{userId},</if>
<if test="deptId != null and deptId != ''">#{deptId},</if>
<if test="userName != null and userName != ''">#{userName},</if>
<if test="nickName != null and nickName != ''">#{nickName},</if>
<if test="email != null and email != ''">#{email},</if>
<if test="avatar != null and avatar != ''">#{avatar},</if>
<if test="phonenumber != null and phonenumber != ''">#{phonenumber},</if>
<if test="sex != null and sex != ''">#{sex},</if>
<if test="password != null and password != ''">#{password},</if>
<if test="status != null and status != ''">#{status},</if>
<if test="createBy != null and createBy != ''">#{createBy},</if>
<if test="remark != null and remark != ''">#{remark},</if>
sysdate()
)
</insert>
4、V层--视图层(View层):在Controller里操作完返回前端去做具体的显示
//结束Controller层处理进入Service层再进入Mapper层操作完返回前端去吧
return toAjax(userService.insertUser(user));
/**
* 响应返回结果
*
* @param rows 影响行数
* @return 操作结果
*/
protected AjaxResult toAjax(int rows)
{
return rows > 0 ? AjaxResult.success() : AjaxResult.error();
}
整合mybatis连接数据库(druid连接池方式连接)
1、添加mybatis依赖和Druid依赖
<!-- SpringBoot集成mybatis框架 -->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>${mybatis-spring-boot.version}</version>
</dependency>
<!-- 阿里数据库连接池 -->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>druid-spring-boot-starter</artifactId>
<version>${druid.version}</version>
</dependency>
2、配置好Datasource---在application-druid.yml中
# 数据源配置
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
druid:
# 主库数据源
master:
url: jdbc:mysql://127.0.0.1:3306/rouyi?useSSL=false
username: root
password: root
# 从库数据源
slave:
# 从数据源开关/默认关闭
enabled: false
url:
username:
password:
# 初始连接数
initialSize: 5
# 最小连接池数量
minIdle: 10
# 最大连接池数量
maxActive: 20
# 配置获取连接等待超时的时间
maxWait: 60000
# 配置间隔多久才进行一次检测,检测需要关闭的空闲连接,单位是毫秒
timeBetweenEvictionRunsMillis: 60000
# 配置一个连接在池中最小生存的时间,单位是毫秒
minEvictableIdleTimeMillis: 300000
# 配置一个连接在池中最大生存的时间,单位是毫秒
maxEvictableIdleTimeMillis: 900000
# 配置检测连接是否有效
validationQuery: SELECT 1 FROM DUAL
testWhileIdle: true
testOnBorrow: false
testOnReturn: false
webStatFilter:
enabled: true
statViewServlet:
enabled: true
# 设置白名单,不填则允许所有访问
allow:
url-pattern: /druid/*
# 控制台管理用户名和密码
login-username: ruoyi
login-password: 123456
filter:
stat:
enabled: true
# 慢SQL记录
log-slow-sql: true
slow-sql-millis: 1000
merge-sql: true
wall:
config:
multi-statement-allow: true
3、配置Mybatis---在application.yml中
# MyBatis配置
mybatis:
# 搜索指定包别名
typeAliasesPackage: com.ruoyi.**.domain
# 配置mapper的扫描,找到所有的mapper.xml映射文件
mapperLocations: classpath*:mapper/**/*Mapper.xml
# 加载全局的配置文件
configLocation: classpath:mybatis/mybatis-config.xml
后续就是在mapper层里写具体的sql语句代码了,也可以使用Mybatis自带的注解来加快开发速度,或者用插件直接一键生成对应简单的sql代码。
(好了,小伙,东西都搭起来了,好好干活吧!键盘敲烂,月薪过万!)
