• JavaWeb 期末项目设计 业务逻辑与实现


    1.1 业务逻辑设计与实现

    业务逻辑层主要由控制层实现,需要实现的需求:

    登陆注册:RegisterController:

    package com.dpqq.springboot.web.controller;
    import com.dpqq.springboot.web.Entity.User;
    import com.dpqq.springboot.web.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import java.util.Map;
    @Controller
    public class RegisterController {
    @Autowired
    UserRepository userRepository;
    @PostMapping(value = "/register")
    public String register(@RequestParam("name") String name, String gender,
    @RequestParam("phone") String phone,
    @RequestParam("password") String password,
    Map<String,String> map){
    // 判断数据合法性
    if(name.length()>4 || name.isEmpty()){map.put("warning1","姓名小于4个字");}
    if(password.length()>16 || password.length()<8){map.put("warning2","密码8位到16位");}
    if(phone.length()!=11){map.put("warning3","手机号11位");}
    if(userRepository.existsByPhone(phone)){map.put("warning3","手机号已存在");}
    if(!isNumeric(phone)){map.put("warning3","手机号数字");}
    if(gender==null){map.put("warning4","性别不为空");}
    // 合法则设置用户信息并保存至数据库
    if(map.isEmpty()){
    User user = new User();
    user.setPassword(password);
    user.setPhone(phone);
    user.setName(name);
    user.setGender(gender);
    userRepository.save(user);
    return "login";
    }
    // 不合法返回注册页
    else{return "register";}

    }
    //判断字符串是否是数字函数
    public static boolean isNumeric(String str)
    {
    for (int i =0;i<str.length();i++)
    {
    if(!Character.isDigit(str.charAt(i)))
    {
    return false;
    }
    }
    return true;
    }
    }

    package com.dpqq.springboot.web.controller;


    import com.dpqq.springboot.web.Entity.User;
    import com.dpqq.springboot.web.repository.CardRepository;
    import com.dpqq.springboot.web.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;
    import javax.servlet.http.HttpSession;
    import java.util.Map;


    @Controller
    public class LoginController {
    @Autowired
    UserRepository userRepository;
    @Autowired
    CardRepository cardRepository;
    @PostMapping(value = "/user/login")
    public String login(@RequestParam("phone") String phone,
    @RequestParam("password") String password,
    Map<String,String> map, HttpSession session){
    // 判断数据合法性
    if(password.length()>16 || password.length()<8){map.put("warning2","密码8位到16位");}
    if(phone.length()!=11){map.put("warning1","手机号11位");}
    // 数据合法进一步判断,不合法返回登录页
    if(map.isEmpty()) {
    // 判断是否存在手机号密码匹配,存在即登陆可以登陆重定向至首页,不存在返回登录页
    if (userRepository.existsByPhoneAndPassword(phone, password)) {
    User user = userRepository.findByPhone(phone);
    // 登陆后就再session中存放用户信息
    session.setAttribute("loginUser",user);
    return "redirect:/";
    } else {
    map.put("msg", "用户名或密码错误!");
    return "login";
    }
    }
    else{return "login";}
    }
    }

    办卡:CardAddController:

    package com.dpqq.springboot.web.controller;

    import com.dpqq.springboot.web.Entity.Card;
    import com.dpqq.springboot.web.Entity.User;
    import com.dpqq.springboot.web.repository.CardRepository;
    import com.dpqq.springboot.web.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PostMapping;
    import org.springframework.web.bind.annotation.RequestParam;

    import javax.servlet.http.HttpSession;
    import java.util.Date;
    import java.util.Map;
    import java.util.UUID;
    @Controller // 表示这是一个控制器类
    public class CardAddController {
    @Autowired
    private CardRepository cardRepository;
    @Autowired
    private UserRepository userRepository;
    // @RequestMapping(
    // method = {RequestMethod.POST}
    //)
    @PostMapping(value = "/CardAdd")
    // 接受前台发送的数据
    public String CardAdd(@RequestParam("cardpassword") String cardpassword ,
    @RequestParam("phone") String phone ,
    @RequestParam("password") String password,
    Map<String,String> map ,
    HttpSession session){
    // 判断数据合法性
    if(cardpassword.length()>16 || cardpassword.length()<8){map.put("warning1","密码8位到16位");}
    if(password.length()>16 || password.length()<8){map.put("warning3","密码8位到16位");}
    if(phone.length()!=11){map.put("warning2","手机号11位");}
    // 合法则再数据库增加卡信息
    if(map.isEmpty()){
    // 通过输入的手机号和密码判断是否存在,否则返回申请页
    if(userRepository.existsByPhoneAndPassword(phone, password)){
    User user=new User();
    user=userRepository.findByPhone(phone);
    Card card=new Card();
    String CardNum=getUUID(); // 获取随机生成16位卡号
    // 设置用户和卡的信息,最后保存进数据库
    user.setCard(CardNum);
    card.setCardNum(CardNum);
    card.setCardpassword(cardpassword);
    card.setDate(new Date());
    card.setBalance(0);
    cardRepository.save(card);
    userRepository.save(user);
    // 添加用户卡信息到session中
    User loginUser = (User)session.getAttribute("loginUser");
    Card loginUserCard=cardRepository.findByCardNum(loginUser.getCard());
    session.setAttribute("loginUserCard",loginUserCard);
    map.put("CardNum",CardNum);
    return "ApplyCardSuccess";
    }
    else
    {
    map.put("msg","不存在此账户");
    return "CardApply";
    }
    }
    else {
    return "CardApply";
    }

    }
    //生成
    // 16位唯一性的订单号
    public static String getUUID(){
    //随机生成一位整数
    int random = (int) (Math.random()*9+1);
    String valueOf = String.valueOf(random);
    //生成uuid的hashCode值
    int hashCode = UUID.randomUUID().toString().hashCode();
    //可能为负数
    if(hashCode<0){
    hashCode = -hashCode;
    }
    String value = valueOf + String.format("%015d", hashCode);
    return value;
    }
    }

    存钱savemoneyController:

    package com.dpqq.springboot.web.controller;

    import com.dpqq.springboot.web.Entity.Card;
    import com.dpqq.springboot.web.Entity.User;
    import com.dpqq.springboot.web.repository.CardRepository;
    import com.dpqq.springboot.web.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;

    import javax.servlet.http.HttpSession;
    import java.util.Map;

    @Controller
    public class SaveMoneyController {
    @Autowired
    UserRepository userRepository;
    @Autowired
    CardRepository cardRepository;
    @GetMapping(value = "savemoney")
    public String savemoney(HttpSession session, Map<String,String> map){
    // 判断session中是否有用户信息,没有则不能存钱,返回首页
    if(session.getAttribute("loginUser")==null){return "/";}
    // 有用户信息进一步判断有没有办卡
    else{
    // 取出用户信息
    User user=(User)session.getAttribute("loginUser");
    // 判断办卡与否,没办卡跳转办卡页面,否则进入存钱页面
    if(user.getCard()==null){map.put("msg","请先办卡再存钱!"); return "CardApply";}
    else {
    Card card=cardRepository.findByCardNum(user.getCard());
    session.setAttribute("loginUserCard",card);
    return "savemoney" ;
    }
    }
    }
    @PostMapping(value = "/Tosavemoney")
    public String savemoney( String balance,Map<String,String> map,HttpSession session){
    // 判断数据合法性
    if(balance.isEmpty()){map.put("warning","金额不为空!"); }
    if(!isNumeric(balance)){map.put("warning","含数字以外字符!"); }
    if(map.isEmpty()){
    // 因为是从session中取登陆后的用户信息,所以无需判断数据库中是否存在要素,取出用户信息后直接与输入的账户卡号
    // 进行转账操作
    User user=(User)session.getAttribute("loginUser");
    // 获取用户信息中的卡号
    Card card=cardRepository.findByCardNum(user.getCard());
    // 设置卡的金额
    card.setBalance(card.getBalance()+Integer.parseInt(balance));
    // 保存进数据库,更新金额
    cardRepository.save(card);
    return "savemoneySuccess";
    }
    // 数据不合法返回存钱页
    else {return "savemoney";}

    }
    //判断字符串是否是数字函数
    public static boolean isNumeric(String str)
    {
    for (int i =0;i<str.length();i++)
    {
    if(!Character.isDigit(str.charAt(i)))
    {
    return false;
    }
    }
    return true;
    }
    }

    转账TranferAccountController:

    package com.dpqq.springboot.web.controller;

    import com.dpqq.springboot.web.Entity.Card;
    import com.dpqq.springboot.web.Entity.User;
    import com.dpqq.springboot.web.repository.CardRepository;
    import com.dpqq.springboot.web.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;

    import javax.servlet.http.HttpSession;
    import java.util.Map;

    @Controller
    public class SaveMoneyController {
    @Autowired
    UserRepository userRepository;
    @Autowired
    CardRepository cardRepository;
    @GetMapping(value = "savemoney")
    public String savemoney(HttpSession session, Map<String,String> map){
    // 判断session中是否有用户信息,没有则不能存钱,返回首页
    if(session.getAttribute("loginUser")==null){return "/";}
    // 有用户信息进一步判断有没有办卡
    else{
    // 取出用户信息
    User user=(User)session.getAttribute("loginUser");
    // 判断办卡与否,没办卡跳转办卡页面,否则进入存钱页面
    if(user.getCard()==null){map.put("msg","请先办卡再存钱!"); return "CardApply";}
    else {
    Card card=cardRepository.findByCardNum(user.getCard());
    session.setAttribute("loginUserCard",card);
    return "savemoney" ;
    }
    }
    }
    @PostMapping(value = "/Tosavemoney")
    public String savemoney( String balance,Map<String,String> map,HttpSession session){
    // 判断数据合法性
    if(balance.isEmpty()){map.put("warning","金额不为空!"); }
    if(!isNumeric(balance)){map.put("warning","含数字以外字符!"); }
    if(map.isEmpty()){
    // 因为是从session中取登陆后的用户信息,所以无需判断数据库中是否存在要素,取出用户信息后直接与输入的账户卡号
    // 进行转账操作
    User user=(User)session.getAttribute("loginUser");
    // 获取用户信息中的卡号
    Card card=cardRepository.findByCardNum(user.getCard());
    // 设置卡的金额
    card.setBalance(card.getBalance()+Integer.parseInt(balance));
    // 保存进数据库,更新金额
    cardRepository.save(card);
    return "savemoneySuccess";
    }
    // 数据不合法返回存钱页
    else {return "savemoney";}

    }
    //判断字符串是否是数字函数
    public static boolean isNumeric(String str)
    {
    for (int i =0;i<str.length();i++)
    {
    if(!Character.isDigit(str.charAt(i)))
    {
    return false;
    }
    }
    return true;
    }
    }

    销户CancellationController:

    package com.dpqq.springboot.web.controller;

    import com.dpqq.springboot.web.Entity.Card;
    import com.dpqq.springboot.web.Entity.User;
    import com.dpqq.springboot.web.repository.CardRepository;
    import com.dpqq.springboot.web.repository.UserRepository;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.GetMapping;
    import org.springframework.web.bind.annotation.PostMapping;

    import javax.servlet.http.HttpSession;
    import java.util.Map;

    @Controller
    public class SaveMoneyController {
    @Autowired
    UserRepository userRepository;
    @Autowired
    CardRepository cardRepository;
    @GetMapping(value = "savemoney")
    public String savemoney(HttpSession session, Map<String,String> map){
    // 判断session中是否有用户信息,没有则不能存钱,返回首页
    if(session.getAttribute("loginUser")==null){return "/";}
    // 有用户信息进一步判断有没有办卡
    else{
    // 取出用户信息
    User user=(User)session.getAttribute("loginUser");
    // 判断办卡与否,没办卡跳转办卡页面,否则进入存钱页面
    if(user.getCard()==null){map.put("msg","请先办卡再存钱!"); return "CardApply";}
    else {
    Card card=cardRepository.findByCardNum(user.getCard());
    session.setAttribute("loginUserCard",card);
    return "savemoney" ;
    }
    }
    }
    @PostMapping(value = "/Tosavemoney")
    public String savemoney( String balance,Map<String,String> map,HttpSession session){
    // 判断数据合法性
    if(balance.isEmpty()){map.put("warning","金额不为空!"); }
    if(!isNumeric(balance)){map.put("warning","含数字以外字符!"); }
    if(map.isEmpty()){
    // 因为是从session中取登陆后的用户信息,所以无需判断数据库中是否存在要素,取出用户信息后直接与输入的账户卡号
    // 进行转账操作
    User user=(User)session.getAttribute("loginUser");
    // 获取用户信息中的卡号
    Card card=cardRepository.findByCardNum(user.getCard());
    // 设置卡的金额
    card.setBalance(card.getBalance()+Integer.parseInt(balance));
    // 保存进数据库,更新金额
    cardRepository.save(card);
    return "savemoneySuccess";
    }
    // 数据不合法返回存钱页
    else {return "savemoney";}

    }
    //判断字符串是否是数字函数
    public static boolean isNumeric(String str)
    {
    for (int i =0;i<str.length();i++)
    {
    if(!Character.isDigit(str.charAt(i)))
    {
    return false;
    }
    }
    return true;
    }
    }

    1.2 表现层设计与实现

    表现层用thtmeleaf模板引擎,导入bootstrapwebjars,使用其中的css

     

    1.3 项目难点及解决方案

    问题报错1

    JPARepository中自动定义查询方法的驼峰命名不是十分理解深刻,只知道单词中间大写会变成下划线加小写,当我有一个字段中间有大写单词时,编写JPARepository自定义方法时报错。

    解决方案:

    我大概知道错误,就把实体类中字段改成小写,再把数据库表删除,重新启动则运行通过。

    问题难点2

    编写MvcConfig配置类时,在网上看到的时配置WebMvcConfigAdapter,但是我像实现这个接口是显示方法弃用。

    解决方案:

    尝试webmvcConfig实现,发现这个与WebMvcConfigAdapter可实现的方法一致,得到解决。

    1.4 典型代码片段与设计过程

    配置拦截器:

    package com.dpqq.springboot.web.component;

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    //配置拦截器,重写拦截器必要方法
    public class ApplyCardHandlerInterceptor implements HandlerInterceptor{
    @Override //重写方法
    // 重写预处理方法,返回值Boolean 通行与不通行
    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response,
    Object handler) throws Exception {
    // 从Session根据键“loginUser”取值,赋值给user
    Object user=request.getSession().getAttribute("loginUser");
    // 判断取值是否为空,为空则表示没有登陆,跳转回登录页,否则表示登陆了,放行
    if(user == null){
    request.setAttribute("msg","请先登陆");
    request.getRequestDispatcher("/login").forward(request,response);
    return false;
    }
    else{return true;}
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
    }

    MvcConfig添加拦截器:

    package com.dpqq.springboot.web.component;

    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;

    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    //配置拦截器,重写拦截器必要方法
    public class ApplyCardHandlerInterceptor implements HandlerInterceptor{
    @Override //重写方法
    // 重写预处理方法,返回值Boolean 通行与不通行
    public boolean preHandle(HttpServletRequest request,
    HttpServletResponse response,
    Object handler) throws Exception {
    // 从Session根据键“loginUser”取值,赋值给user
    Object user=request.getSession().getAttribute("loginUser");
    // 判断取值是否为空,为空则表示没有登陆,跳转回登录页,否则表示登陆了,放行
    if(user == null){
    request.setAttribute("msg","请先登陆");
    request.getRequestDispatcher("/login").forward(request,response);
    return false;
    }
    else{return true;}
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {

    }
    }

    DuridConfig配置durid数据源:

    package com.dpqq.springboot.web.config;

    import com.alibaba.druid.pool.DruidDataSource;
    import com.alibaba.druid.support.http.StatViewServlet;
    import com.alibaba.druid.support.http.WebStatFilter;
    import org.springframework.boot.context.properties.ConfigurationProperties;
    import org.springframework.boot.web.servlet.FilterRegistrationBean;
    import org.springframework.boot.web.servlet.ServletRegistrationBean;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;

    import javax.servlet.Filter;
    import javax.sql.DataSource;
    import java.util.Arrays;
    import java.util.HashMap;
    import java.util.Map;

    @Configuration //配置注解,表示这是一个配置类
    public class DuridConfig {
    //按application.yml中前缀为“spring.datasource”属性
    @ConfigurationProperties(prefix = "spring.datasource")
    @Bean //注解Bean,加入容器以使用
    public DataSource druid(){
    return new DruidDataSource();
    }
    @Bean //注解Bean,加入容器以使用
    public ServletRegistrationBean StatViewServlet(){
    // 声明ServletRegistrationBean并配置路由
    ServletRegistrationBean bean = new ServletRegistrationBean(new StatViewServlet(), "/druid/*");
    Map<String,String> initparams = new HashMap<>();
    // 设置登陆用户及密码,放行路由
    initparams.put("loginUsername","admin");
    initparams.put("loginPassword","123456");
    initparams.put("allow","");
    // initparams.put("deny","localhost");
    bean.setInitParameters(initparams);
    return bean;
    }
    @Bean
    // 配置过滤器
    public FilterRegistrationBean webStatFilter(){
    FilterRegistrationBean<Filter> bean = new FilterRegistrationBean<>();
    bean.setFilter(new WebStatFilter());
    Map<String,String> initparams = new HashMap<>();
    initparams.put("exclusions","*.js,*.css");
    bean.setInitParameters(initparams);
    bean.setUrlPatterns(Arrays.asList("/*"));
    return bean;
    }
    }

     

  • 相关阅读:
    FTP 协议和 HTTP 协议的比较
    HttpURLConnection的post请求,什么时候发出,writeData存在什么地方
    装饰器
    函数参数以及名称空间作用域
    函数的调用
    函数的返回值
    定义函数的三种方式
    函数
    day05
    day04
  • 原文地址:https://www.cnblogs.com/dpqq/p/10949496.html
Copyright © 2020-2023  润新知