CRM客户资源管理系统项目——系统管理功能的实现


动力节点SSM框架项目实战|Spring+Mybatis+Springmvc框架项目实战整合-【CRM客户管理系统】_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tZ4y1d7kg?spm_id_from=333.337.search-card.all.click

1,搭建开发环境:
  1)创建项目:crm-project
              设置JDK.
    创建工程:crm
           补全目录结构:
          设置编码格式:UTF-8
  2)添加jar包:添加依赖---参考课件.
  3)添加配置文件:参考课件.
  4)添加静态页面资源:

为何将静态资源部署到idea中maven的webapp框架下的webapp目录下:maven  webapp框架中的webapp目录,再将项目部署到tomcat服务器下面时,会直接将此目录下的文件拷贝到tomcat的webapps目录下,所以在idea中编写web项目时,静态页面资源直接放置在webapp目录下即可

   项目部署到Tomcat服务器上时,会将项目文件添加到tomcat服务器webapps下面。(webapps下面会部署很多项目)

目录结构:

 webapps
       |->stumgr(其他项目)
       |->crm(本次项目)
                    |->.html,.css,.js,.img   test.jsp
                    |->WEB-INF(下面有三大件,即web.xml    classes   lib)
                              |->web.xml(核心配置文件)
                              |->classes(我们写好的java程序编译好的class文件)
                              |->lib(放jar包,在项目部署时idea和mave会将仓库里的使用到jar包全部拷贝进去)

**web应用根目录下的内容都是不安全的,外界可以通过url直接访问;
所以,一般为了数据的安全,都会把页面放到WEB-INF下,因为WEB-INF目录下的资源是受保护的,外界不能直接访问,但是内部的java程序例如controller可以访问,controller编译的class文件在WEB-INF目录下,进而可以访问WEB-INF目录下的文件。外界访问的整个的流程就是,外界访问controller的url,进而访问到controller,进而访问到WEB-INF下的一些文件。进而又引入一个问题,如果外界知道controller的url,那么会不会直接访问到WEB-INF目录下的文件呢?答案是会的,但是我们可以对用户进行验证,通过拦截器等进行访问验证,进而对无权限的账号进行拦截。

在部署到Tomcat上时出现了如下问题:

解决办法:将web.xml文件中的监听器部分注释掉(解决问题就解决掉提出问题的人)

 做项目的功能时,先做被依赖的功能,例如系统管理功能和业务实现功能,就先做系统管理功能

首页功能

usercontroller类:

 

@Controller
public class UserController {
    /**
     * url要和controller方法处理完请求之后,响应信息返回的页面的资源目录保持一致
     */
    @RequestMapping("/settings/qx/user/toLogin.do")
    public String toLogin(){
        //请求转发到登录页面
        return "settings/qx/user/login";
    }
}


JAVA WEB项目目录结构以及web应用部署的根目录,编译路径和项目根目录的区别 - 月染霜华 - 博客园 (cnblogs.com)icon-default.png?t=M4ADhttps://www.cnblogs.com/shoshana-kong/p/11419867.html#:~:text=web%E5%BA%94%E7%94%A8%E9%83%A8%E7%BD%B2%E7%9A%84,t%E6%88%96%E8%80%85%E5%88%AB%E7%9A%84%E4%BB%80%E4%B9%88%EF%BC%89

登录功能

1,同步请求和异步请求的区别:
  同步请求:浏览器窗口发出的请求,响应信息返回到浏览器窗口,所以会进行全局刷新。
  异步请求:ajax发出的请求,响应信息返回到ajax的回调函数,既可以进行全局刷新,也可以进行局                     部刷新。

  小结:如果需要进行全局刷新,推荐使用同步请求,当然也可以使用异步请求;
             如果需要进行局部刷新,只能使用异步请求;
             如果既可能进行全局刷新,也可能进行局部刷新,也是只能使用异步请求。

异步请求,需要的参数根据usercontroller要执行的操作需要来提供。

浏览器发送请求,接受请求的controller层应该如何创建以及是否要在原来的controller层上加方法,具体看处理后的响应信息返回到哪个页面,一个页面如果占一个独立的资源目录,那这个资源目录对应一个controller类

controller只进行流程控制,不处理具体逻辑,usercontroller层接收到参数以后决定调用哪个service层

一张表对应一个实体类,对应一个dao层(mapper层),对应一个service层

2,mybatis逆向工程:

创建mybatis逆向工程,生成jar包,供crm项目使用。
  1)简介:根据表生成mapper层三部分代码:实体类,mapper接口,映射文件。
  2)使用mybatis逆向工程:
    a)创建模块:crm-mybatis-generator
    b)添加插件:(创建过程中  maven中引入依赖是指引入是jar包,jar包只能是被其他程序去调。插件:是独立的程序,可以独立运行)
      <!--myBatis逆向工程插件-->
    <plugin>
    <groupId>org.mybatis.generator</groupId>
    <artifactId>mybatis-generator-maven-plugin</artifactId>
    <version>1.3.2</version>
    <configuration>
        <verbose>true</verbose>
        <overwrite>true</overwrite>
    </configuration>
    </plugin>
   c)添加配置文件:
     数据库连接信息
     代码保存的目录
     表的信息
   d)运行mybatis的逆向工程,根据指定表生成java代码,保存到指定的目录中。

前面注释掉监听器的代价。。。。在进行网页登录时有了如下一模一样的bug。。

(22条消息) SSM碰到org.springframework.beans.factory.UnsatisfiedDependencyException解决方法_qq_1959227206的博客-CSDN博客icon-default.png?t=M4ADhttps://blog.csdn.net/yjt520557/article/details/86598097

想要把控制层的数据传递给页面,都是通过作用域来传

1,把控制层(controller)代码中处理好的数据传递到视图层(jsp),使用作用域传递:
   pageContext:用来在同一个页面的不同标签之间传递数据。
   request:在同一个请求过程中间传递数据。
   session: 同一个浏览器窗口的不同请求之间传递数据。
   application:所有用户共享的数据,并且长久频繁使用的数据。

在网站地址栏中想查询服务器中的数据,先在地址栏中输入需要的controller对应的的url,controller调用service层方法等操作,查出来之后返回到controller,controller利用request,set等方法将数据传递给

用户登录时,如何验证信息的:验证信息时,以传来的用户名且密码为条件,查询数据库,未查到就返回null的user,查到就返回相应的信息user,mapper文件中如下查询语句进行查询。

 <select id="selectUserByLoginActAndPwd" parameterType="map" resultMap="BaseResultMap">
    select
    <include refid="Base_Column_List"/>
    from tbl_user
    where login_act=#{loginAct} and login_pwd=#{loginPwd}
  </select>

十天免登录功能实现(cookie)
   访问:login.jsp---->后台:.html:如果上次记住密码,自动填上账号和密码;否则,不填。
                             如何判断上次是否记住密码?`
                 --上次登录成功,判断是否需要记住密码:如果需要记住密码,则往浏览器写cookie;否则,删除cookie。而且cookie的值必须是该用户的loginAct和loginPwd
                 --下次登录时,判断该用户有没有cookie:如果有,则自动填写账号和密码;否则,不写。而且填写的是cookie的值.
                  ----->浏览器显示

在usercontroller中写入cookie

//如果需要记住密码,则往外写cookie
                if("true".equals(isRemPwd)){
                    Cookie c1=new Cookie("loginAct",user.getLoginAct());
                    c1.setMaxAge(10*24*60*60);
                    response.addCookie(c1);
                    Cookie c2=new Cookie("loginPwd",user.getLoginPwd());
                    c2.setMaxAge(10*24*60*60);
                    response.addCookie(c2);
                }else{
                    //把没有过期cookie删除
                    //因为后台不能去删除用户已经记录的cookie,
                        所以再重新提交一次用来覆盖原来的cookie,向用户端保存时间为0,
                        账号密码实际值无所谓的cookie,但是要覆盖的属性的属性名要一致
                    Cookie c1=new Cookie("loginAct","1");
                    c1.setMaxAge(0);
                    response.addCookie(c1);
                    Cookie c2=new Cookie("loginPwd","1");
                    c2.setMaxAge(0);
                    response.addCookie(c2);
                }

获取cookie

使用EL表达式获取cookie:
    ${cookie.loginAct.value}
    ${cookie.loginPwd.value}
 

安全退出

 

登录验证:

利用拦截器进行拦截

public class LoginInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //如果用户没有登录成功,则跳转到登录页面
        HttpSession session=httpServletRequest.getSession();
        User user=(User) session.getAttribute(Contants.SESSION_USER);
        if(user==null){
//在controller中可以借助框架直接重定向,在这个里边只能调用方法进行重定向
            //重定向时,url必须加项目的名称。这时候不在框架里,不能用视图解析器,要自己加前后缀
            httpServletResponse.sendRedirect(httpServletRequest.getContextPath());
            return false;
        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值