将项目运行起来,点击左侧系统工具——》代码生成——》导入选择用户表导入即可
点击预览,将domain的代码复制到IDEA中,单机domain包直接ctrl+V就行
导入依赖,在pom文件中导入rome-common
service,controller,mapper照理
xml文件在main包中与java包同级建一个resources包放对应的xml文件
运行之后
搜索条件这一块只留账号、姓名、电话号码搜,将其余条件代码删除,新增或修改对话框不要注册
1.新增功能
1.1前端数据规范
账号为字母或数字或符号任其组合,不为空且唯一,长度不超过30
密码为字母或数字或符号任其组合,不为空,长度不超过30
年龄不能是负的且为整型,年龄不超过300
电话号码规范以"1"开始,第二位是3、4、5、7或8,然后是9个数字(总计11位数字)的字符串
邮箱规范长度不超过30
余额为整型
昵称,头像,姓名,性别,职业任意且合法
先做前端的校验
账号和密码不能出现汉字和空格这是条件,两个可以一起做
年龄不能是负的且为整型
rules中加入
电话号码和邮箱规范
rules中加入
在data中 定义规则
金额规则
1.2新增中的性别调整
将性别改为单选框可选男女的那种,在页面中修改如下代码
然后在后台管理系统中打开系统管理>字典管理->新增
添加一个名为gender的字典名称
找到刚才添加的字典单机它
再点击新增,添加两个标签分别为男女
前端页面引入刷新即可看到效果
1.3新增中的头像调整
点击上传选择图片,回显图片
先改前端样式
引入token
定义文件上传参数
url为服务器地址
接着 后端实现
创建utilsFileLoad工具类
package com.rome.hotel.data.utils;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.UUID;
public class FileLoad {
public static String imgName = null;
public static String fileUp(MultipartFile file,String dirName){
//参数名和前端input名一样
//file是一个临时文件,需要转存到指定位置,否则本次请求完成后临时文件会删除
//获取当前项目路径进行拼接
String url = System.getProperty("user.dir")+"\\rome-ui\\src\\assets\\"+dirName+"\\";
//使用uuid重新生成文件名防止文件名重复造成覆盖,uuid+原始文件名
String uuid = UUID.randomUUID().toString();
// uuid+原始文件名
String fileName = uuid.concat(file.getOriginalFilename());
// 将文件转存
try {
file.transferTo(new File(url+fileName));
} catch (IOException e) {
throw new RuntimeException(e);
}
imgName = fileName;
// 返回文件名存在数据库
return imgName;
}
}
只需要传入文件和要保存的目录即可
在创建一个公共的Controller用来接收前端传进来的文件
package com.rome.hotel.data.controller;
import com.rome.hotel.common.core.domain.AjaxResult;
import com.rome.hotel.data.utils.FileLoad;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;
@RestController
@RequestMapping("/file")
public class CommonFileUpOrDown {
/**
* 头像上传
* @param file
* @return
*/
@PostMapping("/avatar/upload")
public AjaxResult upload(MultipartFile file){
String dir = "avatar";
return AjaxResult.success(FileLoad.fileUp(file,dir));
}
}
将头像的地址存储到实体类中
1.4 完善会员的新增功能
在utils包中创建RegexUtils类用来书写正则表达式
package com.rome.hotel.data.utils; import java.util.regex.Matcher; import java.util.regex.Pattern; /** * 验证规则 */ public class RegexUtils { public static void main(String[] args) { } /** * 账号和密码为字母或数字或符号任其组合 */ public static boolean testUsernameOrPassword(String username){ Pattern pattern = Pattern.compile("^[a-zA-Z0-9!@#$%^&*()_+\\-=\\[\\]{};':\"\\\\|,.<>\\/?]{1,30}$"); Matcher matcher = pattern.matcher(username); boolean matches = matcher.matches(); return matches; } /** * 年龄大于0小于300且为整数 */ public static boolean testAge(String age){ Pattern pattern = Pattern.compile("^(?:\\d{1,3}(?:\\,\\d{3})*|[1-9]\\d{0,2})$"); Matcher matcher = pattern.matcher(age); boolean matches = matcher.matches(); return matches; } /** * 手机号以"1"开始,第二位是3、4、5、7或8,然后是9个数字(总计11位数字)的字符串 */ public static boolean testPhoneNumber(String phoneNumber){ Pattern pattern = Pattern.compile("^1[34578][0-9]{9}$"); Matcher matcher = pattern.matcher(phoneNumber); boolean matches = matcher.matches(); return matches; } /** * 验证邮箱,邮箱长度不能超过30位 */ public static boolean testEmail(String email){ Pattern pattern = Pattern.compile("^([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+@([a-zA-Z0-9]+[_|\\_|\\.]?)*[a-zA-Z0-9]+\\.[a-zA-Z]{2,3}$"); Matcher matcher = pattern.matcher(email); boolean matches = matcher.matches(); return matches; }
/**
* 验证金额
*/
public static boolean testBalance(String balance){
Pattern pattern = Pattern.compile("^[0-9]+(\\.[0-9]+)*$");
Matcher matcher = pattern.matcher(balance);
boolean matches = matcher.matches();
return matches;
}
}
新增一个查询方法根据账号实现他
在mapper中添加这个方法
xml中书写sql语句
接着写新增方法
/**
* 新增酒店会员
*
* @param hotelUser 酒店会员
* @return 结果
*/
@Override
public int insertHotelUser(HotelUser hotelUser)
{
// 防御性编程
Assert.notNull(hotelUser,"参数异常");
Assert.notNull(hotelUser.getUsername(),"账号不能为空");
Assert.notNull(hotelUser.getPassword(),"密码不能为空");
Assert.notNull(hotelUser.getNickname(),"昵称不能为空");
Assert.state(RegexUtils.testUsernameOrPassword(hotelUser.getUsername()),"账号长度不能超过30");
Assert.state(RegexUtils.testUsernameOrPassword(hotelUser.getPassword()),"密码长度不能超过30");
// 判断是否传入年龄参数
if(hotelUser.getAge()!=null){
Assert.state(RegexUtils.testAge(hotelUser.getAge().toString()),"年龄大于0小于300且为数字");
}
// 判断是否传入手机号参数
if(hotelUser.getPhoneNumber()!=null){
Assert.state(RegexUtils.testPhoneNumber(hotelUser.getPhoneNumber()),"请输入规范的手机号");
}
// 判断是否传入邮箱参数
if(hotelUser.getEmail()!=null){
Assert.state(hotelUser.getEmail().length()<30,"邮箱长度不能超过30");
Assert.state(RegexUtils.testEmail(hotelUser.getEmail()),"请输入规范的邮箱");
}
// 判断是否传入金额参数
if(hotelUser.getBalance()!=null){
Assert.state(RegexUtils.testBalance(hotelUser.getBalance().toString()),"请输入规范的金额");
}
// 根据账号来查询数据库中是否已存在此账号
HotelUser queryUsername = hotelUserMapper.selectHotelUserByUsername(hotelUser.getUsername());
Assert.state(queryUsername==null,"账号已存在");
// 将头像地址存储实体类中
hotelUser.setAvatar(FileLoad.imgName);
// 将地址清空
FileLoad.imgName=null;
return hotelUserMapper.insertHotelUser(hotelUser);
}
新增暂时写完了