diff --git a/pom.xml b/pom.xml index 1f535af2372e6aecb790b6f3934ea3327d3c214d..286af75a7b481f272712ae4e6ff007a679e7999b 100644 --- a/pom.xml +++ b/pom.xml @@ -56,6 +56,13 @@ spring-boot-starter-thymeleaf + + + + + + + com.aliyun @@ -146,6 +153,12 @@ druid-spring-boot-starter 1.1.23 + + + + + + diff --git a/src/main/java/com/dhu/common/GlobalExceptionHandler.java b/src/main/java/com/dhu/common/GlobalExceptionHandler.java index cfe62ede622cc774333ee3e57535ea3bbe49b1b2..3aed6bfac8c4bbfbaa80118aa0fd0646eaac2d2f 100644 --- a/src/main/java/com/dhu/common/GlobalExceptionHandler.java +++ b/src/main/java/com/dhu/common/GlobalExceptionHandler.java @@ -1,6 +1,8 @@ package com.dhu.common; import lombok.extern.slf4j.Slf4j; +//import org.apache.shiro.authz.AuthorizationException; +//import org.apache.shiro.authz.UnauthorizedException; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.ControllerAdvice; import org.springframework.web.bind.annotation.ExceptionHandler; @@ -18,7 +20,7 @@ import java.sql.SQLIntegrityConstraintViolationException; public class GlobalExceptionHandler { /** - * 异常处理方法 + * sql异常处理方法 * @return */ @ExceptionHandler(SQLIntegrityConstraintViolationException.class) @@ -33,7 +35,7 @@ public class GlobalExceptionHandler { } /** - * 异常处理方法 + * 业务异常处理方法 * @return */ @ExceptionHandler(CustomException.class) @@ -41,4 +43,21 @@ public class GlobalExceptionHandler { log.error(ex.getMessage()); return R.error(ex.getMessage()); } + + /** + * 权限异常处理方法 + */ +// @ExceptionHandler(UnauthorizedException.class) +// public R unauthorizedException(Exception ex){ +// log.error(ex.getMessage()); +// return R.error("当前用户无相应权限"); +// } +// +// @ExceptionHandler(AuthorizationException.class) +// public R authorizationException(Exception ex){ +// log.error(ex.getMessage()); +// return R.error("权限认证失败"); +// } + + } diff --git a/src/main/java/com/dhu/config/WebMvcConfig.java b/src/main/java/com/dhu/config/WebMvcConfig.java index 380fdd410dbd54ab96fdc69859f4e2dd6b0a4651..e04109ef5a81231edc59d5311b44480f4cbe0a10 100644 --- a/src/main/java/com/dhu/config/WebMvcConfig.java +++ b/src/main/java/com/dhu/config/WebMvcConfig.java @@ -62,9 +62,9 @@ public class WebMvcConfig extends WebMvcConfigurationSupport { private ApiInfo apiInfo(){ return new ApiInfoBuilder() - .title("瑞吉外卖") + .title("食为天") .version("1.0") - .description("瑞吉外卖接口文档") + .description("食为天线上点餐系统接口文档") .build(); } } diff --git a/src/main/java/com/dhu/controller/DishController.java b/src/main/java/com/dhu/controller/DishController.java index 865b1f4b9385d7b6170c041ca3dddcfb162b1bb1..a536a3851572cbf26c0971d2746fbe9695d89e43 100644 --- a/src/main/java/com/dhu/controller/DishController.java +++ b/src/main/java/com/dhu/controller/DishController.java @@ -7,6 +7,7 @@ import com.dhu.dto.DishDto; import com.dhu.entity.Category; import com.dhu.entity.Dish; import com.dhu.entity.DishFlavor; +import com.dhu.entity.Setmeal; import com.dhu.service.CategoryService; import com.dhu.service.DishFlavorService; import com.dhu.service.DishService; @@ -169,9 +170,34 @@ public class DishController { } } - @DeleteMapping("/status") - public R deleteByIds(@PathVariable Collection ids){ + /** + * 批量删除 + * @param ids + * @return + */ + @DeleteMapping + public R deleteByIds(@RequestParam List ids){ dishService.removeByIds(ids); return R.success("删除成功"); } + + /** + * 批量停售与起售 + * @param status + * @param ids + * @return + */ + @PostMapping("/status/{status}") + public R saleOrNoSale(@PathVariable("status") int status,@RequestParam List ids) { + log.info("status:{} ids:{}",status,ids); + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.in(ids!=null, Dish::getId, ids); + List dishes = dishService.list(lqw); + dishes.stream().map((item) ->{ + item.setStatus(status); + dishService.updateById(item); + return item; + }).collect(Collectors.toList()); + return R.success(status == 1 ?"起售成功":"停售成功"); + } } diff --git a/src/main/java/com/dhu/controller/EmployeeController.java b/src/main/java/com/dhu/controller/EmployeeController.java index cce605d88ab874d3a25bd78c72e23ff9cb0cf6a5..e2ddb2e8d82e6b9543142534dd7a699ab66e0a79 100644 --- a/src/main/java/com/dhu/controller/EmployeeController.java +++ b/src/main/java/com/dhu/controller/EmployeeController.java @@ -7,11 +7,19 @@ import com.dhu.entity.Employee; import com.dhu.service.EmployeeService; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; +//import org.apache.shiro.SecurityUtils; +//import org.apache.shiro.authc.AuthenticationException; +//import org.apache.shiro.authc.AuthenticationToken; +//import org.apache.shiro.authc.UsernamePasswordToken; +//import org.apache.shiro.authz.annotation.RequiresRoles; +//import org.apache.shiro.subject.Subject; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; +import javax.servlet.http.HttpSession; +import java.util.Map; @Slf4j @RestController @@ -38,7 +46,6 @@ public class EmployeeController { LambdaQueryWrapper lqw = new LambdaQueryWrapper(); lqw.eq(Employee::getUsername, employee.getUsername()); Employee emp = employeeService.getOne(lqw); - R result = new R(); //查询成功或失败 if (emp == null) { @@ -56,9 +63,32 @@ public class EmployeeController { } } +// @PostMapping("/login") +// public R login(HttpSession session, @RequestBody Map map) { +// +// //1.获取登录认证的subject对象 +// Subject subject = SecurityUtils.getSubject(); +// String password = map.get("password").toString(); +// String name = map.get("username").toString(); +// boolean rememberMe = (boolean) map.get("rememberMe"); +// //2.将账号密码封装到token中 +// AuthenticationToken token = new UsernamePasswordToken(name, password,rememberMe); +// //调用Login方法进行登录认证 +// try{ +// subject.login(token); +// session.setAttribute("user", token.getPrincipal().toString()); +// Employee employee = new Employee(); +// employee.setName(token.getPrincipal().toString()); +// return R.success(employee); +// } catch (AuthenticationException e){ +// e.printStackTrace(); +// log.info("登录失败"); +// return R.error("登录失败"); +// } +// } + /** * 员工退出方法 - * * @param request * @return */ @@ -75,19 +105,12 @@ public class EmployeeController { * @param employee * @return */ +// @RequiresRoles("admin") @PostMapping public R save(HttpServletRequest request, @RequestBody Employee employee) { log.info("新增员工,员工信息:{}", employee.toString()); //设置初始密码(md5加密) employee.setPassword(DigestUtils.md5DigestAsHex("123456".getBytes())); - //设置员工创建时间 -// employee.setCreateTime(LocalDateTime.now()); - //设置更新时间 -// employee.setUpdateTime(LocalDateTime.now()); - //设置创建人ID和更新人ID -// Long empId = (Long) request.getSession().getAttribute("employee"); -// employee.setCreateUser(empId); -// employee.setUpdateUser(empId); //保存数据到数据库 employeeService.save(employee); return R.success("添加成功"); @@ -126,13 +149,10 @@ public class EmployeeController { * @param employee * @return */ +// @RequiresRoles("admin") @PutMapping public R update(HttpServletRequest request, @RequestBody Employee employee){ log.info(employee.toString()); - //HttpSession session = request.getSession(); - //Long empId = (Long) session.getAttribute("employee"); - //employee.setUpdateUser(empId); - //employee.setUpdateTime(LocalDateTime.now()); long id = Thread.currentThread().getId(); log.info("线程id为:{}", id); employeeService.updateById(employee); diff --git a/src/main/java/com/dhu/controller/SetmealController.java b/src/main/java/com/dhu/controller/SetmealController.java index 2426726de88002bcb11779d8fcc818e7ff7505e7..0c2a28e4e01a18668d7a7acebeab5f4b3807a6f4 100644 --- a/src/main/java/com/dhu/controller/SetmealController.java +++ b/src/main/java/com/dhu/controller/SetmealController.java @@ -96,6 +96,12 @@ public class SetmealController { return R.success("套餐数据删除成功"); } + /** + * 菜品停售与起售 + * @param status + * @param ids + * @return + */ @PostMapping("/status/{status}") public R saleOrNoSale(@PathVariable("status") int status,@RequestParam List ids) { log.info("status:{} ids:{}",status,ids); diff --git a/src/main/java/com/dhu/controller/UserController.java b/src/main/java/com/dhu/controller/UserController.java index f9f91385f7aa09401ea84988f604ba1fc818d5bd..b368e2b6ce577d6ca715d26d432b3b63416a9f7a 100644 --- a/src/main/java/com/dhu/controller/UserController.java +++ b/src/main/java/com/dhu/controller/UserController.java @@ -2,6 +2,7 @@ package com.dhu.controller; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.dhu.common.R; +import com.dhu.entity.Employee; import com.dhu.entity.User; import com.dhu.service.UserService; import com.dhu.utils.ValidateCodeUtils; @@ -9,6 +10,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.util.DigestUtils; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletRequest; @@ -26,7 +28,7 @@ public class UserController { private RedisTemplate redisTemplate; /** - * 发送邮箱验证码 + * 发送手机验证码 * * @param user * @param session @@ -48,14 +50,17 @@ public class UserController { return R.success("手机验证码发送成功,请及时查看"); } return R.error("发生未知错误,验证码发送失败"); - - } + /** + * 发送邮箱校验码 + * @param user + * @return + */ @PostMapping("sendEmail") public R sendEmail(@RequestBody User user) { //获取邮箱账号 - String email = user.getPhone(); + String email = user.getEmail(); String subject = "食为天点餐系统登录验证码"; @@ -67,9 +72,6 @@ public class UserController { //发送邮箱验证码 userService.sendMsg(email, subject, context); - //将随机生成的验证码保存到session中 -// session.setAttribute(email,code); - //验证码保存到Redis中,并且设置验证码有效时间为5分钟 redisTemplate.opsForValue().set(email, code, 5, TimeUnit.MINUTES); return R.success("邮箱验证码发送成功,请及时查看"); @@ -92,30 +94,62 @@ public class UserController { //获取手机号 String phone = map.get("phone").toString(); + //将页面传输过来的密码进行MD5加密 + String password = map.get("password").toString(); + password = DigestUtils.md5DigestAsHex(password.getBytes()); + + //使用加密后的密码进行数据库查询 + LambdaQueryWrapper lqw = new LambdaQueryWrapper(); + lqw.eq(User::getPhone, phone); + User user = userService.getOne(lqw); + + //进行验证码的比对(页面提交的验证码和Session中保存的验证码比对) + if (user != null) { + //如果能够比对成功,说明登录成功 + //登陆成功,将用户Id存入Session并返回登录成功结果 + session.setAttribute("user", user.getId()); + return R.success(user); + } + return R.error("登录失败"); + } + + /** + * 邮箱登录 + * @param map + * @param session + * @return + */ + @PostMapping("/login-email") + public R login_email(@RequestBody Map map, HttpSession session) { + log.info(map.toString()); + //获取邮箱 + String email = map.get("email").toString(); + log.info("邮箱={}", email); //获取验证码 String code = map.get("code").toString(); - + log.info("验证码={}",code); //从Session中获取保存的验证码 // Object codeInSession = session.getAttribute(phone); - // 从Redis中获取缓存验证码 - Object codeInRedis = redisTemplate.opsForValue().get(phone); - + Object codeInRedis = redisTemplate.opsForValue().get(email); //进行验证码的比对(页面提交的验证码和Session中保存的验证码比对) if (codeInRedis != null && codeInRedis.equals(code)) { //如果能够比对成功,说明登录成功 - LambdaQueryWrapper queryWrapper = new LambdaQueryWrapper<>(); - queryWrapper.eq(User::getPhone, phone); - + queryWrapper.eq(User::getEmail, email); User user = userService.getOne(queryWrapper); if (user == null) { //判断当前手机号对应的用户是否为新用户,如果是新用户就自动完成注册 user = new User(); - user.setPhone(phone); + user.setEmail(email); user.setStatus(1); // 取邮箱的前五位为用户名 - user.setName(phone.substring(0, 6)); + user.setName(email.substring(0, 6)); + // 取邮箱@前的数字部分为密码 + String password = email.split("@")[0]; + user.setPassword(password); + user.setPhone("15577437713"); + log.info("user={}",user); userService.save(user); } session.setAttribute("user", user.getId()); @@ -136,10 +170,11 @@ public class UserController { return R.success("安全退出成功!"); } - @GetMapping("getByPhone") - public R getByPhone(String phone) { + @GetMapping("getById") + public R getById(HttpSession session) { + Long id =(Long) session.getAttribute("user"); LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); - lqw.eq(User::getPhone, phone); + lqw.eq(User::getId, id); User user = userService.getOne(lqw); return R.success(user); } diff --git a/src/main/java/com/dhu/entity/User.java b/src/main/java/com/dhu/entity/User.java deleted file mode 100644 index 8d973db40194d8e9acec071ede70cdc490250730..0000000000000000000000000000000000000000 --- a/src/main/java/com/dhu/entity/User.java +++ /dev/null @@ -1,43 +0,0 @@ -package com.dhu.entity; - -import lombok.Data; -import java.time.LocalDateTime; -import java.util.Date; -import java.util.List; -import java.io.Serializable; -import com.baomidou.mybatisplus.annotation.IdType; -import com.baomidou.mybatisplus.annotation.TableId; -/** - * 用户信息 - */ -@Data -public class User implements Serializable { - - private static final long serialVersionUID = 1L; - - private Long id; - - - //姓名 - private String name; - - - //手机号 - private String phone; - - - //性别 0 女 1 男 - private String sex; - - - //身份证号 - private String idNumber; - - - //头像 - private String avatar; - - - //状态 0:禁用,1:正常 - private Integer status; -} diff --git a/src/main/java/com/dhu/filter/LoginCheckFilter.java b/src/main/java/com/dhu/filter/LoginCheckFilter.java index 57c6b28e82d04dd4beb1e31cf312758188a45778..31ed675ed7e63e87329c468f1360b1aae07298b6 100644 --- a/src/main/java/com/dhu/filter/LoginCheckFilter.java +++ b/src/main/java/com/dhu/filter/LoginCheckFilter.java @@ -35,6 +35,7 @@ public class LoginCheckFilter implements Filter { "/user/sendMsg", "/user/sendEmail", "/user/login", + "/user/login-email", "/doc.html", "/webjars/**", "/swagger-resources", @@ -93,4 +94,4 @@ public class LoginCheckFilter implements Filter { } return false; } -} +} \ No newline at end of file diff --git a/src/main/java/com/dhu/mapper/UserMapper.java b/src/main/java/com/dhu/mapper/UserMapper.java index 8efd520d4c45b25d8fb911b6aad37b1cd040bb3a..8cbf1999513a13e576ffb88cb7c41bd0369af493 100644 --- a/src/main/java/com/dhu/mapper/UserMapper.java +++ b/src/main/java/com/dhu/mapper/UserMapper.java @@ -1,9 +1,29 @@ package com.dhu.mapper; -import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.dhu.entity.User; +import com.baomidou.mybatisplus.core.mapper.BaseMapper; import org.apache.ibatis.annotations.Mapper; +import org.apache.ibatis.annotations.Param; +import org.apache.ibatis.annotations.Select; + +import java.util.List; +/** +* @author 缄默 +* @description 针对表【user(用户信息)】的数据库操作Mapper +* @createDate 2022-12-04 13:20:36 +* @Entity com.dhu.entity.User +*/ @Mapper public interface UserMapper extends BaseMapper { + + //获取用户角色信息 + @Select("select name from role where id in(select rid from role_user where uid =( select id from user where name =#{principal}));") + List getUserRoleInfoMapper(@Param("principal")String principal); + + List getUserPermissionInfoMapper(@Param("roles")List roles); } + + + + diff --git a/src/main/java/com/dhu/service/UserService.java b/src/main/java/com/dhu/service/UserService.java index 6f349ad16307a68f351f49248d38a4017f6a5fa4..88d1a18d42a37393048a2a0c28b4bd9cd76b4d3b 100644 --- a/src/main/java/com/dhu/service/UserService.java +++ b/src/main/java/com/dhu/service/UserService.java @@ -1,9 +1,24 @@ package com.dhu.service; -import com.baomidou.mybatisplus.extension.service.IService; import com.dhu.entity.User; +import com.baomidou.mybatisplus.extension.service.IService; -public interface UserService extends IService { +import java.util.List; +/** +* @author 缄默 +* @description 针对表【user(用户信息)】的数据库操作Service +* @createDate 2022-12-04 13:20:36 +*/ +public interface UserService extends IService { public void sendMsg(String email, String subject, String context); + + User getUserInfoByName(String name); + + //根据用户查询角色信息 + List getUserRoleInfo(String principal); + + //根据角色查询权限 + List getUserPermissionInfo(List roles); + } diff --git a/src/main/java/com/dhu/service/impl/UserServiceImpl.java b/src/main/java/com/dhu/service/impl/UserServiceImpl.java index 42e68be2bb3fd045632d417b49a8062bd962b4c5..dc54c910e21f6f4ecc606a5d2ee6352479092970 100644 --- a/src/main/java/com/dhu/service/impl/UserServiceImpl.java +++ b/src/main/java/com/dhu/service/impl/UserServiceImpl.java @@ -1,21 +1,33 @@ package com.dhu.service.impl; +import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl; import com.dhu.entity.User; -import com.dhu.mapper.UserMapper; import com.dhu.service.UserService; +import com.dhu.mapper.UserMapper; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Value; import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.stereotype.Service; +import java.util.List; + +/** +* @author 缄默 +* @description 针对表【user(用户信息)】的数据库操作Service实现 +* @createDate 2022-12-04 13:20:36 +*/ @Service -public class UserServiceImpl extends ServiceImpl implements UserService { +public class UserServiceImpl extends ServiceImpl + implements UserService{ @Value("${spring.mail.username}") private String from; //邮件发送人 @Autowired private JavaMailSender mailSender; + + @Autowired + private UserMapper userMapper; @Override public void sendMsg(String to, String subject, String context) { SimpleMailMessage mailMessage = new SimpleMailMessage(); @@ -27,4 +39,27 @@ public class UserServiceImpl extends ServiceImpl implements Us mailSender.send(mailMessage); } + + @Override + public User getUserInfoByName(String name) { + LambdaQueryWrapper lqw = new LambdaQueryWrapper<>(); + lqw.eq(User::getName, name); + User user = userMapper.selectOne(lqw); + return user; + } + + @Override + public List getUserRoleInfo(String principal) { + return userMapper.getUserRoleInfoMapper(principal); + } + + //获取角色权限信息 + @Override + public List getUserPermissionInfo(List roles) { + return userMapper.getUserPermissionInfoMapper(roles); + } } + + + + diff --git a/src/main/resources/application.yml b/src/main/resources/application.yml index 3ec05fce210674260864e287f109cc46e4dd93f3..4e95204d2a11949f7c6dcdf366a29398c06c2222 100644 --- a/src/main/resources/application.yml +++ b/src/main/resources/application.yml @@ -11,6 +11,16 @@ spring: username: 3183761076@qq.com password: ypkoxfpwysdndebi default-encoding: utf-8 + smtp: + auth: true + ssl: + trust: smtp.qq.com + socketFactory: + class: 'javax.net.ssl.SSLSocketFactory' + port: 465 + starttls: + enable: true + required: true redis: password: a20011028 host: 101.133.226.33 @@ -40,4 +50,6 @@ mybatis-plus: db-config: id-type: ASSIGN_ID reggie: - path: /usr/local/img/ \ No newline at end of file + path: /usr/local/img/ +#shiro: +# loginUrl: /myController/login \ No newline at end of file diff --git a/src/main/resources/backend/images/login/logo.png b/src/main/resources/backend/images/login/logo.png index 86f104c9b1ba385473fb9bd8873a0af8c38c9604..6bd9fb8a652554e94903e0187bd3b5dda83c8e34 100644 Binary files a/src/main/resources/backend/images/login/logo.png and b/src/main/resources/backend/images/login/logo.png differ diff --git a/src/main/resources/backend/images/logo.png b/src/main/resources/backend/images/logo.png deleted file mode 100644 index de4e309ef3addabad86785a3abecd7187b84cb47..0000000000000000000000000000000000000000 Binary files a/src/main/resources/backend/images/logo.png and /dev/null differ diff --git a/src/main/resources/backend/index.html b/src/main/resources/backend/index.html index f128773506a17cdd30d86a6a444593eede363497..96dd56a78f1dd9a662c7c22737e94b24a668f599 100644 --- a/src/main/resources/backend/index.html +++ b/src/main/resources/backend/index.html @@ -4,7 +4,7 @@ - 瑞吉外卖管理端 + 食为天管理端 @@ -34,7 +34,8 @@