基于JavaEE的通用超市结算系统的设计与实现

本文涉及的产品
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
云数据库 Tair(兼容Redis),内存型 2GB
对象存储 OSS,20GB 3个月
简介: 基于JavaEE的通用超市结算系统的设计与实现

一,环境介绍

语言环境:Java:  jdk1.8

数据库:Mysql: mysql5.7

应用服务器:Tomcat:  tomcat8.5.31

开发工具:IDEA或eclipse

开发技术:Springboot+Vue

二,项目简介

【项目简介】

在这个互联网发展迅速的时代,生活中我们离不开的除了手机就是超市了,不只是大型连锁超市这种适合全家出动的商超,更是说小区转角马路对面,总会出现的小型超市,经济不断发展的同时,我们的消费能力也在不断地提升,越来越多的超市出现在了我们的日常生活中,给我们提供了更多的可选性,然而对于超市本身来说,他们需要对商品、数据等进行管理来提升自身在行业中的竞争力,但是对于经营成本的提升甚至是流量红利的消退以及现在很多门店市场定位的雷同,如何对现状进行一些缓解呢,能看的出来大部分的小超市都非常需要一套能够满足商品管理对数据进行维护的收银系统。21 世纪我国的超市产业飞速发展,其经营模式更为复杂,旧的管理体制已经无法适应超市的发展,这就迫切的需要引进新的管理技术。此系统的实现节省了大量的人力、物力,改善了员工的并且能够快速反映出商品的进、销、存等状況和各种反馈信息分析,使管理人员快速对市场的变化做出相应的决策,加快超市经营管理效率。

【技术架构】

基于JavaEE的通用超市结算系统使用IntelliJ IDEA 2019.2.3作为后端开发工具及Visual Studio Code为前端开发工具;以Vue作为开发技术,vue是单页面应用,使页面局部刷新,不用每次跳转页面都要请求所有数据和DOM,这样大大加快了访问速度和提升用户体验。MySQL数据库作为系统数据库,其使用的SQL语言是用于访问数据库的最常用的标准化语言,支持多种操作系统,提供用于管理、检查、优化数据库操作的管理工具;系统采用Java作为开发语言,服务端架构采用Springboot技术,Springboot能够快速构建项目,并且可独立运行,无须外部依赖Servlet容器,极大的提高了开发、部署效率。通过这些技术构建系统,可以很好得对系统的功能进行完善及系统后期的维护。

【功能模块】

1.系统登录模块:在软件首页可以选择以管理员或收银员两种身份登录,在选定对应身份后即可输入账号密码进入系统。

管理员身份登录:

2.商品管理模块:可查询进货情况,添加进货需求,对超市库存,商品种类及商品数量等进行增删改查,并可对商品进行价格更改。

3.会员管理模块:可对超市会员名单进行查询,并增删超市会员名单,会员可对会员卡进行充值,会员可享受超市消费的折扣福利。

4.员工管理模块:可对超市收银员进行信息修改,增删员工名单。并记录员工登录退出系统的准确时间,避免员工迟到早退。

5.营业额查询模块:可对近期超市营业情况进行查询,随时掌握超市商品销售情况,并以此判断进货方向。查询统计的基础上添加图形报表进行商品销售统计展示。

收银员身份登录:

6.收银模块:当顾客选择手机支付时,扫描二维码付款(支付宝沙箱),当顾客使用会员卡支付时,可刷卡或于收银台内输入会员卡卡号及会员留存手机号,收银员直接对会员卡内余额进行扣款。

三,系统展示

用户管理

部门管理

文件管理

角色权限管理

商品管理

供应商管理

四,核心代码展示

package cn.zwz.data.controller;
import cn.zwz.basics.baseVo.Result;
import cn.zwz.basics.parameter.SettingConstant;
import cn.zwz.basics.utils.ResultUtil;
import cn.zwz.data.entity.Setting;
import cn.zwz.data.service.ISettingService;
import cn.zwz.data.vo.*;
import cn.hutool.core.util.StrUtil;
import com.google.gson.Gson;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;
/**
 * 设置
 * @author znz
 */
@RestController
@Api(tags = "设置接口")
@RequestMapping("/zwz/setting")
public class SettingController {
    @Autowired
    private ISettingService iSettingService;
    @RequestMapping(value = "/seeSecret/{settingName}", method = RequestMethod.GET)
    @ApiOperation(value = "查看私密配置")
    public Result<Object> seeSecret(@PathVariable String settingName) {
        String result = "";
        Setting setting = iSettingService.getById(settingName);
        if(setting==null||StrUtil.isBlank(setting.getValue())){
            return ResultUtil.error("配置不存在");
        }
        if(settingName.equals(SettingConstant.ALI_SMS)){
            result = new Gson().fromJson(setting.getValue(), SmsSetting.class).getSecretKey();
        } else if(settingName.equals(SettingConstant.VAPTCHA_SETTING)){
            result = new Gson().fromJson(setting.getValue(), VaptchaSetting.class).getSecretKey();
        }
        return ResultUtil.data(result);
    }
    @RequestMapping(value = "/oss/check", method = RequestMethod.GET)
    @ApiOperation(value = "检查OSS配置")
    public Result<Object> osscheck() {
        Setting setting = iSettingService.getById(SettingConstant.OSS_USED);
        if(setting==null||StrUtil.isBlank(setting.getValue())){
            return ResultUtil.error(501, "您还未配置第三方OSS服务");
        }
        return ResultUtil.data(setting.getValue());
    }
    @RequestMapping(value = "/oss/{serviceName}", method = RequestMethod.GET)
    @ApiOperation(value = "查看OSS配置")
    public Result<OssSetting> oss(@PathVariable String serviceName) {
        Setting setting = new Setting();
        if(serviceName.equals(SettingConstant.QINIU_OSS)||serviceName.equals(SettingConstant.ALI_OSS)
                ||serviceName.equals(SettingConstant.TENCENT_OSS)||serviceName.equals(SettingConstant.MINIO_OSS)
                ||serviceName.equals(SettingConstant.LOCAL_OSS)){
            setting = iSettingService.getById(serviceName);
        }
        if(setting==null||StrUtil.isBlank(setting.getValue())){
            return new ResultUtil<OssSetting>().setData(null);
        }
        OssSetting ossSetting = new Gson().fromJson(setting.getValue(), OssSetting.class);
        return new ResultUtil<OssSetting>().setData(ossSetting);
    }
    @RequestMapping(value = "/sms/{serviceName}", method = RequestMethod.GET)
    @ApiOperation(value = "查看短信配置")
    public Result<SmsSetting> sms(@PathVariable String serviceName) {
        Setting setting = new Setting();
        if(serviceName.equals(SettingConstant.ALI_SMS)){
            setting = iSettingService.getById(SettingConstant.ALI_SMS);
        }
        if(setting==null||StrUtil.isBlank(setting.getValue())){
            return new ResultUtil<SmsSetting>().setData(null);
        }
        SmsSetting smsSetting = new Gson().fromJson(setting.getValue(), SmsSetting.class);
        smsSetting.setSecretKey("**********");
        if(smsSetting.getType()!=null){
            Setting code = new Setting();
            smsSetting.setTemplateCode(code.getValue());
        }
        return new ResultUtil<SmsSetting>().setData(smsSetting);
    }
    @RequestMapping(value = "/sms/templateCode/{type}", method = RequestMethod.GET)
    @ApiOperation(value = "查看短信模板配置")
    public Result<String> smsTemplateCode(@PathVariable Integer type) {
        String templateCode = "";
        if(type!=null){
            String template = "CommonUtil.getSmsTemplate(type)";
            Setting setting = iSettingService.getById(template);
            if(StrUtil.isNotBlank(setting.getValue())){
                templateCode = setting.getValue();
            }
        }
        return new ResultUtil<String>().setData(templateCode);
    }
    @RequestMapping(value = "/vaptcha", method = RequestMethod.GET)
    @ApiOperation(value = "查看vaptcha配置")
    public Result<VaptchaSetting> vaptcha() {
        Setting setting = iSettingService.getById(SettingConstant.VAPTCHA_SETTING);
        if(setting==null||StrUtil.isBlank(setting.getValue())){
            return new ResultUtil<VaptchaSetting>().setData(null);
        }
        VaptchaSetting vaptchaSetting = new Gson().fromJson(setting.getValue(), VaptchaSetting.class);
        vaptchaSetting.setSecretKey("**********");
        return new ResultUtil<VaptchaSetting>().setData(vaptchaSetting);
    }
    @RequestMapping(value = "/other", method = RequestMethod.GET)
    @ApiOperation(value = "查看其他配置")
    public Result<HttpIpSsoSetting> other() {
        Setting setting = iSettingService.getById(SettingConstant.OTHER_SETTING);
        if(setting==null||StrUtil.isBlank(setting.getValue())){
            return new ResultUtil<HttpIpSsoSetting>().setData(null);
        }
        HttpIpSsoSetting otherSetting = new Gson().fromJson(setting.getValue(), HttpIpSsoSetting.class);
        return new ResultUtil<HttpIpSsoSetting>().setData(otherSetting);
    }
    @RequestMapping(value = "/notice", method = RequestMethod.GET)
    @ApiOperation(value = "查看公告配置")
    public Result<NoticeSetting> notice() {
        Setting setting = iSettingService.getById(SettingConstant.NOTICE_SETTING);
        if(setting==null||StrUtil.isBlank(setting.getValue())){
            return new ResultUtil<NoticeSetting>().setData(null);
        }
        NoticeSetting noticeSetting = new Gson().fromJson(setting.getValue(), NoticeSetting.class);
        return new ResultUtil<NoticeSetting>().setData(noticeSetting);
    }
    @RequestMapping(value = "/oss/set", method = RequestMethod.POST)
    @ApiOperation(value = "OSS配置")
    public Result<Object> ossSet(OssSetting ossSetting) {
        String name = ossSetting.getServiceName();
        Setting setting = iSettingService.getById(name);
        setting.setValue(new Gson().toJson(ossSetting));
        iSettingService.saveOrUpdate(setting);
        Setting used = iSettingService.getById(SettingConstant.OSS_USED);
        used.setValue(name);
        iSettingService.saveOrUpdate(used);
        return ResultUtil.data(null);
    }
    @RequestMapping(value = "/sms/set", method = RequestMethod.POST)
    @ApiOperation(value = "短信配置")
    public Result<Object> smsSet(SmsSetting smsSetting) {
        if(smsSetting.getServiceName().equals(SettingConstant.ALI_SMS)){
            // 阿里
            Setting setting = iSettingService.getById(SettingConstant.ALI_SMS);
            if(StrUtil.isNotBlank(setting.getValue())&&!smsSetting.getChanged()){
                String secrectKey = new Gson().fromJson(setting.getValue(), SmsSetting.class).getSecretKey();
                smsSetting.setSecretKey(secrectKey);
            }
            if(smsSetting.getType()!=null){
                Setting codeSetting = new Setting();
                codeSetting.setValue(smsSetting.getTemplateCode());
                iSettingService.saveOrUpdate(codeSetting);
            }
            smsSetting.setType(null);
            smsSetting.setTemplateCode(null);
            setting.setValue(new Gson().toJson(smsSetting));
            iSettingService.saveOrUpdate(setting);
            Setting used = iSettingService.getById(SettingConstant.SMS_USED);
            used.setValue(SettingConstant.ALI_SMS);
            iSettingService.saveOrUpdate(used);
        }
        return ResultUtil.data();
    }
    @RequestMapping(value = "/vaptcha/set", method = RequestMethod.POST)
    @ApiOperation(value = "vaptcha配置")
    public Result<Object> vaptchaSet(VaptchaSetting vaptchaSetting) {
        Setting setting = iSettingService.getById(SettingConstant.VAPTCHA_SETTING);
        if(StrUtil.isNotBlank(setting.getValue())&&!vaptchaSetting.getChanged()){
            String key = new Gson().fromJson(setting.getValue(), VaptchaSetting.class).getSecretKey();
            vaptchaSetting.setSecretKey(key);
        }
        setting.setValue(new Gson().toJson(vaptchaSetting));
        iSettingService.saveOrUpdate(setting);
        return ResultUtil.data();
    }
    @RequestMapping(value = "/other/set", method = RequestMethod.POST)
    @ApiOperation(value = "其他配置")
    public Result<Object> otherSet(HttpIpSsoSetting otherSetting) {
        Setting setting = iSettingService.getById(SettingConstant.OTHER_SETTING);
        setting.setValue(new Gson().toJson(otherSetting));
        iSettingService.saveOrUpdate(setting);
        return ResultUtil.data();
    }
    @RequestMapping(value = "/notice/set", method = RequestMethod.POST)
    @ApiOperation(value = "其他配置")
    public Result<Object> noticeSet(NoticeSetting noticeSetting) {
        Setting setting = iSettingService.getById(SettingConstant.NOTICE_SETTING);
        setting.setValue(new Gson().toJson(noticeSetting));
        iSettingService.saveOrUpdate(setting);
        return ResultUtil.data();
    }
}
package cn.zwz.data.controller;
import cn.zwz.basics.log.SystemLog;
import cn.zwz.basics.redis.RedisTemplateHelper;
import cn.zwz.basics.utils.*;
import cn.zwz.basics.security.SecurityUserDetails;
import cn.zwz.basics.parameter.CommonConstant;
import cn.zwz.basics.log.LogType;
import cn.zwz.basics.exception.ZwzException;
import cn.zwz.basics.baseVo.PageVo;
import cn.zwz.basics.baseVo.Result;
import cn.zwz.data.entity.*;
import cn.zwz.data.service.*;
import cn.zwz.data.utils.ZwzNullUtils;
import cn.zwz.data.vo.PermissionDTO;
import cn.zwz.data.vo.RoleDTO;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.metadata.IPage;
import io.swagger.annotations.Api;
import io.swagger.annotations.ApiOperation;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheConfig;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.data.redis.core.StringRedisTemplate;
import org.springframework.security.authentication.UsernamePasswordAuthenticationToken;
import org.springframework.security.core.context.SecurityContextHolder;
import org.springframework.security.crypto.bcrypt.BCryptPasswordEncoder;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.validation.Valid;
import java.io.UnsupportedEncodingException;
import java.net.URLDecoder;
import java.util.*;
import java.util.stream.Collectors;
/**
 * 用户
 * @author znz
 */
@RestController
@Api(tags = "用户接口")
@RequestMapping("/zwz/user")
@CacheConfig(cacheNames = "user")
@Transactional
public class UserController {
    @Autowired
    private IUserService iUserService;
    @Autowired
    private IDepartmentService iDepartmentService;
    @Autowired
    private IRoleService iRoleService;
    @Autowired
    private IUserRoleService iUserRoleService;
    @Autowired
    private IDepartmentHeaderService iDepartmentHeaderService;
    @Autowired
    private IRolePermissionService iRolePermissionService;
    @Autowired
    private RedisTemplateHelper redisTemplateHelper;
    @Autowired
    private IPermissionService iPermissionService;
    @PersistenceContext
    private EntityManager entityManager;
    @Autowired
    private SecurityUtil securityUtil;
    @Autowired
    private StringRedisTemplate redisTemplate;
    @RequestMapping(value = "/info", method = RequestMethod.GET)
    @ApiOperation(value = "获取当前登录用户接口")
    public Result<User> getUserInfo(){
        User u = securityUtil.getCurrUser();
        entityManager.clear();
        u.setPassword(null);
        return new ResultUtil<User>().setData(u);
    }
    @RequestMapping(value = "/resetByMobile", method = RequestMethod.POST)
    @ApiOperation(value = "短信重置密码")
    public Result<Object> resetByMobile(@RequestParam String mobile, @RequestParam String password, @RequestParam String passStrength){
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("mobile",mobile);
        User user = iUserService.getOne(userQw);
        String encryptPass = new BCryptPasswordEncoder().encode(password);
        user.setPassword(encryptPass).setPassStrength(passStrength);
        iUserService.saveOrUpdate(user);
        redisTemplate.delete("user::"+user.getUsername());
        return ResultUtil.success();
    }
    @RequestMapping(value = "/regist", method = RequestMethod.POST)
    @ApiOperation(value = "注册用户")
    public Result<Object> regist(@Valid User u){
        u.setEmail(u.getMobile() + "@qq.com");
        checkUserInfo(u.getUsername(), u.getMobile(), u.getEmail());
        String encryptPass = new BCryptPasswordEncoder().encode(u.getPassword());
        u.setPassword(encryptPass).setType(0);
        iUserService.saveOrUpdate(u);
        QueryWrapper<Role> roleQw = new QueryWrapper<>();
        roleQw.eq("default_role",true);
        List<Role> roleList = iRoleService.list(roleQw);
        if(roleList.size() > 0){
            for(Role role : roleList) {
                iUserRoleService.saveOrUpdate(new UserRole().setUserId(u.getId()).setRoleId(role.getId()));
            }
        }
        return ResultUtil.data(u);
    }
    @RequestMapping(value = "/smsLogin", method = RequestMethod.POST)
    @SystemLog(about = "短信登录", type = LogType.USER_LOGIN)
    @ApiOperation(value = "短信登录接口")
    public Result<Object> smsLogin(@RequestParam String mobile, @RequestParam(required = false) Boolean saveLogin){
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("mobile",mobile);
        User user = iUserService.getOne(userQw);
        if(user==null){
            throw new ZwzException("手机号不存在");
        }
        String accessToken = securityUtil.getToken(user.getUsername(), saveLogin);
        UsernamePasswordAuthenticationToken authentication = new UsernamePasswordAuthenticationToken(new SecurityUserDetails(user), null, null);
        SecurityContextHolder.getContext().setAuthentication(authentication);
        return ResultUtil.data(accessToken);
    }
    @RequestMapping(value = "/changeMobile", method = RequestMethod.POST)
    @ApiOperation(value = "修改绑定手机")
    public Result<Object> changeMobile(@RequestParam String mobile){
        User u = securityUtil.getCurrUser();
        u.setMobile(mobile);
        iUserService.saveOrUpdate(u);
        redisTemplate.delete("user::"+u.getUsername());
        return ResultUtil.success();
    }
    @RequestMapping(value = "/unlock", method = RequestMethod.POST)
    @ApiOperation(value = "解锁验证密码")
    public Result<Object> unLock(@RequestParam String password){
        User u = securityUtil.getCurrUser();
        if(!new BCryptPasswordEncoder().matches(password, u.getPassword())){
            return ResultUtil.error("密码不正确");
        }
        return ResultUtil.data(null);
    }
    @RequestMapping(value = "/resetPass", method = RequestMethod.POST)
    @ApiOperation(value = "重置密码")
    public Result<Object> resetPass(@RequestParam String[] ids){
        for(String id:ids){
            User u = iUserService.getById(id);
            u.setPassword(new BCryptPasswordEncoder().encode("123456"));
            iUserService.saveOrUpdate(u);
            redisTemplate.delete("user::"+u.getUsername());
        }
        return ResultUtil.success();
    }
    @RequestMapping(value = "/edit", method = RequestMethod.POST)
    @ApiOperation(value = "修改用户自己资料",notes = "用户名密码不会修改 需要username更新缓存")
    @CacheEvict(key = "#u.username")
    public Result<Object> editOwn(User u){
        User old = securityUtil.getCurrUser();
        u.setUsername(old.getUsername());
        u.setPassword(old.getPassword());
        iUserService.saveOrUpdate(u);
        return ResultUtil.success("修改成功");
    }
    @RequestMapping(value = "/modifyPass", method = RequestMethod.POST)
    @ApiOperation(value = "修改密码")
    public Result<Object> modifyPass(@RequestParam String password,@RequestParam String newPass,@RequestParam String passStrength){
        User user = securityUtil.getCurrUser();
        if(!new BCryptPasswordEncoder().matches(password, user.getPassword())){
            return ResultUtil.error("原密码不正确");
        }
        String newEncryptPass= new BCryptPasswordEncoder().encode(newPass);
        user.setPassword(newEncryptPass);
        user.setPassStrength(passStrength);
        iUserService.saveOrUpdate(user);
        redisTemplate.delete("user::"+user.getUsername());
        return ResultUtil.success();
    }
    @RequestMapping(value = "/getByCondition", method = RequestMethod.GET)
    @ApiOperation(value = "查询用户")
    public Result<IPage<User>> getByCondition(@ModelAttribute User user, @ModelAttribute PageVo page) {
        QueryWrapper<User> userQw = new QueryWrapper<>();
        if(!ZwzNullUtils.isNull(user.getUsername())) {
            userQw.like("username",user.getUsername());
        }
        if(!ZwzNullUtils.isNull(user.getNickname())) {
            userQw.like("nickname",user.getNickname());
        }
        if(!ZwzNullUtils.isNull(user.getMobile())) {
            userQw.like("mobile",user.getMobile());
        }
        if(!ZwzNullUtils.isNull(user.getDepartmentId())) {
            userQw.eq("department_id",user.getDepartmentId());
        }
        if(user.getType() != null) {
            userQw.eq("type",user.getType());
        }
        if(user.getStatus() != null) {
            userQw.eq("status",user.getStatus());
        }
        if(!ZwzNullUtils.isNull(user.getSex())) {
            userQw.eq("sex",user.getSex());
        }
        IPage<User> userData = iUserService.page(PageUtil.initMpPage(page),userQw);
        for(User u: userData.getRecords()) {
            List<Role> list = iUserRoleService.findByUserId(u.getId());
            List<RoleDTO> roleDTOList = list.stream().map(e->{
                return new RoleDTO().setId(e.getId()).setName(e.getName()).setDescription(e.getDescription());
            }).collect(Collectors.toList());
            u.setRoles(roleDTOList);
            entityManager.detach(u);
            u.setPassword(null);
        }
        return new ResultUtil<IPage<User>>().setData(userData);
    }
    @RequestMapping(value = "/getByDepartmentId/{departmentId}", method = RequestMethod.GET)
    @ApiOperation(value = "根据部门查询用户")
    public Result<List<User>> getByCondition(@PathVariable String departmentId){
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("department_id", departmentId);
        List<User> list = iUserService.list(userQw);
        entityManager.clear();
        list.forEach(u -> {
            u.setPassword(null);
        });
        return new ResultUtil<List<User>>().setData(list);
    }
    @RequestMapping(value = "/searchByName/{username}", method = RequestMethod.GET)
    @ApiOperation(value = "模拟搜索用户姓名")
    public Result<List<User>> searchByName(@PathVariable String username) throws UnsupportedEncodingException {
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("username", URLDecoder.decode(username, "utf-8"));
        userQw.eq("status", 0);
        List<User> list = iUserService.list(userQw);
        entityManager.clear();
        list.forEach(u -> {
            u.setPassword(null);
        });
        return new ResultUtil<List<User>>().setData(list);
    }
    @RequestMapping(value = "/getAll", method = RequestMethod.GET)
    @ApiOperation(value = "获取全部用户数据")
    public Result<List<User>> getByCondition(){
        List<User> userList = iUserService.list();
        for(User user: userList){
            entityManager.clear();
            user.setPassword(null);
        }
        return new ResultUtil<List<User>>().setData(userList);
    }
    @RequestMapping(value = "/admin/edit", method = RequestMethod.POST)
    @ApiOperation(value = "管理员修改资料")
    @CacheEvict(key = "#u.username")
    public Result<Object> edit(User u,@RequestParam(required = false) String[] roleIds){
        User old = iUserService.getById(u.getId());
        u.setUsername(old.getUsername());
        if(!old.getMobile().equals(u.getMobile()) && findByMobile(u.getMobile())!=null){
            return ResultUtil.error("手机号重复");
        }
        if(!old.getEmail().equals(u.getEmail()) && findByEmail(u.getEmail())!=null){
            return ResultUtil.error("邮箱重复");
        }
        if(StrUtil.isNotBlank(u.getDepartmentId())){
            Department d = iDepartmentService.getById(u.getDepartmentId());
            if(d != null) {
                u.setDepartmentTitle(d.getTitle());
            }
        }else{
            u.setDepartmentId(null);
            u.setDepartmentTitle("");
        }
        u.setPassword(old.getPassword());
        iUserService.saveOrUpdate(u);
        QueryWrapper<UserRole> urQw = new QueryWrapper<>();
        urQw.eq("user_id",u.getId());
        iUserRoleService.remove(urQw);
        if(roleIds != null){
            List<UserRole> userRoles = Arrays.asList(roleIds).stream().map(e -> {
                return new UserRole().setRoleId(e).setUserId(u.getId());
            }).collect(Collectors.toList());
            iUserRoleService.saveOrUpdateBatch(userRoles);
        }
        redisTemplate.delete("userRole::"+u.getId());
        redisTemplate.delete("userRole::depIds:"+u.getId());
        redisTemplate.delete("permission::userMenuList:"+u.getId());
        return ResultUtil.success();
    }
    @RequestMapping(value = "/admin/add", method = RequestMethod.POST)
    @ApiOperation(value = "添加用户")
    public Result<Object> add(@Valid User u,@RequestParam(required = false) String[] roleIds) {
        checkUserInfo(u.getUsername(), u.getMobile(), u.getEmail());
        String encryptPass = new BCryptPasswordEncoder().encode(u.getPassword());
        u.setPassword(encryptPass);
        if(StrUtil.isNotBlank(u.getDepartmentId())){
            Department d = iDepartmentService.getById(u.getDepartmentId());
            if(d!=null){
                u.setDepartmentTitle(d.getTitle());
            }
        }else{
            u.setDepartmentId(null);
            u.setDepartmentTitle("");
        }
        iUserService.saveOrUpdate(u);
        if(roleIds != null) {
            List<UserRole> userRoles = Arrays.asList(roleIds).stream().map(e -> {
                return new UserRole().setUserId(u.getId()).setRoleId(e);
            }).collect(Collectors.toList());
            iUserRoleService.saveOrUpdateBatch(userRoles);
        }
        return ResultUtil.success();
    }
    @ApiOperation(value = "根据账号查询用户")
    private User findByUsername(String username) {
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("username",username);
        return userToDTO(iUserService.getOne(userQw));
    }
    @ApiOperation(value = "根据手机号查询用户")
    private User findByMobile(String mobile) {
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("mobile",mobile);
        return userToDTO(iUserService.getOne(userQw));
    }
    @ApiOperation(value = "根据邮箱查询用户")
    private User findByEmail(String email) {
        QueryWrapper<User> userQw = new QueryWrapper<>();
        userQw.eq("email",email);
        return userToDTO(iUserService.getOne(userQw));
    }
    @RequestMapping(value = "/admin/disable/{userId}", method = RequestMethod.POST)
    @ApiOperation(value = "禁用用户")
    public Result<Object> disable( @PathVariable String userId){
        User user = iUserService.getById(userId);
        if(user == null){
            return ResultUtil.error("用户已被删除");
        }
        user.setStatus(CommonConstant.USER_STATUS_LOCK);
        iUserService.saveOrUpdate(user);
        redisTemplate.delete("user::"+user.getUsername());
        return ResultUtil.success();
    }
    @RequestMapping(value = "/admin/enable/{userId}", method = RequestMethod.POST)
    @ApiOperation(value = "启用用户")
    public Result<Object> enable(@PathVariable String userId){
        User user = iUserService.getById(userId);
        if(user==null){
            return ResultUtil.error("用户已被删除");
        }
        user.setStatus(CommonConstant.USER_STATUS_NORMAL);
        iUserService.saveOrUpdate(user);
        redisTemplate.delete("user::"+user.getUsername());
        return ResultUtil.success();
    }
    @RequestMapping(value = "/delByIds", method = RequestMethod.POST)
    @ApiOperation(value = "删除用户")
    public Result<Object> delByIds(@RequestParam String[] ids) {
        for(String id:ids){
            User u = iUserService.getById(id);
            redisTemplate.delete("user::" + u.getUsername());
            redisTemplate.delete("userRole::" + u.getId());
            redisTemplate.delete("userRole::depIds:" + u.getId());
            redisTemplate.delete("permission::userMenuList:" + u.getId());
            Set<String> keys = redisTemplateHelper.keys("department::*");
            redisTemplate.delete(keys);
            iUserService.removeById(id);
            QueryWrapper<UserRole> urQw = new QueryWrapper<>();
            urQw.eq("user_id",id);
            iUserRoleService.remove(urQw);
            QueryWrapper<DepartmentHeader> dhQw = new QueryWrapper<>();
            dhQw.eq("user_id",id);
            iDepartmentHeaderService.remove(dhQw);
        }
        return ResultUtil.success();
    }
    @RequestMapping(value = "/importData", method = RequestMethod.POST)
    @ApiOperation(value = "导入用户")
    public Result<Object> importData(@RequestBody List<User> users){
        List<Integer> errors = new ArrayList<>();
        List<String> reasons = new ArrayList<>();
        int count = 0;
        for(User u: users){
            count++;
            if(StrUtil.isBlank(u.getUsername())||StrUtil.isBlank(u.getPassword())){
                errors.add(count);
                reasons.add("账号密码为空");
                continue;
            }
            if(findByUsername(u.getUsername())!=null){
                errors.add(count);
                reasons.add("用户名已存在");
                continue;
            }
            u.setPassword(new BCryptPasswordEncoder().encode(u.getPassword()));
            if(StrUtil.isNotBlank(u.getDepartmentId())){
                Department department = iDepartmentService.getById(u.getDepartmentId());
                if(department == null) {
                    errors.add(count);
                    reasons.add("部门不存在");
                    continue;
                }
            }
            if(u.getStatus()==null){
                u.setStatus(CommonConstant.USER_STATUS_NORMAL);
            }
            iUserService.saveOrUpdate(u);
            if(u.getDefaultRole() != null && u.getDefaultRole()==1) {
                QueryWrapper<Role> roleQw = new QueryWrapper<>();
                roleQw.eq("default_role",true);
                List<Role> roleList = iRoleService.list(roleQw);
                if(roleList!=null&&roleList.size()>0){
                    for(Role role : roleList){
                        UserRole ur = new UserRole().setUserId(u.getId()).setRoleId(role.getId());
                        iUserRoleService.saveOrUpdate(ur);
                    }
                }
            }
        }
        int successCount = users.size() - errors.size();
        String successMessage = "成功导入 " + successCount + " 位用户";
        String failMessage = "成功导入 " + successCount + " 位用户,失败 " + errors.size() + " 位用户。<br>" +"第 " + errors.toString() + " 行数据导入出错,错误原因是为 <br>" + reasons.toString();
        String message = null;
        if(errors.size() == 0){
            message = successMessage;
        }else{
            message = failMessage;
        }
        return ResultUtil.success(message);
    }
    @ApiOperation(value = "校验")
    public void checkUserInfo(String username, String mobile, String email){
        CommonUtil.stopwords(username);
        if(StrUtil.isNotBlank(username) && findByUsername(username)!=null){
            throw new ZwzException("账户重复");
        }
        if(StrUtil.isNotBlank(email) && findByEmail(email)!=null){
            throw new ZwzException("邮箱重复");
        }
        if(StrUtil.isNotBlank(mobile) && findByMobile(mobile)!=null){
            throw new ZwzException("手机号重复");
        }
    }
    @ApiOperation(value = "添加用户的角色和菜单信息")
    public User userToDTO(User user) {
        if(user == null) {
            return null;
        }
        // 角色
        QueryWrapper<UserRole> urQw = new QueryWrapper<>();
        urQw.eq("user_id", user.getId());
        List<UserRole> roleList = iUserRoleService.list(urQw);
        List<RoleDTO> roleDTOList = new ArrayList<>();
        for (UserRole userRole : roleList) {
            Role role = iRoleService.getById(userRole.getRoleId());
            if(role != null) {
                roleDTOList.add(new RoleDTO().setId(role.getId()).setName(role.getName()));
            }
        }
        user.setRoles(roleDTOList);
        // 菜单
        List<String> permissionIdList = new ArrayList<>();
        for (RoleDTO dto : roleDTOList) {
            QueryWrapper<RolePermission> rpQw = new QueryWrapper<>();
            rpQw.eq("role_id",dto.getId());
            List<RolePermission> list = iRolePermissionService.list(rpQw);
            for (RolePermission rp : list) {
                boolean flag = true;
                for (String id : permissionIdList) {
                    if(Objects.equals(id,rp.getPermissionId())) {
                        flag = false;
                        break;
                    }
                }
                if(flag) {
                    permissionIdList.add(rp.getPermissionId());
                }
            }
        }
        List<PermissionDTO> permissionDTOList = new ArrayList<>();
        for (String id : permissionIdList) {
            Permission permission = iPermissionService.getById(id);
            if(permission != null) {
                if(Objects.equals(permission.getType(),CommonConstant.PERMISSION_OPERATION)) {
                    continue;
                }
                permissionDTOList.add(new PermissionDTO().setTitle(permission.getTitle()).setPath(permission.getPath()));
            }
        }
        user.setPermissions(permissionDTOList);
        return user;
    }
}

五,相关作品展示

基于Java开发、Python开发、PHP开发、C#开发等相关语言开发的实战项目

基于Nodejs、Vue等前端技术开发的前端实战项目

基于微信小程序和安卓APP应用开发的相关作品

基于51单片机等嵌入式物联网开发应用

基于各类算法实现的AI智能应用

基于大数据实现的各类数据管理和推荐系统


相关实践学习
基于Redis实现在线游戏积分排行榜
本场景将介绍如何基于Redis数据库实现在线游戏中的游戏玩家积分排行榜功能。
云数据库 Redis 版使用教程
云数据库Redis版是兼容Redis协议标准的、提供持久化的内存数据库服务,基于高可靠双机热备架构及可无缝扩展的集群架构,满足高读写性能场景及容量需弹性变配的业务需求。 产品详情:https://www.aliyun.com/product/kvstore &nbsp; &nbsp; ------------------------------------------------------------------------- 阿里云数据库体验:数据库上云实战 开发者云会免费提供一台带自建MySQL的源数据库&nbsp;ECS 实例和一台目标数据库&nbsp;RDS实例。跟着指引,您可以一步步实现将ECS自建数据库迁移到目标数据库RDS。 点击下方链接,领取免费ECS&amp;RDS资源,30分钟完成数据库上云实战!https://developer.aliyun.com/adc/scenario/51eefbd1894e42f6bb9acacadd3f9121?spm=a2c6h.13788135.J_3257954370.9.4ba85f24utseFl
相关文章
|
7月前
|
开发框架 Java 网络安全
基于JavaWeb实现洋酒销售平台的设计与实现
基于JavaWeb实现洋酒销售平台的设计与实现
|
7月前
|
JavaScript Java 测试技术
基于Java的家具销售库存管理信息系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的家具销售库存管理信息系统的设计与实现(源码+lw+部署文档+讲解等)
63 3
|
7月前
|
JavaScript Java 测试技术
基于Java的连锁超市会员管理系统的设计与实现(源码+lw+部署文档+讲解等)
基于Java的连锁超市会员管理系统的设计与实现(源码+lw+部署文档+讲解等)
112 0
|
SQL 前端开发 JavaScript
基于java+springboot的外卖点餐网站、外卖点餐管理系统
该系统是基于java+springboot开发的外卖点餐网站、外卖点餐管理系统。是给师弟开发的课程作业。运行过程中的问题,可以在github咨询作者。
129 0
|
7月前
|
JavaScript 前端开发 Java
基于JavaEE的通用超市结算系统的设计与实现
基于JavaEE的通用超市结算系统的设计与实现
|
Java 关系型数据库 测试技术
基于SpringBoot的特色农产品销售设计与实现
基于SpringBoot的特色农产品销售设计与实现
3965 1
基于SpringBoot的特色农产品销售设计与实现
|
7月前
|
JavaScript 小程序 Java
基于Java的大学生在线租房平台的设计与实现(亮点:合理的租房流程、房屋报修、多角色、在线评论回复)
基于Java的大学生在线租房平台的设计与实现(亮点:合理的租房流程、房屋报修、多角色、在线评论回复)
105 0
|
7月前
|
开发框架 前端开发 Java
基于JavaWeb实现洋酒销售平台的设计与实现(一)
基于JavaWeb实现洋酒销售平台的设计与实现
|
7月前
|
算法 Java 数据库
基于JavaWeb实现洋酒销售平台的设计与实现(二)
基于JavaWeb实现洋酒销售平台的设计与实现
|
7月前
|
关系型数据库 测试技术 数据库
超市结算系统|Springboot+Vue通用超市结算收银系统
超市结算系统|Springboot+Vue通用超市结算收银系统