本项目为web开发项目,使用的技术包括:
SpringBoot+mysql+mybatis(JPA)+HTML+CSS+JQ(AJAX)
一、搭建SpringBoot环境
项目管理框架,已经嵌入服务器的代码
打开idea并创建新项目:
Create new project
-->maven
-->next
-->Name
-->Groupid:一般由多个段组成。性质.公司.项目
org免费的,cn,com 比如:com.qd(公司名).qddemo(项目名)
-->Artifacctid:项目名字qddemo
-->Finish
创建完成之后得到几种文件类型:
.xml:maven配置文件
src(source):源码
main:
二、写入新项目(概念引入)
(一)继承springboot空项目
pom.xml(maven配置文件)中添加
<!--父类-->
<parent>
<groupId>org.springframework</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
</parent>
更新maven就会自动下载到本地仓库
(二)引入web环境
pom.xml(maven配置文件)中添加
<!--web环境-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
(三)Java右键new java class
名字是com.qd.qddemo.controller.IndexController.java
(四)编写处理器(主函数)
@RestController
//@Controller(控制层的类)+@ResponseBody(把返回值都变成json,不再是视图)
public class IndexController {
@RequestMapping("/index")
public String index(){
return "hello";
}
}
(五)编写启动类
1.方法一:
使用@EnableAutoConfiguration+@ComponentScan
@EnableAutoConfiguration:可开启自动扫描
@ComponentScan:用于扫描,默认会扫描当前包和子包
创建启动类 com.qd.qddemo.App.java
启动类:
@EnableAutoConfiguration
@ComponentScan
public class App {
public static void main(String[] args) {
//会调用内部嵌入的服务器代码
SpringApplication.run(App.class,args);
}
}
以上这么设计,会把com.qd.qddemo包下所有资源开启自动配置
2.方法二:推荐
启动类
@SpringBootApplicatio //@EnableAutoConfiguration+@ComponentScan
public class App {
public static void main(String[] args) {
//会调用内部嵌入的服务器代码
SpringApplication.run(App.class,args);
}
}
使用这种方式,其实的启动类必须放在资源的父级包下,才能自动扫描当前包和子包资源。因为无法自定义扫描路径了
3.看到以下就可以启动了
Tomcat started on port(s): 8080 (http) with context path ''
Started App in 2.969 seconds (JVM running for 3.796)
(六)访问本地网址
事实上是http://127.0.0.1/index(已经改为默认的80端口了)
三、创建配置文件
修改上下文路径和端口
Resource创建application.yml
server:
servlet:
context-path: /demo #上下文路径
port: 80 #端口号 http默认80 https默认443
访问http://127.0.0.1:80/demo/index(:80是默认的,直接省略了)
也可以不设上下文路径,只设端口号
server:
port: 80 #端口号 http默认80 https默认443
访问http://127.0.0.1:80/index(:80是默认的,直接省略了)
四、静态资源的访问
(一).html静态的请求
SpringBoot的要求,静态资源要放在resources下面的四个文件夹中:
static、public、resource、META-INF下的resources文件夹中
(二)测试
在resources下创建static,在这里放一个login.html
然后启动
访问http://127.0.0.1:8080/login.html(资源url(静态和动态))
(三)获取配置信息
在配置文件(application.yml)中定义某常量
com:
pageSize: 10 #每页大小
在程序(主函数)中
@RestController //@Controller(控制层的类)+@ResponseBody(把返回值都变成json,不再是视图)
public class IndexController {
//${pageSize}代表的是spel,spel是“spring表达式”的简称
@Value("${com.pageSize}")
//Integer是int,配置文件读取的值赋给pageSize
private Integer pageSize;
@RequestMapping("/index")
public String index(){
return "hello:"+pageSize;}
}
访问http://127.0.0.1/index
(四)面向对象封装
lombok插件
可以帮助简化开发
1.lombok
让编译器具备这个能力(idea)
setting
plugins
lombok 搜索
install
2.让项目具备这个能力
pom.xml文件中加入:
<!--lombok-->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
</dependency>
如果配置项特别多,使用起来麻烦,阅读性不好,可以面向对象的封装
创建文件com.qd.qddemo.config.MyConfig.java
@Component//会自动将“我”交给spring管理(主函数里面@Autowired使用)
public class Myconfig {
@Value("${com.pageSize}")
private Integer pageSize;
@Value("${com.pageSize1}")
private Integer pageSize1;
@Value("${com.pageSize2}")
private Integer pageSize2;
@Value("${com.pageSize3}")
private Integer pageSize3;
右键--->(生成)-->getter and setter-->选中四个-->确定
}
在主函数 IndexController1中
@RestController
public class IndexController1 {
@Autowired
private Myconfig myconfig;
@RequestMapping("/index1")
public String index(){
return "hello"+myconfig.getPageSize()+":"+myconfig.getPageSize1();
}
}
访问http://127.0.0.1/index1
五、编写过滤器
过滤器:可以过滤器所有请求和响应
搭建
(一)创建过滤器类
com.qd.qddemo.filter.MyFilter.java
@WebFilter(urlPatterns = {"/*"}) //声明过滤的请求规则
public class MyFilter implements Filter {
//所有请求都先进来,所有响应都会从我这儿出去
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
System.out.println("进入");
chain.doFilter(request,response); //放行
System.out.println("出去");
}
}
(二)在启动类中,进行开启
@SpringBootApplication
@ServletComponentScan //开启servlet相关的注解
public class App {
public static void main(String[] args) {
//会调用内部嵌入的服务器代码
SpringApplication.run(App.class,args);
}
}
(三)启动测试
http://127.0.0.1/index1
http://127.0.0.1/index
发现都会进入过滤器,然后出去
六、动态资源的访问
数据库 动态url
七、用户:发送请求
服务器:处理请求/响应数据
必须安装服务器软件tomcat
八、整合mybatis
mybatis:操作数据库的框架
无论什么框架,操作数据库,必须使用底层jdbc规范,对于操作mysql数据库,就必须导入mysql驱动
(一)导入数据库依赖
pom.xml中
<!--mybatis 依赖-->
<dependency>
<groupId>org.mybatis.spring.boot</groupId>
<artifactId>mybatis-spring-boot-starter</artifactId>
<version>2.2.1</version>
</dependency>
<!--mysql 驱动-->
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.46</version>
</dependency>
(二)配置数据库连接
application.yml文件中
####数据源配置####
spring:
datasource:
driver-class-name: com.mysql.jdbc.Driver
#8.x mysql驱动,位置可能 com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/test #mysql连接地址
username: root
password: 123456
####mybtis配置####
mybatis:
#映射文件地址
mapper-locations: classpath:com/qd/qddemo/mapper/*.xml
#定义类别名
type-aliases-package: com.qd.qddemo.entity
(三)创建实体类(数据库类)
(和数据库表一一对应,顾名思义,如表t_User,则类User)
创建com.qd.qddemo.entity.User.java文件
@Data
public class User {
private Integer id;
private String userName;
private String password;
}
(四)创建控制层
创建com.qd.qddemo.controller文件
@RestController
public class UserController {
@Autowired
private UserService userService;
@RequestMapping("/getUserById")
public User getUserById(Integer id){
//1.接受参数
//2.调用模型层(业务[业务逻辑 接口 实现] 持久[和数据库 打交道])
return userService.getUserById(id);
}
}
(五)创建业务层
创建com.qd.qddemo.service文件
@Service
public class UserService {
@Autowired
private UserMapper userMapper;
public User getUserById(Integer id){
return userMapper.getUserById(id);
}
}
(六)创建持久层
用于访问数据库
创建om.qd.qddemo.mapper.UserMapper接口
@Mapper
public interface UserMapper {
public User getUserById(Integer id);
}
(七)同文件夹下创建
UserMapper.xml//映射文件
名字要和mapper接口名字一致
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.qd.qddemo.mapper.UserMapper">
<select id="getUserById" resultType="User">
select * from t_user where id=#{id}
</select>
</mapper>
(八)启动类
@SpringBootApplication
@ServletComponentScan //开启servlet相关的注解
@MapperScan("com.qd.qddemo.mapper")
public class App {
public static void main(String[] args) {
//会调用内部嵌入的服务器代码
SpringApplication.run(App.class,args);
}
}
(九)启动
启动测试
报错,找不到映射文件
原因是编译器本身问题
解决:
附:在idea编译器中 会发生映射文件加载不进去的问题,原因是IDEA不会编译src/main/java中的xml文件。
解决方法就是在pom.xml中加以下配置,让编译器把src/main/java目录下的xml文件一同编译。
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.xml</include>
</includes>
</resource>
</resources>
</build>
*/
(十)访问本地网址
http://localhost/getUserBy Id?id=9
(十一)添加用户信息
控制层
@RequestMapping("/addUser")
public Integer addUser(User user){
return userService.addUser(user);
}
业务层
public Integer addUser(User user){
//先验证账号是否唯一
return userMapper.addUser(user);
}
持久层接口
public Integer addUser(User user);
映射文件
<insert id="addUser">
insert into t_user(userName,password) values(#{userName},#{password})
</insert>
(十二)访问本地网址
http://localhost/addUser?userName=cy1&password=cy1
http://localhost/addUser叫做url地址
?userName=cy1&password=cy叫做参数,参数与参数之间用与&符号隔开
(十二)注解开发
删除操作
@RequestMapping("delUserById")
public Integer delUserById(Integer id){
return userService.delUserById(id);
}
public Integer delUserById(Integer id){
return userMapper.delUserById(id);
}
public Integer delUserById(Integer id);
<delete id="delUserById">
delete from t_user where id=#{id}
</delete>
(十三)访问本地网址
http://localhost/delUserById?id=9
改成注解
@Delete("delete from t_user where id=#{id}")
public Integer delUserById(Integer id);
(十四)事务如何管理
只需要在业务层,并且“想”保证一致性的地方,加注解
@Transactional//事务管理 使下面函数和数据库的动作保持一致性保持一致性
public Integer addUser(User user){
//先验证账号是否唯一
Integer result=userMapper.addUser(user);
int a=9/0;
return result;
}
发现数据并没有进入数据库持久化,证明事务一致
(十五)修改用户信息
(十六)访问本地网址
localhost/updateUser?userName=ddd&password=ddd&id=4
九、项目设计
(一)以后资源分两种(动态 静态)
动态(非验证是否登陆*.do,验证是否登陆过*.action)
静态(login.html放行,否则都要验证是否登陆过)
(二)整体采用mvc架构
(三)XXXAdmin静态页面中文件导入resource.static
(四)访问本地网址
如果不显示的话可以吧target文件夹删掉,是编译之后的文件
(五)导入数据库表xxxadmin.sql,开发功能
十、登陆功能
需求:点击登陆时,验证账号密码不许为空,账号如果不存在,则提示密码是否正确,账号是否锁死
(一)创建映射文件
<mapper namespace="com.qd.qddemo.mapper.AdminMapper">
<!--通过管理员账户获取管理员信息-->
<select id="getAdminByAdminAccount" resultType="Admin">
select * from t_admin where adminAccount=#{adminAccount}
</select>
</mapper>
(二)创建持久层
@Mapper
public interface AdminMapper {
public Admin getAdminByAdminAccount(String adminAccount);
}
(三)创建业务层
@Service
public class AdminService {
@Autowired
private AdminMapper adminMapper;
/**
* 登陆
* 先根据账号查询,如果查询得到数据,则证明找好正确,否则账号错误
* 再根据查询得到的密码对比参数密码,如果一致,则密码正确,否则密码错误
* 再判断
* 0 账号不存在
* 1 密码错误
* 2 锁死
* 3 登录成功
* @param adminAccount
* @param password
* @return
*/
public Integer login(String adminAccount, String password) {
Admin admin = adminMapper.getAdminByAdminAccount(adminAccount);
if (admin == null) {
System.out.println("账号不正确");
return 0;
}
if (!admin.getPassword().equals(password)) {
System.out.println("密码不正确");
return 1;
}
if (admin.getStatus() != 0) {
System.out.println("账号已锁定");
return 2;
}
return 3;
}
}
(四)创建控制层
@RestController
public class AdminController {
@Autowired
private AdminService adminService;//阿里规范 驼峰标识
@RequestMapping("/login.do")
public Integer login(String adminAccount, String password){
return adminService.login(adminAccount,password);
}
}
(五)访问顺序:login.html-->login.do-->main.html
(六)访问:http://localhost/login.html
登陆界面
(七)访问:localhost/login.do?adminAccount=aaa&password=aaa
返回0123,账户密码是否正确
* 0 账号不存在
* 1 密码错误
* 2 锁死
* 3 登录成功
(八)访问:http://localhost/main.html
进不去,会被过滤器拦截
(九)网页输入账号密码后事件
网页文件
if(b){
//满足文本框要求,此时提交数据即可
//window.location.href="main.html";
$.ajax(
{//异步提交,局部刷新
url:"login.do",
type:"post",//提交方式,隐藏信息
data:{
adminAccount:adminAccount,
password:password
},
success:function (data){
if (data==0){
$("#msg").html("对不起,账号不存在");
}
else if (data==1){
$("#msg").html("对不起,密码不存在");
}
else if (data==2){
$("#msg").html("对不起,当前账号已被锁定");
}
else if (data==3){
//alert("登录成功!");
window.location.href="main.html";
}
}
}
)
}
十一、会话认证?
(一)过滤器
@WebFilter(urlPatterns = {"*.action","*.html"}) //声明过滤的请求规则
public class SessionFilter implements Filter {
//所有请求都先进来,所有响应都会从我这儿出去
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest) request;
String uri=req.getRequestURI();
System.out.println(uri);
if(uri.contains("/login.html")){
chain.doFilter(request,response);
}
}
}
(二)控制层
public Integer login(String adminAccount, String password, HttpSession session){
return adminService.login(adminAccount,password,session);
}
(三)业务层
public Integer login(String adminAccount, String password,HttpSession session)
//登录成功之后,记载标记,在会话对象中
session.setAttribute("admin",admin);
return 3;
(四)过滤器
@WebFilter(urlPatterns = {"*.action","*.html"}) //声明过滤的请求规则
public class SessionFilter implements Filter {
//所有请求都先进来,所有响应都会从我这儿出去
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req=(HttpServletRequest) request;
HttpServletResponse resp=(HttpServletResponse)response;
String uri=req.getRequestURI();
System.out.println(uri);
if(uri.contains("/login.html")){
chain.doFilter(request,response);
}else{
HttpSession session=req.getSession();
Admin admin=(Admin) session.getAttribute("admin");
if(admin==null){
resp.sendRedirect("/login.html");
}else {
chain.doFilter(request,response);//放行
}
}
}
}
(五)过滤器
resp.sendRedirect("/login.html?s=1");
(六)网页文件
$(function(){
var uri=window.location.search;//页面加载获取地址栏信息
var s=uri.split("=")[1];//字符串截取,按照等号切割 取到1,存到s上
if (s==1){
alert("对不起,请先登陆");
$("#msg").html("对不起,请先登陆");
}
十二、密码加密
不可逆的加密(哈希算法)
sha256(产物很大,比特币)
md5(产物很小)产生的密码长度
用户输入自己的密码,数据库是加密后的密码
(一)MD5导入
com.qd.qddemo.utils中粘贴MD5Utils文件
(二)业务层密码加密
添加用户方法中
这个方法还没写,不知道什么时候写上的
public Integer addAdmin(Admin admin){
Admin a=adminMapper.getAdminByAdminAccount(admin.getAdminAccount());
if(a!=null){
System.out.println("对不起,账号已存在");
return 2;
}
//密码加密
admin.setPassword(MD5Utils.getPwd(admin.getPassword()));
return adminMapper.addUser(admin);
}
}
(三)业务层输入密码中
if (!admin.getPassword().equals(MD5Utils.getPwd(password))) {
System.out.println("密码不正确");
return 1;
十三、密码错误上限
(一)定义密码错误上限
application.yml配置文件
passwordErrorCount: 3
(二)修改数据库表结构
添加用户的sql语言中
加入errorCount 注册值插入0即可
(三)修改实体类结构
增加private Integer errorCount;//密码错误上限的实体类
(四)修改业务逻辑
业务层
@Autowired
private AdminMapper adminMapper;
@Value("${passwordErrorCount}")//导入密码错误上限
public Integer passwordErrorCount;
if (!admin.getPassword().equals(MD5Utils.getPwd(password))) {
System.out.println("密码不正确");
//让错误次数+1
adminMapper.updatePasswordErrorCount(admin.getId());//根据id更新密码错误次数计数
return 1;
}
if (admin.getErrorCount() > passwordErrorCount) {
System.out.println("当日密码错误已到达上限,请明日再试!");
return 4;
}
(五)持久层
//根据id更新密码错误次数计数
public Integer updatePasswordErrorCount(Integer id);
(六)映射文件
<!--根据id更新密码错误计数-->
<update id="updatePasswordErrorCount">
update t_admin set errorCount=errorCount+1 where id=#{id}
</update>
(七)网页文件
else if (data==4 ){
$("#msg").html("当日密码错误已到达上限,请明日再试!");
}
(八)定时器
创建com.qd.qddemo.task.MyTask
加上@Component交给spring管理
(九)持久层
//初始化计数器
public Integer initPasswordErrorCount();
(十)映射文件
<!--初始化计数器-->
<update id="initPasswordErrorCount">
update t_admin set errorCount=0
</update>
(十一)启动类中
@EnableScheduling //开启定时器
十四、基本设置(基本信息)
(一)info.html中
<!--<div class="form-group">
<div class="label">
<label>角色:</label>
</div>
<div class="field">
<div class="jbxx" id="roleName">管理员</div>
</div>
</div>-->
删掉
第13行加上
<script>
$(function (){
$.ajax({
url:"getCurrentInfo.action",//请求地址
type:"type",//请求方式
dataType:"json",
success:function (data){
}
});
})
</script>
(二)控制层
@RequestMapping("/getCurrentInfo.action")
public Admin getCurrentInfo(HttpSession session){
//方案一:查询数据库得到 好处:信息实时准确 缺点:慢
//方案二:从会话对象中获取 好处:快 缺点:信息不准确
//这里暂时使用方案二
Admin admin=(Admin) session.getAttribute("admin");
return admin;
}
(三)info.html中
删掉假信息
<script>
$(function (){
$.ajax({
url:"getCurrentInfo.action",//请求地址
type:"type",//请求方式
dataType:"json",
success:function (data){
$("adminAccount").html(data.adminAccount);
$("adminName").html(data.adminName);
$("mail").html(data.mail);
$("phoneNo").html(data.phoneNo);
$("birthday").html(data.birthday);
$("createTime").html(data.createTime);
$("address").html(data.address);
}
});
})
</script>
(四)出生日期不带时分秒
resources/ststic/admin/AdminAdd.html文件中149行
把 HH:mm:ss删掉
十五、密码修改
(一)pass.html文件中
旧密码:oldpass
新密码:newpass
确认新密码:rnewpass
if(b){
//满足文本框要求,此时提交数据即可
$.ajax({
url:"updatePassword.action",
type:"post",
data:{
oldpass:oldpass,
newpass:newpass
}
})
}
(二)控制层
@RequestMapping("/updatepassword.action")
public Integer updatePassword(String oldpass,String,newpass){
}
(三)业务层
public Integer updatePassword(String oldpass,String,newpass,HttpSession session){
Admin admin=(Admin) session.getAttribute("admin");
if(!admin.getPassword().equals(MD5Utils.getPwd(oldpass))){
return 2;
}
}
(四)持久层
//密码更新 param是形参
public Integer updatePassword(@Param("id") Integer id,@Param("password") String newpass);
(五)映射文件
<update id="updatePassword">
update t_admin set password=#{password} where id = #{id}
</update>
(六)业务层
public Integer updatePassword(String oldpass,String,newpass,HttpSession session){
Admin admin=(Admin) session.getAttribute("admin");
if(!admin.getPassword().equals(MD5Utils.getPwd(oldpass))){
return 2;
}
return adminMapper.updatePassword(admin.getId(),MD5Utils.getPwd(newpass));
}
(七)控制层
@RequestMapping("/updatepassword.action")
public Integer updatePassword(String oldpass,String,newpass,HttpSession session){
return adminService.updatePassword(oldpass,newpass,session);
}
(八)pass.html文件中
if(b){
//满足文本框要求,此时提交数据即可
$.ajax({
url:"updatePassword.action",
type:"post",
data:{
oldpass:oldpass,
newpass:newpass
},
success:function (data){
if (data==0){
alert("修改失败");
}else if (data==1){
alert("修改成功");
}else if (data==2){
alert("原密码错误");
$("oldpass").val("");
$("oldPwdMsg").html("原密码错误");
}
}
})
}
(九)业务层
public Integer updatePassword(String oldpass,String,newpass,HttpSession session){
Admin admin=(Admin) session.getAttribute("admin");
if(!admin.getPassword().equals(MD5Utils.getPwd(oldpass))){
return 2;
}
Integer result = adminMapper.updatePassword(admin.getId(),MD5Utils.getPwd(newpass));
if (result==1){//修改成功,应该取出会话标记
//session.setAttribute("admin",null);
session.removeAttribute("admin");
}
return result;
}
(十)pass.html文件中
else if (data==1){
alert("修改成功");
window.top.location.href="login.html";
十六、虚拟路径
(一)创建config.MyConfig
@Configuration
public class Myconfig implements WebMvcConfigurer {
(二)右键-->生成-->实现方法-->addResourceHandlers
@Configuration
public class Myconfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
}
(三)注册虚拟路径
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/files/**") //虚拟访问路径 **代表所有资源都可以访问到
.addResourceLocations("file:D:/大学牲/大三上学期/期末课程设计培训/qddemo1/"); //前缀 虚拟路径对应的磁盘路径
}
十七、基本设置(信息修改)
(一)infoedit.html中
回显(查询)
58行
url:"headImgUpload.action?flag=headImgUpload",
改为
url:"fileImgUpload.action",
(二)头像上传
(三)控制层
//文件上传
@RequestMapping("/fileUpload.action")
public String fileUpload(@RequestParam("picture") MultipartFile file,,HttpSession session){//做文件上传的参数 名字picture映射为file
Admin admin=(Admin)session.getAttribute("admin");
File f=new File("D:\\大学牲\\大三上学期\\期末课程设计培训\\qddemo1"+admin.getAdminAccount()+".jpg");
file.transferTo(f);
return admin.getAdminAccount()+".jpg";
}
(四)配置文件
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
(五)修改其他普通文本数据
url:"updateAdmin.action?flag=updateAdmin",
改为
url:"updateCurrentAdmin.action",
(六)控制层
@RequestMapping("/updateCurrentAdmin.action")
public Integer updateCurrentAdmin(Admin admin){
}
(七)业务层
public Integer updateCurrentAdmin(Admin admin){
}
(八)持久层
public String updateCurrentAdmin(Admin admin);
(九)映射文件
<update id="updateAdmin">
update t_admin set adminName=#{adminName},main=#{main},phoneNo=#{phoneNO},birthday=#{birthday},address=#{address},fileName=#{fileName} where id={id}
</update>
(十)infoedit.html中
//在修改其他普通文本数据
$.ajax({
url:"updateCurrentAdmin.action",
type:"post",
data:$("#form1").serialize(), //利用表单携带参数,但不提交请求
success:function(data){
if (data==1){
alert("修改成功");
window.top.location.reload(); //让最外层刷新,目的是让头像刷新显示
}else if(data==0){
alert("修改失败")
}
//window.top.location.reload(); 让最外层刷新,目的是让头像刷新显示
}
});
十八、数据查询以及分页
(一)AdminManage.html文件中
18行
<!--页面加载函数-->
$.ajax({
url:"../searchAllAdmin.action",//回到上级目录
type:"post",
dataType:"json",
success:function (data){
}
})
(二)控制层
@RequestMapping("/searchAllAdmin.action")
public PageInfo<Admin> searchAllAdmin(){
}
(三)引入pagehelper插件
配置文件中
<!--pagehelper 它是mysql第三方常见的分页插件-->
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper-spring-boot-starter</artifactId>
<version>1.2.5</version>
</dependency>
(四)pagehelper的设置
###pagehelper设置
###方言
pagehelper:
helper-dialect: mysql
###开启分页合理化 当前页<1,会默认查询第一页 当前页>总页数,会默认查询最后一页
reasonable: true
###每页大小
pageSize: 3
(五)业务层
public PageInfo<Admin> searchAllAdmin(Integer pageIndex){
PageHelper.startPage(pageIndex,pageSize);//插件自动帮助分页
}
(六)持久层
public List<Admin> searchAllAdmin();
(七)映射文件
<select id="searchAllAdmin" resultType="Admin">
select * from t_admin
</select>
(八)业务层
public PageInfo<Admin> searchAllAdmin(Integer pageIndex){
PageHelper.startPage(pageIndex,pageSize);//插件自动帮助分页
List<Admin> adminList=adminMapper.searchAllAdmin();
return new PageInfo<Admin>(adminList);
}
(九)控制层
@RequestMapping("/searchAllAdmin.action")
public PageInfo<Admin> searchAllAdmin(Integer pageIndex){
return adminService.searchAllAdmin(pageIndex);
}
(十)AdminManage.html中
<!-表里的一组数据->注释掉,好像是两组
<!--页面加载函数-->
$.ajax({
url:"../searchAllAdmin.action",//回到上级目录
type:"post",
dataType:"json",
success:function (data){
//循环
$.each(data.list,function (key,admin){
var str="<tr>";
str+="<td><input type=\"checkbox\" name=\"id\" value='"+admin.id+"' />(key+1)</td>";
str+="<td>"+admin.adminAccount+"</td>\n" +
" <td>"+admin.adminName+"</td>\n" +
" <td>\n" +
" <input class=\"onoff\" value='"+admin.id+"' type=\"checkbox\" "+(admin.status==0?"":"checked")+" οnclick=\"lockAdmin(this);\"/>\n" +
" </td>\n" +
" <td>\n" +
" <div class=\"button-group\">\n" +
" <a class=\"button border-main icon-search\" style=\"padding:3px 3px;\" href='AdminView.html?id="+admin.id+"'>详情</a>\n" +
" <a class=\"button border-main\" style=\"padding:3px 3px;\" href='AdminEdit.html?id="+admin.id+"'><span class=\"icon-edit\"></span> 修改</a>\n" +
" <a class=\"button border-main\" style=\"padding:3px 3px;\" href=\"javascript:void(0)\" οnclick=\"return del("+admin.id+");\"><span class=\"icon-trash-o\"></span> 删除</a>\n" +
" </div>\n" +
" </td>\n" +
" </tr>"
})
}
})
&spm=1001.2101.3001.5002&articleId=149336839&d=1&t=3&u=9df0d1cdb3f144e5a6fb3f90e2f8e5a2)
1万+

被折叠的 条评论
为什么被折叠?



