Maven+Spring+Hibernate+Shiro+Mysql简单的demo框架(一)

相关的maven的 pom.xml

  1 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  2   xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
  3   <modelVersion>4.0.0</modelVersion>
  4   <groupId>cn.com.cisec.vcs</groupId>
  5   <artifactId>VCS</artifactId>
  6   <packaging>war</packaging>
  7   <version>0.0.1-SNAPSHOT</version>
  8   <name>VCS Maven Webapp</name>
  9   <url>http://maven.apache.org</url>
 10   <dependencies>
 11     <dependency>  
 12         <groupId>org.apache.maven.plugins</groupId>  
 13         <artifactId>maven-resources-plugin</artifactId>  
 14         <version>2.6</version>  
 15     </dependency> 
 16     <dependency>
 17       <groupId>junit</groupId>
 18       <artifactId>junit</artifactId>
 19       <version>3.8.1</version>
 20       <scope>test</scope>
 21     </dependency>
 22       <!-- SpringMVC核心jar -->
 23      <dependency>
 24             <groupId>org.springframework</groupId>
 25             <artifactId>spring-context</artifactId>
 26             <version>4.0.2.RELEASE</version>
 27         </dependency>
 28         <dependency>
 29             <groupId>org.springframework</groupId>
 30             <artifactId>spring-tx</artifactId>
 31             <version>4.0.2.RELEASE</version>
 32         </dependency>
 33         <dependency>
 34             <groupId>org.springframework</groupId>
 35             <artifactId>spring-webmvc</artifactId>
 36             <version>4.0.2.RELEASE</version>
 37         </dependency>
 38         <dependency>
 39             <groupId>org.springframework</groupId>
 40             <artifactId>spring-core</artifactId>
 41             <version>4.0.2.RELEASE</version>
 42         </dependency>
 43         <dependency>
 44             <groupId>org.springframework</groupId>
 45             <artifactId>spring-web</artifactId>
 46             <version>4.0.2.RELEASE</version>
 47         </dependency>
 48         <dependency>
 49             <groupId>org.springframework</groupId>
 50             <artifactId>spring-orm</artifactId>
 51             <version>4.0.2.RELEASE</version>
 52         </dependency>
 53         <dependency>
 54             <groupId>org.springframework.security</groupId>
 55             <artifactId>spring-security-core</artifactId>
 56             <version>3.2.1.RELEASE</version>
 57         </dependency>
 58         <dependency>
 59             <groupId>org.springframework.security</groupId>
 60             <artifactId>spring-security-web</artifactId>
 61             <version>3.2.1.RELEASE</version>
 62         </dependency>
 63         <dependency>
 64             <groupId>org.springframework.security</groupId>
 65             <artifactId>spring-security-config</artifactId>
 66             <version>3.2.1.RELEASE</version>
 67         </dependency>
 68         <dependency>
 69             <groupId>org.springframework.security</groupId>
 70             <artifactId>spring-security-taglibs</artifactId>
 71             <version>3.2.1.RELEASE</version>
 72         </dependency>
 73         <dependency>
 74             <groupId>org.springframework</groupId>
 75             <artifactId>spring-aspects</artifactId>
 76             <version>4.0.2.RELEASE</version>
 77       </dependency>
 78       <dependency>
 79             <groupId>org.springframework</groupId>
 80             <artifactId>spring-beans</artifactId>
 81             <version>4.0.2.RELEASE</version>
 82         </dependency>
 83          <dependency>
 84             <groupId>org.springframework</groupId>
 85             <artifactId>spring-context-support</artifactId>
 86             <version>4.0.2.RELEASE</version>
 87         </dependency>
 88         <dependency>
 89             <groupId>org.springframework</groupId>
 90             <artifactId>spring-expression</artifactId>
 91             <version>4.0.2.RELEASE</version>
 92         </dependency>
 93         <dependency>
 94             <groupId>org.springframework</groupId>
 95             <artifactId>spring-jdbc</artifactId>
 96             <version>4.0.2.RELEASE</version>
 97         </dependency>
 98         <dependency>
 99             <groupId>org.springframework</groupId>
100             <artifactId>spring-test</artifactId>
101             <version>4.0.2.RELEASE</version>
102             <scope>test</scope>
103         </dependency>
104         <!-- ************************************ -->
105         <dependency>
106             <groupId>org.codehaus.jackson</groupId>
107             <artifactId>jackson-mapper-asl</artifactId>
108             <version>1.9.13</version>
109         </dependency>
110         <dependency>
111             <groupId>org.aspectj</groupId>
112             <artifactId>aspectjrt</artifactId>
113             <version>1.7.4</version>
114         </dependency>
115         <dependency>
116             <groupId>org.aspectj</groupId>
117             <artifactId>aspectjtools</artifactId>
118             <version>1.7.4</version>
119         </dependency>
120         <!-- Hibernate相关jar -->
121         <dependency>
122             <groupId>fr.inria.powerapi.sensor</groupId>
123             <artifactId>sensor-sigar</artifactId>
124             <version>1.5</version>
125         </dependency>
126         <dependency>
127             <groupId>net.sf.ehcache</groupId>
128             <artifactId>ehcache</artifactId>
129             <version>2.7.2</version>
130         </dependency>
131         <dependency>
132             <groupId>commons-dbcp</groupId>
133             <artifactId>commons-dbcp</artifactId>
134             <version>1.4</version>
135         </dependency>
136         <dependency>
137             <groupId>mysql</groupId>
138             <artifactId>mysql-connector-java</artifactId>
139             <version>5.1.26</version>
140         </dependency>
141         <!-- javax提供的annotation -->
142         <dependency>
143             <groupId>javax.inject</groupId>
144             <artifactId>javax.inject</artifactId>
145             <version>1</version>
146         </dependency>
147         <!-- **************************** -->
148     
149         <!-- hibernate验证 -->
150         <dependency>
151             <groupId>org.hibernate</groupId>
152             <artifactId>hibernate-core</artifactId>
153             <version>4.3.6.Final</version>
154         </dependency>
155         <dependency>
156             <groupId>org.hibernate.common</groupId>
157             <artifactId>hibernate-commons-annotations</artifactId>
158             <version>4.0.5.Final</version>
159         </dependency>
160         <dependency>
161             <groupId>org.hibernate</groupId>
162             <artifactId>hibernate-entitymanager</artifactId>
163             <version>4.3.6.Final</version>
164         </dependency>
165         <dependency>
166             <groupId>org.hibernate.javax.persistence</groupId>
167             <artifactId>hibernate-jpa-2.1-api</artifactId>
168             <version>1.0.0.Final</version>
169         </dependency>
170         <dependency>
171             <groupId>org.hibernate</groupId>
172             <artifactId>hibernate-ehcache</artifactId>
173             <version>4.3.6.Final</version>
174         </dependency>
175         <dependency>
176             <groupId>org.hibernate</groupId>
177             <artifactId>hibernate-validator</artifactId>
178             <version>5.1.2.Final</version>
179         </dependency>
180         <dependency>
181             <groupId>com.mchange</groupId>
182             <artifactId>c3p0</artifactId>
183             <version>0.9.5-pre8</version>
184         </dependency>
185         <!-- 提供对c标签的支持 -->
186         <dependency>
187             <groupId>javax.servlet</groupId>
188             <artifactId>jstl</artifactId>
189             <version>1.2</version>
190         </dependency>
191         <!-- servlet api -->
192         <dependency>
193             <groupId>javax.servlet</groupId>
194             <artifactId>servlet-api</artifactId>
195             <version>2.5</version>
196             <scope>provided</scope>
197         </dependency>
198         <dependency>
199             <groupId>org.apache.httpcomponents</groupId>
200             <artifactId>httpclient</artifactId>
201             <version>4.3.6</version>
202         </dependency>
203         <dependency>
204             <groupId>javax.servlet.jsp</groupId>
205             <artifactId>jsp-api</artifactId>
206             <version>2.1</version>
207             <scope>provided</scope>
208         </dependency>
209         <!-- json字符串的包 -->
210         <dependency>
211             <groupId>commons-collections</groupId>
212             <artifactId>commons-collections</artifactId>
213             <version>3.2.1</version>
214         </dependency>
215         <dependency>
216             <groupId>net.sf.ezmorph</groupId>
217             <artifactId>ezmorph</artifactId>
218             <version>1.0.6</version>
219         </dependency>
220         <dependency>
221             <groupId>net.sf.json-lib</groupId>
222             <artifactId>json-lib</artifactId>
223             <version>2.4</version>
224         </dependency>        
225         <!--Apache Shiro所需的jar包-->
226         <dependency>
227             <groupId>org.apache.shiro</groupId>
228             <artifactId>shiro-core</artifactId>
229             <version>1.2.3</version>
230         </dependency>
231         <dependency>
232             <groupId>org.apache.shiro</groupId>
233             <artifactId>shiro-web</artifactId>
234             <version>1.2.3</version>
235         </dependency>
236         <dependency>
237             <groupId>org.apache.shiro</groupId>
238             <artifactId>shiro-spring</artifactId>
239             <version>1.2.3</version>
240         </dependency>
241         <dependency>
242             <groupId>org.apache.shiro</groupId>
243             <artifactId>shiro-ehcache</artifactId>
244             <version>1.2.3</version>
245         </dependency>
246         <dependency>
247             <groupId>commons-io</groupId>
248             <artifactId>commons-io</artifactId>
249             <version>2.4</version>
250         </dependency>
251         <dependency>
252             <groupId>commons-beanutils</groupId>
253             <artifactId>commons-beanutils</artifactId>
254             <version>1.8.3</version>
255         </dependency>
256         <dependency>
257             <groupId>commons-fileupload</groupId>
258             <artifactId>commons-fileupload</artifactId>
259             <version>1.3.1</version>
260         </dependency>
261         <dependency>
262             <groupId>commons-lang</groupId>
263             <artifactId>commons-lang</artifactId>
264             <version>2.6</version>
265         </dependency>
266         <dependency>
267             <groupId>commons-logging</groupId>
268             <artifactId>commons-logging</artifactId>
269             <version>1.1.2</version>
270         </dependency>
271         <dependency>
272             <groupId>org.slf4j</groupId>
273             <artifactId>slf4j-log4j12</artifactId>
274             <version>1.7.5</version>
275         </dependency>
276         <dependency>
277             <groupId>asm</groupId>
278             <artifactId>asm</artifactId>
279             <version>3.3.1</version>
280         </dependency>
281         <dependency>
282             <groupId>org.aspectj</groupId >
283             <artifactId>aspectjweaver</artifactId >
284             <version> 1.6.11</version >
285         </dependency>
286         <dependency>
287             <groupId>com.google.code.gson</groupId>
288             <artifactId>gson</artifactId>
289             <version>2.2.4</version>
290         </dependency>
291   </dependencies>
292   <build>
293     <finalName>VCS</finalName>
294     <plugins>
295             <plugin>
296                 <groupId>org.apache.maven.plugins</groupId>
297                 <artifactId>maven-compiler-plugin</artifactId>
298                 <version>2.3</version>
299                 <configuration>
300                     <source>1.6</source>
301                     <target>1.6</target>
302                 </configuration>
303             </plugin>
304             <plugin>
305                 <artifactId>maven-war-plugin</artifactId>
306                 <configuration>
307                     <version>2.2</version>
308                 </configuration>
309             </plugin>
310             <plugin>
311                 <groupId>org.eclipse.jetty</groupId>
312                 <artifactId>jetty-maven-plugin</artifactId>
313                 <version>9.3.0.M1</version>
314                 <configuration>
315                     <scanIntervalSeconds>10</scanIntervalSeconds>
316                     <webApp>
317                         <contextPath>/VCS</contextPath>
318                     </webApp>
319                 </configuration>
320             </plugin>
321             <!-- <plugin> <groupId>org.apache.tomcat.maven</groupId> <artifactId>tomcat7-maven-plugin</artifactId> 
322                 <version>2.0-SNAPSHOT</version> <configuration> <url>http://localhost:8080/controlserver</url> 
323                 <server>Tomcat 7.x</server> </configuration> </plugin> -->
324         </plugins>
325   </build>
326 </project>

基础的java代码:

  1 package com.etop.basic.controller;
  2 
  3 import com.etop.utils.DateUtils;
  4 
  5 import org.apache.log4j.Logger;
  6 import org.springframework.stereotype.Controller;
  7 import org.springframework.ui.Model;
  8 import org.springframework.web.bind.WebDataBinder;
  9 import org.springframework.web.bind.annotation.ExceptionHandler;
 10 import org.springframework.web.bind.annotation.InitBinder;
 11 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 12 
 13 import javax.servlet.http.HttpServletRequest;
 14 
 15 import java.beans.PropertyEditorSupport;
 16 import java.util.Date;
 17 
 18 /**
 19  * @类名: BaseController
 20  * @描述: TODO(这里用一句话描述这个类的作用)
 21  * @作者 liuren-mail@163.com
 22  * @日期 2015年5月20日 下午3:11:32
 23  */
 24 @Controller
 25 public abstract class BaseController {
 26 
 27     public final static String ERROR = "error";
 28     public final static String SUCCESS = "success";
 29 
 30     protected Logger log = Logger.getLogger(this.getClass());
 31 
 32     /**
 33      * 添加Model消息
 34      * 
 35      * @param messages
 36      */
 37     protected void addMessage(Model model, String messages) {
 38         model.addAttribute("message", messages);
 39     }
 40 
 41     /**
 42      * 添加Model消息
 43      * 
 44      * @param type
 45      *            消息类型
 46      * @param messages
 47      */
 48     protected void addMessage(Model model, String type, String messages) {
 49         model.addAttribute("message", messages);
 50         model.addAttribute("type", type);
 51     }
 52 
 53     /**
 54      * 添加Flash消息
 55      * 
 56      * @param messages
 57      */
 58     protected void addMessage(RedirectAttributes redirectAttributes,
 59             String messages) {
 60         redirectAttributes.addFlashAttribute("message", messages);
 61     }
 62 
 63     /**
 64      * 添加Flash消息
 65      * 
 66      * @param type
 67      *            消息类型
 68      * @param messages
 69      */
 70     protected void addMessage(RedirectAttributes redirectAttributes,
 71             String type, String messages) {
 72         redirectAttributes.addFlashAttribute("message", messages);
 73         redirectAttributes.addFlashAttribute("type", type);
 74     }
 75 
 76     /**
 77      * 初始化数据绑定 1. 将所有传递进来的String进行HTML编码,防止XSS攻击 2. 将字段中Date类型转换为String类型
 78      */
 79     @InitBinder
 80     protected void initBinder(WebDataBinder binder) {
 81         // String类型转换,将所有传递进来的String进行HTML编码,防止XSS攻击
 82         binder.registerCustomEditor(String.class, new PropertyEditorSupport() {
 83             @Override
 84             public void setAsText(String text) {
 85                 // setValue(text == null ? null :
 86                 // StringEscapeUtils.escapeHtml(text.trim()));
 87                 setValue(text == null ? null : text.trim());
 88             }
 89 
 90             @Override
 91             public String getAsText() {
 92                 Object value = getValue();
 93                 return value != null ? value.toString() : "";
 94             }
 95         });
 96         // Date 类型转换
 97         binder.registerCustomEditor(Date.class, new PropertyEditorSupport() {
 98             @Override
 99             public void setAsText(String text) {
100                 setValue(DateUtils.parseDate(text));
101             }
102         });
103     }
104 
105     @ExceptionHandler(Exception.class)
106     public String handleException(Exception ex, HttpServletRequest request) {
107         log.error("系统发生异常", ex);
108         ex.printStackTrace();
109         request.setAttribute("exMsg", ex.getMessage());
110         return "errors/exception";
111     }
112 }
  1 package com.etop.basic.dao;
  2 
  3 import org.apache.log4j.Logger;
  4 import org.hibernate.Query;
  5 import org.hibernate.SQLQuery;
  6 import org.hibernate.Session;
  7 import org.hibernate.SessionFactory;
  8 import org.hibernate.StatelessSession;
  9 import org.hibernate.transform.Transformers;
 10 import org.springframework.beans.factory.annotation.Autowired;
 11 import org.springframework.dao.DataAccessException;
 12 import com.etop.utils.PageUtil;
 13 import com.etop.utils.ThreadLocalUtils;
 14 
 15 import java.io.Serializable;
 16 import java.lang.reflect.ParameterizedType;
 17 import java.math.BigInteger;
 18 import java.util.Collection;
 19 import java.util.List;
 20 import java.util.Map;
 21 import java.util.Set;
 22 
 23 /**
 24  * @类名: BaseDAO
 25  * @描述: TODO(这里用一句话描述这个类的作用)
 26  * @作者 liuren-mail@163.com
 27  * @日期 2015年5月20日 下午3:12:00
 28  * @param <T>
 29  */
 30 public class BaseDAO<T> implements Serializable {
 31 
 32     protected transient Logger log = Logger.getLogger(this.getClass());
 33     @Autowired
 34     private SessionFactory sessionFactory;
 35     private Class<T> persistentClass;
 36 
 37     protected Class<T> getCurClass() {
 38         if (persistentClass == null) {
 39             this.persistentClass = (Class<T>) ((ParameterizedType) getClass()
 40                     .getGenericSuperclass()).getActualTypeArguments()[0];
 41         }
 42         return persistentClass;
 43     }
 44 
 45     protected Session getSession() {
 46         return sessionFactory.getCurrentSession();
 47     }
 48 
 49     protected StatelessSession getStatelessSession() {
 50         return sessionFactory.openStatelessSession();
 51     }
 52 
 53     public void flush() {
 54         getSession().flush();
 55     }
 56 
 57     public void evict(T entity) {
 58         getSession().evict(entity);
 59     }
 60 
 61     public T get(long id) throws DataAccessException {
 62         log.debug("DAO:Get entity " + getCurClass().getSimpleName() + ":Id="
 63                 + id);
 64         return (T) getSession().get(getCurClass(), id);
 65     }
 66 
 67     public void save(T entity) throws DataAccessException {
 68         log.debug("DAO:Save entity " + entity.getClass().getSimpleName());
 69         getSession().save(entity);
 70     }
 71 
 72     public void update(T entity) throws DataAccessException {
 73         log.debug("DAO:Update entity " + entity.getClass().getSimpleName());
 74         getSession().clear();
 75         getSession().update(entity);
 76     }
 77 
 78     public void saveOrUpdate(T entity) throws DataAccessException {
 79         log.debug("DAO:Sava or Update entity "
 80                 + entity.getClass().getSimpleName());
 81         getSession().clear();
 82         getSession().saveOrUpdate(entity);
 83     }
 84 
 85     public void delete(T entity) throws DataAccessException {
 86         log.debug("DAO:delete entity " + getCurClass().getSimpleName());
 87         getSession().delete(entity);
 88     }
 89 
 90     public void deleteById(long id) throws DataAccessException {
 91         log.debug("DAO:delete entity " + getCurClass().getSimpleName() + ":Id="
 92                 + id);
 93         String queryString = "delete from " + getCurClass().getSimpleName()
 94                 + " where id=" + id;
 95         this.excute(queryString);
 96     }
 97 
 98     public int excute(String queryString) throws DataAccessException {
 99         log.debug("DAO:Excute HQL update :" + queryString);
100         Query query = getSession().createQuery(queryString);
101         return query.executeUpdate();
102     }
103 
104     public List<T> find(String queryString) throws DataAccessException {
105         log.debug("DAO:Running HQL query :" + queryString);
106         Query query = getSession().createQuery(queryString);
107         query.setCacheable(true);
108         return query.list();
109     }
110 
111     private Query createQuery(String queryString, Map<String, Object> params,
112             int startRow, int pageSize) {
113         Query query = getSession().createQuery(queryString);
114         if (params != null) {
115             for (Map.Entry<String, Object> entry : params.entrySet()) {
116                 String paramName = entry.getKey();
117                 Object obj = entry.getValue();
118                 log.info("DAO:set param:" + paramName + " with value:" + obj);
119                 if (obj instanceof List) {
120                     query.setParameterList(paramName, (Collection) obj);
121                 } else if (obj instanceof Object[]) {
122                     query.setParameterList(paramName, (Object[]) obj);
123                 } else {
124                     query.setParameter(paramName, obj);
125                 }
126             }
127         }
128         query.setCacheable(true);
129         if (pageSize != -1) {
130             query.setFirstResult(startRow).setMaxResults(pageSize);
131         }
132         return query;
133     }
134 
135     private Query createQuery(String queryString) {
136         return createQuery(queryString, null, 0, -1);
137     }
138 
139     private Query createQuery(String queryString, Map<String, Object> params) {
140         return createQuery(queryString, params, 0, -1);
141     }
142 
143     public List<T> find(String queryString, int startRow, int pageSize)
144             throws DataAccessException {
145         log.debug("DAO:Running HQL query by page:" + queryString);
146         Query query = createQuery(queryString, null, startRow, pageSize);
147         return query.list();
148     }
149 
150     public int getTotalCount(String queryString) throws DataAccessException {
151         return getTotalCount(queryString, null);
152     }
153 
154     public int getTotalCount(String queryString, Map<String, Object> params)
155             throws DataAccessException {
156         log.debug("DAO:Running HQL query for total count of records :"
157                 + queryString);
158         queryString = "select count(t.id) " + queryString;
159         Query query;
160         if (params != null) {
161             query = createQuery(queryString, params);
162         } else {
163             query = createQuery(queryString);
164         }
165         return ((Long) query.uniqueResult()).intValue();
166     }
167 
168     public List findWithSelect(String queryString) throws DataAccessException {
169         log.debug("DAO:Running HQL query with selections :" + queryString);
170         Query query = createQuery(queryString);
171         return query.list();
172     }
173 
174     public List findWithSelect(String queryString, Map<String, Object> params)
175             throws DataAccessException {
176         log.debug("DAO:Running HQL query with parameters:" + queryString);
177         Query query = createQuery(queryString, params);
178         return query.list();
179     }
180 
181     public List findWithSelect(String queryString, Map<String, Object> params,
182             int startRow, int pageSize) throws DataAccessException {
183         log.debug("DAO:Running HQL query by page :" + queryString);
184         Query query = createQuery(queryString, params, startRow, pageSize);
185         return query.list();
186     }
187 
188     public List<T> find(String queryString, Map<String, Object> params)
189             throws DataAccessException {
190         log.debug("DAO:Running HQL query with parameters: " + queryString);
191         Query query = createQuery(queryString, params);
192         return query.list();
193     }
194 
195     public List<T> find(String queryString, Map<String, Object> params,
196             int startRow, int pageSize) throws DataAccessException {
197         log.debug("DAO:Running HQL query with params by page :" + queryString);
198         Query query = createQuery(queryString, params, startRow, pageSize);
199         return query.list();
200     }
201 
202     public T findUniqueResult(String queryString, Map<String, Object> params)
203             throws DataAccessException {
204         log.debug("DAO:Running HQL query with parameters:" + queryString);
205         Query query = createQuery(queryString, params);
206         return (T) query.uniqueResult();
207     }
208 
209     public int excute(String queryString, Map<String, Object> params)
210             throws DataAccessException {
211         log.debug("DAO:Excute HQL update :" + queryString);
212         Query query = createQuery(queryString, params);
213         return query.executeUpdate();
214     }
215 
216     /**
217      * pagefind
218      */
219     private String initSort(String hql) {
220         log.debug("DAO:Excute HQL update :" + hql);
221         String order = ThreadLocalUtils.getOrder();
222         String sort = ThreadLocalUtils.getSort();
223         if (sort != null && !"".equals(sort.trim())) {
224             hql += " order by " + sort;
225             if (!"desc".equals(order))
226                 hql += " asc";
227             else
228                 hql += " desc";
229         }
230         return hql;
231     }
232 
233     @SuppressWarnings("rawtypes")
234     private void setAliasParameter(Query query, Map<String, Object> alias) {
235         if (alias != null) {
236             Set<String> keys = alias.keySet();
237             for (String key : keys) {
238                 Object val = alias.get(key);
239                 if (val instanceof Collection) {
240                     // 查询条件是列表
241                     query.setParameterList(key, (Collection) val);
242                 } else {
243                     query.setParameter(key, val);
244                 }
245             }
246         }
247     }
248 
249     private void setParameter(Query query, Object[] args) {
250         if (args != null && args.length > 0) {
251             int index = 0;
252             for (Object arg : args) {
253                 query.setParameter(index++, arg);
254             }
255         }
256     }
257 
258     private String getCountHql(String hql, boolean isHql) {
259         log.debug("DAO:Excute HQL update :" + hql);
260         String e = hql.substring(hql.indexOf("from"));
261         String c = "select count(*) " + e;
262         if (isHql)
263             c = c.replaceAll("fetch", "");
264         return c;
265     }
266 
267     public PageUtil<T> pagefind(String hql, Object[] args,
268             Map<String, Object> alias) {
269         log.debug("DAO:Excute HQL update :" + hql);
270         hql = initSort(hql);
271         String cq = getCountHql(hql, true);
272         Query cquery = getSession().createQuery(cq);
273         Query query = getSession().createQuery(hql);
274         // 设置别名参数
275         setAliasParameter(query, alias);
276         setAliasParameter(cquery, alias);
277         // 设置参数
278         setParameter(query, args);
279         setParameter(cquery, args);
280         PageUtil<T> pages = new PageUtil<T>();
281         setPagers(query, pages);
282         List<T> datas = query.list();
283         pages.setRows(datas);
284         long total = (Long) cquery.uniqueResult();
285         pages.setTotal(total);
286         return pages;
287     }
288 
289     public PageUtil<T> pagefind(String hql, Object[] args) {
290         log.debug("DAO:Excute HQL update :" + hql);
291         return this.pagefind(hql, args, null);
292     }
293 
294     public PageUtil<T> pagefind(String hql, Object arg) {
295         log.debug("DAO:Excute HQL update :" + hql);
296         return this.pagefind(hql, new Object[] { arg });
297     }
298 
299     public PageUtil<T> pagefind(String hql) {
300         log.debug("DAO:Excute HQL update :" + hql);
301         return this.pagefind(hql, null);
302     }
303 
304     @SuppressWarnings("rawtypes")
305     private void setPagers(Query query, PageUtil pages) {
306         Integer pageSize = ThreadLocalUtils.getPageSize();
307         Integer pageOffset = ThreadLocalUtils.getPageOffset();
308         if (pageOffset == null || pageOffset < 0)
309             pageOffset = 0;
310         if (pageSize == null || pageSize < 0)
311             pageSize = 15;
312         // pages.setOffset(pageOffset);
313         // pages.setSize(pageSize);
314         query.setFirstResult(pageOffset).setMaxResults(pageSize);
315     }
316 
317     public <N extends Object> PageUtil<N> findBySql(String sql, Object[] args,
318             Map<String, Object> alias, Class<?> clz, boolean hasEntity) {
319         sql = initSort(sql);
320         String cq = getCountHql(sql, false);
321         SQLQuery sq = getSession().createSQLQuery(sql);
322         SQLQuery cquery = getSession().createSQLQuery(cq);
323         setAliasParameter(sq, alias);
324         setAliasParameter(cquery, alias);
325         setParameter(sq, args);
326         setParameter(cquery, args);
327         PageUtil<N> pages = new PageUtil<N>();
328         // setPagers(sq, pages);
329         if (hasEntity) {
330             sq.addEntity(clz);
331         } else {
332             sq.setResultTransformer(Transformers.aliasToBean(clz));
333         }
334         List<N> datas = sq.list();
335         pages.setRows(datas);
336         long total = ((BigInteger) cquery.uniqueResult()).longValue();
337         pages.setTotal(total);
338         return pages;
339     }
340 
341     public <N extends Object> PageUtil<N> findBySql(String sql, Object[] args,
342             Class<?> clz, boolean hasEntity) {
343         return this.findBySql(sql, args, null, clz, hasEntity);
344     }
345 
346     public <N extends Object> PageUtil<N> findBySql(String sql, Object arg,
347             Class<?> clz, boolean hasEntity) {
348         return this.findBySql(sql, new Object[] { arg }, clz, hasEntity);
349     }
350 
351     public <N extends Object> PageUtil<N> findBySql(String sql, Class<?> clz,
352             boolean hasEntity) {
353         return this.findBySql(sql, null, clz, hasEntity);
354     }
355 }
  1 package com.etop.controller;
  2 
  3 import java.util.HashMap;
  4 import java.util.Map;
  5 import java.util.Set;
  6 
  7 import org.apache.log4j.Logger;
  8 import org.springframework.beans.factory.annotation.Autowired;
  9 import org.springframework.stereotype.Controller;
 10 import org.springframework.web.bind.annotation.RequestMapping;
 11 import org.springframework.web.bind.annotation.ResponseBody;
 12 
 13 import com.etop.basic.controller.BaseController;
 14 import com.etop.dto.FunctionDto;
 15 import com.etop.pojo.Function;
 16 import com.etop.pojo.Permission;
 17 import com.etop.pojo.Role;
 18 import com.etop.service.FunctionService;
 19 import com.etop.service.PermissionService;
 20 import com.etop.service.RoleService;
 21 import com.etop.utils.PageUtil;
 22 
 23 /**
 24  * @类名: FunctionController
 25  * @描述: 处理过滤网址出的控制器
 26  * @作者 liuren-mail@163.com
 27  * @日期 2015年5月27日 下午3:31:54
 28  */
 29 @Controller
 30 @RequestMapping("/function")
 31 public class FunctionController extends BaseController {
 32     Map<String,Object> map = new HashMap<String,Object>();
 33     private final static Logger log = Logger
 34             .getLogger(FunctionController.class);
 35     @Autowired
 36     private FunctionService functionService;
 37     @Autowired
 38     private PermissionService permissionService;
 39     @Autowired
 40     private RoleService roleService;
 41     @RequestMapping("/functionList.html")
 42     public String getFunctions() {
 43         log.info("/functionList.html");
 44         return "/functionList.jsp";
 45     }
 46 
 47     /**
 48      * @标题: getFunctionList
 49      * @描述: 返回分页的json数据
 50      * @参数 @return 设定文件
 51      * @返回 Object 返回类型
 52      * @throws
 53      * @作者 liuren-mail@163.com
 54      * @日期 2015年5月27日 下午3:55:12
 55      */
 56     @RequestMapping("/get_functions.html")
 57     @ResponseBody
 58     public Object getFunctionList() {
 59         log.info("/get_functions.html");
 60         PageUtil<FunctionDto> functionList = functionService.findAllFunction();
 61         return functionList;
 62     }
 63 
 64     @RequestMapping("/add.html")
 65     @ResponseBody
 66     public Object addFunction(String value,int permission_id,int role_id,String type) {
 67         log.info("/add.html");
 68         Function function = new Function();
 69         function.setPermission_id(permission_id);
 70         function.setRole_id(role_id);
 71         function.setValue(value);
 72         function.setType(type);
 73         functionService.saveFunction(function);
 74         map.put(SUCCESS, true);
 75         return map;
 76     }
 77 
 78     @RequestMapping("/edit.html")
 79     @ResponseBody
 80     public Object updateFunction(int id,String value,String type) {
 81         log.info("/edit.html");
 82         Function function = functionService.findFunctionById(id);
 83         if (function==null||"".equals(function)) {
 84             map.put(SUCCESS, false);
 85             return map;
 86         }
 87         function.setValue(value);
 88         function.setType(type);
 89         functionService.updateFunction(function);
 90         map.put(SUCCESS, true);
 91         return map;
 92     }
 93 
 94     @RequestMapping("/del.html")
 95     @ResponseBody
 96     public Object deleteFunction(int id) {
 97         log.info("/del.html");
 98         functionService.deleteFunction(id);
 99         map.put(SUCCESS, true);
100         return map;
101     }
102 }
  1 package com.etop.controller;
  2 
  3 import javax.imageio.ImageIO;
  4 import javax.servlet.ServletOutputStream;
  5 import javax.servlet.http.HttpServletRequest;
  6 import javax.servlet.http.HttpServletResponse;
  7 import javax.servlet.http.HttpSession;
  8 import javax.validation.Valid;
  9 
 10 import com.etop.basic.controller.BaseController;
 11 import com.etop.service.UserService;
 12 import com.etop.utils.VerifyCode;
 13 
 14 import org.apache.commons.lang.StringUtils;
 15 import org.apache.log4j.Logger;
 16 import org.apache.shiro.SecurityUtils;
 17 import org.apache.shiro.authc.AuthenticationException;
 18 import org.apache.shiro.authc.UsernamePasswordToken;
 19 import org.apache.shiro.web.util.WebUtils;
 20 import org.springframework.beans.factory.annotation.Autowired;
 21 import org.springframework.stereotype.Controller;
 22 import org.springframework.ui.Model;
 23 import org.springframework.validation.BindingResult;
 24 import org.springframework.web.bind.annotation.RequestMapping;
 25 import org.springframework.web.bind.annotation.RequestMethod;
 26 
 27 import com.etop.pojo.User;
 28 
 29 import org.springframework.web.servlet.mvc.support.RedirectAttributes;
 30 
 31 import java.awt.Color;
 32 import java.awt.image.BufferedImage;
 33 import java.io.IOException;
 34 import java.util.List;
 35 
 36 /**
 37  * @类名: HomeController
 38  * @描述: 处理用户登录登出的控制器
 39  * @作者 liuren-mail@163.com
 40  * @日期 2015年5月20日 下午3:11:00
 41  */
 42 @Controller
 43 public class HomeController extends BaseController {
 44     private final static Logger log = Logger.getLogger(HomeController.class);
 45     @Autowired
 46     private UserService userService;
 47 
 48     @RequestMapping(value = "/login.html", method = RequestMethod.GET, produces = "text/html; charset=utf-8")
 49     public String loginForm(Model model, String message) {
 50         if (!StringUtils.isEmpty(message))
 51             model.addAttribute(message);
 52         model.addAttribute("user", new User());
 53         System.out.println("login_1");
 54         System.out.println("model:" + model);
 55         System.out.println("message:" + message);
 56         log.info("login.html");
 57         return "/login.jsp";
 58     }
 59 
 60     @RequestMapping(value = "/login.html", method = RequestMethod.POST, produces = "text/html; charset=utf-8")
 61     public String login(@Valid User user, BindingResult bindingResult,
 62             Model model, RedirectAttributes attr, HttpServletRequest request) {
 63         HttpSession session = request.getSession();
 64         // session为空时跳转到登录界面
 65         if (session.getAttribute(VerifyCode.VERIFY_TYPE_COMMENT) == null
 66                 || session.getAttribute(VerifyCode.VERIFY_TYPE_COMMENT) == "") {
 67             addMessage(attr, "session为空");
 68             log.info("session为空");
 69             return "redirect:/";
 70         }
 71         String code = ((String) request.getSession().getAttribute(
 72                 VerifyCode.VERIFY_TYPE_COMMENT)).toLowerCase();
 73         String submitCode = WebUtils.getCleanParam(request, "checkcode");
 74         if (StringUtils.isEmpty(code) || StringUtils.isEmpty(submitCode)
 75                 || !StringUtils.equals(code, submitCode.toLowerCase())) {
 76             addMessage(attr, "验证码错误");
 77             log.info("验证码错误");
 78             return "redirect:/";
 79         }
 80         try {
 81             if (bindingResult.hasErrors() || user.getUsername().isEmpty()
 82                     || user.getPassword().isEmpty()) {
 83                 addMessage(attr, "用户名或密码错误");
 84                 log.info("用户名或密码错误");
 85                 return "redirect:/login.html";
 86             }
 87             System.out.println("管理用户登录");
 88             // 使用shiro管理登录
 89             SecurityUtils.getSubject().login(
 90                     new UsernamePasswordToken(user.getUsername(), user
 91                             .getPassword()));
 92             // 获取所有用户信息,权限由前端shiro标签控制
 93             List<User> userList = userService.getAllUser();
 94             System.out.println(userList);
 95             model.addAttribute("userList", userList);
 96             System.out.println("管理用户登录success");
 97             log.info("成功登录");
 98             System.out.println("密码:======================"+user.getPassword());
 99             return "/user.jsp";
100         } catch (AuthenticationException e) {
101             addMessage(attr, "用户名或密码错误");
102             log.info("用户名或密码错误");
103             return "redirect:/login.html";
104         }
105     }
106 
107     @RequestMapping(value = "/logout.html", method = RequestMethod.GET)
108     public String logout(RedirectAttributes attr) {
109         // 使用权限管理工具进行用户的退出,注销登录
110         SecurityUtils.getSubject().logout();
111         addMessage(attr, "您已安全退出");
112         log.info("安全退出");
113         return "redirect:/login.html";
114     }
115 
116     @RequestMapping("/403.html")
117     public String unauthorizedRole() {
118         log.info("跳转到403页面");
119         return "/403.jsp";
120     }
121 
122     @RequestMapping("/verifyCode.html")
123     public void verifyCode(HttpServletRequest request,
124             HttpServletResponse response) throws IOException {
125         response.setHeader("Pragma", "no-cache");
126         response.setHeader("Cache-Control", "no-cache");
127         response.setDateHeader("Expires", 0);
128         // 生成验证码,写入用户session
129         String verifyCode = VerifyCode.generateTextCode(
130                 VerifyCode.TYPE_NUM_UPPER, 4, "null");
131         request.getSession().setAttribute(VerifyCode.VERIFY_TYPE_COMMENT,
132                 verifyCode);
133         System.out.println("verifyCode=" + verifyCode);
134         // 输出验证码给客户端
135         response.setContentType("image/jpeg");
136         /*
137          * textCode 文本验证码 width 图片宽度 height 图片高度 interLine 图片中干扰线的条数
138          * randomLocation 每个字符的高低位置是否随机 backColor 图片颜色,若为null,则采用随机颜色 f
139          * oreColor字体颜色,若为null,则采用随机颜色 lineColor 干扰线颜色,若为null,则采用随机颜色
140          */
141         BufferedImage bim = VerifyCode.generateImageCode(verifyCode, 65, 22, 8,
142                 true, Color.WHITE, Color.BLACK, null);
143         ServletOutputStream out = response.getOutputStream();
144         ImageIO.write(bim, "JPEG", out);
145         log.info("验证码已经生成并存入session中");
146         try {
147             out.flush();
148             log.info("刷新验证码图片");
149         } finally {
150             out.close();
151             log.info("关闭验证码流");
152         }
153     }
154 }
  1 package com.etop.controller;
  2 
  3 import java.util.HashMap;
  4 import java.util.Map;
  5 
  6 import org.apache.log4j.Logger;
  7 import org.springframework.beans.factory.annotation.Autowired;
  8 import org.springframework.stereotype.Controller;
  9 import org.springframework.web.bind.annotation.RequestMapping;
 10 import org.springframework.web.bind.annotation.ResponseBody;
 11 
 12 
 13 
 14 import com.etop.basic.controller.BaseController;
 15 import com.etop.dto.PermissionDto;
 16 import com.etop.pojo.Permission;
 17 import com.etop.service.PermissionService;
 18 import com.etop.utils.PageUtil;
 19 
 20 /**
 21  * @类名: PermissionController
 22  * @描述: 处理用户权限的控制器
 23  * @作者 liuren-mail@163.com
 24  * @日期 2015年5月27日 下午3:28:09
 25  */
 26 @Controller
 27 @RequestMapping("/permission")
 28 public class PermissionController extends BaseController {
 29     Map<String,Object> map = new HashMap<String,Object>();
 30     private final static Logger log = Logger
 31             .getLogger(PermissionController.class);
 32     @Autowired
 33     private PermissionService permissionService;
 34 
 35     @RequestMapping("/permissonList.html")
 36     public String getPermissons() {
 37         log.info("/permissionList.html");
 38         return "/permissonList.jsp";
 39     }
 40 
 41     /**
 42      * @标题: getPermissionList
 43      * @描述: 返回分页的json数据
 44      * @参数 @return 设定文件
 45      * @返回 Object 返回类型
 46      * @throws
 47      * @作者 liuren-mail@163.com
 48      * @日期 2015年5月27日 下午3:33:27
 49      */
 50     @RequestMapping("/get_permissions.html")
 51     @ResponseBody
 52     public Object getPermissionList() {
 53         log.info("/get_permission.html");
 54         PageUtil<PermissionDto> permissionList = permissionService
 55                 .findAllPermisson();
 56         return permissionList;
 57     }
 58 
 59     @RequestMapping("/add.html")
 60     @ResponseBody
 61     public Object addPermission(String permissionname) {
 62         log.info("/add.html");
 63         if (permissionname==null||"".equals(permissionname)) {
 64             map.put("success", false);
 65             return map;
 66         }
 67         Permission permission = new Permission();
 68         permission.setPermissionname(permissionname);
 69         permissionService.savePermission(permission);
 70         map.put("success", true);
 71         return map;
 72     }
 73 
 74     @RequestMapping("/edit.html")
 75     @ResponseBody
 76     public Object updatePermission(int id,String permissionname) {
 77         log.info("/edit.html");
 78         Permission permission =permissionService.findPermissionById(id);
 79         if (permission==null||"".equals(permission)) {
 80             map.put("success", false);
 81         }
 82         permission.setPermissionname(permissionname);
 83         permissionService.updatePermission(permission);
 84         map.put("success", true);
 85         return map;
 86     }
 87 
 88     @RequestMapping("/del.html")
 89     @ResponseBody
 90     public Object deletePermission(int id) {
 91         log.info("/del.html");
 92         Permission permission = permissionService.findPermissionById(id);
 93         if (permission==null||"".equals(permission)) {
 94             map.put("success", false);
 95             return map;
 96         }
 97         permissionService.deletePermission(id);
 98         map.put("success", true);
 99         return map;
100     }
101 }
  1 package com.etop.controller;
  2 
  3 import java.util.HashMap;
  4 import java.util.Map;
  5 
  6 import org.apache.log4j.Logger;
  7 import org.springframework.beans.factory.annotation.Autowired;
  8 import org.springframework.stereotype.Controller;
  9 import org.springframework.web.bind.annotation.RequestMapping;
 10 import org.springframework.web.bind.annotation.ResponseBody;
 11 
 12 import com.etop.basic.controller.BaseController;
 13 import com.etop.dto.RoleDto;
 14 import com.etop.pojo.Role;
 15 import com.etop.service.RoleService;
 16 import com.etop.utils.PageUtil;
 17 
 18 /**
 19  * @类名: RoleController
 20  * @描述: 处理角色操作的控制器
 21  * @作者 liuren-mail@163.com
 22  * @日期 2015年5月26日 下午6:09:03
 23  */
 24 @Controller
 25 @RequestMapping("/role")
 26 public class RoleController extends BaseController {
 27     Map<String,Object> map = new HashMap<String,Object>();
 28     private final static Logger log = Logger.getLogger(RoleController.class);
 29     @Autowired
 30     private RoleService roleService;
 31 
 32     @RequestMapping("/roleList.html")
 33     public String getRoles() {
 34         log.info("/roleList.html");
 35         return "/roleList.jsp";
 36     }
 37 
 38     /**
 39      * @标题: getRoleList
 40      * @描述: 返回json数据
 41      * @参数 @return 设定文件
 42      * @返回 Object 返回类型
 43      * @throws
 44      * @作者 liuren-mail@163.com
 45      * @日期 2015年5月27日 下午3:56:39
 46      */
 47     @RequestMapping("/get_roles.html")
 48     @ResponseBody
 49     public Object getRoleList() {
 50         log.info("/get_roles.html");
 51         PageUtil<RoleDto> roleList = roleService.findAllRole();
 52         return roleList;
 53     }
 54 
 55     @RequestMapping("/add.html")
 56     @ResponseBody
 57     public Object addRole(String rolename,String description) {
 58         log.info("/add.html");
 59         Role role = new Role();
 60         if (rolename==null||description==null||"".equals(rolename)||"".equals(description)) {
 61             map.put("success", false);
 62             return map;
 63         }
 64         role.setRolename(rolename);
 65         role.setDescription(description);
 66         roleService.saveRole(role);
 67         map.put("success", true);
 68         return map;
 69     }
 70 
 71     @RequestMapping("/edit.html")
 72     @ResponseBody
 73     public Object updateRole(int id,String rolename,String description) {
 74         log.info("/edit.html");
 75         Role role = roleService.findById(id);
 76         if (role==null||"".equals(role)) {
 77             map.put("success", false);
 78         }
 79         role.setRolename(rolename);
 80         role.setDescription(description);
 81         roleService.updateRole(role);
 82         map.put("success", true);
 83         return map;
 84     }
 85 
 86     @RequestMapping("/del.html")
 87     @ResponseBody
 88     public Object deleteRole(int id) {
 89         log.info("/del.html");
 90         roleService.deleteRole(id);
 91         map.put("success", true);
 92         return map;
 93     }
 94 
 95     @RequestMapping("/roleTest.html")
 96     public String testRole() {
 97         log.info("roleTest.html");
 98         return "/success.jsp";
 99     }
100 }
  1 package com.etop.controller;
  2 
  3 import java.util.HashMap;
  4 import java.util.Map;
  5 
  6 import org.apache.log4j.Logger;
  7 import org.springframework.beans.factory.annotation.Autowired;
  8 import org.springframework.stereotype.Controller;
  9 import org.springframework.web.bind.annotation.RequestMapping;
 10 import org.springframework.web.bind.annotation.ResponseBody;
 11 
 12 import com.etop.basic.controller.BaseController;
 13 import com.etop.dto.UserDto;
 14 import com.etop.pojo.User;
 15 import com.etop.service.UserService;
 16 import com.etop.utils.MD5Utils;
 17 import com.etop.utils.PageUtil;
 18 
 19 /**
 20  * @类名: UserController
 21  * @描述: 处理用户操作的控制器
 22  * @作者 liuren-mail@163.com
 23  * @日期 2015年5月20日 下午3:10:19
 24  */
 25 @Controller
 26 @RequestMapping("/user")
 27 public class UserController extends BaseController {
 28     Map<String, Object> map = new HashMap<String, Object>();
 29     private final static Logger log = Logger.getLogger(UserController.class);
 30     private UserService userService;
 31 
 32     @Autowired
 33     public void setUserService(UserService userService) {
 34         this.userService = userService;
 35     }
 36 
 37     // add,edit,del页面并没有写具体逻辑,要验证是否成功,需要观察控制台输出。
 38     @RequestMapping(value = "/get_users.html")
 39     @ResponseBody
 40     public Object getUsers() {
 41         log.info("/get_users.html");
 42         PageUtil<UserDto> pageList = userService.findAllUser();
 43         return pageList;
 44     }
 45 
 46     @RequestMapping("/userList.html")
 47     public String userList() {
 48         log.info("/userList.html");
 49         return "/userList.jsp";
 50     }
 51 
 52     @RequestMapping("/add.html")
 53     @ResponseBody
 54     public Object addUser(String username, String password) {
 55         log.info("/add.html");
 56         MD5Utils MD5 = new MD5Utils();
 57         User user = new User();
 58         if (username == null || password == null || "".equals(username)
 59                 || "".equals(password)) {
 60             map.put("success", false);
 61         }
 62         String md5_password = MD5.GetMD5Code(password);
 63         user.setUsername(username);
 64         user.setPassword(md5_password);
 65         userService.saveUser(user);
 66         map.put("success", true);
 67         return map;
 68     }
 69 
 70     @RequestMapping("/edit.html")
 71     @ResponseBody
 72     public Object updateUser(int id, String username, String password) {
 73         log.info("/edit.html");
 74         MD5Utils MD5 = new MD5Utils();
 75         User user = userService.findById(id);
 76         if (user == null || "".equals(user)) {
 77             map.put("success", false);
 78             return map;
 79         }
 80         String md5_password = MD5.GetMD5Code(password);
 81         user.setUsername(username);
 82         user.setPassword(md5_password);
 83         userService.updateUser(user);
 84         map.put("success", true);
 85         System.out.println("=========================================>要修改的id为:"
 86                 + id);
 87         return map;
 88     }
 89 
 90     @ResponseBody
 91     @RequestMapping(value = "/del.html")
 92     public Object deleteUser(int id) {
 93         log.info("/del.html");
 94         userService.deleteUser(id);
 95         map.put("success", true);
 96         System.out.println("=========================================>要删除的id为:"
 97                 + id);
 98         return map;
 99     }
100 }

项目的dao层:

 1 package com.etop.dao;
 2 
 3 import com.etop.basic.dao.BaseDAO;
 4 import com.etop.pojo.Function;
 5 
 6 import org.springframework.stereotype.Repository;
 7 
 8 /**
 9  * @类名: FunctionDAO
10  * @描述: TODO(这里用一句话描述这个类的作用)
11  * @作者 liuren-mail@163.com
12  * @日期 2015年5月20日 下午3:01:38
13  */
14 @SuppressWarnings("serial")
15 @Repository("FunctionDAO")
16 public class FunctionDAO extends BaseDAO<Function> {
17 }
 1 package com.etop.dao;
 2 
 3 import com.etop.basic.dao.BaseDAO;
 4 import com.etop.pojo.Permission;
 5 
 6 import org.springframework.stereotype.Repository;
 7 
 8 /**
 9  * @类名: PermissionDAO 
10  * @描述: TODO(这里用一句话描述这个类的作用) 
11  * @作者 liuren-mail@163.com
12  * @日期 2015年5月20日 下午3:04:50
13  */
14 @SuppressWarnings("serial")
15 @Repository("PermissionDAO")
16 public class PermissionDAO extends BaseDAO<Permission> {
17 }
 1 package com.etop.dao;
 2 
 3 import com.etop.basic.dao.BaseDAO;
 4 import com.etop.pojo.Role;
 5 
 6 import org.springframework.stereotype.Repository;
 7 
 8 /**
 9  * @类名: RoleDAO
10  * @描述: TODO(这里用一句话描述这个类的作用)
11  * @作者 liuren-mail@163.com
12  * @日期 2015年5月20日 下午3:05:28
13  */
14 @SuppressWarnings("serial")
15 @Repository("RoleDAO")
16 public class RoleDAO extends BaseDAO<Role> {
17 }
 1 package com.etop.dao;
 2 
 3 import com.etop.basic.dao.BaseDAO;
 4 import com.etop.pojo.User;
 5 
 6 import org.springframework.stereotype.Repository;
 7 
 8 /**
 9  * @类名: UserDAO
10  * @描述: TODO(这里用一句话描述这个类的作用)
11  * @作者 liuren-mail@163.com
12  * @日期 2015年5月20日 下午3:05:41
13  */
14 @SuppressWarnings("serial")
15 @Repository("UserDAO")
16 public class UserDAO extends BaseDAO<User> {
17 }

项目的DTO层:

 1 package com.etop.dto;
 2 
 3 public class FunctionDto {
 4 
 5     private Integer id;
 6     private String value;
 7     private Integer permission_id;
 8     private Integer role_id;
 9     private String type;
10 
11     public Integer getId() {
12         return id;
13     }
14 
15     public void setId(Integer id) {
16         this.id = id;
17     }
18 
19     public String getValue() {
20         return value;
21     }
22 
23     public void setValue(String value) {
24         this.value = value;
25     }
26 
27     public Integer getPermission_id() {
28         return permission_id;
29     }
30 
31     public void setPermission_id(Integer permission_id) {
32         this.permission_id = permission_id;
33     }
34 
35     public Integer getRole_id() {
36         return role_id;
37     }
38 
39     public void setRole_id(Integer role_id) {
40         this.role_id = role_id;
41     }
42 
43     public String getType() {
44         return type;
45     }
46 
47     public void setType(String type) {
48         this.type = type;
49     }
50 
51 }
 1 package com.etop.dto;
 2 
 3 public class PermissionDto {
 4 
 5     private Integer id;
 6     private String permissionname;
 7     private String role;
 8     public Integer getId() {
 9         return id;
10     }
11     public void setId(Integer id) {
12         this.id = id;
13     }
14     public String getPermissionname() {
15         return permissionname;
16     }
17     public void setPermissionname(String permissionname) {
18         this.permissionname = permissionname;
19     }
20     public String getRole() {
21         return role;
22     }
23     public void setRole(String role) {
24         this.role = role;
25     }
26     
27     
28 }
 1 package com.etop.dto;
 2 
 3 public class RoleDto {
 4 
 5     private Integer id;
 6     private String rolename;
 7     private String description;
 8     private String permissionList;
 9     private String userList;
10 
11     public Integer getId() {
12         return id;
13     }
14 
15     public void setId(Integer id) {
16         this.id = id;
17     }
18 
19     public String getRolename() {
20         return rolename;
21     }
22 
23     public void setRolename(String rolename) {
24         this.rolename = rolename;
25     }
26 
27     public String getDescription() {
28         return description;
29     }
30 
31     public void setDescription(String description) {
32         this.description = description;
33     }
34 
35     public String getPermissionList() {
36         return permissionList;
37     }
38 
39     public void setPermissionList(String permissionList) {
40         this.permissionList = permissionList;
41     }
42 
43     public String getUserList() {
44         return userList;
45     }
46 
47     public void setUserList(String userList) {
48         this.userList = userList;
49     }
50 
51 }
 1 package com.etop.dto;
 2 
 3 public class UserDto {
 4 
 5     private Integer id;
 6     private String username;
 7     private String password;
 8     private String roleList;
 9 
10     public Integer getId() {
11         return id;
12     }
13 
14     public void setId(Integer id) {
15         this.id = id;
16     }
17 
18     public String getUsername() {
19         return username;
20     }
21 
22     public void setUsername(String username) {
23         this.username = username;
24     }
25 
26     public String getPassword() {
27         return password;
28     }
29 
30     public void setPassword(String password) {
31         this.password = password;
32     }
33 
34     public String getRoleList() {
35         return roleList;
36     }
37 
38     public void setRoleList(String roleList) {
39         this.roleList = roleList;
40     }
41 
42 }

项目的model层

  1 package com.etop.pojo;
  2 
  3 import javax.persistence.*;
  4 
  5 import java.io.Serializable;
  6 
  7 /**
  8  * @类名: Function
  9  * @描述: 网页过滤信息类,保存网页过滤信息,以及对应的权限(一对一)或角色(一对一)
 10  * @作者 liuren-mail@163.com
 11  * @日期 2015年5月20日 下午3:07:03
 12  */
 13 @SuppressWarnings("serial")
 14 @Entity
 15 @Table(name = "t_function")
 16 public class Function implements Serializable {
 17     /**
 18      * 这个是id
 19      */
 20     private Integer id;
 21     /**
 22      * 这个是过滤的url
 23      */
 24     private String value;
 25 //    private Permission permission;
 26 //    private Role role;
 27     private int permission_id;
 28     private int role_id;
 29     private String type;
 30 
 31     public Function() {
 32         super();
 33     }
 34 
 35 //    public Function(Integer id, String value, Permission permission, Role role,
 36 //            String type) {
 37 //        super();
 38 //        this.id = id;
 39 //        this.value = value;
 40 //        this.permission = permission;
 41 //        this.role = role;
 42 //        this.type = type;
 43 //    }
 44     public Function(Integer id, String value, int permission_id, int role_id,
 45             String type) {
 46         super();
 47         this.id = id;
 48         this.value = value;
 49         this.permission_id = permission_id;
 50         this.role_id = role_id;
 51         this.type = type;
 52     }
 53     
 54     @Id
 55     @GeneratedValue(strategy = GenerationType.IDENTITY)
 56     public Integer getId() {
 57         return id;
 58     }
 59 
 60     public void setId(Integer id) {
 61         this.id = id;
 62     }
 63 
 64     public String getValue() {
 65         return value;
 66     }
 67 
 68     public void setValue(String value) {
 69         this.value = value;
 70     }
 71 
 72 //    @OneToOne 
 73 //    @JoinColumn(name = "permission_id")
 74 //    public Permission getPermission() {
 75 //        return permission;
 76 //    }
 77 //
 78 //    public void setPermission(Permission permission) {
 79 //        this.permission = permission;
 80 //    }
 81 //
 82 //    @OneToOne
 83 //    @JoinColumn(name = "role_id")
 84 //    public Role getRole() {
 85 //        return role;
 86 //    }
 87 //
 88 //    public void setRole(Role role) {
 89 //        this.role = role;
 90 //    }
 91     public int getPermission_id() {
 92         return permission_id;
 93     }
 94 
 95     public void setPermission_id(int permission_id) {
 96         this.permission_id = permission_id;
 97     }
 98 
 99     public int getRole_id() {
100         return role_id;
101     }
102 
103     public void setRole_id(int role_id) {
104         this.role_id = role_id;
105     }
106 
107     
108     public String getType() {
109         return type;
110     }
111 
112     public void setType(String type) {
113         this.type = type;
114     }
115 }
 1 package com.etop.pojo;
 2 
 3 import java.io.Serializable;
 4 
 5 import javax.persistence.Entity;
 6 import javax.persistence.GeneratedValue;
 7 import javax.persistence.GenerationType;
 8 import javax.persistence.Id;
 9 import javax.persistence.JoinColumn;
10 import javax.persistence.JoinTable;
11 import javax.persistence.ManyToOne;
12 import javax.persistence.Table;
13 
14 /**
15  * @类名: Permission
16  * @描述: 权限类,保存权限信息与对应的角色(多对一)
17  * @作者 liuren-mail@163.com
18  * @日期 2015年5月20日 上午11:26:31
19  */
20 @SuppressWarnings("serial")
21 @Entity
22 @Table(name = "t_permission")
23 public class Permission implements Serializable {
24 
25     private Integer id;
26     private String permissionname;
27     private Role role;
28     public Permission() {
29         super();
30     }
31 
32     public Permission(Integer id, String permissionname, Role role) {
33         super();
34         this.id = id;
35         this.permissionname = permissionname;
36         this.role = role;
37     }
38 
39     @Id
40     @GeneratedValue(strategy = GenerationType.IDENTITY)
41     public Integer getId() {
42         return id;
43     }
44 
45     public void setId(Integer id) {
46         this.id = id;
47     }
48 
49     public String getPermissionname() {
50         return permissionname;
51     }
52 
53     public void setPermissionname(String permissionname) {
54         this.permissionname = permissionname;
55     }
56 
57     @ManyToOne(targetEntity = Role.class)
58     @JoinTable(name = "t_role_permission", joinColumns = { @JoinColumn(name = "permission_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") })
59     public Role getRole() {
60         return role;
61     }
62 
63     public void setRole(Role role) {
64         this.role = role;
65     }
66 }
  1 package com.etop.pojo;
  2 
  3 import javax.persistence.*;
  4 
  5 import org.codehaus.jackson.annotate.JsonIgnore;
  6 
  7 import java.io.Serializable;
  8 import java.util.HashSet;
  9 import java.util.Set;
 10 
 11 /**
 12  * @类名: Role
 13  * @描述: 角色类,用于保存角色信息、用户列表(多对多)与角色(一对多)对应的权限
 14  * @作者 liuren-mail@163.com
 15  * @日期 2015年5月20日 下午3:07:42
 16  */
 17 @SuppressWarnings("serial")
 18 @Entity
 19 @Table(name = "t_role")
 20 public class Role implements Serializable {
 21 
 22     private Integer id;
 23     private String rolename;
 24     private String description;
 25     private Set<Permission> permissionList;
 26     private Set<User> userList;
 27 
 28     public Role() {
 29         super();
 30     }
 31 
 32     public Role(Integer id, String rolename, Set<Permission> permissionList,
 33             Set<User> userList) {
 34         super();
 35         this.id = id;
 36         this.rolename = rolename;
 37         this.permissionList = permissionList;
 38         this.userList = userList;
 39     }
 40 
 41     @Id
 42     @GeneratedValue(strategy = GenerationType.IDENTITY)
 43     public Integer getId() {
 44         return id;
 45     }
 46 
 47     public void setId(Integer id) {
 48         this.id = id;
 49     }
 50 
 51     public String getRolename() {
 52         return rolename;
 53     }
 54 
 55     public void setRolename(String rolename) {
 56         this.rolename = rolename;
 57     }
 58 
 59     public String getDescription() {
 60         return description;
 61     }
 62 
 63     public void setDescription(String description) {
 64         this.description = description;
 65     }
 66 
 67     @OneToMany(targetEntity = Permission.class, cascade = {
 68             CascadeType.PERSIST, CascadeType.MERGE })
 69     @JsonIgnore
 70     // 防止无限循环
 71     @JoinTable(name = "t_role_permission", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = { @JoinColumn(name = "permission_id") })
 72     public Set<Permission> getPermissionList() {
 73         return permissionList;
 74     }
 75 
 76     public void setPermissionList(Set<Permission> permissionList) {
 77         this.permissionList = permissionList;
 78     }
 79 
 80     @ManyToMany(targetEntity = com.etop.pojo.User.class, cascade = {
 81             CascadeType.PERSIST, CascadeType.MERGE })
 82     @JsonIgnore
 83     // 防止无限循环
 84     @JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "role_id") }, inverseJoinColumns = { @JoinColumn(name = "user_id") })
 85     public Set<User> getUserList() {
 86         return userList;
 87     }
 88 
 89     public void setUserList(Set<User> userList) {
 90         this.userList = userList;
 91     }
 92 
 93     @Transient
 94     public Set<String> getPermissionsName() {
 95         Set<String> list = new HashSet<>();
 96         Set<Permission> perlist = getPermissionList();
 97         for (Permission per : perlist) {
 98             list.add(per.getPermissionname());
 99         }
100         return list;
101     }
102 
103     private class User {
104     }
105     
106 }
 1 package com.etop.pojo;
 2 
 3 import org.codehaus.jackson.annotate.JsonIgnore;
 4 import org.hibernate.validator.constraints.NotEmpty;
 5 
 6 import javax.persistence.*;
 7 
 8 import java.io.Serializable;
 9 import java.util.HashSet;
10 import java.util.Set;
11 
12 /**
13  * @类名: User
14  * @描述: 用户类,保存用户信息与角色(多对多)
15  * @作者 liuren-mail@163.com
16  * @日期 2015年5月20日 下午3:08:11
17  */
18 @SuppressWarnings("serial")
19 @Entity
20 @Table(name = "t_user")
21 public class User implements Serializable {
22 
23     private Integer id;
24     @NotEmpty(message = "用户名不能为空")
25     private String username;
26     @NotEmpty(message = "密码不能为空")
27     private String password;
28     private Set<Role> roleList;
29 
30     @Id
31     @GeneratedValue(strategy = GenerationType.IDENTITY)
32     public Integer getId() {
33         return id;
34     }
35 
36     public void setId(Integer id) {
37         this.id = id;
38     }
39 
40     public String getUsername() {
41         return username;
42     }
43 
44     public void setUsername(String username) {
45         this.username = username;
46     }
47 
48     public String getPassword() {
49         return password;
50     }
51 
52     public void setPassword(String password) {
53         this.password = password;
54     }
55 
56     @ManyToMany(fetch = FetchType.EAGER)
57     @JsonIgnore
58     // 防止无限循环
59     @JoinTable(name = "t_user_role", joinColumns = { @JoinColumn(name = "user_id") }, inverseJoinColumns = { @JoinColumn(name = "role_id") })
60     public Set<Role> getRoleList() {
61         return roleList;
62     }
63 
64     public void setRoleList(Set<Role> roleList) {
65         this.roleList = roleList;
66     }
67 
68     @Transient
69     public Set<String> getRolesName() {
70         Set<Role> roles = getRoleList();
71         Set<String> set = new HashSet<String>();
72         for (Role role : roles) {
73             set.add(role.getRolename());
74         }
75         return set;
76     }
77 
78     public User() {
79         super();
80     }
81 
82     public User(Integer id, String username, String password, Set<Role> roleList) {
83         super();
84         this.id = id;
85         this.username = username;
86         this.password = password;
87         this.roleList = roleList;
88     }
89 }

项目的service层:

 1 package com.etop.service;
 2 
 3 import com.etop.dao.FunctionDAO;
 4 import com.etop.dto.FunctionDto;
 5 import com.etop.pojo.Function;
 6 import com.etop.utils.PageUtil;
 7 
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.stereotype.Service;
10 import org.springframework.transaction.annotation.Transactional;
11 
12 import java.io.Serializable;
13 import java.util.HashMap;
14 import java.util.List;
15 import java.util.Map;
16 
17 /**
18  * @类名: FunctionService
19  * @描述: 网页过滤服务,与dao进行对接
20  * @作者 liuren-mail@163.com
21  * @日期 2015年5月20日 上午11:46:22
22  */
23 @SuppressWarnings("serial")
24 @Service("FunctionService")
25 public class FunctionService implements Serializable {
26 
27     @Autowired
28     private FunctionDAO functionDAO;
29 
30     /**
31      * 查找所有权限过滤信息
32      * 
33      * @return
34      */
35     public List<Function> findAll() {
36         return functionDAO.find("from Function f");
37     }
38 
39     @Transactional
40     public PageUtil<FunctionDto> findAllFunction() {
41         return functionDAO.findBySql("select * from t_function",
42                 FunctionDto.class, false);
43     }
44 
45     public void saveFunction(Function function) {
46         functionDAO.save(function);
47     }
48 
49     public Function findFunctionById(int id) {
50         Map<String,Object> params = new HashMap<String,Object>();
51         params.put("id", id);
52         return functionDAO.findUniqueResult("from Function f where f.id= :id", params);
53     }
54 
55     public void updateFunction(Function function) {
56         functionDAO.saveOrUpdate(function);
57     }
58 
59     public void deleteFunction(int id) {
60         functionDAO.deleteById(id);
61     }
62 }
 1 package com.etop.service;
 2 
 3 import java.io.Serializable;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.stereotype.Service;
10 import org.springframework.transaction.annotation.Transactional;
11 
12 import com.etop.dao.PermissionDAO;
13 import com.etop.dto.PermissionDto;
14 import com.etop.pojo.Permission;
15 import com.etop.utils.PageUtil;
16 
17 /**
18  * @类名: PermissionService
19  * @描述: 权限服务和DAO对接
20  * @作者 liuren-mail@163.com
21  * @日期 2015年5月27日 下午3:58:27
22  */
23 @SuppressWarnings("serial")
24 @Service
25 public class PermissionService implements Serializable {
26 
27     @Autowired
28     private PermissionDAO permissionDAO;
29 
30     public List<Permission> findAll(){
31         return permissionDAO.find("from Permission p");
32     }
33     @Transactional
34     public PageUtil<PermissionDto> findAllPermisson() {
35         return permissionDAO.findBySql("select * from t_permission",
36                 PermissionDto.class, false);
37     }
38     
39     public void savePermission(Permission permission) {
40         permissionDAO.save(permission);
41     }
42 
43     public Permission findPermissionById(int id) {
44         Map<String,Object> params = new HashMap<String,Object>();
45         params.put("id", id);
46         return permissionDAO.findUniqueResult("from Permission p where p.id= :id", params);
47     }
48 
49     public void updatePermission(Permission permission) {
50         permissionDAO.saveOrUpdate(permission);
51     }
52 
53     public void deletePermission(int id) {
54         permissionDAO.deleteById(id);
55     }
56     public String getNameById(int permission_id) {
57         Map<String,Object> params = new HashMap<String,Object>();
58         params.put("id", permission_id);
59         Permission permission = permissionDAO.findUniqueResult("from Permission p where p.id= :id", params);
60         String name =permission.getPermissionname();
61         return name;
62     }
63 
64 }
 1 package com.etop.service;
 2 
 3 import java.io.Serializable;
 4 import java.util.HashMap;
 5 import java.util.List;
 6 import java.util.Map;
 7 
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.stereotype.Service;
10 import org.springframework.transaction.annotation.Transactional;
11 
12 import com.etop.dao.RoleDAO;
13 import com.etop.dto.RoleDto;
14 import com.etop.pojo.Role;
15 import com.etop.utils.PageUtil;
16 /**
17  * @类名: RoleService 
18  * @描述: 角色服务和DAO对接
19  * @作者 liuren-mail@163.com
20  * @日期 2015年5月26日 下午5:20:03
21  */
22 @SuppressWarnings("serial")
23 @Service
24 public class RoleService implements Serializable{
25     
26     @Autowired
27     private RoleDAO roleDAO;
28     
29     @Transactional
30     public List<Role> getAllRole() {
31         return roleDAO.find("from Role r");
32     }
33     
34     @Transactional
35     public PageUtil<RoleDto> findAllRole() {
36         return roleDAO.findBySql("select * from t_role", RoleDto.class, false);
37     }
38 
39     public Role findById(int id) {
40         Map<String,Object> params = new HashMap<String,Object>();
41         params.put("id", id);
42         return roleDAO.findUniqueResult("from Role r where r.id= :id", params);
43     }
44 
45     public void updateRole(Role role) {
46         roleDAO.saveOrUpdate(role);
47     }
48 
49     public void saveRole(Role role) {
50         roleDAO.save(role);
51     }
52 
53     public void deleteRole(int id) {
54         roleDAO.deleteById(id);
55     }
56 
57     public String getNameById(int role_id) {
58         Map<String,Object> params = new HashMap<String,Object>();
59         params.put("id", role_id);
60         Role role =roleDAO.findUniqueResult("from Role r where r.id= :id", params);
61         String rolename = role.getRolename();
62         return rolename;
63     }
64 }
 1 package com.etop.service;
 2 
 3 import com.etop.dao.UserDAO;
 4 import com.etop.dto.UserDto;
 5 import com.etop.pojo.User;
 6 import com.etop.utils.PageUtil;
 7 
 8 import org.springframework.beans.factory.annotation.Autowired;
 9 import org.springframework.stereotype.Service;
10 
11 import java.io.Serializable;
12 import java.util.HashMap;
13 import java.util.List;
14 import java.util.Map;
15 
16 /**
17  * @类名: UserService
18  * @描述: 用户服务,与dao进行对接
19  * @作者 liuren-mail@163.com
20  * @日期 2015年5月20日 下午3:03:20
21  */
22 @SuppressWarnings("serial")
23 @Service("UserService")
24 public class UserService implements Serializable {
25 
26     @Autowired
27     private UserDAO userDAO;
28 
29     /**
30      * 通过用户名查找用户信息
31      * 
32      * @param username
33      * @return
34      */
35     public User findByName(String username) {
36         Map<String, Object> params = new HashMap<>();
37         params.put("name", username);
38         return userDAO.findUniqueResult("from User u where u.username = :name",
39                 params);
40     }
41 
42     public List<User> getAllUser() {
43         return userDAO.find("from User u");
44     }
45 
46     public PageUtil<UserDto> findAllUser() {
47         return userDAO.findBySql("select * from t_user", UserDto.class, false);
48     }
49 
50     public void saveUser(User user) {
51         userDAO.save(user);
52     }
53 
54     public User findById(int id) {
55         Map<String, Object> params = new HashMap<String, Object>();
56         params.put("id", id);
57         return userDAO.findUniqueResult("from User u where u.id = :id", params);
58     }
59 
60     public void updateUser(User user) {
61         userDAO.saveOrUpdate(user);
62     }
63 
64     public void deleteUser(int id) {
65         userDAO.deleteById(id);
66     }
67 }

项目的shiro层代码:

 1 package com.etop.shiro;
 2 
 3 import com.etop.pojo.Function;
 4 import com.etop.service.FunctionService;
 5 import com.etop.service.PermissionService;
 6 import com.etop.service.RoleService;
 7 
 8 import org.apache.commons.lang.StringUtils;
 9 import org.apache.shiro.config.Ini;
10 import org.springframework.beans.factory.FactoryBean;
11 import org.springframework.beans.factory.annotation.Autowired;
12 
13 import java.util.Iterator;
14 import java.util.List;
15 
16 /**
17  * @类名: ChainDefinitionSectionMetaSource
18  * @描述: 产生责任链,确定每个url的访问权限
19  * @作者 liuren-mail@163.com
20  * @日期 2015年5月20日 下午3:12:53
21  */
22 public class ChainDefinitionSectionMetaSource implements
23         FactoryBean<Ini.Section> {
24 
25     @Autowired
26     private FunctionService functionService;
27     @Autowired
28     private RoleService roleService;
29     @Autowired
30     private PermissionService permissionService;
31     // 静态资源访问权限
32     private String filterChainDefinitions = "/static/**=anon";
33 
34     @Override
35     public Ini.Section getObject() throws Exception {
36         List<Function> list = functionService.findAll();
37         Ini ini = new Ini();
38         // 加载默认的url
39         ini.load(filterChainDefinitions);
40         Ini.Section section = ini.getSection(Ini.DEFAULT_SECTION_NAME);
41         // 循环Resource的url,逐个添加到section中。section就是filterChainDefinitionMap,
42         // 里面的键就是链接URL,值就是存在什么条件才能访问该链接
43         for (Iterator<Function> it = list.iterator(); it.hasNext();) {
44             Function function = it.next();
45             int permission_id = function.getPermission_id();
46             int role_id = function.getRole_id();
47             // 构成permission字符串
48             if (StringUtils.isNotEmpty(function.getValue())
49                     && StringUtils.isNotEmpty(function.getType())) {
50                 String permission = "";
51                 switch (function.getType()) {
52                 case "anon":
53                     permission = "anon";
54                     break;
55                 case "perms":
56                     permission = "perms["
57                             + permissionService.getNameById(permission_id)//function.getPermission().getPermissionname()
58                             + "]";
59                     break;
60                 case "roles":
61                     permission = "roles[" 
62                             + roleService.getNameById(role_id)//function.getRole().getRolename()
63                             + "]";
64                     break;
65                 default:
66                     break;
67                 }
68                 section.put(function.getValue(), permission);
69             }
70 
71         }
72         // 所有资源的访问权限,必须放在最后
73         section.put("/**", "authc");
74         return section;
75     }
76 
77     @Override
78     public Class<?> getObjectType() {
79         return this.getClass();
80     }
81 
82     @Override
83     public boolean isSingleton() {
84         return false;
85     }
86 }
 1 package com.etop.shiro;
 2 
 3 import java.util.Collection;
 4 
 5 import javax.inject.Inject;
 6 
 7 import org.apache.shiro.authc.AuthenticationException;
 8 import org.apache.shiro.authc.AuthenticationInfo;
 9 import org.apache.shiro.authc.AuthenticationToken;
10 import org.apache.shiro.authc.SimpleAuthenticationInfo;
11 import org.apache.shiro.authc.UsernamePasswordToken;
12 import org.apache.shiro.authz.AuthorizationInfo;
13 import org.apache.shiro.authz.SimpleAuthorizationInfo;
14 import org.apache.shiro.realm.AuthorizingRealm;
15 import org.apache.shiro.subject.PrincipalCollection;
16 import org.springframework.stereotype.Service;
17 import org.springframework.transaction.annotation.Transactional;
18 
19 import com.etop.pojo.Role;
20 import com.etop.pojo.User;
21 import com.etop.service.UserService;
22 
23 /**
24  * @类名: MyRealm
25  * @描述: 自定义Realm,进行数据源配置
26  * @作者 liuren-mail@163.com
27  * @日期 2015年5月20日 上午11:50:21
28  */
29 
30 @Service
31 @Transactional
32 public class MyRealm extends AuthorizingRealm {
33 
34     @Inject
35     private UserService userService;
36 
37     /**
38      * 获取授权信息
39      */
40     @Override
41     protected AuthorizationInfo doGetAuthorizationInfo(
42             PrincipalCollection principalCollection) {
43         // 获取登录时输入的用户名
44         String loginName = (String) principalCollection.fromRealm(getName())
45                 .iterator().next();
46         // 到数据库获取此用户
47         User user = userService.findByName(loginName);
48         if (user != null) {
49             // 权限信息对象info,用来存放查出的用户的所有的角色(role)及权限(permission)
50             SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();
51             // 用户的角色集合
52             info.setRoles(user.getRolesName());
53             // 用户的角色对应的所有权限,如果只使用角色定义访问权限
54             Collection<Role> roleList = user.getRoleList();
55             for (Role role : roleList) {
56                 info.addStringPermissions(role.getPermissionsName());
57             }
58             return info;
59         }
60         return null;
61     }
62 
63     /**
64      * 获取身份验证相关信息
65      */
66     @Override
67     protected AuthenticationInfo doGetAuthenticationInfo(
68             AuthenticationToken authenticationToken)
69             throws AuthenticationException {
70         // UsernamePasswordToken对象用来存放提交的登录信息
71         UsernamePasswordToken token = (UsernamePasswordToken) authenticationToken;
72         // 查出是否有此用户
73         User user = userService.findByName(token.getUsername());
74         if (user != null) {
75             // 若存在,将此用户存放到登录认证info中
76             return new SimpleAuthenticationInfo(user.getUsername(),
77                     user.getPassword(), getName());
78         }
79         return null;
80     }
81 
82 }

项目的工具类:

  1 package com.etop.utils;
  2 
  3 import org.apache.commons.lang.time.DateFormatUtils;
  4 
  5 import java.sql.Timestamp;
  6 import java.text.ParseException;
  7 import java.text.SimpleDateFormat;
  8 import java.util.Calendar;
  9 import java.util.Date;
 10 
 11 /**
 12  * @类名: DateUtils
 13  * @描述: 比较两个日期相差的月份数
 14  * @作者 liuren-mail@163.com
 15  * @日期 2015年5月20日 下午2:47:06
 16  */
 17 public class DateUtils extends org.apache.commons.lang.time.DateUtils {
 18 
 19     public static SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
 20     private static String[] parsePatterns = { "yyyy-MM-dd",
 21             "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm", "yyyy/MM/dd",
 22             "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" };
 23 
 24     /**
 25      * 得到当前日期字符串 格式(yyyy-MM-dd)
 26      */
 27     public static String getDate() {
 28         return getDate("yyyy-MM-dd");
 29     }
 30 
 31     /**
 32      * 得到当前日期字符串 格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
 33      */
 34     public static String getDate(String pattern) {
 35         return DateFormatUtils.format(new Date(), pattern);
 36     }
 37 
 38     /**
 39      * 得到日期字符串 默认格式(yyyy-MM-dd) pattern可以为:"yyyy-MM-dd" "HH:mm:ss" "E"
 40      */
 41     public static String formatDate(Date date, Object... pattern) {
 42         String formatDate = null;
 43         if (pattern != null && pattern.length > 0) {
 44             formatDate = DateFormatUtils.format(date, pattern[0].toString());
 45         } else {
 46             formatDate = DateFormatUtils.format(date, "yyyy-MM-dd");
 47         }
 48         return formatDate;
 49     }
 50 
 51     /**
 52      * 得到当前时间字符串 格式(HH:mm:ss)
 53      */
 54     public static String getTime() {
 55         return formatDate(new Date(), "HH:mm:ss");
 56     }
 57 
 58     /**
 59      * 得到当前日期和时间字符串 格式(yyyy-MM-dd HH:mm:ss)
 60      */
 61     public static String getDateTime() {
 62         return formatDate(new Date(), "yyyy-MM-dd HH:mm:ss");
 63     }
 64 
 65     /**
 66      * 得到当前年份字符串 格式(yyyy)
 67      */
 68     public static String getYear() {
 69         return formatDate(new Date(), "yyyy");
 70     }
 71 
 72     /**
 73      * 得到当前月份字符串 格式(MM)
 74      */
 75     public static String getMonth() {
 76         return formatDate(new Date(), "MM");
 77     }
 78 
 79     /**
 80      * 得到当天字符串 格式(dd)
 81      */
 82     public static String getDay() {
 83         return formatDate(new Date(), "dd");
 84     }
 85 
 86     /**
 87      * 得到当前星期字符串 格式(E)星期几
 88      */
 89     public static String getWeek() {
 90         return formatDate(new Date(), "E");
 91     }
 92 
 93     /**
 94      * 日期型字符串转化为日期 格式 { "yyyy-MM-dd", "yyyy-MM-dd HH:mm:ss", "yyyy-MM-dd HH:mm",
 95      * "yyyy/MM/dd", "yyyy/MM/dd HH:mm:ss", "yyyy/MM/dd HH:mm" }
 96      */
 97     public static Date parseDate(Object str) {
 98         if (str == null) {
 99             return null;
100         }
101         try {
102             return parseDate(str.toString(), parsePatterns);
103         } catch (ParseException e) {
104             return null;
105         }
106     }
107 
108     /**
109      * 获取过去的天数
110      * 
111      * @param date
112      * @return
113      */
114     public static long pastDays(Date date) {
115         long t = new Date().getTime() - date.getTime();
116         return t / (24 * 60 * 60 * 1000);
117     }
118 
119     public static int getMonthSpace(Timestamp source, Timestamp target) {
120         int result = 0;
121 
122         Calendar c1 = Calendar.getInstance();
123         Calendar c2 = Calendar.getInstance();
124 
125         c1.setTime(new Date(source.getTime()));
126         c2.setTime(new Date(target.getTime()));
127 
128         result = c2.get(Calendar.MONDAY) - c1.get(Calendar.MONTH);
129 
130         return result == 0 ? 0 : result;
131     }
132 
133     public static Timestamp addDay(Timestamp source, int amount) {
134         Calendar c = Calendar.getInstance();
135         c.setTimeInMillis(source.getTime());
136         c.add(Calendar.DAY_OF_MONTH, amount);
137         return new Timestamp(c.getTimeInMillis());
138     }
139 }
 1 package com.etop.utils;
 2 
 3 import net.sf.json.JSONObject;
 4 
 5 public class JsonTools {
 6     /**
 7      * 得到一个json类型的字符串对象
 8      * 
 9      * @param key
10      * @param value
11      * @return
12      */
13     public static String getJsonString(String key, Object value) {
14         JSONObject jsonObject = new JSONObject();
15         // put和element都是往JSONObject对象中放入 key/value 对
16         // jsonObject.put(key, value);
17         jsonObject.element(key, value);
18         return jsonObject.toString();
19     }
20 
21     /**
22      * 得到一个json对象
23      * 
24      * @param key
25      * @param value
26      * @return
27      */
28     public static JSONObject getJsonObject(String key, Object value) {
29         JSONObject jsonObject = new JSONObject();
30         jsonObject.put(key, value);
31         return jsonObject;
32     }
33 
34 }
package com.etop.utils;

import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @类名: MD5Utils 
 * @描述: 32位的md5加密方法
 * @作者 liuren-mail@163.com
 * @日期 2015年5月30日 上午10:29:57
 */
public class MD5Utils {
    // 全局数组
    private final static String[] strDigits = { "0", "1", "2", "3", "4", "5",
            "6", "7", "8", "9", "a", "b", "c", "d", "e", "f" };

    public MD5Utils() {
    }

    // 返回形式为数字跟字符串
    private static String byteToArrayString(byte bByte) {
        int iRet = bByte;
        // System.out.println("iRet="+iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        int iD1 = iRet / 16;
        int iD2 = iRet % 16;
        return strDigits[iD1] + strDigits[iD2];
    }

    // 返回形式只为数字
    @SuppressWarnings("unused")
    private static String byteToNum(byte bByte) {
        int iRet = bByte;
        System.out.println("iRet1=" + iRet);
        if (iRet < 0) {
            iRet += 256;
        }
        return String.valueOf(iRet);
    }

    // 转换字节数组为16进制字串
    private static String byteToString(byte[] bByte) {
        StringBuffer sBuffer = new StringBuffer();
        for (int i = 0; i < bByte.length; i++) {
            sBuffer.append(byteToArrayString(bByte[i]));
        }
        return sBuffer.toString();
    }

    public String GetMD5Code(String strObj) {
        String resultString = null;
        try {
            resultString = new String(strObj);
            MessageDigest md = MessageDigest.getInstance("MD5");
            // md.digest() 该函数返回值为存放哈希值结果的byte数组
            resultString = byteToString(md.digest(strObj.getBytes()));
        } catch (NoSuchAlgorithmException ex) {
            ex.printStackTrace();
        }
        return resultString;
    }

    public static void main(String[] args) {
        MD5Utils getMD5 = new MD5Utils();
        System.out.println(getMD5.GetMD5Code("000000"));
    }
}
 1 package com.etop.utils;
 2 
 3 import java.util.List;
 4 
 5 public class PageUtil<T> {
 6 
 7     // /**
 8     // * 分页的大小
 9     // */
10     // private int size;//page*limit
11     // /**
12     // * 分页的起始页
13     // */
14     // private int offset;//start
15     // /**
16     // * 总记录数
17     // */
18     private long total;
19     /**
20      * 分页的数据
21      */
22     private List<T> rows;
23 
24     // public int getSize() {
25     // return size;
26     // }
27     // public void setSize(int size) {
28     // this.size = size;
29     // }
30     // public int getOffset() {
31     // return offset;
32     // }
33     // public void setOffset(int offset) {
34     // this.offset = offset;
35     // }
36     public long getTotal() {
37         return total;
38     }
39 
40     public void setTotal(long total) {
41         this.total = total;
42     }
43 
44     public List<T> getRows() {
45         return rows;
46     }
47 
48     public void setRows(List<T> rows) {
49         this.rows = rows;
50     }
51 
52 }
 1 package com.etop.utils;
 2 
 3 import org.apache.commons.lang.Validate;
 4 import org.apache.log4j.Logger;
 5 import org.springframework.beans.factory.DisposableBean;
 6 import org.springframework.context.ApplicationContext;
 7 import org.springframework.context.ApplicationContextAware;
 8 
 9 /**
10  * @类名: SpringContextHolder
11  * @描述: 以静态变量保存Spring ApplicationContext, 可在任何代码任何地方任何时候取出ApplicaitonContext.
12  * @作者 liuren-mail@163.com
13  * @日期 2015年5月20日 上午11:49:42
14  */
15 public class SpringContextHolder implements ApplicationContextAware,
16         DisposableBean {
17 
18     private static ApplicationContext applicationContext = null;
19     private static Logger logger = Logger.getLogger(SpringContextHolder.class);
20 
21     /**
22      * 取得存储在静态变量中的ApplicationContext.
23      */
24     public static ApplicationContext getApplicationContext() {
25         assertContextInjected();
26         return applicationContext;
27     }
28 
29     /**
30      * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
31      */
32     @SuppressWarnings("unchecked")
33     public static <T> T getBean(String name) {
34         assertContextInjected();
35         return (T) applicationContext.getBean(name);
36     }
37 
38     /**
39      * 从静态变量applicationContext中取得Bean, 自动转型为所赋值对象的类型.
40      */
41     public static <T> T getBean(Class<T> requiredType) {
42         assertContextInjected();
43         return applicationContext.getBean(requiredType);
44     }
45 
46     /**
47      * 清除SpringContextHolder中的ApplicationContext为Null.
48      */
49     public static void clearHolder() {
50         logger.debug("清除SpringContextHolder中的ApplicationContext:"
51                 + applicationContext);
52         applicationContext = null;
53     }
54 
55     /**
56      * 实现ApplicationContextAware接口, 注入Context到静态变量中.
57      */
58     @Override
59     public void setApplicationContext(ApplicationContext applicationContext) {
60         if (SpringContextHolder.applicationContext != null) {
61             logger.warn("SpringContextHolder中的ApplicationContext被覆盖, 原有ApplicationContext为:"
62                     + SpringContextHolder.applicationContext);
63         }
64         SpringContextHolder.applicationContext = applicationContext; // NOSONAR
65     }
66 
67     /**
68      * 实现DisposableBean接口, 在Context关闭时清理静态变量.
69      */
70     @Override
71     public void destroy() throws Exception {
72         SpringContextHolder.clearHolder();
73     }
74 
75     /**
76      * 检查ApplicationContext不为空.
77      */
78     private static void assertContextInjected() {
79         Validate.isTrue(applicationContext != null,
80                 "applicaitonContext属性未注入, 请在applicationContext.xml中定义SpringContextHolder.");
81     }
82 }
 1 package com.etop.utils;
 2 /**
 3  * 用来传递列表对象的ThreadLocal数据
 4  * @author Administrator
 5  *
 6  */
 7 public class ThreadLocalUtils {
 8     /**
 9      * 分页大小
10      */
11     private static ThreadLocal<Integer> pageSize = new ThreadLocal<Integer>();
12     /**
13      * 分页的起始页
14      */
15     private static ThreadLocal<Integer> pageOffset = new ThreadLocal<Integer>();
16     /**
17      * 列表的排序字段
18      */
19     private static ThreadLocal<String> sort = new ThreadLocal<String>();
20     /**
21      * 列表的排序方式
22      */
23     private static ThreadLocal<String> order = new ThreadLocal<String>();
24     
25     private static ThreadLocal<String> realPath = new ThreadLocal<String>();
26 /*    
27     private static ThreadLocal<String> query = new ThreadLocal<String>();
28     
29     public static String getQuery() {
30         return query.get();
31     }
32     public static void setQuery(String _query) {
33         SystemContext.query.set(_query);
34     }*/
35     public static String getRealPath() {
36         return realPath.get();
37     }
38     public static void setRealPath(String _realPath) {
39         ThreadLocalUtils.realPath.set(_realPath);
40     }
41     public static Integer getPageSize() {
42         return pageSize.get();
43     }
44     public static void setPageSize(Integer _pageSize) {
45         pageSize.set(_pageSize);
46     }
47     public static Integer getPageOffset() {
48         return pageOffset.get();
49     }
50     public static void setPageOffset(Integer _pageOffset) {
51         pageOffset.set(_pageOffset);
52     }
53     public static String getSort() {
54         return sort.get();
55     }
56     public static void setSort(String _sort) {
57         ThreadLocalUtils.sort.set(_sort);
58     }
59     public static String getOrder() {
60         return order.get();
61     }
62     public static void setOrder(String _order) {
63         ThreadLocalUtils.order.set(_order);
64     }
65     
66     public static void removePageSize() {
67         pageSize.remove();
68     }
69     
70     public static void removePageOffset() {
71         pageOffset.remove();
72     }
73     
74     public static void removeSort() {
75         sort.remove();
76     }
77     
78     public static void removeOrder() {
79         order.remove();
80     }
81     
82     public static void removeRealPath() {
83         realPath.remove();
84     }
85     
86     /*public static void removeQuery(){
87         query.remove();
88     }*/
89 }
  1 package com.etop.utils;
  2 
  3 import java.io.*;
  4 import java.text.SimpleDateFormat;
  5 import java.util.*;
  6 
  7 import org.apache.commons.fileupload.*;
  8 import org.apache.commons.fileupload.FileUploadBase.InvalidContentTypeException;
  9 import org.apache.commons.fileupload.FileUploadBase.SizeLimitExceededException;
 10 import org.apache.commons.fileupload.util.*;
 11 import org.apache.commons.fileupload.servlet.*;
 12 import org.apache.commons.fileupload.FileItemIterator;
 13 import org.apache.commons.fileupload.disk.DiskFileItemFactory;
 14 
 15 import sun.misc.BASE64Decoder;
 16 
 17 import javax.servlet.http.HttpServletRequest;
 18 
 19 /**
 20  * UEditor文件上传辅助类
 21  * 
 22  */
 23 @SuppressWarnings("restriction")
 24 public class Uploader {
 25     // 输出文件地址
 26     private String url = "";
 27     // 上传文件名
 28     private String fileName = "";
 29     // 状态
 30     private String state = "";
 31     // 文件类型
 32     private String type = "";
 33     // 原始文件名
 34     private String originalName = "";
 35     // 文件大小
 36     private String size = "";
 37 
 38     private HttpServletRequest request = null;
 39     private String title = "";
 40 
 41     // 保存路径
 42     private String savePath = "upload";
 43     // 文件允许格式
 44     private String[] allowFiles = { ".rar", ".doc", ".docx", ".zip", ".pdf",
 45             ".txt", ".swf", ".wmv", ".gif", ".png", ".jpg", ".jpeg", ".bmp" };
 46     // 文件大小限制,单位KB
 47     private int maxSize = 10000;
 48 
 49     private HashMap<String, String> errorInfo = new HashMap<String, String>();
 50 
 51     public Uploader(HttpServletRequest request) {
 52         this.request = request;
 53         HashMap<String, String> tmp = this.errorInfo;
 54         tmp.put("SUCCESS", "SUCCESS"); // 默认成功
 55         tmp.put("NOFILE", "未包含文件上传域");
 56         tmp.put("TYPE", "不允许的文件格式");
 57         tmp.put("SIZE", "文件大小超出限制");
 58         tmp.put("ENTYPE", "请求类型ENTYPE错误");
 59         tmp.put("REQUEST", "上传请求异常");
 60         tmp.put("IO", "IO异常");
 61         tmp.put("DIR", "目录创建失败");
 62         tmp.put("UNKNOWN", "未知错误");
 63 
 64     }
 65 
 66     public void upload() throws Exception {
 67         boolean isMultipart = ServletFileUpload
 68                 .isMultipartContent(this.request);
 69         if (!isMultipart) {
 70             this.state = this.errorInfo.get("NOFILE");
 71             return;
 72         }
 73         DiskFileItemFactory dff = new DiskFileItemFactory();
 74         String savePath = this.getFolder(this.savePath);
 75         dff.setRepository(new File(savePath));
 76         try {
 77             ServletFileUpload sfu = new ServletFileUpload(dff);
 78             sfu.setSizeMax(this.maxSize * 1024);
 79             sfu.setHeaderEncoding("utf-8");
 80             FileItemIterator fii = sfu.getItemIterator(this.request);
 81             while (fii.hasNext()) {
 82                 FileItemStream fis = fii.next();
 83                 if (!fis.isFormField()) {
 84                     this.originalName = fis.getName().substring(
 85                             fis.getName().lastIndexOf(
 86                                     System.getProperty("file.separator")) + 1);
 87                     if (!this.checkFileType(this.originalName)) {
 88                         this.state = this.errorInfo.get("TYPE");
 89                         continue;
 90                     }
 91                     this.fileName = this.getName(this.originalName);
 92                     this.type = this.getFileExt(this.fileName);
 93                     this.url = savePath + "/" + this.fileName;
 94                     BufferedInputStream in = new BufferedInputStream(
 95                             fis.openStream());
 96                     FileOutputStream out = new FileOutputStream(new File(
 97                             this.getPhysicalPath(this.url)));
 98                     BufferedOutputStream output = new BufferedOutputStream(out);
 99                     Streams.copy(in, output, true);
100                     this.state = this.errorInfo.get("SUCCESS");
101                     // UE中只会处理单张上传,完成后即退出
102                     break;
103                 } else {
104                     String fname = fis.getFieldName();
105                     // 只处理title,其余表单请自行处理
106                     if (!fname.equals("pictitle")) {
107                         continue;
108                     }
109                     BufferedInputStream in = new BufferedInputStream(
110                             fis.openStream());
111                     BufferedReader reader = new BufferedReader(
112                             new InputStreamReader(in));
113                     StringBuffer result = new StringBuffer();
114                     while (reader.ready()) {
115                         result.append((char) reader.read());
116                     }
117                     this.title = new String(result.toString().getBytes(),
118                             "utf-8");
119                     reader.close();
120 
121                 }
122             }
123         } catch (SizeLimitExceededException e) {
124             this.state = this.errorInfo.get("SIZE");
125         } catch (InvalidContentTypeException e) {
126             this.state = this.errorInfo.get("ENTYPE");
127         } catch (FileUploadException e) {
128             this.state = this.errorInfo.get("REQUEST");
129         } catch (Exception e) {
130             this.state = this.errorInfo.get("UNKNOWN");
131         }
132     }
133 
134     /**
135      * 接受并保存以base64格式上传的文件
136      * 
137      * @param fieldName
138      */
139     public void uploadBase64(String fieldName) {
140         String savePath = this.getFolder(this.savePath);
141         String base64Data = this.request.getParameter(fieldName);
142         this.fileName = this.getName("test.png");
143         this.url = savePath + "/" + this.fileName;
144         BASE64Decoder decoder = new BASE64Decoder();
145         try {
146             File outFile = new File(this.getPhysicalPath(this.url));
147             OutputStream ro = new FileOutputStream(outFile);
148             byte[] b = decoder.decodeBuffer(base64Data);
149             for (int i = 0; i < b.length; ++i) {
150                 if (b[i] < 0) {
151                     b[i] += 256;
152                 }
153             }
154             ro.write(b);
155             ro.flush();
156             ro.close();
157             this.state = this.errorInfo.get("SUCCESS");
158         } catch (Exception e) {
159             this.state = this.errorInfo.get("IO");
160         }
161     }
162 
163     /**
164      * 文件类型判断
165      * 
166      * @param fileName
167      * @return
168      */
169     private boolean checkFileType(String fileName) {
170         Iterator<String> type = Arrays.asList(this.allowFiles).iterator();
171         while (type.hasNext()) {
172             String ext = type.next();
173             if (fileName.toLowerCase().endsWith(ext)) {
174                 return true;
175             }
176         }
177         return false;
178     }
179 
180     /**
181      * 获取文件扩展名
182      * 
183      * @return string
184      */
185     private String getFileExt(String fileName) {
186         return fileName.substring(fileName.lastIndexOf("."));
187     }
188 
189     /**
190      * 依据原始文件名生成新文件名
191      * 
192      * @return
193      */
194     private String getName(String fileName) {
195         Random random = new Random();
196         return this.fileName = "" + random.nextInt(10000)
197                 + System.currentTimeMillis() + this.getFileExt(fileName);
198     }
199 
200     /**
201      * 根据字符串创建本地目录 并按照日期建立子目录返回
202      * 
203      * @param path
204      * @return
205      */
206     private String getFolder(String path) {
207         SimpleDateFormat formater = new SimpleDateFormat("yyyyMMdd");
208         path += "/" + formater.format(new Date());
209         File dir = new File(this.getPhysicalPath(path));
210         if (!dir.exists()) {
211             try {
212                 dir.mkdirs();
213             } catch (Exception e) {
214                 this.state = this.errorInfo.get("DIR");
215                 return "";
216             }
217         }
218         return path;
219     }
220 
221     /**
222      * 根据传入的虚拟路径获取物理路径
223      * 
224      * @param path
225      * @return
226      */
227     private String getPhysicalPath(String path) {
228         String servletPath = this.request.getServletPath();
229         String realPath = this.request.getSession().getServletContext()
230                 .getRealPath(servletPath);
231         return new File(realPath).getParent() + "/" + path;
232     }
233 
234     public void setSavePath(String savePath) {
235         this.savePath = savePath;
236     }
237 
238     public void setAllowFiles(String[] allowFiles) {
239         this.allowFiles = allowFiles;
240     }
241 
242     public void setMaxSize(int size) {
243         this.maxSize = size;
244     }
245 
246     public String getSize() {
247         return this.size;
248     }
249 
250     public String getUrl() {
251         return this.url;
252     }
253 
254     public String getFileName() {
255         return this.fileName;
256     }
257 
258     public String getState() {
259         return this.state;
260     }
261 
262     public String getTitle() {
263         return this.title;
264     }
265 
266     public String getType() {
267         return this.type;
268     }
269 
270     public String getOriginalName() {
271         return this.originalName;
272     }
273 }
  1 package com.etop.utils;
  2 
  3 import java.awt.Color;
  4 import java.awt.Font;
  5 import java.awt.Graphics;
  6 import java.awt.image.BufferedImage;
  7 import java.util.Random;
  8 
  9 /**
 10  * 验证码生成器类,可生成数字、大写、小写字母及三者混合类型的验证码。 支持自定义验证码字符数量; 支持自定义验证码图片的大小; 支持自定义需排除的特殊字符;
 11  * 支持自定义干扰线的数量; 支持自定义验证码图文颜色
 12  * 
 13  * @author org.javachina
 14  * @version 1.01
 15  */
 16 public class VerifyCode {
 17 
 18     // 验证码类型,评论
 19     public static final String VERIFY_TYPE_COMMENT = "VERIFY_TYPE_COMMENT";
 20 
 21     /**
 22      * 验证码类型为仅数字 0~9
 23      */
 24     public static final int TYPE_NUM_ONLY = 0;
 25 
 26     /**
 27      * 验证码类型为仅字母,即大写、小写字母混合
 28      */
 29     public static final int TYPE_LETTER_ONLY = 1;
 30 
 31     /**
 32      * 验证码类型为数字、大写字母、小写字母混合
 33      */
 34     public static final int TYPE_ALL_MIXED = 2;
 35 
 36     /**
 37      * 验证码类型为数字、大写字母混合
 38      */
 39     public static final int TYPE_NUM_UPPER = 3;
 40 
 41     /**
 42      * 验证码类型为数字、小写字母混合
 43      */
 44     public static final int TYPE_NUM_LOWER = 4;
 45 
 46     /**
 47      * 验证码类型为仅大写字母
 48      */
 49     public static final int TYPE_UPPER_ONLY = 5;
 50 
 51     /**
 52      * 验证码类型为仅小写字母
 53      */
 54     public static final int TYPE_LOWER_ONLY = 6;
 55 
 56     private VerifyCode() {
 57     }
 58 
 59     /**
 60      * 生成验证码字符串
 61      * 
 62      * @param type
 63      *            验证码类型,参见本类的静态属性
 64      * @param length
 65      *            验证码长度,大于0的整数
 66      * @param exChars
 67      *            需排除的特殊字符(仅对数字、字母混合型验证码有效,无需排除则为null)
 68      * @return 验证码字符串
 69      */
 70     public static String generateTextCode(int type, int length, String exChars) {
 71 
 72         if (length <= 0)
 73             return "";
 74 
 75         StringBuffer code = new StringBuffer();
 76         int i = 0;
 77         Random r = new Random();
 78 
 79         switch (type) {
 80 
 81         // 仅数字
 82         case TYPE_NUM_ONLY:
 83             while (i < length) {
 84                 int t = r.nextInt(10);
 85                 if (exChars == null || exChars.indexOf(t + "") < 0) {// 排除特殊字符
 86                     code.append(t);
 87                     i++;
 88                 }
 89             }
 90             break;
 91 
 92         // 仅字母(即大写字母、小写字母混合)
 93         case TYPE_LETTER_ONLY:
 94             while (i < length) {
 95                 int t = r.nextInt(123);
 96                 if ((t >= 97 || (t >= 65 && t <= 90))
 97                         && (exChars == null || exChars.indexOf((char) t) < 0)) {
 98                     code.append((char) t);
 99                     i++;
100                 }
101             }
102             break;
103 
104         // 数字、大写字母、小写字母混合
105         case TYPE_ALL_MIXED:
106             while (i < length) {
107                 int t = r.nextInt(123);
108                 if ((t >= 97 || (t >= 65 && t <= 90) || (t >= 48 && t <= 57))
109                         && (exChars == null || exChars.indexOf((char) t) < 0)) {
110                     code.append((char) t);
111                     i++;
112                 }
113             }
114             break;
115 
116         // 数字、大写字母混合
117         case TYPE_NUM_UPPER:
118             while (i < length) {
119                 int t = r.nextInt(91);
120                 if ((t >= 65 || (t >= 48 && t <= 57))
121                         && (exChars == null || exChars.indexOf((char) t) < 0)) {
122                     code.append((char) t);
123                     i++;
124                 }
125             }
126             break;
127 
128         // 数字、小写字母混合
129         case TYPE_NUM_LOWER:
130             while (i < length) {
131                 int t = r.nextInt(123);
132                 if ((t >= 97 || (t >= 48 && t <= 57))
133                         && (exChars == null || exChars.indexOf((char) t) < 0)) {
134                     code.append((char) t);
135                     i++;
136                 }
137             }
138             break;
139 
140         // 仅大写字母
141         case TYPE_UPPER_ONLY:
142             while (i < length) {
143                 int t = r.nextInt(91);
144                 if ((t >= 65)
145                         && (exChars == null || exChars.indexOf((char) t) < 0)) {
146                     code.append((char) t);
147                     i++;
148                 }
149             }
150             break;
151 
152         // 仅小写字母
153         case TYPE_LOWER_ONLY:
154             while (i < length) {
155                 int t = r.nextInt(123);
156                 if ((t >= 97)
157                         && (exChars == null || exChars.indexOf((char) t) < 0)) {
158                     code.append((char) t);
159                     i++;
160                 }
161             }
162             break;
163 
164         }
165 
166         return code.toString();
167     }
168 
169     /**
170      * 已有验证码,生成验证码图片
171      * 
172      * @param textCode
173      *            文本验证码
174      * @param width
175      *            图片宽度
176      * @param height
177      *            图片高度
178      * @param interLine
179      *            图片中干扰线的条数
180      * @param randomLocation
181      *            每个字符的高低位置是否随机
182      * @param backColor
183      *            图片颜色,若为null,则采用随机颜色
184      * @param foreColor
185      *            字体颜色,若为null,则采用随机颜色
186      * @param lineColor
187      *            干扰线颜色,若为null,则采用随机颜色
188      * @return 图片缓存对象
189      */
190     public static BufferedImage generateImageCode(String textCode, int width,
191             int height, int interLine, boolean randomLocation, Color backColor,
192             Color foreColor, Color lineColor) {
193 
194         BufferedImage bim = new BufferedImage(width, height,
195                 BufferedImage.TYPE_INT_RGB);
196         Graphics g = bim.getGraphics();
197         // 画背景图
198         g.setColor(backColor == null ? getRandomColor() : backColor);
199         g.fillRect(0, 0, width, height);
200 
201         // 画干扰线
202         Random r = new Random();
203         if (interLine > 0) {
204 
205             int x = 0, y = 0, x1 = width, y1 = 0;
206             for (int i = 0; i < interLine; i++) {
207                 g.setColor(lineColor == null ? getRandomColor() : lineColor);
208                 y = r.nextInt(height);
209                 y1 = r.nextInt(height);
210 
211                 g.drawLine(x, y, x1, y1);
212             }
213         }
214 
215         // 写验证码
216 
217         // g.setColor(getRandomColor());
218         // g.setColor(isSimpleColor?Color.BLACK:Color.WHITE);
219 
220         // 字体大小为图片高度的80%
221         int fsize = (int) (height * 0.8);
222         int fx = height - fsize;
223         int fy = fsize;
224 
225         g.setFont(new Font("Times New Roman", Font.BOLD, 20));
226 
227         // 写验证码字符
228         for (int i = 0; i < textCode.length(); i++) {
229             fy = randomLocation ? (int) ((Math.random() * 0.3 + 0.6) * height)
230                     : fy;// 每个字符高低是否随机
231             g.setColor(foreColor == null ? getRandomColor() : foreColor);
232             g.drawString(textCode.charAt(i) + "", fx, fy);
233             fx += fsize * 0.9;
234         }
235 
236         g.dispose();
237 
238         return bim;
239     }
240 
241     /**
242      * 生成图片验证码
243      * 
244      * @param type
245      *            验证码类型,参见本类的静态属性
246      * @param length
247      *            验证码字符长度,大于0的整数
248      * @param exChars
249      *            需排除的特殊字符
250      * @param width
251      *            图片宽度
252      * @param height
253      *            图片高度
254      * @param interLine
255      *            图片中干扰线的条数
256      * @param randomLocation
257      *            每个字符的高低位置是否随机
258      * @param backColor
259      *            图片颜色,若为null,则采用随机颜色
260      * @param foreColor
261      *            字体颜色,若为null,则采用随机颜色
262      * @param lineColor
263      *            干扰线颜色,若为null,则采用随机颜色
264      * @return 图片缓存对象
265      */
266     public static BufferedImage generateImageCode(int type, int length,
267             String exChars, int width, int height, int interLine,
268             boolean randomLocation, Color backColor, Color foreColor,
269             Color lineColor) {
270 
271         String textCode = generateTextCode(type, length, exChars);
272         BufferedImage bim = generateImageCode(textCode, width, height,
273                 interLine, randomLocation, backColor, foreColor, lineColor);
274 
275         return bim;
276     }
277 
278     /**
279      * 产生随机颜色
280      * 
281      * @return
282      */
283     private static Color getRandomColor() {
284         Random r = new Random();
285         Color c = new Color(r.nextInt(255), r.nextInt(255), r.nextInt(255));
286         return c;
287     }
288 
289     public static void main(String[] args) {
290 
291     }
292 
293 }

下面是项目的配置文件:

  1 <?xml version="1.0" encoding="UTF-8"?>
  2 <beans xmlns="http://www.springframework.org/schema/beans"
  3        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  4        xmlns:aop="http://www.springframework.org/schema/aop"
  5        xmlns:context="http://www.springframework.org/schema/context"
  6        xmlns:tx="http://www.springframework.org/schema/tx"
  7        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
  8           http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
  9           http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
 10           http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd
 11 " default-lazy-init="true">
 12 
 13 
 14     <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">
 15         <property name="realm" ref="myRealm"/>
 16         <!-- 使用下面配置的缓存管理器 -->
 17         <property name="cacheManager" ref="cacheManager"/>
 18     </bean>
 19     <!--自定义Realm-->
 20     <bean id="myRealm" class="com.etop.shiro.MyRealm"/>
 21 
 22     <!-- 配置shiro的过滤器工厂类,id- shiroFilter要和我们在web.xml中配置的过滤器一致 -->
 23     <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">
 24         <!-- 调用我们配置的权限管理器 -->
 25         <property name="securityManager" ref="securityManager"/>
 26         <!-- 配置我们的登录请求地址 -->
 27         <property name="loginUrl" value="/login.html"/>
 28         <!-- 配置我们在登录页登录成功后的跳转地址,如果你访问的是非/login地址,则跳到您访问的地址 -->
 29         <property name="successUrl" value="/user.html"/>
 30         <!-- 如果您请求的资源不再您的权限范围,则跳转到/403请求地址 -->
 31         <property name="unauthorizedUrl" value="/403.html"/>
 32         <!-- 权限配置 -->
 33        <!--  <property name="filterChainDefinitionMap" ref="chainDefinitionSectionMetaSource"/> -->
 34        <property name="filterChainDefinitions">
 35            <value>
 36                /static/** = anon
 37                /login.html = anon
 38                /verifyCode.html = anon
 39                /role/** = roles[admin]
 40                /user/** = roles[admin]
 41                /function/** = roles[admin]
 42                /permission/** = roles[admin]
 43                /** = authc
 44            </value>
 45        </property>
 46     </bean>
 47     <!--自定义filterChainDefinitionMap-->
 48     <!-- <bean id="chainDefinitionSectionMetaSource" class="com.etop.shiro.ChainDefinitionSectionMetaSource"/> -->
 49     <!--shiro缓存管理器-->
 50     <bean id="cacheManager" class="org.apache.shiro.cache.MemoryConstrainedCacheManager"/>
 51     <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor"/>
 52 
 53 
 54     <bean id="propertyConfigurer"
 55           class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer">
 56         <property name="locations" value="classpath:jdbc.properties"/>
 57     </bean>
 58 
 59     <!--hibernate session工厂设置-->
 60     <bean id="sessionFactory"
 61           class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
 62         <property name="dataSource" ref="dataSource"/>
 63         <property name="packagesToScan">
 64             <list>
 65                 <value>com.etop.pojo</value>
 66             </list>
 67         </property>
 68         <property name="hibernateProperties">
 69             <props>
 70                 <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop>
 71                 <prop key="hibernate.generate_statistics">false</prop>
 72                 <prop key="hibernate.show_sql">true</prop>
 73                 <prop key="hibernate.format_sql">false</prop>
 74                 <prop key="hibernate.jdbc.batch_size">50</prop>
 75                 <prop key="jdbc.use_scrollable_resultset">false</prop>
 76                 <prop key="javax.persistence.validation.mode">none</prop>
 77                 <prop key="hibernate.cache.use_second_level_cache">true</prop>
 78                 <prop key="hibernate.cache.use_query_cache">true</prop>
 79                 <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>
 80                 <prop key="jdbc.use_scrollable_resultset">false</prop>
 81             </props>
 82         </property>
 83     </bean>
 84 
 85     <!-- c3p0 configuration -->
 86     <bean id="mainDataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource" destroy-method="close">
 87         <property name="driverClass" value="${jdbc.driverClass}"/>
 88         <property name="jdbcUrl" value="${jdbc.url}"/>
 89         <property name="user" value="${jdbc.username}"/>
 90         <property name="password" value="${jdbc.password}"/>
 91         <property name="minPoolSize" value="${jdbc.minPoolSize}"/>
 92         <property name="maxPoolSize" value="${jdbc.maxPoolSize}"/>
 93         <property name="checkoutTimeout" value="${jdbc.checkoutTimeout}"/>
 94         <property name="maxStatements" value="${jdbc.maxStatements}"/>
 95         <property name="testConnectionOnCheckin" value="${jdbc.testConnectionOnCheckin}"/>
 96         <property name="idleConnectionTestPeriod" value="${jdbc.idleConnectionTestPeriod}"/>
 97     </bean>
 98 
 99     <bean id="dataSource"
100           class="org.springframework.jdbc.datasource.LazyConnectionDataSourceProxy">
101         <property name="targetDataSource">
102             <ref bean="mainDataSource"/>
103         </property>
104     </bean>
105     <context:annotation-config/>
106     <context:component-scan base-package="com.etop">
107         <context:exclude-filter type="regex" expression="com.cn.controller.*"/>
108     </context:component-scan>
109 
110     <bean id="transactionManager"
111           class="org.springframework.orm.hibernate4.HibernateTransactionManager">
112         <property name="sessionFactory">
113             <ref bean="sessionFactory"/>
114         </property>
115     </bean>
116 
117     <!-- 拦截配置 -->
118     <tx:advice id="txAdvice" transaction-manager="transactionManager">
119         <tx:attributes>
120             <!--说明事务类别 -->
121             <tx:method name="delete*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
122             <tx:method name="save*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
123             <tx:method name="add*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
124             <tx:method name="update*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
125             <tx:method name="batch*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
126             <tx:method name="sendOpen*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
127             <tx:method name="sendClose*" propagation="REQUIRED" read-only="false" rollback-for="java.lang.Exception"/>
128             <tx:method name="find*" propagation="REQUIRED" read-only="true"/>
129             <tx:method name="get*" propagation="REQUIRED" read-only="true"/>
130             <tx:method name="load*" propagation="REQUIRED" read-only="true"/>
131             <tx:method name="*" read-only="true"/>
132         </tx:attributes>
133     </tx:advice>
134 
135     <!-- 切入点 -->
136     <aop:config expose-proxy="true" proxy-target-class="true">
137         <!-- service层事务 -->
138         <aop:advisor id="serviceTx" advice-ref="txAdvice"
139                      pointcut="execution(public * com.etop.service.*.*(..))" order="1"/>
140     </aop:config>
141 
142     <tx:annotation-driven/>
143 
144 </beans>
 1 <ehcache>
 2 
 3     <!-- Sets the path to the directory where cache .data files are created.
 4 
 5          If the path is a Java System Property it is replaced by
 6          its value in the running VM.
 7 
 8          The following properties are translated:
 9          account.home - Account's home directory
10          account.dir - Account's current working directory
11          java.io.tmpdir - Default temp file path -->
12     <diskStore path="java.io.tmpdir"/>
13 
14 
15     <!--Default Cache configuration. These will applied to caches programmatically created through
16         the CacheManager.
17 
18         The following attributes are required for defaultCache:
19 
20         maxInMemory       - Sets the maximum number of objects that will be created in memory
21         eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
22                             is never expired.
23         timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
24                             if the element is not eternal. Idle time is now - last accessed time
25         timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
26                             if the element is not eternal. TTL is now - creation time
27         overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
28                             has reached the maxInMemory limit.
29 
30         -->
31     <defaultCache
32         maxElementsInMemory="10000"
33         eternal="false"
34         timeToIdleSeconds="120"
35         timeToLiveSeconds="120"
36         overflowToDisk="true"
37         />
38 
39     <!--Predefined caches.  Add your cache configuration settings here.
40         If you do not have a configuration for your cache a WARNING will be issued when the
41         CacheManager starts
42 
43         The following attributes are required for defaultCache:
44 
45         name              - Sets the name of the cache. This is used to identify the cache. It must be unique.
46         maxInMemory       - Sets the maximum number of objects that will be created in memory
47         eternal           - Sets whether elements are eternal. If eternal,  timeouts are ignored and the element
48                             is never expired.
49         timeToIdleSeconds - Sets the time to idle for an element before it expires. Is only used
50                             if the element is not eternal. Idle time is now - last accessed time
51         timeToLiveSeconds - Sets the time to live for an element before it expires. Is only used
52                             if the element is not eternal. TTL is now - creation time
53         overflowToDisk    - Sets whether elements can overflow to disk when the in-memory cache
54                             has reached the maxInMemory limit.
55 
56         -->
57     <!-- Place configuration for your caches following -->
58     <cache name="org.hibernate.cache.StandardQueryCache"
59            maxElementsInMemory="10000" eternal="false" 
60            timeToIdleSeconds="300"
61            timeToLiveSeconds="4200" overflowToDisk="true" />
62     
63     <cache name="org.hibernate.cache.spi.UpdateTimestampsCache"
64            maxElementsInMemory="5000" 
65            eternal="true" 
66            overflowToDisk="true" />
67 
68 
69 </ehcache>
 1 jdbc.driverClass = com.mysql.jdbc.Driver
 2 jdbc.url = jdbc:mysql://127.0.0.1:3306/shiro
 3 jdbc.username = root
 4 jdbc.password = root
 5 jdbc.minPoolSize=2
 6 jdbc.maxPoolSize=20
 7 jdbc.checkoutTimeout=3000
 8 jdbc.maxStatements=50
 9 jdbc.testConnectionOnCheckin = false
10 jdbc.idleConnectionTestPeriod = 18000
1 log4j.rootLogger=info,stdout
2 
3 log4j.appender.stdout = org.apache.log4j.ConsoleAppender
4 log4j.appender.stdout.Target = System.out
5 log4j.appender.stdout.layout = org.apache.log4j.PatternLayout
6 log4j.appender.stdout.layout.ConversionPattern=%d %p [%c] - %m%n
7 Hibernate
8 #log4j.logger.org.hibernate=debug
9 #log4j.logger.org.hibernate.SQL=debug

数据库文件(数据库用的是mysql):

  1 /*
  2 SQLyog 企业版 - MySQL GUI v8.14 
  3 MySQL - 5.5.19 : Database - shiro
  4 *********************************************************************
  5 */
  6 
  7 
  8 /*!40101 SET NAMES utf8 */;
  9 
 10 /*!40101 SET SQL_MODE=''*/;
 11 
 12 /*!40014 SET @OLD_UNIQUE_CHECKS=@@UNIQUE_CHECKS, UNIQUE_CHECKS=0 */;
 13 /*!40014 SET @OLD_FOREIGN_KEY_CHECKS=@@FOREIGN_KEY_CHECKS, FOREIGN_KEY_CHECKS=0 */;
 14 /*!40101 SET @OLD_SQL_MODE=@@SQL_MODE, SQL_MODE='NO_AUTO_VALUE_ON_ZERO' */;
 15 /*!40111 SET @OLD_SQL_NOTES=@@SQL_NOTES, SQL_NOTES=0 */;
 16 CREATE DATABASE /*!32312 IF NOT EXISTS*/`shiro` /*!40100 DEFAULT CHARACTER SET utf8 */;
 17 
 18 USE `shiro`;
 19 
 20 /*Table structure for table `t_function` */
 21 
 22 DROP TABLE IF EXISTS `t_function`;
 23 
 24 CREATE TABLE `t_function` (
 25   `id` int(11) NOT NULL,
 26   `value` varchar(50) DEFAULT NULL,
 27   `permission_id` int(11) DEFAULT NULL,
 28   `role_id` int(11) DEFAULT NULL,
 29   `type` varchar(50) DEFAULT NULL,
 30   PRIMARY KEY (`id`),
 31   KEY `fk_function_role` (`role_id`),
 32   KEY `fk_function_permission` (`permission_id`),
 33   CONSTRAINT `fk_function_permission` FOREIGN KEY (`permission_id`) REFERENCES `t_permission` (`id`),
 34   CONSTRAINT `fk_function_role` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`)
 35 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 36 
 37 /*Data for the table `t_function` */
 38 
 39 insert  into `t_function`(`id`,`value`,`permission_id`,`role_id`,`type`) values (2,'/login.html',NULL,NULL,'anon'),(3,'/user.html',4,NULL,'perms'),(4,'/user/add.html',1,NULL,'perms'),(5,'/user/del.html',2,NULL,'perms'),(6,'/user/edit.html',3,NULL,'perms'),(7,'/test.html',NULL,4,'roles'),(8,'/verifyCode.html',NULL,NULL,'anon'),(9,'/user/userList.html',NULL,4,'roles');
 40 
 41 /*Table structure for table `t_permission` */
 42 
 43 DROP TABLE IF EXISTS `t_permission`;
 44 
 45 CREATE TABLE `t_permission` (
 46   `id` int(11) NOT NULL,
 47   `permissionname` varchar(45) NOT NULL,
 48   PRIMARY KEY (`id`)
 49 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 50 
 51 /*Data for the table `t_permission` */
 52 
 53 insert  into `t_permission`(`id`,`permissionname`) values (1,'user:add'),(2,'user:del'),(3,'user:update'),(4,'user:query');
 54 
 55 /*Table structure for table `t_role` */
 56 
 57 DROP TABLE IF EXISTS `t_role`;
 58 
 59 CREATE TABLE `t_role` (
 60   `id` int(11) NOT NULL,
 61   `rolename` varchar(45) DEFAULT NULL,
 62   `description` varchar(45) DEFAULT NULL,
 63   PRIMARY KEY (`id`)
 64 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 65 
 66 /*Data for the table `t_role` */
 67 
 68 insert  into `t_role`(`id`,`rolename`,`description`) values (1,'admin','超级管理员'),(2,'manager','系统管理员'),(3,'normal','普通管理员'),(4,'user','普通用户');
 69 
 70 /*Table structure for table `t_role_permission` */
 71 
 72 DROP TABLE IF EXISTS `t_role_permission`;
 73 
 74 CREATE TABLE `t_role_permission` (
 75   `role_id` int(11) DEFAULT NULL,
 76   `permission_id` int(11) DEFAULT NULL
 77 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 78 
 79 /*Data for the table `t_role_permission` */
 80 
 81 insert  into `t_role_permission`(`role_id`,`permission_id`) values (1,1),(1,2),(1,3),(1,4),(2,1),(2,2),(2,3),(3,4),(4,4),(4,3);
 82 
 83 /*Table structure for table `t_user` */
 84 
 85 DROP TABLE IF EXISTS `t_user`;
 86 
 87 CREATE TABLE `t_user` (
 88   `id` int(11) NOT NULL,
 89   `username` varchar(45) DEFAULT NULL,
 90   `password` varchar(45) DEFAULT NULL,
 91   PRIMARY KEY (`id`)
 92 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
 93 
 94 /*Data for the table `t_user` */
 95 
 96 insert  into `t_user`(`id`,`username`,`password`) values (1,'admin1','670b14728ad9902aecba32e22fa4f6bd'),(2,'admin2','670b14728ad9902aecba32e22fa4f6bd'),(3,'admin3','670b14728ad9902aecba32e22fa4f6bd'),(4,'admin4','670b14728ad9902aecba32e22fa4f6bd');
 97 
 98 /*Table structure for table `t_user_role` */
 99 
100 DROP TABLE IF EXISTS `t_user_role`;
101 
102 CREATE TABLE `t_user_role` (
103   `user_id` int(11) DEFAULT NULL,
104   `role_id` int(11) DEFAULT NULL,
105   KEY `FK_role_user` (`role_id`),
106   KEY `FK_user_role` (`user_id`),
107   CONSTRAINT `FK_role_user` FOREIGN KEY (`role_id`) REFERENCES `t_role` (`id`),
108   CONSTRAINT `FK_user_role` FOREIGN KEY (`user_id`) REFERENCES `t_user` (`id`)
109 ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
110 
111 /*Data for the table `t_user_role` */
112 
113 insert  into `t_user_role`(`user_id`,`role_id`) values (1,1),(1,3),(2,2),(2,3),(3,3),(4,4);
114 
115 /*!40101 SET SQL_MODE=@OLD_SQL_MODE */;
116 /*!40014 SET FOREIGN_KEY_CHECKS=@OLD_FOREIGN_KEY_CHECKS */;
117 /*!40014 SET UNIQUE_CHECKS=@OLD_UNIQUE_CHECKS */;
118 /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */;
原文地址:https://www.cnblogs.com/lr393993507/p/5257162.html