SpringBoot日记本系统全程直播08:把个人中心完善一下撒~~

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
简介: 大家好,我是兔子呀,今天我继续给大家撸这个SpringBoot日记本系统哈,非常不错的一个项目,学习​javaweb编程必备。

本节完成内容:


1. 个人中心页面⭐

2.个人信息的修改⭐

3.SpringBoot文件上传和浏览⭐


1.完成后的效果


333.png


字段不多,难点在于图片的上传。


2.后台逻辑


2.1 Controller控制器


@RestController
@RequestMapping("/user")
public class UserController {
    @Autowired
    UserService userService;
    @Autowired
    RedisServiceImpl redisServiceImpl;
    String salt = "diary188";
    ......
    @RequestMapping("update")
    public Result update(@RequestBody User user){
        userService.update(user);
        return Result.success();
    }
    @RequestMapping("get")
    public User get(){
        return userService.getByUserId(StpUtil.getLoginIdAsLong());
    }
}


update方法用于更新用户对象,get方法用来获取当前登录对象的信息。


2.2 Service服务类


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    UserMapper userMapper;
    @Autowired
    RedisServiceImpl redisServiceImpl;
    /**
     * 根据用户名获取用户
     * @param userName
     * @return
     */
    @Override
    public User getByUserName(String userName) {
        List<User> users = userMapper.selectList(new QueryWrapper<User>().eq("user_name", userName));
        if(users.size() > 0){
            return users.get(0);
        }
        return null;
    }
    /**
     * 保存用户
     * @param user
     */
    @Override
    public void save(User user) {
        userMapper.insert(user);
    }
    @Override
    public User getByUserId(long loginIdAsLong) {
        return userMapper.selectById(loginIdAsLong);
    }
    @Override
    public void update(User user) {
        LambdaUpdateWrapper<User> lambdaUpdateWrapper = new LambdaUpdateWrapper<>();
        lambdaUpdateWrapper = lambdaUpdateWrapper.set(User::getNickName, user.getNickName())
                .set(User::getBirthday, user.getBirthday())
                .set(User::getGender, user.getGender())
                .set(User::getSignature, user.getSignature())
                .set(User::getUpdateTime, DateUtil.now());
        if(StrUtil.isNotEmpty(user.getFace())){
            lambdaUpdateWrapper = lambdaUpdateWrapper.set(User::getFace,user.getFace());
        }
        lambdaUpdateWrapper.eq(User::getUid, StpUtil.getLoginIdAsLong());
        userMapper.update(null,lambdaUpdateWrapper);
    }
}


3.前台页面


前台页面主要用的就是layUI的form组件和文件上传组件。

主要代码如下:


444.png


<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<c:set var="basePath" value="${pageContext.request.contextPath}"></c:set>
<html>
<head>
    <title>个人中心</title>
    <meta name="viewport" content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no">
    <script src="${basePath}/layui/layui.all.js" charset="utf-8"></script>
    <script src="${basePath}/js/axios.min.js"></script>
    <script src="${basePath}/js/vue.js"></script>
    <link rel="stylesheet" href="${basePath}/layui/css/layui.css" media="all">
    <style>
    </style>
</head>
<body>
<div class="layui-container">
    <div class="layui-row layui-col-space10">
        <div class="layui-row">
            <div class="layui-col-md12">
                <jsp:include page="../common/header.jsp"></jsp:include>
            </div>
            <div class="layui-col-md9">
                <div class="layui-card dbox" style="border-right: 2px solid #eaeaea;height: 90%;padding: 16px;">
                    <form class="layui-form layui-form-pane"  style="padding-top: 20px;" lay-filter="userInfo">
                        <div class="layui-form-item">
                            <label class="layui-form-label">我的昵称</label>
                            <div class="layui-input-block">
                                <input type="text" name="nickName" lay-verify="nickName" autocomplete="off" placeholder="请输入昵称" class="layui-input">
                            </div>
                        </div>
                        <div class="layui-upload">
                            <div style="margin-left: 0px;margin-bottom: 20px">
                                <div class="layui-upload-list" style="float: left;">
                                    <!-- 图片预览 -->
                                    <img style="width: 150px; height: 150px;" class="layui-upload-img" id="uploaderShow">
                                    <p id="errorText"></p>
                                </div>
                                <div style="width: 150px;margin-top:100px;margin-left:20px;float: left">
                                    <button type="button" style="margin-bottom: 10px;" class="layui-btn" id="uploader">上传图片</button>
                                </div>
                            </div>
                        </div>
                        <div class="layui-form-item">
                            <label class="layui-form-label">性别</label>
                            <div class="layui-input-block">
                                <input type="radio" name="gender" value="0" title="男" checked>
                                <input type="radio" name="gender" value="1" title="女" >
                                <input type="radio" name="gender" value="2" title="保密" >
                            </div>
                        </div>
                        <div class="layui-form-item">
                            <label class="layui-form-label">出生日期</label>
                            <div class="layui-input-block">
                                <input id="birthday" name="birthday" lay-verify="birthday" type="text" class="layui-input" id="test1" placeholder="yyyyMMdd">
                            </div>
                        </div>
                        <div class="layui-form-item">
                            <label class="layui-form-label">个性签名</label>
                            <div class="layui-input-block">
                                <input type="text" name="signature" lay-verify="signature" autocomplete="off" placeholder="请输入个性签名" class="layui-input">
                            </div>
                        </div>
                        <div class="layui-form-item">
                            <div class="layui-input-block" style="text-align: right;">
                                <button type="reset" class="layui-btn layui-btn-primary">重置</button>
                                <button type="submit" class="layui-btn" lay-submit="" lay-filter="demo1">立即更新</button>
                            </div>
                        </div>
                    </form>
                </div>
            </div>
            <div class="layui-col-md3" style="">
                <jsp:include page="../common/sider.jsp"></jsp:include>
            </div>
        </div>
    </div>
    <jsp:include page="../common/footer.jsp"></jsp:include>
</div>
<script>
    layui.use(['form', 'layedit', 'laydate','upload','element','jquery'], function(){
        var form = layui.form
            ,layer = layui.layer
            ,layedit = layui.layedit
            ,upload = layui.upload
            ,element = layui.element
            ,$ = layui.jquery
            ,laydate = layui.laydate;
        //日期
        laydate.render({
            elem: '#birthday'
        });
        //常规使用 - 普通图片上传
        var uploadInst = upload.render({
            elem: '#uploader'
            //,url: 'https://httpbin.org/post' //此处用的是第三方的 http 请求演示,实际使用时改成您自己的上传接口即可。
            ,url: '${basePath}/upload' //此处用的是第三方的 http 请求演示,实际使用时改成您自己的上传接口即可。
            ,before: function(obj){
                //预读本地文件示例,不支持ie8
                obj.preview(function(index, file, result){
                    $('#uploaderShow').attr('src', result); //图片链接(base64)
                });
                console.log('before')
                element.progress('progressBar', '0%'); //进度条复位
                layer.msg('上传中', {icon: 16, time: 1000});
            }
            ,done: function(res){
                console.log(res)
                //如果上传失败
                if(res.code > 0){
                    return layer.msg('上传失败');
                }
                //上传成功的一些操作
                //记录上传的图片地址
                window.face = res.data.file;
                $('#errorText').html(''); //置空上传失败的状态
            }
            ,error: function(){
                console.log('error')
                //演示失败状态,并实现重传
                var errorText = $('#errorText');
                errorText.html('<span style="color: #FF5722;">上传失败</span> <a class="layui-btn layui-btn-xs demo-reload">重试</a>');
                errorText.find('.demo-reload').on('click', function(){
                    uploadInst.upload();
                });
            }
        });
        //监听提交
        form.on('submit(demo1)', function(data){
            data = {...data.field }
            if(window.face){
                data.face = window.face;
            }
            var index = layer.load(1); //添加laoding,0-2两种方式
            axios.post('${basePath}/user/update',data).then(r =>{
                layer.close(index);    //返回数据关闭loading
                if(r.data.code != '0000'){
                    layer.msg(r.data.message,{icon:2});
                    return;
                }
                layer.msg('个人信息更新成功!',{icon:1});
                setTimeout(()=>{location.href="/diary/user.html"},500)
            });
            return false;
        });
        form.verify({
            nickName: function(value){
                if(value.length < 5){
                    return '昵称至少得5个字符啊!';
                }
            }
            ,birthday: function(value){
                if(value.length < 1){
                    return '请选择出生日期!';
                }
            }
            ,signature: function(value){
                if(value.length < 10){
                    return '请填写个性签名,至少10个字符!';
                }
            }
        });
        form.render();
        form.val('userInfo', {
            nickName: "${user.nickName}",
            gender:"${user.gender}",
            birthday:"${user.birthday}",
            signature:"${user.signature}"
        });
        $('#uploaderShow').attr('src', "${basePath}/upload/${user.face}");
    });
</script>
</body>
</html>


4.文件上传后台逻辑


配置一下文件上传的路径和预览URL:

@Configuration
public class MvcConfig implements WebMvcConfigurer {
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler(new String[] { "/upload/**" }).addResourceLocations(new String[] { "file:C:/upload/" });
    }
}


配置文件也要改

system:
  filepath: c:\upload
  urlpath: http://localhost/upload/


最后是文件上传的代码:

@RestController
public class UploadController {
    @Autowired
    AppConfig appConfig;
    @RequestMapping({"/upload"})
    public Map upload(@RequestParam("file") MultipartFile file) {
        String fileName = "";
        if (!file.isEmpty()){
            /**
             * 获取文件后缀名
             */
            String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
            if(suffix.equals(".PNG") || suffix.equals(".png") || suffix.equals(".jpg") || suffix.equals(".JPG") ) {
            }else{
                throw new BizException(ExceptionCodeEnum.ERROR.setDesc("非法文件格式!"));
            }
            /**
             * 文件名
             */
            fileName = System.currentTimeMillis() + suffix;
            /**
             * 返回的文件路径
             */
            String fileNameForReturn = "/"+ StpUtil.getLoginIdAsLong()  + "/" + fileName;
            /**
             * 文件的保存路径
             */
            String saveFilePath = this.appConfig.getFilepath() + "/"+StpUtil.getLoginIdAsLong();
            /**
             * 父级目录若不存在就创建
             */
            if(!new File(saveFilePath).exists()) {
                new File(saveFilePath).mkdir();
            }
            String saveFileName = saveFilePath + "/" + fileName;
            File dest = new File(saveFileName);
            try {
                /**
                 * 拷贝文件
                 */
                file.transferTo(dest);
                return new HashMap(){{
                    put("file",fileNameForReturn);
                }} ;
            } catch (IOException e) {
                e.printStackTrace();
                throw new BizException(ExceptionCodeEnum.ERROR.setDesc("系统异常!"));
            }
        }
        return null;
    }
}
相关实践学习
基于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
相关文章
|
2月前
|
XML Java 数据库连接
SpringBoot集成Flowable:打造强大的工作流管理系统
在企业级应用开发中,工作流管理是一个核心组件,它能够帮助我们定义、执行和管理业务流程。Flowable是一个开源的工作流和业务流程管理(BPM)平台,它提供了强大的工作流引擎和建模工具。结合SpringBoot,我们可以快速构建一个高效、灵活的工作流管理系统。本文将探讨如何将Flowable集成到SpringBoot应用中,并展示其强大的功能。
350 1
|
2月前
|
JavaScript Java 项目管理
Java毕设学习 基于SpringBoot + Vue 的医院管理系统 持续给大家寻找Java毕设学习项目(附源码)
基于SpringBoot + Vue的医院管理系统,涵盖医院、患者、挂号、药物、检查、病床、排班管理和数据分析等功能。开发工具为IDEA和HBuilder X,环境需配置jdk8、Node.js14、MySQL8。文末提供源码下载链接。
|
3月前
|
存储 安全 Java
打造智能合同管理系统:SpringBoot与电子签章的完美融合
【10月更文挑战第7天】 在数字化转型的浪潮中,电子合同管理系统因其高效、环保和安全的特点,正逐渐成为企业合同管理的新宠。本文将分享如何利用SpringBoot框架实现一个集电子文件签字与合同管理于一体的智能系统,探索技术如何助力合同管理的现代化。
137 4
|
3月前
|
前端开发 Java Apache
SpringBoot实现电子文件签字+合同系统!
【10月更文挑战第15天】 在现代企业运营中,合同管理和电子文件签字成为了日常活动中不可或缺的一部分。随着技术的发展,电子合同系统因其高效性、安全性和环保性,逐渐取代了传统的纸质合同。本文将详细介绍如何使用SpringBoot框架实现一个电子文件签字和合同管理系统。
137 1
|
4月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
基于Java+Springboot+Vue开发的大学竞赛报名管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的大学竞赛报名管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
242 3
基于Java+Springboot+Vue开发的大学竞赛报名管理系统
|
3月前
|
文字识别 安全 Java
SpringBoot3.x和OCR构建车牌识别系统
本文介绍了一个基于Java SpringBoot3.x框架的车牌识别系统,详细阐述了系统的设计目标、需求分析及其实现过程。利用Tesseract OCR库和OpenCV库,实现了车牌图片的识别与处理,确保系统的高准确性和稳定性。文中还提供了具体的代码示例,展示了如何构建和优化车牌识别服务,以及如何处理特殊和异常车牌。通过实际应用案例,帮助读者理解和应用这一解决方案。
|
4月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的蛋糕商城管理系统
基于Java+Springboot+Vue开发的蛋糕商城管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的蛋糕商城管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
211 3
基于Java+Springboot+Vue开发的蛋糕商城管理系统
|
4月前
|
前端开发 JavaScript Java
基于Java+Springboot+Vue开发的美容预约管理系统
基于Java+Springboot+Vue开发的美容预约管理系统(前后端分离),这是一项为大学生课程设计作业而开发的项目。该系统旨在帮助大学生学习并掌握Java编程技能,同时锻炼他们的项目设计与开发能力。通过学习基于Java的美容预约管理系统项目,大学生可以在实践中学习和提升自己的能力,为以后的职业发展打下坚实基础。
66 3
基于Java+Springboot+Vue开发的美容预约管理系统
|
2月前
|
JavaScript NoSQL Java
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
CC-ADMIN后台简介一个基于 Spring Boot 2.1.3 、SpringBootMybatis plus、JWT、Shiro、Redis、Vue quasar 的前后端分离的后台管理系统
53 0
|
3月前
|
机器学习/深度学习 移动开发 自然语言处理
基于人工智能技术的智能导诊系统源码,SpringBoot作为后端服务的框架,提供快速开发,自动配置和生产级特性
当身体不适却不知该挂哪个科室时,智能导诊系统应运而生。患者只需选择不适部位和症状,系统即可迅速推荐正确科室,避免排错队浪费时间。该系统基于SpringBoot、Redis、MyBatis Plus等技术架构,支持多渠道接入,具备自然语言理解和多输入方式,确保高效精准的导诊体验。无论是线上医疗平台还是大型医院,智能导诊系统均能有效优化就诊流程。