包结构
src-main-com-controller/entity/mapper/MyException/MyFilter/realm/service
resources-applicationContext-mapper.xml/applicationContext-mvc.xml/applicationContext-service.xml/applicationContext-web.xml/applicationContext-shiro.xml/jdbc.properties/mybatis-config.xml
webapp-static/WEB-INF-html/web.xml
pom.xml
java
controller.ProductController
package com.itqf.controller;
import com.github.pagehelper.PageInfo;
import com.itqf.entity.Product;
import com.itqf.entity.Users;
import com.itqf.service.ProductService;
import org.apache.shiro.SecurityUtils;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.UsernamePasswordToken;
import org.apache.shiro.subject.Subject;
import org.omg.CORBA.PUBLIC_MEMBER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.SessionAttributes;
import javax.servlet.http.HttpServletRequest;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;
@Controller
@SessionAttributes(names = "users")
public class ProductController {
@Autowired
private ProductService productService;
//查询所有
@RequestMapping("/list")
@ResponseBody
public PageInfo<Product> showProduct(@RequestParam(defaultValue = "1")int currentPage,
@RequestParam(defaultValue = "3")int pageSize,
@RequestParam(defaultValue = "")String pname){
PageInfo<Product> productPageInfo = productService.selectAllProductByPname(pname,currentPage,pageSize);
return productPageInfo;
}
//获取遍历页面
@RequestMapping("/getAll")
public String getAll(){
return "product_show";
}
//获取首页
@RequestMapping("/")
public String getIndex(){
return "login";
}
//获取添加页面
@RequestMapping("/getInsert")
public String getInsert(){
return "product_insert";
}
//执行添加操作
@RequestMapping("/insert")
@ResponseBody
public Map insert(Product product){
int i = productService.insertProduct(product);
Map<String,Integer> map = new HashMap<>();
if (i != 0){
map.put("code",1);
return map;
}
map.put("code",0);
return map;
}
//删除
@RequestMapping("/delete")
@ResponseBody
public Map delete(int pid){
int i = productService.deleteProduct(pid);
Map<String,Integer> map = new HashMap<>();
if (i != 0){
map.put("code",1);
return map;
}
map.put("code",0);
return map;
}
//获取修改页面
@RequestMapping("/getUpdate")
public String getUpdate(int pid, HttpServletRequest request){
//if (!StringUtils.isEmpty(request.getSession().getAttribute("pid"))){
// request.getSession().removeAttribute("pid");
//}
request.getSession().setAttribute("pid",pid);
return "product_update";
}
//查询具体信息
@RequestMapping("/getProduct")
@ResponseBody
public Product getProduct(HttpServletRequest request){
int pid = (int)request.getSession().getAttribute("pid");
return productService.selectProduct(pid);
}
//修改信息
@RequestMapping("/update")
@ResponseBody
public Map update(Product product){
int i = productService.updateProduct(product);
Map<String,Integer> map = new HashMap<>();
if (i != 0){
map.put("code",1);
return map;
}
map.put("code",0);
return map;
}
//登录页面
@RequestMapping("/getLogin")
public String getLogin(){
return "login";
}
//登录
@RequestMapping("/login")
@ResponseBody
public Map login(Users users, int rem, Model model){
UsernamePasswordToken token = new UsernamePasswordToken(users.getUsername(),users.getPassword());
System.out.println(rem);
if (rem == 1){
token.setRememberMe(true);
}
Subject subject = SecurityUtils.getSubject();
Map<String,Integer> map = new HashMap<>();
try {
subject.login(token);
Users loginUser = (Users) subject.getPrincipal();
model.addAttribute("users",loginUser);
map.put("code",1);
return map;
} catch (AuthenticationException e) {
e.printStackTrace();
model.addAttribute("msg","认证失败");
}
map.put("code",0);
return map;
}
@RequestMapping("/403")
public String jump403(){
return "403";
}
@RequestMapping("/logout")
public String logout(){
Subject subject = SecurityUtils.getSubject();
if (subject != null){
subject.logout();
}
return "redirect:/getLogin";
}
}
entity.Menus
package com.itqf.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Menus implements Serializable {
private Integer mId;
private String mName;
private String mUrl;
}
entity.Product
package com.itqf.entity;
import com.fasterxml.jackson.annotation.JsonFormat;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import org.springframework.format.annotation.DateTimeFormat;
import java.io.Serializable;
import java.util.Date;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Product implements Serializable {
private Integer pid;
private String pname;
private String marketPrice;
private String shopPrice;
private String pimage;
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")
private Date pdate;
private String pdesc;
}
entity.RoleMenu
package com.itqf.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class RoleMenu implements Serializable {
private Integer rmId;
private Integer rId;
private Integer mId;
}
entity.Rolels
package com.itqf.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
import java.util.List;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Roles implements Serializable {
private Integer rId;
private String rName;
private List<Menus> menus;
}
entity.UserRole
package com.itqf.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class UserRole implements Serializable {
private Integer urId;
private Integer uId;
private Integer rId;
}
entity.Users
package com.itqf.entity;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.ToString;
import java.io.Serializable;
import java.util.List;
@Data
@ToString
@AllArgsConstructor
@NoArgsConstructor
public class Users implements Serializable {
private Integer uId;
private String username;
private String salt;
private String password;
private List<Roles> roles;
}
mapper.ProductMapper
package com.itqf.mapper;
import com.itqf.entity.Product;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface ProductMapper {
//通过商品名查询所有商品
List<Product> selectAllProductByPname(@Param("pname")String pname);
//添加商品
int insertProduct(Product product);
//删除商品
int deleteProduct(int pid);
//查询商品信息
Product selectProduct(int pid);
//修改商品
int updateProduct(Product product);
}
mapper.ProducctMapper.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.itqf.mapper.ProductMapper">
<!--//通过商品名查询所有商品-->
<!--List<Product> selectAllProductByPname(@Param("pname") String pname);-->
<select id="selectAllProductByPname" resultType="product">
select * from product
<where>
<if test="pname != null and pname != ''">
pname like "%"#{pname}"%"
</if>
</where>
</select>
<!--//添加商品-->
<!--int insertProduct(Product product);-->
<insert id="insertProduct" parameterType="product" useGeneratedKeys="true" keyProperty="pid">
insert into product (pname, market_price, shop_price, pimage, pdate, pdesc)
values (#{pname}, #{marketPrice}, #{shopPrice}, #{pimage}, #{pdate}, #{pdesc})
</insert>
<!--//删除商品-->
<!--int deleteProduct(int pid);-->
<delete id="deleteProduct">
delete from product where pid = #{pid}
</delete>
<!--//查询商品信息-->
<!--Product selectProduct(int pid);-->
<select id="selectProduct" resultType="product">
select * from product where pid = #{pid}
</select>
<!--//修改商品-->
<!--int updateProduct(Product product);-->
<update id="updateProduct" parameterType="product">
update product
<set>
<if test="pname != null and pname != ''">
pname = #{pname}
</if>
<if test="marketPrice != null and marketPrice != ''">
,market_price = #{marketPrice}
</if>
<if test="shopPrice != null and shopPrice != ''">
,shop_price = #{shopPrice}
</if>
<if test="pimage != null and pimage != ''">
,pimage = #{pimage}
</if>
<if test="pdate != null">
,pdate = #{pdate}
</if>
<if test="pdesc != null and pdesc != ''">
,pdesc = #{pdesc}
</if>
</set>
where pid = #{pid}
</update>
</mapper>
mapper.UsersMapper
package com.itqf.mapper;
import com.itqf.entity.Users;
import java.util.Set;
public interface UsersMapper {
//查权限角色
Users selectUsersAndRolesAndPermissions(String username);
//查角色
Set<String> selectRolesByUsername(String username);
//查权限
Set<String> selectPermissionsByRoles(Set<String> roles);
}
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.itqf.mapper.UsersMapper">
<resultMap id="BaseResultMap" type="com.itqf.entity.Users">
<id column="u_id" jdbcType="INTEGER" property="uId"/>
<result column="username" jdbcType="VARCHAR" property="username"/>
<result column="salt" jdbcType="VARCHAR" property="salt"/>
<result column="password" jdbcType="VARCHAR" property="password" />
</resultMap>
<!--//查权限角色-->
<!--Users selectUsersAndRolesAndPermissions(String username);-->
<resultMap id="usermap" type="users">
<id property="uId" column="u_id"/>
<collection property="roles" ofType="roles">
<id column="rId" property="r_id"/>
<collection property="menus" ofType="menus">
<id property="mId" column="m_id" />
</collection>
</collection>
</resultMap>
<select id="selectUsersAndRolesAndPermissions" resultMap="usermap">
select u.*,r.*,m.*
from users u join user_role ur on u.u_id = ur.u_id
join roles r on ur.r_id = r.r_id
join role_menu rm on rm.r_id = r.r_id
join menus m on rm.m_id = m.m_id
where u.username = #{username}
</select>
<!--//查角色-->
<!--Set<String> selectRolesByUsername(String username);-->
<select id="selectRolesByUsername" resultType="String">
select r.r_name
from users u join user_role ur on u.u_id = ur.u_id
join roles r on ur.r_id = r.r_id
where u.username = #{username}
</select>
<!--//查权限-->
<!--Set<String> selectPermissionsByRoles(Set<String> roles);-->
<select id="selectPermissionsByRoles" resultType="String">
select m.m_name
from roles r join role_menu rm on r.r_id = rm.r_id
join menus m on rm.m_id = m.m_id
where r.r_name in
<foreach collection=" collection" open="(" close=")" separator="," item="rname">
#{rname}
</foreach>
</select>
</mapper>
MyException.UnanthExceptionHandler
package com.itqf.MyException;
import org.apache.shiro.authz.UnauthorizedException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.ModelAndView;
@ControllerAdvice
public class UnauthExceptionHandler {
@ExceptionHandler(UnauthorizedException.class)
public ModelAndView handleException(UnauthorizedException ex){
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("403");
modelAndView.addObject("msg","权限验证失败!");
return modelAndView;
}
}
MyFilter.RolesOrFilter
package com.itqf.MyFilter;
import org.apache.shiro.subject.Subject;
import org.apache.shiro.web.filter.authz.AuthorizationFilter;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
public class RolesOrFilter extends AuthorizationFilter {
@Override
protected boolean isAccessAllowed(ServletRequest servletRequest, ServletResponse servletResponse, Object o) throws Exception {
//1.获取subject
Subject subject = getSubject(servletRequest, servletResponse);
//2.获取参数
String[] roles = (String[])o;
if (roles == null && roles.length ==0){
return true;
}
for (String role : roles) {
if (subject.hasRole(role)){
return true;
}
}
return false;
}
}
realm.MyRealm
package com.itqf.realm;
import com.itqf.entity.Users;
import com.itqf.service.UsersService;
import org.apache.shiro.authc.AuthenticationException;
import org.apache.shiro.authc.AuthenticationInfo;
import org.apache.shiro.authc.AuthenticationToken;
import org.apache.shiro.authc.SimpleAuthenticationInfo;
import org.apache.shiro.authz.AuthorizationInfo;
import org.apache.shiro.authz.SimpleAuthorizationInfo;
import org.apache.shiro.realm.AuthorizingRealm;
import org.apache.shiro.subject.PrincipalCollection;
import org.apache.shiro.util.ByteSource;
import org.springframework.beans.factory.annotation.Autowired;
import java.util.Set;
public class MyRealm extends AuthorizingRealm {
@Autowired
private UsersService usersService;
@Override
protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principalCollection) {
Users users = (Users)principalCollection.getPrimaryPrincipal();
Set<String> roles = usersService.selectRolesByUsername(users.getUsername());
System.out.println("roles = " + roles);
Set<String> permissions = usersService.selectPermissionsByRoles(roles);
System.out.println("permissions = " + permissions);
SimpleAuthorizationInfo simpleAuthorizationInfo = new SimpleAuthorizationInfo();
simpleAuthorizationInfo.setRoles(roles);
simpleAuthorizationInfo.setStringPermissions(permissions);
return simpleAuthorizationInfo;
}
@Override
protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authenticationToken) throws AuthenticationException {
String username = (String)authenticationToken.getPrincipal();
Users users = usersService.selectUsersAndRolesAndPermissions(username);
System.out.println("users = " + users);
if (users == null){
return null;
}else {
System.out.println(ByteSource.Util.bytes(users.getSalt()));
SimpleAuthenticationInfo simpleAuthenticationInfo = new SimpleAuthenticationInfo(users,users.getPassword(), ByteSource.Util.bytes(users.getSalt()),"MyRealm");
return simpleAuthenticationInfo;
}
}
}
service.ProductService
package com.itqf.service;
import com.github.pagehelper.PageInfo;
import com.itqf.entity.Product;
import java.util.List;
public interface ProductService {
//通过商品名查询所有商品
PageInfo<Product> selectAllProductByPname(String pname,int currentPage,int pageSize);
//添加商品
int insertProduct(Product product);
//删除商品
int deleteProduct(int pid);
//查询商品信息
Product selectProduct(int pid);
//修改商品
int updateProduct(Product product);
}
service.UsersService
package com.itqf.service;
import com.itqf.entity.Users;
import java.util.Set;
public interface UsersService {
//查权限角色
Users selectUsersAndRolesAndPermissions(String username);
//查角色
Set<String> selectRolesByUsername(String username);
//查权限
Set<String> selectPermissionsByRoles(Set<String> roles);
}
service.ProductServiceImpl
package com.itqf.service.impl;
import com.github.pagehelper.PageHelper;
import com.github.pagehelper.PageInfo;
import com.itqf.entity.Product;
import com.itqf.mapper.ProductMapper;
import com.itqf.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import java.util.List;
@Service
@Transactional
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductMapper productMapper;
@Override
public PageInfo<Product> selectAllProductByPname(String pname,int currentPage,int pageSize) {
PageHelper.startPage(currentPage,pageSize);
List<Product> list = productMapper.selectAllProductByPname(pname);
return new PageInfo<>(list);
}
@Override
public int insertProduct(Product product) {
return productMapper.insertProduct(product);
}
@Override
public int deleteProduct(int pid) {
return productMapper.deleteProduct(pid);
}
@Override
public Product selectProduct(int pid) {
return productMapper.selectProduct(pid);
}
@Override
public int updateProduct(Product product) {
return productMapper.updateProduct(product);
}
}
service.UsersServiceImpl
package com.itqf.service.impl;
import com.itqf.entity.Users;
import com.itqf.mapper.UsersMapper;
import com.itqf.service.UsersService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.Set;
@Service
public class UsersServiceImpl implements UsersService {
@Autowired
private UsersMapper usersMapper;
@Override
public Users selectUsersAndRolesAndPermissions(String username) {
return usersMapper.selectUsersAndRolesAndPermissions(username);
}
@Override
public Set<String> selectRolesByUsername(String username) {
return usersMapper.selectRolesByUsername(username);
}
@Override
public Set<String> selectPermissionsByRoles(Set<String> roles) {
return usersMapper.selectPermissionsByRoles(roles);
}
}
resources
applicationContext-mapper.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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">
<!-- 1.初始化c3p0连接池-->
<context:property-placeholder location="classpath:jdbc.properties" />
<bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
<property name="driverClass" value="${driver}" />
<property name="jdbcUrl" value="${url}" />
<property name="password" value="${password}" />
<property name="user" value="${user}" />
</bean>
<!-- spring 整合mybatis-->
<!-- sqlsession -->
<bean id="sqlsessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource" />
<!--核心配置文件传给了sqlsessionfactory -->
<property name="configLocation" value="classpath:mybatis-config.xml" />
</bean>
<!-- mapper扫描所有mapper -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="sqlSessionFactoryBeanName" value="sqlsessionFactory" />
<property name="basePackage" value="com.itqf.mapper" />
</bean>
</beans>
applicationContext-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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!-- handler controller handlermapping handleradataer
视图解析器
json转化器 静态资源处理器
文件上传解析器
拦截器配置
cros跨域同源策略设置
-->
<context:component-scan base-package="com.itqf.controller">
<!--<context:include-filter type="annotation" expression="org.springframework.stereotype.Controller"/>-->
</context:component-scan>
<mvc:annotation-driven />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/html/" />
<property name="suffix" value=".html" />
</bean>
<mvc:default-servlet-handler />
<!-- <mvc:interceptors>-->
<!-- -->
<!-- </mvc:interceptors>-->
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
</bean>
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-methods="POST, GET, OPTIONS, DELETE, PUT,PATCH"
allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
allow-credentials="true" />
</mvc:cors>
</beans>
applicationContext-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:tx="http://www.springframework.org/schema/tx"
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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd http://www.springframework.org/schema/aop https://www.springframework.org/schema/aop/spring-aop.xsd">
<context:component-scan base-package="com.itqf.service" />
<!-- 扫描业务层
自定义增强:
spring tx
-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager" >
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="advice" transaction-manager="transactionManager">
<tx:attributes>
<!-- dql -->
<tx:method name="find*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS"/>
<tx:method name="select*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS"/>
<tx:method name="query*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS" />
<tx:method name="search*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS" />
<tx:method name="show*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS" />
<tx:method name="get*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS" />
<tx:method name="have*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS" />
<tx:method name="cha*" isolation="READ_COMMITTED" timeout="30" read-only="true" propagation="SUPPORTS" />
<!-- dml -->
<tx:method name="insert*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="add*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="post*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="save*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="update*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="modify*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="change*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="flush*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="sub*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="delete*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="remove*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="drop*" isolation="READ_COMMITTED" timeout="30" read-only="false" propagation="REQUIRED" />
<tx:method name="*" isolation="READ_COMMITTED" />
</tx:attributes>
</tx:advice>
<aop:config>
<aop:pointcut id="pc" expression="execution(* com..servic.impl.*Impl.*(..))"/>
<aop:advisor advice-ref="advice" pointcut-ref="pc" />
</aop:config>
</beans>
applicationContext-web.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: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 https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
<context:component-scan base-package="com.itqf.controller" >
</context:component-scan>
<mvc:annotation-driven />
<mvc:default-servlet-handler />
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/WEB-INF/html/" />
<property name="suffix" value=".html" />
</bean>
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="defaultEncoding" value="UTF-8" />
</bean>
<mvc:cors>
<mvc:mapping path="/**"
allowed-origins="*"
allowed-methods="POST, GET, OPTIONS, DELETE, PUT,PATCH"
allowed-headers="Content-Type, Access-Control-Allow-Headers, Authorization, X-Requested-With"
allow-credentials="true" />
</mvc:cors>
</beans>
applicationContext-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"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- realm secritymanager -->
<!--创建加密matcher-->
<bean id="matcher" class="org.apache.shiro.authc.credential.HashedCredentialsMatcher">
<property name="hashAlgorithmName" value="MD5" />
<property name="hashIterations" value="18" />
</bean>
<!-- realm -->
<bean id="myrealm" class="com.itqf.realm.MyRealm">
<!-- 密码匹配-->
<property name="credentialsMatcher" ref="matcher" />
</bean>
<!--<!– 自定义退出登陆 –>-->
<!--<bean id="logout" class="org.apache.shiro.web.filter.authc.LogoutFilter">-->
<!-- <property name="redirectUrl" value="/getLogin" />-->
<!--</bean>-->
<bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
<property name="realm" ref="myrealm" />
<!-- 记录账号-->
<property name="rememberMeManager" ref="rememberMeManager" />
</bean>
<!--记住我-->
<bean id="rememberMeManager" class="org.apache.shiro.web.mgt.CookieRememberMeManager">
<property name="cookie" ref="cookie1" />
</bean>
<!-- rememberme记录需要设置cookie-->
<bean id="cookie1" class="org.apache.shiro.web.servlet.SimpleCookie" >
<!--通过构造方法的方式设置cookie的name属性-->
<constructor-arg value="rebcookie" />
<property name="httpOnly" value="true" />
<!--<property name="maxAge" value="-1" /> 代表浏览器关闭 cookie也就销毁-->
<!-- 正值代表秒 60分钟-->
<property name="maxAge" value="60" />
<property name="path" value="/" />
</bean>
<!--自定义orRoles-->
<bean id="orroles" class="com.itqf.MyFilter.RolesOrFilter"/>
<!-- 过滤器-->
<!-- 授权管理 -->
<bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
<property name="securityManager" ref="securityManager" />
<!-- 配置登陆页面 认证不通过的!会自动跳转到登陆页面
没有认证的
-->
<property name="loginUrl" value="/getLogin" />
<!-- 页面要求授权 但是没有授权的!-->
<property name="unauthorizedUrl" value="/403" />
<!--引入自定义orRoles-->
<property name="filters">
<map>
<entry key="orr" value-ref="orroles"/>
</map>
</property>
<property name="filterChainDefinitions">
<value>
<!-- 登陆页面和退出登陆,403,程序的首页 / 匿名资源 不需要认证就可以登陆!
首页需要认证才能访问!
商品展示页面 需要认证才可以访问!
LogoutFilter
商品添加页面 需要授权 role 管理员
-->
/getLogin=anon
/login=anon
/403=anon
/=anon
<!-- 静态资源 匿名资源-->
/layui/**=anon
/static/**=anon
<!-- 认证过才放行
roles【1,2】同时需要拥有两个角色才可以访问 ! and的关系
-->
/getInsert=roles[卖家]
/insert=roles[卖家]
/getUpdate=roles[卖家]
/getProduct=roles[卖家]
/update=roles[卖家]
/delete=roles[卖家]
/getLayui=roles[买家]
/layuiShow=roles[买家]
/**=authc
/*.*=authc
</value>
</property>
</bean>
</beans>
jdbc.properties
driver=com.mysql.jdbc.Driver
url=jdbc:mysql:///store2
user=root
password=dong1995
mybatis-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>
<!-- 配置mybati的核心属性-->
<!--读取外部的配置文件,或者直接声明外部配置文件 -->
<settings>
<!-- 告诉mybatis开启后台的sql语句输出!
-->
<setting name="logImpl" value="STDOUT_LOGGING"/>
<setting name="returnInstanceForEmptyRow" value="false"/>
<setting name="mapUnderscoreToCamelCase" value="true"/>
<setting name="autoMappingBehavior" value="FULL"/>
<setting name="lazyLoadingEnabled" value="true"/>
<setting name="aggressiveLazyLoading" value="true"/>
<!-- 二级缓存第一层大闸开启 默认就是开启 -->
<setting name="cacheEnabled" value="true"/>
</settings>
<typeAliases>
<!-- 指定具体的类起别名 -->
<!-- <typeAlias type="com.com.itqf.entity.Account" alias="account" />-->
<!-- 给包下的所有类起别名 默认:类的首字母小写 XxXx xxXx -->
<!-- 不想用默认命名 @Alias 一定要加载package - name对应的包的类中-->
<package name="com.itqf.entity"/>
</typeAliases>
<plugins>
<!--<plugin interceptor="com.github.pagehelper.PageHelper">-->
<!-- <property name="dialect" value="mysql"/>-->
<!--</plugin>-->
<!--5.0版本pagehelper-->
<plugin interceptor="com.github.pagehelper.PageInterceptor">
<property name="helperDialect" value="mysql"/>
</plugin>
</plugins>
</configuration>
webapp
WEB-INF-html
403.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<meta http-equiv="X-UA-Compatible" content="IE=9; IE=8; IE=7; IE=EDGE"/>
<title>商城展示403</title>
<link rel="stylesheet" href="/css/index.css" type="text/css"/>
<link href="/css/layui.css" rel="stylesheet" type="text/css"/>
<script src="/js/common/jquery-1.8.3.js" type="text/javascript"></script>
<script src="/js/layui.js" type="text/javascript"></script>
<style type="text/css">
html,body{
height: 100%;
width: 100%;
}
</style>
</head>
<body>
<div class="container" style="height: 100%">
<div>
<h1 style="text-align: center;color: red">您没有权限!</h1>
</div>
</body>
</html>
layui_show.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>table模块快速使用</title>
<link rel="stylesheet" href="/layui/css/layui.css" media="all">
</head>
<body style="width: 80%;margin: 0 auto;">
<div>
<h1 style="color: orange;text-align: center">Layui风格数据展示页面</h1>
<hr style="color: red">
<hr style="color: red">
<br>
<table id="demo" lay-filter="test"></table>
</div>
<script src="/layui/layui.js"></script>
<script>
layui.use('table', function(){
var table = layui.table;
//第一个实例
table.render({
elem: '#demo'
,height: 312
,url: '/layuiShow' //数据接口
,page: true //开启分页
,cols: [[ //表头
{type: 'checkbox', fixed: 'left'}
,{field:'pid',title: '产品id'}
,{field:'pname',title: '产品名称'}
,{field:'marketPrice',title: '市场价'}
,{field:'shopPrice',title: '超市售价'}
,{field:'pimage',title: '图片链接'}
,{field:'pdesc',title:'产品描述'}
,{fixed: 'right', title:'操作', toolbar: '#barDemo'}
]]
});
});
</script>
</body>
</html>
login.html
<!-- 登录页面 -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录页面</title>
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.min.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
<div style="margin-top: 100px;text-align: center">
<h1 style="color: magenta">欢迎来到本商品交易系统</h1>
<h1 style="color: magenta">请登陆!</h1>
</div>
<div class="col-md-12 column" style="margin: 0 auto;width: 70%;">
<form class="form-horizontal" role="form" id="form">
<div class="form-group">
<label for="username" class="col-sm-2 control-label">用户名</label>
<div class="col-sm-10">
<input type="text" name="username" class="form-control" id="username" />
</div>
</div>
<div class="form-group">
<label for="password" class="col-sm-2 control-label">密码</label>
<div class="col-sm-10">
<input type="password" name="password" class="form-control" id="password" />
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<div class="checkbox">
<label><input type="checkbox" name="rem" id="rem" value="1"/>记住我</label>
</div>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-default" onclick="login()">登陆</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
<script type="text/javascript">
function login() {
var data1 = $("#form").serialize();
$.ajax({
url:"/login",
type:"post",
data:data1,
dataType:"json",
success:function(data){
if (data.code === 1){
location.href="/getAll";
} else {
location.href="/getLogin";
}
}
});
}
</script>
</html>
product_insert.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>添加</title>
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.js" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<h3 class="text-success" style="text-align: center">
添加商品
</h3>
<form class="form-horizontal" role="form" id="form">
<div class="form-group">
<label for="pname" class="col-sm-2 control-label">商品名称</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pname" name="pname"/>
</div>
</div>
<div class="form-group">
<label for="marketPrice" class="col-sm-2 control-label">市场价</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="marketPrice" name="marketPrice"/>
</div>
</div>
<div class="form-group">
<label for="shopPrice" class="col-sm-2 control-label">超市售价</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="shopPrice" name="shopPrice" />
</div>
</div>
<div class="form-group">
<label for="pimage" class="col-sm-2 control-label">图片</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pimage" name="pimage"/>
</div>
</div>
<div class="form-group">
<label for="pdate" class="col-sm-2 control-label">上架日期</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pdate" name="pdate"/>
</div>
</div>
<div class="form-group">
<label for="pdesc" class="col-sm-2 control-label">商品描述</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pdesc" name="pdesc"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-default" onclick="add()">添加</button>
<button type="button" onclick="history.back();" class="btn btn-success">返回</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
<script type="text/javascript">
function add() {
var data = $("#form").serialize();
$.ajax({
url:"/insert",
type:"post",
data:data,
dataType:"json",
success:function (data) {
if (data.code === 0){
alert("添加失败!");
location.href="/getInsert";
} else {
alert("添加成功!");
location.href="/getAll"
}
}
});
}
</script>
</html>
product_show.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>首页</title>
<!--jquery.js bootstarp.js css -->
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.js" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
<script type="text/javascript" src="/static/js/bootstrap-datetimepicker.js" charset="UTF-8"></script>
<!--<link rel="stylesheet" type="text/css" href="/static/css/bootstrap.css">-->
</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<h2 class="text-info text-center">
欢迎来到首页
</h2>
<div class="row clearfix">
<div class="col-md-4 column">
<form class="form-horizontal" role="form">
<div class="form-group">
<label for="pname" class="col-sm-2 control-label">商品名称</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pname" placeholder="请输入搜索信息"/>
</div>
</div>
</form>
</div>
<div class="col-md-4 column">
<button type="button" class="btn btn-info btn-default" onclick="searchData()">查询</button>
</div>
<div class="col-md-4 column">
<button type="button" class="btn btn-default btn-success" onclick="location.href='/getInsert'">添加商品</button>
</div>
</div>
<table class="table table-hover table-bordered">
<thead>
<tr>
<th>
编号
</th>
<th>
产品名称
</th>
<th>
市场价
</th>
<th>
超市售价
</th>
<th>
商品图片
</th>
<th>
上架时间
</th>
<th>
商品描述
</th>
<th>
操作
</th>
</tr>
</thead>
<tbody id="content">
</tbody>
</table>
<div style="text-align: center">
<ul class="pagination pagination-lg" id="pagination">
</ul>
</div>
</div>
</div>
</div>
</body>
<script type="text/javascript">
var currentPage = 1;
var totalPage = 1;
$(function () {
//页面加载完毕
loadData();
});
function loadData() {
var pname = $("#pname").val().trim();
$.ajax({
url:"/list",
type:"get",
data:{"currentPage":currentPage,"pname":pname},
success:function (data) {
totalPage = data.pages;
currentPage = data.pageNum;
//展示商品
showProduct(data);
//显示页码
showPages(data);
}
});
}
function searchData() {
var pname = $("#pname").val().trim();
$.ajax({
url:"/list",
type:"get",
data:{"currentPage":currentPage,"pname":pname},
success:function (data) {
totalPage = data.pages;
currentPage = data.pageNum;
//展示商品
showProduct(data);
//显示页码
showPages(data);
}
});
}
function showProduct(data) {
//显示商品
var productList = data.list;
//清空上一次显示
$("#content").html("");
for(var index in productList){
var product = productList[index];
var html = '<tr class="success">'+
'<td>'+product.pid+'</td>'+
'<td>'+product.pname+'</td>'+
'<td>'+product.marketPrice+'</td>'+
'<td>'+product.shopPrice+'</td>'+
'<td><img width="80px" src="'+product.pimage+'" alt="假装有图"></td>'+
'<td>'+product.pdate+'</td>'+
'<td>'+product.pdesc+'</td>'+
'<td><button type="button" class="btn btn-danger btn-sm" onclick="getUpdate('+product.pid+')">修改</button>'+
'<button type="button" class="btn btn-danger btn-sm" onclick="delProduct('+product.pid+')">删除</button></td>'+
'</tr>';
$("#content").append(html);
}
}
function showPages() {
//显示页码
var $pagination = $("#pagination");
//清空导航条内容
$pagination.html("");
$pagination.append(
'<li class="'+(currentPage==1?"disabled":"")+'">'+
'<a href="javascript:void(0)" onclick="prePage('+(currentPage-1)+')" aria-label="上一页">'+
'<span aria-hidden="true">«</span>'+
'</a></li>'
);
for (var index = currentPage - 1;index <= currentPage + 1;index++){
if (0 < index && index < totalPage+1){
$pagination.append('<li class="'+(currentPage==index?"active":"")+'"><a href="javascript:void(0)" onclick="indexPage('+index+')">'+index+'</a></li>')
}
}
$pagination.append(
'<li class="'+(currentPage==totalPage?"disabled":"")+'">'+
'<a href="javascript:void(0)" onclick="nextPage('+(currentPage+1)+')" aria-label="下一页">'+
'<span aria-hidden="true">»</span>'+
'</a></li>'
);
}
function prePage() {
if (currentPage <= 1){
alert("已经是第一页了!")
} else{
currentPage-=1;
loadData();
}
}
function nextPage() {
if (currentPage >= totalPage){
alert("已经是最后一页了!")
} else{
currentPage+=1;
loadData();
}
}
function indexPage(index) {
if (index < 1 || index >totalPage){
alert("页码不合理!")
} else{
currentPage = index;
loadData();
}
}
function delProduct(pid) {
$.ajax({
url:"/delete",
type:"post",
data:{"pid":pid},
dataType:"json",
success:function (data) {
if (data.code === 0){
alert("删除失败!");
location.href="/getAll";
} else {
alert("删除成功!");
location.href="/getAll";
}
}
});
}
function getUpdate(pid) {
location.href="/getUpdate?pid="+pid;
}
</script>
</html>
product_update.html
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改</title>
<script type="text/javascript" src="/static/js/jquery-1.11.0.js"></script>
<script type="text/javascript" src="/static/js/bootstrap.js" ></script>
<link href="https://cdn.bootcss.com/twitter-bootstrap/3.0.1/css/bootstrap.css" rel="stylesheet">
</head>
<body>
<div class="container">
<div class="row clearfix">
<div class="col-md-12 column">
<h3 class="text-success" style="text-align: center">
修改商品
</h3>
<form class="form-horizontal" role="form" id="form">
<input type="hidden" class="form-control" id="pid" name="pid"/>
<div class="form-group">
<label for="pname" class="col-sm-2 control-label">商品名称</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pname" name="pname"/>
</div>
</div>
<div class="form-group">
<label for="marketPrice" class="col-sm-2 control-label">市场价</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="marketPrice" name="marketPrice"/>
</div>
</div>
<div class="form-group">
<label for="shopPrice" class="col-sm-2 control-label">超市售价</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="shopPrice" name="shopPrice" />
</div>
</div>
<div class="form-group">
<label for="pimage" class="col-sm-2 control-label">图片</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pimage" name="pimage"/>
</div>
</div>
<div class="form-group">
<label for="pdate" class="col-sm-2 control-label">上架日期</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pdate" name="pdate"/>
<span style="color: red">yyyy-MM-dd HH:mm:ss</span>
</div>
</div>
<div class="form-group">
<label for="pdesc" class="col-sm-2 control-label">商品描述</label>
<div class="col-sm-10">
<input type="text" class="form-control" id="pdesc" name="pdesc"/>
</div>
</div>
<div class="form-group">
<div class="col-sm-offset-2 col-sm-10">
<button type="button" class="btn btn-default" onclick="update()">修改</button>
<button type="button" onclick="history.back();" class="btn btn-success">返回</button>
</div>
</div>
</form>
</div>
</div>
</div>
</body>
<script type="text/javascript">
$(function () {
$.ajax({
url:"/getProduct",
type:"get",
dataType:"json",
success:function (data) {
$("#pid").val(data.pid);
$("#pname").val(data.pname);
$("#marketPrice").val(data.marketPrice);
$("#shopPrice").val(data.shopPrice);
$("#pimage").val(data.pimage);
$("#pdate").val(data.pdate);
$("#pdesc").val(data.pdesc);
}
});
});
function update() {
var data = $("#form").serialize();
var pid = $("#pid").val();
$.ajax({
url:"/update",
type:"post",
data:data,
dataType:"json",
success:function (data) {
if (data.code === 0){
alert("修改失败!");
location.href="/getUpdate?pid="+pid;
} else {
alert("修改成功!");
location.href="/getAll";
}
}
});
}
</script>
</html>
WEB-INF-web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mapper.xml,
classpath:applicationContext-service.xml,
classpath:applicationContxt-shiro.xml
</param-value>
</context-param>
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<filter>
<filter-name>shiroFilter</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>targetFilterLifecycle</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>shiroFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>ds</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>ds</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
pom.xml
<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.dong</groupId>
<artifactId>ReviewSSM</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<properties>
<!-- 版本号 -->
<spring.version>4.3.25.RELEASE</spring.version>
<shiro.version>1.2.2</shiro.version>
</properties>
<dependencies>
<!-- ioc/di -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-beans</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-expression</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring-aop -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aop</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>aopalliance</groupId>
<artifactId>aopalliance</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.aspectj</groupId>
<artifactId>aspectjweaver</artifactId>
<version>1.8.10</version>
</dependency>
<dependency>
<groupId>cglib</groupId>
<artifactId>cglib</artifactId>
<version>3.2.4</version>
</dependency>
<!--spring tx-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>${spring.version}</version>
</dependency>
<!--web项目-->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!-- spring 整合web项目 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- springmvc -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- json -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.9</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>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.48</version>
</dependency>
<dependency>
<groupId>c3p0</groupId>
<artifactId>c3p0</artifactId>
<version>0.9.1.2</version>
</dependency>
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis</artifactId>
<version>3.4.5</version>
</dependency>
<!-- 缓存 -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-ehcache</artifactId>
<version>1.0.0</version>
</dependency>
<dependency>
<groupId>net.sf.ehcache</groupId>
<artifactId>ehcache-core</artifactId>
<version>2.6.5</version>
</dependency>
<dependency>
<groupId>com.github.pagehelper</groupId>
<artifactId>pagehelper</artifactId>
<version>5.1.3</version>
</dependency>
<!-- mybatis整合spring -->
<dependency>
<groupId>org.mybatis</groupId>
<artifactId>mybatis-spring</artifactId>
<version>1.3.2</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.4.1.Final</version>
</dependency>
<!-- lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.10</version>
</dependency>
<!-- shiro相关依赖 -->
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-core</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-web</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-ehcache</artifactId>
<version>${shiro.version}</version>
</dependency>
<dependency>
<groupId>org.apache.shiro</groupId>
<artifactId>shiro-spring</artifactId>
<version>${shiro.version}</version>
</dependency>
<!-- Junit4-test -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
</dependencies>
<build>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.*</include>
</includes>
</resource>
</resources>
</build>
</project>