电商订单后台管理系统


前言

开发工具:IntelliJ IDEA 2019.3.1
本文用到的技术:layui+ajax+SSM(Spring+SpringMVC+MyBatis)+mysql+tomcat
编写语言为:Java
由于本位篇幅过长,我这里提供两种下载地址。

码云仓库(gitee):https://gitee.com/fishme9/logistics_system.git

百度网盘:https://pan.baidu.com/s/1fgMG89ZpohAVRgk1fHeOPQ?pwd=58e2
提取码:58e2

MySQL文件:
百度网盘:https://pan.baidu.com/s/1SIOKTboJe4MWV6z15mFL0A?pwd=0ymg
提取码:0ymg


提示:以下是本篇文章正文内容,下面案例可供参考

一、项目结构

1.文件结构

在这里插入图片描述
这里有些文件没有显示,具体的目录下面有哪些文件显示,会在下面的具体实现中,展现出来。

2.部分显示效果图

用户列表
在这里插入图片描述
订单管理
在这里插入图片描述

管理员列表
在这里插入图片描述
文件上传下载
在这里插入图片描述
登录个人信息及密码修改
在这里插入图片描述

二、项目配置文件

在这里插入图片描述

pom.xml

maven依赖包

<?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.psl</groupId>
    <artifactId>ssmjavaweb</artifactId>
    <version>1.0-SNAPSHOT</version>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>8</source>
                    <target>8</target>
                </configuration>
            </plugin>
        </plugins>
    </build>

    <packaging>war</packaging>

    <dependencies>

        <!--dao依赖-->
        <!--mybatis相关-->
        <!--1. mybatis-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis</artifactId>
            <version>3.5.9</version>
        </dependency>

        <!--2.mybatis整合spring-->
        <dependency>
            <groupId>org.mybatis</groupId>
            <artifactId>mybatis-spring</artifactId>
            <version>2.0.7</version>
        </dependency>
        <!--3.mysql-->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <version>5.1.47</version>
        </dependency>
        <!--4.lombok-->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.18.24</version>
        </dependency>
        <!--5.log4j-->
        <dependency>
            <groupId>log4j</groupId>
            <artifactId>log4j</artifactId>
            <version>1.2.17</version>
        </dependency>
        <!--6.junit-->
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.2</version>
            <scope>test</scope>
        </dependency>
        <!--7.spring相关-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-webmvc</artifactId>
            <version>5.3.19</version>
        </dependency>
        <!--spring-test-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-test</artifactId>
            <version>5.3.19</version>
        </dependency>
        <!--spring-jdbc-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-jdbc</artifactId>
            <version>5.3.19</version>
        </dependency>

        <!--spring-tx-->
        <dependency>
            <groupId>org.springframework</groupId>
            <artifactId>spring-tx</artifactId>
            <version>5.3.19</version>
        </dependency>
        <!--service层-->
        <dependency>
            <groupId>org.aspectj</groupId>
            <artifactId>aspectjweaver</artifactId>
            <version>1.9.7</version>
        </dependency>

        <!--Druid-->
        <!-- https://mvnrepository.com/artifact/com.alibaba/druid -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>druid</artifactId>
            <version>1.1.22</version>
        </dependency>

        <!--c3p0连接池-->
        <dependency>
            <groupId>com.mchange</groupId>
            <artifactId>c3p0</artifactId>
            <version>0.9.5.2</version>
        </dependency>

        <!--添加servlet的支持-->
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>javax.servlet-api</artifactId>
            <version>4.0.1</version>
        </dependency>

        <!--json-->
        <dependency>
            <groupId>com.fasterxml.jackson.core</groupId>
            <artifactId>jackson-databind</artifactId>
            <version>2.13.2</version>
        </dependency>


        <!--pagehelper 分页插件-->
        <dependency>
            <groupId>com.github.pagehelper</groupId>
            <artifactId>pagehelper</artifactId>
            <version>5.3.1</version>
        </dependency>

        <!-- pagehelper的依赖包:jsqlparser -->
        <dependency>
            <groupId>com.github.jsqlparser</groupId>
            <artifactId>jsqlparser</artifactId>
            <version>4.5</version>
        </dependency>


        <!--文档上传下载依赖包-->
        <dependency>
            <groupId>commons-fileupload</groupId>
            <artifactId>commons-fileupload</artifactId>
            <version>1.3.1</version>
        </dependency>
        <dependency>
            <groupId>commons-io</groupId>
            <artifactId>commons-io</artifactId>
            <version>2.4</version>
        </dependency>
        <dependency>
            <groupId>commons-codec</groupId>
            <artifactId>commons-codec</artifactId>
            <version>1.9</version>
        </dependency>

        <!--shiro依赖相关-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-all</artifactId>
            <version>1.2.2</version>
        </dependency>

        <!--spring整合shiro的包-->
        <dependency>
            <groupId>org.apache.shiro</groupId>
            <artifactId>shiro-spring</artifactId>
            <version>1.2.2</version>
        </dependency>



    </dependencies>


</project>

resouerces

mapper文件

在这里插入图片描述

AdminMapper.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 namespace="com.hqyj.psl.mapper.AdminMapper">
    <resultMap id="adminMap" type="Admin">
        <id property="adminId" column="id"/>
        <result property="sex" column="sex"/>
        <result property="name" column="name"/>
        <result property="phone" column="phone"/>
        <result property="email" column="email"/>
        <result property="remark" column="remark"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
    </resultMap>
    <select id="selectByName" resultMap="adminMap">
        select * from admin where name=#{username}
    </select>

    <!--通过名字查询角色-->
    <select id="selectRolesByUsername" resultType="java.lang.String">
        SELECT r.name FROM admin_role ar
        left join admin a on a.admin_id=ar.admin_id
        left join role r on r.role_id=ar.role_id
        where a.name = #{name};
    </select>
	<!--通过名字查询权限-->
    <select id="selectPermsByUsername" resultType="java.lang.String">
        select p.url from role_permission rp
        left join role r  on r.role_id=rp.role_id
        left join permission p on p.permission_id=rp.permission_id
        where rp.role_id in
        (SELECT r.role_id FROM admin_role ar
        left join admin a on a.admin_id=ar.admin_id
        left join role r on r.role_id=ar.role_id
        where a.name = #{name})
    </select>


	<!--注册-->
    <insert id="insertBySignup">
        insert into admin (admin_id,name,username,password) values (null,#{arg0},"simple",#{arg1})
    </insert>
	<!--个人信息更新-->
    <update id="update">
        update admin set phone=#{phone},email=#{email},password=#{password},remark=#{remark} where name=#{name}
    </update>
	<!--个人资料查询-->
    <select id="show" resultMap="adminMap">
        select * from admin where name=#{username} and password=#{password}
    </select>


</mapper>
MyFileMapper.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 namespace="com.hqyj.psl.mapper.MyFileMapper">
	
    <resultMap id="myFileMap" type="MyFile">
        <id property="fileId" column="file_id"/>
        <result property="fileName" column="file_name"/>
        <result property="fileUrl" column="file_url"/>
    </resultMap>

	<!--sql片段-->
    <sql id="myFileCol">
        file_id,file_name,file_url
    </sql>
	<!--查询文件-->
    <select id="selectAll" resultMap="myFileMap">
        select * from my_file
    </select>
    
	<!--添加文件内容到数据库-->
    <insert id="insert" parameterType="MyFile">
        insert into my_file values (null,#{fileName},#{fileUrl})
    </insert>
    
    
    <!--移除文件-->
    <delete id="deleteFile">
        delete from my_file where file_id=#{fileId}
    </delete>

</mapper>
UsersMapper.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 namespace="com.hqyj.psl.mapper.UsersMapper">

    <!--1.结果映射-->
    <resultMap id="usersMap" type="Users">
        <id property="usersId" column="users_id"/>
        <result property="name" column="name"/>
        <result property="sex" column="sex"/>
        <result property="address" column="address"/>
        <result property="phone" column="phone"/>
        <result property="email" column="email"/>
        <result property="username" column="username"/>
        <result property="password" column="password"/>
        <result property="isVip" column="is_vip"/>
        <result property="deleted" column="deleted"/>
        <result property="joinDate" column="join_time"/>
    </resultMap>

    <!--2.数据库字段片段-->

    <sql id="UsersCol">
        users_id,name,sex,address,phone,email,username,password,is_vip,deleted,join_time
    </sql>

    <!--分页查所有用户-->
    <select id="selectAll" resultMap="usersMap">
        select <include refid="UsersCol"/> from users where  deleted = 0
    </select>



    <!--根据名称查询user-->
    <select id="selectOneByUsername" resultMap="usersMap">
        select <include refid="UsersCol"/> from user
        where username=#{username}
    </select>

    <update id="update">
        update users
        set name=#{name},sex=#{sex},address=#{address},
        phone=#{phone},email=#{email},username=#{username},
        password=#{password},deleted=#{deleted},join_time=#{joinDate}
        where users_id=#{usersId}
    </update>


    <!--逻辑删除-->
    <update id="deleteUpdByUserId" >
        update users set deleted = 1 where users_id=#{usersId}
    </update>



    <delete id="deleteByUserId">
        delete from user where user_id=#{id}
    </delete>

    <insert id="insert">
        insert into users values (null,#{name},#{sex},#{address},
        #{phone},#{email},#{username},#{password},#{isVip},#{deleted},#{joinDate})
    </insert>

    <select id="search" resultMap="usersMap">
        select * from users
        <where>
            deleted = 0
            <if test="username!=null and username!=''">
                and username like CONCAT(CONCAT('%',#{username},'%'))
            </if>
            <if test="phone!=null and phone!=''">
                and phone like CONCAT(CONCAT('%',#{phone},'%'))
            </if>
        </where>


    </select>

    <!--逻辑删除全部-->
    <update id="deleteAll" parameterType="list">
        update users set deleted=1 
        <where>
            <foreach collection="list" item="item" index="index" open="users_id in (" close=")" separator=",">
                #{item}
            </foreach>
        </where>
    </update>

    <!--查找被逻辑删除的-->
    <select id="selectByDeletedUsers" resultMap="usersMap">
        select <include refid="UsersCol"/> from users where deleted = 1
    </select>
    <!--恢复删除-->
    <update id="renew">
        update users set deleted = 0 where users_id = #{usersId}
    </update>
    <!--全部恢复-->
    <update id="updateRenbit" parameterType="list">
        update users set deleted = 0
        <where>
            <foreach collection="list" item="item" index="index" open="users_id in (" close=")" separator=",">
                #{item}
            </foreach>
        </where>
    </update>
    <!--删除-->
    <delete id="phyDel">
        delete from users where users_id = #{usersId}
    </delete>
    <!--条件查找-->
    <select id="condQuery" resultMap="usersMap">
        select <include refid="UsersCol"/> from users
        <where>
            deleted = 1
            <if test="username != '%%'"  >
                and name like #{username}
            </if>
        </where>
    </select>

</mapper>
OrdersMapper.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 namespace="com.hqyj.psl.mapper.OrdersMapper">
    <!--1.结果映射-->
    <resultMap id="ordersMap" type="Orders">
        <id property="ordersId" column="orders_id"/>
        <result property="ordersNo" column="orders_no"/>
        <result property="ordersName" column="orders_name"/>
        <result property="phone" column="phone"/>
        <result property="totalAmount" column="total_amount"/>
        <result property="payAmount" column="pay_amount"/>
        <result property="ordersState" column="orders_state"/>
        <result property="payState" column="pay_state"/>
        <result property="shipmentsState" column="shipments_state"/>
        <result property="giveMethod" column="give_method"/>
        <result property="ordersTime" column="orders_time"/>
    </resultMap>

    <!--2.sql片段-->
    <sql id="ordersCol">
        Orders,orders_id,orders_no,orders_name,phone,total_amount,pay_amount,orders_state,pay_state,shipments_state,give_method,orders_time
    </sql>

    <select id="selectAll" resultMap="ordersMap">
        select * from orders
    </select>

    <delete id="delete">
        delete from orders where orders_id = #{ordersId}
    </delete>

    <update id="update">
        update orders set orders_name = #{ordersName},shipments_state = #{shipmentsState},give_method = #{giveMethod} where orders_id = #{ordersId}
    </update>

    <update id="insert">
        insert into orders values (null,#{ordersNo},#{ordersName},#{phone},#{totalAmount},#{payAmount},#{ordersState},#{payState},#{shipmentsState},#{giveMethod},#{ordersTime})
    </update>
	<!--模糊查询-->
    <select id="selectLike" resultMap="ordersMap">
        select * from orders
        <where>
            <if test="payState!=''">
                and pay_state = #{payState}
            </if>
            <if test="ordersState!=''">
                and orders_state = #{ordersState}
            </if>
            <if test="ordersNo!='%%'">
                and orders_no like #{ordersNo}
            </if>
            <if test="isVip!=null">
                and orders_id IN(
                SELECT orders_id
                FROM orders_users
                WHERE users_id IN (
                SELECT users_id
                FROM users
                WHERE is_vip = #{isVip}
                ))
            </if>
        </where>
    </select>

    <delete id="deleteAll" parameterType="List">
        delete from orders 
        <where>
            <foreach collection="list" index="index" item="item" open="orders_id in (" close=")" separator=",">
                #{item}
            </foreach>
        </where>
    </delete>

</mapper>
RoleMapper.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 namespace="com.hqyj.psl.mapper.RoleMapper">


    <!--结果集-->
    <resultMap id="adminVoMapper" type="AdminVo">
        <!--Role里面的字段-->
        <id property="adminId" column="admin_id"/>
        <result property="username" column="username"/>
        <result property="rname" column="rname"/>
        <result property="url" column="url"/>
        <!--Roles集合-->
        <collection property="roles" ofType="Role">
            <id property="roleId" column="role_id"/>
            <result property="name" column="rname"/>
            <result property="state" column="state"/>
        </collection>
        <!--Permission集合-->
<!--        <collection property="permissions" ofType="Permission">-->
<!--            <id property="permissionId" column="permission_id"/>-->
<!--            <result property="url" column="url"/>-->
<!--            <result property="state" column="pstate"/>-->
<!--        </collection>-->
    </resultMap>

    <!-- 根据用户名查询所有拥有的角色-->
    <select id="selectRolesByUsername" resultType="java.lang.String">
        SELECT ad.*,r.`role_id`,r.`name` as rname,r.`state` FROM admin_role ar
        LEFT JOIN admin ad ON ad.`admin_id`=ar.`admin_id`
        LEFT JOIN role r ON r.`role_id`=ar.`role_id`
        WHERE ad.`username`=#{username}
    </select>



    <!-- 查询所有角色-->
        <select id="selectRoleAll" resultMap="adminVoMapper">
            SELECT role_id,NAME rname FROM role;
        </select>

<!--    <select id="selectRoleAll" resultMap="adminVoMapper">-->
<!--        SELECT ad.*, r.`name` rname,r.role_id,r.state FROM admin_role ar-->
<!--        LEFT JOIN admin ad ON ad.`admin_id`=ar.`admin_id`-->
<!--        LEFT JOIN role r ON r.`role_id`=ar.`role_id`-->
<!--        GROUP BY ad.`admin_id`;-->
<!--    </select>-->


    <!--查询所有角色的admin_id-->


    <!--  根据角色查询所有拥有权限-->
    <select id="selectPermsByRole" resultType="java.lang.String">
        SELECT p.`url` FROM role_permission rp
    LEFT JOIN role r ON rp.`role_id`=r.`role_id`
    LEFT JOIN permission p ON rp.`permission_id`=p.`permission_id`
    WHERE r.`role_id`=#{roleId};
    </select>

    <!--根据用户名查询所有拥有的权限-->
    <select id="selectPermsByUsername" resultMap="adminVoMapper">
         SELECT DISTINCT p.url FROM role_permission rp
        LEFT JOIN role r  ON r.role_id=rp.role_id
        LEFT JOIN permission p ON p.permission_id=rp.permission_id
        WHERE rp.role_id IN
        (SELECT r.role_id FROM admin_role ad
        LEFT JOIN admin a ON a.admin_id=ad.admin_id
        LEFT JOIN role r ON r.role_id=ad.role_id
        WHERE username = #{username})

    </select>

    <!--修改角色名-->
    <select id="updateRoleName" resultType="java.lang.Integer">
        UPDATE role SET NAME=#{name} WHERE role_id=#{roleId}
    </select>

    <!--修改权限-->
        <!--删除权限关联表中的关联-->
        <delete id="deleteRole_P">
            DELETE	FROM role_permission WHERE role_id=#{roleId}
        </delete>
        <!--根据权限名url查询权限id-->
        <select id="selectPreId" resultType="java.lang.Integer">
            SELECT permission_id FROM permission WHERE url=#{url};
        </select>

        <!--添加权限关联表中的关联添加 preid roleId-->
        <insert id="addRole_P">
            INSERT INTO role_permission VALUES(null,#{arg0},#{arg1});
        </insert>


    <!--删除角色-->
    <delete id="deleteRole">
        DELETE FROM role WHERE role_id=#{roleId}
    </delete>

    <!--添加角色-->
        <!--1.在Role表中添加角色名-->
        <insert id="addRoleName">
            INSERT INTO role VALUES(NULL,#{name},1);
        </insert>
        <!--2.查询Role表中的roleId 通过角色名-->
        <select id="selectRoleByName" resultType="java.lang.Integer">
            SELECT role_id FROM role WHERE NAME=#{name};
        </select>











</mapper>

application.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">


        <!--整合容器-->
        <import resource="classpath:spring-dao.xml"/>
        <import resource="classpath:spring-service.xml"/>
        <import resource="classpath:spring-mvc.xml"/>
        <import resource="classpath:spring-shiro.xml"/>
</beans>

db.properties(mysql配置)

driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///ssmweb
user=root
password=root


#c3p0.minPoolSize = 10
#c3p0.maxPoolSize = 20
#c3p0.initialPoolSize = 100
#c3p0.maxIdleTime = 30
#c3p0.acquireIncrement = 5

logj.properties(日志容器)

#如果要输出到文件,下面一行后面增加一个,File
log4j.rootLogger=DEBUG, Console

#配置输出log到文件
#文件大小到达指定尺寸的时候产生一个新的文件
log4j.appender.File = org.apache.log4j.RollingFileAppender
#指定输出目录
log4j.appender.File.File = logs/ssm.log
#定义文件最大大小
log4j.appender.File.MaxFileSize = 10MB
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志
log4j.appender.File.Threshold = ALL
log4j.appender.File.layout = org.apache.log4j.PatternLayout
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

#配置输出到Console
log4j.appender.Console=org.apache.log4j.ConsoleAppender
log4j.appender.Console.layout=org.apache.log4j.PatternLayout
log4j.appender.Console.layout.ConversionPattern=[%p][%c] - %m%n

# spring框架和apache的包输出日志级别为INFO
log4j.logger.org.springframework=INFO
log4j.logger.org.apache=INFO

mybits-config.xml(存储过程及映射)

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>

    <!--设置日志及缓存-->
    <settings>
        <setting name="logImpl" value="LOG4J"/>
    </settings>

    <!--配置别名-->
    <typeAliases>
        <typeAlias type="com.hqyj.psl.entity.Users" alias="Users"/>
        <typeAlias type="com.hqyj.psl.entity.MyFile" alias="MyFile"/>
        <typeAlias type="com.hqyj.psl.entity.Admin" alias="Admin"/>
        <typeAlias type="com.hqyj.psl.entity.Orders" alias="Orders"/>
        <typeAlias type="com.hqyj.psl.entity.Role" alias="Role"/>
        <typeAlias type="com.hqyj.psl.entity.AdminVo" alias="AdminVo"/>
        <typeAlias type="com.hqyj.psl.entity.Permission" alias="Permission"/>
    </typeAliases>


</configuration>

spring-dao.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">

        <!--0.扫描包-->
        <context:component-scan base-package="com.hqyj.psl.mapper"/>

        <!--1.引入db.properties-->
        <context:property-placeholder location="classpath:db.properties"/>
        <!--2.dataSource-->



<!--        druid连接-->
        <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource"
              destroy-method="close" lazy-init="false">
            <property name="driverClassName" value="${driver}"/>
            <property name="url" value="${url}"/>
            <property name="username" value="${user}"/>
            <property name="password" value="${password}"/>
            <property name="initialSize" value="3" />
            <property name="maxActive" value="5" />
            <property name="maxWait" value="3000" />
         </bean>


        <!--3.sqlSessionFactory-->
        <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
            <property name="dataSource" ref="dataSource"/>
            <property name="configLocation" value="classpath:mybatis-config.xml"/>
            <property name="mapperLocations" value="classpath:mapper/*.xml"/>

            <property name="plugins">
                <array>
                    <bean class="com.github.pagehelper.PageInterceptor">
                        <property name="properties">
                            <!--使用下面的方式配置参数,一行配置一个 -->
                            <value>
                                helperDialect=mysql
                            </value>
                        </property>
                    </bean>
                </array>
            </property>
        </bean>


        <!--4.动态生成Dao接口实现类-->
        <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
            <!--注入sqlSessionFactory 注意其类型为String 只需要注入bean的名称就可以-->
            <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"/>
            <!--给出扫描的包,告诉他为谁生成-->
            <property name="basePackage" value="com.hqyj.psl.mapper"/>
        </bean>


</beans>

spring-mvc.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:mvc="http://www.springframework.org/schema/mvc"
       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.psl.controller"/>

        <!--2.配置注解驱动-->
        <mvc:annotation-driven>
            <!--json乱码问题-->
                <mvc:message-converters register-defaults="true">
                    <bean class="org.springframework.http.converter.StringHttpMessageConverter">
                        <constructor-arg value="UTF-8"/>
                    </bean>
                    <bean
                            class="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter">
                        <property name="objectMapper">
                            <bean
                                    class="org.springframework.http.converter.json.Jackson2ObjectMapperFactoryBean">
                                <property name="failOnEmptyBeans" value="false"/>
                            </bean>
                        </property>
                    </bean>
                </mvc:message-converters>
        </mvc:annotation-driven>

        <!--3配置静态资源-->
    <mvc:resources mapping="/static/**" location="/static/"/>
    <mvc:resources mapping="/upload/**" location="/upload/"/>


        <!--4.静态资源的servlet配置 -->
        <mvc:default-servlet-handler/>
        <!--5.配置视图解析器-->

        <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix" value="/WEB-INF/jsp/"/>
            <property name="suffix" value=".jsp"/>
        </bean>


    <!--6.配置文档上传下载配置 ,如果没有使用文件可以不用配置,同时也不用引入pomjar-->
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <!--编码-->
        <property name="defaultEncoding" value="utf-8"/>
        <property name="maxUploadSize" value="10480000000"/>
        <property name="maxInMemorySize" value="40960"/>
    </bean>


</beans>

spring-service.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.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/tx
       http://www.springframework.org/schema/tx/spring-tx.xsd">

    <!--1.配置扫描包-->
    <context:component-scan base-package="com.hqyj.psl.service"/>

<!--    &lt;!&ndash;2.配置事务对象&ndash;&gt;-->
<!--    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">-->
<!--        <property name="dataSource" ref="dataSource"/>-->
<!--     </bean>-->
    <!--3.开启事务注解支持-->
<!--    <tx:annotation-driven transaction-manager="transactionManager"/>-->

    <!--4.事务的第二种方式 -->
<!--    <tx:advice id="accountTransaction" transaction-manager="transactionManager">-->
<!--        <tx:attributes>-->
<!--            <tx:method name="changeMoney" isolation="DEFAULT" propagation="REQUIRED" rollback-for="java.lang.RuntimeException"/>-->
<!--            <tx:method name="change*"/>-->
<!--            &lt;!&ndash;可以写多个方法-->
<!--                1.直接写方法名-->
<!--                2.通配符:select *-->
<!--            &ndash;&gt;-->
<!--        </tx:attributes>-->
<!--    </tx:advice>-->
<!--    -->

    

</beans>

spring-shiro.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">

    <!--0.密码匹配器-->
    <bean id="passwordMatcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
        <!--设置加密方式-->
        <property name="hashAlgorithmName" value="MD5"/>
        <!--加密次数-->
        <property name="hashIterations" value="1024"/>
    </bean>
    
    
    <!--1.配置进行授权和认证的Realm-->
    <bean id="myRealm" class="com.hqyj.psl.realm.UserRealm">
        <!--注入密码适配器-->
<!--        <property name="credentialsMatcher" ref="passwordMatcher"/>-->
    </bean>

    <!--2.配置SecurityManage-->
    <bean id="securityManage" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
        <!--设置Realm-->
        <property name="realm" ref="myRealm"/>
     </bean>

    <!--3.配置shiroFilter,必须和web.xml中的file-name一致,拦截请求资源-->
    <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
        <property name="securityManager" ref="securityManage"/>
        <!--如果非法访问时,设置默认跳转的资源的url  跳转回登录页面-->
        <property name="loginUrl" value="/login"/>
        <!--无权访问跳转页面-->
        <property name="unauthorizedUrl" value="/noPower"/>
        <!--配置拦截-->
        <property name="filterChainDefinitions">
            <value>
                <!--
                    身份:
                        anno 匿名访问
                        authc 认证后才能访问
                        roles[角色名] 注意!!!:roles[角色1,角色2],表示满足两个角色的用户才能访问
                        perms[权限名] 拥有某个权限的用户
                -->
                /login=anon
                /index=authc
                /admin-role=roles[admin]
<!--                /users/userList=roles[simple,admin]-->
                /users/delete=perms[delete]<!--zhangsan不能访问-->
                /users/deleteAll=perms[delete]<!--zhangsan不能访问-->
                /users/renew=perms[update]
                /users/phyDel=perms[delete]
                /users/renewAll=perms[update]
                /orders/deleteAll=perms[delete]
                /orders/delete=perms[delete]
                /myFileAjax/deleteFile=perms[delete]


            </value>
        </property>
    </bean>


</beans>

三、后端功能实现

1.实体层(entity)

Admin.java

package com.hqyj.psl.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/18
 * \* Time: 22:20
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Admin {
    private Integer adminId;
    private String sex;
    private String name;
    private String phone;
    private String email;
    private String remark;
    private String username;
    private String password;
}

AdminVo.java

package com.hqyj.psl.entity;

import lombok.Data;

import java.util.List;

@Data
public class AdminVo extends Admin {

    private Integer adminId;
    private String username;
    private List<Role> roles;
    private Integer roleId;

    private String rname;
    private String url;
//    private List<Permission> permissions;
}

MyFile.java

package com.hqyj.psl.entity;

import lombok.Data;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/17
 * \* Time: 14:06
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@Data
public class MyFile {
    private Integer fileId;
    private String  fileName;
    private String  fileUrl;//存储的是Tomcat中的war包中的地址


}

Orders.java

package com.hqyj.psl.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import org.springframework.format.annotation.DateTimeFormat;

import java.util.Date;


public class Orders extends UsersPage{

    private Integer ordersId;
    private String ordersNo;
    private String ordersName;
    private String phone;
    private Double totalAmount;
    private Double payAmount;
    private String ordersState;
    private String payState;
    private String shipmentsState;
    private String giveMethod;
    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date ordersTime;
    private Integer isVip;
    private String listId;

    public String getListId() {
        return listId;
    }

    public void setListId(String listId) {
        this.listId = listId;
    }

    public Integer getIsVip() {
        return isVip;
    }

    public void setIsVip(Integer isVip) {
        this.isVip = isVip;
    }

    @Override
    public String toString() {
        return "Orders{" +
                "ordersId=" + ordersId +
                ", ordersNo='" + ordersNo + '\'' +
                ", ordersName='" + ordersName + '\'' +
                ", phone='" + phone + '\'' +
                ", totalAmount=" + totalAmount +
                ", payAmount=" + payAmount +
                ", ordersState='" + ordersState + '\'' +
                ", payState='" + payState + '\'' +
                ", shipmentsState='" + shipmentsState + '\'' +
                ", giveMethod='" + giveMethod + '\'' +
                ", ordersTime=" + ordersTime +
                ", isVip=" + isVip +
                ", listId=" + listId +
                '}';
    }

    public Integer getOrdersId() {
        return ordersId;
    }

    public void setOrdersId(Integer ordersId) {
        this.ordersId = ordersId;
    }

    public String getOrdersNo() {
        return ordersNo;
    }

    public void setOrdersNo(String ordersNo) {
        this.ordersNo = ordersNo;
    }

    public String getOrdersName() {
        return ordersName;
    }

    public void setOrdersName(String ordersName) {
        this.ordersName = ordersName;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public Double getTotalAmount() {
        return totalAmount;
    }

    public void setTotalAmount(Double totalAmount) {
        this.totalAmount = totalAmount;
    }

    public Double getPayAmount() {
        return payAmount;
    }

    public void setPayAmount(Double payAmount) {
        this.payAmount = payAmount;
    }

    public String getOrdersState() {
        return ordersState;
    }

    public void setOrdersState(String ordersState) {
        this.ordersState = ordersState;
    }

    public String getPayState() {
        return payState;
    }

    public void setPayState(String payState) {
        this.payState = payState;
    }

    public String getShipmentsState() {
        return shipmentsState;
    }

    public void setShipmentsState(String shipmentsState) {
        this.shipmentsState = shipmentsState;
    }

    public String getGiveMethod() {
        return giveMethod;
    }

    public void setGiveMethod(String giveMethod) {
        this.giveMethod = giveMethod;
    }
    @JsonFormat(pattern = "yyyy-MM-dd")
    public Date getOrdersTime() {
        return ordersTime;
    }

    public void setOrdersTime(Date ordersTime) {
        this.ordersTime = ordersTime;
    }

}

Permission.java

package com.hqyj.psl.entity;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Permission {
    private Integer permissionId;
    private String url="sdfasdf";
    private String state;
}

Role.java

package com.hqyj.psl.entity;


import lombok.Data;

@Data
public class Role {
    private Integer roleId;
    private String name;
    private String state;

}

Users.java

package com.hqyj.psl.entity;

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

import java.util.Date;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/19
 * \* Time: 13:52
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public class Users extends UsersPage {
    private Integer usersId;
    private  String name;//昵称
    private String sex;
    private String address;
    private String phone;
    private String email;
    private String  username;
    private String  password;
    private Integer isVip;
    private Integer deleted;//做逻辑删除的
    private String bitId;
    private String rbitId;

    public String getRbitId() {
        return rbitId;
    }

    public void setRbitId(String rbitId) {
        this.rbitId = rbitId;
    }

    public String getBitId() {
        return bitId;
    }

    public void setBitId(String bitId) {
        this.bitId = bitId;
    }

    @DateTimeFormat(pattern = "yyyy-MM-dd")
    private Date joinDate;//入职日期

    @Override
    public String toString() {
        return "Users{" +
                "usersId=" + usersId +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", address='" + address + '\'' +
                ", phone='" + phone + '\'' +
                ", email='" + email + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", isVip=" + isVip +
                ", deleted=" + deleted +
                ", joinDate=" + joinDate +
                '}';
    }

    public Integer getUsersId() {
        return usersId;
    }

    public void setUsersId(Integer usersId) {
        this.usersId = usersId;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getSex() {
        return sex;
    }

    public void setSex(String sex) {
        this.sex = sex;
    }

    public String getAddress() {
        return address;
    }

    public void setAddress(String address) {
        this.address = address;
    }

    public String getPhone() {
        return phone;
    }

    public void setPhone(String phone) {
        this.phone = phone;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Integer getIsVip() {
        return isVip;
    }

    public void setIsVip(Integer isVip) {
        this.isVip = isVip;
    }

    public Integer getDeleted() {
        return deleted;
    }

    public void setDeleted(Integer deleted) {
        this.deleted = deleted;
    }
    @JsonFormat(pattern = "yyyy-MM-dd")
    public Date getJoinDate() {
        return joinDate;
    }

    public void setJoinDate(Date joinDate) {
        this.joinDate = joinDate;
    }
}

UsersPage.java

package com.hqyj.psl.entity;

import lombok.Data;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/16
 * \* Time: 14:07
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@Data
public class UsersPage {
    private  Integer page;//页数
    private  Integer num;//每页数量
}

2.持久层(mapper)又称dao层

AdminMapper.java

package com.hqyj.psl.mapper;

import com.hqyj.psl.entity.Admin;
import org.springframework.stereotype.Repository;

import java.util.List;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/18
 * \* Time: 23:13
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@Repository
public interface AdminMapper {
    Admin selectByName(String username);

    Integer insertBySignup(String username, String password);

    Integer update(Admin admin);

    Admin show(Admin admin);



    //根据用户名查询所拥有的角色
    List<String> selectRolesByUsername(String name);
    //根据用户名查询拥有的权限
    List<String> selectPermsByUsername(String name);
}

MyFileMapper.java

package com.hqyj.psl.mapper;


import com.hqyj.psl.entity.MyFile;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface MyFileMapper {

    //查所有
    List<MyFile> selectAll();
    //添加
    Integer insert(MyFile myFile);
    //删除

    //修改

    //根据id查询

    //移除文件
    Integer deleteFile(MyFile myFile);
}

OrdersMapper.java

package com.hqyj.psl.mapper;

import com.hqyj.psl.entity.Orders;
import org.springframework.stereotype.Repository;

import java.util.List;


@Repository
public interface OrdersMapper {
    /*List<Orders> selectAll();*/
    //删除
    Integer delete(Orders orders);
    //修改
    Integer update(Orders orders);
    //修改
    Integer insert(Orders orders);
    //模糊查/查所有
    List<Orders> selectLike(Orders orders);

    Integer deleteAll(List list);
}

RoleMapper.java

package com.hqyj.psl.mapper;


import com.hqyj.psl.entity.AdminVo;
import com.hqyj.psl.entity.Role;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public interface RoleMapper {

    //查找所有角色
    List<AdminVo> selectRoleAll();
    //根据角色查询所有拥有权限
    List<String> selectPermsByRole(Integer roleId);
    //根据用户名查询所有拥有的角色
    List<String> selectRolesByUsername(String username);
    //根据用户名查询所有拥有的权限
    List<String> selectPermsByUsername(String username);

    //添加角色及其权限

    //修改角色与权限
    //直接修改role表修改角色名
            Integer updateRoleName(Role role);

        //修改权限
            //删除权限关联表中的关联
            Integer deleteRole_P(Integer roleId);
            //根据权限名url查询权限id
            Integer selectPreId(String url);
            //添加权限关联表中的关联添加 preid
            Integer addRole_P(Integer rId, Integer pId);

       //删除逻辑

            //1.删除Role表中的关系
                Integer deleteRole(Integer roleId);
            //2.删除Role_Pre中的关系
                //上面有方法


        //添加角色逻辑
            //1.在Role表中添加角色名
            Integer addRoleName(Role role);
            //2.查询Role表中的roleId 通过角色名
            Integer selectRoleByName(Role role);
            //3.根据权限名url查询权限id
                    //修改里面有方法
            //4.添加权限关联表中的关联添加 preid
                    //修改里面有方法


}

UsersMapper.java

package com.hqyj.psl.mapper;

import com.hqyj.psl.entity.Users;
import com.hqyj.psl.entity.Users;
import org.springframework.stereotype.Repository;

import java.util.List;


@Repository
public interface UsersMapper {


    //查所有
    List<Users> selectAll();

    //添加
    Integer insert(Users users);

    //删除
    Integer deleteByUserId(Integer id);

    //修改
    Integer update(Users users);

    //逻辑删除
    Integer deleteUpdByUserId(Integer usersId);

    List<Users> search(Users users);

    Integer deleteAll(List list);

    //查找逻辑删除的
    List<Users> selectByDeletedUsers();
    //恢复删除
    Integer renew(Integer usersId);

    //物理删除
    Integer phyDel(Integer usersId);

    //条件查找
    List<Users> condQuery(Users user);

    //批量恢复
    Integer updateRenbit(List list);


    /*登录*/
    Users selectOneByUsername(String username);

//
//    //根据用户名查询所拥有的角色
//    List<String> selectRolesByUsername(String username);
//    //根据用户名查询拥有的权限
//    List<String> selectPermsByUsername(String username);

}

3.业务层(service)

service(定义接口)

AdminService.java

package com.hqyj.psl.service;

import com.hqyj.psl.entity.Admin;
import com.hqyj.psl.entity.AdminVo;
import com.hqyj.psl.utils.ResultUtils;

import javax.servlet.http.HttpSession;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/19
 * \* Time: 14:06
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public interface AdminService {
    ResultUtils login(Admin admin, HttpSession session);

    ResultUtils register(Admin admin);

    ResultUtils logout(HttpSession session);

    ResultUtils update(Admin admin);

    ResultUtils show(Admin admin);

}

MyFileService.java

package com.hqyj.psl.service;

import com.hqyj.psl.entity.MyFile;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.http.ResponseEntity;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

public interface MyFileService {

    //查所有
    ResultUtils fileList();

    //增加
    ResultUtils insert(MyFile myFile);

    //文档的上传 MultipartFile.transferTo  将接受到的文件传输到给定的目标文件
    ResultUtils upload(MultipartFile multipartFile, HttpServletRequest request);

    //文档的下载
    ResponseEntity<byte[]> downLoad(String fileName, HttpServletRequest request) throws IOException;

    //文档移除
    ResultUtils deleteFile(MyFile myFile);

}

OrdersService.java

package com.hqyj.psl.service;


import com.hqyj.psl.entity.Orders;
import com.hqyj.psl.utils.ResultUtils;

public interface OrdersService {

    /*ResultUtils ordersList(Orders orders);//查所有*/

    ResultUtils delete(Orders orders);//删除

    ResultUtils update(Orders orders);//修改

    ResultUtils insert(Orders orders);//增加

    ResultUtils selectLike(Orders orders);//模糊查/查所有

    ResultUtils deleteAll(Orders orders);//批量删除
}

UsersService.java

package com.hqyj.psl.service;

import com.hqyj.psl.entity.Users;
import com.hqyj.psl.utils.ResultUtils;

import javax.servlet.http.HttpSession;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/19
 * \* Time: 14:00
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
public interface UsersService {

    ResultUtils usersList(Users user);

    ResultUtils login(Users user, HttpSession session);

    ResultUtils logout(HttpSession session);

    ResultUtils update(Users user);

    ResultUtils deleteUpdByUserId(Users user);

    ResultUtils delete(Integer id);

    ResultUtils insert (Users user);

    ResultUtils search(Users users);


    ResultUtils deleteAll(Users users);

    ResultUtils selectByDeletedUsers(Users user);//查找被逻辑删除的

    ResultUtils renew(Users user);//恢复删除

    ResultUtils phyDel(Users user);//物理删除

    ResultUtils condQuery(Users user);//条件查找

    ResultUtils renewAll(Users user);//批量恢复
}

Impl(实现接口)

AdminServiceImpl.java

package com.hqyj.psl.service.impl;

import com.hqyj.psl.entity.Admin;
import com.hqyj.psl.entity.AdminVo;
import com.hqyj.psl.mapper.AdminMapper;
import com.hqyj.psl.service.AdminService;
import com.hqyj.psl.utils.ResultUtils;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.IncorrectCredentialsException;
import org.apache.shiro.authc.UnknownAccountException;
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 javax.servlet.http.HttpSession;
import java.util.List;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/19
 * \* Time: 14:06
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */

@Service
public class AdminServiceImpl implements AdminService {

    @Autowired
    private AdminMapper adminMapper;

    @Override
    public ResultUtils login(Admin admin, HttpSession session) {
        //0.非空验证
        if (admin.getUsername() == "" || admin.getPassword() == "") {
            return new ResultUtils(500, "用户名不能为空", null);
        }
        try {
            //1.获取当前用户对象主体
            Subject subject = SecurityUtils.getSubject();
            System.out.println("service中的subject对象:" + subject);
            //2.将请求参数封装到token中
            UsernamePasswordToken token = new UsernamePasswordToken(admin.getUsername(), admin.getPassword());
            //3。完成登录
            subject.login(token);
            session.setAttribute("user",admin.getUsername());
            session.setAttribute("admin",admin);
            return new ResultUtils(200, "登录成功", null);
        } catch (UnknownAccountException e) {
            return new ResultUtils(500, "用户名不存在", null);
        } catch (IncorrectCredentialsException e) {
            return new ResultUtils(500, "密码错误", null);
        }


    }

    @Override
    public ResultUtils register(Admin admin) {
        Integer integer = adminMapper.insertBySignup(admin.getUsername(),admin.getPassword());
        return new ResultUtils(200,"注册成功","success");
    }

    @Override
    public ResultUtils logout(HttpSession session) {
        //退出(session失效)
        //基于登录状态下放入session中所有的属性,如用户信息(状态),购物车等
        session.invalidate();
        //session移除某一个属性
        //session.removeAttribute("user");
        return new ResultUtils(200,"退出成功","login");
    }

    //修改用户个人信息
    @Override
    public ResultUtils update(Admin admin) {
        System.out.println("修改里面的数据"+admin);
        Integer update = adminMapper.update(admin);
        return new ResultUtils(200,"修改成功","");
    }

    //数据回显
    @Override
    public ResultUtils show(Admin admin) {
        Admin show = adminMapper.show(admin);
        return new ResultUtils(200,"显示成功",show);
    }



}

MyFileServiceImpl.java

package com.hqyj.psl.service.impl;

import com.hqyj.psl.entity.MyFile;
import com.hqyj.psl.mapper.MyFileMapper;
import com.hqyj.psl.service.MyFileService;
import com.hqyj.psl.utils.ResultUtils;
import org.apache.commons.io.FileUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpHeaders;
import org.springframework.http.HttpStatus;
import org.springframework.http.MediaType;
import org.springframework.http.ResponseEntity;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.File;
import java.io.IOException;
import java.util.HashMap;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/17
 * \* Time: 14:25
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@Service
public class MyFileServiceImpl implements MyFileService {

    @Autowired
    private MyFileMapper myFileMapper;

    @Override
    public ResultUtils fileList() {
       return new ResultUtils(200,"",myFileMapper.selectAll());
    }

    @Override
    public ResultUtils insert(MyFile myFile) {

        myFileMapper.insert(myFile);
        return new ResultUtils(200,"添加成功",null);
    }

    @Override
    public ResultUtils upload(MultipartFile multipartFile, HttpServletRequest request) {
        try {
            //1.获取文件上传目录的路径
            String filePath= request.getSession().getServletContext().getRealPath("upload");//虚拟路径
            System.out.println("上传文件的目录路径"+filePath);
            //2.获取上传的文件名
            String fileName = multipartFile.getOriginalFilename();
            System.out.println("上传的文件名"+fileName);
            //3.创建File对象
            File f = new File(filePath+"/"+fileName);
            //4.判断文件上传的目录是否存在
            if (!f.isDirectory()){
                //创建目录
                System.out.println("文件上传目录是否存在");
                f.mkdirs();
            }
            //5.上传文件
            multipartFile.transferTo(f);
            //6.创建map封装记录文件名及文件路径
            HashMap<String, Object> map = new HashMap<>();
            //localhost:8080/upload/a.txt
            map.put("servicePath","/upload/"+fileName);
            map.put("fileName",fileName);
            return new ResultUtils(200,"上传成功",map);

        } catch (IOException e) {
            e.printStackTrace();
            return new ResultUtils(500,"上传失败",null);
        }

    }

    @Override
    public ResponseEntity<byte[]> downLoad(String fileName,  HttpServletRequest request) throws IOException {
        //1.获取文档上传的路径
        String filePath = request.getSession().getServletContext().getRealPath("upload");
        System.out.println("获取文件上传的路径"+filePath);
        //2.创建文件对象
        File file = new File(filePath + "/" + fileName);
        //3.设置httpHeaders,使浏览器响应下载
        HttpHeaders headers = new HttpHeaders();
        //4.设置响应方式
        headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
        //5.设置响应头
        /*
        *  headerName:
        *       contentType:响应的内容格式
        *       contentDisposition
        *               -inline:直接在页面展示a
        *               -attachment:以附件的形式下载
        *
        * 乱码处理:
        * */
        headers.set("Content-Disposition","attachment;fileName="+
                new String(fileName.getBytes("utf-8"),"ISO8859-1")+"");
        return new ResponseEntity<byte[]>(FileUtils.readFileToByteArray(file),headers, HttpStatus.CREATED);
    }

    //移除文件
    @Override
    public ResultUtils deleteFile(MyFile myFile) {
        Integer integer = myFileMapper.deleteFile(myFile);
        return new ResultUtils(200,"移除成功",null);
    }
}

OrderServiceImpl.java

package com.hqyj.psl.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hqyj.psl.entity.Orders;
import com.hqyj.psl.mapper.OrdersMapper;
import com.hqyj.psl.service.OrdersService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

@Service
public class OrderServiceImpl implements OrdersService {

    @Autowired
    private OrdersMapper ordersMapper;

    /*@Override
    public ResultUtils ordersList(Orders orders) {
        //开启分页
        PageHelper.startPage(orders.getPage(),orders.getNum());
        List<Orders> orders1 = ordersMapper.selectAll();
        System.out.println(orders1+"-----------");
        PageInfo list = new PageInfo(orders1);
        HashMap<String, Object> map = new HashMap<>();
        map.put("totalPage",list.getPages());//总页数
        map.put("list",list.getList());//每页的数据
        map.put("total",list.getTotal());//总条数
        return new ResultUtils(200,"",map);
    }*/

    @Override
    public ResultUtils delete(Orders orders) {
        ordersMapper.delete(orders);
        return new ResultUtils(200,"删除成功",null);
    }

    @Override
    public ResultUtils update(Orders orders) {
        ordersMapper.update(orders);
        return new ResultUtils(200,"修改成功",null);
    }

    @Override
    public ResultUtils insert(Orders orders) {
        orders.setOrdersTime(new Date());
        ordersMapper.insert(orders);
        return new ResultUtils(200,"添加成功",null);
    }

    @Override//模糊查/查所有
    public ResultUtils selectLike(Orders orders) {
        System.out.println(orders);
        //开启分页
        PageHelper.startPage(orders.getPage(),orders.getNum());
        List<Orders> order = ordersMapper.selectLike(orders);
        PageInfo list = new PageInfo(order);
        HashMap<String, Object> map = new HashMap<>();
        map.put("totalPage",list.getPages());//总页数
        map.put("list",list.getList());//每页的数据
        map.put("total",list.getTotal());//总条数
        return new ResultUtils(200,"找到"+order.size()+"条数据",map);

    }

    @Override
    public ResultUtils deleteAll(Orders orders) {
        String[] split = orders.getListId().split(",");
        List<String> strings = Arrays.asList(split);
        Integer integer = ordersMapper.deleteAll(strings);
        if (integer > 0)
            return new ResultUtils(200,"删除成功",null);
        return null;
    }
}

RoleServiceImpl.java

package com.hqyj.psl.service.impl;


import com.hqyj.psl.entity.AdminVo;
import com.hqyj.psl.entity.Role;
import com.hqyj.psl.mapper.RoleMapper;
import com.hqyj.psl.service.RoleService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class RoleServiceImpl implements RoleService {

    @Autowired
    private RoleMapper roleMapper;

    @Override
    public ResultUtils selectRolePerAll() {
//        //测试获取所有角色
//        List<AdminVo> strings = adminMapper.selectRoleAll();
//        //根据角色拿去对应权限
//        HashMap<String, List<String>> map = new HashMap<>();
//        for (int i = 0; i < strings.size(); i++) {
//            AdminVo adminVo = strings.get(i);
//            String username =adminVo.getUsername();
//            Integer adminId = adminVo.getAdminId();
//            List<String> url = adminMapper.selectPermsByRole(username);
//            url.add(adminId.toString());
//            map.put(username,url);
//        }
//        System.out.println("数据已经拿到了:"+map);
        //测试获取所有角色
        List<AdminVo> strings = roleMapper.selectRoleAll();
        //根据角色拿去对应权限

        System.out.println(strings);
//        HashMap<String, List<String>> map = new HashMap<>();
        for (int i = 0; i < strings.size(); i++) {
            AdminVo adminVo = strings.get(i);
            String username =adminVo.getUsername();
            Integer roleId = adminVo.getRoles().get(0).getRoleId();
            List<String> url = roleMapper.selectPermsByRole(roleId);
            strings.get(i).setUrl(url.toString());
//            map.put(username,url);
        }
        System.out.println(strings);
        return new ResultUtils(200,"获取成功",strings);
    }

    @Override
    public ResultUtils updateRoleAndPer(AdminVo adminVo) {
        try {
            //直接修改role表修改角色名
            Role role = new Role();
            role.setRoleId(adminVo.getRoleId());
            role.setName(adminVo.getRname());
            roleMapper.updateRoleName(role);

            //修改权限
            //删除权限关联表中的关联
            roleMapper.deleteRole_P(role.getRoleId());

            //根据权限名url查询权限id
            String[] split = adminVo.getUrl().split(" ");
            System.out.println("我是权限:" + split);
            for (int i = 0; i < split.length; i++) {
                if (!(split[i].equals(""))) {
                    System.out.println("我是权限......+"+split[i]);
                    Integer preId = roleMapper.selectPreId(split[i]);
                    System.out.println("我是preId....."+preId);
                    //添加权限关联表中的关联添加 preid
                    roleMapper.addRole_P(role.getRoleId(), preId);
                }
            }
            return new ResultUtils(200,"修改成功",null);
        }catch (Exception e){
            return new ResultUtils(500,"修改失败",null);
        }



    }

    //删除Role
    @Override
    public ResultUtils deleteRole(AdminVo adminVo) {
        try {
            //删除Role_pre中的关系
            roleMapper.deleteRole_P(adminVo.getRoleId());
            //删除Role中角色
            roleMapper.deleteRole(adminVo.getRoleId());
            return new ResultUtils(200,"删除成功",null);
        }catch (Exception e){
            return new ResultUtils(500,"删除失败",null);
        }

    }

    //添加逻辑
    @Override
    public ResultUtils addRole(AdminVo adminVo) {

        try {
            Role role = new Role();
            role.setName(adminVo.getRname());
            //添加角色逻辑
            //1.在Role表中添加角色名
            roleMapper.addRoleName(role);

            //2.查询Role表中的roleId 通过角色名
            Integer roleId = roleMapper.selectRoleByName(role);
            role.setRoleId(roleId);

            //3.根据权限名url查询权限id
            String[] split = adminVo.getUrl().split(" ");
            System.out.println("我是权限:" + split);
            for (int i = 0; i < split.length; i++) {
                if (!(split[i].equals(""))) {
                    Integer preId = roleMapper.selectPreId(split[i]);
                    //添加权限关联表中的关联添加 preid
                    roleMapper.addRole_P(role.getRoleId(), preId);
                }
            }

            return new ResultUtils(200, "添加成功", null);
        }catch (Exception e){
            return new ResultUtils(500, "添加失败", null);
        }


    }
}

UsersServiceImpl.java

package com.hqyj.psl.service.impl;

import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.hqyj.psl.entity.Users;
import com.hqyj.psl.mapper.UsersMapper;
import com.hqyj.psl.service.UsersService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import javax.servlet.http.HttpSession;
import java.util.Arrays;
import java.util.Date;
import java.util.HashMap;
import java.util.List;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/19
 * \* Time: 14:01
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */

@Service
public class UsersServiceImpl implements UsersService {

    @Autowired
    private UsersMapper usersMapper;

    @Override
    public ResultUtils search(Users users) {
        PageHelper.startPage(users.getPage(),users.getNum());
        List<Users> search = usersMapper.search(users);
        PageInfo pageInfo = new PageInfo(search);
        HashMap<String, Object> hashMap = new HashMap<>();
        hashMap.put("totalPage",pageInfo.getPages());
        hashMap.put("list",pageInfo.getList());
        hashMap.put("total",pageInfo.getTotal());
        return new ResultUtils(200,"模糊查询分页",hashMap);
    }

    @Override
    public ResultUtils deleteAll(Users users) {

        //处理字符串
        String[] strings = users.getBitId().split(",");
        //将字符数组转为list
        List<String> list = Arrays.asList(strings);
        System.out.println(list);
        usersMapper.deleteAll(list);
        return new ResultUtils(200,"删除成功",null);

    }


    @Override
    public ResultUtils usersList(Users users) {
        //开启分页
        PageHelper.startPage(users.getPage(),users.getNum());
        //获取所有数据
        List<Users> userAll = usersMapper.selectAll();
        System.out.println("分页");
        PageInfo list = new PageInfo(userAll);
        HashMap<String, Object> map = new HashMap<>();
        map.put("totalPage",list.getPages());//总页数
        map.put("list",list.getList()); //每页显示的数据
        map.put("total",list.getTotal());//总条数
        return new ResultUtils(200,"",map);
    }





    @Override
    public ResultUtils login(Users users, HttpSession session) {
        return null;
    }

    @Override
    public ResultUtils logout(HttpSession session) {
        return null;
    }

    @Override
    public ResultUtils update(Users users) {
        users.setDeleted(0);
        System.out.println("跑了");
        users.setJoinDate(new Date());
        Integer update = usersMapper.update(users);
        if (update>0){
            return new ResultUtils(200,"修改成功",null);
        }else {
            return new ResultUtils(500,"修改失败",null);
        }
    }

    @Override
    public ResultUtils deleteUpdByUserId(Users users) {
        usersMapper.deleteUpdByUserId(users.getUsersId());
        return new ResultUtils(200,"删除成功",null);
    }

    @Override
    public ResultUtils delete(Integer id) {
        return null;
    }

    @Override
    public ResultUtils insert(Users users) {
        System.out.println(users);
        users.setDeleted(0);
        users.setJoinDate(new Date());
        usersMapper.insert(users);
        return new ResultUtils(200,"已添加",null);
    }
    @Override
    public ResultUtils selectByDeletedUsers(Users user) {
        System.out.println("当前页:" + user.getPage());
        System.out.println("当前页条数:" + user.getNum());
        //开启分页
        PageHelper.startPage(user.getPage(),user.getNum());
        //PageHelper.startPage(1,2);
        //获取所有数据
        List<Users> users = usersMapper.selectByDeletedUsers();
        PageInfo list = new PageInfo(users);
        HashMap<String, Object> map = new HashMap<>();
        map.put("totalPage",list.getPages());//总页数
        map.put("list",list.getList());//每页显示的数据
        map.put("total",list.getTotal());//总条数
        return new ResultUtils(200,"",map);

    }
    //恢复删除
    @Override
    public ResultUtils renew(Users user) {
        usersMapper.renew(user.getUsersId());
        return new ResultUtils(200,"恢复成功",null);
    }
    @Override
    public ResultUtils phyDel(Users user) {
        usersMapper.phyDel(user.getUsersId());
        return new ResultUtils(200,"删除成功",null);
    }
//查找全部被逻辑删除的
    @Override
    public ResultUtils condQuery(Users user) {
        System.out.println("当前页:" + user.getPage());
        System.out.println("当前页条数:" + user.getNum());
        //开启分页
        PageHelper.startPage(user.getPage(), user.getNum());
        //PageHelper.startPage(1,2);
        //获取所有数据
        List<Users> users = usersMapper.condQuery(user);
        PageInfo list = new PageInfo(users);
        HashMap<String, Object> map = new HashMap<>();
        map.put("totalPage", list.getPages());//总页数
        map.put("list", list.getList());//每页显示的数据
        map.put("total", list.getTotal());//总条数
        return new ResultUtils(200, "查找成功", map);
    }
    //批量恢复
    @Override
    public ResultUtils renewAll(Users users) {
        //1.处理字符串
        String[] strings = users.getRbitId().split(",");
        //2.将字符转为list
        List<String> list = Arrays.asList(strings);
        System.out.println("id为:"+list);
        //3.
        usersMapper.updateRenbit(list);
        return new ResultUtils(200,"恢复成功",null);
    }



}

4.控制层(controller)

AdminController.java

package com.hqyj.psl.controller;

import com.hqyj.psl.entity.AdminVo;

import com.hqyj.psl.service.RoleService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class AdminController {

    @Autowired
    private RoleService roleService;



    //前端角色逻辑
    @RequestMapping("/adminRole/{url}")
    public ResultUtils adminRole(@PathVariable String url, AdminVo adminVo){
        System.out.println("前端发送的数据为:"+url);
        switch (url){
            case "role":return roleService.selectRolePerAll();
            case "updateRole": return roleService.updateRoleAndPer(adminVo);
            case "deleteRole": return roleService.deleteRole(adminVo);
            case "addRole": return roleService.addRole(adminVo);
//                return adminService.addRole(adminVo);

        }

        return null;
    }
}

FileController.java

package com.hqyj.psl.controller;

import com.hqyj.psl.entity.MyFile;
import com.hqyj.psl.service.MyFileService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/17
 * \* Time: 15:00
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@RestController
public class FileController {

    @Autowired
    private MyFileService myFileService;

    //执行file的增删查改请求
    @RequestMapping("/myFileAjax/{url}")
    public ResultUtils myFileAjax(@PathVariable String url, MyFile myFile){
        switch (url){
            case "insert":
                return myFileService.insert(myFile);
            case "fileList":
                return myFileService.fileList();
            case "deleteFile":
                return myFileService.deleteFile(myFile);
        }
        return null;
    }

    //文档上传请求
    @RequestMapping("/file/upload")
    public ResultUtils upload(@RequestParam("file") MultipartFile file, HttpServletRequest request){
        return myFileService.upload(file,request);
    }


    //文件下载
    @RequestMapping("/file/downLoad")
    public ResponseEntity<byte[]> downLoad(String fileName,HttpServletRequest request) throws IOException{
        return myFileService.downLoad(fileName,request);
    }



}

package com.hqyj.psl.controller;

import com.hqyj.psl.entity.Orders;
import com.hqyj.psl.service.OrdersService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrdersController {

    @Autowired
    private OrdersService ordersService;

    @RequestMapping("/orders/{url}")
    public ResultUtils toOrders(@PathVariable String url, Orders orders){
        switch (url){
            /*case "ordersList"://查所有
                return ordersService.ordersList(orders);*/
            case "delete"://删除
                return ordersService.delete(orders);
            case "update"://修改
                return ordersService.update(orders);
            case "insert"://增加
                return ordersService.insert(orders);
            case "selectLike"://模糊查
                return ordersService.selectLike(orders);
            case "deleteAll"://模糊查
                return ordersService.deleteAll(orders);
        }
        return null;
    }

}

OrdersController.java

package com.hqyj.psl.controller;

import com.hqyj.psl.entity.Orders;
import com.hqyj.psl.service.OrdersService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class OrdersController {

    @Autowired
    private OrdersService ordersService;

    @RequestMapping("/orders/{url}")
    public ResultUtils toOrders(@PathVariable String url, Orders orders){
        switch (url){
            /*case "ordersList"://查所有
                return ordersService.ordersList(orders);*/
            case "delete"://删除
                return ordersService.delete(orders);
            case "update"://修改
                return ordersService.update(orders);
            case "insert"://增加
                return ordersService.insert(orders);
            case "selectLike"://模糊查
                return ordersService.selectLike(orders);
            case "deleteAll"://模糊查
                return ordersService.deleteAll(orders);
        }
        return null;
    }

}

PageController.java

package com.hqyj.psl.controller;

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

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/15
 * \* Time: 16:30
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */

@Controller
public class PageController {

    @RequestMapping("/{url}")
    public String login(@PathVariable String url){
        return url;
    }
}

UsersController.java

package com.hqyj.psl.controller;

import com.hqyj.psl.entity.Admin;
import com.hqyj.psl.entity.Users;
import com.hqyj.psl.entity.Users;
import com.hqyj.psl.service.AdminService;
import com.hqyj.psl.service.UsersService;
import com.hqyj.psl.service.UsersService;
import com.hqyj.psl.utils.ResultUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpSession;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/12
 * \* Time: 10:21
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@RestController
public class UsersController {

    @Autowired
    private UsersService usersService;


    @Autowired
    private AdminService adminService;


    @RequestMapping("/admin/{url}")
    public ResultUtils login(@PathVariable String url, Admin admin, HttpSession session){
        switch (url){
            case "login":
                return adminService.login(admin,session);
            case "signup":
                return adminService.register(admin);
            case "logout":
                return adminService.logout(session);
            case "update":
                return adminService.update(admin);
            case "showAdm":
                return adminService.show(admin);
        }
        return null;
    }


    @RequestMapping("/users/{url}")
//    @ResponseBody
    public ResultUtils toLogin(@PathVariable String url, Users users, HttpSession session){

        switch (url){
            case "login" :
                return usersService.login(users,session);
            case "deleteAll":
                return usersService.deleteAll(users);
            case "search":
                return usersService.search(users);
            case "userList":
                return usersService.usersList(users);
            case "updateUsers":
                return usersService.update(users);
            case "deleteUserById":
                return usersService.delete(users.getUsersId());
            case "insertUser":
                return usersService.insert(users);
            case "delete":
                return usersService.deleteUpdByUserId(users);
            case "userDel":
                return usersService.selectByDeletedUsers(users);
            case"renew":
                return usersService.renew(users);
            case"phyDel":
                return usersService.phyDel(users);
            case"condQuery":
                System.out.println("1");
                return usersService.condQuery(users);
            case"renewAll":
                return usersService.renewAll(users);
        }
        return null;
//        1.接受数据
    }

}

5.工具层(utils)

MdFiveUtils.java

package com.hqyj.psl.utils;

import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.crypto.hash.SimpleHash;
import org.springframework.stereotype.Component;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/20
 * \* Time: 9:41
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * \
 */
@Component//注册bean
public class MdFiveUtils {

    public String changePassword(String salt,String password){
        Md5Hash md5Hash = new Md5Hash(salt);
        SimpleHash pwd = new SimpleHash("MD5", password, md5Hash, 1024);
        return pwd.toString();
    }

    public static void main(String[] args) {
        MdFiveUtils md = new MdFiveUtils();
        String zhangsan = md.changePassword("zhangsan", "123456");
        System.out.println(zhangsan);
    }
}

ResultUtils.java

package com.hqyj.psl.utils;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/16
 * \* Time: 10:12
 * \* To change this template use File | Settings | File Templates.
 * \* Description:
 * 结果集工具类
 * \
 */

@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultUtils {
    private Integer code;//状态码
    private String msg;//消息信息
    private Object data;//返回对象
}

UserRealm.java

6.登录实现层(realm)

package com.hqyj.psl.realm;

import com.hqyj.psl.entity.Admin;
import com.hqyj.psl.mapper.AdminMapper;
import org.apache.shiro.authc.*;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.crypto.hash.Md5Hash;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.TestConstructor;

import java.util.List;

/**
 * \* Created with IntelliJ IDEA.
 * \* User: PuSongLin
 * \* Date: 2022/8/18
 * \* Time: 9:41
 * \* To change this template use File | Settings | File Templates.
 * \* Description: 领域:用于帮我们认证添加当前主体(subject--用户)的角色信息,权限信息
 * \
 */
public class UserRealm extends AuthorizingRealm {

    @Autowired
    private AdminMapper adminMapper;

    @Override//授权
    protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
        //1.获取当前登录的用户
        String name = principalCollection.fromRealm(this.getName()).iterator().next()+"";
        System.out.println("获取当前登录的用户"+name);
        //2.根据用户名查询角色及权限信息
        List<String> roles = adminMapper.selectRolesByUsername(name);
        List<String> perms = adminMapper.selectPermsByUsername(name);
        System.out.println("角色为:"+roles+"权限为:"+perms);
        //3.获取授权信息对象
        SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
        System.out.println("授权对象"+simpleAuthorizationInfo);
        //4.添加角色信息
        simpleAuthorizationInfo.addRoles(roles);
        //5.添加授权信息
        simpleAuthorizationInfo.addStringPermissions(perms);
        System.out.println("授权信息:"+simpleAuthorizationInfo);
        return simpleAuthorizationInfo;
    }



    @Override//认证-- 此处可究,量力而行
    protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
        //1.取出token对象 authenticationToken
        UsernamePasswordToken token= (UsernamePasswordToken)authenticationToken;
        System.out.println("token对象:"+token);

        //2.获取身份凭证
        String username = token.getPrincipal()+"";
        System.out.println("凭证为:"+username);
        //3.检验是否存在
        Admin admin =adminMapper.selectByName(username);
        //4.判断用户是否存在
        if (admin==null){
            throw new UnknownAccountException();
        }
//  return new SimpleAuthenticationInfo(用户名,密码,盐值,realm名字);
        //new Md5Hash(admin.getUsername()),
        System.out.println("权限:"+admin.getUsername()+"密码:"+admin.getPassword()+"realm:"+this.getName());
        return new SimpleAuthenticationInfo(admin.getUsername(),admin.getPassword(),this.getName());
    }
}

四、前端功能实现

1.static(前端静态资源显示)

在这里插入图片描述
这里下载解压到webappp文件下面
链接:https://pan.baidu.com/s/1D_EFbLyAO_faeH6uVEQvJA?pwd=9uwv
提取码:9uwv

2.upoad(文件上传目录)

在这里插入图片描述
在webapp文件下创建一个upload文件用于储存我们上传的文件。

3.jsp(显示页面格式为:xxx.jsp)

在这里插入图片描述

具体实现代码我这里就不写了
源代码就放在这里了。
链接:https://pan.baidu.com/s/1gS1p2XhJTyRY0vxCaBsYfQ?pwd=tzzk
提取码:tzzk


总结

提示:这里对文章进行总结:

有什么不懂,欢迎各位评论留言
都看到这里了,请各位的发财小手手点个赞。谢谢!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

带你看雪.

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值