ssm框架原理是:将Spring、SpringMVC、MyBatis整合在一起,作为数据源较简单的web项目的框架。 它有效规避servlet的繁杂加载驱动等一系列程序,选用MyBatis进行与数据库的连接。
目录
3.Mybatis的配置文件db.properties 和log4j.properties(日志)
-
首先:新建工程Maven。
- 下载压缩包:
- 配置环境变量
- 打开idea,新建Maven工程
- 进行如下操作即可:等待下载:出现build success即成功
- pom.xml是进行导包需要的配置文件,每一次配置之后需要在右边进行一次刷新,确认包是否导入成功
- pox.xml:打包方式:
- 配置依赖包:前三位属于定位元素。
- 相对于包存在的地址:
- 包如果本地仓库没有,就需要到中央仓库进行查找,仓库地址如下:
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">
<!-- <!– 注入凭证匹配 –>-->
<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">×</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">×</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">×</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">
<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>
<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">×</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">×</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> " +
"<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">
<div class="col-11">
<form class="form-inline">
<label for="username">用户名</label>
<input type="text" class="form-control" id="username" placeholder="用户名">
<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">×</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> " +
"<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;
}
}
结果: