一、实现用户登录流程图

用户登录.png

二、搭建MyBatis逆向工程

简介:根据表生成mapper层三部分代码:实体类,mapper接口,映射文件。

1.创建meacen项目

image.png

2.修改pom.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <project xmlns="http://maven.apache.org/POM/4.0.0"
  3. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4. xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  5. <modelVersion>4.0.0</modelVersion>
  6. <groupId>com.bjpowernode.crm</groupId>
  7. <artifactId>crm-mybatis-generator</artifactId>
  8. <version>1.0-SNAPSHOT</version>
  9. <build>
  10. <plugins>
  11. <!--myBatis逆向工程插件-->
  12. <plugin>
  13. <groupId>org.mybatis.generator</groupId>
  14. <artifactId>mybatis-generator-maven-plugin</artifactId>
  15. <version>1.3.2</version>
  16. <configuration>
  17. <verbose>true</verbose>
  18. <overwrite>true</overwrite>
  19. </configuration>
  20. </plugin>
  21. </plugins>
  22. </build>
  23. </project>

3.添加相关的配置文件

image.png
jdbc.driverLocation是mysql连接数据库jar包的位置

  1. jdbc.driverLocation=E:/Program/Project/Projectjava/reposity/mysql/mysql-connector-java/5.1.32/mysql-connector-java-5.1.32.jar
  2. jdbc.driverClass=com.mysql.jdbc.Driver
  3. jdbc.connectionURL=jdbc:mysql://127.0.0.1:3307/crm2008?useUnicode=true&characterEncoding=UTF-8
  4. jdbc.userId=root
  5. jdbc.password=123456

targetPackage:代码保存的目录
table:表的信息 需要哪一个表就打开那个

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <!DOCTYPE generatorConfiguration
  3. PUBLIC "-//mybatis.org//DTD MyBatis Generator Configuration 1.0//EN"
  4. "http://mybatis.org/dtd/mybatis-generator-config_1_0.dtd">
  5. <generatorConfiguration>
  6. <!--指定mysql数据库驱动-->
  7. <!--<classPathEntry location="E://repository-p2p//mysql//mysql-connector-java//5.1.43//mysql-connector-java-5.1.43.jar"/>-->
  8. <!--导入属性配置-->
  9. <properties resource="generator.properties"></properties>
  10. <!--指定特定数据库的jdbc驱动jar包的位置-->
  11. <classPathEntry location="${jdbc.driverLocation}"/>
  12. <context id="default" targetRuntime="MyBatis3">
  13. <!-- optional,旨在创建class时,对注释进行控制,false生成注释,true无注释 -->
  14. <commentGenerator>
  15. <property name="suppressDate" value="false"/>
  16. <property name="suppressAllComments" value="false"/>
  17. </commentGenerator>
  18. <!--jdbc的数据库连接 -->
  19. <jdbcConnection
  20. driverClass="${jdbc.driverClass}"
  21. connectionURL="${jdbc.connectionURL}"
  22. userId="${jdbc.userId}"
  23. password="${jdbc.password}">
  24. </jdbcConnection>
  25. <!-- 非必需,类型处理器,在数据库类型和java类型之间的转换控制-->
  26. <javaTypeResolver>
  27. <property name="forceBigDecimals" value="false"/>
  28. </javaTypeResolver>
  29. <!-- Model模型生成器,用来生成含有主键key的类,记录类 以及查询Example类
  30. targetPackage 指定生成的model生成所在的包名
  31. targetProject 指定在该项目下所在的路径|指定生成到的工程名称
  32. -->
  33. <javaModelGenerator targetPackage="com.bjpowernode.crm.settings.domain"
  34. targetProject="E:/Program/Project/Projectjava/CRM/crm-project/crm/src/main/java">
  35. <!-- 是否允许子包,即targetPackage.schemaName.tableName -->
  36. <property name="enableSubPackages" value="false"/>
  37. <!-- 是否对model添加 构造函数 true添加,false不添加-->
  38. <property name="constructorBased" value="false"/>
  39. <!-- 是否对类CHAR类型的列的数据进行trim操作 -->
  40. <property name="trimStrings" value="true"/>
  41. <!-- 建立的Model对象是否 不可改变 即生成的Model对象不会有 setter方法,只有构造方法 -->
  42. <property name="immutable" value="false"/>
  43. </javaModelGenerator>
  44. <!--Mapper映射文件生成所在的目录 为每一个数据库的表生成对应的SqlMap文件 -->
  45. <sqlMapGenerator targetPackage="com.bjpowernode.crm.settings.mapper"
  46. targetProject="E:/Program/Project/Projectjava/CRM/crm-project/crm/src/main/java">
  47. <property name="enableSubPackages" value="false"/>
  48. </sqlMapGenerator>
  49. <!-- 客户端代码,生成易于使用的针对Model对象和XML配置文件 的代码
  50. type="ANNOTATEDMAPPER",生成Java Model 和基于注解的Mapper对象
  51. type="MIXEDMAPPER",生成基于注解的Java Model 和相应的Mapper对象
  52. type="XMLMAPPER",生成SQLMap XML文件和独立的Mapper接口
  53. -->
  54. <javaClientGenerator targetPackage="com.bjpowernode.crm.settings.mapper"
  55. targetProject="E:/Program/Project/Projectjava/CRM/crm-project/crm/src/main/java" type="XMLMAPPER">
  56. <property name="enableSubPackages" value="true"/>
  57. </javaClientGenerator>
  58. <table tableName="tbl_user" domainObjectName="User"
  59. enableCountByExample="false" enableUpdateByExample="false"
  60. enableDeleteByExample="false" enableSelectByExample="false"
  61. selectByExampleQueryId="false">
  62. </table>
  63. <!--
  64. <table tableName="tbl_clue" domainObjectName="Clue"
  65. enableCountByExample="false" enableUpdateByExample="false"
  66. enableDeleteByExample="false" enableSelectByExample="false"
  67. selectByExampleQueryId="false">
  68. </table>
  69. <table tableName="tbl_clue_activity_relation" domainObjectName="ClueActivityRelation"
  70. enableCountByExample="false" enableUpdateByExample="false"
  71. enableDeleteByExample="false" enableSelectByExample="false"
  72. selectByExampleQueryId="false">
  73. </table>
  74. <table tableName="tbl_clue_remark" domainObjectName="ClueRemark"
  75. enableCountByExample="false" enableUpdateByExample="false"
  76. enableDeleteByExample="false" enableSelectByExample="false"
  77. selectByExampleQueryId="false">
  78. </table>
  79. -->
  80. <!--
  81. <table tableName="tbl_contacts" domainObjectName="Contacts"
  82. enableCountByExample="false" enableUpdateByExample="false"
  83. enableDeleteByExample="false" enableSelectByExample="false"
  84. selectByExampleQueryId="false">
  85. </table>
  86. <table tableName="tbl_contacts_activity_relation" domainObjectName="ContactsActivityRelation"
  87. enableCountByExample="false" enableUpdateByExample="false"
  88. enableDeleteByExample="false" enableSelectByExample="false"
  89. selectByExampleQueryId="false">
  90. </table>
  91. <table tableName="tbl_contacts_remark" domainObjectName="ContactsRemark"
  92. enableCountByExample="false" enableUpdateByExample="false"
  93. enableDeleteByExample="false" enableSelectByExample="false"
  94. selectByExampleQueryId="false">
  95. </table>
  96. -->
  97. <!--
  98. <table tableName="tbl_customer" domainObjectName="Customer"
  99. enableCountByExample="false" enableUpdateByExample="false"
  100. enableDeleteByExample="false" enableSelectByExample="false"
  101. selectByExampleQueryId="false">
  102. </table>
  103. <table tableName="tbl_customer_remark" domainObjectName="CustomerRemark"
  104. enableCountByExample="false" enableUpdateByExample="false"
  105. enableDeleteByExample="false" enableSelectByExample="false"
  106. selectByExampleQueryId="false">
  107. </table>
  108. -->
  109. <!--
  110. <table tableName="tbl_dictionary_type" domainObjectName="DictionaryType"
  111. enableCountByExample="false" enableUpdateByExample="false"
  112. enableDeleteByExample="false" enableSelectByExample="false"
  113. selectByExampleQueryId="false">
  114. </table>
  115. <table tableName="tbl_dictionary_value" domainObjectName="DictionaryValue"
  116. enableCountByExample="false" enableUpdateByExample="false"
  117. enableDeleteByExample="false" enableSelectByExample="false"
  118. selectByExampleQueryId="false">
  119. </table>
  120. <table tableName="tbl_marketing_activities" domainObjectName="MarketingActivities"
  121. enableCountByExample="false" enableUpdateByExample="false"
  122. enableDeleteByExample="false" enableSelectByExample="false"
  123. selectByExampleQueryId="false">
  124. </table>
  125. <table tableName="tbl_marketing_activities_remark" domainObjectName="MarketingActivitiesRemark"
  126. enableCountByExample="false" enableUpdateByExample="false"
  127. enableDeleteByExample="false" enableSelectByExample="false"
  128. selectByExampleQueryId="false">
  129. </table>
  130. -->
  131. <!--
  132. <table tableName="tbl_transaction" domainObjectName="Transaction"
  133. enableCountByExample="false" enableUpdateByExample="false"
  134. enableDeleteByExample="false" enableSelectByExample="false"
  135. selectByExampleQueryId="false">
  136. </table>
  137. <table tableName="tbl_transaction_history" domainObjectName="TransactionHistory"
  138. enableCountByExample="false" enableUpdateByExample="false"
  139. enableDeleteByExample="false" enableSelectByExample="false"
  140. selectByExampleQueryId="false">
  141. </table>
  142. <table tableName="tbl_transaction_remark" domainObjectName="TransactionRemark"
  143. enableCountByExample="false" enableUpdateByExample="false"
  144. enableDeleteByExample="false" enableSelectByExample="false"
  145. selectByExampleQueryId="false">
  146. </table>
  147. -->
  148. </context>
  149. </generatorConfiguration>

4.点击运行

image.png

三、实现Mapper层和Service层

image.png

Mapper

  1. /**
  2. * 根据账号和密码查询用户
  3. */
  4. User selectUserByLoginActAndPwd(Map<String,Object> map);
  1. <select id="selectUserByLoginActAndPwd" parameterType="map" resultMap="BaseResultMap">
  2. select<include refid="Base_Column_List"></include>
  3. from tbl_user
  4. where login_act=#{loginAct} and login_pwd=#{loginPwd}
  5. </select>
  1. <!--注册mapper.xml文件-->
  2. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  3. <property name="basePackage" value="com.bjpowernode.crm.settings.mapper"></property>
  4. </bean>

解释

  1. //@Service //交给Spring去创建对象
  2. //public class UsersServiceImpl implements UsersService {
  3. //切记切记:在所有的业务逻辑层中一定会有数据访问层的对象
  4. /**
  5. * //1.读取核心配置文件
  6. * InputStream in = Resources.getResourceAsStream("SqlMapConfig.xml");
  7. * //2.创建工厂对象
  8. * SqlSessionFactory factory = new SqlSessionFactoryBuilder().build(in);
  9. * //3.取出sqlSession
  10. * sqlSession = factory.openSession(true);//自动提交事务
  11. * //4.取出动态代理的对象,完成接口中方法的调用,实则是调用xml文件中相的标签的功能
  12. * usersMapper = sqlSession.getMapper(UsersMapper.class);
  13. */
  14. //在以前我们通过上面的获取usersmapper,我们需要的是数据访问层的功能
  15. //现在我们通过注解,spring帮我们完成注入
  16. /*
  17. MapperScannerConfigurer类已经完成了动态代理的实现
  18. <!--注册mapper.xml文件-->
  19. <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
  20. <property name="basePackage" value="com.bjpowernode.mapper"></property>
  21. </bean>
  22. */
  23. /*
  24. @Autowired
  25. UsersMapper usersMapper;
  26. @Override
  27. public int insert(Users users) {
  28. int num = usersMapper.insert(users);
  29. }
  30. }
  31. */

别忘了改这个地方

  1. <!--注册实体类-->
  2. <property name="typeAliasesPackage" value="com/bjpowernode/crm/settings/domain"></property>

Service

image.png

  1. public interface UserService {
  2. User selectUserByLoginActAndPwd(Map<String,Object> map);
  3. }
  1. @Service("userService")
  2. public class UserServiceImpl implements UserService {
  3. @Autowired
  4. private UserMapper userMapper;
  5. @Override
  6. public User selectUserByLoginActAndPwd(Map<String, Object> map) {
  7. return userMapper.selectUserByLoginActAndPwd(map);
  8. }
  9. }
  1. <!--添加包扫描-->
  2. <context:component-scan base-package="com.bjpowernode.crm.settings.service"></context:component-scan>

四、完成Controller层

image.png

1.搭建逻辑框架UserController

  1. @Controller
  2. public class UserController {
  3. @Autowired
  4. private UserService userService;
  5. @RequestMapping("/settings/qx/user/toLogin.do")
  6. public String toLogin(){
  7. //请求转发到登录页面
  8. return "settings/qx/user/login";
  9. }
  10. @RequestMapping("/settings/qx/user/login.do")
  11. @ResponseBody
  12. public Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request){
  13. //封装参数
  14. Map<String,Object> map=new HashMap<>();
  15. map.put("loginAct",loginAct);
  16. map.put("loginPwd",loginPwd);
  17. //调用service层方法,查询用户
  18. User user=userService.selectUserByLoginActAndPwd(map);
  19. //根据查询结果,生成响应信息
  20. if(user==null){
  21. //登录失败,用户名或者密码错误
  22. }else{//进一步判断账号是否合法
  23. //user.getExpireTime() //2019-10-20
  24. // new Date() //2020-09-10
  25. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  26. String nowStr=sdf.format(new Date());
  27. if(nowStr.compareTo(user.getExpireTime())>0){
  28. //登录失败,账号已过期
  29. }else if("0".equals(user.getLockState())){
  30. //登录失败,状态被锁定
  31. }else if(!user.getAllowIps().contains(request.getRemoteAddr())){
  32. //登录失败,ip受限
  33. }else{
  34. //登录成功
  35. }
  36. }
  37. }
  38. }

2.添加实体类

image.png

  1. package com.bjpowernode.crm.commons.domain;
  2. public class ReturnObject {
  3. private String code; //处理成功或者失败的标记 1 成功 0失败
  4. private String message;//提示信息
  5. private Object returnData; //其他数据
  6. public String getCode() {
  7. return code;
  8. }
  9. public void setCode(String code) {
  10. this.code = code;
  11. }
  12. public String getMessage() {
  13. return message;
  14. }
  15. public void setMessage(String message) {
  16. this.message = message;
  17. }
  18. public Object getReturnData() {
  19. return returnData;
  20. }
  21. public void setReturnData(Object returnData) {
  22. this.returnData = returnData;
  23. }
  24. }

3.完善UserController

  1. @Controller
  2. public class UserController {
  3. @Autowired
  4. private UserService userService;
  5. @RequestMapping("/settings/qx/user/toLogin.do")
  6. public String toLogin(){
  7. //请求转发到登录页面
  8. return "settings/qx/user/login";
  9. }
  10. @RequestMapping("/settings/qx/user/login.do")
  11. @ResponseBody
  12. public Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request){
  13. //封装参数
  14. Map<String,Object> map=new HashMap<>();
  15. map.put("loginAct",loginAct);
  16. map.put("loginPwd",loginPwd);
  17. //调用service层方法,查询用户
  18. User user=userService.selectUserByLoginActAndPwd(map);
  19. //根据查询结果,生成响应信息
  20. ReturnObject returnObject =new ReturnObject();
  21. if(user==null){
  22. //登录失败,用户名或者密码错误
  23. returnObject.setCode("0");
  24. returnObject.setMessage("用户名或者密码错误");
  25. }else{//进一步判断账号是否合法
  26. //user.getExpireTime() //2019-10-20
  27. // new Date() //2020-09-10
  28. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  29. String nowStr=sdf.format(new Date());
  30. if(nowStr.compareTo(user.getExpireTime())>0){
  31. //登录失败,账号已过期
  32. returnObject.setCode("0");
  33. returnObject.setMessage("账号已过期");
  34. }else if("0".equals(user.getLockState())){
  35. //登录失败,状态被锁定
  36. returnObject.setCode("0");
  37. returnObject.setMessage("状态被锁定");
  38. }else if(!user.getAllowIps().contains(request.getRemoteAddr())){
  39. //登录失败,ip受限
  40. returnObject.setCode("0");
  41. returnObject.setMessage("ip受限");
  42. }else{
  43. //登录成功
  44. returnObject.setCode("1");
  45. }
  46. }
  47. return returnObject;
  48. }
  49. }

4.优化UserController

image.png

  1. public class DateUtils {
  2. //对指定的date对象进行格式化 yyyy-MM-dd HH:mm:ss"
  3. public static String formateDateTime(Date date){
  4. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
  5. String dateStr=sdf.format(date);
  6. return dateStr;
  7. }
  8. //对指定的date对象进行格式化 yyyy-MM-dd HH:mm:ss"
  9. public static String formateDate(Date date){
  10. SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
  11. String dateStr=sdf.format(date);
  12. return dateStr;
  13. }
  14. //对指定的date对象进行格式化HH:mm:ss"
  15. public static String formateTime(Date date){
  16. SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
  17. String dateStr=sdf.format(date);
  18. return dateStr;
  19. }
  20. }
  1. public class Contants {
  2. //保存ReturnObject类中的Code值
  3. public static final String RETURN_OBJECT_CODE_SUCCESS="1";//成功的
  4. public static final String RETURN_OBJECT_CODE_FAIL="0";//失败的
  5. }
  1. ReturnObject returnObject =new ReturnObject();
  2. if(user==null){
  3. //登录失败,用户名或者密码错误
  4. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  5. returnObject.setMessage("用户名或者密码错误");
  6. }else{//进一步判断账号是否合法
  7. //user.getExpireTime() //2019-10-20
  8. // new Date() //2020-09-10
  9. String nowStr=DateUtils.formateDateTime(new Date());
  10. if(nowStr.compareTo(user.getExpireTime())>0){
  11. //登录失败,账号已过期
  12. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  13. returnObject.setMessage("账号已过期");
  14. }else if("0".equals(user.getLockState())){
  15. //登录失败,状态被锁定
  16. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  17. returnObject.setMessage("状态被锁定");
  18. }else if(!user.getAllowIps().contains(request.getRemoteAddr())){
  19. //登录失败,ip受限
  20. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  21. returnObject.setMessage("ip受限");
  22. }else{
  23. //登录成功
  24. returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
  25. }
  26. }
  27. return returnObject;
  28. }

5.修改前端页面

image.png

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%
  3. String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
  4. %>
  5. <html>
  6. <head>
  7. <base href="<%=basePath%>">
  8. <meta charset="UTF-8">
  9. <link href="jquery/bootstrap_3.3.0/css/bootstrap.min.css" type="text/css" rel="stylesheet" />
  10. <script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script>
  11. <script type="text/javascript" src="jquery/bootstrap_3.3.0/js/bootstrap.min.js"></script>
  12. <script type="text/javascript">
  13. $(function () {
  14. //给"登录"按钮添加单击事件
  15. $("#loginBtn").click(function () {
  16. //收集参数
  17. var loginAct=$.trim($("#loginAct").val());
  18. var loginPwd=$.trim($("#loginPwd").val());
  19. var isRemPwd=$("#isRemPwd").prop("checked");
  20. //表单验证
  21. if(loginAct==""){
  22. alert("用户名不能为空");
  23. return;
  24. }
  25. if(loginPwd==""){
  26. alert("密码不能为空");
  27. return;
  28. }
  29. //发送请求
  30. $.ajax({
  31. url:'settings/qx/user/login.do',
  32. data:{
  33. loginAct:loginAct,
  34. loginPwd:loginPwd,
  35. isRemPwd:isRemPwd
  36. },
  37. type:'post',
  38. dataType:'json',
  39. success:function (data) {
  40. if(data.code=="1"){
  41. //跳转到业务主页面
  42. window.location.href="workbench/index.do";
  43. }else{
  44. //提示信息
  45. $("#msg").text(data.message);
  46. }
  47. }
  48. });
  49. });
  50. });
  51. </script>
  52. </head>
  53. <body>
  54. <div style="position: absolute; top: 0px; left: 0px; width: 60%;">
  55. <img src="image/IMG_7114.JPG" style="width: 100%; height: 90%; position: relative; top: 50px;">
  56. </div>
  57. <div id="top" style="height: 50px; background-color: #3C3C3C; width: 100%;">
  58. <div style="position: absolute; top: 5px; left: 0px; font-size: 30px; font-weight: 400; color: white; font-family: 'times new roman'">CRM &nbsp;<span style="font-size: 12px;">&copy;2019&nbsp;动力节点</span></div>
  59. </div>
  60. <div style="position: absolute; top: 120px; right: 100px;width:450px;height:400px;border:1px solid #D5D5D5">
  61. <div style="position: absolute; top: 0px; right: 60px;">
  62. <div class="page-header">
  63. <h1>登录</h1>
  64. </div>
  65. <form action="workbench/index.html" class="form-horizontal" role="form">
  66. <div class="form-group form-group-lg">
  67. <div style="width: 350px;">
  68. <input class="form-control" id="loginAct" type="text" placeholder="用户名">
  69. </div>
  70. <div style="width: 350px; position: relative;top: 20px;">
  71. <input class="form-control" id="loginPwd" type="password" placeholder="密码">
  72. </div>
  73. <div class="checkbox" style="position: relative;top: 30px; left: 10px;">
  74. <label>
  75. <input type="checkbox" id="isRemPwd"> 十天内免登录
  76. </label>
  77. &nbsp;&nbsp;
  78. <span id="msg" style="color: red"></span>
  79. </div>
  80. <button type="button" id="loginBtn" class="btn btn-primary btn-lg btn-block" style="width: 350px; position: relative;top: 45px;">登录</button>
  81. </div>
  82. </form>
  83. </div>
  84. </div>
  85. </body>
  86. </html>

image.png

  1. @Controller
  2. public class WorkbenchIndexController {
  3. @RequestMapping("/workbench/index.do")
  4. public String index(){
  5. //跳转到业务主页面
  6. return "workbench/index";
  7. }
  8. }
  1. <context:component-scan base-package="com.bjpowernode.crm.workbench.web.controller"></context:component-scan>

image.png

6.登录之后显示业务与主页面名称

image.png+
先把这个复制过去然后再改成jsp

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%
  3. String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
  4. %>
  5. <html>
  6. <head>
  7. <base href="<%=basePath%>">
  8. <meta charset="UTF-8">
  9. <link href="jquery/bootstrap_3.3.0/css/bootstrap.min.css" type="text/css" rel="stylesheet" />
  10. <script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script>
  11. <script type="text/javascript" src="jquery/bootstrap_3.3.0/js/bootstrap.min.js"></script>
  12. <script type="text/javascript">
  13. //页面加载完毕
  14. $(function(){
  15. //导航中所有文本颜色为黑色
  16. $(".liClass > a").css("color" , "black");
  17. //默认选中导航菜单中的第一个菜单项
  18. $(".liClass:first").addClass("active");
  19. //第一个菜单项的文字变成白色
  20. $(".liClass:first > a").css("color" , "white");
  21. //给所有的菜单项注册鼠标单击事件
  22. $(".liClass").click(function(){
  23. //移除所有菜单项的激活状态
  24. $(".liClass").removeClass("active");
  25. //导航中所有文本颜色为黑色
  26. $(".liClass > a").css("color" , "black");
  27. //当前项目被选中
  28. $(this).addClass("active");
  29. //当前项目颜色变成白色
  30. $(this).children("a").css("color","white");
  31. });
  32. window.open("main/index.html","workareaFrame");
  33. });
  34. </script>
  35. </head>
  36. <body>
  37. <!-- 我的资料 -->
  38. <div class="modal fade" id="myInformation" role="dialog">
  39. <div class="modal-dialog" role="document" style="width: 30%;">
  40. <div class="modal-content">
  41. <div class="modal-header">
  42. <button type="button" class="close" data-dismiss="modal">
  43. <span aria-hidden="true">×</span>
  44. </button>
  45. <h4 class="modal-title">我的资料</h4>
  46. </div>
  47. <div class="modal-body">
  48. <div style="position: relative; left: 40px;">
  49. 姓名:<b>张三</b><br><br>
  50. 登录帐号:<b>zhangsan</b><br><br>
  51. 组织机构:<b>1005,市场部,二级部门</b><br><br>
  52. 邮箱:<b>zhangsan@bjpowernode.com</b><br><br>
  53. 失效时间:<b>2017-02-14 10:10:10</b><br><br>
  54. 允许访问IP:<b>127.0.0.1,192.168.100.2</b>
  55. </div>
  56. </div>
  57. <div class="modal-footer">
  58. <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
  59. </div>
  60. </div>
  61. </div>
  62. </div>
  63. <!-- 修改密码的模态窗口 -->
  64. <div class="modal fade" id="editPwdModal" role="dialog">
  65. <div class="modal-dialog" role="document" style="width: 70%;">
  66. <div class="modal-content">
  67. <div class="modal-header">
  68. <button type="button" class="close" data-dismiss="modal">
  69. <span aria-hidden="true">×</span>
  70. </button>
  71. <h4 class="modal-title">修改密码</h4>
  72. </div>
  73. <div class="modal-body">
  74. <form class="form-horizontal" role="form">
  75. <div class="form-group">
  76. <label for="oldPwd" class="col-sm-2 control-label">原密码</label>
  77. <div class="col-sm-10" style="width: 300px;">
  78. <input type="text" class="form-control" id="oldPwd" style="width: 200%;">
  79. </div>
  80. </div>
  81. <div class="form-group">
  82. <label for="newPwd" class="col-sm-2 control-label">新密码</label>
  83. <div class="col-sm-10" style="width: 300px;">
  84. <input type="text" class="form-control" id="newPwd" style="width: 200%;">
  85. </div>
  86. </div>
  87. <div class="form-group">
  88. <label for="confirmPwd" class="col-sm-2 control-label">确认密码</label>
  89. <div class="col-sm-10" style="width: 300px;">
  90. <input type="text" class="form-control" id="confirmPwd" style="width: 200%;">
  91. </div>
  92. </div>
  93. </form>
  94. </div>
  95. <div class="modal-footer">
  96. <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
  97. <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="window.location.href='login.html';">更新</button>
  98. </div>
  99. </div>
  100. </div>
  101. </div>
  102. <!-- 退出系统的模态窗口 -->
  103. <div class="modal fade" id="exitModal" role="dialog">
  104. <div class="modal-dialog" role="document" style="width: 30%;">
  105. <div class="modal-content">
  106. <div class="modal-header">
  107. <button type="button" class="close" data-dismiss="modal">
  108. <span aria-hidden="true">×</span>
  109. </button>
  110. <h4 class="modal-title">离开</h4>
  111. </div>
  112. <div class="modal-body">
  113. <p>您确定要退出系统吗?</p>
  114. </div>
  115. <div class="modal-footer">
  116. <button type="button" class="btn btn-default" data-dismiss="modal">取消</button>
  117. <button type="button" class="btn btn-primary" data-dismiss="modal" onclick="window.location.href='login.html';">确定</button>
  118. </div>
  119. </div>
  120. </div>
  121. </div>
  122. <!-- 顶部 -->
  123. <div id="top" style="height: 50px; background-color: #3C3C3C; width: 100%;">
  124. <div style="position: absolute; top: 5px; left: 0px; font-size: 30px; font-weight: 400; color: white; font-family: 'times new roman'">CRM &nbsp;<span style="font-size: 12px;">&copy;2022&nbsp;动力节点</span></div>
  125. <div style="position: absolute; top: 15px; right: 15px;">
  126. <ul>
  127. <li class="dropdown user-dropdown">
  128. <a href="javascript:void(0)" style="text-decoration: none; color: white;" class="dropdown-toggle" data-toggle="dropdown">
  129. <span class="glyphicon glyphicon-user"></span> zhangsan <span class="caret"></span>
  130. </a>
  131. <ul class="dropdown-menu">
  132. <li><a href="settings/index.html"><span class="glyphicon glyphicon-wrench"></span> 系统设置</a></li>
  133. <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myInformation"><span class="glyphicon glyphicon-file"></span> 我的资料</a></li>
  134. <li><a href="javascript:void(0)" data-toggle="modal" data-target="#editPwdModal"><span class="glyphicon glyphicon-edit"></span> 修改密码</a></li>
  135. <li><a href="javascript:void(0);" data-toggle="modal" data-target="#exitModal"><span class="glyphicon glyphicon-off"></span> 退出</a></li>
  136. </ul>
  137. </li>
  138. </ul>
  139. </div>
  140. </div>
  141. <!-- 中间 -->
  142. <div id="center" style="position: absolute;top: 50px; bottom: 30px; left: 0px; right: 0px;">
  143. <!-- 导航 -->
  144. <div id="navigation" style="left: 0px; width: 18%; position: relative; height: 100%; overflow:auto;">
  145. <ul id="no1" class="nav nav-pills nav-stacked">
  146. <li class="liClass"><a href="main/index.html" target="workareaFrame"><span class="glyphicon glyphicon-home"></span> 工作台</a></li>
  147. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-tag"></span> 动态</a></li>
  148. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-time"></span> 审批</a></li>
  149. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-user"></span> 客户公海</a></li>
  150. <li class="liClass"><a href="activity/index.html" target="workareaFrame"><span class="glyphicon glyphicon-play-circle"></span> 市场活动</a></li>
  151. <li class="liClass"><a href="clue/index.html" target="workareaFrame"><span class="glyphicon glyphicon-search"></span> 线索(潜在客户)</a></li>
  152. <li class="liClass"><a href="customer/index.html" target="workareaFrame"><span class="glyphicon glyphicon-user"></span> 客户</a></li>
  153. <li class="liClass"><a href="contacts/index.html" target="workareaFrame"><span class="glyphicon glyphicon-earphone"></span> 联系人</a></li>
  154. <li class="liClass"><a href="transaction/index.html" target="workareaFrame"><span class="glyphicon glyphicon-usd"></span> 交易(商机)</a></li>
  155. <li class="liClass"><a href="visit/index.html" target="workareaFrame"><span class="glyphicon glyphicon-phone-alt"></span> 售后回访</a></li>
  156. <li class="liClass">
  157. <a href="#no2" class="collapsed" data-toggle="collapse"><span class="glyphicon glyphicon-stats"></span> 统计图表</a>
  158. <ul id="no2" class="nav nav-pills nav-stacked collapse">
  159. <li class="liClass"><a href="chart/activity/index.html" target="workareaFrame">&nbsp;&nbsp;&nbsp;<span class="glyphicon glyphicon-chevron-right"></span> 市场活动统计图表</a></li>
  160. <li class="liClass"><a href="chart/clue/index.html" target="workareaFrame">&nbsp;&nbsp;&nbsp;<span class="glyphicon glyphicon-chevron-right"></span> 线索统计图表</a></li>
  161. <li class="liClass"><a href="chart/customerAndContacts/index.html" target="workareaFrame">&nbsp;&nbsp;&nbsp;<span class="glyphicon glyphicon-chevron-right"></span> 客户和联系人统计图表</a></li>
  162. <li class="liClass"><a href="chart/transaction/index.html" target="workareaFrame">&nbsp;&nbsp;&nbsp;<span class="glyphicon glyphicon-chevron-right"></span> 交易统计图表</a></li>
  163. </ul>
  164. </li>
  165. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-file"></span> 报表</a></li>
  166. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-shopping-cart"></span> 销售订单</a></li>
  167. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-send"></span> 发货单</a></li>
  168. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-earphone"></span> 跟进</a></li>
  169. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-leaf"></span> 产品</a></li>
  170. <li class="liClass"><a href="javascript:void(0);" target="workareaFrame"><span class="glyphicon glyphicon-usd"></span> 报价</a></li>
  171. </ul>
  172. <!-- 分割线 -->
  173. <div id="divider1" style="position: absolute; top : 0px; right: 0px; width: 1px; height: 100% ; background-color: #B3B3B3;"></div>
  174. </div>
  175. <!-- 工作区 -->
  176. <div id="workarea" style="position: absolute; top : 0px; left: 18%; width: 82%; height: 100%;">
  177. <iframe style="border-width: 0px; width: 100%; height: 100%;" name="workareaFrame"></iframe>
  178. </div>
  179. </div>
  180. <div id="divider2" style="height: 1px; width: 100%; position: absolute;bottom: 30px; background-color: #B3B3B3;"></div>
  181. <!-- 底部 -->
  182. <div id="down" style="height: 30px; width: 100%; position: absolute;bottom: 0px;"></div>
  183. </body>
  184. </html>

image.png

五、完善功能

1.登录成功之后,所有业务页面显示当前用户的名称

回顾知识点:

pageContext:同一页面不同标签之间传递数据。 request:在同一个请求过程中传递数据。 sesson:在同一个浏览器窗口的不同请求之间传递数据。 application:所有用户共享的数据,并且是频繁使用的

我们把”sessionUser”设置为一个常量,将来改的时候只需要改这个就行

  1. public class Contants {
  2. //保存ReturnObject类中的Code值
  3. public static final String RETURN_OBJECT_CODE_SUCCESS="1";//成功的
  4. public static final String RETURN_OBJECT_CODE_FAIL="0";//失败的
  5. //保存当前用户的key
  6. public static final String SESSION_USER="sessionUser";
  7. }
  1. public Object login(String loginAct, String loginPwd, String isRemPwd, HttpServletRequest request, HttpSession session){
  2. //封装参数
  3. Map<String,Object> map=new HashMap<>();
  4. map.put("loginAct",loginAct);
  5. map.put("loginPwd",loginPwd);
  6. //调用service层方法,查询用户
  7. User user=userService.selectUserByLoginActAndPwd(map);
  8. //根据查询结果,生成响应信息
  9. ReturnObject returnObject =new ReturnObject();
  10. if(user==null){
  11. //登录失败,用户名或者密码错误
  12. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  13. returnObject.setMessage("用户名或者密码错误");
  14. }else{//进一步判断账号是否合法
  15. //user.getExpireTime() //2019-10-20
  16. // new Date() //2020-09-10
  17. String nowStr= DateUtils.formateDateTime(new Date());
  18. if(nowStr.compareTo(user.getExpireTime())>0){
  19. //登录失败,账号已过期
  20. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  21. returnObject.setMessage("账号已过期");
  22. }else if("0".equals(user.getLockState())){
  23. //登录失败,状态被锁定
  24. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  25. returnObject.setMessage("状态被锁定");
  26. }else if(!user.getAllowIps().contains(request.getRemoteAddr())){
  27. //登录失败,ip受限
  28. returnObject.setCode(Contants.RETURN_OBJECT_CODE_FAIL);
  29. returnObject.setMessage("ip受限");
  30. }else{
  31. //登录成功
  32. returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
  33. //把User保存到session中
  34. session.setAttribute(Contants.SESSION_USER,user);
  35. }
  36. }
  1. <!-- 顶部 -->
  2. <div id="top" style="height: 50px; background-color: #3C3C3C; width: 100%;">
  3. <div style="position: absolute; top: 5px; left: 0px; font-size: 30px; font-weight: 400; color: white; font-family: 'times new roman'">CRM &nbsp;<span style="font-size: 12px;">&copy;2019&nbsp;动力节点</span></div>
  4. <div style="position: absolute; top: 15px; right: 15px;">
  5. <ul>
  6. <li class="dropdown user-dropdown">
  7. <a href="javascript:void(0)" style="text-decoration: none; color: white;" class="dropdown-toggle" data-toggle="dropdown">
  8. <span class="glyphicon glyphicon-user"></span> ${sessionScope.sessionUser.name}<span class="caret"></span>
  9. </a>
  10. <ul class="dropdown-menu">
  11. <li><a href="../settings/index.html"><span class="glyphicon glyphicon-wrench"></span> 系统设置</a></li>
  12. <li><a href="javascript:void(0)" data-toggle="modal" data-target="#myInformation"><span class="glyphicon glyphicon-file"></span> 我的资料</a></li>
  13. <li><a href="javascript:void(0)" data-toggle="modal" data-target="#editPwdModal"><span class="glyphicon glyphicon-edit"></span> 修改密码</a></li>
  14. <li><a href="javascript:void(0);" data-toggle="modal" data-target="#exitModal"><span class="glyphicon glyphicon-off"></span> 退出</a></li>
  15. </ul>
  16. </li>
  17. </ul>
  18. </div>
  19. </div>

添加一个小功能
image.png

  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%
  3. String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
  4. %>
  5. <html>
  6. <head>
  7. <base href="<%=basePath%>">
  8. <meta charset="UTF-8">
  9. <link href="jquery/bootstrap_3.3.0/css/bootstrap.min.css" type="text/css" rel="stylesheet" />
  10. <script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script>
  11. <script type="text/javascript" src="jquery/bootstrap_3.3.0/js/bootstrap.min.js"></script>
  12. <script type="text/javascript">
  13. $(function () {
  14. //给"登录"按钮添加单击事件
  15. $("#loginBtn").click(function () {
  16. //收集参数
  17. var loginAct=$.trim($("#loginAct").val());
  18. var loginPwd=$.trim($("#loginPwd").val());
  19. var isRemPwd=$("#isRemPwd").prop("checked");
  20. //表单验证
  21. if(loginAct==""){
  22. alert("用户名不能为空");
  23. return;
  24. }
  25. if(loginPwd==""){
  26. alert("密码不能为空");
  27. return;
  28. }
  29. //1.第一种方式在这个地方也可以
  30. //显示正在验证
  31. //$("#msg").text("正在努力验证");
  32. //发送请求
  33. $.ajax({
  34. url:'settings/qx/user/login.do',
  35. data:{
  36. loginAct:loginAct,
  37. loginPwd:loginPwd,
  38. isRemPwd:isRemPwd
  39. },
  40. type:'post',
  41. dataType:'json',
  42. success:function (data) {
  43. if(data.code=="1"){
  44. //跳转到业务主页面
  45. window.location.href="workbench/index.do";
  46. }else{
  47. //提示信息
  48. $("#msg").text(data.message);
  49. }
  50. },
  51. //第二种方式在这个地方
  52. beforeSend:function (){ //当ajax向后台发送请求之前,会自动执行本函数
  53. //该函数的返回值能决定ajax是否真正向后台发送请求。
  54. //如果该函数返回true,则ajax会真正向后台发送请求,否则不会发送请求
  55. //显示正在验证
  56. $("#msg").text("正在努力验证");
  57. }
  58. });
  59. });
  60. });
  61. </script>
  62. </head>
  63. <body>
  64. <div style="position: absolute; top: 0px; left: 0px; width: 60%;">
  65. <img src="image/IMG_7114.JPG" style="width: 100%; height: 90%; position: relative; top: 50px;">
  66. </div>
  67. <div id="top" style="height: 50px; background-color: #3C3C3C; width: 100%;">
  68. <div style="position: absolute; top: 5px; left: 0px; font-size: 30px; font-weight: 400; color: white; font-family: 'times new roman'">CRM &nbsp;<span style="font-size: 12px;">&copy;2019&nbsp;动力节点</span></div>
  69. </div>
  70. <div style="position: absolute; top: 120px; right: 100px;width:450px;height:400px;border:1px solid #D5D5D5">
  71. <div style="position: absolute; top: 0px; right: 60px;">
  72. <div class="page-header">
  73. <h1>登录</h1>
  74. </div>
  75. <form action="workbench/index.html" class="form-horizontal" role="form">
  76. <div class="form-group form-group-lg">
  77. <div style="width: 350px;">
  78. <input class="form-control" id="loginAct" type="text" placeholder="用户名">
  79. </div>
  80. <div style="width: 350px; position: relative;top: 20px;">
  81. <input class="form-control" id="loginPwd" type="password" placeholder="密码">
  82. </div>
  83. <div class="checkbox" style="position: relative;top: 30px; left: 10px;">
  84. <label>
  85. <input type="checkbox" id="isRemPwd"> 十天内免登录
  86. </label>
  87. &nbsp;&nbsp;
  88. <span id="msg" style="color: red"></span>
  89. </div>
  90. <button type="button" id="loginBtn" class="btn btn-primary btn-lg btn-block" style="width: 350px; position: relative;top: 45px;">登录</button>
  91. </div>
  92. </form>
  93. </div>
  94. </div>
  95. </body>
  96. </html>

2.实现回车登录

知识点:jquery事件函数的用法

  1. 1.**选择器.click(function(){ //给指定的元素添加事件**

//js代码 });

2.选择器.click();//在指定的元素上模拟发生的一次事件

  1. //...............
  2. $(function () {
  3. //给整个浏览器窗口添加键盘按下事件
  4. $(window).keydown(function (e){
  5. //如果按下的是回车键,则提交登录请求
  6. if(e.keyCode==13){
  7. $("#loginBtn").click();
  8. }
  9. });
  10. //给"登录"按钮添加单击事件
  11. $("#loginBtn").click(function () {
  12. //收集参数
  13. var loginAct=$.trim($("#loginAct").val());
  14. var loginPwd=$.trim($("#loginPwd").val());
  15. var isRemPwd=$("#isRemPwd").prop("checked");
  16. //表单验证
  17. if(loginAct==""){
  18. alert("用户名不能为空");
  19. return;
  20. }
  21. if(loginPwd==""){
  22. alert("密码不能为空");
  23. return;
  24. }
  25. //............

3.实现记住密码十天内免登录

如果上次记住密码,自动填上账户和密码,否则,不填。
如何判断上次记住密码?
—上次登录成功,判断是否需要记住密码:如果需要记住密码,则往浏览器写cookie;否则.删除cookie。
而且cookie的值必须是该用户的loginAct和loginPwd。
—下次登录时,判断该用户有没有cookie,如果有则自动填写账号和密码,如果没有则不写。
而且填写的是cookie的值。

  1. returnObject.setMessage("ip受限");
  2. }else{
  3. //登录成功
  4. returnObject.setCode(Contants.RETURN_OBJECT_CODE_SUCCESS);
  5. //把User保存到session中
  6. session.setAttribute(Contants.SESSION_USER,user);
  7. //如果需要记住密码,则写cookie
  8. if("true".equals(isRemPwd)){
  9. Cookie c1 =new Cookie("loginAct",user.getLoginAct());
  10. c1.setMaxAge(10*24*60*60);
  11. response.addCookie(c1);
  12. Cookie c2= new Cookie("loginPwd",user.getLoginPwd());
  13. c2.setMaxAge(10*24*60*60);
  14. response.addCookie(c2);
  15. }else{
  16. //把没有过期的cookie删除
  17. Cookie c1= new Cookie("loginAct","1");
  18. c1.setMaxAge(0);
  19. response.addCookie(c1);
  20. Cookie c2= new Cookie("loginPwd","1");
  21. c2.setMaxAge(0);
  22. response.addCookie(c2);
  23. }
  24. }
  25. }
  26. return returnObject;
  1. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  2. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  3. <%
  4. String basePath=request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+request.getContextPath()+"/";
  5. %>
  6. <html>
  7. <head>
  8. <base href="<%=basePath%>">
  9. <meta charset="UTF-8">
  10. <link href="jquery/bootstrap_3.3.0/css/bootstrap.min.css" type="text/css" rel="stylesheet" />
  11. <script type="text/javascript" src="jquery/jquery-1.11.1-min.js"></script>
  12. <script type="text/javascript" src="jquery/bootstrap_3.3.0/js/bootstrap.min.js"></script>
  13. <script type="text/javascript">
  14. $(function () {
  15. //给整个浏览器窗口添加键盘按下事件
  16. $(window).keydown(function (e){
  17. //如果按下的是回车键,则提交登录请求
  18. if(e.keyCode==13){
  19. $("#loginBtn").click();
  20. }
  21. });
  22. //给"登录"按钮添加单击事件
  23. $("#loginBtn").click(function () {
  24. //收集参数
  25. var loginAct=$.trim($("#loginAct").val());
  26. var loginPwd=$.trim($("#loginPwd").val());
  27. var isRemPwd=$("#isRemPwd").prop("checked");
  28. //表单验证
  29. if(loginAct==""){
  30. alert("用户名不能为空");
  31. return;
  32. }
  33. if(loginPwd==""){
  34. alert("密码不能为空");
  35. return;
  36. }
  37. //1.第一种方式在这个地方也可以
  38. //显示正在验证
  39. //$("#msg").text("正在努力验证");
  40. //发送请求
  41. $.ajax({
  42. url:'settings/qx/user/login.do',
  43. data:{
  44. loginAct:loginAct,
  45. loginPwd:loginPwd,
  46. isRemPwd:isRemPwd
  47. },
  48. type:'post',
  49. dataType:'json',
  50. success:function (data) {
  51. if(data.code=="1"){
  52. //跳转到业务主页面
  53. window.location.href="workbench/index.do";
  54. }else{
  55. //提示信息
  56. $("#msg").text(data.message);
  57. }
  58. },
  59. //第二种方式在这个地方
  60. beforeSend:function (){ //当ajax向后台发送请求之前,会自动执行本函数
  61. //该函数的返回值能决定ajax是否真正向后台发送请求。
  62. //如果该函数返回true,则ajax会真正向后台发送请求,否则不会发送请求
  63. //显示正在验证
  64. $("#msg").text("正在努力验证");
  65. }
  66. });
  67. });
  68. });
  69. </script>
  70. </head>
  71. <body>
  72. <div style="position: absolute; top: 0px; left: 0px; width: 60%;">
  73. <img src="image/IMG_7114.JPG" style="width: 100%; height: 90%; position: relative; top: 50px;">
  74. </div>
  75. <div id="top" style="height: 50px; background-color: #3C3C3C; width: 100%;">
  76. <div style="position: absolute; top: 5px; left: 0px; font-size: 30px; font-weight: 400; color: white; font-family: 'times new roman'">CRM &nbsp;<span style="font-size: 12px;">&copy;2019&nbsp;动力节点</span></div>
  77. </div>
  78. <div style="position: absolute; top: 120px; right: 100px;width:450px;height:400px;border:1px solid #D5D5D5">
  79. <div style="position: absolute; top: 0px; right: 60px;">
  80. <div class="page-header">
  81. <h1>登录</h1>
  82. </div>
  83. <form action="workbench/index.html" class="form-horizontal" role="form">
  84. <div class="form-group form-group-lg">
  85. <div style="width: 350px;">
  86. <input class="form-control" id="loginAct" type="text" value="${cookie.loginAct.value}" placeholder="用户名">
  87. </div>
  88. <div style="width: 350px; position: relative;top: 20px;">
  89. <input class="form-control" id="loginPwd" type="password" value="${cookie.loginPwd.value}" placeholder="密码">
  90. </div>
  91. <div class="checkbox" style="position: relative;top: 30px; left: 10px;">
  92. <label>
  93. <c:if test="${not empty cookie.loginAct and not empty cookie.loginPwd}">
  94. <input type="checkbox" id="isRemPwd" checked="true">
  95. </c:if>
  96. <c:if test="${empty cookie.loginAct or empty cookie.loginPwd}">
  97. <input type="checkbox" id="isRemPwd" >
  98. </c:if>
  99. 十天内免登录
  100. </label>
  101. &nbsp;&nbsp;
  102. <span id="msg" style="color: red"></span>
  103. </div>
  104. <button type="button" id="loginBtn" class="btn btn-primary btn-lg btn-block" style="width: 350px; position: relative;top: 45px;">登录</button>
  105. </div>
  106. </form>
  107. </div>
  108. </div>
  109. </body>
  110. </html>