文章目录

  • 前言
  • 一、项目结构
    • 1.文件结构
    • 2.部分显示效果图
  • 二、项目配置文件
    • pom.xml
    • resouerces
      • mapper文件
        • AdminMapper.xml
        • MyFileMapper.xml
        • UsersMapper.xml
        • OrdersMapper.xml(订单表映射)
        • RoleMapper.xml
    • application.xml(整合所有容器)
    • db.properties(mysql配置)
    • logj.properties(日志容器)
    • mybits-config.xml(存储过程及映射)
    • spring-dao.xml
    • spring-mvc.xml
    • spring-service.xml
    • spring-shiro.xml
  • 三、后端功能实现
    • 1.实体层(entity)
    • 2.持久层(mapper)又称dao层
    • 3.业务层(service)
      • service(定义接口)
      • Impl(实现接口)
    • 4.控制层(controller)
    • 5.工具层(utils)
    • 6.登录实现层(realm)
  • 四、前端功能实现
    • 1.static(前端静态资源显示)
    • 2.upoad(文件上传目录)
    • 3.jsp(显示页面格式为:xxx.jsp)
  • 总结

前言

开发工具: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 mapperPUBLIC "-//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 arleft join admin a on a.admin_id=ar.admin_idleft join role r on r.role_id=ar.role_idwhere a.name = #{name};</select><!--通过名字查询权限--><select id="selectPermsByUsername" resultType="java.lang.String">select p.url from role_permission rpleft join role r  on r.role_id=rp.role_idleft join permission p on p.permission_id=rp.permission_idwhere rp.role_id in(SELECT r.role_id FROM admin_role arleft join admin a on a.admin_id=ar.admin_idleft join role r on r.role_id=ar.role_idwhere 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 mapperPUBLIC "-//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 mapperPUBLIC "-//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 userwhere username=#{username}</select><update id="update">update usersset 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 mapperPUBLIC "-//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_idFROM orders_usersWHERE users_id IN (SELECT users_idFROM usersWHERE 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 mapperPUBLIC "-//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 arLEFT 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 rpLEFT 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 rpLEFT JOIN role r  ON r.role_id=rp.role_idLEFT JOIN permission p ON p.permission_id=rp.permission_idWHERE rp.role_id IN(SELECT r.role_id FROM admin_role adLEFT JOIN admin a ON a.admin_id=ad.admin_idLEFT JOIN role r ON r.role_id=ad.role_idWHERE 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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://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 configurationPUBLIC "-//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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/mvchttp://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><beanclass="org.springframework.http.converter.json.MappingJackson2HttpMessageConverter"><property name="objectMapper"><beanclass="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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop.xsdhttp://www.springframework.org/schema/txhttp://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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/aophttp://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;}@Overridepublic 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;//入职日期@Overridepublic 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查询权限idInteger selectPreId(String url);//添加权限关联表中的关联添加 preidInteger 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 {@Autowiredprivate AdminMapper adminMapper;@Overridepublic 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);}}@Overridepublic ResultUtils register(Admin admin) {Integer integer = adminMapper.insertBySignup(admin.getUsername(),admin.getPassword());return new ResultUtils(200,"注册成功","success");}@Overridepublic ResultUtils logout(HttpSession session) {//退出(session失效)//基于登录状态下放入session中所有的属性,如用户信息(状态),购物车等session.invalidate();//session移除某一个属性//session.removeAttribute("user");return new ResultUtils(200,"退出成功","login");}//修改用户个人信息@Overridepublic ResultUtils update(Admin admin) {System.out.println("修改里面的数据"+admin);Integer update = adminMapper.update(admin);return new ResultUtils(200,"修改成功","");}//数据回显@Overridepublic 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 {@Autowiredprivate MyFileMapper myFileMapper;@Overridepublic ResultUtils fileList() {return new ResultUtils(200,"",myFileMapper.selectAll());}@Overridepublic ResultUtils insert(MyFile myFile) {myFileMapper.insert(myFile);return new ResultUtils(200,"添加成功",null);}@Overridepublic 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.txtmap.put("servicePath","/upload/"+fileName);map.put("fileName",fileName);return new ResultUtils(200,"上传成功",map);} catch (IOException e) {e.printStackTrace();return new ResultUtils(500,"上传失败",null);}}@Overridepublic 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);}//移除文件@Overridepublic 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 {@Autowiredprivate OrdersMapper ordersMapper;/*@Overridepublic 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);}*/@Overridepublic ResultUtils delete(Orders orders) {ordersMapper.delete(orders);return new ResultUtils(200,"删除成功",null);}@Overridepublic ResultUtils update(Orders orders) {ordersMapper.update(orders);return new ResultUtils(200,"修改成功",null);}@Overridepublic 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);}@Overridepublic 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 {@Autowiredprivate RoleMapper roleMapper;@Overridepublic 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);}@Overridepublic 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查询权限idString[] 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);//添加权限关联表中的关联添加 preidroleMapper.addRole_P(role.getRoleId(), preId);}}return new ResultUtils(200,"修改成功",null);}catch (Exception e){return new ResultUtils(500,"修改失败",null);}}//删除Role@Overridepublic 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);}}//添加逻辑@Overridepublic 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查询权限idString[] 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]);//添加权限关联表中的关联添加 preidroleMapper.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 {@Autowiredprivate UsersMapper usersMapper;@Overridepublic 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);}@Overridepublic ResultUtils deleteAll(Users users) {//处理字符串String[] strings = users.getBitId().split(",");//将字符数组转为listList<String> list = Arrays.asList(strings);System.out.println(list);usersMapper.deleteAll(list);return new ResultUtils(200,"删除成功",null);}@Overridepublic 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);}@Overridepublic ResultUtils login(Users users, HttpSession session) {return null;}@Overridepublic ResultUtils logout(HttpSession session) {return null;}@Overridepublic 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);}}@Overridepublic ResultUtils deleteUpdByUserId(Users users) {usersMapper.deleteUpdByUserId(users.getUsersId());return new ResultUtils(200,"删除成功",null);}@Overridepublic ResultUtils delete(Integer id) {return null;}@Overridepublic ResultUtils insert(Users users) {System.out.println(users);users.setDeleted(0);users.setJoinDate(new Date());usersMapper.insert(users);return new ResultUtils(200,"已添加",null);}@Overridepublic 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);}//恢复删除@Overridepublic ResultUtils renew(Users user) {usersMapper.renew(user.getUsersId());return new ResultUtils(200,"恢复成功",null);}@Overridepublic ResultUtils phyDel(Users user) {usersMapper.phyDel(user.getUsersId());return new ResultUtils(200,"删除成功",null);}
//查找全部被逻辑删除的@Overridepublic 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);}//批量恢复@Overridepublic ResultUtils renewAll(Users users) {//1.处理字符串String[] strings = users.getRbitId().split(",");//2.将字符转为listList<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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate 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 {@Autowiredprivate UsersService usersService;@Autowiredprivate 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}")
//    @ResponseBodypublic 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 {@Autowiredprivate 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对象 authenticationTokenUsernamePasswordToken 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


总结

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

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

电商订单后台管理系统相关推荐

  1. 基于SSM框架的电商平台后台管理系统

    基于SSM框架的电商平台后台管理系统 1.主要技术: 2.需求分析 数据库表结构 项目目录结构 运行效果: 源码获取两种方式 下载地址: 源码在这里 1.主要技术: Spring SpringMVC ...

  2. 电商平台后台管理系统--环境搭建与管理员登录(一)

    将之前写好的ssm复制,重新命名为myecpbm,然后修改相关文件名和配置,文件目录结构和要修改的项目名如下图一 图一 1.选中改文件,Window==>show view==>Navig ...

  3. 电商平台后台管理系统--->项目前期准备(需求分析、系统设计、环境搭建与配置文件)

    1 绪论 在计算机时代日益发展的今天,计算机技术正快速融入这个社会的每一个领域.自计算机应用于管理领域以来,信息系统的开发与应用获得惊人的发展,电子商务也应运而生. 随着电子商务网站的经营不断扩大,有 ...

  4. 第4天-搭建项目(快速搭建电商平台后台管理系统及逆向生成微服务基本功能)

    1.快速搭建电商平台后台管理系统 目前在Gitee开源软件中,人人开源 和 若依 关注度比较高,优品电商平台后台系统采用人人开源的框架 来快速构建,完成基本的CRUD,开发更加关注复杂业务.高并发.高 ...

  5. 电商平台后台管理系统项目介绍

    MIMO电商平台后台管理系统 项目简介 基于 Vue3 + Vite2 + Typescript 开发的电子商务平台,组件库使用 element plus: 数据为 mock 模拟,登录账号密码随意填 ...

  6. 搭建项目-快速搭建电商平台后台管理系统及逆向生成微服务基本功能

    1 快速搭建电商平台后台管理系统 目前在Gitee开源软件中,人人开源和若依关注度比较高,优品电商平台后台系统采用人人开源的框架来快速构建,完成基本的CRUD,开发更加关注复杂业务.高并发.高可用以及 ...

  7. 电商平台后台管理系统

    程序设计逻辑简单,适合观摩学习使用. 文章目录 前言 一.开发技术和工具 二.功能模块 3.运行截图 总结 前言 一个电商网站,既在于它的网站前台设计制作的精良优美,更在于电商平台 后台的实用性和便捷 ...

  8. 电商平台后台管理系统--->系统详细设计(订单管理模块)

    5.3 订单管理 订单管理包括创建订单.查询订单.删除订单和查看订单明细等功能 5.3.1 订单列表显示 1.前端页面 (1)效果图 图5.11 订单列表显示页面 (2)前面页面主要技术介绍及主要功能 ...

  9. 电商平台后台管理系统--->操作方法说明

    目录 6 操作方法说明 6.1 登录首页 (1)输入http://localhost:8080/admin_login.jsp登录到后台登录页面 (2)输入管理员账号:admin,密码:123456即 ...

最新文章

  1. startActivity(xx,xx.class) 传递数据
  2. OpenCV形态学变换函数morphologyEx()黑帽运算的使用
  3. 隐藏在华为2019财报里的“数字密码”
  4. UI素材模板|app ui界面的导航设计都有哪些?
  5. iOS 开发 - 绘制辉光效果
  6. “21天好习惯”第一期-10
  7. BIM平台 http://gzcd.bim001.cn
  8. c++_string与double/int互转
  9. kubernetes视频教程笔记 (29)-安全-认证Authentication
  10. Linux 火焰图(on-cpu , off-cpu , memory)
  11. Redis 锁的实现方案
  12. 00.springboot 操作数据库的封装
  13. java date 默认值_Java程序将java.util.Date转换为ZonedDateTime
  14. bt5使用教程----主要是渗透方面
  15. 计算机英语videos啥意思,video是什么意思_video翻译_读音_用法_翻译
  16. solidworks动画制作教程——装配体爆炸动画
  17. maven 打包把依赖jar打进去
  18. Linux-bash特性详解
  19. 分享3款在线图片处理工具,解决图片问题不用担心
  20. javascript Array系列函数之14:every函数

热门文章

  1. nrf uart for android,nrf connect
  2. nrf52840烧录提示错误原因和解决办法
  3. 程序员的英文代号_构建一个代号为1的聊天应用程序4
  4. 【读书总结】《Rework》 —— 重新定义工作
  5. sasl java_SASL协议java实现
  6. Idea 代码注释模板(获取参数,方法外可用) , java版
  7. 如何使用python制作一款屏幕颜色提取器,附带exe文件
  8. FCN训练自己数据集(person-segmentation)、SIFT-FLOW、SBD和VOC实验总结
  9. 国家集训队论文分类整理(转)
  10. 图像运动模糊及其去除