(简易SSM框架搭建)物流查询系统

ssm框架原理是:将Spring、SpringMVC、MyBatis整合在一起,作为数据源较简单的web项目的框架。 它有效规避servlet的繁杂加载驱动等一系列程序,选用MyBatis进行与数据库的连接。

目录

首先:新建工程Maven。

2.在pom.xml文件中进行引用和下载,(导包的过程) 

 3.Mybatis的配置文件db.properties 和log4j.properties(日志)

 4.user类的创建(关联的表都创建相关类)

 5.userMapper.xml文件配置

(主要操作,如果字段名错误,就不能连接到数据库)

 6.配置其他xml文件:

7、数据库

​编辑 ​编辑

8. userMapper

 9.service:接口和实现类

 10.前端界面:

 11.controller

 12.关于加密:MD5

 13.关于分页部分:


  1. 首先:新建工程Maven。

2.在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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
  <modelVersion>4.0.0</modelVersion>

  <groupId>com.hqyj.poison</groupId>
  <artifactId>ssm</artifactId>
  <version>1.0-SNAPSHOT</version>
  <packaging>war</packaging>

  <name>ssm Maven Webapp</name>
  <!-- FIXME change it to the project's website -->
  <url>http://www.example.com</url>

  <properties>
    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
    <maven.compiler.source>1.7</maven.compiler.source>
    <maven.compiler.target>1.7</maven.compiler.target>
  </properties>

  <dependencies>
    <dependency>
      <groupId>junit</groupId>
      <artifactId>junit</artifactId>
      <version>4.11</version>
      <scope>test</scope>
    </dependency>

    <!--spring -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-context</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>
    <!--事务-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-tx</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>

    <!--spring  jdbc-->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-jdbc</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>
    <!--配置webmvc -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-webmvc</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>

    <!--配置切面的jar包 -->
    <dependency>
      <groupId>org.springframework</groupId>
      <artifactId>spring-aspects</artifactId>
      <version>4.3.13.RELEASE</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/aopalliance/aopalliance -->
    <dependency>
      <groupId>aopalliance</groupId>
      <artifactId>aopalliance</artifactId>
      <version>1.0</version>
    </dependency>

    <!--mybatis,用来加载SqlSessionFactoryBean和MapperScannerConfigurer -->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis</artifactId>
      <version>3.5.0</version>
    </dependency>
    <!-- https://mvnrepository.com/artifact/org.mybatis/mybatis-spring -->
    <!--spring整合mybatis的依赖包-->
    <dependency>
      <groupId>org.mybatis</groupId>
      <artifactId>mybatis-spring</artifactId>
      <version>1.3.2</version>
    </dependency>

    <!--  mybatis分页需要的jar  -->
    <dependency>
      <groupId>com.github.pagehelper</groupId>
      <artifactId>pagehelper</artifactId>
      <version>5.1.2</version>
    </dependency>
    <!-- 连接池,用来加载DruidDataSource-->
    <dependency>
      <groupId>com.alibaba</groupId>
      <artifactId>druid</artifactId>
      <version>1.0.9</version>
    </dependency>
    <!--json处理工具包 -->
    <dependency>
      <groupId>com.fasterxml.jackson.core</groupId>
      <artifactId>jackson-databind</artifactId>
      <version>2.9.0</version>
    </dependency>
    <!--日志文件 -->
    <dependency>
      <groupId>org.slf4j</groupId>
      <artifactId>slf4j-log4j12</artifactId>
      <version>1.7.22</version>
    </dependency>
    <!--servlet相关jar-->
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>servlet-api</artifactId>
      <version>2.5</version>
    </dependency>
    <dependency>
      <groupId>javax.servlet</groupId>
      <artifactId>jsp-api</artifactId>
      <version>2.0</version>
    </dependency>
   
    <dependency>
      <groupId>mysql</groupId>
      <artifactId>mysql-connector-java</artifactId>
      <version>5.1.38</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.apache.shiro/shiro-all -->
    <dependency>
      <groupId>org.apache.shiro</groupId>
      <artifactId>shiro-all</artifactId>
      <version>1.3.2</version>
    </dependency>

    <!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
    <dependency>
      <groupId>org.projectlombok</groupId>
      <artifactId>lombok</artifactId>
      <version>1.18.12</version>
      <scope>provided</scope>
    </dependency>

  </dependencies>

  <build>
    <finalName>ssm</finalName>
    <pluginManagement><!-- lock down plugins versions to avoid using Maven defaults (may be moved to parent pom) -->
      <plugins>
        <plugin>
          <artifactId>maven-clean-plugin</artifactId>
          <version>3.1.0</version>
        </plugin>
        <!-- see http://maven.apache.org/ref/current/maven-core/default-bindings.html#Plugin_bindings_for_war_packaging -->
        <plugin>
          <artifactId>maven-resources-plugin</artifactId>
          <version>3.0.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-compiler-plugin</artifactId>
          <version>3.8.0</version>
        </plugin>
        <plugin>
          <artifactId>maven-surefire-plugin</artifactId>
          <version>2.22.1</version>
        </plugin>
        <plugin>
          <artifactId>maven-war-plugin</artifactId>
          <version>3.2.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-install-plugin</artifactId>
          <version>2.5.2</version>
        </plugin>
        <plugin>
          <artifactId>maven-deploy-plugin</artifactId>
          <version>2.8.2</version>
        </plugin>
      </plugins>
    </pluginManagement>
  </build>
</project>

 3.Mybatis的配置文件db.properties 和log4j.properties(日志)

jdbc.driverClassName=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://127.0.0.1:3306/ssm?useUnicode=true&characterEncoding=utf8
jdbc.username=root
jdbc.password=123456
maxActive:20
initialSize:1
maxWait:60000
minIdle:10
log4j.rootLogger=DEBUG, Console
#Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=%d [%t] %-5p [%c] - %m%n
log4j.logger.java.sql.ResultSet=INFO
log4j.logger.org.apache=INFO
log4j.logger.java.sql.Connection=DEBUG
log4j.logger.java.sql.Statement=DEBUG
log4j.logger.java.sql.PreparedStatement=DEBUG

 4.user类的创建(关联的表都创建相关类)

@Data注解可以省略get、set方法,但是使用需要下载lombok插件。

关于@JsonFormat注解,跳转连接如下:jackSon中@JsonFormat注解使用详解_灬叛逆丿文的博客-CSDN博客_jsonformat注解原理

package com.hqyj.poison.entity;

import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.Data;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;
import java.util.List;

@Data
public class User {
    private Integer userId;
    private String userName;
    private String userPwd;
    private String userSex;
    private Integer userAge;
    private String userTel;
    @JsonFormat(pattern = "yyyy-MM-dd",timezone = "GMT+8")
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date userBirthday;
    private String userEmail;
    private List<Role> roleList;
}

 5.userMapper.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接口的完全限定名作为命名空间-->
<mapper namespace="com.hqyj.poison.mapper.UserMapper">
    <resultMap id="userMap" type="User">
<!--colum是数据库的字段名;property是java类中的属性名。-->
        <id column="user_id" property="userId"></id>
        <result column="user_name" property="userName"></result>
        <result column="user_tel" property="userTel"></result>
        <result column="user_age" property="userAge"></result>
        <result column="user_sex" property="userSex"></result>
        <result column="user_password" property="userPwd"></result>
        <result column="user_email" property="userEmail"></result>
        <result column="user_birthday" property="userBirthday"></result>
    </resultMap>

    <resultMap id="userMap1" type="User">
        <id column="id" property="userId"></id>
        <result column="user_name" property="userName"></result>
        <result column="user_tel" property="userTel"></result>
        <result column="user_age" property="userAge"></result>
        <result column="user_sex" property="userSex"></result>
        <result column="user_password" property="userPwd"></result>
        <result column="user_email" property="userEmail"></result>
        <result column="user_birthday" property="userBirthday"></result>
        <collection property="roleList" ofType="Role">
            <id column="role_id" property="roleId"></id>
            <result column="role_name" property="roleName"></result>
        </collection>
    </resultMap>
    <resultMap id="orderMap" type="Order">
        <id column="order_id" property="orderId"></id>
        <result column="order_no" property="orderNo"></result>
        <result column="order_people" property="orderPeople"></result>
        <result column="order_freight" property="orderFreight"></result>
        <result column="order_tel" property="orderTel"></result>
        <result column="give_method" property="giveMethod"></result>
        <result column="order_time" property="orderTime"></result>
    </resultMap>

                        <!--    订单表-->
    <!--    查询订单id与方法名相一致-->
    <select id="selectOrderByQueryBean" resultMap="orderMap">
        select * from orders
        <where>
            <if test="orderTel!=null and orderTel!=''"> and order_tel =#{orderTel} </if>
        </where>
        limit #{startIndex},#{pageSize}
    </select>
<!--订单总数-->
    <select id="selectCountToOrder" resultType="int">
        select count(*) from orders
        <where>
            <if test="orderTel!=null and orderTel!=''"> and order_tel =#{orderTel} </if>
        </where>
    </select>
<!--删除订单-->
    <delete id="deleteOrderById"> delete from orders where order_id = #{orderId} </delete>
<!--    修改订单-->
    <update id="updateOrder"> update orders set
    order_people = #{orderPeople}, order_freight = #{orderFreight}, order_tel = #{orderTel},
    give_method = #{giveMethod}, order_time = #{orderTime}
    where order_id = #{orderId}
 </update>
<!--    按编号查询-->
    <select id="selectOrderByNo" resultMap="orderMap">
        select * from orders where order_no = #{orderNo}
    </select>
<!--增加订单-->
    <insert id="insertOrder">
        insert into orders
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="orderPeople!=null and orderPeople!=''">
                order_people,
            </if>
            <if test="orderNo!=null and orderNo!=''">
                order_no,
            </if>
            <if test="orderFreight!=null and orderFreight!=''">
                order_freight,
            </if>
            <if test="orderTel!=null and orderTel!=''">
                order_tel,
            </if>
            <if test="giveMethod!=null and giveMethod!=''">
                give_method,
            </if>
            <if test="orderTime!=null">
                order_time,
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="orderPeople!=null and orderPeople!=''">
                #{orderPeople},
            </if>
            <if test="orderNo!=null and orderNo!=''">
                #{orderNo},
            </if>
            <if test="orderFreight!=null and orderFreight!=''">
                #{orderFreight},
            </if>
            <if test="orderTel!=null and orderTel!=''">
                #{orderTel},
            </if>
            <if test="giveMethod!=null and giveMethod!=''">
                #{giveMethod},
            </if>
            <if test="orderTime!=null">
                #{orderTime},
            </if>
        </trim>
    </insert>


                        <!--    用户表-->
    <select id="selectUser" resultMap="userMap"> select * from user where user_name=#{userName} </select>
<!--    查询权限-->
    <select id="selectUserAndRole" resultMap="userMap1"> SELECT*FROM user u,user_role m, role r where u.user_id = m.user_id and m.role_id = r.role_id and u.user_name = #{userName} </select>
<!--    查询用户-->
    <select id="selectUserByQueryBean" resultMap="userMap">
        select * from user
        <where>
            <if test="userName!=null and userName!=''"> and user_name like concat(#{userName},"%") </if>
            <if test="userTel!=null and userTel!=''"> and user_tel like concat(#{userTel},"%") </if>
        </where>
        limit #{startIndex},#{pageSize}
    </select>
<!--    查询账号密码是否一致-->
    <select id="queryUsersByIdAndPwd" resultMap="userMap">
        select  * from user where user_name = #{userName} and user_password = #{userPwd}
    </select>
<!--    修改密码-->
    <update id="updateUserPwdByName">
        update user set user_password = #{userPwd} where user_name = #{userName}
    </update>
<!--    统计用户数量-->
    <select id="selectCount" resultType="int">
        select count(*) from user
        <where>
            <if test="userName!=null and userName!=''"> and user_name like concat(#{userName},"%") </if>
            <if test="userTel!=null and userTel!=''"> and user_tel like concat(#{userTel},"%") </if>
        </where>
    </select>
<!--    删除用户-->
    <delete id="deleteUserById"> delete from user where user_id = #{userId} </delete>
<!--    修改用户-->
    <update id="updateUser"> update user set user_name = #{userName}, user_sex = #{userSex}, user_tel = #{userTel}, user_age = #{userAge}, user_birthday = #{userBirthday}, user_email = #{userEmail} where user_id = #{userId} </update>


<!--    注册-->
    <insert id="registered">
        insert into user
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userName!=null and userName!=''">
                user_name,
            </if>
            <if test="userPwd!=null and userPwd!=''">
                user_password,
            </if>
            <if test="userTel!=null and userTel!=''">
                user_tel,
            </if>
            <if test="userAge!=null and userAge!=''">
                user_age,
            </if>
            <if test="userSex!=null and userSex!=''">
                user_sex,
            </if>
            <if test="userBirthday!=null">
                user_birthday,
            </if>
            <if test="userEmail!=null and userEmail!=''">
                user_email,
            </if>
        </trim>
        values
        <trim prefix="(" suffix=")" suffixOverrides=",">
            <if test="userName!=null and userName!=''">
                #{userName},
            </if>
            <if test="userPwd!=null and userPwd!=''">
                #{userPwd},
            </if>
            <if test="userTel!=null and userTel!=''">
                #{userTel},
            </if>
            <if test="userAge!=null and userAge!=''">
                #{userAge},
            </if>
            <if test="userSex!=null and userSex!=''">
                #{userSex},
            </if>
            <if test="userBirthday!=null">
                #{userBirthday},
            </if>
            <if test="userEmail!=null and userEmail!=''">
                #{userEmail},
            </if>
        </trim>
    </insert>
</mapper>

 6.配置其他xml文件:

applicationContext.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
">
    <!--开启注解扫描-->
    <context:component-scan base-package="com.hqyj.poison.*"/>

    <!--读取properties文件-->
    <context:property-placeholder location="classpath:properties/*.properties"/>
    <!-- 配置druid数据源 -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
        <property name="driverClassName" value="${jdbc.driverClassName}" />
        <property name="url" value="${jdbc.url}" />
        <property name="username" value="${jdbc.username}" />
        <property name="password" value="${jdbc.password}" />
        <!-- 最大并发连接数 -->
        <property name="maxActive" value="${maxActive}" />
        <!-- 初始化连接数量 -->
        <property name="initialSize" value="${initialSize}" />
        <!-- 最小空闲连接数 -->
        <property name="minIdle" value="${minIdle}" />
        <!-- 配置获取连接等待超时的时间 -->
        <property name="maxWait" value="${maxWait}" />
    </bean>

    <import resource="springMybatis.xml"></import>
    <import resource="springTransaction.xml"></import>
    <import resource="springShiro.xml"></import>
</beans>

 springmvc.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <!--开启包扫描-->
    <context:component-scan base-package="com.hqyj.poison.*"></context:component-scan>
    <!--开启mvc的注解驱动-->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--静态资源放行-->
    <mvc:resources mapping="/static/**" location="/static/"></mvc:resources>

    <!--配置mvc的视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="../view/"></property>
        <property name="suffix" value=".jsp"></property>
    </bean>
    <!-- 开启shiro注解支持 -->
    <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">
        <property name="securityManager" ref="securityManager" />
    </bean>
    <!-- 开启aop,对类代理 -->
    <aop:config proxy-target-class="true"/>

</beans>

springMybatis.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xsi:schemaLocation="
        http://www.springframework.org/schema/beans
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd
">

<!--配置sqlsessionFactory-->
    <bean class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource"></property>
        <!--配置映射文件的路径-->
        <property name="mapperLocations" value="classpath:mapper/*.xml"/>
        <!--配置别名-->
        <property name="typeAliasesPackage" value="com.hqyj.poison.entity"></property>
    </bean>

    <!--
    接口开发,扫描 com.hqyj.poison.dao包 ,写在此包下的接口即可被扫描到
    通过sqlsessionFactory得到sqlSession
    sqlSession.getMapper(UserMapper.class);(帮我们做了,不用再单独配置)
    -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.hqyj.poison.mapper"/>
    </bean>
</beans>

 springShiro.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
	xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
	xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-4.3.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-4.3.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop-4.3.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx-4.3.xsd">
   	<!-- shiro相关配置 -->
	
	<!-- 配置自定义数据源myRealm -->
	<bean id="myRealm" class="com.hqyj.poison.realm.MyRealm">
<!--		&lt;!&ndash; 注入凭证匹配 &ndash;&gt;-->
		<property name="credentialsMatcher" ref="credentialsMatcher"></property>
	</bean>

	<!-- 凭证匹配器 -->
	<bean id="credentialsMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
		<property name="hashAlgorithmName" value="md5" />
		<property name="hashIterations" value="1024" />
	</bean>
	<!-- 配置安全管理器 -->
	<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
		<property name="realm" ref="myRealm"></property>
	</bean>

	<!-- 配置authc,默认表单的用户名和密码必须是:username,password -->
<!--	<bean id="authc" class="org.apache.shiro.web.filter.authc.FormAuthenticationFilter">-->
<!--		<property name="usernameParam" value="userName"></property>-->
<!--		<property name="passwordParam" value="userPassword"></property>-->
<!--	</bean>-->

	<!-- 配置shiro过滤器 -->
	<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
		<property name="securityManager" ref="securityManager" />
		<!-- loginUrl认证提交地址,如果没有认证将会请求此地址进行认证,请求此地址将由formAuthenticationFilter进行表单认证 -->
		<property name="loginUrl" value="/sys/gologin" />
		<property name="successUrl" value="/sys/index"></property>
		<!-- 授权不通过(不具备相应权限) 走该地址-->
		<property name="unauthorizedUrl" value="/sys/error"></property>

		<!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 anon表示放行-->
		<property name="filterChainDefinitions">
			<value>
				/new=anon
				/sys/login=anon
				/sys/gologin=anon
				/sys/error=anon
				/sys/register=anon
				/sys/goregister=anon
				/sys/loginOut=logout
				/static/**=anon
				<!-- user表示身份认证通过或通过记住我认证通过的可以访问 -->
<!--				/**=user-->
				<!-- 所有请求都要认证 -->
				 /**=authc
			</value>
		</property>
	</bean>
   	
</beans>

springTransaction.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xsi:schemaLocation="http://www.springframework.org/schema/beans
       http://www.springframework.org/schema/beans/spring-beans.xsd
       http://www.springframework.org/schema/aop
       http://www.springframework.org/schema/aop/spring-aop.xsd
       http://www.springframework.org/schema/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">
    <!-- 配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 注入数据源 -->
        <property name="dataSource" ref="dataSource"></property>
    </bean>
    <!-- 配置通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED"/>
            <tx:method name="remove*" propagation="REQUIRED"/>
            <tx:method name="query*" propagation="SUPPORTS" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    <aop:config>
        <aop:advisor advice-ref="txAdvice" pointcut="execution(* com.hqyj.poison.service.*.*(..))"/>
    </aop:config>
<!--在 Spring容器中注册事务注解驱动-->
<!--    <tx:annotation-driven transaction-manager="transactionManager" />-->
</beans>

7、数据库

 

 

8. userMapper

每个方法对应到service中:

package com.hqyj.poison.mapper;

import com.hqyj.poison.entity.Order;
import com.hqyj.poison.entity.Pwd;
import com.hqyj.poison.entity.User;
import com.hqyj.poison.query.QueryOrderBean;
import com.hqyj.poison.query.QueryUserBean;
import com.hqyj.poison.result.ResultInfo;
import org.aspectj.weaver.ast.Or;

import java.util.List;

public interface UserMapper {
    User selectUser(String userName);
    User selectUserAndRole(String userName);
    User queryUsersByIdAndPwd(Pwd pwd);
    void registered(User user);
    List<User> selectUserByQueryBean(QueryUserBean queryUserBean);
    Integer selectCount(QueryUserBean queryUserBean);
    void updateUserPwdByName(Pwd pwd);

    void deleteUserById(Integer userId);
    void updateUser(User user);

    List<Order> selectOrderByQueryBean(QueryOrderBean queryOrderBean);
    Integer selectCountToOrder(QueryOrderBean queryOrderBean);

    void deleteOrderById(Integer orderId);
    void updateOrder(Order order);
    void insertOrder(Order order);

    Order selectOrderByNo(String orderNo);
}

 9.service:接口和实现类

 

接口:

package com.hqyj.poison.service;

import com.hqyj.poison.entity.Order;
import com.hqyj.poison.entity.Pwd;
import com.hqyj.poison.entity.User;
import com.hqyj.poison.query.QueryOrderBean;
import com.hqyj.poison.query.QueryUserBean;
import com.hqyj.poison.result.ResultInfo;


public interface UserService {
    ResultInfo login(String userName, String userPwd);
    User queryUser(String userName);
    ResultInfo newUser(User user);
    User queryUserAndRole(String userName);
    ResultInfo selectUsers(QueryUserBean queryUserBean);
    User queryUsersByIdAndPwd(Pwd pwd);
    ResultInfo updateUserPwdByName(Pwd pwd);

    ResultInfo deleteUserById(Integer userId);
    ResultInfo updateUserById(User user);

//    订单表
    ResultInfo selectOrders(QueryOrderBean queryOrderBean);
    ResultInfo deleteOrderById(Integer orderId);
    ResultInfo updateOrderById(Order order);
    ResultInfo insertOrder(Order order);
    Order queryOrders(String orderNo);
}

 实现类:

package com.hqyj.poison.service.impl;

import com.hqyj.poison.entity.Order;
import com.hqyj.poison.entity.Pwd;
import com.hqyj.poison.entity.User;
import com.hqyj.poison.mapper.UserMapper;
import com.hqyj.poison.query.QueryOrderBean;
import com.hqyj.poison.query.QueryUserBean;
import com.hqyj.poison.result.ResultInfo;
import com.hqyj.poison.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;


@Service
public class UserServiceImpl implements UserService {
    @Autowired
    private UserMapper userMapper;
    @Override
    public User queryUser(String userName) {
        return userMapper.selectUser(userName);
    }

    @Override
    public User queryUserAndRole(String userName) {
        return userMapper.selectUserAndRole(userName);
    }
    @Override
    public ResultInfo newUser(User user) {
        userMapper.registered(user);
        if (user!=null){
            return new ResultInfo("200","success");
        }return new ResultInfo("500","error");
    }

    @Override
    public ResultInfo login(String userName, String userPwd) {
        // 获取subject对象
        Subject subject = SecurityUtils.getSubject();
        // 将controller(页面)传递过来的userName和userPwd放入token令牌中
        UsernamePasswordToken token = new UsernamePasswordToken(userName,userPwd);
        try {
            //  登录认证
            subject.login(token);
            //   授权
            subject.checkRoles();

            return new ResultInfo("200","success");
        } catch (Exception e) {
            User user = (User) SecurityUtils.getSubject().getSession().getAttribute("u");
            if(user==null){
                return new ResultInfo("500","账号不存在!");
            }
            return  new ResultInfo("500","密码错误!");
        }
    }

    @Override
    public ResultInfo selectUsers(QueryUserBean queryUserBean) {
        List<User> users = userMapper.selectUserByQueryBean(queryUserBean);
        Integer totals = userMapper.selectCount(queryUserBean);
        return new ResultInfo("success",totals,users);

    }

    @Override
    public User queryUsersByIdAndPwd(Pwd pwd) {
        return userMapper.queryUsersByIdAndPwd(pwd);

    }

    @Override
    public ResultInfo updateUserPwdByName(Pwd pwd) {
        userMapper.updateUserPwdByName(pwd);
        return new ResultInfo("200","success");
    }

    @Override
    public ResultInfo deleteUserById(Integer userId) {
        userMapper.deleteUserById(userId);
        return new ResultInfo("200","删除成功");
    }

    @Override
    public ResultInfo updateUserById(User user) {
        userMapper.updateUser(user);
        return new ResultInfo("200","success");
    }

    @Override
    public ResultInfo selectOrders(QueryOrderBean queryOrderBean) {
        List<Order> orders = userMapper.selectOrderByQueryBean(queryOrderBean);
        Integer totals = userMapper.selectCountToOrder(queryOrderBean);
        return new ResultInfo("success",totals,orders);

    }

    @Override
    public ResultInfo deleteOrderById(Integer orderId) {
        userMapper.deleteOrderById(orderId);
        return new ResultInfo("200","删除成功");
    }

    @Override
    public ResultInfo updateOrderById(Order order) {
        userMapper.updateOrder(order);
        return new ResultInfo("200","success");
    }

    @Override
    public ResultInfo insertOrder(Order order) {
        userMapper.insertOrder(order);
        return new ResultInfo("200","success");
    }

    @Override
    public Order queryOrders(String orderNo) {
        return userMapper.selectOrderByNo(orderNo);
    }

}

 10.前端界面:

login.jsp登录展示页面:

<%--
  Created by IntelliJ IDEA.
  User: 86139
  Date: 2022/7/29
  Time: 10:09
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
    <!-- Google Font: Source Sans Pro -->
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
    <link rel="stylesheet" href="../static/plugins/fontawesome-free/css/all.min.css">
    <link rel="stylesheet" href="../static/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
    <link rel="stylesheet" href="../static/dist/css/adminlte.min.css">
</head>
<body class="hold-transition login-page">
<div class="login-box">
    <!-- /.login-logo -->
    <div class="card">
        <div class="card-body login-card-body">
            <p class="login-box-msg">登录</p>
            <form>
                <div class="input-group mb-3">
                    <input id="username" type="text" class="form-control" placeholder="用户名">
                    <div class="input-group-append">
                        <div class="input-group-text">
                            <span class="fas fa-user-circle"></span>
                        </div>
                    </div>
                </div>

                <div class="input-group mb-3">
                    <input id="userpwd" type="password" class="form-control" placeholder="密码">
                    <div class="input-group-append">
                        <div class="input-group-text">
                            <span class="fas fa-lock"></span>
                        </div>
                    </div>
                </div>
                <div class="input-group mb-3">
                    <span id="mess" style="color: red"></span>
                </div>
                <div class="row">
                    <div class="col-8">
                        <div class="icheck-primary">
                            <input type="checkbox" id="remember">
                            <label for="remember">
                                Remember Me
                            </label>
                        </div>
                    </div>
                    <!-- /.col -->
                    <div class="col-4">
                        <button type="button" onclick="login()" class="btn btn-primary btn-block">登录</button>
                    </div>
                    <!-- /.col -->
                </div>
            </form>


            <!-- /.social-auth-links -->
            <button type="button" data-toggle='modal' data-target='#newUser' class="btn btn-primary">注册</button>

        <!-- /.login->card-body -->
            <div class="modal fade" id="newUser" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h4 class="modal-title" id="myModalLabel">用户新增</h4>
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                    </div>
                    <div class="modal-body">
                        <form class="form-horizontal">
                            <div class="form-group">
                                <label for="userName2" class="col-sm-2 control-label">用户名</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="userName2" placeholder="用户名">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="userPwd1" class="col-sm-2 control-label">密码</label>
                                <div class="col-sm-10">
                                    <input type="password" class="form-control" id="userPwd1" placeholder="密码">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="userAge2" class="col-sm-2 control-label">年龄</label>
                                <div class="col-sm-10">
                                    <input type="number" class="form-control" id="userAge2" placeholder="年龄">
                                </div>
                            </div>
                            <div class="form-group">
                                <label class="col-sm-2 control-label">性别</label>
                                <div class="col-sm-10">
                                    <label class="radio-inline">
                                        <input type="radio" name="gender" id="sex1" value="男" > 男
                                    </label>
                                    <label class="radio-inline">
                                        <input type="radio" name="gender" id="sex2" value="女"> 女
                                    </label>
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="userTel2" class="col-sm-2 control-label">电话</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="userTel2" placeholder="电话">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="userBirthday2" class="col-sm-2 control-label">日期</label>
                                <div class="col-sm-10">
                                    <input type="date" class="form-control" id="userBirthday2" placeholder="日期">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="userEmail2" class="col-sm-2 control-label">邮箱</label>
                                <div class="col-sm-10">
                                    <input type="email" class="form-control" id="userEmail2" placeholder="邮箱">
                                </div>
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                        <button type="button" onclick="newUser()" class="btn btn-primary">确认</button>
                    </div>
                </div>
            </div>
            </div>
            <div class="modal fade" id="findpwd" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
                <div class="modal-dialog" role="document">
                    <div class="modal-content">
                        <div class="modal-header">
                            <h4 class="modal-title" id="myModalLabe2">信息验证</h4>
                            <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                        </div>
                        <div class="modal-body">
                            <form class="form-horizontal">
                                <div class="form-group">
                                    <label for="userName3" class="col-sm-2 control-label">用户名</label>
                                    <div class="col-sm-10">
                                        <input type="text" class="form-control" id="userName3" placeholder="用户名">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <label for="userTel3" class="col-sm-2 control-label">电话</label>
                                    <div class="col-sm-10">
                                        <input type="text" class="form-control" id="userTel3" placeholder="电话">
                                    </div>
                                </div>
                                <div class="form-group">
                                    <label for="userEmail3" class="col-sm-2 control-label">邮箱</label>
                                    <div class="col-sm-10">
                                        <input type="email" class="form-control" id="userEmail3" placeholder="邮箱">
                                    </div>
                                </div>
                            </form>
                        </div>
                        <div class="modal-footer">
                            <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                        </div>
                    </div>
                </div>
            </div>
        </div>
    </div>
    </div>

<!-- /.login-box -->
<script src="../static/plugins/jquery/jquery.min.js"></script>
<script src="../static/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="../static/dist/js/adminlte.min.js"></script>


<script>
    function login() {
        var username = $("#username").val();
        var userpwd = $("#userpwd").val();
        $.ajax({
            url:"../sys/login",
            type:"POST",
            dataType:"json",
            data:{"userName":username,"userPwd":userpwd},
            success:function (data) {
                if(data.status=="500"){
                    $("#mess").html(data.message);
                }else {

                    window.location.href="../view/index.jsp";
                }
            },
            error:function (e) {
                alert("服务器出错!")
            }
        });
    }
    function newUser() {
        //获取编辑模态框中的表单元素的值
        var username = $("#userName2").val();
        var userpwd = $("#userPwd1").val();
        var useremail = $("#userEmail2").val();
        var userage = $("#userAge2").val();
        var userbirthday = $("#userBirthday2").val();
        var usertel = $("#userTel2").val();
        var usersex = $("input[type='radio']:checked").val();
        var user = {
            "userName":username,
            "userPwd":userpwd,
            "userEmail":useremail,
            "userAge":userage,
            "userBirthday":userbirthday,
            "userTel":usertel,
            "userSex":usersex
        };
        $.ajax({
            url:"../new",
            type:"POST",
            data:user,
            dataType:"json",
            success:function (data) {
                alert(data.status)
                if(data.status=="200"){
                    $('#newUser').modal('hide');
                    GridManager.refreshGrid('demo-baseCode');
                }
            },
            error:function (e) {
                alert("添加失败");
            }
        });
    }
</script>
</body>
</html>

index.jsp

<%--
  Created by IntelliJ IDEA.
  User: 86139
  Date: 2022/8/10
  Time: 10:10
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>主页</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
    <link rel="stylesheet" href="../static/plugins/fontawesome-free/css/all.min.css">
    <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="../static/plugins/tempusdominus-bootstrap-4/css/tempusdominus-bootstrap-4.min.css">
    <link rel="stylesheet" href="../static/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
    <link rel="stylesheet" href="../static/dist/css/adminlte.min.css">
    <link rel="stylesheet" href="../static/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
    <link rel="stylesheet" href="../static/plugins/daterangepicker/daterangepicker.css">
    <link rel="stylesheet" href="../static/plugins/summernote/summernote-bs4.min.css">
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div class="wrapper">

    <!-- Navbar -->
    <nav class="main-header navbar navbar-expand navbar-white navbar-light">
        <!-- Left navbar links -->
        <ul class="navbar-nav">
            <li class="nav-item">
                <a class="nav-link" data-widget="pushmenu" href="#" role="button"><i class="fas fa-bars"></i></a>
            </li>
            <li class="nav-item d-none d-sm-inline-block">
                <a href="index3.html" class="nav-link">Home</a>
            </li>
            <li class="nav-item d-none d-sm-inline-block">
                <a href="#" class="nav-link">Contact</a>
            </li>
        </ul>

        <ul class="navbar-nav ml-auto">
            <!-- Notifications Dropdown Menu -->
            <li class="nav-item dropdown">
                <a class="nav-link" data-toggle="dropdown" href="#">
                    <i class="nav-icon fas fa-user-circle"></i>
                    Iron
                    <i class="fas fa-angle-down right"></i>
                </a>
                <div class="dropdown-menu dropdown-menu-md dropdown-menu-right">
                    <div class="dropdown-divider"></div>
                    <a href="#" onclick="changePwd()" class="dropdown-item">
                        <i class="fas fa-lock mr-2"></i>修改密码
                    </a>
                    <div class="dropdown-divider"></div>
                    <a href="#" onclick="loginout()" class="dropdown-item">
                        <i class="fas fa-sign-out-alt mr-2"></i>退出
                    </a>
                </div>
            </li>
        </ul>
    </nav>
    <!-- /.navbar -->

    <!-- Main Sidebar Container -->
    <aside class="main-sidebar sidebar-dark-primary elevation-4">
        <!-- Brand Logo -->
        <a href="" class="brand-link">
            <img src="../static/dist/img/AdminLTELogo.png" alt="AdminLTE Logo" class="brand-image img-circle elevation-3" style="opacity: .8">
            <span class="brand-text font-weight-light">物流管理系统</span>
        </a>


        <!-- Sidebar -->
        <div class="sidebar">
            <!-- Sidebar user panel (optional) -->
            <div class="user-panel mt-3 pb-3 mb-3 d-flex">
                <div class="image">
                    <img src="../static/dist/img/user2-160x160.jpg" class="img-circle elevation-2" alt="User Image">
                </div>
                <div class="info">
                    <a href="#" class="d-block">Alexander Pierce</a>
                </div>
            </div>


            <!-- Sidebar Menu -->
            <nav class="mt-2">
                <ul id="sider" class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
                    <!-- Add icons to the links using the .nav-icon class
                         with font-awesome or any other icon font library -->
                    <li class="nav-item">
                        <a href="#" name="./home.jsp" class="nav-link active">
                            <i class="nav-icon far fa-image"></i>
                            <p>
                                首页
                            </p>
                        </a>
                    </li>
                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i class="nav-icon fas fa-tachometer-alt"></i>
                            <p>
                                用户管理
                                <i class="right fas fa-angle-left"></i>
                            </p>
                        </a>
                        <ul class="nav nav-treeview">
                            <li class="nav-item">
                                <a href="#" name="./user.jsp" class="nav-link">
                                    <i class="far fa-circle nav-icon"></i>
                                    <p>用户列表</p>
                                </a>
                            </li>
                        </ul>
                    </li>

                    <li class="nav-item">
                        <a href="#" class="nav-link">
                            <i class="nav-icon fas fa-tachometer-alt"></i>
                            <p>
                                物流管理
                                <i class="right fas fa-angle-left"></i>
                            </p>
                        </a>
                        <ul class="nav nav-treeview">
                            <li class="nav-item">
                                <a href="#" name="./logistics.jsp" class="nav-link">
                                    <i class="far fa-circle nav-icon"></i>
                                    <p>物流信息</p>
                                </a>
                            </li>
                        </ul>
                    </li>
                </ul>
            </nav>
            <!-- /.sidebar-menu -->
        </div>
        <!-- /.sidebar -->
    </aside>
    <div class="content-wrapper">
        <div class="content-header">
            <div class="container-fluid">
                <div class="row mb-2">
                    <div class="col-sm-6">
                        <h1 class="m-0">Dashboard</h1>
                    </div><!-- /.col -->
                    <div class="col-sm-6">
                        <ol class="breadcrumb float-sm-right">
                            <li class="breadcrumb-item"><a href="#">Home</a></li>
                            <li class="breadcrumb-item active">Dashboard v1</li>
                        </ol>
                    </div><!-- /.col -->
                </div><!-- /.row -->
            </div><!-- /.container-fluid -->
        </div>
        <section class="content">
            <div class="container-fluid">
                <iframe id="ifr" src="./home.jsp" frameborder="0" scrolling="no" width="100%" height="100%">

                </iframe>

            </div>
        </section>
        <div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
            <div class="modal-dialog" role="document">
                <div class="modal-content">
                    <div class="modal-header">
                        <h4 class="modal-title" id="myModalLabel1">修改密码</h4>
                        <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
                    </div>
                    <div class="modal-body">
                        <form class="form-horizontal">
                            <input type="hidden" id="userId">
                            <div class="form-group">
                                <label for="UserName1" class="col-sm-2 control-label">用户名</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="UserName1" placeholder="用户名">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="UserPwd1" class="col-sm-2 control-label">原密码</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="UserPwd1" placeholder="原密码">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="UserPwd2" class="col-sm-2 control-label">新密码</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="UserPwd2" placeholder="新密码">
                                </div>
                            </div>
                            <div class="form-group">
                                <label for="UserPwd3" class="col-sm-2 control-label" style="max-width: 20%">确认密码</label>
                                <div class="col-sm-10">
                                    <input type="text" class="form-control" id="UserPwd3" placeholder="确认密码">
                                </div>
                            </div>
                        </form>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-default" data-dismiss="modal" onclick="clearall()">关闭</button>
                        <button type="button" onclick="checkPwd()" class="btn btn-primary">确认</button>
                    </div>
                </div>
            </div>
    </div>
</div>
<!-- jQuery -->
<script src="../static/plugins/jquery/jquery.min.js"></script>
<script src="../static/plugins/jquery-ui/jquery-ui.min.js"></script>

<script>
    $.widget.bridge('uibutton', $.ui.button)
</script>

<script src="../static/plugins/bootstrap/js/bootstrap.bundle.min.js"></script>
<script src="../static/plugins/jquery-knob/jquery.knob.min.js"></script>
<script src="../static/plugins/moment/moment.min.js"></script>
<script src="../static/plugins/daterangepicker/daterangepicker.js"></script>
<script src="../static/plugins/tempusdominus-bootstrap-4/js/tempusdominus-bootstrap-4.min.js"></script>
<script src="../static/plugins/summernote/summernote-bs4.min.js"></script>
<script src="../static/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<script src="../static/dist/js/adminlte.js"></script>
<script src="../static/dist/js/demo.js"></script>
<%--<script src="../static/dist/js/pages/dashboard.js"></script>--%>


<script>
    $(document).ready(function () {
        $("#sider a").click(function () {
            $("a").removeClass("active");
            var a = $(this).closest(".menu-open").attr("class")
            var s = $(this).parent("li").parent("ul").attr("class");
            if(!(typeof (s)=="undefined"||s.search("nav-treeview")==(-1))){
                $(this).parent("li").parent("ul").prev().addClass("active");
                $(this).addClass("active");
                var url = $(this).attr("name");
                $("#ifr").attr("src",url);
            }else {
                if(a != undefined){
                    $(this).addClass("active");
                    return;
                }else {
                    $(".menu-open").children("a").trigger("click");
                    $("a").removeClass("active");
                    var url = $(this).attr("name");
                    $("#ifr").attr("src",url);
                }
                $(this).addClass("active");
            }
        });
    });

    function loginout() {
        $.ajax({
            url:"../sys/loginOut",
            type:"GET",
            success:function (data) {
                    window.location.href="../view/login.jsp";
            }
        })
    }
    function changePwd() {
        $("#myModal").modal('show');
    }
    function clearall() {
        $("#UserName1").val("");
        $("#UserPwd1").val("");
        $("#UserPwd2").val("");
        $("#UserPwd3").val("");
    }
    function checkPwd() {
        var username = $("#UserName1").val();
        var userpwd = $("#UserPwd1").val();
        var newPwd = $("#UserPwd2").val();
        var newPwd2 = $("#UserPwd3").val();
        if (newPwd != newPwd2){
            alert("两次密码不一致")
        }else {
            var user={"userName":username,"userPwd":userpwd,"newPwd":newPwd}
            $.ajax({
                url:"../user/change",
                type:"Get",
                data:user,
                dataType:"JSON",
                success:function (data) {
                    alert(data.status)
                    if (data.status == "200"){
                        alert("修改成功")

                    }else {
                        alert(data.message)
                    }
                    $("#myModal").modal('hide');
                }
            })
        }
    }
</script>
</body>
</html>

 error.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
    权限不足,请联系管理员!
</body>
</html>

 logistics.jsp

<%--
  Created by IntelliJ IDEA.
  User: 86139
  Date: 2022/8/10
  Time: 10:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户列表</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
    <link rel="stylesheet" href="../static/plugins/fontawesome-free/css/all.min.css">
    <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="../static/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
    <link rel="stylesheet" href="../static/dist/css/adminlte.min.css">
    <link rel="stylesheet" href="../static/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
    <link rel="stylesheet" href="../static/plugins/daterangepicker/daterangepicker.css">
    <link rel="stylesheet" href="../static/plugins/summernote/summernote-bs4.min.css">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <link rel="stylesheet" href="../static/gridmanager/css/gm.css">
    <script src="../static/gridmanager/js/gm.js"></script>
</head>
<body>
<div class="row">
    <div class="col-12">
        <div class="card">
            <div class="card-header row">
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                <div class="col-11">

                    <form class="form-inline">
                        <input type="text" class="form-control" id="orderTel" placeholder="收货号码">
                        <button type="button" class="btn btn-default" onclick="searchOrders()">搜索</button>
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        <button type="button" data-toggle='modal' data-target='#myModal1' class="btn btn-primary" id="insert">添加</button>
                    </form>
                </div>
            </div>

            <!-- /.card-header -->
            <div class="card-body">
                <table id='table-demo-ajaxPageCode'></table>
            </div>
            <!-- /.card-body -->
        </div>
    </div>
    <!-- /.col -->
</div>

<%--用户修改--%>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="myModalLabel1">修改</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            </div>
            <div class="modal-body">
                <form class="form-horizontal">
                    <input type="hidden" id="orderId">
                    <div class="form-group">
                        <label for="orderPeople1" class="col-sm-2 control-label">收件人</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="orderPeople1" placeholder="收件人">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="orderTel1" class="col-sm-2 control-label">电话</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="orderTel1" placeholder="电话">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="orderFreight1" class="col-sm-2 control-label">运费</label>
                        <div class="col-sm-10">
                            <input type="number" class="form-control" id="orderFreight1" placeholder="运费">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="orderTime1" class="col-sm-2 control-label">日期</label>
                        <div class="col-sm-10">
                            <input type="date" class="form-control" id="orderTime1" placeholder="下单时间">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="giveMethod1" class="col-sm-2 control-label">物流</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="giveMethod1" placeholder="配送方式">
                        </div>
                    </div>
                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" onclick="updateOrders()" class="btn btn-primary">确认</button>
            </div>
        </div>
    </div>
</div>

<%--用户添加--%>
<div class="modal fade" id="myModal2" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="myModalLabel1">添加</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            </div>
            <div class="modal-body">
                <form class="form-horizontal">
                    <input type="hidden" id="orderId2">
                    <div class="form-group">
                        <label for="orderNo2" class="col-sm-2 control-label">编号</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="orderNo2" placeholder="订单编号">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="orderPeople2" class="col-sm-2 control-label">收件人</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="orderPeople2" placeholder="收件人">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="orderTel2" class="col-sm-2 control-label">电话</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="orderTel2" placeholder="电话">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="orderFreight2" class="col-sm-2 control-label">运费</label>
                        <div class="col-sm-10">
                            <input type="number" class="form-control" id="orderFreight2" placeholder="运费">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="orderTime2" class="col-sm-2 control-label">日期</label>
                        <div class="col-sm-10">
                            <input type="date" class="form-control" id="orderTime2" placeholder="下单时间">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="giveMethod2" class="col-sm-2 control-label">物流</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="giveMethod2" placeholder="配送方式">
                        </div>
                    </div>
                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal" onclick="clearall()">关闭</button>
                <button type="button" onclick="insertOrders()" class="btn btn-primary">确认</button>
            </div>
        </div>
    </div>
</div>
<!-- /.row -->
<!-- jQuery -->
<script src="../static/plugins/jquery/jquery.min.js"></script>
<script src="../static/plugins/jquery-ui/jquery-ui.min.js"></script>
<script src="../static/jqPaginator.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script src="../static/plugins/jquery-knob/jquery.knob.min.js"></script>
<script src="../static/plugins/moment/moment.min.js"></script>
<script src="../static/plugins/daterangepicker/daterangepicker.js"></script>
<script src="../static/plugins/summernote/summernote-bs4.min.js"></script>
<script src="../static/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<script src="../static/dist/js/adminlte.js"></script>


<script>
    var respData;
    var cPage = null;
    var pSize = null;
    var ordertel = null;
    $(function () {
        // queryUsers();
        document.querySelector('#table-demo-ajaxPageCode').GM({
            gridManagerName: 'demo-baseCode',
            ajaxData: function (setting,params) {
                cPage = params.currentPage;
                pSize = params.pageSize;
                queryOrders(cPage,pSize,ordertel);
                return respData;
            },
            supportAjaxPage: true,
            sizeData: [4,8,12,16],
            pageSize: 4,
            currentPageKey: "currentPage",
            pageSizeKey: "pageSize",
            // ajaxType: 'POST',
            columnData: [
                {
                    key: 'orderNo',
                    text: '订单编号'
                },{
                    key: 'orderPeople',
                    text: '收货人'
                },{
                    key: 'orderFreight',
                    text: '运费'
                },{
                    key: 'giveMethod',
                    text: '配送方式'
                },{
                    key: 'orderTime',
                    text: '下单时间'
                },{
                    key: 'orderTel',
                    text: '电话'
                },{
                    key: 'orderId',
                    text: '操作',
                    alien:'center',
                    template:function (cell,row,index,key) {
                        return "<button type='button' data-obj='"+JSON.stringify(row) +
                            "' class= 'btn btn-success btn-sm'>编辑</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
                            "<button type='button' class= 'btn btn-success btn-sm' data-id='"+ cell +"'>删除</button>";
                    }
                }
            ]
        });

    });

    function queryOrders(cPage,pSize,ordertel) {
        $.ajax({
            url:"../order/orderAll",
            type:"GET",
            dataType:"json",
            async:false,
            data:{"currentPage":cPage,"pageSize":pSize,"orderTel":ordertel},
            success:function (data) {
                if(data.status=="500"){
                    window.location.href="../sys/error";
                }else

                    respData = {"data":data.data,"totals":data.totals};
            }
        });
    }

    function searchOrders() {
        cPage = 1;
        pSize = 2;
        ordertel = $("#orderTel").val();

        GridManager.setQuery("demo-baseCode");
    }

    $("#table-demo-ajaxPageCode").on("click","button[data-id]",function () {
        var isDel = confirm("确认是否删除");
        if (isDel){
            var id = $(this).data("id");
            $.ajax({
                url:"../order/"+id,
                type: "delete",
                dataType: "json",
                success:function (data) {
                    if (data.status=="200"){
                        GridManager.refreshGrid('demo-baseCode');
                    }else
                    {
                        alert("权限不足,请联系管理员");
                    }
                },error:function (e) {
                    alert("删除失败")
                }
            })
        }

    })


    $("#table-demo-ajaxPageCode").on("click","button[data-obj]",function () {

        //    数据回显
        var orders = $(this).data("obj");
        $("#orderId").val(orders.orderId);
        $("#orderPeople1").val(orders.orderPeople);
        $("#orderFreight1").val(orders.orderFreight);
        $("#giveMethod1").val(orders.giveMethod);
        $("#orderTime1").val(orders.orderTime);
        $("#orderTel1").val(orders.orderTel);

        //    显示模态版
        $("#myModal").modal('show');
    })

    function updateOrders() {
        var id = $("#orderId").val();
        var name = $("#orderPeople1").val();
        var freight = $("#orderFreight1").val();
        var method = $("#giveMethod1").val();
        var time = $("#orderTime1").val();
        var tel = $("#orderTel1").val();
        var orders = {
            "orderId":id,
            "orderPeople":name,
            "orderFreight":freight,
            "giveMethod":method,
            "orderTime":time,
            "orderTel":tel
        };
        $.ajax({
            url:"../order/",
            type:"put",
            contentType:"application/json",
            dataType:"json",
            data:JSON.stringify(orders),
            success:function (data) {
                if (data.status=="200"){
                    $("#myModal").modal('hide');
                    GridManager.refreshGrid('demo-baseCode');
                    console.log(id)
                }else {
                    alert("权限不足,无法修改")
                }
            }
        })
    }

    $("#insert").click(function () {
        $("#myModal2").modal('show');
    })

    function insertOrders() {
        var no = $("#orderNo2").val();
        var name = $("#orderPeople2").val();
        var freight = $("#orderFreight2").val();
        var method = $("#giveMethod2").val();
        var time = $("#orderTime2").val();
        var tel = $("#orderTel2").val();
        var orders = {
            "orderNo":no,
            "orderPeople":name,
            "orderFreight":freight,
            "giveMethod":method,
            "orderTime":time,
            "orderTel":tel
        };
        $.ajax({
            url:"../order/insert",
            type:"put",
            contentType:"application/json",
            dataType:"json",
            data:JSON.stringify(orders),
            success:function (data) {
                if (data.status=="200"){
                    alert("添加成功")
                }else if (data.status=="500"){
                    alert(data.message)
                }else
                    alert("权限不足")
                $("#myModal2").modal('hide');
                GridManager.refreshGrid('demo-baseCode');

            }
        })
    }
    function clearall() {
        $("#orderNo2").val("");
        $("#orderPeople2").val("");
        $("#orderFreight2").val("");
        $("#giveMethod2").val("");
        $("#orderTime2").val("");
        $("#orderTel2").val("");
    }
</script>
</body>
</html>

user.jsp

<%--
  Created by IntelliJ IDEA.
  User: 86139
  Date: 2022/8/10
  Time: 10:45
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>用户列表</title>
    <link rel="stylesheet" href="https://fonts.googleapis.com/css?family=Source+Sans+Pro:300,400,400i,700&display=fallback">
    <link rel="stylesheet" href="../static/plugins/fontawesome-free/css/all.min.css">
    <link rel="stylesheet" href="https://code.ionicframework.com/ionicons/2.0.1/css/ionicons.min.css">
    <link rel="stylesheet" href="../static/plugins/icheck-bootstrap/icheck-bootstrap.min.css">
    <link rel="stylesheet" href="../static/dist/css/adminlte.min.css">
    <link rel="stylesheet" href="../static/plugins/overlayScrollbars/css/OverlayScrollbars.min.css">
    <link rel="stylesheet" href="../static/plugins/daterangepicker/daterangepicker.css">
    <link rel="stylesheet" href="../static/plugins/summernote/summernote-bs4.min.css">
    <link rel="stylesheet" href="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <link rel="stylesheet" href="../static/gridmanager/css/gm.css">
    <script src="../static/gridmanager/js/gm.js"></script>
</head>
<body>
<div class="row">
    <div class="col-12">
        <div class="card">
            <div class="card-header row">
                &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                <div class="col-11">

                    <form class="form-inline">
                        <label for="username">用户名</label>
                        <input type="text" class="form-control" id="username" placeholder="用户名">
                        &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
                        <label for="usertel">电话</label>
                        <input type="tel" class="form-control" id="usertel" placeholder="电话">
                        <button type="button" class="btn btn-default" onclick="searchUser()">搜索</button>

                    </form>
                </div>
            </div>

            <!-- /.card-header -->
            <div class="card-body">
                <table id='table-demo-ajaxPageCode'></table>
            </div>
            <!-- /.card-body -->
        </div>
    </div>
    <!-- /.col -->
</div>

<%--用户修改--%>
<div class="modal fade" id="myModal" tabindex="-1" role="dialog" aria-labelledby="myModalLabel">
    <div class="modal-dialog" role="document">
        <div class="modal-content">
            <div class="modal-header">
                <h4 class="modal-title" id="myModalLabel1">用户修改</h4>
                <button type="button" class="close" data-dismiss="modal" aria-label="Close"><span aria-hidden="true">&times;</span></button>
            </div>
            <div class="modal-body">
                <form class="form-horizontal">
                    <input type="hidden" id="userId">
                    <div class="form-group">
                        <label for="UserName1" class="col-sm-2 control-label">用户名</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="UserName1" placeholder="用户名">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="UserAge1" class="col-sm-2 control-label">年龄</label>
                        <div class="col-sm-10">
                            <input type="number" class="form-control" id="UserAge1" placeholder="年龄">
                        </div>
                    </div>
                    <div class="form-group">
                        <label class="col-sm-2 control-label">性别</label>
                        <div class="col-sm-10">
                            <label class="radio-inline">
                                <input type="radio" name="gender" id="inlineRadio11" value="男"> 男
                            </label>
                            <label class="radio-inline">
                                <input type="radio" name="gender" id="inlineRadio21" value="女"> 女
                            </label>
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="UserTel1" class="col-sm-2 control-label">电话</label>
                        <div class="col-sm-10">
                            <input type="text" class="form-control" id="UserTel1" placeholder="电话">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="UserBir1" class="col-sm-2 control-label">日期</label>
                        <div class="col-sm-10">
                            <input type="date" class="form-control" id="UserBir1" placeholder="日期">
                        </div>
                    </div>
                    <div class="form-group">
                        <label for="UserEmail1" class="col-sm-2 control-label">邮箱</label>
                        <div class="col-sm-10">
                            <input type="email" class="form-control" id="UserEmail1" placeholder="邮箱">
                        </div>
                    </div>
                </form>
            </div>
            <div class="modal-footer">
                <button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
                <button type="button" onclick="updateUser()" class="btn btn-primary">确认</button>
            </div>
        </div>
    </div>
</div>
<!-- /.row -->
<!-- jQuery -->
<script src="../static/plugins/jquery/jquery.min.js"></script>
<script src="../static/plugins/jquery-ui/jquery-ui.min.js"></script>
<script src="../static/jqPaginator.js"></script>
<script src="https://stackpath.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
<script src="../static/plugins/jquery-knob/jquery.knob.min.js"></script>
<script src="../static/plugins/moment/moment.min.js"></script>
<script src="../static/plugins/daterangepicker/daterangepicker.js"></script>
<script src="../static/plugins/summernote/summernote-bs4.min.js"></script>
<script src="../static/plugins/overlayScrollbars/js/jquery.overlayScrollbars.min.js"></script>
<script src="../static/dist/js/adminlte.js"></script>

<script>
    var respData;
    var cPage = null;
    var pSize = null;
    var username = null;
    var usertel = null;
    $(function () {
        // queryUsers();
        document.querySelector('#table-demo-ajaxPageCode').GM({
            gridManagerName: 'demo-baseCode',
            ajaxData: function (setting,params) {
                cPage = params.currentPage;
                pSize = params.pageSize;
                queryUsers(cPage,pSize,username,usertel);
                return respData;
            },
            supportAjaxPage: true,
            sizeData: [5,10,15,20],
            pageSize: 5,
            currentPageKey: "currentPage",
            pageSizeKey: "pageSize",
            // ajaxType: 'POST',
            columnData: [
                {
                    key: 'userName',
                    text: '用户名'
                },{
                    key: 'userSex',
                    text: '性别'
                },{
                    key: 'userAge',
                    text: '年龄'
                },{
                    key: 'userTel',
                    text: '电话'
                },{
                    key: 'userBirthday',
                    text: '日期'
                },{
                    key: 'userEmail',
                    text: '邮箱'
                },{
                    key: 'userId',
                    text: '操作',
                    alien:'center',
                    template:function (cell,row,index,key) {
                        return "<button type='button' data-obj='"+JSON.stringify(row) +
                            "' class= 'btn btn-success btn-sm'>编辑</button>&nbsp;&nbsp;&nbsp;&nbsp;" +
                            "<button type='button' class= 'btn btn-success btn-sm' data-id='"+ cell +"'>删除</button>";
                    }
                }
            ]
        });

    });

    function queryUsers(cPage,pSize,username,usertel) {
        $.ajax({
            url:"../user/all",
            type:"GET",
            dataType:"json",
            async:false,
            data:{"currentPage":cPage,"pageSize":pSize,"userName":username,"userTel":usertel},
            success:function (data) {
                if(data.status=="500"){
                    window.location.href="../sys/error";
                }else
                    respData = {"data":data.data,"totals":data.totals};
            }
        });
    }

    $("#table-demo-ajaxPageCode").on("click","button[data-id]",function () {
        var isDel = confirm("确认是否删除");
        if (isDel){
            var id = $(this).data("id");
            $.ajax({
                url:"../user/"+id,
                type: "delete",
                dataType: "json",
                success:function (data) {
                    if (data.status=="200"){
                        GridManager.refreshGrid('demo-baseCode');
                    }else
                    {
                        alert("权限不足,请联系管理员");
                    }
                },error:function (e) {
                    alert("删除失败")
                }
            })
        }

    })
    $("#table-demo-ajaxPageCode").on("click","button[data-obj]",function () {

        //    数据回显
        var user = $(this).data("obj");
        $("#userId").val(user.userId);
        $("#UserName1").val(user.userName);
        $("#UserAge1").val(user.userAge);
        $("#UserTel1").val(user.userTel);
        $("#UserEmail1").val(user.userEmail);
        $("#UserBir1").val(user.userBirthday);
        var sex = user.userSex;
        if (sex=="男"){
            $("#inlineRadio11").prop("checked",true);
        }else if (sex =="女"){
            $("#inlineRadio21").prop("checked",true);
        }

        //    显示模态版
        $("#myModal").modal('show');
    })

    function updateUser() {
        var id = $("#userId").val();
        var name = $("#UserName1").val();

        var age = $("#UserAge1").val();
        var tel = $("#UserTel1").val();
        var email = $("#UserEmail1").val();
        var bir = $("#UserBir1").val();
        var sex = $("input[type='radio']:checked").val();
        var users = {
            "userId":id,
            "userName":name,
            "userAge":age,
            "userTel":tel,
            "userEmail":email,
            "userBirthday":bir,
            "userSex":sex,
        };
        $.ajax({
            url:"../user/",
            type:"put",
            contentType:"application/json",
            dataType:"json",
            data:JSON.stringify(users),
            success:function (data) {
                if (data.status=="200"){
                    $("#myModal").modal('hide');
                    GridManager.refreshGrid('demo-baseCode');
                    console.log(id)
                }
            }
        })
    }
    function searchUser() {
        cPage = 1;
        pSize = 2;
        username = $("#username").val();
        usertel = $("#usertel").val();
        GridManager.setQuery("demo-baseCode");
    }
</script>

</body>
</html>

 11.controller

usercontroller

package com.hqyj.poison.controller;


import com.hqyj.poison.entity.Pwd;
import com.hqyj.poison.entity.User;
import com.hqyj.poison.query.QueryOrderBean;
import com.hqyj.poison.query.QueryUserBean;
import com.hqyj.poison.result.ResultInfo;
import com.hqyj.poison.service.UserService;
import com.hqyj.poison.utils.MD5Util;
import org.apache.ibatis.annotations.Param;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/user")
public class UserController {
    @Autowired
    private UserService userService;

    @RequiresRoles(value = {"admin"})
//角色权限限制
    @RequestMapping("/all")
    @ResponseBody
    public ResultInfo queryUsers(QueryUserBean queryUserBean){
        return userService.selectUsers(queryUserBean);
    }

    @RequiresRoles(value = {"admin","user"},logical = Logical.OR)
//or代表二选一皆可;and代表同时满足
    @RequestMapping("/change")
    @ResponseBody
    public ResultInfo queryUsersByIdAndPwd(Pwd pwd){
        System.out.println(pwd.getUserName());
        System.out.println(pwd.getUserPwd());
        System.out.println(pwd.getNewPwd());
        String password =  new SimpleHash("MD5",pwd.getUserPwd(),pwd.getUserName(),1024).toString();
        pwd.setUserPwd(password);
        User users = userService.queryUsersByIdAndPwd(pwd);

        if (users!=null){
            String md5 = MD5Util.getPasswordByMD5(pwd.getNewPwd(),pwd.getUserName());
            System.out.println(md5);
            pwd.setUserPwd(md5);
           return userService.updateUserPwdByName(pwd);
        }
        return new ResultInfo("500","密码错误");
    }

    @RequiresRoles(value = {"admin"})
    @DeleteMapping("/{id}")
    @ResponseBody
    public ResultInfo deleteUsers(@PathVariable("id") Integer userId){
        return userService.deleteUserById(userId);
    }

    @RequiresRoles(value = {"admin"})
    @PutMapping("/")
    @ResponseBody
    public ResultInfo updateUser(@RequestBody User user){
        return userService.updateUserById(user);
    }

}

 newUsercontroller

package com.hqyj.poison.controller;

import com.hqyj.poison.entity.User;
import com.hqyj.poison.result.ResultInfo;
import com.hqyj.poison.service.UserService;
import com.hqyj.poison.utils.MD5Util;
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 org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;


@Controller
@RequestMapping("/new")
public class newUserController {
    @Autowired
    private UserService userService;
    @PostMapping
    @ResponseBody
    public ResultInfo newUser(User user){
//注册密码加密
        String md5 = MD5Util.getPasswordByMD5(user.getUserPwd(), user.getUserName());
        user.setUserPwd(md5);
        return userService.newUser(user);
    }
}

ExceptionController(处理异常的cotroller) 

package com.hqyj.poison.controller;

import com.hqyj.poison.result.ResultInfo;
import org.apache.shiro.authz.AuthorizationException;
import org.springframework.core.Ordered;
import org.springframework.core.annotation.Order;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

import javax.servlet.http.HttpServletRequest;

@ControllerAdvice
public class ExceptionController {
    /**
     * 集中处理 controller 层 AuthorizationException 异常
     */
    @ExceptionHandler(value= {AuthorizationException.class})
    @Order(Ordered.HIGHEST_PRECEDENCE)
    @ResponseBody
    public ResultInfo handlerAccessDeniedException(HttpServletRequest request,
                                                   AuthorizationException exception){
        return new ResultInfo("500", "noPermission");
    }

}

 SystemCotroller

package com.hqyj.poison.controller;

import com.hqyj.poison.entity.User;
import com.hqyj.poison.result.ResultInfo;
import com.hqyj.poison.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authz.annotation.RequiresAuthentication;
import org.apache.shiro.subject.Subject;
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 org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

@Controller
@RequestMapping("/sys")
public class SystemController {
    @Autowired
    private UserService userService;
    @PostMapping("/login")
    @ResponseBody
    public ResultInfo login(String userName, String userPwd){
        return userService.login(userName,userPwd);
    }

    @RequiresAuthentication
    @GetMapping("/loginOut")
    public ResultInfo logout() {
        //在这里执行退出系统前需要清空的数据
        Subject subject = SecurityUtils.getSubject();
        if(subject.isAuthenticated()) {
            subject.logout();
        }
        System.out.println("退出登录成功");
        return new ResultInfo("200","success");
    }
}
odercontroller
package com.hqyj.poison.controller;


import com.hqyj.poison.entity.Order;
import com.hqyj.poison.entity.User;
import com.hqyj.poison.query.QueryOrderBean;
import com.hqyj.poison.result.ResultInfo;
import com.hqyj.poison.service.UserService;
import org.apache.shiro.authz.annotation.Logical;
import org.apache.shiro.authz.annotation.RequiresRoles;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;

@Controller
@RequestMapping("/order")
public class OrderController {
    @Autowired
    private UserService userService;

    @RequiresRoles(value = {"admin","user"},logical = Logical.OR)
    @RequestMapping("/orderAll")
    @ResponseBody
    public ResultInfo queryOrder(QueryOrderBean queryOrderBean){
        return userService.selectOrders(queryOrderBean);
    }

    @RequiresRoles(value = {"admin"})
    @DeleteMapping("/{id}")
    @ResponseBody
    public ResultInfo deleteOrder(@PathVariable("id") Integer orderId){
        return userService.deleteOrderById(orderId);
    }

    @RequiresRoles(value = {"admin"})
    @PutMapping("/")
    @ResponseBody
    public ResultInfo updateOrder(@RequestBody Order order){
        return userService.updateOrderById(order);
    }

    @RequiresRoles(value = {"admin"})
    @PutMapping("/insert")
    @ResponseBody
    public ResultInfo insertOrder(@RequestBody Order order){
        String orderNo = order.getOrderNo();
        Order orders = userService.queryOrders(orderNo);
        if (orders==null){
            return userService.insertOrder(order);
        }
        else
            return new ResultInfo("500","该订单已存在");
    }


}

pageController

package com.hqyj.poison.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
@RequestMapping("/sys")
public class PageController {
    @RequestMapping("/gologin")
    public String goLogin(){
        return "login";
    }
    @RequestMapping("/index")
    public String goIndex(){
        return "index";
    }
    @RequestMapping("/error")
    public String doError(){
        return "error";
    }
}

 12.关于加密:MD5

Myrealm

package com.hqyj.poison.realm;

import com.hqyj.poison.entity.Role;
import com.hqyj.poison.entity.User;
import com.hqyj.poison.service.UserService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;

import java.util.HashSet;
import java.util.List;
import java.util.Set;

public class MyRealm extends AuthorizingRealm {

    @Autowired
    private UserService userService;

    @Override
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        // 获取用户名
        String userName = (String) principalCollection.getPrimaryPrincipal();
        //  根据用户名查询所对应的角色
        User user = userService.queryUserAndRole(userName);
        //  用来存放角色名称的集合
        Set<String> roleNames = new HashSet<>();
        //   当前用户对应的角色
        List<Role> roles = user.getRoleList();
        for (Role role : roles) {
            //将用户名所对应的的角色名称放入集合中
            roleNames.add(role.getRoleName());
        }
        simpleAuthorizationInfo.addRoles(roleNames);

        return simpleAuthorizationInfo;
    }

    @Override
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        String userName = (String) authenticationToken.getPrincipal();
        User user = userService.queryUser(userName);
//        将查询出来的用户存放到shiro提供的session中
        SecurityUtils.getSubject().getSession().setAttribute("u",user);
        // 该用户不存在
        if(user==null){
            return null;
        }
        // 获取盐
        ByteSource salt = ByteSource.Util.bytes(userName);
        // 返回认证信息由父类AuthenticatingRealm进行认证
        // getName() :父类的一个方法,获取当前数据源的名称(MyRealm)
        SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(userName,user.getUserPwd(),salt,getName());
        return simpleAuthenticationInfo;
    }
}

工具类:Util中

 

MD5Util
package com.hqyj.poison.utils;

import org.apache.shiro.crypto.hash.SimpleHash;

public class MD5Util {
    private String userPassword;
    private String userName;

    public static String getPasswordByMD5(String password,String salt){
        String simpleHash =  new SimpleHash("MD5",password,salt,1024).toString();
        return simpleHash;
    }
}

 13.关于分页部分:

这个部分相对而言比较难,因此,我个人觉得可以不实现,直接使用表单返回查询和显示的数据也是可以的。(此处运用了gridmanaer:GridManager - Demo (lovejavascript.com)

 

 

QueryOrderBean:

package com.hqyj.poison.query;


import lombok.Data;

@Data
public class QueryOrderBean {
    private Integer currentPage;
    private Integer pageSize;
    private String orderName;
    private String orderTel;


    private Integer startIndex;


    public Integer getStartIndex() {
        return this.startIndex = (this.currentPage-1)*this.pageSize;   }

}

QueryUserBean: 

package com.hqyj.poison.query;


import lombok.Data;

@Data
public class QueryUserBean {
//    当前页码
    private Integer currentPage;
//    每页展示的条数
    private Integer pageSize;
//    搜索条件
    private String userName;
    private String userTel;


    private Integer startIndex;


    public Integer getStartIndex() {
        return this.startIndex = (this.currentPage-1)*this.pageSize;   }

}

 Resultlnfo:

package com.hqyj.poison.result;

import com.hqyj.poison.entity.User;
import lombok.Data;

import java.util.List;

@Data
public class ResultInfo {
    private String status;
    private Integer totals;
    private String message;
    private Object data;

    //返回出错
    public ResultInfo(String status, String message) {
        this.status = status;
        this.message = message;
    }
//返回grid渲染表格的数据
    public ResultInfo(String status, Integer totals, Object data) {
        this.status = status;
        this.totals = totals;
        this.data = data;
    }
//返回不需要分页的数据
    public ResultInfo(String status, String message, Object data) {
        this.status = status;
        this.message = message;
        this.data = data;
    }


}

结果:

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值