前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >【尚筹网】五、管理员维护

【尚筹网】五、管理员维护

作者头像
用户11332765
发布于 2024-12-25 02:12:50
发布于 2024-12-25 02:12:50
11400
代码可运行
举报
文章被收录于专栏:编程编程
运行总次数:0
代码可运行

任务清单

  • 分页显示 Admin 数据
    • 不带关键词分页
    • 带关键词分页
  • 新增 Admin
  • 更新 Admin
  • 单条删除 Admin

分页管理管理员信息

目标

数据库中的 Admin 数据在页面上以分页形式显示。在后端将“带关键词”和“不带关键词”的分页合并为同一套代码

思路

image-20241126223330409
image-20241126223330409

代码

引入 PageHelper

确认是否加入了依赖

代码语言:javascript
代码运行次数:0
运行
复制
<!-- MyBatis 分页插件 -->
<dependency>
	<groupId>com.github.pagehelper</groupId>
	<artifactId>pagehelper</artifactId>
</dependency>

SqlSessionFactoryBean 配置 MyBatis 插件

image-20241126223941497
image-20241126223941497

代码语言:javascript
代码运行次数:0
运行
复制
<!-- 配置 SqlSessionFactoryBean 整合 MyBatis -->
<bean id="sqlSessionFactoryBean" class="org.mybatis.spring.SqlSessionFactoryBean" >
    <!-- 指定 MyBatis 全局配置文件位置 -->
    <property name="configLocation" value="classpath:mybatis/mybatis-config.xml" />
    <!-- 指定 Mapper.xml 配置文件位置 -->
    <property name="mapperLocations" value="classpath:mybatis/mapper/*Mapper.xml" />
    <!-- 配置数据源  -->
    <property name="dataSource" ref="dataSource" />
    <!-- 配置插件 -->
    <property name="plugins" >
       <array>
          <!-- 配置 PageHelper -->
          <bean class="com.github.pagehelper.PageHelper">
             <property name="properties">
                <props>
                   <!-- 配置数据库方言,告诉 PageHelper 当前使用的数据库 -->
                   <prop key="dialect">mysql</prop>
                   <!-- 配置页码的合理化修正,在1~总页数之间修正页码 -->
                   <prop key="reasonable">true</prop>
                </props>
             </property>
          </bean>
       </array>
    </property>
</bean>
AdminMapper 中编写 SQL 语句
image-20241126224731297
image-20241126224731297
代码语言:javascript
代码运行次数:0
运行
复制
<select id="selectAdminByKeyword" resultMap="BaseResultMap">
    select id, login_acct, user_pswd, user_name, email, create_time
    from t_admin
    where login_acct like concat('%',#{keyword},'%')
    or user_name like concat('%',#{keyword},'%')
    or email like concat('%',#{keyword},'%')
</select>
AdminMapper 接口生成方法
image-20241126225604859
image-20241126225604859
代码语言:javascript
代码运行次数:0
运行
复制
List<Admin> selectAdminByKeyword(String keyword);
AdminService
image-20241126230359513
image-20241126230359513
代码语言:javascript
代码运行次数:0
运行
复制
@Override
public PageInfo<Admin> getPageInfo(String keyword, Integer pageNum, Integer pageSize) {
    // 1.调用 PageHelper 的静态方法开启分页功能
    // 这里充分体现了 PageHelper 的“非侵入式”设计:原本要做的查询不必有任何修改
    PageHelper.startPage(pageNum, pageSize);
    // 2.执行查询
    List<Admin> list = adminMapper.selectAdminByKeyword(keyword);
    // 3.封装为 PageInfo 对象返回
    return new PageInfo<>(list);
}
AdminHandler
image-20241126230824624
image-20241126230824624
代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping("/admin/get/page.html")
public String getPageInfo(
       // 使用 @RequestParam 注解的 defaultValue 属性,指定默认值,在请求中没有携带对应参数时使用默认值
       // keyword 默认值使用空字符串,和 SQL 语句配合实现两种情况的适配
       @RequestParam(value = "keyword", defaultValue = "") String keyword,
       // pageNum 默认值使用 1
       @RequestParam(value = "pageNum", defaultValue = "1") Integer pageNum,
       // pageSize 默认值使用 5
       @RequestParam(value = "pageSize", defaultValue = "5") Integer pageSize,
       ModelMap modelMap
){
    // 调用 Service 方法获取 PageInfo 对象
    PageInfo<Admin> pageInfo = adminService.getPageInfo(keyword, pageNum, pageSize);
    // 将 PageInfo 对象存入模型
    modelMap.addAttribute(CrowdConstant.ATTR_NAME_PAGE_INFO, pageInfo);
    return "admin-page";
}
页面显示主体
image-20241126234009493
image-20241126234009493
代码语言:javascript
代码运行次数:0
运行
复制
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
    <%@include file="/WEB-INF/include-head.jsp" %>
    <body>

       <%@include file="/WEB-INF/include-nav.jsp" %>
       <div class="container-fluid">
          <div class="row">
             <%@include file="/WEB-INF/include-sidebar.jsp" %>
             <div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
                <div class="panel panel-default">
                   <div class="panel-heading">
                      <h3 class="panel-title"><i class="glyphicon glyphicon-th"></i> 数据列表</h3>
                   </div>
                   <div class="panel-body">
                      <form class="form-inline" role="form" style="float:left;">
                         <div class="form-group has-feedback">
                            <div class="input-group">
                               <div class="input-group-addon">查询条件</div>
                               <input class="form-control has-success" type="text"
                                      placeholder="请输入查询条件">
                            </div>
                         </div>
                         <button type="button" class="btn btn-warning"><i class="glyphicon glyphicon-search"></i>
                            查询
                         </button>
                      </form>
                      <button type="button" class="btn btn-danger" style="float:right;margin-left:10px;"><i
                            class=" glyphicon glyphicon-remove"></i> 删除
                      </button>
                      <button type="button" class="btn btn-primary" style="float:right;"
                              onclick="window.location.href='add.html'"><i class="glyphicon glyphicon-plus"></i>
                         新增
                      </button>
                      <br>
                      <hr style="clear:both;">
                      <div class="table-responsive">
                         <table class="table  table-bordered">
                            <thead>
                               <tr>
                                  <th width="30">#</th>
                                  <th width="30"><input type="checkbox"></th>
                                  <th>账号</th>
                                  <th>名称</th>
                                  <th>邮箱地址</th>
                                  <th width="100">操作</th>
                               </tr>
                            </thead>
                            <tbody>
                               <c:if test="${empty requestScope.pageInfo.list}">
                                  <tr>
                                     <td colspan="6" align="center">抱歉!没有查询到您要的数据!</td>
                                  </tr>
                               </c:if>
                               <c:if test="${!empty requestScope.pageInfo.list}">
                                  <c:forEach items="${requestScope.pageInfo.list}" var="admin" varStatus="myStatus">
                               <tr>
                                  <td>${myStatus.count}</td>
                                  <td><input type="checkbox"></td>
                                  <td>${admin.loginAcct}</td>
                                  <td>${admin.userName}</td>
                                  <td>${admin.email}</td>
                                  <td>
                                     <button type="button" class="btn btn-success btn-xs">
                                        <i class=" glyphicon glyphicon-check"></i>
                                     </button>
                                     <button type="button" class="btn btn-primary btn-xs">
                                        <i class=" glyphicon glyphicon-pencil"></i>
                                     </button>
                                     <button type="button" class="btn btn-danger btn-xs">
                                        <i class=" glyphicon glyphicon-remove"></i>
                                     </button>
                                  </td>
                               </tr>
                                  </c:forEach>
                               </c:if>
                            </tbody>
                            <tfoot>
                               <tr>
                                  <td colspan="6" align="center">
                                     <ul class="pagination">
                                        <li class="disabled"><a href="#">上一页</a></li>
                                        <li class="active"><a href="#">1 <span
                                              class="sr-only">(current)</span></a></li>
                                        <li><a href="#">2</a></li>
                                        <li><a href="#">3</a></li>
                                        <li><a href="#">4</a></li>
                                        <li><a href="#">5</a></li>
                                        <li><a href="#">下一页</a></li>
                                     </ul>
                                  </td>
                               </tr>

                            </tfoot>
                         </table>
                      </div>
                   </div>
                </div>
             </div>
          </div>
       </div>

    </body>
</html>
在页面上使用 Pagination 实现导航条
image-20241129223030558
image-20241129223030558

在有需要的页面进行引入

代码语言:javascript
代码运行次数:0
运行
复制
<%@include file="/WEB-INF/include-head.jsp" %>
<link rel="stylesheet" href="css/pagination.css" />
<script type="text/javascript" src="jquery/jquery.pagination.js"></script>

HTML代码准备

使用 Pagination 要求的 div 标签替换原有的页码部分

代码语言:javascript
代码运行次数:0
运行
复制
<tfoot>
    <tr>
       <td colspan="6" align="center">
          <ul class="pagination">
             <li class="disabled"><a href="#">上一页</a></li>
             <li class="active"><a href="#">1 <span
                   class="sr-only">(current)</span></a></li>
             <li><a href="#">2</a></li>
             <li><a href="#">3</a></li>
             <li><a href="#">4</a></li>
             <li><a href="#">5</a></li>
             <li><a href="#">下一页</a></li>
          </ul>
       </td>
    </tr>
</tfoot>
代码语言:javascript
代码运行次数:0
运行
复制
<tfoot>
    <tr>
       <td colspan="6" align="center">
          <div id="Pagination" class="pagination"></div>
       </td>
    </tr>
</tfoot>

JQuery 代码

代码语言:javascript
代码运行次数:0
运行
复制
<script type="text/javascript">
    $(function () {
       // 对页面导航条进行初始化
       initPagination();
    });

    // 初始化分页导航条
    function initPagination(){
       // 获取总记录数
       var totalRecord = ${requestScope.pageInfo.total};
       // 声明一个 JSON 对象存储分页导航条需要用到的数据
       var properties = {
          // 边缘页数
          num_edge_entries: 3,
          // 主体页数
          num_display_entries: 5,
          // 指定用户点击翻页的按钮时跳转页面的回调函数
          callback: pageSelectCallback,
          // 每页要显示的记录数
          items_per_page: ${requestScope.pageInfo.pageSize},
          // 当前页码, Pagination 内部使用 pageIndex 来管理页码,pageIndex 从0开始,pageNum 从1开始,所以 pageNum - 1
          current_page: ${requestScope.pageInfo.pageNum - 1},
          prev_text: "上一页",
          next_text: "下一页"
       }
       // 生成页码导航条
       $('#Pagination').pagination(totalRecord, properties);
    }

    // 回调函数的含义:声明出来以后不是自己调用,而是交给系统或框架调用
    // 用户点击“上一页、下一页、1、2、3."这样的页码时调用这个函数实现页面跳转
    // pageIndex 是 Pagination 传给我们的那个从0开始的页码
    function pageSelectCallback(pageIndex, jQuery){
       // 根据 pageIndex 计算得到 pageNum
       var pageNum = pageIndex + 1;
       // 跳转到指定页
       window.location.href = "admin/get/page.html?pageNum=" + pageNum;
       // 由于每一个页码都是超链接,所以在这个函数最后取消超链接的默认行为
       return false;
    }
</script>

修改 Pagination 源码

image-20241130221230838
image-20241130221230838
image-20241130221334944
image-20241130221334944
代码语言:javascript
代码运行次数:0
运行
复制
// 所有初始化完成,绘制链接
drawLinks();
// 回调函数
// opts.callback(current_page, this);

关键词查询

页面上调整表单

image-20241126234009493
image-20241126234009493
代码语言:javascript
代码运行次数:0
运行
复制
<form class="form-inline" role="form" style="float:left;" action="admin/get/page.html" method="post">
    <div class="form-group has-feedback">
       <div class="input-group">
          <div class="input-group-addon">查询条件</div>
          <label>
             <input name="keyword" class="form-control has-success" type="text"
                    placeholder="请输入查询条件">
          </label>
       </div>
    </div>
    <button type="submit" class="btn btn-warning"><i class="glyphicon glyphicon-search"></i>
       查询
    </button>
</form>

在翻页时保持关键词查询条件

image-20241130222510209
image-20241130222510209
代码语言:javascript
代码运行次数:0
运行
复制
window.location.href = "admin/get/page.html?pageNum=" + pageNum + "&keyword=${param.keyword}";

单条删除

目标

在页面上点击单条删除按钮 ,实现 Admin 对应记录的删除

思路

image-20241130223233359
image-20241130223233359

代码

调整删除的按钮
image-20241126234009493
image-20241126234009493
代码语言:javascript
代码运行次数:0
运行
复制
<%-- <button type="button" class="btn btn-danger btn-xs">
<i class=" glyphicon glyphicon-remove"></i>
</button> --%>
<a href="admin/remove/${admin.id}/${requestScope.pageInfo.pageNum}/${param.keyword}.html" class="btn btn-danger btn-xs">
    <i class=" glyphicon glyphicon-remove"></i>
</a>
AdminHandler.remove()
image-20241130224244685
image-20241130224244685
代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping("admin/remove/{adminId}/{pageNum}/{keyword}.html")
public String remove(@PathVariable("adminId") Integer adminId,
                     @PathVariable("pageNum") Integer pageNum,
                     @PathVariable("keyword") String keyword){
    // 调用 Service 方法执行删除
    adminService.remove(adminId);
    // 页面跳转:回到分页页面

    // 尝试方案1:直接转发到 admin-page.jsp 会无法显示分页数据
    // return "admin-page";
    // 尝试方案2:转发到 /admin/get/page.html 页面,一旦刷新页面会重复执行删除浪费性能
    // return "forward:/admin/get/page.html";
    // 尝试方案3:重定向到 /admin/get/page.html 页面
    // 同时为了保持原本所在的页面和查询关键词再附加 pageNum 和 keyword 两个请求参数
    return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
}
AdminService.remove()
image-20241126230359513
image-20241126230359513
代码语言:javascript
代码运行次数:0
运行
复制
@Override
public void remove(Integer adminId) {
    adminMapper.deleteByPrimaryKey(adminId);   
}

新增

目标

将表单提交的 Admin 对象保存到数据库中

要求:

  1. loginAcct 不能重复
  2. 密码加密

思路

image-20241201211602466
image-20241201211602466

t_admin 表中给账号添加唯一约束

代码语言:javascript
代码运行次数:0
运行
复制
alter table `project_crowd`.`t_admin` add unique index (`login_acct`);

调整修改按钮

image-20241201212422734
image-20241201212422734
代码语言:javascript
代码运行次数:0
运行
复制
<%-- <button type="button" class="btn btn-primary" style="float:right;"
        onclick="window.location.href='add.html'"><i class="glyphicon glyphicon-plus"></i>
    新增
</button> --%>
<a href="admin/to/add/page.html" class="btn btn-primary" style="float:right;"
        onclick="window.location.href='add.html'"><i class="glyphicon glyphicon-plus"></i>
    新增
</a>

配置 view-controller

image-20241201212902073
image-20241201212902073
代码语言:javascript
代码运行次数:0
运行
复制
<mvc:view-controller path="/admin/to/add/page.html" view-name="admin-add" />

准备表单页面

image-20241201213347508
image-20241201213347508
代码语言:javascript
代码运行次数:0
运行
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
	<%@include file="/WEB-INF/include-head.jsp" %>
	<body>
		<%@include file="/WEB-INF/include-nav.jsp" %>
		<div class="container-fluid">
			<div class="row">
				<%@include file="/WEB-INF/include-sidebar.jsp" %>
				<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
					<ol class="breadcrumb">
						<li><a href="/admin/to/main/page.html">首页</a></li>
						<li><a href="/admin/get/page.html">数据列表</a></li>
						<li class="active">新增</li>
					</ol>
					<div class="panel panel-default">
						<div class="panel-heading">
							表单数据
							<div style="float:right;cursor:pointer;" data-toggle="modal" data-target="#myModal">
								<i class="glyphicon glyphicon-question-sign"></i>
							</div>
						</div>
						<div class="panel-body">
							<form action="admin/save.html" method="post" role="form">
								<p>${requestScope.exception.message}</p>
								<div class="form-group">
									<label for="inputLoginAcct">登录账号</label>
									<input type="text" class="form-control" id="inputLoginAcct" name="loginAcct"
									       placeholder="请输入登录账号">
								</div>
								<div class="form-group">
									<label for="inputPassword">登录密码</label>
									<input type="text" class="form-control" id="inputPassword" name="userPswd"
									       placeholder="请输入登录密码">
								</div>
								<div class="form-group">
									<label for="inputUserName">用户昵称</label>
									<input type="text" class="form-control" id="inputUserName" name="userName"
									       placeholder="请输入用户昵称">
								</div>
								<div class="form-group">
									<label for="inputEmail">邮箱地址</label>
									<input type="email" class="form-control" id="inputEmail" name="email"
									       placeholder="请输入邮箱地址">
									<p class="help-block label label-warning">请输入合法的邮箱地址, 格式为:
										xxxx@xxxx.com</p>
								</div>
								<button type="submit" class="btn btn-success"><i class="glyphicon glyphicon-plus"></i>
									新增
								</button>
								<button type="reset" class="btn btn-danger"><i class="glyphicon glyphicon-refresh"></i>
									重置
								</button>
							</form>
						</div>
					</div>
				</div>
			</div>
        </div>
	</body>
</html>

handler 方法

image-20241130224244685
image-20241130224244685
代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping("admin/save.html")
public String save(Admin admin){
    adminService.saveAdmin(admin);
    return "redirect:/admin/get/page.html?pageNum=" + Integer.MAX_VALUE;
}

Service 方法

image-20241126230359513
image-20241126230359513
代码语言:javascript
代码运行次数:0
运行
复制
public void saveAdmin(Admin admin) {
    // 1.密码加密
    String userPswd = admin.getUserPswd();
    userPswd = CrowdUtil.md5(userPswd);
    admin.setUserPswd(userPswd);
    // 2.生成创建时间
    Date date = new Date();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String createTime = format.format(date);
    admin.setCreateTime(createTime);
    // 3.执行插入
    adminMapper.insert(admin);
}

处理唯一约束

创建自定义异常类
image-20241201221839314
image-20241201221839314
代码语言:javascript
代码运行次数:0
运行
复制
package com.atguigu.crowd.exception;

/**
 * Copyright (C) 2024 - 2024 Jasonakeke, Inc. All Rights Reserved
 *
 * @Desc : 保存或者更新 Admin 时,如果检测到登录账号重复则抛出这个异常
 * @Time : 2024/12/1 22:05
 * @Author : Code_By_Jasonakeke
 * @Email : 2284037977@qq.com
 * @Class : LoginAcctAlreadyInUseException
 * @IDE : IntelliJ IDEA
 */
public class LoginAcctAlreadyInUseException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public LoginAcctAlreadyInUseException(String message) {
       super(message);
    }

    public LoginAcctAlreadyInUseException(String message, Throwable cause) {
       super(message, cause);
    }

    public LoginAcctAlreadyInUseException(Throwable cause) {
       super(cause);
    }

    public LoginAcctAlreadyInUseException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
       super(message, cause, enableSuppression, writableStackTrace);
    }

    public LoginAcctAlreadyInUseException() {
    }
}
在异常处理器类添加方法
image-20241201222043272
image-20241201222043272
代码语言:javascript
代码运行次数:0
运行
复制
@ExceptionHandler(LoginAcctAlreadyInUseException.class)
public ModelAndView resolveLoginAcctAlreadyInUseException(LoginAcctAlreadyInUseException exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
    String viewName = "admin-add";
    return commonResolve(viewName, exception, request, response);
}
修改 Service 方法
代码语言:javascript
代码运行次数:0
运行
复制
public void saveAdmin(Admin admin) {
    // 1.密码加密
    String userPswd = admin.getUserPswd();
    userPswd = CrowdUtil.md5(userPswd);
    admin.setUserPswd(userPswd);
    // 2.生成创建时间
    Date date = new Date();
    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String createTime = format.format(date);
    admin.setCreateTime(createTime);
    // 3.执行插入
    try {
       adminMapper.insert(admin);
    } catch (Exception e) {
       e.printStackTrace();
       logger.info("异常全类名:{}", e.getClass().getName());
       if (e instanceof DuplicateKeyException) {
          throw new LoginAcctAlreadyInUseException(CrowdConstant.MESSAGE_LOGIN_ACCT_ALREADY_IN_USE);
       }
    }
}

更新

目标

修改现有 Admin 的数据,不修改密码和创建时间

思路

image-20241201222639454
image-20241201222639454

回显表单

调整铅笔按钮
image-20241126234009493
image-20241126234009493
代码语言:javascript
代码运行次数:0
运行
复制
<%-- <button type="button" class="btn btn-primary btn-xs">
<i class=" glyphicon glyphicon-pencil"></i>
</button> --%>
<a href="admin/to/edit/page.html?adminId=${admin.id}&pageNum=${requestScope.pageInfo.pageNum}&keyword=${param.keyword}" class="btn btn-primary btn-xs">
    <i class="glyphicon glyphicon-pencil"></i>
</a>
Handler 方法
image-20241201223812557
image-20241201223812557
代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping("admin/to/edit/page.html")
public String toEditPage(
       @RequestParam("adminId") Integer adminId,
       ModelMap modelMap
){
    // 1.根据 adminId 查询 Admin 对象
    Admin admin = adminService.getAdminById(adminId);
    // 2.将 Admin 对象存入模型
    modelMap.addAttribute("admin", admin);
    return "admin-edit";
}
准备页面
image-20241201224622773
image-20241201224622773
代码语言:javascript
代码运行次数:0
运行
复制
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html>
	<%@include file="/WEB-INF/include-head.jsp" %>
	<body>
		<%@include file="/WEB-INF/include-nav.jsp" %>
		<div class="container-fluid">
			<div class="row">
				<%@include file="/WEB-INF/include-sidebar.jsp" %>
				<div class="col-sm-9 col-sm-offset-3 col-md-10 col-md-offset-2 main">
					<ol class="breadcrumb">
						<li><a href="/admin/to/main/page.html">首页</a></li>
						<li><a href="/admin/get/page.html">数据列表</a></li>
						<li class="active">更新</li>
					</ol>
					<div class="panel panel-default">
						<div class="panel-heading">
							表单数据
							<div style="float:right;cursor:pointer;" data-toggle="modal" data-target="#myModal">
								<i class="glyphicon glyphicon-question-sign"></i>
							</div>
						</div>
						<div class="panel-body">
							<form action="admin/update.html" method="post" role="form">
								<input type="hidden" name="id" value="${requestScope.admin.id}">
								<input type="hidden" name="pageNum" value="${param.pageNum}">
								<input type="hidden" name="keyword" value="${param.keyword}">
								<p>${requestScope.exception.message}</p>
								<div class="form-group">
									<label for="inputLoginAcct">登录账号</label>
									<input type="text" class="form-control" id="inputLoginAcct" name="loginAcct" value="${requestScope.admin.loginAcct}"
									       placeholder="请输入登录账号">
								</div>
								<div class="form-group">
									<label for="inputUserName">用户昵称</label>
									<input type="text" class="form-control" id="inputUserName" name="userName" value="${requestScope.admin.userName}"
									       placeholder="请输入用户昵称">
								</div>
								<div class="form-group">
									<label for="inputEmail">邮箱地址</label>
									<input type="email" class="form-control" id="inputEmail" name="email" value="${requestScope.admin.email}"
									       placeholder="请输入邮箱地址">
									<p class="help-block label label-warning">请输入合法的邮箱地址, 格式为:
										xxxx@xxxx.com</p>
								</div>
								<button type="submit" class="btn btn-success"><i class="glyphicon glyphicon-edit"></i>
									更新
								</button>
								<button type="reset" class="btn btn-danger"><i class="glyphicon glyphicon-refresh"></i>
									重置
								</button>
							</form>
						</div>
					</div>
				</div>
			</div>
		</div>

	</body>
</html>
Service 方法
代码语言:javascript
代码运行次数:0
运行
复制
@Override
public Admin getAdminById(Integer adminId) {
    return adminMapper.selectByPrimaryKey(adminId);
}

执行更新

Handler 方法

]

image-20241201223812557
image-20241201223812557
代码语言:javascript
代码运行次数:0
运行
复制
@RequestMapping("admin/update.html")
public String update(Admin admin,
                     @RequestParam("pageNum") Integer pageNum,
                     @RequestParam("keyword") String keyword){
    adminService.update(admin);
    return "redirect:/admin/get/page.html?pageNum=" + pageNum + "&keyword=" + keyword;
}
Service 方法
image-20241126230359513
image-20241126230359513
代码语言:javascript
代码运行次数:0
运行
复制
@Override
public void update(Admin admin) {
    try {
       // Selective:表示有选择的更新,对于 null 值的字段不更新
       adminMapper.updateByPrimaryKeySelective(admin);
    } catch (Exception e) {
       e.printStackTrace();
       logger.info("异常全类名:{}", e.getClass().getName());
       if (e instanceof DuplicateKeyException) {
          throw new LoginAcctAlreadyInUseException(CrowdConstant.MESSAGE_LOGIN_ACCT_ALREADY_IN_USE);
       }
    }
}
创建自定义异常
image-20241201231834624
image-20241201231834624
代码语言:javascript
代码运行次数:0
运行
复制
package com.atguigu.crowd.exception;

/**
 * Copyright (C) 2024 - 2024 Jasonakeke, Inc. All Rights Reserved
 *
 * @Desc :
 * @Time : 2024/12/1 23:12
 * @Author : Code_By_Jasonakeke
 * @Email : 2284037977@qq.com
 * @Class : LoginAcctAlreadyInUseForUpdateException
 * @IDE : IntelliJ IDEA
 */
public class LoginAcctAlreadyInUseForUpdateException extends RuntimeException {

    private static final long serialVersionUID = 1L;

    public LoginAcctAlreadyInUseForUpdateException() {
    }

    public LoginAcctAlreadyInUseForUpdateException(String message) {
       super(message);
    }

    public LoginAcctAlreadyInUseForUpdateException(String message, Throwable cause) {
       super(message, cause);
    }

    public LoginAcctAlreadyInUseForUpdateException(Throwable cause) {
       super(cause);
    }

    public LoginAcctAlreadyInUseForUpdateException(String message, Throwable cause, boolean enableSuppression, boolean writableStackTrace) {
       super(message, cause, enableSuppression, writableStackTrace);
    }
}
在异常处理器类添加方法
image-20241201222043272
image-20241201222043272
代码语言:javascript
代码运行次数:0
运行
复制
@ExceptionHandler(LoginAcctAlreadyInUseForUpdateException.class)
public ModelAndView resolveLoginAcctAlreadyInUseForUpdateException(LoginAcctAlreadyInUseForUpdateException exception, HttpServletRequest request, HttpServletResponse response) throws IOException {
    String viewName = "system-error";
    return commonResolve(viewName, exception, request, response);
}
修改 Service 方法
代码语言:javascript
代码运行次数:0
运行
复制
@Override
public void update(Admin admin) {
    try {
       // Selective:表示有选择的更新,对于 null 值的字段不更新
       adminMapper.updateByPrimaryKeySelective(admin);
    } catch (Exception e) {
       e.printStackTrace();
       logger.info("异常全类名:{}", e.getClass().getName());
       if (e instanceof DuplicateKeyException) {
          throw new LoginAcctAlreadyInUseForUpdateException(CrowdConstant.MESSAGE_LOGIN_ACCT_ALREADY_IN_USE);
       }
    }
}
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-12-01,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
Altair HyperWorks 2020:一站式工程仿真解决方案 安装步骤
Altair HyperWorks 2020是一款集成了工程仿真、优化和多物理场分析等功能的软件。它能够快速有效地解决各种复杂的工程问题,为工程师和设计人员提供高端的工程仿真和分析工具,帮助用户优化设计和提高产品性能和质量。
用户10313071
2023/04/07
5760
Altair HyperWorks 2020:一站式工程仿真解决方案 安装步骤
边缘智能+AI赋能:创想智控金属增材制造熔池在线质量监控
在航空航天、能源装备等高端制造领域,金属增材制造技术凭借其高精度、低热影响和复杂结构成形的优势,成为推动先进制造升级的关键力量。熔池状态作为影响成型质量的核心因素,其稳定性和一致性直接决定着最终零件的性能表现。如何实现对熔池的实时感知、精准分析与智能判断,成为业内关注的重点。
创想智控
2025/04/29
1250
边缘智能+AI赋能:创想智控金属增材制造熔池在线质量监控
拓扑优化在结构设计中的应用
拓扑优化(Topology optimization)是基于有限元技术、数值分析与优化理论,在满足给定的约束条件下,寻找设计域内最优材料分布,进而实现表征结构性能指标的目标函数(如刚度、强度、重量等)达到最优,在航空航天、材料工程、化学工程等领域具有广泛的应用。很久之前Nature的一篇文章(Giga-voxel computational morphogenesis for structural design)采用拓扑优化算法对机翼结构进行优化设计,巧合的是其优化结果表明:在一定的边界条件下,最优的结果(刚度最大)与鸟类翅膀骨骼具有相似性。
联远智维
2022/01/20
1.6K0
拓扑优化在结构设计中的应用
钱塘号丨3D打印十大趋势预测
导读:我国的3D打印技术与世界先进水平基本同步,但产业化仍处于起步阶段。未来,3D打印将朝着速度更快、精度更高、性能更优、质量更可靠的方向发展,成为一股强大的科技力量。 近年来,借着新一轮科技革命和
钱塘数据
2018/03/02
7200
钱塘号丨3D打印十大趋势预测
技术 | 我国自主研发航空新材料,实现铝中“自生”陶瓷
上交大研究团队研发新型材料,并与多家企业合作搭建生产应用平台,极大推进我国航空航天材料的发展和落地。 近日,上海交通大学材料科学与工程学院王浩伟教授团队研究出超强纳米陶瓷铝合金,其强度和比刚度甚至超过“太空金属”钛合金,有助于将航空航天、高铁等领域带入更轻、更节能的新材料时代。 如表所示,伴随着实际应用的需求,航天航空的材料发展逐步向轻质、高强度逼近。目前,航空航天结构材料主要有铝合金、钛合金、纤维复合材料和高温结构材料。 在航空航天器机体结构材料的应用上,近100年来,铝合金都一直长盛不衰。特别是20世纪
镁客网
2018/05/30
6820
钱塘号丨3D打印技术对于供应链结构的影响
供应链管理的目的是将原始材料转变为部件或装配,最后将最终产品传递到消费者手上。但3D打印的兴起或许会使供应链理念和结构发生变革。因为3D打印蕴含着很多优化企业的战略资源的潜能,尤其在供应链结构上有一定的影响作用。接下来,小编就和大家一起探讨3D打印技术在供应链结构中到底有着怎样的影响? 从供应链的视角看3D打印技术的主要价值 通过Gartner(2016 年3月)调查得知,65%的供应链专业人士正在使用或者将在未来两年内投资于3D 打印技术。具体来说:目前正在使用或试用3D 打印技术的占26% 计划在两年
钱塘数据
2018/03/02
7810
钱塘号丨3D打印技术对于供应链结构的影响
企业仿真软件选型指南:从通用工具到有限元分析的全流程解析
在工程设计的数字化浪潮下,仿真技术已成为企业突破创新瓶颈的 “秘密武器”。通过模拟产品在真实工况下的性能表现,企业不仅能提前规避设计缺陷,还能将研发周期缩短 30% 以上,大幅降低试错成本。然而,机械制造、航空航天、汽车工业等不同领域,对仿真软件的精度、功能模块及计算效率有着截然不同的需求。例如,航空航天领域需要精确模拟极端环境下的材料力学特性,而汽车行业更注重碰撞模拟的实时性与多物理场耦合能力。这种差异化需求,让有限元分析(FEA)软件的选型成为决定研发成败的关键一环。接下来,我们将深入剖析各行业的仿真痛点,并探讨 Abaqus 为何能成为众多工程师信赖的全能型解决方案。
思茂信息
2025/06/05
290
企业仿真软件选型指南:从通用工具到有限元分析的全流程解析
系统仿真明知道“算不准”,但为什么还是研发设计不可缺少的重要一环
我们研究工程问题本来就是一种近似求解,而系统仿真在其中扮演的是一个风险预测的角色,本质上属于数值计算,必然存在计算误差、截断误差、机器误差等,它不像求解算术问题1+1=2这种,必须要得到一个精确值。
用户9925864
2024/07/12
2290
系统仿真明知道“算不准”,但为什么还是研发设计不可缺少的重要一环
《智启新材:人工智能重塑分子结构设计蓝图》
在当今科技飞速发展的时代,新材料的研发宛如一场激烈的竞赛,而人工智能(AI)作为一匹黑马,正以前所未有的速度和力量驰骋于这片赛场,为新材料的分子结构设计带来了革命性的突破,成为推动行业发展的关键力量,也因此成为科研与产业领域炙手可热的焦点话题。
程序员阿伟
2025/01/02
1020
《中国制造2025》告诉你未来投什么会火
主要涉及,集成电路及专用装备、信息通信设备以及操作系统和工业软件。不断丰富知识产权IP核和设计工具,突破关系国家信息与网络安全及电子整机产业发展的核心通用芯片,提升国产芯片的应用适配能力。掌握高密度封装及3D打印技术,提升封装产业和测试的自主发展能力,形成关键制造装备供货能力。 掌握新型计算、高速互联、先进存储、体系化安全保障等核心技术,全面突破第五代移动通信5G技术、核心路由交换技术、超高速大容量智能光传输技术、“未来网络”核心技术和体系架构,积极推动量子计算、神经网络等发展。 突破智能设计与仿真及其工具、制造物联与服务、工业大数据处理等高端工业软件核心技术,开发自主可控的高端工业平台软件和重点领域应用软件,建立完善工业软件集成标准与安全测评体系。推进自主工业软件体系化发展和产业化应用。
IT阅读排行榜
2018/08/14
4520
Sora再显大模型魔力,CAE也要老将焕新生
在数字经济浪潮汹涌而来的今天,CAE(Computer Aided Engineering,指计算机辅助工程)作为一项成熟的技术领域,正在焕发出全新的生命力。
数据猿
2024/03/04
1730
Sora再显大模型魔力,CAE也要老将焕新生
冬奥会闭幕!盘一盘国内高校在冬奥会上的「黑科技」应用,你的母校上榜了吗?
来源 | 吴文俊人工智能科学技术奖 历时半个月的北京冬奥会即将落幕! 申冬奥成功以来,「科技冬奥」重点攻关大力推进,《科技冬奥(2022)行动计划》全面展开,国家重点研发计划「科技冬奥」重点专项有序推进,取得了一系列科技创新成果。这其中自然少不了高校的力量。 据不完全统计,清华大学、浙江大学、复旦大学、上海交通大学、哈尔滨工业大学、北京航空航天大学、重庆大学、大连理工大学、北京林业大学、东北大学等多所国内高校贡献了科技智慧,助力冬奥。 1 浙江大学 织就炫酷的「冰丝带」 作为唯一新建冰上竞赛场馆——国家
AI科技评论
2022/03/03
2950
人工智能在航空航天领域的应用
航空航天领域是技术高度密集的行业,随着科技的不断进步,人工智能(AI)在该领域的应用也愈发广泛。AI技术不仅提升了航空航天器的设计和制造效率,还改善了飞行安全性和任务执行能力。本文将深入探讨人工智能在航空航天中的应用,包括具体的案例分析和相关代码示例。
知孤云出岫
2024/07/26
7980
人工智能在航空航天领域的应用
达索系统软件Abaqus如何实现多场耦合?
在现代工程领域,随着技术的飞速发展,各类工程问题的复杂性日益增加,传统的单一物理场分析已难以满足对实际工程现象的精确描述需求。在此背景下,耦合问题,特别是多场耦合问题逐渐成为工程分析的核心研究方向。多场耦合分析致力于在同一模型体系内,同时考量多个物理场之间的相互作用关系,像热场与结构场的交互影响,或是流体场与结构场的动态耦合,都是其典型的研究范畴。​
思茂信息
2025/05/28
1180
达索系统软件Abaqus如何实现多场耦合?
DC电源模块的设计与制造技术创新
1. 高效率设计:传统的DC电源模块存在能量转换损耗较大的问题,技术创新可通过采用高效率的电路拓扑结构、使用高性能的功率开关器件和优化控制算法等手段来提高能量转换效率,降低能量损耗。
河北稳控科技
2023/12/15
2090
DC电源模块的设计与制造技术创新
北航联合哈佛,历时四年,克服三大难题,研制出吸盘式仿生机器人 | 黑科技
该研究具有广泛的应用前景,如在国防科技,水下救援、海洋生态检测等领域,都可发挥重要的作用。 21日,《科学》杂志发表了一篇关于仿生机器人的论文,该论文详细描述了以䲟鱼软体吸盘为原理的仿生机器人。据悉,该机器人由北京航空航天大学和哈佛大学的研究人员共同研制,其中北京航空航天大学为该研究的第一单位和第一通讯单位。 启发 䲟鱼,又名吸盘鱼,喜欢吸附在鲨鱼、海龟等大型海洋生物身上,俗名免费旅行家。由于该鱼的游泳能力较差,所以它主要依靠头部的吸盘吸附在游泳能力强的大型鲨鱼或海兽的腹面,有时吸附于船底,以借此被带到饵料
镁客网
2018/05/30
4923
《智启新材热学性能优化之路:人工智能的神奇力量》
在当今科技飞速发展的时代,材料科学与人工智能的融合正成为创新的前沿阵地。其中,利用人工智能优化材料的热学性能,为众多领域的突破带来了新的曙光,从航空航天的高效热防护到电子设备的散热管理,其影响深远且广泛,无疑是当下极具热度的话题。
程序员阿伟
2025/01/02
1230
一文读懂,Abaqus软件的发展历程
在现代工程领域,有限元分析技术占据着举足轻重的地位,至今已历经五十余年的发展。将时间拨回到 20 世纪 50 年代,美国航空航天局(NASA)因太空探索任务的需要,率先对这项技术展开深入研究,促使有限元分析技术萌芽并逐步发展壮大。
思茂信息
2025/05/06
1570
一文读懂,Abaqus软件的发展历程
基于OptiStruct的碳纤维复合材料覆盖接头设计优化
随着国家对汽车排放量要求的提高以及新能源汽车的快速发展,降低油耗、提升续航里程的需求促使轻量化成为目前汽车产业的重要发展趋势。白车身作为汽车的主要承载结构,由于其可设计性强、减重空间大,是各大厂商轻量化开发的重点。国际上目前主要采用车身轻量化系数作为轻量化设计的评价指标,轻量化系数越低则表示车身的轻量化设计越好,计算方法如下式:
技术客
2022/05/17
1.1K0
为什么说仿真软件是新型科技?
在工程技术的领域中,有一种被称为有限元的方法,它可以让我们对复杂的问题进行仿真,分析其性质和特性,从而有效地解决各种问题。本文主要介绍了有限元分析技术在各种工程领域中的应用情况。
思茂信息
2025/02/21
900
为什么说仿真软件是新型科技?
推荐阅读
相关推荐
Altair HyperWorks 2020:一站式工程仿真解决方案 安装步骤
更多 >
目录
  • 任务清单
  • 分页管理管理员信息
    • 目标
    • 思路
    • 代码
  • 关键词查询
    • 页面上调整表单
    • 在翻页时保持关键词查询条件
  • 单条删除
    • 目标
    • 思路
    • 代码
      • 调整删除的按钮
      • AdminHandler.remove()
      • AdminService.remove()
  • 新增
    • 目标
    • 思路
    • 在 t_admin 表中给账号添加唯一约束
    • 调整修改按钮
    • 配置 view-controller
    • 准备表单页面
    • handler 方法
    • Service 方法
    • 处理唯一约束
      • 创建自定义异常类
      • 在异常处理器类添加方法
      • 修改 Service 方法
  • 更新
    • 目标
    • 思路
    • 回显表单
      • 调整铅笔按钮
      • Handler 方法
      • 准备页面
      • Service 方法
    • 执行更新
      • Handler 方法
      • Service 方法
      • 创建自定义异常
      • 在异常处理器类添加方法
      • 修改 Service 方法
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档