文章目录
- ConfigRegistCenter.java
- MybatisplusConfig.java
- CustomerController.java
- ReceiveAddressJsonController.java
- Customer.java
- LoginCustomer.java
- ReceiveAddress.java
- JwtInterceptor.java
- CustomerMapper.java
- ReceiveAddressMapper.java
- CustomerServiceImpl.java
- ReceiveAddressServiceImpl.java
- ICustomerService.java
- IReceiveAddressService.java
- JwtUtil.java
- ServerResult.java
- ServletInitializer.java
- SpringbootDemoApplication.java
- customer.sql
- receive_address.sql
- CustomerMapper.xml
- ReceiveAddressMapper.xml
- application.yaml
- ajax_demo1.js(忽略)
- ajax_jquery_demo1.js
- getCustomerInfo_logout.js
- web.xml
- ajax_demo1.jsp(忽略)
- ajax_jquery_demo1.jsp
- index.jsp
- login.jsp
- pom.xml
ConfigRegistCenter.java
package com.example.config;import com.example.interceptor.JwtInterceptor;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.*;@Configuration
@EnableWebMvc
public class ConfigRegistCenter implements WebMvcConfigurer {public void addInterceptors(InterceptorRegistry registry){registry.addInterceptor(new JwtInterceptor()).addPathPatterns("/**") .excludePathPatterns("/login.jsp","/regist.jsp","/customer/login","/customer/regist").excludePathPatterns("/product/**").excludePathPatterns("/index.jsp","ajax_jquery_demo1.jsp").excludePathPatterns("/js/**","/css/**","/images/**");}@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/**").addResourceLocations("/","classpath:webapp/");WebMvcConfigurer.super.addResourceHandlers(registry);}}
MybatisplusConfig.java
package com.example.config;import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;@Configuration
public class MybatisplusConfig {@Beanpublic MybatisPlusInterceptor mybatisPlusInterceptor(){MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();PaginationInnerInterceptor paginationInnerInterceptor = new PaginationInnerInterceptor();paginationInnerInterceptor.setDbType(DbType.MYSQL);paginationInnerInterceptor.setOverflow(true);interceptor.addInnerInterceptor(paginationInnerInterceptor);return interceptor;}}
CustomerController.java
package com.example.controller;import com.example.entity.Customer;
import com.example.entity.LoginCustomer;
import com.example.service.ICustomerService;
import com.example.util.JwtUtil;
import com.example.util.ServerResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("customer")
public class CustomerController {@Autowiredprivate ICustomerService customerService;@PostMapping("login")@ResponseBodypublic ServerResult login(String custName,String custPassword){return customerService.login(custName, custPassword);}
@GetMapping("getInfoByToken")@ResponseBodypublic ServerResult getInfoByToken(HttpServletRequest request){String token = request.getHeader("token");LoginCustomer loginCustomer = JwtUtil.parseToken(token);if(loginCustomer !=null)return ServerResult.getSuccess(loginCustomer);return ServerResult.getFail("无效的token,没有获得到登录用户的信息 ");}
}
ReceiveAddressJsonController.java
package com.example.controller;import com.example.entity.LoginCustomer;
import com.example.entity.ReceiveAddress;
import com.example.service.IReceiveAddressService;
import com.example.util.JwtUtil;
import com.example.util.ServerResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.*;import javax.servlet.http.HttpServletRequest;
import java.time.LocalDateTime;@RestController
@RequestMapping("/receiveAddressJSon")
public class ReceiveAddressJsonController {@Autowiredprivate IReceiveAddressService addressService;@GetMapping("{addrId}") public ServerResult getById(@PathVariable("addrId") Integer arrId){return addressService.getById(arrId);}@GetMapping("")public ServerResult getAll(){int custId = 1;return addressService.getAll(custId);}@PostMappingpublic ServerResult save(ReceiveAddress receiveAddress,HttpServletRequest request){String token = request.getHeader("token");LoginCustomer loginCustomer = JwtUtil.parseToken(token);Integer customerId = loginCustomer.getCustId();System.out.println("ReceiveAddressJsonController中 save address 解析出来的用户id是:" + customerId);receiveAddress.setCustId(customerId);receiveAddress.setStatus(1);receiveAddress.setVersion(1);receiveAddress.setCreateTime(LocalDateTime.now());return addressService.save(receiveAddress);}@DeleteMapping("/{addrId}")public ServerResult remove(@PathVariable("addrId") Integer addressId){System.out.println("删除方法");return addressService.removeById(addressId);}@PutMappingpublic ServerResult update(@RequestBody ReceiveAddress receiveAddress){System.out.println(receiveAddress);System.out.println("put controller");return addressService.updateById(receiveAddress);}@GetMapping("page/{pageNum}")public ServerResult getByPage(@PathVariable("pageNum") Integer pageNum,HttpServletRequest request){String token = request.getHeader("token");LoginCustomer loginCustomer = JwtUtil.parseToken(token);if(loginCustomer != null){Integer customerId = loginCustomer.getCustId();return addressService.getByPage(pageNum,customerId);}else{return ServerResult.getFail("登录用户无效");}}
}
Customer.java
package com.example.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;import java.io.Serializable;
import java.time.LocalDate;
import java.time.LocalDateTime;
@TableName("customer")
public class Customer implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "cust_id", type = IdType.AUTO)private Integer custId;private String custName;private Long custTelno;private String custGender;private LocalDate custBirth;private Integer status;private Integer version;private LocalDateTime createTime;private LocalDateTime updateTime;private String custPassword;public Integer getCustId() {return custId;}public void setCustId(Integer custId) {this.custId = custId;}public String getCustName() {return custName;}public void setCustName(String custName) {this.custName = custName;}public Long getCustTelno() {return custTelno;}public void setCustTelno(Long custTelno) {this.custTelno = custTelno;}public String getCustGender() {return custGender;}public void setCustGender(String custGender) {this.custGender = custGender;}public LocalDate getCustBirth() {return custBirth;}public void setCustBirth(LocalDate custBirth) {this.custBirth = custBirth;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public Integer getVersion() {return version;}public void setVersion(Integer version) {this.version = version;}public LocalDateTime getCreateTime() {return createTime;}public void setCreateTime(LocalDateTime createTime) {this.createTime = createTime;}public LocalDateTime getUpdateTime() {return updateTime;}public void setUpdateTime(LocalDateTime updateTime) {this.updateTime = updateTime;}public String getCustPassword() {return custPassword;}public void setCustPassword(String custPassword) {this.custPassword = custPassword;}@Overridepublic String toString() {return "Customer{" +"custId=" + custId +", custName=" + custName +", custTelno=" + custTelno +", custGender=" + custGender +", custBirth=" + custBirth +", status=" + status +", version=" + version +", createTime=" + createTime +", updateTime=" + updateTime +", custPassword=" + custPassword +"}";}
}
LoginCustomer.java
package com.example.entity;
public class LoginCustomer {private Integer custId;private String custName;public LoginCustomer(){}public LoginCustomer(Integer custId, String custName) {this.custId = custId;this.custName = custName;}public Integer getCustId() {return custId;}public void setCustId(Integer custId) {this.custId = custId;}public String getCustName() {return custName;}public void setCustName(String custName) {this.custName = custName;}
}
ReceiveAddress.java
package com.example.entity;import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import java.io.Serializable;
import java.time.LocalDateTime;
@TableName("receive_address")
public class ReceiveAddress implements Serializable {private static final long serialVersionUID = 1L;@TableId(value = "addr_id", type = IdType.AUTO)private Integer addrId;private Long receiveUserTelno;private String receiveUsername;private Integer custId;private String addrProvince;private String addrCity;private String addrArea;private String addrStreet;private String addrDetail;private Integer status;private Integer version;private LocalDateTime createTime;private LocalDateTime updateTime;public Integer getAddrId() {return addrId;}public void setAddrId(Integer addrId) {this.addrId = addrId;}public Long getReceiveUserTelno() {return receiveUserTelno;}public void setReceiveUserTelno(Long receiveUserTelno) {this.receiveUserTelno = receiveUserTelno;}public String getReceiveUsername() {return receiveUsername;}public void setReceiveUsername(String receiveUsername) {this.receiveUsername = receiveUsername;}public Integer getCustId() {return custId;}public void setCustId(Integer custId) {this.custId = custId;}public String getAddrProvince() {return addrProvince;}public void setAddrProvince(String addrProvince) {this.addrProvince = addrProvince;}public String getAddrCity() {return addrCity;}public void setAddrCity(String addrCity) {this.addrCity = addrCity;}public String getAddrArea() {return addrArea;}public void setAddrArea(String addrArea) {this.addrArea = addrArea;}public String getAddrStreet() {return addrStreet;}public void setAddrStreet(String addrStreet) {this.addrStreet = addrStreet;}public String getAddrDetail() {return addrDetail;}public void setAddrDetail(String addrDetail) {this.addrDetail = addrDetail;}public Integer getStatus() {return status;}public void setStatus(Integer status) {this.status = status;}public Integer getVersion() {return version;}public void setVersion(Integer version) {this.version = version;}public LocalDateTime getCreateTime() {return createTime;}public void setCreateTime(LocalDateTime createTime) {this.createTime = createTime;}public LocalDateTime getUpdateTime() {return updateTime;}public void setUpdateTime(LocalDateTime updateTime) {this.updateTime = updateTime;}@Overridepublic String toString() {return "ReceiveAddress{" +"addrId=" + addrId +", receiveUserTelno=" + receiveUserTelno +", receiveUsername=" + receiveUsername +", custId=" + custId +", addrProvince=" + addrProvince +", addrCity=" + addrCity +", addrArea=" + addrArea +", addrStreet=" + addrStreet +", addrDetail=" + addrDetail +", status=" + status +", version=" + version +", createTime=" + createTime +", updateTime=" + updateTime +"}";}
}
JwtInterceptor.java
package com.example.interceptor;import com.example.util.JwtUtil;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class JwtInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("登录检查拦截器正在拦截URL>>>"+request.getRequestURI());String token = request.getHeader("token");if(token == null || token.equals("")){System.out.println("登录检查拦截器正在拦截,没有获得到token");response.sendRedirect(request.getContextPath()+"/login.jsp");return false;}else {System.out.println("登录检查拦截器正在拦截,获得到的token:"+token);if (JwtUtil.checkToken(token)){return true;}else {System.out.println("被拦截了,无效token");return false;}}
}}
CustomerMapper.java
package com.example.mapper;import com.example.entity.Customer;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface CustomerMapper extends BaseMapper<Customer> {}
ReceiveAddressMapper.java
package com.example.mapper;import com.example.entity.ReceiveAddress;
import com.baomidou.mybatisplus.core.mapper.BaseMapper;
public interface ReceiveAddressMapper extends BaseMapper<ReceiveAddress> {}
CustomerServiceImpl.java
package com.example.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.entity.Customer;
import com.example.entity.LoginCustomer;
import com.example.entity.ReceiveAddress;
import com.example.mapper.CustomerMapper;
import com.example.service.ICustomerService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.util.JwtUtil;
import com.example.util.ServerResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
@Service
public class CustomerServiceImpl extends ServiceImpl<CustomerMapper, Customer> implements ICustomerService {@Autowiredprivate CustomerMapper customerMapper;@Overridepublic ServerResult login(String custName, String custPwd){QueryWrapper<Customer> wrapper = new QueryWrapper<>();wrapper.eq("cust_name",custName).eq("cust_password",custPwd);Customer customer = customerMapper.selectOne(wrapper);System.out.println(customer.getCustId());System.out.println(customer.getCustName());System.out.println(customer.getCustPassword());if(customer != null) { String token = JwtUtil.createToken(customer.getCustId(),customer.getCustName());return ServerResult.loginSuccess(token);}return ServerResult.loginFail(null);}
}
ReceiveAddressServiceImpl.java
package com.example.service.impl;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.example.entity.ReceiveAddress;
import com.example.mapper.ReceiveAddressMapper;
import com.example.service.IReceiveAddressService;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.example.util.ServerResult;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;import java.time.LocalDateTime;
import java.util.List;
@Service
public class ReceiveAddressServiceImpl implements IReceiveAddressService {@Autowiredprivate ReceiveAddressMapper addressMapper;@Overridepublic ServerResult getById(Integer addressId) {ReceiveAddress address = addressMapper.selectById(addressId);if(address != null){return ServerResult.getSuccess(address);}return ServerResult.getFail(null);}@Overridepublic ServerResult getAll(Integer customerId){QueryWrapper<ReceiveAddress> wrapper = new QueryWrapper<>();wrapper.eq("cust_id",customerId).eq("status",1);List<ReceiveAddress> addressList = addressMapper.selectList(wrapper);if(addressList == null || addressList.size()==0)return ServerResult.getFail("暂无收件地址");return ServerResult.getSuccess(addressList);}public ServerResult save(ReceiveAddress receiveAddress){receiveAddress.setStatus(1);receiveAddress.setVersion(1);receiveAddress.setCreateTime(LocalDateTime.now());System.out.println("尚未添加,从页面拿到的收件地址是:" + receiveAddress);int rows = addressMapper.insert(receiveAddress);if(rows > 0){System.out.println("添加成功后:" + receiveAddress);return ServerResult.updateSuccess(receiveAddress);}return ServerResult.updateFail(receiveAddress);}@Overridepublic ServerResult removeById(Integer addressId) {ReceiveAddress address = addressMapper.selectById(addressId);address.setStatus(0);address.setVersion(address.getVersion() + 1);int rows = addressMapper.updateById(address);if(rows > 0)return ServerResult.updateSuccess(address);return ServerResult.updateFail(address);}@Overridepublic ServerResult updateById(ReceiveAddress address) {System.out.println("put service");int oldVersion = addressMapper.selectById(address.getAddrId()).getVersion();address.setUpdateTime(LocalDateTime.now());address.setVersion(oldVersion+1);int rows = addressMapper.updateById(address);if(rows > 0){return ServerResult.updateSuccess(address);}return ServerResult.updateFail(address);}@Overridepublic ServerResult getByPage(Integer pageNum,Integer customerId) {QueryWrapper<ReceiveAddress> wrapper = new QueryWrapper<>();wrapper.eq("cust_id",customerId).eq("status",1);Page<ReceiveAddress> page = new Page<>(pageNum,3);page = addressMapper.selectPage(page,wrapper);if (page.getRecords().size() > 0){return ServerResult.getSuccess(page);}return ServerResult.getFail(page);}@Overridepublic ServerResult getByCustId(Integer custId) {QueryWrapper<ReceiveAddress> queryWrapper = new QueryWrapper<>();queryWrapper.eq("cust_id",custId);List<ReceiveAddress> receiveAddressList = addressMapper.selectList(queryWrapper);if(receiveAddressList.size() >0)return ServerResult.getSuccess(receiveAddressList);return ServerResult.getFail(null);}}
ICustomerService.java
package com.example.service;import com.example.entity.Customer;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.util.ServerResult;
public interface ICustomerService extends IService<Customer> {public ServerResult login(String custName,String custPwd);}
IReceiveAddressService.java
package com.example.service;import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.example.entity.ReceiveAddress;
import com.baomidou.mybatisplus.extension.service.IService;
import com.example.util.ServerResult;import java.util.List;
public interface IReceiveAddressService {public ServerResult getById(Integer addressId);public ServerResult getAll(Integer customerId);public ServerResult save(ReceiveAddress receiveAddress);public ServerResult removeById(Integer addressId);public ServerResult updateById(ReceiveAddress address);public ServerResult getByPage(Integer pageNum,Integer customerId);public ServerResult getByCustId(Integer custId);}
JwtUtil.java
package com.example.util;import io.jsonwebtoken.*;
import org.springframework.boot.autoconfigure.security.oauth2.resource.OAuth2ResourceServerProperties;import java.util.Date;
import java.util.HashMap;
import java.util.Map;
import com.example.entity.LoginCustomer;public class JwtUtil {private static final String jwtToken = "dahkgag7*$";private static long expireTime = 1000*60*60*24;public static String createToken(Integer customerId,String customerName){Map<String,Object> claims = new HashMap<>();claims.put("customerId",customerId);claims.put("customerName",customerName);JwtBuilder jwtBuilder = Jwts.builder().signWith(SignatureAlgorithm.HS256,jwtToken).setClaims(claims).setIssuedAt(new Date()).setExpiration(new Date(System.currentTimeMillis()+expireTime));String token = jwtBuilder.compact();return token;}public static boolean checkToken(String token){if(token != null && !token.equals("")){try {Jwt parse = Jwts.parser().setSigningKey(jwtToken).parseClaimsJws(token);return true;}catch (ExpiredJwtException e){System.out.println("token已经过期了");return false;} catch (Exception e) {System.out.println("无效的token");return false;}}elsereturn false;}public static LoginCustomer parseToken(String token){if(token != null && !token.equals("")) {try {Jwt parse = Jwts.parser().setSigningKey(jwtToken).parseClaimsJws(token);Map<String,Object> map = (Map<String, Object>)parse.getBody();if(map != null){Integer custId = (Integer)map.get("customerId");String custName = (String)map.get("customerName");LoginCustomer loginCustomer = new LoginCustomer(custId,custName);System.out.println("获得到的登录用户的信息是:" + loginCustomer);return loginCustomer;}else{System.out.println("获得到的登录用户的信息失败");return null;}} catch (Exception e){e.printStackTrace();return null;}}elsereturn null;}}
ServerResult.java
package com.example.util;public class ServerResult {private int code;private String msg;private Object data;public static ServerResult getSuccess(Object data){return new ServerResult(200,"查询成功",data);}public static ServerResult getFail(Object data){return new ServerResult(201,"查询失败",data);}public static ServerResult updateSuccess(Object data){return new ServerResult(200,"处理成功",data);}public static ServerResult updateFail(Object data){return new ServerResult(201,"处理失败",data);}public static ServerResult loginSuccess(Object data){return new ServerResult(200,"登录成功",data);}public static ServerResult loginFail(Object data){return new ServerResult(201,"登失败",data);}public ServerResult() {}public ServerResult(int code, String msg, Object data) {this.code = code;this.msg = msg;this.data = data;}public int getCode() {return code;}public void setCode(int code) {this.code = code;}public String getMsg() {return msg;}public void setMsg(String msg) {this.msg = msg;}public Object getData() {return data;}public void setData(Object data) {this.data = data;}@Overridepublic String toString() {return "ServerResult{" +"code=" + code +", msg='" + msg + '\'' +", data=" + data +'}';}
}
ServletInitializer.java
package com.example;import org.springframework.boot.builder.SpringApplicationBuilder;
import org.springframework.boot.web.servlet.support.SpringBootServletInitializer;public class ServletInitializer extends SpringBootServletInitializer {@Overrideprotected SpringApplicationBuilder configure(SpringApplicationBuilder application) {return application.sources(SpringbootDemoApplication.class);}}
SpringbootDemoApplication.java
package com.example;import org.apache.ibatis.annotations.Mapper;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;@SpringBootApplication
@MapperScan("com.example.mapper")
public class SpringbootDemoApplication {public static void main(String[] args) {SpringApplication.run(SpringbootDemoApplication.class, args);}}
customer.sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `customer`;
CREATE TABLE `customer` (`cust_id` int(0) NOT NULL AUTO_INCREMENT,`cust_name` varchar(50) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`cust_telno` bigint(0) NOT NULL,`cust_gender` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,`cust_birth` date NULL DEFAULT NULL,`status` int(0) NULL DEFAULT NULL COMMENT '状态',`version` int(0) NULL DEFAULT NULL COMMENT '版本号用于做乐观锁',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '数据添加的时间',`update_time` datetime(0) NULL DEFAULT NULL COMMENT '数据修改时间',`cust_password` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,PRIMARY KEY (`cust_id`) USING BTREE,UNIQUE INDEX `cust_telno`(`cust_telno`) USING BTREE
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO `customer` VALUES (1, 'smith', 1849430033, 'M', '2000-01-01', 1, 1, '2023-08-11 13:39:30', NULL, '123456');
INSERT INTO `customer` VALUES (2, 'allen', 13771940583, 'F', '2001-05-01', 1, 1, '2023-07-31 13:40:09', NULL, '123456');SET FOREIGN_KEY_CHECKS = 1;
receive_address.sql
SET NAMES utf8mb4;
SET FOREIGN_KEY_CHECKS = 0;
DROP TABLE IF EXISTS `receive_address`;
CREATE TABLE `receive_address` (`addr_id` int(0) NOT NULL AUTO_INCREMENT,`receive_user_telno` bigint(0) NULL DEFAULT NULL,`receive_username` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NULL DEFAULT NULL,`cust_id` int(0) NULL DEFAULT NULL,`addr_province` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '地址的省份',`addr_city` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '地址的城市',`addr_area` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '地址的区域',`addr_street` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '地址的街道',`addr_detail` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '详细地址',`status` int(0) NULL DEFAULT NULL COMMENT '状态',`version` int(0) NULL DEFAULT NULL COMMENT '版本号,用于做乐观锁',`create_time` datetime(0) NULL DEFAULT NULL COMMENT '数据添加的时间',`update_time` datetime(0) NULL DEFAULT NULL COMMENT '数据修改时间',PRIMARY KEY (`addr_id`) USING BTREE,INDEX `fk_address_customer`(`cust_id`) USING BTREE,CONSTRAINT `fk_address_customer` FOREIGN KEY (`cust_id`) REFERENCES `customer` (`cust_id`) ON DELETE RESTRICT ON UPDATE RESTRICT
) ENGINE = InnoDB AUTO_INCREMENT = 3 CHARACTER SET = utf8mb4 COLLATE = utf8mb4_0900_ai_ci ROW_FORMAT = Dynamic;
INSERT INTO `receive_address` VALUES (1, NULL, NULL, 1, '江苏省', '苏州市', '园区', '若水路', '若水路', 1, 1, '2023-08-11 13:47:02', NULL);
INSERT INTO `receive_address` VALUES (2, NULL, NULL, 1, '黑龙江', '大庆市', '市区', '育才路', '育才路', 1, 1, '2023-07-31 13:47:52', NULL);SET FOREIGN_KEY_CHECKS = 1;
CustomerMapper.xml
<?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.example.mapper.CustomerMapper"></mapper>
ReceiveAddressMapper.xml
<?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.example.mapper.ReceiveAddressMapper"></mapper>
application.yaml
server:servlet:context-path: /appport: 8080spring:datasource:driver-class-name: com.mysql.cj.jdbc.Driverurl: jdbc:mysql://localhost:3306/dict?useSSL=true&useUnicode=true&characterEncoding=utf-8&serverTimezone=Asia/Shanghaiusername: rootpassword: 123456mvc:view:prefix: / suffix: .jsp hiddenmethod:filter:enabled: true logging:file:path: d://logger level:com.example: debug
ajax_demo1js_1621">ajax_demo1.js(忽略)
document.querySelector(".getByIdBtn").onclick = function (){var xhr = new XMLHttpRequest();var url = "http://localhost:80/app/receiveAddressJSon/1"xhr.open("GET",url,true);xhr.send(null);xhr.onreadystatechange = function (){if(xhr.readyState == 4 && xhr.status == 200){var result = JSON.parse(xhr.responseText);if(result.code == 200){document.querySelector(".address_detail").style.display = "block";var username = result.data.receiveUsername;var userTelno = result.data.receiveUserTelnovar detailAddress = result.data.addrProvince + result.data.addrCity + result.data.addrArea + result.data.addrStreet + result.data.addrDetail;document.querySelector(".receive_username").innerText = username;document.querySelector(".receive_telno").innerText = userTelno;document.querySelector(".receive_detail_address").innerText = detailAddress;}else{document.querySelector(".address_no_data_info span").innerText = "暂无数据";}}else{console.log("请求响应失败");}}}
document.querySelector(".saveAddressBtn").onclick= function (){var xhr = new XMLHttpRequest();var url = "http://localhost:80/app/receiveAddressJson"xhr.open("POST",url,true);var receiveUsername = document.querySelector("#recipientName").value;var receiveUserTelno = document.querySelector("#phoneNumber").value;var province = document.querySelector("#province").value;var city = document.querySelector("#city").value;var district = document.querySelector("#district").value;var street = document.querySelector("#street").value;var address = document.querySelector("#address").value;var formData = "receiveUserTelno="+receiveUserTelno + "&receiveUsername="+receiveUsername +"&addrProvince="+province+"&addrCity="+city+"&addrArea="+district + "&addrStreet="+street+"&addrDetail="+address;console.log(formData)xhr.setRequestHeader("Content-type","application/x-www-form-urlencoded");xhr.send(formData); xhr.onreadystatechange = function (){if(xhr.status ==200 && xhr.readyState ==4) {console.log(xhr.responseText);let result = JSON.parse(xhr.responseText);if (result.code = 200) {document.querySelector(".saveMsg").innerText = "添加成功";} else {document.querySelector(".saveMsg").innerText = "添加失败";}}}
}
ajax_jquery_demo1js_1715">ajax_jquery_demo1.js
$(".getByIdBtn").click(function (){let addressId = 1;let url = "http://localhost:80/app/receiveAddressJSon/"+addressId;var token = localStorage.getItem("token");$.ajax({type: "get",url: url,headers: {'token': token},success: function (result) {console.log(result)console.log(result.code == 200)if (result.code == 200){$(".address_detail").show();$(".receive_username").text(result.data.receiveUsername);$(".receive_telno").text(result.data.receiveUserTelno);var detailAddress = result.data.addrProvince + result.data.addrCity + result.data.addrArea + result.data.addrStreet + result.data.addrDetail;$(".receive_detail_address").text(detailAddress);}else{$(".address_no_data_info").text("暂无数据");}}});});
$(".saveAddressBtn").click(function (){let url = "http://localhost:80/app/receiveAddressJSon/";let formData = $("#addressForm").serialize(); let token = localStorage.getItem("token");console.log(formData)console.log(token)$.ajax({type:"post",url:url,data:formData,headers:{'token': token},success:function (){$(".saveMsg").text("添加成功");},error:function (){$(".saveMsg").text("添加失败");}})
})$(".getMyAllAddressBtn").click(function (){getAddressByPage(1);
})function getAddressByPage(pageNum) {let url = "http://localhost:80/app/receiveAddressJSon/page/"+pageNum;let token = localStorage.getItem("token");$.ajax({type:"get",url:url,headers:{'token': token},success:function (result){let addressArray = result.data.records;var ulEle = $("#addressList");ulEle.html("");$(".page-information").html("");for (var i = 0; i < addressArray.length; i++) {var addrId = addressArray[i].addrId;var username = addressArray[i].receiveUsername;var telno = addressArray[i].receiveUserTelno;var detailAddress = addressArray[i].addrProvince + addressArray[i].addrCity + addressArray[i].addrArea + addressArray[i].addrStreet + addressArray[i].addrDetail;let liElement = '<li>\n' +' <div class="btn-container">\n' +' <form class="deleteForm" method="post" action="">\n' +' <input type="hidden" name="_method" value="DELETE">\n' +' <input type="hidden" name="addressId" value="' + addrId + '">' +' <input type="button" value="删除" class="delete-btn">\n' +' <input type="button" value="修改" class="update-btn">'+' </form>\n' +' </div>\n' +' <h3>' + username + '</h3>\n' +' <p>手机号: ' + telno + '</p>\n' +' <p>收件地址: ' + detailAddress + '</p>\n' +' </li>';ulEle.append(liElement);}var pageNum = result.data.current;var pages = result.data.pages;var total = result.data.total;var prePage = result.data.current-1;var nextPage = result.data.current+1;if(pageNum != 1) var prePageEle = '<a href="javascript:getAddressByPage('+prePage+')">上一页</a>';var pageEle = ' 当前是'+pageNum+' 页,共有 '+total+' 条记录,共有 '+pages+'页';if(pageNum != pages)var nextPageEle = '<a href="javascript:getAddressByPage('+nextPage+')">下一页</a>';$(".page-information").append(prePageEle).append(pageEle).append(nextPageEle);},error:function (){}})
}
$("#addressList").click(function (event) {event.preventDefault();var ele = event.target;if (ele.nodeName == 'INPUT') {if (ele.className == 'delete-btn') {if (window.confirm('你确定要删除这条收件地址记录?')) {var addressId = ele.previousElementSibling.value;removeAddress(addressId);}} else if (ele.className == 'update-btn') {if (window.confirm('你确定要修改这条收件地址记录?')) {var addressId = ele.previousElementSibling.previousElementSibling.value;console.log(addressId);getUpdatePage(addressId);}}}
});function removeAddress(addressId){$("deleteMsg").text("");let url = "http://localhost:80/app/receiveAddressJSon/"+addressId;let token = localStorage.getItem("token");$.ajax({type: "DELETE",url: url,headers: {'token': token},success: function () {$("deleteMsg").text("删除成功");getAddressByPage(1);},error:function (){$("deleteMsg").text("删除失败");}})}
function getUpdatePage(addressId) {var url = "http://localhost:80/app/receiveAddressJSon/"+addressId;let token = localStorage.getItem("token");$.ajax({type:"get",url:url,headers:{'token': token},success:function (result) {$('#addrId2').val(result.data.addrId);$('#recipientName2').val(result.data.receiveUsername);$('#phoneNumber2').val(result.data.receiveUserTelno);$('#district2').val(result.data.addrArea);$('#street2').val(result.data.addrStreet);$('#address2').val(result.data.addrDetail);var value = result.data.addrProvince;var $option = $('<option></option>').attr('value', value).text(value);$('#province2').prepend($option);var value2 = result.data.addrCity;var $option2 = $('<option></option>').attr('value', value2).text(value2);$('#city2').prepend($option2);},error:function (){}})}$(".updateBtn").click(function (){let url = "http://localhost:80/app/receiveAddressJSon";let token = localStorage.getItem("token");let form = $("#updateForm");let formData = {addrId: form.find("input[name='addrId']").val(),receiveUsername: form.find("input[name='receiveUsername']").val(),receiveUserTelno: form.find("input[name='receiveUserTelno']").val(),addrProvince: form.find("select[name='addrProvince']").val(),addrCity: form.find("select[name='addrCity']").val(),addrArea: form.find("input[name='addrArea']").val(),addrStreet: form.find("input[name='addrStreet']").val(),addrDetail: form.find("input[name='addrDetail']").val()};let jsonData = JSON.stringify(formData);$.ajax({type: "PUT",url: url,headers: {'Content-Type': 'application/json', 'token': token},data: jsonData, success: function () {getAddressByPage(1);},error:function (){}})})
getCustomerInfo_logout.js
loadLoginCustomerInfo();
function loadLoginCustomerInfo(){$(".login_customer_name").text("")$(".loginMsg").text("")let token = localStorage.getItem("token");console.log(token)let url = "http://localhost:80/app/customer/getInfoByToken"$.ajax({type: "get",url: url,headers: {'token': token},success:function (result){if(result.code == 200){$(".login_area").show();$(".login_customer_name").text(result.data.custName);}else{$(".login_area").hide();$(".loginMsg").text(result.data)}}})
}
$(".logoutBtn").click(function (){console.log("退出操作...")localStorage.removeItem("token");window.location.href="index.jsp"
});
$(".backToIndexBtn").click(function (){window.open("index.jsp")
});
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"version="4.0">
</web-app>
ajax_demo1jsp_2291">ajax_demo1.jsp(忽略)
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><title>Title</title>
</head>
<body>
<h1>1.ajax 异步请求:根据主键查询</h1>
<a href="javascript:void(0)" class="getByIdBtn">查询id=1的收件地址</a><div class="address_detail">收件人姓名:<span class="receive_username"></span><br>收件人手机号:<span class="receive_telno"></span><br>收件地址:<span class="receive_detail_address"></span><br></div><div class="address_no_data_info"><span></span>
</div><%--============================2. ajax 异步请求:添加收件地址=======================================================--%>
<h1>2. ajax 异步请求:添加收件地址</h1>
<form id="addressForm" method="post" action="${pageContext.request.contextPath}/receiveAddress"><label for="recipientName">收件人姓名:</label><input type="text" id="recipientName" name="receiveUsername" required> <br><label for="phoneNumber">收件人手机号:</label><input type="tel" id="phoneNumber" name="receiveUserTelno" required> <br><label for="province">省份:</label><select id="province" name="addrProvince" required><option value="">请选择省份</option><option value="北京">北京</option><option value="上海">上海</option><option value="天津">天津</option><option value="重庆">重庆</option><option value="河北">河北</option><option value="河南">河南</option><option value="湖南">湖南</option><option value="湖北">湖北</option><option value="四川">四川</option><option value="广东">广东</option></select> <br><label for="city">城市:</label><select id="city" name="addrCity" required><option value="">请选择城市</option></select> <br><label for="district">区域:</label><input type="text" id="district" name="addrArea" required> <br><label for="street">街道:</label><input type="text" id="street" name="addrStreet" required> <br><label for="address">详细地址:</label><input type="text" id="address" name="addrDetail" required> <br><input type="button" value="添加 " class="saveAddressBtn"/>
</form>
<span class="saveMsg"></span><script>// Cities data for each provincevar citiesData = {"北京": ["北京"],"上海": ["上海"],"天津": ["天津"],"重庆": ["重庆"],"河北": ["石家庄", "唐山", "保定"],"河南": ["郑州", "洛阳", "开封"],"湖南": ["长沙", "株洲", "湘潭"],"湖北": ["武汉", "黄石", "十堰"],"四川": ["成都", "绵阳", "乐山"],"广东": ["广州", "深圳", "东莞"]};// Function to populate cities based on selected provincefunction populateCities() {var provinceSelect = document.getElementById("province");var citySelect = document.getElementById("city");var selectedProvince = provinceSelect.value;// Clear existing city optionscitySelect.innerHTML = "<option value=''>Select City</option>";// Populate city options based on selected provinceif (selectedProvince in citiesData) {citiesData[selectedProvince].forEach(function(city) {var option = document.createElement("option");option.value = city;option.text = city;citySelect.appendChild(option);});}}// Event listener for province select changedocument.getElementById("province").addEventListener("change", populateCities);</script>
<script src="${pageContext.request.contextPath}/js/ajax_demo1.js"></script>
</body>
</html>
ajax_jquery_demo1jsp_2414">ajax_jquery_demo1.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>ajax-jquery-收件地址</title><script src="${pageContext.request.contextPath}/js/jquery-3.7.0.min.js"></script><script src="${pageContext.request.contextPath}/js/jquery.form.js"></script><style>.address_detail{display: none;}.login_area{display: none;}</style>
</head>
<body>
<div class="login_area">欢迎<span class="login_customer_name"></span>登录<a href="javascript:void(0)" class="logoutBtn">退出</a>
</div>
<span class="loginMsg"></span><a href="javascript:void(0)" class="backToIndexBtn">返回首页</a><%--============================1. ajax 异步请求:根据主键查询收件地址=======================================================--%>
<h1>1. ajax-jquery 异步请求:根据主键查询收件地址</h1>
<a href="javascript:void(0)" class="getByIdBtn">查询id=1的收件地址</a><div class="address_detail">收件人姓名:<span class="receive_username"></span> <br>收件人手机号:<span class="receive_telno"></span> <br>收件地址:<span class="receive_detail_address"></span> <br>
</div>
<div class="address_no_data_info"><span ></span>
</div><%--============================2. ajax 异步请求:添加收件地址=======================================================--%>
<h1>2. ajax-jquery 异步请求:添加收件地址</h1>
<form id="addressForm" method="post" ><label for="recipientName">收件人姓名:</label><input type="text" id="recipientName" name="receiveUsername" required> <br><label for="phoneNumber">收件人手机号:</label><input type="tel" id="phoneNumber" name="receiveUserTelno" required> <br><label for="province">省份:</label><select id="province" name="addrProvince" required><option value="">请选择省份</option><option value="北京">北京</option><option value="上海">上海</option><option value="天津">天津</option><option value="重庆">重庆</option><option value="河北">河北</option><option value="河南">河南</option><option value="湖南">湖南</option><option value="湖北">湖北</option><option value="四川">四川</option><option value="广东">广东</option></select> <br><label for="city">城市:</label><select id="city" name="addrCity" required><option value="">请选择城市</option></select> <br><label for="district">区域:</label><input type="text" id="district" name="addrArea" required> <br><label for="street">街道:</label><input type="text" id="street" name="addrStreet" required> <br><label for="address">详细地址:</label><input type="text" id="address" name="addrDetail" required> <br><input type="button" value="添加 " class="saveAddressBtn"/>
</form>
<span class="saveMsg"></span><%-- updateform表单 --%>
<form id="updateForm" method="post" ><input type="hidden" name="_method" value="PUT"><input type="hidden" id="addrId2" name="addrId" ><label for="recipientName2">收件人姓名:</label><input type="text" id="recipientName2" name="receiveUsername" required> <br><label for="phoneNumber2">收件人手机号:</label><input type="tel" id="phoneNumber2" name="receiveUserTelno" required> <br><label for="province2">省份:</label><select id="province2" name="addrProvince" required><option value=""></option><option value="北京">北京</option><option value="上海">上海</option><option value="天津">天津</option><option value="重庆">重庆</option><option value="河北">河北</option><option value="河南">河南</option><option value="湖南">湖南</option><option value="湖北">湖北</option><option value="四川">四川</option><option value="广东">广东</option></select> <br><label for="city2">城市:</label><select id="city2" name="addrCity" required><option value="">请选择城市</option></select> <br><label for="district2">区域:</label><input type="text" id="district2" name="addrArea" required> <br><label for="street2">街道:</label><input type="text" id="street2" name="addrStreet" required> <br><label for="address2">详细地址:</label><input type="text" id="address2" name="addrDetail" required> <br><input type="button" value="修改 " class="updateBtn"/>
</form>
<span class="updateMsg"></span><%-- 3.ajax异步请求,查询所有收件地址 --%>
<a href="javascript:void(0)" class="getMyAllAddressBtn">查询所有收件地址(分页)</a><%-- 数据信息 --%>
<ul class="address-list" id="addressList"></ul><ul class="update-list" id="updateList"></ul><%-- 页码信息--%>
<div class="page-information"></div><span class="deleteMsg"></span><%--省份城市下拉列表--%>
<script>// Cities data for each provincevar citiesData = {"北京": ["北京"],"上海": ["上海"],"天津": ["天津"],"重庆": ["重庆"],"河北": ["石家庄", "唐山", "保定"],"河南": ["郑州", "洛阳", "开封"],"湖南": ["长沙", "株洲", "湘潭"],"湖北": ["武汉", "黄石", "十堰"],"四川": ["成都", "绵阳", "乐山"],"广东": ["广州", "深圳", "东莞"]};// Function to populate cities based on selected provincefunction populateCities() {var provinceSelect = document.getElementById("province");var citySelect = document.getElementById("city");var selectedProvince = provinceSelect.value;// Clear existing city optionscitySelect.innerHTML = "<option value=''>Select City</option>";// Populate city options based on selected provinceif (selectedProvince in citiesData) {citiesData[selectedProvince].forEach(function(city) {var option = document.createElement("option");option.value = city;option.text = city;citySelect.appendChild(option);});}}// Event listener for province select changedocument.getElementById("province").addEventListener("change", populateCities);</script><script src="${pageContext.request.contextPath}/js/ajax_jquery_demo1.js"></script><script src="${pageContext.request.contextPath}/js/getCustomerInfo_logout.js"></script>
</body>
</html>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title><style>.login_area{display: none;}</style><script src="${pageContext.request.contextPath}/js/jquery-3.7.0.min.js"></script>
</head>
<body>
<h2>首页</h2>
<%--<a href="javascript:void(0)" class="getCustInfoBtn">获得当前用户的信息</a>--%><div class="login_area">欢迎<span class="login_customer_name"></span>登录<a href="javascript:void(0)" class="logoutBtn">退出</a>
</div>
<span class="loginMsg"></span><a href="javascript:void(0)" class="getMyAddressBtn">查看我的所有收件地址</a><%--<script>--%><%-- getCustInfo();--%><%-- /**--%>
<%-- * 获得用户信息--%>
<%-- */--%>
<%-- function getCustInfo(){--%>
<%-- var tokenStr = localStorage.getItem("token");--%>
<%-- var token = JSON.parse(tokenStr);--%>
<%-- console.log("从localStorage 中获得的token是:" + token);--%>
<%-- $.ajax({--%>
<%-- type: "get",--%>
<%-- url:"http://localhost:80/app/customer/info",--%>
<%-- headers: {'token': token},--%>
<%-- success: function (result) {--%>
<%-- console.log("获得当前用户的信息:" +result);--%>
<%-- if(result.code ==200) {--%>
<%-- var custId = result.data.custId;--%>
<%-- var custName = result.data.custName;--%>
<%-- console.log("custId:" + custId);--%>
<%-- console.log("custName:" + custName);--%><%-- // 显示用户登录信息--%>
<%-- $(".loginInfo").css("display","block");--%>
<%-- $(".custName").text(custName)--%>
<%-- }else if(result.code ==202){--%>
<%-- console.log("用户登录超时,请重新登录");--%>
<%-- window.location ="http://localhost:80/app/customer/login.jsp"--%>
<%-- }--%>
<%-- }--%>
<%-- })--%>
<%-- }--%>
<%-- $(".getCustInfoBtn").click(getCustInfo);--%><%-- // 用户退出--%>
<%-- $(".logoutBtn").click(logout);--%><%-- /**--%>
<%-- * 用户退出--%>
<%-- */--%>
<%-- function logout(){--%>
<%-- var tokenStr = localStorage.getItem("token");--%>
<%-- if(tokenStr!=null || tokenStr !=""){--%>
<%-- localStorage.removeItem("token");--%><%-- // 显示用户登录信息--%>
<%-- $(".loginInfo").css("display","none");--%>
<%-- $(".custName").text("")--%>
<%-- }--%>
<%-- }--%><%-- /***********************查看我的所有收件地址**********************************/--%>
<%-- $(".getMyAddressBtn").click(function (){--%>
<%-- var token = localStorage.getItem("token");--%><%-- $.ajax({--%>
<%-- type:"get",--%>
<%-- url:"http://localhost:80/app/receiveAddressJSon/all",--%>
<%-- headers: {'token': token},--%>
<%-- success:function (data){--%>
<%-- console.log(data)--%>
<%-- }--%>
<%-- })--%>
<%-- })--%><%--</script>--%>${result.data}<script src="${pageContext.request.contextPath}/js/getCustomerInfo_logout.js"></script>
</body>
</html>
login.jsp
<%--isELIgnored="false"--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<script src="./js/jquery-3.7.0.min.js" ></script><html>
<head><title>登录</title><script src="${pageContext.request.contextPath}/js/jquery-3.7.0.min.js" ></script>
</head>
<body>
<h2>用户登录</h2>
<form class="loginForm" method="post" >用户名:<input name="custName" class="custName" type="text" /><br>密码:<input name="custPassword" class="custPassword" type="password" /><br><input type="button" class="loginBtn" value="登录">
</form><span class="loginMsg"></span><script>$(".loginBtn").click(function (){var url = "http://localhost:80/app/customer/login";var formData = $(".loginForm").serialize();$.post(url,formData,function (result){console.log(result)if (result.code == 200){localStorage.setItem("token",result.data);//1保存tokenwindow.location.href = "http://localhost:80/app/ajax_jquery_demo1.jsp";//2跳转}else {$(".loginMsg").text(result.data);}})})// $(".loginBtn").click(function (){// $.ajax({// type:"post",// url:"http://localhost:80/app/customer/login",// data:{// custName:$(".custName").val(),// custPassword:$(".custPassword").val()// },// success:function (result){// console.log("result:" + result);// console.log("json result:" + JSON.stringify(result));//// if(result.code ==200) {// //保存信息到本地,里面都 token// var token = JSON.stringify(result.data);// console.log("登录后,得到的token:" + token);//// localStorage.setItem("token", token);// window.location.href = "./index.jsp";// }// }// })// })
</script>
</body>
</html>
pom.xml
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.7.6</version><relativePath/> </parent><groupId>com.example</groupId><artifactId>springboot_demo</artifactId><version>0.0.1-SNAPSHOT</version><packaging>war</packaging><name>springboot_demo</name><description>springboot_demo</description><properties><java.version>1.8</java.version></properties><dependencies><dependency><groupId>commons-codec</groupId><artifactId>commons-codec</artifactId><version>1.9</version></dependency><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.1</version></dependency><dependency><groupId>javax.servlet</groupId><artifactId>jstl</artifactId><version>1.2</version></dependency><dependency><groupId>taglibs</groupId><artifactId>standard</artifactId><version>1.1.0</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-tomcat</artifactId><scope>provided</scope></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.5.2</version></dependency><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-generator</artifactId><version>3.5.1</version></dependency><dependency><groupId>org.freemarker</groupId><artifactId>freemarker</artifactId><version>2.3.31</version></dependency></dependencies><build><plugins><plugin><groupId>org.springframework.boot</groupId><artifactId>spring-boot-maven-plugin</artifactId></plugin></plugins></build></project>