IDEA版SpringBoot全教程 08 会员管理系统(中)1

简介: 这一节我们要完成新增用户的前后台代码。请求参数封装Controller控制器的方法中,可以接收HttpServletRequest对象,这个对象中包含了前台的请求参数信息。

1.实现用户新增

这一节我们要完成新增用户的前后台代码。


请求参数封装


Controller控制器的方法中,可以接收HttpServletRequest对象,这个对象中包含了前台的请求参数信息。


为了方便开发,一般我们都会对其进行封装,比如HashMap就挺香的,用HashMap获取某个参数,只需要我们用get方法。给HashMap设置某个参数,我们可以用put方法,反正很爽就对了。


我们单独封装一个方法,把HttpServletRequest转换为HashMap

/**
 * 将请求对象的参数转换为HashMap
 * @param request
 * @return
 */
public static Map<String, Object> handleParamToMap(
        HttpServletRequest request) {
    Map<String, Object> map = new HashMap<>();
    for (Map.Entry<String, String[]> entry : request.getParameterMap()
            .entrySet()) {
        String[] arr = entry.getValue();
        String result = "";
        if (null != arr && arr.length > 0) {
            for (int i = 0; i < arr.length; i++) {
                result += arr[i];
                if (i < arr.length - 1) {
                    result += ",";
                }
            }
            map.put(entry.getKey(), result);
        }
    }
    return map;
}

具体的实现细节可以忽略,反正它可以完成我们的要求就对了。

jdbcTemplate的update方法可以接收两个参数,第一个参数是sql语句,insert语句相信我们都不陌生,是sql语法的基础。

jdbcTemplate支持这种写法,比如:

ff893d3c68b6300d3848dec97af5c718.png


(该图片来自于网络)

按理说后面的values里面需要填写具体的参数值,但是加一个:就变成了一个占位符。比如:ln,就会对应到Map中key=ln的值。

知道这个原理后,我们就可以尝试写出保存用户的方法了。

saveUser

@PutMapping("saveUser")
@ResponseBody
public Map<String, Object> saveUser(HttpServletRequest request){
    //拼装请求参数
    Map<String, Object> params = handleParamToMap(request);
    //设置返回信息
    Map<String, Object> resultMap = new HashMap();
    resultMap.put("errCode",0); //错误码
    resultMap.put("errMsg",null);//错误信息
    int update = jdbcTemplate.update("INSERT INTO `vipmgr`.`user` (`user_name`, `create_time`, `header_pic`, `ip_addr`, `is_delete`, `is_logined`, `is_vip`, `last_login_time`, `nick_name`, `password`, `role_id`, `amt`, `last_sign_date`) " +
            "VALUES (:userName, :createTime, NULL, :ipAddr, '0', '0', '0', :lastLoginTime, :nickName, :password, '1', 0, NULL)",params);
    if(update != 1){
        resultMap.put("errCode",11111); //错误码
        resultMap.put("errMsg","系统异常,请联系管理员!");//错误信息
    }
    return params;
}

做一个整理,我们需要的参数有:


userName,createTime,ipAddr,lastLoginTime,nickName,password


其中加粗的部分是从前台传过来的,其他字段需要我们自己想办法来组装。


createTime:创建时间


lastLoginTime:上次登录时间 (额,搞错了,这个不用管,创建用户的时候还没有登录时间呢)


先看创建时间,这个用户是当前这个时间点创建的,所以我们直接想办法获取当前时间就行了。


找到我们的老朋友:Hutool,在pom.xml中添加:

<!-- https://mvnrepository.com/artifact/cn.hutool/hutool-all -->
<dependency>
  <groupId>cn.hutool</groupId>
  <artifactId>hutool-all</artifactId>
  <version>5.6.3</version>
</dependency>

然后这样写:

params.put("createTime", DateUtil.now());


DateUtil是Hutool里面关于时间处理的工具类。

ipAddr是IP地址的意思,如果是用户注册的时候调用了这个方法,那么是可以获取用户当前网段的IP地址的

params.put("ipAddr", request.getRemoteAddr());


为了让前台能够知道方法的调用结果,我们需要设置返回信息,一般分为错误码和错误信息,如果错误码不是00000(返回成功),那么就需要对错误信息进行展示处理。

//设置返回信息
Map<String, Object> resultMap = new HashMap();
resultMap.put("errCode",0); //错误码
resultMap.put("errMsg",null);//错误信息

最终代码

@PutMapping("saveUser")
@ResponseBody
public Map<String, Object> saveUser(HttpServletRequest request){
    //拼装请求参数
    Map<String, Object> params = handleParamToMap(request);
    //设置返回信息
    Map<String, Object> resultMap = new HashMap();
    resultMap.put("errCode",0); //错误码
    resultMap.put("errMsg",null);//错误信息
    params.put("createTime", DateUtil.now());
    params.put("ipAddr", request.getRemoteAddr());
    int update = jdbcTemplate.update("INSERT INTO `vipmgr`.`user` (`user_name`, `create_time`, `header_pic`, `ip_addr`, `is_delete`, `is_logined`, `is_vip`, `last_login_time`, `nick_name`, `password`, `role_id`, `amt`, `last_sign_date`) " +
            "VALUES (:userName, :createTime, NULL, :ipAddr, '0', '0', '0', :lastLoginTime, :nickName, :password, '1', 0, NULL)",params);
    if(update != 1){
        resultMap.put("errCode",11111); //错误码
        resultMap.put("errMsg","系统异常,请联系管理员!");//错误信息
    }
    return params;
}

教程写到这,没有进行测试,上面的代码是我一气呵成的。

如果有问题再说吧。

页面增加一个按钮

1c38c34028d28794ba90f7d4374c2230.png


<div  style="padding:5px;background:#fafafa;width:100%;border:1px solid #ccc">
    <a href="#" class="easyui-linkbutton" iconCls="icon-add">增加用户</a>
</div>

ae2782a8fd099db858368daa3708285f.png

设计保存窗口

在页面中添加

<div id="win" class="easyui-window" title="保存用户" style="width:400px;height:250px;">
    <form style="padding:10px 20px 10px 40px;">
        <p>用户名: <input name="userName" type="text"></p>
        <p>密   码: <input name="password" type="password"></p>
        <p>昵   称: <input name="nickName" type="text"></p>
        <div style="padding:5px;text-align:center;">
            <a href="#" class="easyui-linkbutton" icon="icon-ok">确认保存</a>
            <a href="#" class="easyui-linkbutton" icon="icon-cancel">取消</a>
        </div>
    </form>
</div>

这就创建了一个EasyUI风格的窗口。

4e6f434a73fcac986712dd0c445a94ee.png

新增按钮点击事件

这个窗口默认是关闭着的,所以我们要添加这个属性

<div id="win" class="easyui-window" title="保存用户" style="width:400px;height:250px;" closed="true">

然后,给按钮添加点击事件,点击按钮才显示这个窗体:

<a href="#" class="easyui-linkbutton" iconCls="icon-add" onclick="openAddWin()">增加用户</a>
function openAddWin() {
    $('#win').window('open');
}

保存方法

给提交按钮添加点击事件

<a href="#" class="easyui-linkbutton" icon="icon-ok" onclick="save()">确认保存</a>

save方法

function save() {
    $.ajax({
        url: 'user/saveUser',
        data: $("#userForm").serialize(),
        type: 'put',
        dataType: 'json',
        success: function (data) {
            data = eval("(" + data + ")");
            if (data.errCode != '00000') {
                alert(data.errMsg);
                return;
            }
            alert("保存成功!");
            $('#win').window('close');
        }
    });
}

测试:

8f08b28dee2ea7bc5994031b095d0d6b.png


报错了:

java.sql.SQLException: Parameter index out of range (1 > number of parameters, which is 0).

错误分析:应该是sql语句写错了,参数个数不匹配导致的。

不要慌,调试一下

c1cf21b32ac7b3f588ecc1d2d1dd86bf.png

这是请求参数

60822302a6ef20c2a9042492a6a578cc.png


这是SQL语句

INSERT INTO `vipmgr`.`user` (`user_name`, `create_time`, `header_pic`, `ip_addr`, `is_delete

可以看到,具名的参数有


:userName, :createTime,:ipAddr,:lastLoginTime, :nickName, :password,


一共6个,可是Map里面只有5个,少了谁呢?


少了lastLoginTime!


好吧,现在我们改一下sql,lastLoginTime设置为null

ae0e24d8a35b736a73ac41b7063ea920.png



ae0e24d8a35b736a73ac41b7063ea920.png

相关文章
|
8月前
|
人工智能 自然语言处理 Java
DeepSeek 满血版在 VScode 和 IDEA 中怎么用?手把手教程来了
沉默王二分享了通义灵码的使用教程,这款插件集成了DeepSeek-R1和Qwen等模型,支持Java、Python、Go等多种编程语言,适用于IDEA、VSCode等开发环境。它不仅能提供智能问答、代码补全和Bug修复功能,还能通过“AI程序员”实现多文件代码修改。体验流畅,算力充足,无需担心限流问题。文章详细介绍了安装步骤及各项功能的实际操作,展示了其在提升开发效率方面的强大实力。目前,通义灵码正持续优化,未来将带来更多惊喜。
1577 1
|
3月前
|
IDE Linux 开发工具
IntelliJ IDEA最新版安装下载教程及安装教程(附安装包)
本文介绍IDEA的下载与安装教程,包含获取下载地址、安装步骤及激活方法。需注意安装路径为英文目录,运行激活脚本时需管理员权限。按指引操作即可完成激活并使用。
1042 0
|
9月前
|
Java 应用服务中间件 API
Servlet开发流程 (里面有Idea项目添加Tomcat依赖详细教程)
本文详细介绍了Servlet的开发流程,包括在IntelliJ IDEA中添加Tomcat依赖的详细教程。通过上述步骤,开发者可以快速搭建并运行一个基本的Servlet应用,理解并掌握Servlet的开发流程对于Java Web开发至关重要。希望本文能够帮助开发者顺利进行Servlet开发,提高工作效率。
1037 78
|
10月前
|
人工智能 自然语言处理 Java
IDEA中使用DeepSeek满血版的手把手教程来了!
本文主要介绍阿里云推出的AI编码助手——通义灵码在代码编写、智能问答、bug修复等方面的功能。
IDEA中使用DeepSeek满血版的手把手教程来了!
|
9月前
|
JavaScript 前端开发 Java
Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use;端口冲突的原理与解决方案
本文解决了Idea启动SpringBoot程序报错:Veb server failed to start. Port 8082 was already in use的问题,并通过介绍端口的使用原理和操作系统的端口管理机制,可以更有效地解决端口冲突问题,并确保Web服务器能够顺利启动和运行。 只有锻炼思维才能可持续地解决问题,只有思维才是真正值得学习和分享的核心要素。如果这篇博客能给您带来一点帮助,麻烦您点个赞支持一下,还可以收藏起来以备不时之需,有疑问和错误欢迎在评论区指出~
|
10月前
|
人工智能 自然语言处理 Java
DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了
DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了
199 3
|
10月前
|
人工智能 自然语言处理 Java
DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了
DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了
|
10月前
|
人工智能 自然语言处理 Java
DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了
DeepSeek 满血版在 IDEA 中怎么用?手把手教程来了
|
10月前
|
人工智能 自然语言处理 Java
IDEA中使用DeepSeek满血版的手把手教程来了!
IDEA中使用DeepSeek满血版的手把手教程来了!
|
2月前
|
JavaScript Java 关系型数据库
基于springboot的项目管理系统
本文探讨项目管理系统在现代企业中的应用与实现,分析其研究背景、意义及现状,阐述基于SSM、Java、MySQL和Vue等技术构建系统的关键方法,展现其在提升管理效率、协同水平与风险管控方面的价值。

热门文章

最新文章