Kaynağa Gözat

配置文件更新

ms-dev 7 yıl önce
ebeveyn
işleme
da21280bb3
67 değiştirilmiş dosya ile 6598 ekleme ve 171 silme
  1. 3 5
      src/main/java/net/mingsoft/MSApplication.java
  2. 27 0
      src/main/java/net/mingsoft/Test.java
  3. 0 33
      src/main/java/net/mingsoft/config/EhCacheConfig.java
  4. 33 0
      src/main/java/net/mingsoft/config/FreemarkerConfig.java
  5. 0 113
      src/main/java/net/mingsoft/config/ShiroConfig.java
  6. 67 0
      src/main/java/net/mingsoft/config/ShiroConfiguration.java
  7. 2 1
      src/main/resources/application-dev.yml
  8. 17 19
      src/main/resources/application.yml
  9. 44 0
      src/main/webapp/WEB-INF/manager/app/app.ftl
  10. 24 0
      src/main/webapp/WEB-INF/manager/basic/basic.ftl
  11. 46 0
      src/main/webapp/WEB-INF/manager/basic/basic_list.ftl
  12. 45 0
      src/main/webapp/WEB-INF/manager/basic/city/form.ftl
  13. 118 0
      src/main/webapp/WEB-INF/manager/basic/city/index.ftl
  14. 63 0
      src/main/webapp/WEB-INF/manager/basic/file/form.ftl
  15. 235 0
      src/main/webapp/WEB-INF/manager/basic/file/index.ftl
  16. 120 0
      src/main/webapp/WEB-INF/manager/basic/index.ftl
  17. 217 0
      src/main/webapp/WEB-INF/manager/basic/manager/index.ftl
  18. 48 0
      src/main/webapp/WEB-INF/manager/basic/people/form.ftl
  19. 131 0
      src/main/webapp/WEB-INF/manager/basic/people/index.ftl
  20. 110 0
      src/main/webapp/WEB-INF/manager/basic/role/form.ftl
  21. 118 0
      src/main/webapp/WEB-INF/manager/basic/role/index.ftl
  22. 51 0
      src/main/webapp/WEB-INF/manager/category/form.ftl
  23. 114 0
      src/main/webapp/WEB-INF/manager/category/index.ftl
  24. 2 0
      src/main/webapp/WEB-INF/manager/category/shiro-button.ftl
  25. 2 0
      src/main/webapp/WEB-INF/manager/category/shiro-update.ftl
  26. 188 0
      src/main/webapp/WEB-INF/manager/column/form.ftl
  27. 166 0
      src/main/webapp/WEB-INF/manager/column/index.ftl
  28. 2 0
      src/main/webapp/WEB-INF/manager/column/shiro-button.ftl
  29. 2 0
      src/main/webapp/WEB-INF/manager/column/shiro-update.ftl
  30. 21 0
      src/main/webapp/WEB-INF/manager/include/head-file.ftl
  31. 87 0
      src/main/webapp/WEB-INF/manager/include/macro.ftl
  32. 173 0
      src/main/webapp/WEB-INF/manager/include/manager.ftl
  33. 98 0
      src/main/webapp/WEB-INF/manager/include/meta.ftl
  34. 6 0
      src/main/webapp/WEB-INF/manager/include/ui/attributes.ftl
  35. 333 0
      src/main/webapp/WEB-INF/manager/include/ui/button.ftl
  36. 5 0
      src/main/webapp/WEB-INF/manager/include/ui/checkboxlist-item.ftl
  37. 46 0
      src/main/webapp/WEB-INF/manager/include/ui/checkboxlist.ftl
  38. 16 0
      src/main/webapp/WEB-INF/manager/include/ui/common-attributes.ftl
  39. 15 0
      src/main/webapp/WEB-INF/manager/include/ui/control.ftl
  40. 81 0
      src/main/webapp/WEB-INF/manager/include/ui/date.ftl
  41. 98 0
      src/main/webapp/WEB-INF/manager/include/ui/editor.ftl
  42. 19 0
      src/main/webapp/WEB-INF/manager/include/ui/file.ftl
  43. 139 0
      src/main/webapp/WEB-INF/manager/include/ui/form.ftl
  44. 16 0
      src/main/webapp/WEB-INF/manager/include/ui/index.ftl
  45. 167 0
      src/main/webapp/WEB-INF/manager/include/ui/input-tree.ftl
  46. 232 0
      src/main/webapp/WEB-INF/manager/include/ui/input.ftl
  47. 175 0
      src/main/webapp/WEB-INF/manager/include/ui/modal.ftl
  48. 51 0
      src/main/webapp/WEB-INF/manager/include/ui/page.ftl
  49. 7 0
      src/main/webapp/WEB-INF/manager/include/ui/radio-item.ftl
  50. 76 0
      src/main/webapp/WEB-INF/manager/include/ui/select.ftl
  51. 82 0
      src/main/webapp/WEB-INF/manager/include/ui/table.ftl
  52. 41 0
      src/main/webapp/WEB-INF/manager/include/ui/textarea.ftl
  53. 43 0
      src/main/webapp/WEB-INF/manager/include/ui/time.ftl
  54. 480 0
      src/main/webapp/WEB-INF/manager/include/ui/tree.ftl
  55. 344 0
      src/main/webapp/WEB-INF/manager/include/ui/upload.ftl
  56. 198 0
      src/main/webapp/WEB-INF/manager/index.ftl
  57. 247 0
      src/main/webapp/WEB-INF/manager/login.ftl
  58. 15 0
      src/main/webapp/WEB-INF/manager/main.ftl
  59. 360 0
      src/main/webapp/WEB-INF/manager/manager/manager.ftl
  60. 248 0
      src/main/webapp/WEB-INF/manager/model/index.ftl
  61. 9 0
      src/main/webapp/WEB-INF/manager/rf.html
  62. 122 0
      src/main/webapp/WEB-INF/manager/role/role.ftl
  63. 177 0
      src/main/webapp/WEB-INF/manager/role/role_list.ftl
  64. 41 0
      src/main/webapp/WEB-INF/manager/template/template_edit_file.ftl
  65. 152 0
      src/main/webapp/WEB-INF/manager/template/template_file_list.ftl
  66. 93 0
      src/main/webapp/WEB-INF/manager/template/template_list.ftl
  67. 90 0
      src/main/webapp/WEB-INF/web.xml

+ 3 - 5
src/main/java/net/mingsoft/MSApplication.java

@@ -7,15 +7,13 @@ import org.springframework.boot.web.servlet.ServletComponentScan;
 import org.springframework.context.annotation.ComponentScan;
 
 @SpringBootApplication
-@ComponentScan(basePackages = {"com.mingsoft","net.mingsoft"})
+@ComponentScan(basePackages = {"net.mingsoft"})
 @MapperScan(basePackages={"**.dao"})
-@ServletComponentScan(basePackages = {"com.mingsoft","net.mingsoft"})
+@ServletComponentScan(basePackages = {"net.mingsoft"})
 public class MSApplication {
 
 	public static void main(String[] args) {
 		SpringApplication.run(MSApplication.class, args);
 	}
 
-}
-
-	
+}

+ 27 - 0
src/main/java/net/mingsoft/Test.java

@@ -0,0 +1,27 @@
+package net.mingsoft;
+
+import javax.servlet.http.HttpServletRequest;
+
+import org.springframework.stereotype.Controller;
+import org.springframework.web.bind.annotation.RequestMapping;
+
+import net.mingsoft.basic.action.BaseAction;
+
+@Controller
+@RequestMapping("/")
+public class  Test {
+
+
+	/**
+	 * 加载管理员登录界面
+	 * 
+	 * @param request
+	 *            请求对象
+	 * @return 管理员登录界面地址
+	 */
+	@SuppressWarnings("resource")
+	@RequestMapping("/a")
+	public String login(HttpServletRequest request) {
+		return "/login";
+	}
+}

+ 0 - 33
src/main/java/net/mingsoft/config/EhCacheConfig.java

@@ -1,33 +0,0 @@
-package net.mingsoft.config;
-
-
-import net.sf.ehcache.CacheManager;
-import org.springframework.cache.annotation.EnableCaching;
-import org.springframework.cache.ehcache.EhCacheCacheManager;
-import org.springframework.cache.ehcache.EhCacheManagerFactoryBean;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.core.io.ClassPathResource;
-
-@Configuration
-@EnableCaching
-public class EhCacheConfig {
-
-    /**
-     * EhCache的配置
-     */
-    @Bean
-    public EhCacheCacheManager cacheManager(CacheManager cacheManager) {
-        return new EhCacheCacheManager(cacheManager);
-    }
-
-    /**
-     * EhCache的配置
-     */
-    @Bean
-    public EhCacheManagerFactoryBean ehcache() {
-        EhCacheManagerFactoryBean ehCacheManagerFactoryBean = new EhCacheManagerFactoryBean();
-        ehCacheManagerFactoryBean.setConfigLocation(new ClassPathResource("ehcache.xml"));
-        return ehCacheManagerFactoryBean;
-    }
-}

+ 33 - 0
src/main/java/net/mingsoft/config/FreemarkerConfig.java

@@ -0,0 +1,33 @@
+package net.mingsoft.config;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.annotation.PostConstruct;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer;
+
+import com.jagregory.shiro.freemarker.ShiroTags;
+
+import freemarker.template.TemplateException;
+
+@Configuration
+public class FreemarkerConfig {
+	
+	@Autowired  
+    protected freemarker.template.Configuration configuration;  
+	@Autowired  
+	protected org.springframework.web.servlet.view.freemarker.FreeMarkerConfigurer configurer;  
+    @Autowired  
+    protected org.springframework.web.servlet.view.freemarker.FreeMarkerViewResolver resolver;  
+    @Autowired  
+    protected org.springframework.web.servlet.view.InternalResourceViewResolver springResolver;
+
+    @PostConstruct
+	public void init() throws IOException, TemplateException {
+		configuration.setSharedVariable("shiro", new ShiroTags());
+	}
+
+}

+ 0 - 113
src/main/java/net/mingsoft/config/ShiroConfig.java

@@ -1,113 +0,0 @@
-package net.mingsoft.config;
-
-import java.util.LinkedHashMap;
-import java.util.Map;
-import java.util.Properties;
-
-import org.apache.shiro.authc.credential.HashedCredentialsMatcher;
-import org.apache.shiro.mgt.SecurityManager;
-import org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor;
-import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
-import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
-import org.springframework.beans.factory.annotation.Value;
-import org.springframework.context.annotation.Bean;
-import org.springframework.context.annotation.Configuration;
-import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
-
-import net.mingsoft.basic.configurer.ShiroTagFreeMarkderConfigurer;
-
-import net.mingsoft.basic.security.BaseAuthRealm;
-
-
-@Configuration
-public class ShiroConfig {
-
-	@Value("${ms.manager.path}")
-	private String managerPath;
-	
-	@Bean
-	public ShiroTagFreeMarkderConfigurer freemarkerConfig() {
-		return new ShiroTagFreeMarkderConfigurer();
-	}
-
-	@Bean
-	public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
-		ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
-		shiroFilterFactoryBean.setSecurityManager(securityManager);
-		// 拦截器.
-		Map<String, String> filterChainDefinitionMap = new LinkedHashMap<String, String>();
-		// 配置不会被拦截的链接 顺序判断,因为前端模板采用了thymeleaf,这里不能直接使用 ("/static/**", "anon")来配置匿名访问,必须配置到每个静态目录
-		filterChainDefinitionMap.put("/static/**", "anon");
-		filterChainDefinitionMap.put("/html/**", "anon");
-		filterChainDefinitionMap.put(managerPath+"/checkLogin.do", "anon");
-		filterChainDefinitionMap.put(managerPath+"/login.do", "anon");
-		// 配置退出 过滤器,其中的具体的退出代码Shiro已经替我们实现了
-		filterChainDefinitionMap.put("/logout", "logout");
-		// <!-- 过滤链定义,从上向下顺序执行,一般将/**放在最为下边 -->:这是一个坑呢,一不小心代码就不好使了;
-		// <!-- authc:所有url都必须认证通过才可以访问; anon:所有url都都可以匿名访问-->
-		filterChainDefinitionMap.put("/**", "anon");
-		// 如果不设置默认会自动寻找Web工程根目录下的"/login.jsp"页面
-		shiroFilterFactoryBean.setLoginUrl("/login");
-		// 登录成功后要跳转的链接
-		//shiroFilterFactoryBean.setSuccessUrl("/index");
-
-		// 未授权界面;
-		shiroFilterFactoryBean.setUnauthorizedUrl("/403");
-		shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
-		return shiroFilterFactoryBean;
-	}
-
-	/**
-	 * 凭证匹配器 (由于我们的密码校验交给Shiro的SimpleAuthenticationInfo进行处理了 )
-	 * 
-	 * @return
-	 */
-	@Bean
-	public HashedCredentialsMatcher hashedCredentialsMatcher() {
-		HashedCredentialsMatcher hashedCredentialsMatcher = new HashedCredentialsMatcher();
-		hashedCredentialsMatcher.setHashAlgorithmName("md5");// 散列算法:这里使用MD5算法;
-		hashedCredentialsMatcher.setHashIterations(2);// 散列的次数,比如散列两次,相当于
-														// md5(md5(""));
-		return hashedCredentialsMatcher;
-	}
-
-	@Bean
-	public BaseAuthRealm myShiroRealm() {
-		BaseAuthRealm myShiroRealm = new BaseAuthRealm();
-		myShiroRealm.setCredentialsMatcher(hashedCredentialsMatcher());
-		return myShiroRealm;
-	}
-
-	@Bean
-	public SecurityManager securityManager() {
-		DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
-		securityManager.setRealm(myShiroRealm());
-		return securityManager;
-	}
-
-	/**
-	 * 开启shiro aop注解支持. 使用代理方式;所以需要开启代码支持;
-	 * 
-	 * @param securityManager
-	 * @return
-	 */
-	@Bean
-	public AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor(SecurityManager securityManager) {
-		AuthorizationAttributeSourceAdvisor authorizationAttributeSourceAdvisor = new AuthorizationAttributeSourceAdvisor();
-		authorizationAttributeSourceAdvisor.setSecurityManager(securityManager);
-		return authorizationAttributeSourceAdvisor;
-	}
-
-	@Bean(name = "simpleMappingExceptionResolver")
-	public SimpleMappingExceptionResolver createSimpleMappingExceptionResolver() {
-		SimpleMappingExceptionResolver r = new SimpleMappingExceptionResolver();
-		Properties mappings = new Properties();
-		mappings.setProperty("DatabaseException", "databaseError");// 数据库异常处理
-		mappings.setProperty("UnauthorizedException", "/user/403");
-		r.setExceptionMappings(mappings); // None by default
-		r.setDefaultErrorView("error"); // No default
-		r.setExceptionAttribute("exception"); // Default is "exception"
-		// r.setWarnLogCategory("example.MvcLogger"); // No default
-		return r;
-	}
-}

+ 67 - 0
src/main/java/net/mingsoft/config/ShiroConfiguration.java

@@ -0,0 +1,67 @@
+package net.mingsoft.config;
+
+import java.util.LinkedHashMap;
+import java.util.Map;
+
+import org.apache.shiro.spring.web.ShiroFilterFactoryBean;
+import org.apache.shiro.web.mgt.DefaultWebSecurityManager;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import net.mingsoft.basic.security.BaseAuthRealm;
+
+import org.apache.shiro.mgt.SecurityManager;
+
+@Configuration
+public class ShiroConfiguration {
+	@Bean
+    public ShiroFilterFactoryBean shirFilter(SecurityManager securityManager) {
+        ShiroFilterFactoryBean shiroFilterFactoryBean = new ShiroFilterFactoryBean();
+        // 必须设置 SecurityManager
+        shiroFilterFactoryBean.setSecurityManager(securityManager);
+        // setLoginUrl 如果不设置值,默认会自动寻找Web工程根目录下的"/login.jsp"页面 或 "/login" 映射
+        shiroFilterFactoryBean.setLoginUrl("/notLogin");
+        // 设置无权限时跳转的 url;
+        shiroFilterFactoryBean.setUnauthorizedUrl("/notRole");
+
+        // 设置拦截器
+        Map<String, String> filterChainDefinitionMap = new LinkedHashMap<>();
+        //游客,开发权限
+        filterChainDefinitionMap.put("/guest/**", "anon");
+        //用户,需要角色权限 “user”
+        filterChainDefinitionMap.put("/user/**", "roles[user]");
+        //管理员,需要角色权限 “admin”
+        filterChainDefinitionMap.put("/admin/**", "roles[admin]");
+        //开放登陆接口
+        filterChainDefinitionMap.put("/ms/login.do", "anon");
+        filterChainDefinitionMap.put("/ms/checkLogin.do", "anon");
+        //其余接口一律拦截
+        //主要这行代码必须放在所有权限设置的最后,不然会导致所有 url 都被拦截
+        filterChainDefinitionMap.put("/**", "anon");
+
+        shiroFilterFactoryBean.setFilterChainDefinitionMap(filterChainDefinitionMap);
+        return shiroFilterFactoryBean;
+    }
+
+    /**
+     * 注入 securityManager
+     */
+    @Bean
+    public SecurityManager securityManager() {
+        DefaultWebSecurityManager securityManager = new DefaultWebSecurityManager();
+        // 设置realm.
+        securityManager.setRealm(customRealm());
+        return securityManager;
+    }
+
+    /**
+     * 自定义身份认证 realm;
+     * <p>
+     * 必须写这个类,并加上 @Bean 注解,目的是注入 CustomRealm,
+     * 否则会影响 CustomRealm类 中其他类的依赖注入
+     */
+    @Bean
+    public BaseAuthRealm customRealm() {
+        return new BaseAuthRealm();
+    }
+}

+ 2 - 1
src/main/resources/application-dev.yml

@@ -3,4 +3,5 @@ spring:
     url: jdbc:mysql://127.0.0.1:3306/db-mcms-4-6-1?autoReconnect=true&useUnicode=true&characterEncoding=utf8&useSSL=false
     username: root
     password: root
-    filters: wall,mergeStat
+    filters: wall,mergeStat
+    type: com.alibaba.druid.pool.DruidDataSource

+ 17 - 19
src/main/resources/application.yml

@@ -2,23 +2,6 @@ server:
   port: 8081
   tomcat:
     max-http-header-size: 10240     #单位:字节
-ms:
- manager: 
-  path: ms
-  view: 
-   path: /WEB-INF/manager
- session: 
-  timeout: 1800000 #会话超时, 单位:毫秒, 20m=1200000ms, 30m=1800000ms, 60m=3600000ms
-  validation.interval: 120000 #会话清理间隔时间, 单位:毫秒,2m=120000ms
- upload: 
-   path: /upload 
-   denied: exe
-   allowed: jpg
-   max:
-    size: 1
-   memory:
-    size: 4096
-     
 spring:
   profiles:
     active: dev
@@ -68,5 +51,20 @@ logging:
   #分包配置级别,即不同的目录下可以使用不同的级别
   net.mingsoft: trace
   com.mingsoft: trace
-
-
+      
+ms:
+ manager: 
+  path: /ms
+  view:  #已过期
+   path:  
+ session: 
+  timeout: 1800000 #会话超时, 单位:毫秒, 20m=1200000ms, 30m=1800000ms, 60m=3600000ms
+  validation.interval: 120000 #会话清理间隔时间, 单位:毫秒,2m=120000ms
+ upload: 
+   path: /upload 
+   denied: exe
+   allowed: jpg
+   max:
+    size: 1
+   memory:
+    size: 4096

+ 44 - 0
src/main/webapp/WEB-INF/manager/app/app.ftl

@@ -0,0 +1,44 @@
+<@ms.html5>
+	<@ms.nav title="应用设置">
+		<@shiro.hasPermission name="app:update"><@ms.saveButton title="" postForm="appForm"/></@shiro.hasPermission> 
+	</@ms.nav>
+	<@ms.panel>
+		<@ms.form isvalidation=true name="appForm"  action="${managerPath}/app/update.do">
+			<@ms.hidden name="appId" value="${app.appId?default(0)}" />
+			<@ms.text name="appName" width="500" label="网站标题" value="${app.appName?default('')}"  title="网站标题" placeholder="请输入网站标题" validation={"maxlength":"50","required":"true", "data-bv-notempty-message":"必填项目","data-bv-stringlength-message":"网站标题在50个字符以内!"}/>
+  			<!--网站Logo,暂时不兼容-->
+  			<@ms.formRow label="网站Logo" help="提示:文章缩略图,支持jpg,png格式">
+  			  	<@ms.uploadImg path="app" inputName="appLogo" size="1"  maxSize="1" imgs="${app.appLogo!('')}"/>
+  			</@ms.formRow>
+  			<@ms.checkbox name="appMobileStyle" width="200"  list=[{"id":"m","value":"启用"}] listKey="id" listValue="value" valueList=["${app.appMobileStyle!('')}"] label="启用移动端" 
+  				help="启用后手机用户访问网站会显示手机版网页,前提是网站必需提供移动端皮肤,相关教程:<a href='http://ms.ming-soft.com/mbbs/13086/detail.do' target='_blank'>铭飞移动端开发教程</a>"/>
+			<@ms.select name="appStyle" width="300" id="appStyle" label="模板风格"  />
+			<@ms.textarea name="appKeyword"  label="关键字" value="${app.appKeyword?default('')}" rows="4"  placeholder="请输入关键字"/>
+			<@ms.textarea name="appDescription"  label="描述"  value="${app.appDescription?default('')}" rows="4"  placeholder="请输入站点描述"/>
+			<@ms.textarea name="appCopyright"  label="版权信息" value="${app.appCopyright?default('')}" rows="4"  placeholder="请输入版权信息"/>
+		</@ms.form>	
+	</@ms.panel>
+</@ms.html5>	  
+<script>
+	$(function(){
+		<#if app.appId != 0>
+				ms.get("${managerPath}/template/queryAppTemplateSkin.do",null,function(msg){
+						if(msg.fileName != null && msg.fileName.length != 0){
+							//清空默认信息
+							$("#appStyle").html("");
+				   			for(var i=0; i<msg.fileName.length; i++){
+				   				if ("${app.appStyle?default('')}"==msg.fileName[i]) {
+				   					$("#appStyle").append("<option value="+msg.fileName[i]+" selected>"+msg.fileName[i]+"</option>")
+				   				} else {
+					   				$("#appStyle").append("<option value="+msg.fileName[i]+">"+msg.fileName[i]+"</option>")
+					   			}
+					   		}
+				   		}else{
+				   			$(".appStyle").append("<option>暂无模版</option>");
+				   		}
+				});				
+		</#if>
+	});
+</script>
+
+	

+ 24 - 0
src/main/webapp/WEB-INF/manager/basic/basic.ftl

@@ -0,0 +1,24 @@
+<@ms.html5>
+    <@ms.nav title="基础内容更新">
+    	<@ms.saveButton postForm="basicForm"/>
+    </@ms.nav>
+    <@ms.panel>
+
+						<#assign basicTitle="">
+						<#assign basicId="0">
+						<#assign basicDescription="">
+						<#assign action="${managerPath}/basic/save.do">
+						<#if basic?has_content>
+							<#assign basicTitle="${basic.basicTitle?default('')}">
+							<#assign basicDescription="${basic.basicDescription?default('')}">
+							<#assign basicId="${basic.basicId}">
+							<#assign action="${managerPath}/basic/update.do">
+						</#if>    
+ 						<@ms.form action="${action}" name="basicForm" redirect="${managerPath}/basic/${categoryId?default('0')}/list.do">
+								<@ms.hidden  name="basicId" value="${basicId?default('')}"/>
+								<@ms.hidden  name="basicCategoryId" value="${categoryId?default('0')}"/>
+								<@ms.text label="标题" name="basicTitle" value="${basicTitle?default('')}" size="33" style="width:40%" maxlength="120" />
+								<@ms.textarea label="描述" name="basicDescription" value="${basicDescription?default('')}" cols="110" rows="5" maxlength="1000" />
+						</@ms.form>
+    </@ms.panel>
+</@ms.html5>

+ 46 - 0
src/main/webapp/WEB-INF/manager/basic/basic_list.ftl

@@ -0,0 +1,46 @@
+<@ms.html5>
+    <@ms.nav title="基础内容管理"></@ms.nav>
+    
+    <@ms.panel>
+		<@ms.searchForm name="basicForm" action="${managerPath}/basic/${categoryId?default(0)}/list.do">
+			<@ms.text label="关键字" name="keyword" placeholder="输入关键字" value="${keyword?default('')}"/>
+			<@ms.searchFormButton>
+				<@ms.queryButton form="basicForm"/>								
+			</@ms.searchFormButton>
+		</@ms.searchForm>
+		    
+		<@ms.panelNav>
+		    <@ms.addButton  url="${managerPath}/basic/add.do?categoryId=${categoryId?default(0)}&categoryTitle=${categoryTitle?default(0)}"/>
+		    <@ms.delButton fieldName="basicId" onclick="remove"/>
+		</@ms.panelNav>
+<@ms.table head=['编号,100',"标题"] 
+           filed=["basicId","basicTitle"] 
+           listItem="basicList" 
+           id="basicId" 
+           checkbox="basicId" 
+           editField=["basicTitle"]
+           editJs="edit"
+           
+/>
+					
+						<#if page?has_content>
+							<@ms.showPage page=page/>
+						</#if>						  
+    </@ms.panel>
+</@ms.html5>
+
+	
+<script>
+		
+		function edit(id) {
+				location.href = base+"${baseManager}/basic/"+id+"/edit.do";
+		}
+		
+		function remove(ids) {
+			ms.post("${managerPath}/basic/allDelete.do","basicIds="+ids,function(msg){
+				if(msg.result){
+					location.reload();
+				}
+			});
+		}
+</script>

+ 45 - 0
src/main/webapp/WEB-INF/manager/basic/city/form.ftl

@@ -0,0 +1,45 @@
+<@ms.html5>
+	 <@ms.nav title="省市县镇村数据编辑" back=true>
+    	<@ms.saveButton  onclick="save()"/>
+    </@ms.nav>
+    <@ms.panel>
+    	<@ms.form name="cityForm" isvalidation=true>
+    		<@ms.hidden name="id" value="${cityEntity.id?default('')}"/>
+    	</@ms.form>
+    </@ms.panel>
+</@ms.html5>
+<script>
+	var url = "${managerPath}/basic/city/save.do";
+	if($("input[name = 'id']").val() > 0){
+		url = "${managerPath}/basic/city/update.do";
+		$(".btn-success").text("更新");
+	}
+	//编辑按钮onclick
+	function save() {
+		$("#cityForm").data("bootstrapValidator").validate();
+			var isValid = $("#cityForm").data("bootstrapValidator").isValid();
+			if(!isValid) {
+				<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+				return;
+		}
+		var btnWord =$(".btn-success").text();
+		$(".btn-success").text(btnWord+"中...");
+		$(".btn-success").prop("disabled",true);
+		$.ajax({
+			type:"post",
+			dataType:"json",
+			data:$("form[name = 'cityForm']").serialize(),
+			url:url,
+			success: function(status) {
+				if(status.result == true) { 
+					<@ms.notify msg="保存或更新成功" type= "success" />
+					location.href = "${managerPath}/basic/city/index.do";
+				}
+				else{
+					<@ms.notify msg= "保存或更新失败!" type= "danger" />
+					location.href= "${managerPath}/basic/city/index.do";
+				}
+			}
+		})
+	}	
+</script>

+ 118 - 0
src/main/webapp/WEB-INF/manager/basic/city/index.ftl

@@ -0,0 +1,118 @@
+<@ms.html5>
+	<@ms.nav title="省市县镇村数据管理"></@ms.nav>
+	<@ms.searchForm name="searchForm" isvalidation=true>
+		<@ms.text label="省" name="provinceName" value=""  width="240px;" placeholder="请输入省/直辖市/自治区级名称" />
+		<@ms.text label="市" name="cityName" value=""  width="240px;" placeholder="请输入市级名称" />
+		<@ms.text label="县" name="countyName" value=""  width="240px;" placeholder="请输入县/区级名称" />
+		<@ms.text label="镇" name="townName" value=""  width="240px;" placeholder="请输入街道/镇级名称" />
+		<@ms.text label="村" name="villageName" value=""  width="240px;" placeholder="请输入村委会名称" />
+		<@ms.searchFormButton>
+			 <@ms.queryButton onclick="search()"/> 
+		</@ms.searchFormButton>			
+	</@ms.searchForm>
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNav>
+				<@ms.buttonGroup>
+				</@ms.buttonGroup>
+			</@ms.panelNav>
+		</div>
+		<table id="cityList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-pagination="true"
+			data-page-size="10"
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+	
+	<@ms.modal  modalName="delCity" title="授权数据删除" >
+		<@ms.modalBody>删除此授权
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button  value="确认删除?"  id="deleteCityBtn"  />
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+</@ms.html5>
+
+<script>
+	$(function(){
+		$("#cityList").bootstrapTable({
+			url:"${managerPath}/basic/city/list.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			toolbar: "#toolbar",
+	    	columns: [{ checkbox: true},
+				    	{
+				        	field: 'provinceName',
+				        	title: '省/直辖市/自治区级名称',
+				        	align: 'center'
+				    	},{
+				        	field: 'cityName',
+				        	title: '市级名称',
+				        	align: 'center'
+				    	},{
+				        	field: 'countyName',
+				        	title: '县/区级名称',
+				        	align: 'center'
+				    	},{
+				        	field: 'townName',
+				        	title: '街道/镇级名称',
+				        	align: 'center'
+				    	},{
+				        	field: 'villageName',
+				        	title: '村委会名称',
+				        	align: 'center'
+				    	}]
+	    })
+	})
+	//增加按钮
+	$("#addCityBtn").click(function(){
+		location.href ="${managerPath}/basic/city/form.do"; 
+	})
+	//删除按钮
+	$("#delCityBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#cityList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delCity").modal();
+		}
+	})
+	
+	$("#deleteCityBtn").click(function(){
+		var rows = $("#cityList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/basic/city/delete.do",
+			data: JSON.stringify(rows),
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "danger" />
+				}
+				location.reload();
+			}
+		})
+	});
+	//查询功能
+	function search(){
+		var search = $("form[name='searchForm']").serializeJSON();
+        var params = $('#cityList').bootstrapTable('getOptions');
+        params.queryParams = function(params) {  
+        	$.extend(params,search);
+	        return params;  
+       	}  
+   	 	$("#cityList").bootstrapTable('refresh', {query:$("form[name='searchForm']").serializeJSON()});
+	}
+</script>

+ 63 - 0
src/main/webapp/WEB-INF/manager/basic/file/form.ftl

@@ -0,0 +1,63 @@
+<@ms.html5>
+	 <@ms.nav title="基础文件表编辑" back=true>
+	 	<#if fileEntity.id??>
+	 		<@ms.updateButton  onclick="saveOrUpdate()"/>
+	 	<#else>
+	 		<@ms.saveButton  onclick="saveOrUpdate()"/>
+	 	</#if>
+    </@ms.nav>
+    <@ms.panel>
+    	<@ms.form name="fileForm" isvalidation=true>
+    		<@ms.hidden name="id" value="${(fileEntity.id)?default('')}"/>
+			<@ms.text label="文件分类编号" name="categoryId"  value="${(fileEntity.categoryId)?default('')}" width="240px;" placeholder="请输入文件分类编号" validation={"data-bv-between":"true","required":"true", "data-bv-between-message":"文件分类编号必须大于0小于9999999999","data-bv-between-min":"0", "data-bv-between-max":"9999999999","data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="文件名称" name="fileName" value="${(fileEntity.fileName)?default('')}"  width="240px;" placeholder="请输入文件名称" validation={"required":"true","maxlength":"50","data-bv-stringlength-message":"文件名称长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="文件链接" name="fileUrl" value="${(fileEntity.fileUrl)?default('')}"  width="240px;" placeholder="请输入文件链接" validation={"required":"true","maxlength":"50","data-bv-stringlength-message":"文件链接长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="文件大小" name="fileSize"  value="${(fileEntity.fileSize)?default('')}" width="240px;" placeholder="请输入文件大小" validation={"data-bv-between":"true","required":"true", "data-bv-between-message":"文件大小必须大于0小于9999999999","data-bv-between-min":"0", "data-bv-between-max":"9999999999","data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="文件详情Json数据" name="fileJson" value="${(fileEntity.fileJson)?default('')}"  width="240px;" placeholder="请输入文件详情Json数据" validation={"required":"true","maxlength":"50","data-bv-stringlength-message":"文件详情Json数据长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="文件类型:图片、音频、视频等" name="fileType" value="${(fileEntity.fileType)?default('')}"  width="240px;" placeholder="请输入文件类型:图片、音频、视频等" validation={"required":"true","maxlength":"50","data-bv-stringlength-message":"文件类型:图片、音频、视频等长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="子业务" name="isChild" value="${(fileEntity.isChild)?default('')}"  width="240px;" placeholder="请输入子业务" validation={"required":"true","maxlength":"50","data-bv-stringlength-message":"子业务长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+    	</@ms.form>
+    </@ms.panel>
+</@ms.html5>
+<script>
+
+   	var logoClass = "glyphicon-floppy-saved";
+	var url = "${managerPath}/basic/file/save.do";
+	if($("input[name = 'id']").val() > 0){
+		logoClass = "glyphicon-open";
+		url = "${managerPath}/basic/file/update.do";
+	}
+	//编辑按钮onclick
+	function saveOrUpdate() {
+		$("#fileForm").data("bootstrapValidator").validate();
+			var isValid = $("#fileForm").data("bootstrapValidator").isValid();
+			if(!isValid) {
+				<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+				return;
+		}
+		var btnWord =$(".btn-success").text();
+		$(".btn-success").text(btnWord+"中...");
+		$(".btn-success").prop("disabled",true);
+		$.ajax({
+			type:"post",
+			dataType:"json",
+			data:$("form[name = 'fileForm']").serialize(),
+			url:url,
+			success: function(data) {
+				if(data.id > 0) { 
+					<@ms.notify msg="保存或更新成功" type= "success" />
+					location.href = "${managerPath}/basic/file/index.do";
+				}
+				else{
+					$(".btn-success").html(btnWord+"<span class='glyphicon " + logoClass + "' style='margin-right:5px'></span>");
+					$(".btn-success").text(btnWord);
+					$(".btn-success").removeAttr("disabled");
+					$('.ms-notifications').offset({top:43}).notify({
+					   type:'danger',
+					   message: { text:data.resultMsg }
+					}).show();
+				}
+			}
+		})
+	}	
+</script>

+ 235 - 0
src/main/webapp/WEB-INF/manager/basic/file/index.ftl

@@ -0,0 +1,235 @@
+<@ms.html5>
+	<@ms.nav title="基础文件表管理"></@ms.nav>
+	<@ms.searchForm name="searchForm" isvalidation=true>
+			<@ms.searchFormButton>
+				 <@ms.queryButton onclick="search()"/> 
+			</@ms.searchFormButton>			
+	</@ms.searchForm>
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNavBtnGroup>
+				<@shiro.hasPermission name="file:save"><@ms.panelNavBtnAdd id="addFileBtn" title=""/></@shiro.hasPermission> 
+				<@shiro.hasPermission name="file:del"><@ms.panelNavBtnDel id="delFileBtn" title=""/></@shiro.hasPermission> 
+			</@ms.panelNavBtnGroup>
+		</div>
+		<table id="fileList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-pagination="true"
+			data-page-size="10"
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+	
+	<@ms.modal  modalName="delFile" title="基础文件表数据删除" >
+		<@ms.modalBody>删除此基础文件表
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button  value="确认" class="btn btn-danger rightDelete"  id="deleteFileBtn"  />
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+</@ms.html5>
+
+<script>
+
+
+	$(function(){
+		$("#fileList").bootstrapTable({
+			url:"${managerPath}/basic/file/list.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			toolbar: "#toolbar",
+	    	columns: [{ checkbox: true},
+				    	{
+				        	field: 'id',
+				        	title: '文件编号',
+				        	width:'11',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'categoryId',
+				        	title: '文件分类编号',
+				        	width:'11',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'appId',
+				        	title: 'APP编号',
+				        	width:'11',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'fileName',
+				        	title: '文件名称',
+				        	width:'200',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'fileUrl',
+				        	title: '文件链接',
+				        	width:'500',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'fileSize',
+				        	title: '文件大小',
+				        	width:'11',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'fileJson',
+				        	title: '文件详情Json数据',
+				        	width:'500',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'fileType',
+				        	title: '文件类型:图片、音频、视频等',
+				        	width:'50',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'isChild',
+				        	title: '子业务',
+				        	width:'50',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'updateDate',
+				        	title: '更新时间',
+				        	width:'0',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'updateBy',
+				        	title: '更新者',
+				        	width:'11',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'createBy',
+				        	title: '创建者',
+				        	width:'11',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'createDate',
+				        	title: '创建时间',
+				        	width:'0',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},
+							    	{
+				        	field: 'del',
+				        	title: '删除标记',
+				        	width:'1',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/file/form.do?id="+row.id;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	}
+			]
+	    })
+	})
+	//增加按钮
+	$("#addFileBtn").click(function(){
+		location.href ="${managerPath}/basic/file/form.do"; 
+	})
+	//删除按钮
+	$("#delFileBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#fileList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delFile").modal();
+		}
+	})
+	
+	$("#deleteFileBtn").click(function(){
+		var rows = $("#fileList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/basic/file/delete.do",
+			data: JSON.stringify(rows),
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "danger" />
+				}
+				location.reload();
+			}
+		})
+	});
+	//查询功能
+	function search(){
+		var search = $("form[name='searchForm']").serializeJSON();
+        var params = $('#fileList').bootstrapTable('getOptions');
+        params.queryParams = function(params) {  
+        	$.extend(params,search);
+	        return params;  
+       	}  
+   	 	$("#fileList").bootstrapTable('refresh', {query:$("form[name='searchForm']").serializeJSON()});
+	}
+</script>

+ 120 - 0
src/main/webapp/WEB-INF/manager/basic/index.ftl

@@ -0,0 +1,120 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<#include "${managerViewPath}/include/meta.ftl"/> <!--调用head内样式信息-->
+<script type="text/javascript" src="${base}/jquery/zTree_v3/jquery.ztree.all-3.5.min.js"></script>
+<link rel="stylesheet" href="${base}/jquery/zTree_v3/zTreeStyle.css" type="text/css">
+</head>
+<style>
+	.container{margin:0;padding:0;width:auto}
+	hr{margin-top:9px;margin-bottom:9px;padding:0;}
+	.rowpadding3{padding-bottom: 3px;}
+	.ms-button-group{padding:0px 0px 8px 0px}
+	.row {margin-left:0;margin-right:0}
+	.form-horizontal .form-group{margin-left:0;margin-right:0}
+	.form-group{overflow: hidden;}
+	.bs-example>.dropdown>.dropdown-menu {position: static;margin-bottom: 5px;clear: left;}
+	.bs-example>.dropdown>.dropdown-toggle {float: left;}
+	.padding-zero{padding:0;}
+	.link-style a:hover{color:#000;}
+	.link-style a:visited{color:#000;}
+	.form-inline .form-group {display: inline-block;margin-bottom: 0;vertical-align: middle;}
+	#tableArticle .updateArticle {cursor: pointer;}
+	#menuBtn{margin:0}
+	#menuContent {
+		overflow: auto;
+		max-height: 240px;
+		display: none;
+		z-index: 999;
+		position: absolute;
+		float: left;
+		padding: 5px 0;
+		margin: 2px 0 0;
+		background-color: #ffffff;
+		border: 1px solid rgba(0, 0, 0, 0.15);
+		border-radius: 4px;
+		-webkit-box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+		box-shadow: 0 6px 12px rgba(0, 0, 0, 0.175);
+		background-clip: padding-box;
+	}
+	select, option,#menuBtn{
+		cursor: pointer;
+		background: white;
+	}
+	.selColumn{min-width:173px; height:34px;}
+	.categoryTree{border-right:1px solid #eeeeee;padding:0;}
+</style>
+<script>
+	
+</script>
+<body>
+	<!----------------------------------- bootstarp 布局容器 开始-------------------------------->	
+	<div class="container-fluid link-style">
+		<div class="row">
+			<div class="col-md-2 categoryTree">
+					<ul id="categoryTree" class="ztree" style="margin-top:0; width:100%;margin-left:-9px">
+			</div>
+			<!--右侧内容编辑区域开始-->
+			<div class="col-md-10" style="margin-top:0;padding:0;margin:0">
+				<!--------内容 部分  开始-------->
+				<div class="row" style="margin-top:0; width:100%;;padding:0 0 0 10px;margin:0">
+					<iframe src="${managerPath}/basic/0/list.do" style="width:100%;maring:0;padding:0;border:none;height:100%" id="listFrame" target="listFrame" ></iframe>
+				</div>
+				<!--内容部分结束-->
+			
+			</div>
+			<!--右侧内容编辑区域结束-->
+		
+		</div>
+	
+	</div>
+
+	
+	<!--引用弹出框插件-->
+	<@warnModal modalName="Model"/>
+	<!--JQ特效部分-->
+	<script>
+		$(function(){	
+			$(".categoryTree").height($(document).height());
+			
+			$("#listFrame").height($(document).height());
+			//zTree框架	
+			var setting = {
+				callback: {
+					onClick: function(event, treeId, treeNode) {
+							if(treeNode.id>0) {
+								$("#listFrame").attr("src","${managerPath}/basic/"+treeNode.id+"/list.do?categoryTitle="+encodeURIComponent(treeNode.name));
+							}
+					}
+				},
+				view: {
+					dblClickExpand: dblClickExpand 
+				},
+				data: {
+					simpleData: {
+						enable: true
+					}
+				}
+			};
+	
+			function dblClickExpand(treeId, treeNode) {
+				return treeNode.level > 0;
+			}
+	
+			$(document).ready(function(){
+				$.fn.zTree.init($("#categoryTree"), setting, zNodes);
+			});
+			
+			//获取栏目节点列表
+			var listColumn=${listCategory};
+			var zNodes = new Array();
+			
+			//遍历节点,添加到数字中
+			for( var i = 0 ; i < listColumn.length; i++){
+				zNodes[i] = { id:listColumn[i].categoryId, pId:listColumn[i].categoryCategoryId,name:listColumn[i].categoryTitle, open:false};
+			}
+		});
+		
+	</script>
+</body>
+</html>

+ 217 - 0
src/main/webapp/WEB-INF/manager/basic/manager/index.ftl

@@ -0,0 +1,217 @@
+<@ms.html5>
+	<@ms.nav title="管理员管理"></@ms.nav>
+	<style>
+		.select2-container .select2-container--default {  
+		 	height: 34px;  
+		} 
+		.select2-container .select2-selection--single{
+			font: inherit;
+			border: 1px solid #ccc;
+		    display: block;
+		    height: 34px;
+		    padding: 0px 3px;
+    		font-size: 14px;
+    		color: rgb(85, 85, 85);
+		}
+	</style>
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNav>
+				<@ms.buttonGroup>
+					<@shiro.hasPermission name="manager:save"><@ms.panelNavBtnAdd title="" id="addManagerBtn"/></@shiro.hasPermission> 
+					<@shiro.hasPermission name="manager:del"><@ms.panelNavBtnDel title="" id="delManagerBtn"/></@shiro.hasPermission> 
+				</@ms.buttonGroup>
+			</@ms.panelNav>
+		</div>
+		<table id="managerList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-pagination="true"
+			data-page-size="10"
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+	
+	<@ms.modal  modalName="delManager" title="管理员删除" >
+		<@ms.modalBody>删除此管理员
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button  value="删除" class="btn btn-danger rightDelete" id="deleteManagerBtn"  />
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+	
+	<@ms.modal id="addManager" title="管理员编辑"  resetFrom=true>
+    <@ms.modalBody>
+		<@ms.form name="managerForm" isvalidation=true action="${managerPath}/basic/manager/save.do" redirect="${managerPath}/basic/manager/index.do">
+			<@ms.hidden name="managerId" value="0"/>
+			<@ms.text label="管理员名" name="managerName" value=""  width="240px;" placeholder="请输入管理员名" validation={"required":"true","minlength":"3","maxlength":"12","data-bv-stringlength-message":"管理员用户名长度为3~12个字符!", "data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="管理员昵称" name="managerNickName" value=""  width="240px;" placeholder="请输入管理员昵称" validation={"required":"true","maxlength":"15","data-bv-stringlength-message":"管理员昵称长度不能超过十五个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+			<@ms.text label="管理员密码" name="managerPassword" value=""  width="240px;" placeholder="请输入管理员密码" validation={"minlength":"6","maxlength":"20","data-bv-stringlength-message":"管理员密码长度为6~20个字符!"}/>
+			<@ms.select id="managerRoleID"  name="managerRoleID" label="角色编号"/>	
+    	</@ms.form>
+    </@ms.modalBody>
+    <@ms.modalButton>
+         <@ms.saveButton id= "saveOrUpdate"/>
+    </@ms.modalButton>
+</@ms.modal>
+	
+</@ms.html5>
+
+<script>
+	$(function(){
+		//加载选择角色列表
+		$("#managerRoleID").request({url:"${managerPath}/basic/role/list.do",type:"json",method:"post",func:function(msg) {
+			var managerArr = msg.rows;
+			$("#managerRoleID").val(null).trigger("change");
+			if(managerArr.length != 0 && ($("#managerRoleID").val() == null)){
+	   			for(var i=0; i<managerArr.length; i++){
+		   			$("#managerRoleID").append($("<option>").val(managerArr[i].roleId).text(managerArr[i].roleName));
+		   			$("#managerRoleID").select2({width: "210px"}).val(managerArr[i].roleId).trigger("change");
+		   		}
+	   		} else if($("#managerRoleID").val()<0) {
+	   			$("#managerRoleID").append("<option>暂无角色</option>");
+	   		}
+	   		//使用select2插件
+	 		$("#managerRoleID").select2({width: "210px"});
+		}});
+		$("#managerList").bootstrapTable({
+			url:"${managerPath}/basic/manager/query.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			toolbar: "#toolbar",
+	    	columns: [{ checkbox: true,
+		    			formatter: function (value, row, index){
+		    				//不能删除自己
+		    				if("${Session.manager_session.managerName}" == row.managerName){
+		    					return {disabled : true};
+		    				}
+		    			}
+	    				},{
+				        	field: 'managerName',
+				        	title: '账号',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		if(row.managerId == 0){
+				        			return value;
+				        		}else{
+				        			<@shiro.hasPermission name="manager:update">	        
+						        	return "<a onclick='updateSearch("+row.managerId+")' style='cursor:pointer;text-decoration:none;' >" + value + "</a>";
+						    		</@shiro.hasPermission> 
+						    		<@shiro.lacksPermission name="manager:update">
+						    			return value;
+						    		</@shiro.lacksPermission>
+				        			
+				        		}
+				        	}
+				    	},							    	{
+				        	field: 'managerNickName',
+				        	title: '昵称'
+				    	},							    	{
+				        	field: 'managerPassword',
+				        	title: '密码'
+				    	},							    	{
+				        	field: 'roleName',
+				        	title: '角色名称'
+				    	},							    	{
+				        	field: 'managerTime',
+				        	title: '创建时间',
+				        	align: 'center'
+				    	}		]
+	    })
+	})
+	//增加按钮
+	$("#addManagerBtn").click(function(){
+		$('#managerForm').attr("${managerPath}/basic/manager/save.do");
+		$(".addManager").modal();
+	})
+	
+	var url = "${managerPath}/basic/manager/save.do";
+	if($("input[name = 'managerId']").val() > 0){
+		url = "${managerPath}/basic/manager/update.do";
+		$(".btn-success").text("更新");
+	}
+	
+	//保存按钮
+	$("#saveOrUpdate").click(function(){
+		$("#managerForm").data("bootstrapValidator").validate();
+		var isValid = $("#managerForm").data("bootstrapValidator").isValid();
+		if(!isValid) {
+			<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+			return;
+		}
+		$(this).text("正在保存...");
+		$(this).attr("disabled","true");
+		var managerEntity = $('#managerForm').serialize();
+		var url = $('#managerForm').attr("action");
+		$.ajax({
+			type: "post",
+			url:url,
+			data: managerEntity,
+			dataType:"json",
+			success:function(data){
+				if(data.managerId > 0){
+					<@ms.notify msg= "保存或更新成功" type= "success" />
+					location.reload();
+				}else {
+					 $('.ms-notifications').offset({top:43}).notify({
+			    		    type:'warning',
+						    message: { text:data.resultMsg }
+						 }).show();	
+					$("#saveOrUpdate").removeAttr("disabled");
+					$("#saveOrUpdate").text("保存");
+					}
+			}
+		});
+	})
+	
+	//删除按钮
+	$("#delManagerBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#managerList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delManager").modal();
+		}
+	})
+	
+	$("#deleteManagerBtn").click(function(){
+		var rows = $("#managerList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/basic/manager/delete.do",
+			data: JSON.stringify(rows),
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "danger" />
+				}
+				location.reload();
+			}
+		})
+	});
+	
+	//表单赋值
+	function updateSearch(managerId){
+		$(this).request({url:"${managerPath}/basic/manager/get.do?managerId="+managerId,func:function(manager) {
+			if (manager.managerId > 0) {
+				$("#managerForm").attr("action","${managerPath}/basic/manager/update.do");
+				$("#managerForm input[name='managerName']").val(manager.managerName);
+				$("#managerForm input[name='managerId']").val(manager.managerId);
+				$("#managerForm input[name='managerNickName']").val(manager.managerNickName);
+				$("#managerRoleID").select2({width: "210px"}).val(manager.managerRoleID).trigger("change");
+				$("#managerForm select[name='managerRoleID']").val(manager.managerRoleID);
+				$("#addManager").modal();
+			}					
+		}});
+	}
+</script>

+ 48 - 0
src/main/webapp/WEB-INF/manager/basic/people/form.ftl

@@ -0,0 +1,48 @@
+<@ms.html5>
+	 <@ms.nav title="通用用户与信息一对多表编辑" back=true>
+    	<@ms.saveButton  onclick="save()"/>
+    </@ms.nav>
+    <@ms.panel>
+    	<@ms.form name="peopleForm" isvalidation=true>
+    		<@ms.hidden name="bpId" value="${peopleEntity.bpId?default('')}"/>
+    			<@ms.number label="信息编号" name="bpBasicId" value="${peopleEntity.bpBasicId?default('')}" width="240px;" placeholder="请输入信息编号" validation={"required":"false","maxlength":"50","data-bv-stringlength-message":"信息编号长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+    			<@ms.number label="用户编号" name="bpPeopleId" value="${peopleEntity.bpPeopleId?default('')}" width="240px;" placeholder="请输入用户编号" validation={"required":"false","maxlength":"50","data-bv-stringlength-message":"用户编号长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+    			<@ms.text label="创建时间" name="bpDatetime" value="${peopleEntity.bpDatetime?string('yyyy-MM-dd')}"  width="240px;"/>
+    	</@ms.form>
+    </@ms.panel>
+</@ms.html5>
+<script>
+	var url = "${managerPath}/basic/people/save.do";
+	if($("input[name = 'bpId']").val() > 0){
+		url = "${managerPath}/basic/people/update.do";
+		$(".btn-success").text("更新");
+	}
+	//编辑按钮onclick
+	function save() {
+		$("#peopleForm").data("bootstrapValidator").validate();
+			var isValid = $("#peopleForm").data("bootstrapValidator").isValid();
+			if(!isValid) {
+				<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+				return;
+		}
+		var btnWord =$(".btn-success").text();
+		$(".btn-success").text(btnWord+"中...");
+		$(".btn-success").prop("disabled",true);
+		$.ajax({
+			type:"post",
+			dataType:"json",
+			data:$("form[name = 'peopleForm']").serialize(),
+			url:url,
+			success: function(status) {
+				if(status.result == true) { 
+					<@ms.notify msg="保存或更新成功" type= "success" />
+					location.href = "${managerPath}/basic/people/index.do";
+				}
+				else{
+					<@ms.notify msg= "保存或更新失败!" type= "danger" />
+					location.href= "${managerPath}/basic/people/index.do";
+				}
+			}
+		})
+	}	
+</script>

+ 131 - 0
src/main/webapp/WEB-INF/manager/basic/people/index.ftl

@@ -0,0 +1,131 @@
+<@ms.html5>
+	<@ms.nav title="通用用户与信息一对多表管理"></@ms.nav>
+	<@ms.searchForm name="searchForm" isvalidation=true>
+			<@ms.searchFormButton>
+				 <@ms.queryButton onclick="search()"/> 
+			</@ms.searchFormButton>			
+	</@ms.searchForm>
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNav>
+				<@ms.buttonGroup>
+					<@ms.addButton id="addPeopleBtn"/>
+					<@ms.delButton id="delPeopleBtn"/>
+				</@ms.buttonGroup>
+			</@ms.panelNav>
+		</div>
+		<table id="peopleList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-pagination="true"
+			data-page-size="10"
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+	
+	<@ms.modal  modalName="delPeople" title="授权数据删除" >
+		<@ms.modalBody>删除此授权
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button  value="确认删除?"  id="deletePeopleBtn"  />
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+</@ms.html5>
+
+<script>
+	$(function(){
+		$("#peopleList").bootstrapTable({
+			url:"${managerPath}/basic/people/list.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			toolbar: "#toolbar",
+	    	columns: [{ checkbox: true},
+				    	{
+				        	field: 'bpId',
+				        	title: '',
+				        	width:'10',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/people/form.do?bpId="+row.bpId;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},							    	{
+				        	field: 'bpBasicId',
+				        	title: '信息编号',
+				        	width:'10',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/people/form.do?bpBasicId="+row.bpBasicId;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},							    	{
+				        	field: 'bpPeopleId',
+				        	title: '用户编号',
+				        	width:'10',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/people/form.do?bpPeopleId="+row.bpPeopleId;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	},							    	{
+				        	field: 'bpDatetime',
+				        	title: '创建时间',
+				        	width:'19',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		var url = "${managerPath}/basic/people/form.do?bpDatetime="+row.bpDatetime;
+				        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+				        	}
+				    	}			]
+	    })
+	})
+	//增加按钮
+	$("#addPeopleBtn").click(function(){
+		location.href ="${managerPath}/basic/people/form.do"; 
+	})
+	//删除按钮
+	$("#delPeopleBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#peopleList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delPeople").modal();
+		}
+	})
+	
+	$("#deletePeopleBtn").click(function(){
+		var rows = $("#peopleList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/basic/people/delete.do",
+			data: JSON.stringify(rows),
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "danger" />
+				}
+				location.reload();
+			}
+		})
+	});
+	//查询功能
+	function search(){
+		var search = $("form[name='searchForm']").serializeJSON();
+        var params = $('#peopleList').bootstrapTable('getOptions');
+        params.queryParams = function(params) {  
+        	$.extend(params,search);
+	        return params;  
+       	}  
+   	 	$("#peopleList").bootstrapTable('refresh', {query:$("form[name='searchForm']").serializeJSON()});
+	}
+</script>

+ 110 - 0
src/main/webapp/WEB-INF/manager/basic/role/form.ftl

@@ -0,0 +1,110 @@
+<@ms.html5>
+	<@ms.nav title="角色设置" back=true>
+		<@ms.saveButton id="save"/>
+	</@ms.nav>
+	<@ms.panel>
+		<@ms.form name="columnForm" isvalidation=true  >                                                   
+			<@ms.text name="roleName" label="角色名称:" title="角色名称" value="${roleEntity.roleName?default('')}" width="300" validation={"required":"true","maxlength":"30","data-bv-notempty-message":"请填写角色名称"}/>
+			<@ms.formRow label="权限管理:">
+				<div>
+					<table id="modelList" 
+						data-show-export="true"
+						data-method="post" 
+						data-side-pagination="server">
+					</table>
+				</div>
+			</@ms.formRow>
+		</@ms.form>
+	</@ms.panel>
+</@ms.html5>
+
+<script>
+	$(function(){
+		//数据初始化
+		$("#modelList").bootstrapTable({
+			url:"${managerPath}/model/modelList.do?roleId=${roleEntity.roleId?default('')}",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			idField: 'modelId',
+            treeShowField: 'modelTitle',
+            parentIdField: 'modelModelId',
+	    	columns: [
+				    	{
+				        	field: 'modelTitle',
+				        	title: '模块标题',
+				        	width: '200'
+				    	},{
+				        	field: 'attribute',
+				        	title: '功能权限',
+				        	formatter:function(value,row,index) {
+				        		var attribute = "";
+				        		for(var i=0;i<row.modelChildList.length;i++){
+				        			var modelId = row.modelChildList[i].modelId;
+				        			var str = "<label style=' margin-top: 3px;  margin-right: 20px;' class='ms-check'><input type='checkbox'	data-ids='"+row.modelChildList[i].modelParentIds+"' value='"+modelId+"' name='attribute'/> "+row.modelChildList[i].modelTitle+"</label>"
+				        			if(row.modelChildList[i].chick == 1){
+				        				str = "<label style=' margin-top: 3px;  margin-right: 20px;' class='ms-check'><input type='checkbox' checked='checked' data-ids='"+row.modelChildList[i].modelParentIds+"' value='"+modelId+"' name='attribute'/> "+ row.modelChildList[i].modelTitle+"</label>";
+				        			}
+				        			if(attribute == ""){
+				        				attribute = str;
+				        			}else{
+				        				attribute = attribute+str;
+				        			}
+				        		}
+				        		return attribute;
+				        	}
+				    	}]
+	    })
+	})
+	//保存操作
+	$("#save").click(function(){
+		$("#columnForm").data("bootstrapValidator").validate();
+		var isValid = $("#columnForm").data("bootstrapValidator").isValid();
+		if(!isValid) {
+			<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+			return;
+		}
+		var roleName = $("input[name=roleName]").val();
+		var roleId = "${roleEntity.roleId?default('')}";
+		var oldRoleName = "${roleEntity.roleName?default('')}";
+		var ids=[];
+		$("input[name=attribute]").each(function () {
+			if($(this).is(':checked')){
+				var modelId = $(this).val();
+			    var modelModelIds = $(this).attr("data-ids");
+			    ids.push(modelId);
+			    if(modelModelIds!="") {
+				    var parentIds = modelModelIds.split(",");
+				    for(var i=0;i<parentIds.length;i++){
+				    	if(parentIds[i]!="") {
+					    	if($.inArray(parentIds[i], ids) == -1){
+						    	ids.push(parentIds[i]);
+						    }				    	
+				    	}
+				    }			    
+			    }
+			}
+		});
+		if(roleName == "" || roleName == null){
+			<@ms.notify msg= '角色名不能为空' type= "warning" />
+		}else{
+			$.ajax({
+		 	type:"post",
+		 	url:"${managerPath}/basic/role/saveOrUpdateRole.do",
+		 	dataType: "json",
+		 	data:{ids:ids,roleName:roleName,roleId:roleId,oldRoleName:oldRoleName},
+		 	success:function(data){
+		 		if(data.result == false) {
+					$('.ms-notifications').offset({top:43}).notify({
+					    type:'warning',
+					    message: { text:data.resultMsg }
+					 }).show();	
+				}else {
+					<@ms.notify msg= "操作成功" type= "success" />
+					location.href= "${managerPath}/basic/role/index.do";
+				}
+		 	}
+		});
+		}
+		
+	})
+</script>

+ 118 - 0
src/main/webapp/WEB-INF/manager/basic/role/index.ftl

@@ -0,0 +1,118 @@
+<@ms.html5>
+	<@ms.nav title="角色管理"></@ms.nav>
+	<@ms.searchForm name="searchForm" isvalidation=true>
+		<@ms.text label="角色名" name="roleName" value=""  width="240px;" placeholder="请输入角色名" />
+		<@ms.searchFormButton>
+			 <@ms.queryButton onclick="search()"/> 
+		</@ms.searchFormButton>			
+	</@ms.searchForm>
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNav>
+				<@ms.buttonGroup>
+					<@shiro.hasPermission name="role:save"><@ms.panelNavBtnAdd title="" id="addRoleBtn"/></@shiro.hasPermission> 
+					<@shiro.hasPermission name="role:del"><@ms.panelNavBtnDel title="" id="delRoleBtn"/></@shiro.hasPermission> 
+				</@ms.buttonGroup>
+			</@ms.panelNav>
+		</div>
+		<table id="roleList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-pagination="true"
+			data-page-size="10"
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+	
+	<@ms.modal  modalName="delRole" title="角色删除" >
+		<@ms.modalBody>删除此角色
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button  value="删除" class="btn btn-danger rightDelete" id="deleteRoleBtn"  />
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+</@ms.html5>
+
+<script>
+	$(function(){
+		$("#roleList").bootstrapTable({
+			url:"${managerPath}/basic/role/list.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			toolbar: "#toolbar",
+	    	columns: [{ checkbox: true,
+			    			formatter: function (value, row, index){
+			    				//不能删除自己
+			    				if("${Session.manager_session.managerRoleID}" == row.roleId){
+			    					return {disabled : true};
+			    				}
+			    			}
+	    				},{
+				        	field: 'roleId',
+				        	title: '编号',
+				        	align: 'center',
+				        	width: '80',
+				    	},{
+				        	field: 'roleName',
+				        	title: '角色名',
+				        	formatter:function(value,row,index) {
+				        		if("${Session.manager_session.managerRoleID}" == row.roleId){
+					        		return  value ;
+					        	}else{
+					        		var url = "${managerPath}/basic/role/form.do?roleId="+row.roleId;
+					        		return "<a href=" +url+ " target='_self'>" + value + "</a>";
+					        	}
+				        	}
+				    	}]
+	    })
+	})
+	//增加按钮
+	$("#addRoleBtn").click(function(){
+		location.href ="${managerPath}/basic/role/form.do"; 
+	})
+	//删除按钮
+	$("#delRoleBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#roleList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delRole").modal();
+		}
+	})
+	
+	$("#deleteRoleBtn").click(function(){
+		var rows = $("#roleList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/basic/role/delete.do",
+			data: JSON.stringify(rows),
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "danger" />
+				}
+				location.reload();
+			}
+		})
+	});
+	//查询功能
+	function search(){
+		var search = $("form[name='searchForm']").serializeJSON();
+        var params = $('#roleList').bootstrapTable('getOptions');
+        params.queryParams = function(params) {  
+        	$.extend(params,search);
+	        return params;  
+       	}  
+   	 	$("#roleList").bootstrapTable('refresh', {query:$("form[name='searchForm']").serializeJSON()});
+	}
+</script>

+ 51 - 0
src/main/webapp/WEB-INF/manager/category/form.ftl

@@ -0,0 +1,51 @@
+<@ms.html5>
+	 <@ms.nav title="${modelTitle}编辑" back=true>
+    	<@ms.saveButton  onclick="save()"/>
+    </@ms.nav>
+    <@ms.panel>
+    	<@ms.form name="categoryForm" isvalidation=true>
+    		<@ms.hidden name="categoryId" value="${categoryEntity.categoryId?default('')}"/>
+			<@ms.hidden name="categoryModelId" value="${modelId?default('0')}"/>
+			<@ms.text label="${modelTitle}标题" name="categoryTitle" value="${categoryEntity.categoryTitle?default('')}"  width="240px;" placeholder="请输入类别标题" validation={"required":"true","maxlength":"50","data-bv-stringlength-message":"类别标题长度不能超过五十个字符长度!", "data-bv-notempty-message":"必填项目"}/>
+    		<@ms.textarea colSm="2" name="categoryDescription" label="${modelTitle}描述" wrap="Soft" rows="3"  size="" width="642px;" value="${categoryEntity.categoryDescription?default('')}" placeholder="${modelTitle}描述" validation={"maxlength":"50","data-bv-stringlength-message":"栏目描述长度不能超过五十个字符长度!"}/>
+    		<@ms.formRow label="缩略图">
+				<@ms.uploadImg path="category" inputName="categorySmallImg" size="15" filetype="" msg=""  maxSize="1" imgs="${(category.categorySmallImg)?default('')}" />
+    		</@ms.formRow>
+    	</@ms.form>
+    </@ms.panel>
+</@ms.html5>
+<script>
+	var url = "${managerPath}/category/save.do";
+	if($("input[name = 'categoryId']").val() > 0){
+		url = "${managerPath}/category/update.do";
+		$(".btn-success").text("更新");
+	}
+	//编辑按钮onclick
+	function save() {
+		$("#categoryForm").data("bootstrapValidator").validate();
+			var isValid = $("#categoryForm").data("bootstrapValidator").isValid();
+			if(!isValid) {
+				<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+				return;
+		}
+		var btnWord =$(".btn-success").text();
+		$(".btn-success").text(btnWord+"中...");
+		$(".btn-success").prop("disabled",true);
+		$.ajax({
+			type:"post",
+			dataType:"json",
+			data:$("form[name = 'categoryForm']").serialize(),
+			url:url,
+			success: function(status) {
+				if(status.categoryId != null) { 
+					<@ms.notify msg="保存或更新成功" type= "success" />
+					history.go(-1); 
+					location.reload();
+				}
+				else{
+					<@ms.notify msg= "保存或更新失败!" type= "danger" />
+				}
+			}
+		})
+	}	
+</script>

+ 114 - 0
src/main/webapp/WEB-INF/manager/category/index.ftl

@@ -0,0 +1,114 @@
+<@ms.html5>
+	<@ms.nav title="${modelTitle}"></@ms.nav>
+	<@ms.searchForm name="searchForm" isvalidation=true>
+			<@ms.text label="${modelTitle}标题" name="categoryTitle" value=""  width="240px;" placeholder="请输入类别标题" validation={"maxlength":"50","data-bv-stringlength-message":"${modelTitle}标题长度不能超过五十个字符长度!"}/>
+			<@ms.searchFormButton>
+				<@ms.queryButton onclick="search()"/> 
+			</@ms.searchFormButton>			
+	</@ms.searchForm>
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNav>
+				<@ms.buttonGroup>
+					<#include "${managerViewPath}/${model?default('')}/category/shiro-button.ftl"/>					
+				</@ms.buttonGroup>
+			</@ms.panelNav>
+		</div>
+		<table id="categoryList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-pagination="true"
+			data-page-size="10"
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+	
+	<@ms.modal  modalName="delCategory" title="${modelTitle}数据删除" >
+		<@ms.modalBody>删除此数据
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button class="btn btn-danger rightDelete" id="deleteCategoryBtn" value="确定"/>
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+</@ms.html5>
+
+<script>
+	$(function(){
+		var category = {modelId:${modelId?default('0')},modelTitle:"${modelTitle?default('0')}"};
+		$("#categoryList").bootstrapTable({
+			url:"${managerPath}/category/list.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			queryParams:function(params) {
+				return $.extend(params,category);
+			},
+			toolbar: "#toolbar",
+	    	columns: [{ checkbox: true},
+				    	{
+				        	field: 'categoryId',
+				        	title: '${modelTitle}编号',
+				        	align: 'center',
+				        	width:'120'
+				    	},{
+				        	field: 'categoryTitle',
+				        	title: '${modelTitle}标题',
+				        	formatter:function(value,row,index) {
+				        		<#include "${managerViewPath}/${model?default('')}/category/shiro-update.ftl"/>
+				        	}
+				    	},							    	{
+				        	field: 'categoryDescription',
+				        	title: '${modelTitle}描述'
+				    	}	]
+	    })
+	})
+	//增加按钮
+	$("#addCategoryBtn").click(function(){
+		location.href ="${managerPath}/category/form.do?modelId=${modelId?default('0')}&modelTitle=${modelTitle?default('0')}"; 
+	})
+	//删除按钮
+	$("#delCategoryBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#categoryList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delCategory").modal();
+		}
+	})
+	
+	$("#deleteCategoryBtn").click(function(){
+		var rows = $("#categoryList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/category/delete.do",
+			data: JSON.stringify(rows),
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "danger" />
+				}
+				location.reload();
+			}
+		})
+	});
+	//查询功能
+	function search(){
+		var modelId = {modelId:${modelId}};
+		var search = $("form[name='searchForm']").serializeJSON();
+        var params = $('#categoryList').bootstrapTable('getOptions');
+        params.queryParams = function(params) {  
+        	$.extend(params,search,modelId);
+	        return params;  
+       	}  
+   	 	$("#categoryList").bootstrapTable('refresh', {query:$("form[name='searchForm']").serializeJSON()});
+	}
+</script>

+ 2 - 0
src/main/webapp/WEB-INF/manager/category/shiro-button.ftl

@@ -0,0 +1,2 @@
+<@ms.addButton id="addCategoryBtn"/>
+<@ms.delButton id="delCategoryBtn"/>

+ 2 - 0
src/main/webapp/WEB-INF/manager/category/shiro-update.ftl

@@ -0,0 +1,2 @@
+var url = "${managerPath}/${model?default("")}/category/form.do?categoryId="+row.categoryId+"&modelId=${modelId?default('0')}&modelTitle=${modelTitle?default('0')}" ;
+return "<a href=" +url+ " target='_self'>" + value + "</a>";

+ 188 - 0
src/main/webapp/WEB-INF/manager/column/form.ftl

@@ -0,0 +1,188 @@
+<@ms.html5>
+	<@ms.nav title="栏目管理" back=true>
+		<#if column.categoryId == 0>
+	 		<@ms.saveButton id="saveUpdate" value="保存"/>
+	 	<#else>
+	 		<@ms.updateButton id="saveUpdate" value="更新"/>
+	 	</#if>
+		</@ms.nav>
+	<@ms.panel>
+		<@ms.form name="columnForm" isvalidation=true  action="" method="post" >
+				<#if column.categoryId!=0>
+					<@ms.hidden name="categoryId" value="${column.categoryId?c?default(0)}" />
+				</#if>
+				<@ms.text name="categoryTitle" width="200" label="${Session.model_title_session?default('栏目')}名称" title="${Session.model_title_session?default('栏目')}名称" placeholder="${Session.model_title_session?default('栏目')}名称" value="${column.categoryTitle?default('')}" id="" validation={"data-bv-stringlength":"true","required":"true", "data-bv-notempty-message":"必填项目", "data-bv-regexp":"true","data-bv-regexp-regexp":'^[^[!@#$%^&*()_+-/~?!@#¥%…&*()——+—?》《:“‘’]+$',"data-bv-stringlength-max":"50","data-bv-regexp-message":"${Session.model_title_session?default('栏目')}名称不能包含特殊字符","data-bv-stringLength-message":"长度不能超过50个字符"} />
+		        <@ms.formRow label="所属栏目" width="300">
+					<@ms.treeInput treeId="inputTree"  json="${listColumn?default('')}"  jsonId="categoryId" jsonPid="categoryCategoryId" jsonName="categoryTitle" inputName="categoryCategoryId" inputValue="${column.categoryCategoryId?c?default(0)}" addNodesName="顶级栏目管理"  buttonText="${columnSuper.categoryTitle?default('顶级栏目管理')}" clickZtreeId="clickZtreeId(event,treeId,treeNode);"  expandAll="true" showIcon="true"/>
+				</@ms.formRow>
+          		<@ms.text name="categorySort"  width="200"  label="自定义顺序" title="自定义顺序" size="5"  placeholder="请输入文章顺序" value="${column.categorySort?c?default(0)}"  validation={"data-bv-between":"true","data-bv-between-message":"自定义顺序必须大于0","data-bv-between-min":"0", "data-bv-between-max":"99999999","data-bv-notempty-message":"自定义顺序不能为空","data-bv-between-message":"请输入0-99999999之间的数","required":"true", "data-bv-notempty-message":"必填项目"}/>
+          		<@ms.textarea name="columnKeyword" width="600" label="${Session.model_title_session?default('栏目')}关键字" wrap="Soft" rows="4" placeholder="${Session.model_title_session?default('栏目')}关键字,有助于搜索"   value="${column.columnKeyword?default('')}"  validation={"data-bv-stringlength":"true", "data-bv-stringlength-max":"200","data-bv-stringLength-message":"长度不能超过200个字符"} /> 
+          		<@ms.textarea name="columnDescrip" width="600" label="${Session.model_title_session?default('栏目')}描述" wrap="Soft" rows="4" placeholder="${Session.model_title_session?default('栏目')}描述,对${Session.model_title_session?default('栏目')}关键字的扩展"   value="${column.columnDescrip?default('')}" validation={"data-bv-stringlength":"true", "data-bv-stringlength-max":"200","data-bv-stringLength-message":"长度不能超过200个字符"} />
+				<@ms.formRow label="缩略图" width="400">
+					<@ms.uploadImg path="column" imgs="${(column.categorySmallImg)?default('')}" inputName="categorySmallImg" size="1" msg="提示:栏目缩略图,最多可上传1张"  maxSize="2"   />
+				</@ms.formRow>
+				<#assign columnTypes=[{"id":"1","name":"列表"},{"id":"2","name":"封面"}]>
+				<@ms.radio name="columnType" label="${Session.model_title_session?default('栏目')}属性"  list=columnTypes listKey="id" listValue="name" value="${column.columnType?c?default(1)}" />
+				<@ms.select name="columnContentModelId" width="200"  list=[]  listKey="cmId" listValue="cmTipsName"  label="${Session.model_title_session?default('栏目')}内容模型"  default="请选择" value="0"/>
+				<#assign columnModelUrls=[{"id":"0","name":"暂无文件"}]>
+				<@ms.select name="columnListUrl" width="300" id="columnListUrlModel"  list=columnModelUrls  listKey="id" listValue="name" label="列表模版"  value="${column.columnListUrl?default('')}"  select2=true/>
+				<@ms.select name="columnUrl" width="300" id="columnUrlModel" default="暂无文件"  list=columnModelUrls  listKey="id" listValue="name" label="内容模版"  value="${column.columnUrl?default('')}"  select2=true/>
+				<@ms.hidden name="modelId"  value="${Session.model_id_session?default('0')}" />
+			</@ms.form>
+	</@ms.panel>
+</@ms.html5>	
+<script>
+$(function(){
+
+	var columnContentModelId= "${column.columnContentModelId?default('')}"
+	$("select[name=columnContentModelId]").find("option[value="+columnContentModelId+"]").attr("selected","selected");
+	<#if column.columnType == 0> 
+		  $("input:radio[name='columnType']:first").attr("checked",true);
+	</#if>
+	var columnListUrlSes = "${column.columnListUrl?default('')}";
+	var columnUrlSes = "${column.columnUrl?default('')}";
+	//页面加载列表模板和内容模板
+	$.ajax({
+	   type: "post",
+	   dataType: "json",
+	   url:  "${managerPath}/template/queryTemplateFileForColumn.do",
+	   success: function(msg){
+	   		$("#columnListUrlModel").html("");
+	     	$("#columnUrlModel").html("");
+	     	if(msg.length != 0){
+	   			for(var i=0; i<msg.length; i++){
+	   				if(msg[i] == columnListUrlSes) {
+	   					$("#columnListUrlModel").append("<option selected>"+msg[i]+"</option>")
+	   				}else{
+	   					$("#columnListUrlModel").append("<option>"+msg[i]+"</option>")
+	   				}
+		   			if( msg[i] == columnUrlSes){
+		   				$("#columnUrlModel").append("<option selected>"+msg[i]+"</option>")
+		   			}else{
+		   				$("#columnUrlModel").append("<option>"+msg[i]+"</option>")
+		   			}
+		   		}
+	   		}else{
+	   			$("#columnListUrlModel").append("<option>暂无文件</option>");
+			   	$("#columnUrlModel").append("<option>暂无文件</option>");
+	   		}
+	   		<#if column.columnType ==2 >
+				$("#columnListUrlModel").parents(".form-group").hide();
+				$("#columnListUrlModel").css("disabled",true);
+				$("#columnUrlModel").parent().prev().text("封面模板:");
+			</#if>
+	   }
+	});	
+	
+	//切换栏目属性
+	$("input[name='columnType']").click(function(){
+		if($(this).val()== 2){
+			$("#columnListUrlModel").parents(".form-group").hide();
+			$("#columnListUrlModel").css("disabled",true);
+			$("#columnUrlModel").parent().prev().text("封面模板:");
+		}else if($(this).val()== 1){
+			$("#columnListUrlModel").parents(".form-group").show();
+			$("#columnListUrlModel").css("disabled",false);
+			$("#columnUrlModel").parent().prev().text("内容模板:");
+		}
+	});
+	
+	//栏目保存提交事件
+	$("#saveUpdate").click(function(){
+		$("#columnForm").data("bootstrapValidator").validate();
+		var isValid = $("#columnForm").data("bootstrapValidator").isValid();
+		if(!isValid) {
+			<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+			return;
+		}
+		if($("#columnListUrlModel").find("option:selected").text()=="暂无文件"){
+			$("#columnListUrlModel").find("option:selected").text("");
+		}
+		if($("#columnUrlModel").find("option:selected").text()=="暂无文件"){
+			$("#columnUrlModel").find("option:selected").text("");
+		}
+		//如果选择的是普通文章,则
+		if($("select[name=columnContentModelId]").find("option:selected").val()==""){
+			$("select[name=columnContentModelId]").find("option:selected").val(0)
+		}
+		var formdata = $("#columnForm").serialize();
+		var URL = "";
+		<#if column.categoryId==0>
+		URL ="${managerPath}/${model?default("")}/column/save.do?modelId=${Session.model_id_session?default(0)}&modelTitle=${Session.model_title_session?default('')}";
+		<#else>
+		URL = "${managerPath}/${model?default("")}/column/update.do?modelId=${Session.model_id_session?default(0)}&modelTitle=${Session.model_title_session?default('')}";
+		</#if>
+		if(isNaN($("input[name=categorySort]").val())){
+			<@ms.notify msg= "自定义排序必须是数字" type= "warning" />
+			$("input[name=categorySort]").val(0);
+			return;
+		}
+		$.ajax({
+		   	type: "post",
+		   	url: URL,
+		   	data: formdata,
+		   	dataType:"json",
+		   	beforeSend:function(){
+		   		//获取按钮值
+				var bottonText = $("#saveUpdate").text().trim();
+				//设置按钮加载状态值
+				$("#saveUpdate").attr("data-loading-text",bottonText+"中");
+				//执行加载状态
+				$("#saveUpdate").button('loading');
+		   	},
+		   	success: function(msg){
+		    	if (msg.result) {
+	     			<#if column.categoryId==0>
+	     				<@ms.notify msg= "保存成功" type= "success" />
+	     			<#else>
+	     				<@ms.notify msg= "更新成功" type= "success" />	
+	     			</#if>
+	     			var modelId = ${Session.model_id_session?default(0)};
+	     			location.href="${managerPath}/${model?default("")}/column/index.do?modelId=${Session.model_id_session?default(0)}&modelTitle=${Session.model_title_session?default('')}";
+	    		}else{
+	    			<#if column.categoryId==0>
+	     				<@ms.notify msg= "保存失败" type= "warning" />
+	     			<#else>
+	     				<@ms.notify msg= "更新失败" type= "warning" />
+	     			</#if>
+	    		}
+	    		$("#saveUpdate").button('reset')
+		   	}
+		});
+	});
+	//获取内容模型列表
+	$.ajax({
+		type: "post",
+		url: "${managerPath}/mdiy/contentModel/list.do?pageSize=100",
+		dataType: "json",
+		contentType: "application/json",
+		success:function(data) {
+			for( var i=0 ; i<data.rows.length ; i++){
+				var value = data.rows[i];
+				var columnContentModelId = ${column.columnContentModelId?c?default(0)};
+				if(columnContentModelId == value.cmId){
+					$("select[name=columnContentModelId]").append("<option value = "+value.cmId+" selected='selected'>"+value.cmTipsName+"</option>");		//添加<option>元素
+				}else{
+					$("select[name=columnContentModelId]").append("<option value = "+value.cmId+">"+value.cmTipsName+"</option>");		//添加<option>元素
+				}
+				
+			}
+		}
+	})
+});
+
+//选择栏目后查询自定义模型
+function clickZtreeId(event,treeId,treeNode){
+	//栏目不能选择自己及其子栏目为父栏目的事件
+	<#if column.categoryId gt 0 >
+		var booleanClick=true;
+		var nodeParam = zTreeObjinputTree.getNodesByParam("categoryId", "${column.categoryId?c?default(0)}", null);
+		var nodes = zTreeObjinputTree.getNodesByParam("categoryId", treeNode.categoryId, nodeParam[0]);
+		if(nodes.length>0 || treeNode.categoryId == nodeParam[0].categoryId){
+			booleanClick=false;
+			<@ms.notify msg= "不能选择该栏目作为父栏目" type= "warning" />
+		}
+		return booleanClick;
+	</#if>
+} 
+</script>

+ 166 - 0
src/main/webapp/WEB-INF/manager/column/index.ftl

@@ -0,0 +1,166 @@
+<@ms.html5>
+	<@ms.nav title="栏目表管理"></@ms.nav>
+	<!--@ms.searchForm name="searchForm" isvalidation=true>
+		<@ms.searchFormButton>
+			 <@ms.queryButton onclick="search()"/> 
+		</@ms.searchFormButton>			
+	</@ms.searchForm-->
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNav>
+				<@ms.buttonGroup>
+					<#include "${managerViewPath}/${model?default('')}/column/shiro-button.ftl"/>
+				</@ms.buttonGroup>
+			</@ms.panelNav>
+		</div>
+		<table id="columnList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+	
+	<@ms.modal  modalName="delColumn" title="删除栏目" >	
+		<@ms.modalBody>删除选中栏目,如果有子栏目也会一并删除
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button  value="确认删除?"  id="deleteColumnBtn"  />
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+</@ms.html5>
+<script>
+	$(function(){
+		$("#columnList").bootstrapTable({
+			url:"${managerPath}/${model?default('')}/column/list.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			toolbar: "#toolbar",
+			idField: 'categoryId',
+            treeShowField: 'categoryTitle',
+            parentIdField: 'categoryCategoryId',
+	    	columns: [
+	    		{ 
+	    			checkbox: true
+	    		},{
+		        	field: 'categoryId',
+		        	title: '编号',
+		        	align: 'center'
+		    	},{
+		        	field: 'categoryTitle',
+		        	title: '标题',
+		        	align: 'left',
+		        	formatter:function(value,row,index) {
+						<#include "${managerViewPath}/${model?default('')}/column/shiro-update.ftl"/>
+		        	}
+		    	},{
+		        	field: 'columnType',
+		        	title: '属性',
+		        	align: 'center',
+		        	formatter:function(value,row,index) {
+		        		if(value == 1){
+		        			return "列表";
+		        		}else if(value == 2){
+		        			return "单页";
+		        		}else if(value == 3){
+		        			return "外部链接";
+		        		}
+		        	}
+		    	},{
+		        	field: 'columnPath',
+		        	title: '链接地址',
+		        	align: 'left',
+		        	formatter:function(value,row,index) {
+		        		return "{ms:global.url/}"+value+"/index.html";
+		        	}
+		    	},{
+		        	field: 'columnListUrl',
+		        	title: '列表地址',
+		        	align: 'left',
+		        	formatter:function(value,row,index) {
+		        		if(value != null){
+		        			return value;
+		        		}else{
+		        			return "";
+		        		}
+		        	}
+		    	},{
+		        	field: 'columnUrl',
+		        	title: '内容地址',
+		        	align: 'left',
+		        	formatter:function(value,row,index) {
+		        		if(row.columnType == 1){
+		        			return value;
+		        		}else{
+		        			return "";
+		        		}
+		        	}
+		    	},{
+		        	field: 'columnUrl',
+		        	title: '封面地址',
+		        	align: 'left',
+		        	formatter:function(value,row,index) {
+		        		if(row.columnType == 2){
+		        			return value;
+		        		}else{
+		        			return "";
+		        		}
+		        	}
+		    	}]
+	    })
+	})
+ 
+	
+	//增加按钮
+	$("#addColumnBtn").click(function(){
+		location.href ="${managerPath}/${model?default('')}/column/add.do?modelId=${Session.model_id_session?default(0)}&modelTitle=${Session.model_title_session?default('')}"; 
+	})
+	//删除按钮
+	$("#delColumnBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#columnList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delColumn").modal();
+		}
+	})
+	
+	$("#deleteColumnBtn").click(function(){
+		var rows = $("#columnList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		var ids = [];
+		for(var i=0;i<rows.length;i++){
+			ids[i] = rows[i].categoryId;
+		}
+		ids.reverse();
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/${model?default('')}/column/delete.do?ids="+ids,
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "warning" />
+				}
+				location.reload();
+			}
+		})
+	});
+	//查询功能
+	function search(){
+		var search = $("form[name='searchForm']").serializeJSON();
+        var params = $('#columnList').bootstrapTable('getOptions');
+        params.queryParams = function(params) {  
+        	$.extend(params,search);
+	        return params;  
+       	}  
+   	 	$("#columnList").bootstrapTable('refresh', {query:$("form[name='searchForm']").serializeJSON()});
+	}
+</script>

+ 2 - 0
src/main/webapp/WEB-INF/manager/column/shiro-button.ftl

@@ -0,0 +1,2 @@
+<@ms.addButton id="addColumnBtn"/>
+<@ms.delButton id="delColumnBtn"/>

+ 2 - 0
src/main/webapp/WEB-INF/manager/column/shiro-update.ftl

@@ -0,0 +1,2 @@
+var url = "${managerPath}/${model?default("")}/column/"+row.categoryId+"/edit.do?modelId=${Session.model_id_session?default(0)}&modelTitle=${Session.model_title_session?default('')}";
+return "<a href=" +url+ " target='_self'>" + value + "</a>";

+ 21 - 0
src/main/webapp/WEB-INF/manager/include/head-file.ftl

@@ -0,0 +1,21 @@
+<meta charset="utf-8">
+<!--浏览器小图标-->
+<link rel="icon" href="http://cdn.mingsoft.net/global/images/ms.ico" type="x-icon">
+<script type="text/javascript" src="https://unpkg.com/vue@2.5.21/dist/vue.js"></script>
+<!-- 引入样式 -->
+<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
+<!-- 引入组件库 -->
+<script src="https://unpkg.com/element-ui/lib/index.js"></script>
+<!--网络请求框架-->
+<script src="https://cdn.bootcss.com/axios/0.18.0/axios.min.js"></script>
+<script src="https://cdn.bootcss.com/qs/6.5.2/qs.min.js"></script>
+<!--铭飞-->
+<script src="http://cdn.mingsoft.net/ms/1.0/ms.js"></script>
+<script src="http://cdn.mingsoft.net/ms/1.0/ms.http.js"></script>
+<script src="http://cdn.mingsoft.net/ms/1.0/ms.util.js"></script>
+<link rel="stylesheet" href="http://cdn.mingsoft.net/ms-admin-ui/4.7.0/css/ms.css">
+<script>
+	ms.manager = {
+		path: "${managerPath}"
+	}
+</script>

+ 87 - 0
src/main/webapp/WEB-INF/manager/include/macro.ftl

@@ -0,0 +1,87 @@
+<#include "/include/ui/index.ftl"/>
+<#global autoCURD=""/>
+<#macro autoCURD>
+	<#local url=baseUrl?split("?")?first?split("/")?last/>
+	<#if  url == "add.do">
+		<#global autoCURD="save">
+	<#elseif url =="edit.do">
+		<#global autoCURD="update">
+	</#if>
+</#macro>
+<@autoCURD/>
+
+<#--权限控制-->
+<#--link:必须 type:add/del/edit/query class:样式 id,value:显示文字-->
+<#macro auth link type="" value="" class="" id="">
+	<@shiro.hasPermission name="${link}">
+		<#if type=="add">
+			<@ms.panelNavBtnAdd id="${id}" value="${value}" class="${class}"/>
+		<#elseif type=="del">
+			<@ms.panelNavBtnDel id="${id}" value="${value}" class="${class}"/>
+		<!--
+		<#elseif type=="edit">
+			<@ms.panelNavBtnDel id="${id}" value="${value}" class="${class}"/>
+			-->
+		<#else>
+			<a href="${link}" class="${class}">${value}</a>
+		</#if>
+	</@shiro.hasPermission>
+</#macro>
+
+<#--分页-->
+<#macro pagehelper page displayedPages="5" edges="3" url="">
+<#if page?exists && page.pages gt 1>
+	<nav class="pageNav">
+	<ul class="pagination pull-right" id="pagination">
+			<#--格式 <(上一页) 1 2 3 4 >(下一页) -->
+			<li class="prev <#if (page.pageNum)==1> disabled" ><a<#else> "><a href="${url}&pageNo=${page.pageNum-1}" </#if> target="_self"><i class="fa fa-angle-left">上一页</i></a></li>
+				<#list 1..page.pages as i>
+					<li <#if page.pageNum==i>class="active" ><a<#else> ><a href='${url}&pageNo=${i}'</#if>  target="_self">${i}</a></li>
+				</#list>
+			<li class="next <#if page.pageNum == page.pages>disabled" ><a<#else> "><a href="${url}&pageNo=${page.pageNum+1}"</#if>  target="_self"><i class="fa fa-angle-right">下一页</i></a></li>
+	</ul>
+	</nav>
+	
+</#if>
+</#macro>
+
+
+<#--分页-->
+<#macro showPage page displayedPages="5" edges="3">
+<#if page?exists && page.pageCount gt 1>
+	<nav class="pageNav">
+	<ul class="pagination pull-right" id="pagination">
+		<#if displayedPages?has_content && edges?has_content>
+		
+					<script>
+				$(function(){
+					$('#pagination').pagination({
+						pages: ${page.pageCount},
+						cssStyle: 'pagination pull-right',
+						displayedPages: ${displayedPages?default(1)},
+						hrefTextPrefix:"${page.linkUrl}pageNo=",
+						currentPage:${page.pageNo+1},
+						edges:<#if edges?has_content>${edges?default(3)}<#else>3</#if>
+					});
+				})
+			</script>
+			
+		<#else>
+			<#--格式 <(上一页) 1 2 3 4 >(下一页) -->
+			<li class="prev <#if (page.pageNo+1)==1> disabled" ><a<#else> "><a href="${page.previousUrl}" </#if> target="_self"><i class="fa fa-angle-left">上一页</i></a></li>
+				<#list 1..page.pageCount as i>
+					<li <#if page.pageNo+1==i>class="active" ><a<#else> ><a href='${page.linkUrl}pageNo=${i}'</#if>  target="_self">${i}</a></li>
+				</#list>
+			<li class="next <#if page.pageNo+1 == page.pageCount>disabled" ><a<#else> "><a href="${page.nextUrl}"</#if>  target="_self"><i class="fa fa-angle-right">下一页</i></a></li>
+		</#if>
+	</ul>
+	</nav>
+	
+</#if>
+</#macro>
+<#macro method>
+	${baseUrl}
+</#macro>
+
+
+

+ 173 - 0
src/main/webapp/WEB-INF/manager/include/manager.ftl

@@ -0,0 +1,173 @@
+<#--4.5.5版本该文件废弃->
+<#--后台的UI界面通用区域定义 -->
+<#macro html5 width="100%" style="">
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<#include "${managerViewPath}/include/macro.ftl"/>
+		<#include "${managerViewPath}/include/meta.ftl"/>
+	</head>
+	<body>
+		<div class="ms-content">
+				<div class="ms-content-body" style="width:${width};${style}">
+		   			<#nested/>
+		   		</div>
+		</div>
+	</body>
+</html>
+</#macro>
+
+<#macro panel style="">
+	    <div class="ms-content-body-panel" style="${style}"> 
+	   		<#nested/>
+	    </div>
+</#macro>
+
+<#--主体结构-->
+<#macro content>
+	<div class="ms-content">
+		<#nested/>
+	</div>
+</#macro>
+
+<#--左侧菜单-->
+<#macro contentMenu style="">
+   <div class="ms-content-menu" style="${style}">
+   		<#nested/>
+    </div>
+</#macro>
+<#--废弃-->
+<#macro left>
+   <div class="ms-content-menu">
+   		<#nested/>
+    </div>
+</#macro>
+
+<#--内容-->
+<#macro contentBody width="100%" style="">
+   <div class="ms-content-body" style="width:${width};${style}">
+   		<#nested/>
+    </div>
+</#macro>
+<#--内容导航-->
+<#--button:格式为map 例如:button={"text":标题,"link":默认返回}-->
+<#macro contentNav title="板块名称">
+    <div class="ms-content-body-title">
+        <strong>${title}</strong>
+        <#nested/>
+    </div>
+</#macro>
+
+<#--搜索按钮组-->
+<#macro searchBtnGroup size="1">
+    <@ms.col size="${size}" style="text-align:right;border-top: 1px #EAEAEA solid;padding-top: 10px;">
+        <#nested/>
+    </@ms.col>
+</#macro>
+
+<#-- 分割线-->
+<#macro panelNav empty=false>
+    <div class="ms-content-body-panel-nav"  <#if empty>style="  padding: 0;"</#if>>
+        <#nested/>
+    </div>
+</#macro>
+<#--列表上面导航条右侧的过滤按钮区域 右浮动  -->
+<#macro panelNavFilter>
+      <div style="float:right;">
+        <#nested/>
+    </div>
+</#macro>
+<#--列表按钮组  如下拉菜单-->
+<#macro panelNavBtnGroup role="group" btn="" >
+	<div class="btn-group" role="${role}">
+		 <#nested/> 
+	</div>
+</#macro>
+<#-- 判断按钮的传入参数是否为空值 -->
+<#macro isPanelNavBtn class _class id _id>
+	<#assign _id="${_id}"/>
+	<#if id?has_content>
+		<#assign _id="${id}" />
+	</#if>
+	
+	<#assign _class="${_class}">
+	<#if class?has_content>
+		<#assign _class="${class}">
+	</#if>
+</#macro>
+
+
+<#macro panelNavBtnAdd value="" icon="plus" class="default" id="addButton" onclick="" title="">
+	<@ms.isPanelNavBtn id="${id}" _id="addButton" class="${class}" _class="default"/>
+	<@ms.button icon="${icon}" id="${_id}" value="${value} " icon="${icon}"  class="btn btn-${_class}" onclick="${onclick}" title="${title}"/>
+</#macro>
+<#macro panelNavBtnDel value="" icon="trash" class="danger" id="delButton" onclick="" title="">
+	<@ms.isPanelNavBtn id="${id}" _id="delButton" class="${class}" _class="danger"/>
+	<@ms.button icon="${icon}" value="${value} " icon="${icon}" id="${id}" class="btn btn-${_class}"  onclick="${onclick}" title="${title}"/>
+</#macro>
+<#macro contentNavBack value="返回" icon="share-alt" class="default"  onclick="javascript:history.go(-1)" title="返回">
+	<@ms.button  value="${value}" icon="${icon}"  onclick="${onclick}"  class="btn btn-${class}"   title="${title}"/>
+</#macro>
+<#macro panelNavBtnSave value="保存" icon="disk" class="default" id="saveButton" onclick="" title="保存" >
+	<@ms.button class="btn btn-success" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}"/>
+</#macro>
+<#---->
+<#macro contentPanel style="">
+    <div class="ms-content-body-panel" style="${style}"> 
+   		<#nested/>
+    </div>
+</#macro>
+
+
+<#--整行-->
+<#macro row>
+	<div class="row">
+	<#nested/>
+	</div>
+</#macro>
+
+<#--整列-->
+<#macro col size="1" style="">
+	<div class="col-md-${size} col-sm-${size}" style="${style}">
+		<#nested/>
+	</div>
+</#macro>
+
+<#--提示没有数据-->
+<#macro nodata content="暂无数据" style="text-align:center">
+	<p class="alert alert-info" role="alert" style="${style}">
+		${content}
+	</p>
+</#macro>
+
+
+<#--表格列表-->
+<#macro table head="" list="" id="">
+ <table class="table table-hover">
+	<!--表格栏目属性 开始-->
+    <thead>
+        <tr>
+        	<#if head?has_content>
+				<#list head as h>
+						<#if h?html?length gt 5 &&  h?html?substring(0,6)=="&lt;th">
+							${h}
+						<#else>
+							<th>
+							 	${h}
+		        	        </th>
+	        	        </#if>
+	        	</#list>        	
+        	</#if>
+        </tr>
+    </thead>
+    <!--表格栏目属性 结束-->
+     <tbody id=${id}>
+    	<#nested/>
+     </tbody>
+ </table>
+</#macro>
+
+
+
+
+

+ 98 - 0
src/main/webapp/WEB-INF/manager/include/meta.ftl

@@ -0,0 +1,98 @@
+  <base target="mainFrame" />
+  <#assign static="${basePath}/static">
+  <#setting url_escaping_charset='utf-8'> 
+  <#assign bootstrap="3.3.5">
+  <#assign manager_ui="4.6.4">
+  <#assign easyui="1.5">
+  <meta content="IE=edge" http-equiv="X-UA-Compatible" /> 
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> 
+  <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/animate/1.0.0/animate.css" media="all" /> 
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/iconfont/1.0.0/iconfont.css"/>
+    
+  <script type="text/javascript" src="${static}/plugins/jquery/1.9.1/jquery-1.9.1.js"></script> 
+  <script type="text/javascript" src="${static}/plugins/jquery.serializeJSON/2.8.1/jquery.serializejson.min.js"></script> 
+  
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/ztree/3.5/zTreeStyle.css" media="all" /> 
+  <script type="text/javascript" src="${static}/plugins/ztree/3.5/jquery.ztree.all-3.5.min.js"></script> 
+  
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/bootstrap/${bootstrap}/css/bootstrap.min.css" media="all" /> 
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/bootstrap/${bootstrap}/css/bootstrap-switch.css" media="all" /> 
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/bootstrap/${bootstrap}/css/bootstrapValidator.css" media="all" /> 
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/bootstrap/${bootstrap}/css/bootstrap-notify.css" media="all" />
+  
+  <script type="text/javascript" src="${static}/plugins/bootstrap/${bootstrap}/js/bootstrap.min.js"></script> 
+  <script type="text/javascript" src="${static}/plugins/bootstrap/${bootstrap}/js/bootstrap-switch.min.js"></script>   
+  <script type="text/javascript" src="${static}/plugins/bootstrap/${bootstrap}/js/bootstrapValidator.js"></script> 
+  <script type="text/javascript" src="${static}/plugins/bootstrap/${bootstrap}/js/bootstrap-notify.js"></script>
+  
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/select2/4.0.3/css/select2.min.css" media="all" />
+  <script type="text/javascript" src="${static}/plugins/select2/4.0.3/js/select2.min.js"></script>
+  
+	<!--时间插件-->
+  <script type="text/javascript" src="${static}/plugins/jquery.validation/1.15.0/jquery.validate.min.js"></script>
+  <script type="text/javascript" src="${static}/plugins/jquery.tmpl/1.4.2/jquery.tmpl.min.js"></script>
+  <!--时间插件-->
+  <link href="${static}/plugins/bootstrap.daterangepicker/1.3.4/daterangepicker.css" rel="stylesheet">
+  <script type="text/javascript" src="${static}/plugins/bootstrap.daterangepicker/1.3.4/moment.js"></script>
+  <script type="text/javascript" src="${static}/plugins/bootstrap.daterangepicker/1.3.4/daterangepicker.js"></script>
+  <script type="text/javascript" src="${static}/plugins/jquery.cookie/2.2.0/jquery.cookie.js"></script>
+    
+  <!----上传图片--->
+  <script type="text/javascript" src="${static}/plugins/jquery.swfupload/1.0.0/swfupload.js"></script>
+  <script type="text/javascript" src="${static}/plugins/jquery.swfupload/1.0.0/jquery.swfupload.js"></script>
+  <script type="text/javascript" src="${static}/plugins/jquery.swfupload/1.0.0/fileprogress.js"></script>
+  <!--script type="text/javascript" src="${static}/plugins/plupload/2.2.1/plupload.full.min.js"></script-->
+  
+  <!--后台UI--> 
+  <script type="text/javascript" src="${static}/skin/manager/${manager_ui}/js/ms.manager.js"></script>
+  <script type="text/javascript" src="${static}/skin/manager/${manager_ui}/js/ms.web.js"></script>
+  
+  <!--easyUI-->
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/jquery.easyui/${easyui}/themes/default/easyui.css">
+  <link rel="stylesheet" type="text/css" href="${static}/plugins/jquery.easyui/${easyui}/themes/icon.css">
+  <script type="text/javascript" src="${static}/plugins/jquery.easyui/${easyui}/jquery.easyui.min.js"></script>
+
+  <!--bootstrap=table-->
+  <link rel="stylesheet" href="${static}/plugins/bootstrap-table/1.11.1/bootstrap-table.css">
+  <link rel="stylesheet" href="${static}/plugins/bootstrap-table/1.11.1/extensions/tree-column/bootstrap-table-tree-column.css">
+  <script src="${static}/plugins/bootstrap-table/1.11.1/bootstrap-table.js"></script>
+  <script src="${static}/plugins/bootstrap-table/1.11.1/extensions/tree-column/bootstrap-table-tree-column.min.js"></script>
+  <script src="${static}/plugins//bootstrap-table/1.11.0/locale/bootstrap-table-zh-CN.min.js"></script>
+  
+  <!-- vue框架所需要的资源 -->
+  <script src="${static}/plugins/hammerjs/2.0.8/hammer.min.js"></script>
+  <script src="${static}/plugins/vue/2.3.3/vue.min.js"></script>
+	
+  <link rel="stylesheet" type="text/css" href="${static}/skin/manager/${manager_ui}/css/ms.manager.min.css" media="all" />
+  <#assign skin_manager_logo="${static}/skin/manager/${manager_ui}/images/logo.png"/>  
+  <#assign skin_manager_loadding="${static}/skin/manager/${manager_ui}/images/loading.gif"/>  
+  
+
+       
+  <#include "${managerViewPath}/include/macro.ftl"/>
+  <script>
+    var basePath = "${basePath}";
+    var base = "${base}";
+    var managerPath = "${managerPath}";
+    var static = "${static}";
+    $(function() {
+    			//启用工具提示
+		   //	$("[data-toggle='tooltip']").tooltip();
+		   //	$("[data-toggle='popover']").popover({html:true});
+    })
+	<#if manager_session?exists>
+		var websiteId= "${manager_session.basicId?default('0')}" ;
+	</#if>
+  </script>	 
+		<!-- HTML5 shim and Respond.js IE8 support of HTML5 elements and media queries -->
+		<!--[if lt IE 9]>
+		  <script src="${base}/https://oss.maxcdn.com/html5shiv/3.7.2/html5shiv.min.js"></script>
+		  <script src="${base}/https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
+		<![endif]-->
+	
+	<script type="text/javascript" charset="utf-8" src="${base}/static/plugins/ueditor/1.4.3.1/ueditor.parse.js"></script>
+	<script type="text/javascript" charset="utf-8" src="${base}/static/plugins/ueditor/1.4.3.1/ueditor.config.js"></script>
+	<script type="text/javascript" charset="utf-8" src="${base}/static/plugins/ueditor/1.4.3.1/ueditor.all.js"></script>
+	<script type="text/javascript" charset="utf-8" src="${base}/static/plugins/ueditor/1.4.3.1/lang/zh-cn/zh-cn.js"></script>

+ 6 - 0
src/main/webapp/WEB-INF/manager/include/ui/attributes.ftl

@@ -0,0 +1,6 @@
+<#if id?? && id!=""> id="${id}"</#if><#rt/>
+<#if ajaxUrl?? && ajaxUrl!=""> data-ajax-url="${ajaxUrl}"</#if><#rt/>
+<#if class?? && class!=""> class="${class}"</#if><#rt/>
+<#if style?? && style!=""> style="${style}"</#if><#rt/>
+<#if  onclick?? && onclick!=""> onclick="${onclick}"</#if><#rt/>
+<#rt/>

+ 333 - 0
src/main/webapp/WEB-INF/manager/include/ui/button.ftl

@@ -0,0 +1,333 @@
+<#--
+表单相关按钮存放区域
+-->
+<#macro buttonarea id="" label="" class="form-group" style="clear: both;" size="">
+<div class="${class} ms-form-group" 
+	<#if id!=""> id="${id}"</#if><#rt/>
+	<#if style?? && style?string!=""> style="${style}"</#if><#rt/>
+	>
+	<#if label!="">
+		<label class=" control-label text-right ms-form-label">${label}</label>
+	</#if>
+	 <div  class="ms-form-control">
+		<#nested/><#rt/>
+	 </div>
+</div>
+</#macro>
+
+<#--
+保存按钮
+-->
+<#macro savebutton value="" id="" name="" class="" style=""   disabled=false
+onclick="" click=""
+>
+	<button type="button"  class="btn btn-success"
+	<#include "/include/ui/common-attributes.ftl"/><#rt/>
+	<#if id!=""> id="${id}"</#if><#rt/>
+	>
+	<#if value!="">${value}<#else>保存</#if>
+	</button><#rt/>
+		<#if click?? && click!="" && id?? && id!="">
+		<script>
+			$(function() {
+				$("#${id}").click(function() {
+					eval(${click});
+				});
+			})
+		</script>
+	</#if>
+</#macro>
+
+<#--
+重置按钮
+-->
+<#macro resetbutton value="" id="" name="" class="" style="" size="" title="" disabled=false>
+	<button type="reset"  class="btn reset"
+	<#include "/include/ui/common-attributes.ftl"/><#rt/>
+	>
+	<#if id!=""> id="${id}"</#if><#rt/>
+	<#if value!="">${value}<#else>重置</#if>
+	</button><#rt/>
+</#macro>
+
+<#macro button value="" id="" name="" class="btn btn-primary" style=""   disabled=false
+onclick="" click="" url="" toggle="tooltip" target="bottom" icon="" title="" placement="bottom"
+>
+	<button type="button"
+	<#include "/include/ui/common-attributes.ftl"/><#rt/>
+	<#if toggle!=""> data-toggle="${toggle}"</#if><#rt/>
+	<#if onclick!=""> onclick="${onclick}"</#if><#rt/>
+	<#if target!=""> data-target="${target}"</#if><#rt/>
+	<#if id!=""> id="${id}"</#if><#rt/>
+	<#if url!=""> data-ajax-url="${url}"</#if><#rt/>
+	<#if placement!=""> data-placement="${placement}"</#if><#rt/>
+	
+	>
+	<#if value!="">${value}<#else>按钮</#if>
+	<#if icon!=""> <span class="glyphicon glyphicon-${icon}" <#if value?trim !="" >style="margin-right:5px"</#if>></span></#if>
+	
+	</button><#rt/>
+	<#if click?? && click!="" && id?? && id!="">
+		<script>
+			$(function() {
+				$("#${id}").click(function() {
+					eval(${click});
+				});
+			})
+		</script>
+	</#if>
+</#macro>
+
+
+
+
+<#--按钮组-->
+<#macro btnGroup value="" id="" name="" class="default" style="" size="" title="" disabled=false >
+  <button type="button" class="btn btn-${class}">${value}</button>
+  <button type="button" class="btn btn-${class} dropdown-toggle" data-toggle="dropdown" aria-expanded="false">
+    <span class="caret"></span>
+    <span class="sr-only">Toggle Dropdown</span>
+  </button>
+  <ul class="dropdown-menu" role="menu">
+    	<#nested/>
+  </ul>
+</#macro>
+<#--按钮组-子菜单,配合btnGroup使用-->
+<#macro btnGroupLi value="" href="" class="" id="" ajaxUrl="">
+    <li <#include "/include/ui/attributes.ftl"/><#rt/>><#if href !="" ><a href="${href}">${value}</a><#else>${value}</#if></li>
+</#macro>
+
+
+
+<#--添-->
+<#macro addButton value="" icon="plus" class="default" id="addButton${.now?date?string('yyyyMMddhhmmss')}" onclick="" title="添加" url="" openModal="" openModalBefor="">
+	<@ms.isPanelNavBtn id="${id}" _id="addButton" class="${class}" _class="default"/>
+	<#if url!="">
+			<@ms.button icon="${icon}" id="${id}" value="${value} " icon="${icon}"  class="btn btn-${_class}" onclick="location.href='${url}'" title="${title}"/>
+	<#else>
+		<@ms.button icon="${icon}" id="${id}" value="${value} " icon="${icon}"  class="btn btn-${_class}" onclick="${onclick}" title="${title}"/>
+	</#if>
+	<#if openModal!="">
+		<script>
+			$(function() {
+					$("#${id}").click(function() {
+						<#if openModalBefor!="">
+							eval("${openModalBefor}()");
+						</#if>
+						$("#${openModal}").modal();
+					});
+			})
+		</script>
+	</#if>
+</#macro>
+<#--删-->
+<#macro delButton value="" icon="trash" class="danger" id="delButton${.now?date?string('yyyyMMddhhmmss')}" onclick="" title="删除" fieldName="" url="">
+	<#if fieldName!="">
+		<script>
+			$(function() {
+				$("#${id}").on("click",function() {
+					var ids = "";    
+					var params = ""; 
+					var count = 0;
+					$('input[name="${fieldName}"]:checked').each(function(){    
+					   ids += $(this).val() + ",";
+					   params += "${fieldName}=" + $(this).val() + "&";
+					   count ++;
+					});   
+					if (count == 0) {
+						 <@ms.notify msg="请选择要删除的数据!"/>			
+					} else {
+						$('.deleteModal${id}').modal();
+						$("#deleteModal${id}Num").text(count);
+						
+						$('.deleteBtn${id}').on("click",function() { 
+							<#if onclick?has_content>	
+								eval(${onclick}(ids));
+							<#elseif url?has_content>
+							$(this).request({url:"${url}",type:"json",data:params,method:"post",func:function(msg) {
+								if (msg.result) {
+									<@ms.notify msg="删除成功!"/>
+									location.reload();
+								} else {
+									<@ms.notify msg="删除失败!"/>
+								}
+							}});
+							</#if>
+						});
+						
+					}
+				});				
+			})
+		</script>
+	</#if>	
+	<@ms.isPanelNavBtn id="${id}" _id="delButton" class="${class}" _class="danger"/>
+	
+	<!--删除提示-->    
+	<@ms.modal modalName="deleteModal${id}" title="删除提示!">
+		  <@ms.modalBody>
+		  		确认删除<span style="color: red; font-size: 20px;" id="deleteModal${id}Num"></span>条记录?
+	     </@ms.modalBody>
+		 <@ms.modalButton>
+	 		<@ms.button class="btn btn-danger deleteBtn${id}" value="确定删除"/>
+	 	</@ms.modalButton>
+	</@ms.modal>	
+	
+	<@ms.button icon="${icon}" value="${value} " icon="${icon}" id="${id}" class="btn btn-${_class}"  onclick="${onclick}" title="${title}"/>
+</#macro>
+
+<#macro editButton value="" icon="edit" class="warning" id="editButton${.now?date?string('yyyyMMddhhmmss')}" onclick="" title="编辑">
+	<@ms.isPanelNavBtn id="${id}" _id="editButton" class="${class}" _class="danger"/>
+	<@ms.button icon="${icon}" value="${value} " icon="${icon}" id="${id}" class="btn btn-${_class}"  onclick="${onclick}" title="${title}"/>
+</#macro>
+
+<#macro queryButton value="查询" icon="search" class="default" id="queryButton${.now?date?string('yyyyMMddhhmmss')}" onclick="" title="查询" form="" >
+	<@ms.button class="btn btn-info" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}"/>
+	<#if onclick=="" && form!="">
+	<script>
+		$(function() {
+			$("#${id}").click(function() {
+					$("#${form}")[0].submit();
+			})
+		})
+	</script>
+	</#if>
+</#macro>
+<#--返回-->
+<#macro backButton value="返回" icon="share-alt" class="default" id="backButton${.now?date?string('yyyyMMddhhmmss')}"  onclick="javascript:history.go(-1)" title="返回">
+	<@ms.button  value="${value}" icon="${icon}"  onclick="${onclick}"  class="btn btn-${class}"   title="${title}" id="${id}"/>
+</#macro>
+<#--保存-->
+<#macro saveButton value="保存" icon="floppy-saved" class="default" id="saveButton${.now?date?string('yyyyMMddhhmmss')}" onclick="" title="保存" postForm="" postBefor="" postAfter="">
+	<@ms.button icon="${icon}" class="btn btn-success" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}" />
+	<@ms.event postForm="${postForm}"  postBefor="${postBefor}" postAfter="${postBefor}" id="${id}"/>
+</#macro>
+<#macro updateButton value="更新" icon="open" class="default" id="updateButton" onclick="" title="更新"  postForm="" postBefor="" postAfter="" postForm="" postBefor="" postAfter="">
+	<@ms.button icon="${icon}" class="btn btn-success" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}"/>
+	<@ms.event postForm="${postForm}"  postBefor="${postBefor}" postAfter="${postBefor}" id="${id}"/>
+</#macro>
+<#macro resetButton value="重置" icon="retweet" class="warning" id="resetButton${.now?long}" onclick="" title="重置" form="" >
+	<@ms.button icon="${icon}" class="btn btn-warning" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}"/>
+	<script>
+	    <#--优先click事件-->
+		<#if onclick=="">
+		$(function() {
+			$("#${id}").click(function() {
+				<#if form!="">
+					$("#${form}")[0].reset();
+				<#else>
+					$("#${id}").parents("form:first")[0].reset();
+				</#if>
+			})
+		})
+		</#if>
+	</script>
+</#macro>
+<#macro exportButton value="导出" icon="export" class="default" id="exportButton" onclick="" title="导出" >
+	<@ms.button icon="${icon}" class="btn btn-default" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}"/>
+</#macro>
+<#macro importButton value="导入" icon="import" class="warning" id="importButton" onclick="" title="导入" >
+	<@ms.button icon="${icon}" class="btn btn-default" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}"/>
+</#macro>
+<#macro setingButton value="设置" icon="cog" class="warning" id="importButton" onclick="" title="设置" >
+	<@ms.button icon="${icon}" class="btn btn-primary" value="${value} " icon="${icon}" id="${id}"   onclick="${onclick}" title="${title}"/>
+</#macro>
+
+<#macro event postForm=""  postBefor="" postAfter="" id="">
+	<#if postForm!="">
+		<script>
+			$(function() {
+				$("#${id}").click(function() {
+					var vobj = true;
+					try {
+						vobj = $("#${postForm}").data('bootstrapValidator').validate().isValid();
+					} catch (e){}
+					
+					var postBefor = true;
+						<#if postBefor!="">
+							postBefor = eval(${postBefor}()); 
+						</#if>
+						if(vobj && postBefor) {
+						
+							$(this).postForm("#${postForm}",{func:function(msg) {
+								if (msg.result) {
+						     		//history.back();
+									 <@ms.notify msg="保存成功!" type="success"/>			
+									 var redirect = $("#${postForm} input[name='redirect']").val();
+									 if (redirect!="") {
+									 	location.href=redirect;
+									 }
+									 <#if postAfter!="">
+									 	eval(${postAfter}(msg));
+									 </#if>
+									 
+						    	}else{
+						    		 var message = msg.resultMsg; 
+						    		 if (message=="" || message==undefined) {
+						    		 	message="后台验证失败";
+						    		 }
+						    		 $('.ms-notifications').notify({
+						    		    type:'warning',
+									    message: { text:message }
+									 }).show();
+						    	}
+							}});
+					    } else {
+							<@ms.notify msg="验证失败,请重新输入!" />
+									 
+					    }			
+				});
+			})	
+		</script>
+	</#if>
+</#macro>
+
+<#--按钮组-->
+<#macro buttonGroup role="group">
+	<div class="btn-group" role="${role}">
+		 <#nested/> 
+	</div>
+</#macro>
+
+<#macro menuButton links name="菜单名称" class="default">
+<div class="btn-group dropdown"> 
+  <button type="button" class="btn btn-${class}">${name}</button>
+  <button type="button" class="btn btn-${class} dropdown-toggle" data-toggle="dropdown"  aria-expanded="false">
+    <span class="caret"></span>
+    <span class="sr-only"></span>
+  </button>
+  <ul class="dropdown-menu">
+      <#list links as b>
+      	<li><a href="javascript:${b.click?default("void")}()">${b.name?default("菜单")}</a></li>
+      </#list>
+  </ul>
+</div>
+</#macro>
+ 
+<#macro switchButton name on off size="small" value="" class="" color="default" onclass="danger" offclass="primary">
+	<input type="checkbox" class="ms-button-switch-${name}" data-on="${onclass}" data-off="${offclass}" data-size="${size}" data-on-text="${on.text}"  data-off-text="${off.text}" data-off-color="${color}"/>
+	<script>
+		$(function() {
+			<#if value!="">
+				<#if value==on.value?string>
+					$(".ms-button-switch-${name}").bootstrapSwitch('state', true);
+				<#else>
+					$(".ms-button-switch-${name}").bootstrapSwitch('state', false);
+				</#if>
+			<#else>
+				$(".ms-button-switch-${name}").bootstrapSwitch('state', true);
+			</#if>
+			
+			$('.ms-button-switch-${name}').on('switchChange.bootstrapSwitch', function(event, state) {
+				if (state) {
+					$("input[name='${name}']").val('${on.value}');
+				} else {
+					$("input[name='${name}']").val('${off.value}');
+				}
+			});
+			
+		})
+	</script>
+	<input type="hidden" name="${name}" value="${value}"/>
+</#macro>
+
+

+ 5 - 0
src/main/webapp/WEB-INF/manager/include/ui/checkboxlist-item.ftl

@@ -0,0 +1,5 @@
+	<label class="ms-check"><input type="checkbox"<#rt/>
+	 value="${rkey}"<#rt/>
+	<#if valueList?seq_contains(rkey)> checked="checked"</#if><#rt/>
+	<#include "/include/ui/common-attributes.ftl"/><#rt/>
+	/> ${rvalue}</label><#if hasNext> </#if>

+ 46 - 0
src/main/webapp/WEB-INF/manager/include/ui/checkboxlist.ftl

@@ -0,0 +1,46 @@
+<#--
+4.5.5开始废弃
+<input type="checkbox"/>
+-->
+<#macro checkboxlist
+	list listKey="" listValue="" valueList=[]
+	label=""     colon=":" hasColon="true"
+	id="" name="" class="" style="" size="" title="" disabled=false
+	validation="" direction=true
+	width=""
+	labelStyle=""
+	help=""
+	>
+<div class="form-group ms-form-group">	
+	<#include "control.ftl"/><#rt/>
+	<div class="col-sm-10" <#if width!=""> style="${width}px"</#if><#rt/>>
+		<#if list?is_sequence>
+			<#if listKey!="" && listValue!="">
+				<#list list as item>
+					<#local rkey=item[listKey]>
+					<#local rvalue=item[listValue]>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "checkboxlist-item.ftl"><#t/>
+				</#list>
+			<#else>
+				<#list list as item>
+					<#local rkey=item>
+					<#local rvalue=item>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "checkboxlist-item.ftl"><#t/>
+				</#list>
+			</#if>
+		<#else>
+			<#list list?keys as key>
+				<#local rkey=key/>
+				<#local rvalue=list[key]/>
+				<#local index=key_index>
+				<#local hasNext=key_has_next>
+				<#include "checkboxlist-item.ftl"><#t/>
+			</#list>
+		</#if>
+	</div>
+</div>	
+</#macro>

+ 16 - 0
src/main/webapp/WEB-INF/manager/include/ui/common-attributes.ftl

@@ -0,0 +1,16 @@
+<#if name!=""> name="${name}"</#if><#rt/>
+<#if class!=""> class="${class}"</#if><#rt/>
+<#if style!=""> style="${style}"</#if><#rt/>
+<#if title?? && title!=""> title="${title}"</#if><#rt/>
+<#if disabled?? && disabled> disabled="disabled"</#if><#rt/>
+<#if maxlength?? && maxlength!=""> maxlength="${maxlength}"</#if><#rt/>
+<#if minlength?? && minlength!=""> minlength="${minlength}"</#if><#rt/>
+<#if name!=""> name="${name}"</#if><#rt/>
+<#if placeholder?? && placeholder!=""> placeholder="${placeholder}"</#if><#rt/>
+<#if  validation?? && validation?has_content><#--验证框架,需要bootstrapValidator框架-->
+	<#list validation?keys as key>
+		${key}="${validation[key]}"<#rt/>
+	</#list>
+</#if>
+<#if  onclick?? && onclick!=""> onclick="${onclick}"</#if><#rt/>
+<#rt/>

+ 15 - 0
src/main/webapp/WEB-INF/manager/include/ui/control.ftl

@@ -0,0 +1,15 @@
+<#if label!="">
+	<#assign tmp="2">
+	<label <#if name?? && name!="">for="${name}"</#if> <#if labelStyle?? && labelStyle!="">style="${labelStyle?default('')}"</#if> <#if colSm?? && colSm!=""><#assign tmp="${colSm}"></#if> class="col-sm-${tmp} control-label ">
+	<#if help!="">
+		<script>
+			$(function () {
+			  $('[data-toggle="popover"]').popover()
+			})
+		</script>
+		<span tabindex="0" class="glyphicon glyphicon-question-sign" data-toggle="popover"  role="button" data-trigger="focus" data-container="body" data-placement="${helpDirection?default('rigth')}" title="提示" data-content="${help}"></span>
+	</#if>	
+	${label}
+	</label>
+	
+</#if>

+ 81 - 0
src/main/webapp/WEB-INF/manager/include/ui/date.ftl

@@ -0,0 +1,81 @@
+<#--
+<input type="text"/>
+-->
+<#macro date    id=""    name=""    value="" begin="" end="" limit="30"  
+	time=false single=false label=""	title=""	size=""	width=""
+	class="form-control"	 style=""	readonly=""	validation=""   disabled=false	 maxlength=""	minlength=""	 placeholder="" ranges=true
+	labelStyle=""
+	help=""
+	helpDirection=""
+	>
+<div class="form-group ms-form-group">	
+	<#include "control.ftl"/><#rt/>
+			<div class="control-group col-sm-9 ms-from-group-input has-feedback" style="min-width:200px;<#if width!=""> width:${width}px"</#if>"<#rt/>>
+		            <div class="controls">
+			             <div class="input-prepend input-group">
+			               <span class="add-on input-group-addon"><i class="glyphicon glyphicon-calendar fa fa-calendar"></i></span>
+							<input type="text"<#rt/>
+							<#if id!=""> id="${id}"<#elseif name!="">id="${name}"</#if><#rt/>
+							<#if maxlength!=""> maxlength="${maxlength}"</#if><#rt/>
+							<#if readonly!=""> readonly="${readonly}"</#if><#rt/>
+							<#if value?? && value?string!=""> value="${value?html}"</#if><#rt/>
+							<#include "common-attributes.ftl"/><#rt/>
+							/><#rt/> 
+			             </div>
+		            </div>
+	          </div>	 
+</div>
+<script>
+  var ${name}Set = {
+    startDate: moment().subtract(29, 'days'),
+    endDate: moment(),
+    <#if begin?has_content>minDate: '${begin?string('yyyy-MM-dd')}',</#if>
+     <#if end?has_content>maxDate: '${end?string('yyyy-MM-dd')}',</#if>
+    dateLimit: { days: ${limit} },
+    showDropdowns: true,
+    showWeekNumbers: true,
+    <#if time>
+    timePicker: true,
+    timePickerIncrement: 1,
+    </#if>
+    <#if single>singleDatePicker: true,</#if>
+    timePicker12Hour: true,
+    <#if ranges>
+    ranges: {
+       '今天': [moment(), moment()],
+       '昨天': [moment().subtract(1, 'days'), moment().subtract(1, 'days')],
+       '最近7天': [moment().subtract(6, 'days'), moment()],
+       '最近30天': [moment().subtract(29, 'days'), moment()],
+       '当月': [moment().startOf('month'), moment().endOf('month')],
+       '上个月': [moment().subtract(1, 'month').startOf('month'), moment().subtract(1, 'month').endOf('month')],
+    },
+    </#if>
+    opens: 'left',
+    buttonClasses: ['btn btn-default'],
+    applyClass: 'btn-small btn-primary',
+    cancelClass: 'btn-small',
+    format: 'YYYY-MM-DD<#if time> HH:mm:ss</#if>',
+    separator: '至',
+    locale: {
+        applyLabel: '确认',
+        cancelLabel: '取消',
+        //fromLabel: '开始时间',
+        //toLabel: '结束时间',
+        customRangeLabel: '自定义',
+        daysOfWeek: ['日', '一', '二', '三', '四', '五','六'],
+        monthNames: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'],
+        firstDay: 1
+    }
+  };
+                  
+   var ${name}Func = function(start, end, label) {
+    //alert("Callback has fired: [" + start.format('MMMM D, YYYY') + " to " + end.format('MMMM D, YYYY') + ", label = " + label + "]");
+    //$('#subscribeReplyForm').formValidation('revalidateField', "${name}");
+  }
+	$('#${name}').daterangepicker(${name}Set, ${name}Func);
+	      $('#${name}').on('apply.daterangepicker', function(ev, picker) {
+	           // $('#${name}').parents("form:first").data('bootstrapValidator').revalidateField('<#if id!="">${id}<#elseif name!="">${name}</#if>');
+	 });
+</script>
+
+</#macro>

+ 98 - 0
src/main/webapp/WEB-INF/manager/include/ui/editor.ftl

@@ -0,0 +1,98 @@
+<#--简易编辑器-->
+<#--name:输入框名称-->
+<#--width\height:编辑器的宽度高度-->
+<#--content:初始化内容-->
+<#macro editor name label=""  content="" validation="" width="100%" height="480" labelStyle="" appId="" help="" helpDirection="" colSm=""> 
+<div class="form-group ms-form-group">	
+	<#include "control.ftl"/><#rt/>	
+	<div class="ms-form-control ms-from-group-input col-sm-9 has-feedback">
+	<script type="text/plain" id="editor_${name}" name="${name}" style="width:${width}px;height:${height}px">${content?default('')}</script>
+	<script type="text/javascript">
+	 
+		//实例化编辑器
+		//建议使用工厂方法getEditor创建和引用编辑器实例,如果在某个闭包下引用该编辑器,直接调用UE.getEditor('editor')就能拿到相关的实例
+		//  var ue = UE.getEditor('editor_${name}');
+       var URL = window.UEDITOR_HOME_URL || "${base}/static/plugins/ueditor/1.4.3.1/";
+	   var ue = UE.getEditor('editor_${name}', {
+       		imageScaleEnabled :true,
+       		// 服务器统一请求接口路径
+       		serverUrl: URL + "jsp/msController.jsp?jsonConfig=%7BvideoUrlPrefix:'${base}',fileUrlPrefix:'${base}',imageUrlPrefix:'${base}',imagePathFormat:'/upload/${appId?default(0)}/editor/%7Btime%7D',filePathFormat:'/upload/${appId?default(0)}/editor/%7Btime%7D',videoPathFormat:'/upload/${appId?default(0)}/editor/%7Btime%7D'%7D", 
+			autoHeightEnabled: true,
+			autoFloatEnabled: false,
+			scaleEnabled: true,
+        	compressSide:0,
+        	maxImageSideLength:2000,
+			maximumWords: 80000,
+		});
+		//重新设置编辑器的style
+		ue.ready(function () {
+        	$(".edui-editor-bottomContainer").height(30);
+   	    });   
+   	                                                       
+	</script>
+	</div>
+</div>
+</#macro>
+
+
+
+<#--简易编辑器-->
+<#--inputName:输入框名称-->
+<#--width\height:编辑器的宽度高度-->
+<#--content:初始化内容-->
+<#macro smallUedit inputName width height content>
+
+	    <script type="text/plain" id="editor_${inputName}" name="${inputName}">${content?default('')}</script>
+	    
+		  <div class="editor-bottom-bar">
+		    当前已输入
+		    <span class="char_count">
+		      0
+		    </span>
+		    个字符, 您还可以输入
+		    <span class="char_remain">
+		      80000
+		    </span>
+		    个字符。
+		  </div>    
+	    <style>
+		.editor-bottom-bar {
+			white-space: nowrap;
+			border: 1px solid #ccc;
+			line-height: 20px;
+			font-size: 12px;
+			text-align: right;
+			margin-right: 5px;
+			color: #aaa;
+			border-top: 0;
+			width:  ${width}px;
+		}
+		</style>
+	
+		<script type="text/javascript">
+				var charLimit = 80000;
+		    	window.editor_${inputName} = new UE.ui.Editor({
+					initialFrameWidth : ${width},
+					initialFrameHeight : ${height}
+				});
+				window.editor_${inputName}.render("editor_${inputName}");
+		    	function computeChar() {
+		    	
+					var len = editor_${inputName}.getContent().length;
+					if (len > charLimit) {
+						$(".editor-bottom-bar").html("<span style='color:red;'>你输入的字符个数("
+								+ len + ")已经超出最大允许值!</span>")
+					} else {
+						$(".editor-bottom-bar").html("当前已输入<span class='char_count'>" + len
+								+ "</span>个字符, 您还可以输入<span class='char_remain'>"
+								+ (charLimit - len) + "</span>个字符。")
+					}
+				}
+				
+				window.editor_${inputName}.addListener("keyup", function(type, evt) {
+					computeChar()
+				})
+				
+				
+		</script>
+</#macro>

+ 19 - 0
src/main/webapp/WEB-INF/manager/include/ui/file.ftl

@@ -0,0 +1,19 @@
+<#--
+<input type="file"/>
+-->
+<#macro file
+	accept="" value=""
+	label="" noHeight="false" required="false" colspan="" width="100" help="" helpPosition="2" colon=":" hasColon="true"
+	id="" name="" class="" style="" size="" title="" disabled="" tabindex="" accesskey="" labelStyle=""
+	onclick="" ondblclick="" onmousedown="" onmouseup="" onmouseover="" onmousemove="" onmouseout="" onfocus="" onblur="" onkeypress="" onkeydown="" onkeyup="" onselect="" onchange=""
+	>
+<#include "control.ftl"/><#rt/>
+<input type="file"<#rt/>
+<#if id!=""> id="${id}"</#if><#rt/>
+<#if accept!=""> accept="${accept}"</#if><#rt/>
+<#if value!=""> value="${value}"</#if><#rt/>
+<#include "common-attributes.ftl"/><#rt/>
+<#include "scripting-events.ftl"/><#rt/>
+/>
+<#include "control-close.ftl"/><#rt/>
+</#macro>

+ 139 - 0
src/main/webapp/WEB-INF/manager/include/ui/form.ftl

@@ -0,0 +1,139 @@
+<#--
+<form></form>
+name:表单名称
+id:表单id
+action:提交地址
+method:提交方式
+-->
+<#macro form  name id="" target=""
+	 action="" method="post"  enctype=""  
+	 class="form-horizontal"  style="display:none; width:100%; background-color: white;" isvalidation=false tooltip=false
+	 redirect=""
+	 >
+<form<#rt/>
+ role="form"<#rt/>
+ method="${method}"<#rt/>
+ action="${action}"<#rt/>
+<#if target!="">target="${target}" <#else> target="_self"</#if><#rt/>
+
+<#if id!=""> id="${id}"<#else> id="${name}"</#if><#rt/>
+<#if enctype!=""> enctype="${enctype}"</#if><#rt/>
+<#include "/include/ui/common-attributes.ftl"/><#rt/>
+>
+<@ms.hidden name="redirect" value="${redirect}"/>
+<#nested/><#rt/>
+<script>
+	$(function() {
+				var id = "${name}";
+				<#if id?? && id!="">id="${id}"</#if>
+				$('#'+id).fadeIn("slow");
+				<#if isvalidation>
+				$('#'+id).bootstrapValidator({
+						<#if tooltip>
+				        container: 'tooltip',
+				        </#if>
+				        feedbackIcons: {
+				            valid: 'glyphicon glyphicon-ok',
+				            invalid: 'glyphicon glyphicon-remove',
+				            validating: 'glyphicon glyphicon-refresh'
+				        }
+						
+				});	
+				
+				</#if>
+				//$("#${name} .form-group>div.radio").siblings("i.form-control-feedback").clone().prependTo($("#${name} .form-group>div.radio"));
+				//$("#${name} .form-group>div.radio").siblings("i.form-control-feedback").remove();
+				<#if !class?has_content>
+					
+					$("#${name} .form-group>label").removeClass("col-sm-2");
+					$("#${name} .form-group>div").removeClass("col-sm-9");
+					var width = $("#${name} .form-group>div.ms-from-group-input").width();
+					//$("#${name} .form-group>div.ms-from-group-input>:input").unwrap().parent().width(width);
+					$("#${name} .form-group>div.ms-from-group-input").addClass("has-feedback").parent().width(width);
+					
+					//$("#${name} .form-group label").removeClass("checkbox-inline").removeClass("radio-inline");
+					//$("#${name} .has-feedback .form-control-feedback").css({top:"25px"});
+				<#elseif class?index_of("searchForm") gt -1>
+					$("#${name} .form-group>label").removeClass("col-sm-3");
+					$("#${name} .form-group>div").removeClass("col-sm-9");
+					
+					$("#${name} .form-group>label").addClass("col-sm-4");
+					$("#${name} .form-group>div").addClass("col-sm-8");		
+					
+					$("#${name} .ms-form-group").addClass("col-sm-4");	
+					$("#${name}").show(); 
+				</#if>
+	})
+</script>
+</form>
+</#macro>
+
+<#macro searchForm  name id="" target=""
+	 action="" method="post"  enctype=""  
+	 class="searchForm form-inline"  style="display:none;  background-color: white;" isvalidation=false tooltip=true >
+	<@ms.form name="${name}" id="${id}" action="${action}" style="display:none;background-color: white;" isvalidation=true class="${class}" tooltip=true>
+		<#nested/><#rt/>
+	</@ms.form>
+	<div class="search-form-div"></div>
+	
+	<script type="text/javascript">
+    $(function(){
+        //收缩筛选
+        var clickTimes = 1;
+        var searchFormheight = $("#searchForm").height();
+        
+        //初始化顶住筛选部分的空白div
+        $(".search-form-div").height(searchFormheight + 15);
+        var _height = parseInt(searchFormheight)-26;
+        
+        $("#searchForm").find(".close").click(function(){
+            var obj = $(this);
+            if (clickTimes % 2 == 1) {
+                //空白div与筛选同时往上缩
+                $(".search-form-div").animate({height:"0px"},"slow");
+                $("#searchForm").animate({top:"-"+_height+"px"},"slow");
+                obj.find("span").removeClass("glyphicon-chevron-up").addClass("glyphicon-chevron-down");
+            } else {
+            
+                //空白div与筛选同时展开
+                $(".search-form-div").animate({height:searchFormheight+15+"px"},"slow");
+                $("#searchForm").animate({top:"46px"},"slow");
+                obj.find("span").removeClass("glyphicon-chevron-down").addClass("glyphicon-chevron-up");
+            }
+            clickTimes++
+        })
+    })
+</script>
+	
+</#macro>
+
+<#macro searchFormButton close="">
+		<div class="bottom" style="clear:both">
+			<div class="close"><span class="glyphicon glyphicon-chevron-up"></span></div>
+			<@ms.resetButton/>
+			<#nested/><#rt/>
+		</div>
+</#macro>
+
+<#--自定义行-->
+<#macro formRow label=" " class="form-control" colSm="" groupClass="form-group" width="" labelStyle="" help="" style="" >
+	<div class="${groupClass}">	
+		<#include "/include/ui/control.ftl"/><#rt/>
+		<div class="col-sm-9 ms-from-group-input" style="line-height:30px;<#if width!=""> width:${width}px;</#if>${style}"<#rt/>>
+			<#nested/>
+		</div>
+	</div>
+</#macro>
+
+<#--
+<input type="text"/>
+-->
+<#macro fromgroup   id="" size="" label="" style="">
+<div class="form-group ms-form-group" style="${style}" help="">	
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div class="ms-form-control">
+		<#nested/><#rt/>
+	 </div>
+</div>
+</#macro>
+

+ 16 - 0
src/main/webapp/WEB-INF/manager/include/ui/index.ftl

@@ -0,0 +1,16 @@
+<#include "/include/ui/input.ftl"/>
+<#include "/include/ui/input-tree.ftl"/>
+<#include "/include/ui/select.ftl"/>
+<#include "/include/ui/textarea.ftl"/>
+<#include "/include/ui/file.ftl"/>
+<#include "/include/ui/button.ftl"/>
+<#include "/include/ui/form.ftl"/>
+<#include "/include/ui/date.ftl"/>
+<#include "/include/ui/editor.ftl"/>
+<#include "/include/ui/time.ftl"/>
+<#include "/include/ui/tree.ftl"/>
+<#include "/include/manager.ftl"/>
+<#include "/include/ui/page.ftl"/>
+<#include "/include/ui/table.ftl"/>
+<#include "/include/ui/modal.ftl"/>
+<#include "/include/ui/upload.ftl"/>

+ 167 - 0
src/main/webapp/WEB-INF/manager/include/ui/input-tree.ftl

@@ -0,0 +1,167 @@
+<#-- 树形控件,以input下拉框的形式显示(官网:http://www.ztree.me/v3/main.php#_zTreeInfo) -->
+<#-- treeId(必须):树形加载和控制区域的ID,一张页面同时加载多个树形时必须用该值进行区分 -->
+<#-- json(必须):需要加载成树形的数据,数据结构为:[{categoryId:1,categoryCategoryId:0,categoryTitle:""},{categoryId:2,categoryCategoryId:1,categoryTitle:""}] -->
+<#-- jsonId(必须):json数据中ID名称,如:categoryId -->
+<#-- jsonPid(必须):json数据中关联的父ID,如:categoryCategoryId -->
+<#-- jsonName(必须):json数据中需要显示的数据名称,如:categoryTitle -->
+<#-- rootName:顶级根节点,直接传入根节点名称即可。如:顶级分类 -->
+<#-- name(必须):隐藏input框的name与id值,用于保存选中数据的ID -->
+<#-- value:隐藏input框的val默认值,适用用于加载初始化数据 -->
+<#-- text:选择框加载的默认提示信息 -->
+<#-- parent:是否可以选择父节点,false默认不允许,true允许 --> 
+<#-- expandAll:控制节点数据显示的时候是全部展开还是全部折叠(true[默认]:全部展开,false:全部折叠)。 -->
+<#-- showIcon:是否显示文件夹图标,true(默认):显示;false:不显示 -->
+<#-- required:是否是必选项,true(默认)必选 false -->
+<#-- onclick: 选择节点后触发的事件,会注入event,treeId,treeNode三个参数,参考ztree官方文档-->
+
+<#macro inputTree treeId  json jsonId jsonPid jsonName name text
+		rootName="" value=""  parent=false onclick="" expandAll="true" showIcon="true" 
+		required=true >
+	<!-- css样式开始 -->
+	<style type="text/css">
+		.ztree${treeId}{width:100%;max-height: 240px;overflow:auto;}
+		.ztree${treeId} li a{padding:0}
+		#${treeId} i{right:0}
+	</style>	
+	<!-- css样式结束 -->
+
+	<!-- 初始化样式开始 -->
+	<div class="dropdown" id="${treeId}">
+		<button id="treeLabel${treeId}" class="form-control dropdown-toggle" data-toggle="dropdown" aria-expanded="true" style="text-align:left">
+			${text?default('请选择')}
+		</button>
+		<input type="text" style="position: absolute;height:0;border: none;" <#if name?has_content>name="${name}" id="${name}"</#if> value="${value?default(0)}"
+		<#if  required && validation?? && validation?has_content><#--验证框架,需要bootstrapValidator框架-->
+			<#list validation?keys as key>
+			${key}="${validation[key]}"<#rt/>
+			</#list>
+		<#elseif required>
+			data-bv-between="true" data-bv-between-message="请选择!" data-bv-between-min="1" data-bv-between-max="99998" required  data-bv-notempty-message="请选择分类"
+		</#if>
+		/>
+		<ul class="ztree ztree${treeId} dropdown-menu" role="menu" id="tree${treeId}" aria-labelledby="treeLabel${treeId}">
+		</ul>
+	</div>
+	<!-- 初始化样式结束 -->
+	
+	<!-- js操作方法开始 input -->	
+	<script>
+		//初始化树形数据
+		var zNodes${treeId} = <#if json?has_content>${json}<#else>[]</#if>;
+		
+		//初始化树形结构
+		var setting${treeId} = {
+			view:{//控制视图
+				fontCss:{"white-space":"normal","display":"initial","word-break":"break-all"},
+				showIcon:${showIcon},//是否显示节点文件夹图标
+				showLine:true,//是否显示借点连接线
+				expandSpeed:"",//折叠时的动画速度,参考jquery中动画效果的speed参数,三种预定速度之一的字符串("slow", "normal", or "fast")
+			},
+			data: {//控制显示数据
+				simpleData: {
+					enable: true,//是否采用简单数据模式 (Array)
+					idKey:"${jsonId}",//节点ID名称
+					pIdKey:"${jsonPid}",//父节点ID名称
+				},
+				key:{
+					name:"${jsonName}",//节点数据保存节点名称的属性名称。
+				}
+			},
+			callback: {//控制获取选择的节点数据
+				beforeClick:<#if !parent>beforeClick${treeId}<#else>null</#if>,//用于捕获单击节点之前的事件回调函数,并且根据返回值确定是否允许单击操作
+				onClick:getZtreeId${treeId},//用于捕获节点被点击的事件回调函数
+			},
+			check:{//控制节点的选中方式(暂时未启用,根据后期需求再做调整)
+				autoCheckTrigger:true,//是否触发自动勾选
+				enable:false,//节点上是否显示选择框,false:不显示,true:显示。
+				chkStyle:"checkbox",//勾选框类型(checkbox[默认值] 或 radio)
+				chkboxType:{"Y":"ps","N":"ps"},//设置勾选关联关系
+			},
+		};	
+		
+		var zTreeObj${treeId}="";
+		$(function(){
+			//自定义顶级栏目
+			<#if rootName?has_content>
+				zNodes${treeId}[zNodes${treeId}.length] = {${jsonName}:"${rootName}",${jsonId}:0,${jsonPid}:0};
+			</#if>
+			
+			//加载树形
+			$.fn.zTree.init($("#tree${treeId}"),setting${treeId},zNodes${treeId});	
+			
+			//zTree内部函数对象,主要用户调用zTree内部方法
+			zTreeObj${treeId} = $.fn.zTree.getZTreeObj("tree${treeId}");
+			
+			//展开(true)/折叠(false)全部节点(zTree内部方法)
+			zTreeObj${treeId}.expandAll(${expandAll});
+
+			//加载默认节点
+			<#if value?has_content>
+				var nodes = zTreeObj${treeId}.getNodeByParam("${jsonId}",${value},null)
+				if (nodes!=null) {
+					zTreeObj${treeId}.selectNode(nodes);
+					$("#treeLabel${treeId}").text(nodes.${jsonName});
+				}
+			</#if>
+			
+			//当属性为折叠时,控制下拉菜单的开启和关闭
+			<#if expandAll = "false">
+				$("body").on("click",function(e) {
+			        e = window.event || e; // 兼容IE7
+			        
+			        //获取当前点击事件对象
+			        var objZtree = $(e.srcElement||e.target);
+			        
+			        //获取当前点击事件ID,并对点击的子节点ID进行切割获取自定义ID
+			        var objZtreeId = objZtree.attr("id");
+			        
+			        //当用户点击选择框时还原下拉框属性
+			        if(objZtreeId != undefined && objZtreeId.split("_")[0] == "treeLabel${treeId}"){
+			        	$("#tree${treeId}").attr("style","");
+			        	return ;
+			        }
+			        
+			        //切割获取到的ID判断点击事件是否产生在下拉框
+			        if(objZtreeId != undefined && objZtreeId.split("_")[0] == "tree${treeId}"){
+			        	$("#tree${treeId}").attr("style","display:block");
+			        }else{
+			        	$("#tree${treeId}").attr("style","display:none");
+			        }
+				});
+			</#if>
+			
+		});
+		
+		<#if !parent>
+			//对节点选择进行限制,用户只能选择子节点
+			function beforeClick${treeId}(treeId,treeNode) {
+				var check = (treeNode && !treeNode.isParent);
+				if (!check){
+					<@ms.notify msg="请选择该分类的子分类!" />
+				};
+				return check;
+			}		
+		</#if>
+		
+		//获取树形中选中的值,将选择值加载到隐藏框中
+		function getZtreeId${treeId}(event,treeId,treeNode){
+			var booleanClick = true;
+			//用于捕获节点被点击的事件回调函数
+			<#if onclick?has_content>
+				booleanClick=${onclick}(event,treeId,treeNode);
+			</#if>
+			if(booleanClick==false){
+				return;
+			}
+			//将用户选择数据ID加载到隐藏框
+			$("#${treeId} input[name='${name}']").val(treeNode.${jsonId});
+			<#if required>
+			$("form:first").bootstrapValidator('revalidateField', '${name}');
+			</#if>
+			//将用户选择数据的名称加载到输入框
+			$("#treeLabel${treeId}").text(treeNode.${jsonName});
+			
+		}
+	</script>
+	<!-- js操作方法结束 -->
+</#macro>

+ 232 - 0
src/main/webapp/WEB-INF/manager/include/ui/input.ftl

@@ -0,0 +1,232 @@
+<#--
+<input type="text"/>
+-->
+<#macro text id="" name="" value=""	label="" title="" colSm=""
+ 	class="form-control" 	style=""	readonly=""	disabled=false	maxlength=""	minlength=""	
+ 	validation="" size=""	width="" placeholder="" groupClass="form-group" onclick="" onchange="" labelStyle="" autocomplete="off" help="" helpDirection="">
+<div class="${groupClass} ms-form-group">	
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div class="col-sm-9 ms-from-group-input ms-form-input"  style="<#if width!="">width:${width}px;</#if>${style}"<#rt/>>
+		<input type="text"  autocomplete="${autocomplete}"<#rt/>
+		<#if id!=""> id="${id}"</#if><#rt/>
+		<#if maxlength!=""> maxlength="${maxlength}"</#if><#rt/>
+		<#if size!=""> maxlesizength="${size}"</#if><#rt/>
+		<#if readonly!=""> readonly="${readonly}"</#if><#rt/>
+		<#if value?? && value?string!=""> value="${value?html}"</#if><#rt/>
+		<#if  onchange?? && onchange!=""> onchange="${onchange}"</#if><#rt/>
+		<#include "/include/ui/common-attributes.ftl" /><#rt/>
+		/><#rt/>
+	</div>
+</div>
+</#macro>
+
+<#--数字输入框-->
+<#macro number id="" name="" value=""	label="" title="" min=0 max=200 isFloat=false colSm=""
+ 	class="form-control" 	style=""	readonly=""	disabled=false	maxlength="10"	minlength=""	
+ 	validation="" size=""	width="150" placeholder="" groupClass="form-group" onclick="" onchange="" labelStyle="" autocomplete="off" help="" helpDirection="">
+		<#assign reg="^-?\\d+$">
+		<#if isFloat>
+			<#assign reg="^\\d+(\\.\\d+)?$">
+		</#if>
+		<@ms.text 
+		id="${id}" name="${name}" value="${value}"	label="${label}" title="${title}"
+		class="${class}" style="${style}"  readonly="${readonly}"	
+		 maxlength="${maxlength}"
+		 minlength="${minlength}"
+ 		size="${size}"	width="${width}" placeholder="${placeholder}" groupClass="${groupClass}" onclick="${onclick}" onchange="${onchange}" labelStyle="${labelStyle}" 
+ 		autocomplete="${autocomplete}" help="${help}" helpDirection="${helpDirection}"
+		validation={"data-bv-between":"true","data-bv-between-message":"必须大于等于${min}且小于等于${max}","data-bv-between-min":"${min}"
+		,"data-bv-between-max":"${max}","data-bv-regexp":"true","data-bv-regexp-regexp":"${reg}","data-bv-regexp-message":"请输入数字"}/>
+</#macro>
+
+<#--
+<input type="password"/>
+-->
+<#macro password
+	id="" name="" value=""	label="" title="" colSm=""
+ 	class="form-control" 	style=""	readonly=""	disabled=false	maxlength=""	minlength=""	
+ 	validation="" size=""	width="" placeholder="" groupClass="form-group" onclick="" onchange="" labelStyle="" autocomplete="off" help="" helpDirection="">
+<div class="form-group ms-form-group">	
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div  class="ms-form-control ms-from-group-input col-sm-9" <#if width!=""> style="width:${width}px"</#if><#rt/>>
+		<input type="password" autocomplete="${autocomplete}"<#rt/>
+		<#if id!=""> id="${id}"</#if><#rt/>
+		<#if maxlength!=""> maxlength="${maxlength}"</#if><#rt/>
+		<#if readonly!=""> readonly="${readonly}"</#if><#rt/>
+		<#if value!=""> value="${value}"</#if><#rt/>
+		<#if  onchange?? && onchange!=""> onchange="${onchange}"</#if><#rt/>
+		<#include "/include/ui/common-attributes.ftl"/><#rt/>
+		/>
+	</div>
+</div>
+</#macro>
+
+
+<#--
+<input type="hidden"/>
+-->
+<#macro hidden
+	id="" name="" value=""
+	>
+<input type="hidden"<#rt/>
+<#if id!=""> id="${id}"</#if><#rt/>
+<#if name!=""> name="${name}"</#if><#rt/>
+<#if value?string!=""> value="${value}"</#if><#rt/>
+/>
+</#macro>
+
+<#--
+<input type="radio"/>
+-->
+<#macro radio
+	 name list listKey="" listValue="" value="" width="" colSm=""
+	  help="" helpPosition="2" colon=":" hasColon="true"
+	  label="" class="" style=""  disabled=false direction=false validation="" size="" labelStyle="" onclick="" help="" helpDirection="">
+<div class="form-group ms-form-group  _${name}Div">
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div class="col-sm-9 ms-from-group-input " style="margin-top:7px<#if width!=""> ;width:${width}px</#if>"<#rt/>>
+		<#if list?is_sequence><#--LIST-->
+			<#if listKey!="" && listValue!="">
+				<#list list as item>
+					<#local rkey=item[listKey]>
+					<#local rvalue=item[listValue]>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "radio-item.ftl"><#t/>
+				</#list>
+			<#else>
+				<#list list as item>
+					<#local rkey=item>
+					<#local rvalue=item>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "radio-item.ftl"><#t/>
+				</#list>
+			</#if>
+		<#else>
+			<#list list?keys as key><#--MAP-->
+				<#local rkey=key/>
+				<#local rvalue=list[key]/>
+				<#local index=key_index>
+				<#local hasNext=key_has_next>
+				<#include "radio-item.ftl"><#t/>
+			</#list>
+		</#if>
+	</div>
+</div>
+	<script>
+		$(function() {
+			<#if direction>
+				$("._${name}Div .ms-radio").width("100%");
+			</#if>
+		})
+	</script>
+</#macro>
+
+
+
+<#--
+<input type="checkbox"/>
+-->
+<#macro checkbox
+	list listKey="" listValue="" valueList=[] colSm=""
+	label=""     colon=":" hasColon="true"
+	id="" name="" class="" style="" size="" title="" disabled=false
+	validation="" direction=true
+	width=""
+	labelStyle=""
+	help=""
+	helpDirection=""
+	>
+<div class="form-group ms-form-group _${name}Div">	
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div class="col-sm-9 ms-from-group-input  " style="margin-top:7px<#if width!=""> ;width:${width}px</#if>"<#rt/> >
+		<#if list?is_sequence>
+			<#if listKey!="" && listValue!=""> 
+				<#list list as item>
+					<#local rkey=item[listKey]>
+					<#local rvalue=item[listValue]>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "/include/ui/checkboxlist-item.ftl"><#t/>
+				</#list>
+			<#else>
+				<#list list as item>
+					<#local rkey=item>
+					<#local rvalue=item>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "/include/ui/checkboxlist-item.ftl"><#t/>
+				</#list>
+			</#if>
+		<#else>
+			<#list list?keys as key>
+				<#local rkey=key/>
+				<#local rvalue=list[key]/>
+				<#local index=key_index>
+				<#local hasNext=key_has_next>
+				<#include "/include/ui/checkboxlist-item.ftl"><#t/>
+			</#list>
+		</#if>
+	</div>
+</div>
+
+	<script>
+		$(function() {
+			<#if direction>
+				//$("._${name}Div label.ms-checkbox").removeClass("checkbox").addClass("checkbox-inline");
+			<#else>
+				//$("._${name}Div label.ms-checkbox").removeClass("checkbox-inline").addClass("checkbox");
+			</#if>
+		})
+	</script>
+
+</#macro>
+
+<#--
+<input type="checkbox"/>
+4.5.5废弃
+-->
+<#macro checkboxlist 
+	list listKey="" listValue="" valueList=[] colSm=""
+	label=""     colon=":" hasColon="true"
+	id="" name="" class="" style="" size="" title="" disabled=false
+	validation="" direction=true
+	width=""
+	labelStyle=""
+	help=""
+	helpDirection=""
+	>
+<div class="form-group ms-form-group">	
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div class="col-sm-9" <#if width!=""> style="${width}px"</#if><#rt/>>
+		<#if list?is_sequence>
+			<#if listKey!="" && listValue!="">
+				<#list list as item>
+					<#local rkey=item[listKey]>
+					<#local rvalue=item[listValue]>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "/include/ui/checkboxlist-item.ftl"><#t/>
+				</#list>
+			<#else>
+				<#list list as item>
+					<#local rkey=item>
+					<#local rvalue=item>
+					<#local index=item_index>
+					<#local hasNext=item_has_next>
+					<#include "/include/ui/checkboxlist-item.ftl"><#t/>
+				</#list>
+			</#if>
+		<#else>
+			<#list list?keys as key>
+				<#local rkey=key/>
+				<#local rvalue=list[key]/>
+				<#local index=key_index>
+				<#local hasNext=key_has_next>
+				<#include "/include/ui/checkboxlist-item.ftl"><#t/>
+			</#list>
+		</#if>
+	</div>
+</div>	
+</#macro>

+ 175 - 0
src/main/webapp/WEB-INF/manager/include/ui/modal.ftl

@@ -0,0 +1,175 @@
+
+<#--模态框按钮区域 废弃-->
+<#macro modalButtonarea>
+	<div class="modal-footer">
+			<#nested/>
+	</div>
+</#macro>
+
+<#--警告的模态框-->
+<#macro warn  modalName>
+	<div id="warn${modalName}Dialog" class="modal fade  ${modalName}" tabindex="-1" data-focus-on="input:first">
+	 <div class="modal-dialog">
+	    <div class="modal-content">
+		<div class="modal-header">
+				<button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+				<h4 class="modal-title"  id="warn${modalName}Title">警告!</h4>
+		</div>
+		<div class="modal-body"  id="warn${modalName}Body">
+			<#nested/>
+		</div>
+		<div class="modal-footer">
+			<button type="button" data-dismiss="modal" class="btn btn-default">关闭</button>
+			<button type="button"  id="warn${modalName}Ok" class="btn btn-primary right" >确定</button>
+		</div>
+		</div>
+	 </div>
+	</div>	
+</#macro>
+
+<#--模块框 modalName废弃属性-->
+<#macro modal id="" title="标题" style="" height="300" resetFrom=true modalName="" size="S">
+	<#if style!="">
+		<#assign _style="${style}">
+	<#elseif size=="S">
+		<#assign _style="width:450px;height:150px;">
+	<#elseif size=="M">
+		<#assign _style="width:600px;height:500px;">
+	<#elseif size=="L">
+		<#assign _style="width:900px;height:650px;">
+	</#if>
+	<div class="modal fade ${modalName}${id}" id="${modalName}${id}" >
+	  <div class="modal-dialog"  style="${_style};">
+	    <div class="modal-content">
+	      <div class="modal-header">
+	        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+	        <h4 class="modal-title" id="${modalName}${id}Title">
+	       	${title}
+	        </h4>
+	      </div>
+		  <#nested/>
+	    </div><!-- /.modal-content -->
+	  </div><!-- /.modal-dialog -->
+	</div><!-- /.modal -->
+	<script>
+		
+	<#if resetFrom>
+		$(function(){
+			$('#${modalName}${id}').on('hide.bs.modal', function (event) {
+			  if ($("#${modalName}${id} form").length>0) {
+			  	$("#${modalName}${id} form").data('bootstrapValidator').resetForm(true);
+			  	$("#${modalName}${id} form")[0].reset();
+			  }
+			})	
+		});
+	</#if>
+		
+	</script>
+</#macro>
+
+<#--模态框内容 height属性废弃, 直接在style里面修改-->
+<#macro modalBody style="" height="">
+	      <div class="modal-body" style="${style}">
+	      	<#nested/>
+	      </div>
+</#macro>
+
+<#--模态框按钮区域-->
+<#macro modalButton>
+	       <div class="modal-footer">
+	      	<#nested/>
+	      </div>
+</#macro>
+
+
+
+<#--通用弹窗-->
+<#--modalName:弹出窗的名称-->
+<#--调用方法open弹出窗口名称,例如:窗口名称 abc ,调用openabc('展示内容','标题')-->
+<#--注意使用的时候,message的内容只能是id或字符串对象-->
+<#macro modalDialog modalName>
+	<div class="modal fade" id="${modalName}Dialog" style="overflow-y: hidden;">
+	  <div class="modal-dialog">
+	    <div class="modal-content">
+	      <div class="modal-header">
+	        <button type="button" class="close" data-dismiss="modal" aria-hidden="true">&times;</button>
+	        <h4 class="modal-title" id="${modalName}Title">
+	        </h4>
+	      </div>
+	      <!--startprint-->
+	      <div class="modal-body" id="${modalName}Body">
+	      </div>
+	      <!--添加其他信息-
+	      <div class="modal-footer" id="${modalName}Footer">
+	      </div>
+	      -->
+	      <!--endprint-->
+	    </div><!-- /.modal-content -->
+	  </div><!-- /.modal-dialog -->
+	</div><!-- /.modal -->
+	<script>
+		function open${modalName}(message,title) {
+		    if (title) {
+				$("#${modalName}Title").html(title);
+			}
+			try {
+				if (message) {
+					message.show();
+				}
+			} catch(e){
+				<@ms.notify msg= "文本" type= "warning" />
+			}	
+			$("#${modalName}Body ").html(message);
+			$('#${modalName}Dialog').modal();
+		}
+		 function close${modalName}() {
+				$('#warn${modalName}Dialog').modal('hide');
+			}
+	</script>	
+</#macro>
+
+
+
+<#--通用警告弹窗-->
+<#--warnModal:弹出窗的名称-->
+<#--调用方法open弹出窗口名称,例如:窗口名称 abc ,调用openabc('展示内容','标题','点击确定按钮之后回调方法,如果没有则不会显示确认按钮')-->
+<#macro warnModal  modalName>
+	<div id="warn${modalName}Dialog" class="modal fade" tabindex="-1" data-focus-on="input:first">
+	 <div class="modal-dialog">
+	    <div class="modal-content">
+		<div class="modal-header">
+				<button type="button" class="close" data-dismiss="modal" aria-hidden="true"></button>
+				<h4 class="modal-title"  id="warn${modalName}Title">警告!</h4>
+		</div>
+		<div class="modal-body"  id="warn${modalName}Body">
+			
+		</div>
+		<div class="modal-footer">
+			<button type="button" data-dismiss="modal" class="btn btn-default">关闭</button>
+			<button type="button"  id="warn${modalName}Ok" class="btn btn-primary right" style="display:none">确定</button>
+		</div>
+		</div>
+	 </div>
+	</div>	
+	<script>
+		function warn${modalName}(message,title,func) {
+		    if (title) {
+				$("#warn${modalName}Title").html(title);
+			}
+			if(func) {
+				$("#warn${modalName}Ok ").show();
+				$("#warn${modalName}Ok ").one("click",function(){
+					eval(func);
+				});
+			}
+			$("#warn${modalName}Body ").html(message);
+			$('#warn${modalName}Dialog').modal();
+		}
+		
+		 function closewarn${modalName}() {
+				$('#warn${modalName}Dialog').modal('hide');
+			}
+	</script>
+</#macro>
+
+

+ 51 - 0
src/main/webapp/WEB-INF/manager/include/ui/page.ftl

@@ -0,0 +1,51 @@
+<#--后台的UI界面通用区域定义-->
+<#macro html5 width="100%" style="">
+<!DOCTYPE html>
+<html lang="en">
+	<head>
+		<#include "${managerViewPath}/include/macro.ftl"/>
+		<#include "${managerViewPath}/include/meta.ftl"/>
+	</head>
+	<body>
+		<div class="ms-content">
+				<div class="ms-content-body" style="width:${width};${style}">
+		   			<#nested/>
+		   			<div class='notifications ms-notifications top-right'></div>
+		   		</div>
+		</div>
+		
+	</body>
+</html>
+</#macro>
+<#macro nav title="板块名称" back=false style="">
+    <div class="ms-content-body-title" style="${style}">
+        <strong>${title}</strong>
+        <#nested/>
+        <#if back>
+        	<@ms.backButton/>
+        </#if>
+    </div>
+</#macro>
+
+<#--面板-->
+<#macro panel style="">
+	    <div class="ms-content-body-panel" style="${style}"> 
+	   		<#nested/>
+	   		
+	    </div>
+</#macro>
+
+<#--面板导航-->
+<#macro panelNav empty=false>
+    <div class="ms-content-body-panel-nav"  <#if empty>style="  padding: 0;"</#if>>
+        <#nested/>
+    </div>
+</#macro>
+
+<#--提示-->
+<#macro notify msg="提示信息" type="warning">
+			    		 $('.ms-notifications').offset({top:43}).notify({
+			    		    type:'${type}',
+						    message: { text:'${msg}' }
+						 }).show();	
+</#macro>

+ 7 - 0
src/main/webapp/WEB-INF/manager/include/ui/radio-item.ftl

@@ -0,0 +1,7 @@
+<label class="ms-radio" style="padding-right:10px"><input type="radio"<#rt/>
+ value="${rkey}"<#rt/>
+ <#if  onclick?? && onclick!=""> onclick="${onclick}"</#if><#rt/>
+<#if disabled?? && disabled> disabled="disabled" </#if><#rt/>
+<#if (rkey?string=="" && (!value?? || value?string=="")) || (value?? && value?string!="" && value?string==rkey?string)> checked="checked"</#if><#rt/>
+<#include "common-attributes.ftl"/><#rt/>
+/> ${rvalue} </label>    <#if hasNext> </#if>

+ 76 - 0
src/main/webapp/WEB-INF/manager/include/ui/select.ftl

@@ -0,0 +1,76 @@
+<#--
+<select><option></option></select>
+-->
+<#macro select
+	list=[] value="" multiple=false  listKey="" listValue="" listDeep=""  
+	label="" validation=""    colon=":" hasColon="true" readonly=""
+	id="" name="" class="form-control" style="" size="" title="" disabled=false
+	labelStyle=""
+	width=""
+	help=""
+	helpDirection=""
+	default=""
+	defaultValue=""
+	select2=false
+	>
+<div class="form-group ms-form-group">	
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div class="col-sm-9 ms-form-control ms-from-group-input" <#if width!=""> style="width:${width}px"</#if><#rt/>>
+		<select<#rt/>
+		<#if id!=""> id="${id}"</#if><#rt/>
+		<#if multiple>multiple="multiple"</#if><#rt/>
+	   <#if readonly!=""> readonly="${readonly}"</#if><#rt/>
+		<#include "/include/ui/common-attributes.ftl"/><#rt/>
+		><#rt/>
+			<#if default?has_content>
+			<option value="<#if value?has_content>${value}</#if>">${default}</option>
+			</#if>
+			<#if list?is_sequence><#--LIST-->
+				<#if listKey!="" && listValue!="">
+					<#list list as item>
+						<#local rkey=item[listKey]>
+						<#local rvalue=item[listValue]>
+						<option value="${rkey}" <#if rkey?string==value?string> selected="selected"</#if>>${rvalue}</option><#rt/>
+					</#list>
+				<#else>
+					<#list list as item>
+						<option value="${item}" <#if item?string==value?string> selected="selected"</#if>>${item}</option><#rt/>
+					</#list>
+				</#if>
+			<#else>
+				<#list list?keys as key>
+					<#local rkey=key/>
+					<#local rvalue=list[key]/>
+					<option value="${rkey}" <#if rkey?string==value?string> selected="selected"</#if>>${rvalue}</option><#rt/>
+				</#list>
+			
+			</#if>
+		</select>
+	</div>
+
+</div>
+<#if select2>
+	<script>
+		$(function() {
+			$("select[name='${name}']").select2({width: "${width}px"});
+			$("select[name='${name}']").select2().val("${value}").trigger("change");;
+		})
+	</script>	
+</#if>
+</#macro>
+
+<#macro select2  name list value="" multiple=false  listKey="" listValue="" listDeep=""  default="请选择"
+	label="" validation=""    colon=":" hasColon="true" readonly=""
+	 class="form-control" style="" size="" title="" disabled=false
+	labelStyle=""
+	width=""
+	>
+	<select id="${name}" name="${name}">
+		<option></option>
+	</select>
+	<script>
+		$(function() {
+			$("#${name}").select2():
+		})
+	</script>
+</#macro>

+ 82 - 0
src/main/webapp/WEB-INF/manager/include/ui/table.ftl

@@ -0,0 +1,82 @@
+
+<#--表格列表-->
+<#--head:表格头部标题,数值格式-->
+<#--head:表格头部标题-->
+<#macro table head="" filed="" listItem="" editField="" editJs="" checkbox="" id="" dateformat="yyyy-MM-dd">
+ <script>
+ 	<#if checkbox?has_content>
+		$(function() {
+			$("input[name='allCheck${checkbox}']").on("click",function(){  
+				if(this.checked){   
+					$("input[name='${checkbox}']").each(function(){
+						this.checked=true;
+					});
+				}else{   
+					$("input[name='${checkbox}']").each(function(){this.checked=false;});   
+				}
+			});			
+		})
+	</#if>
+ </script>
+ <table class="table table-hover">
+	<!--表格栏目属性 开始-->
+    <thead>
+        <tr>
+        	<#if checkbox?has_content>
+	        	<th class="text-center" width="10">
+	        		<input type="checkbox" name="allCheck${checkbox}">
+	        	</th>
+        	</#if>
+        	<#if head?has_content>
+				<#list head as h>
+						<#if h?html?length gt 5 &&  h?html?substring(0,6)=="&lt;th">
+							${h}
+						<#elseif h?contains(",") && h?split(",")[1]?eval gt 0>
+							<th width="${h?split(",")[1]}">
+							${h?split(",")[0]}
+							</th>
+						<#else>
+							<th>
+							 	${h}
+		        	        </th>
+	        	        </#if>
+	        	</#list>        	
+        	</#if>
+        </tr>
+        <#if filed?has_content && listItem?has_content>
+        	<#list listItem?eval as item>
+        		<tr>
+        			<#if checkbox?has_content >
+        			<td>
+        				<input type="checkbox" name="${checkbox}" value="${item[checkbox]}">
+        			</td>
+        			</#if>
+        			<#list filed as f>
+	        			<td>
+	        					<#if editField?seq_contains(f)>
+	        						<a href="javascript:${editJs}(${item[checkbox]})">${item[f]}</a>
+	        					<#else>
+	        						<#if item[f]?has_content && item[f]?is_date>
+	        							${item[f]?string(dateformat)}
+	        						<#else>
+	        							${item[f]?default('-')}
+	        						</#if>
+	        					</#if>
+	        			</td>
+        			</#list>
+        		</tr>
+        	</#list>
+        	<#if listItem?eval?size==0>
+	        	<tr>
+	        			<td colspan="${filed?size+1}"><@ms.nodata content="暂无数据" /></td>
+	        	</tr>
+        	</#if>
+        </#if>
+        	
+    </thead>
+    <!--表格栏目属性 结束-->
+     <tbody id=${id}>
+    	<#nested/>
+     </tbody>
+ </table>
+</#macro>

+ 41 - 0
src/main/webapp/WEB-INF/manager/include/ui/textarea.ftl

@@ -0,0 +1,41 @@
+<#--
+<textarea name="textarea"></textarea>
+-->
+<#macro textarea
+	name
+	wrap="soft" 
+	readonly="" 
+	cols="" 
+	rows="" 
+	value=""
+	label="" 
+	title=""
+	required="false" 
+	id="" 
+	class="form-control" 
+	style="" 
+	size=""
+	disabled=false
+	maxlength="" 
+	placeholder=""
+	validation=""
+	labelStyle=""
+	width=""
+	help=""
+	helpDirection=""
+	colSm=""
+	>
+<div class="form-group ms-form-group">	
+	<#include "/include/ui/control.ftl"/><#rt/>
+	<div  class="ms-form-control ms-from-group-input col-sm-9"  style="<#if width!="">width:${width}px;</#if>"<#rt/>>
+		<textarea<#rt/>
+		<#if id!=""> id="${id}"</#if><#rt/>
+		<#if wrap!=""> wrap="${wrap}"</#if><#rt/>
+		<#if readonly!=""> readonly="${readonly}"</#if><#rt/>
+		<#if cols!=""> cols="${cols}"</#if><#rt/>
+		<#if rows!=""> rows="${rows}"</#if><#rt/>
+		<#include "/include/ui/common-attributes.ftl"/><#rt/>
+		><#if value?? && value!="">${value!?html}</#if></textarea>
+	</div>
+</div>
+</#macro>

+ 43 - 0
src/main/webapp/WEB-INF/manager/include/ui/time.ftl

@@ -0,0 +1,43 @@
+<#--
+<input type="t"/>
+-->
+<#macro time    id=""    name=""    value="" 
+	label=""  title=""  size=""  labelStyle="" width=""
+  class="form-control"   style="" readonly="" disabled=false  maxlength=""  minlength=""   placeholder="" 	validation="" 
+  help=""
+  helpDirection=""
+  >
+<div class="form-group ms-form-group">
+    <#include "control.ftl"/><#rt/>
+    <div class="control-group col-sm-9 ms-from-group-input"  style="min-widht:200px;<#if width!="">width:${width}px</#if>"<#rt/>>
+    	<div class="controls">
+		     <div class="input-prepend input-group date" <#if id!=""> id="${id}"<#elseif name!="">id="${name}"</#if><#rt/> 
+		     data-date="" data-date-format="hh:ii"  data-link-format="hh:ii">
+		         <span class="add-on input-group-addon"><i class="glyphicon glyphicon-time"></i></span>
+		         <input type="text"<#rt/>
+		              <#if maxlength!=""> maxlength="${maxlength}"</#if><#rt/>
+		              <#if readonly!=""> readonly="${readonly}"</#if><#rt/>
+		              <#if value?? && value?string!=""> value="${value?html}"</#if><#rt/>
+		              <#include "common-attributes.ftl"/><#rt/>/>
+		 	</div>
+		</div>
+	</div>
+</div>
+
+<script>
+	$(function(){
+	 $('#${name}').datetimepicker({
+	        language: 'cn', 
+	        todayBtn:  1,
+			autoclose: true,
+			todayHighlight: 1,
+			format: 'hh:ii',
+			startView: 1,
+			minView: 0,
+			maxView: 1,
+			forceParse: 0,
+	    });
+    });
+</script>
+
+</#macro>

+ 480 - 0
src/main/webapp/WEB-INF/manager/include/ui/tree.ftl

@@ -0,0 +1,480 @@
+<#-- 树形控件,以input下拉框的形式显示(官网:http://www.ztree.me/v3/main.php#_zTreeInfo) -->
+<#-- treeId(必须):树形加载和控制区域的ID,一张页面同时加载多个树形时必须用该值进行区分 -->
+<#-- json(必须):需要加载成树形的数据,数据结构为:[{categoryId:1,categoryCategoryId:0,categoryTitle:""},{categoryId:2,categoryCategoryId:1,categoryTitle:""}] -->
+<#-- jsonId(必须):json数据中ID名称,如:categoryId -->
+<#-- jsonPid(必须):json数据中关联的父ID,如:categoryCategoryId -->
+<#-- jsonName(必须):json数据中需要显示的数据名称,如:categoryTitle -->
+<#-- jsonUrl:如过json数据中存在跳转地址则直接将字段名称填入点击树形时可自动跳转 -->
+<#-- addNodesName:增加顶级根节点,直接传入根节点名称即可。如:顶级分类 -->
+<#-- buttonText:选择框加载的默认提示信息 -->
+<#-- inputName(必须):隐藏input框的name值,用于保存选中数据的ID -->
+<#-- inputValue:隐藏input框的val默认值,适用用于加载初始化数据 -->
+<#-- inputId:隐藏input框的id值,用于保存选中数据的ID -->
+<#-- selectParent:用户选择父节点时的提示信息,当该值存在时,用户不能选择存在子节点的父节点,并提示传入的值,当该值不存在时用户可以选择任意 -->
+<#-- clickZtreeId: 选择节点后触发的事件-->
+<#-- expandAll:控制节点数据显示的时候是全部展开还是全部折叠(true[默认]:全部展开,false:全部折叠)。 -->
+<#-- showIcon:是否显示文件夹图标,true:显示;false(默认):不显示 -->
+<#-- 内置函数调用方法说明:
+				调用对象的函数名:	zTreeObj${treeId}(treeId为自定义的ID名称);
+					/**
+					 * 根据节点数据的属性搜索,获取条件完全匹配的单一节点数据 JSON 对象
+					 * 如有重复则返回最近的一条。
+					 * @param key:需要精确匹配的属性名称
+					 * @param value:需要精确匹配的属性值,可以是任何类型,只要保证与 key 指定的属性值保持一致即可
+					 * @param parentNodeJSON:搜索范围,指定在某个父节点下的子节点中进行搜索忽略此参数,为null时表示在全部节点中搜索
+					 * @return JSON
+					 */
+					zTreeObj${treeId}.getNodeByParam(key,value,parentNode);
+					
+					/**
+					 * 获取根节点数据,既获取PID=0的数据集合
+					 * @return ArrayList(json)
+					 */
+					 zTreeObj${treeId}.getNodes();
+					 
+					 /**
+					  * 根据节点数据的属性搜索,获取条件完全匹配的节点数据 JSON 对象集合
+					  * @param key:需要精确匹配的属性名称
+					  * @param value:需要精确匹配的属性值,可以是任何类型,只要保证与 key 指定的属性值保持一致即可
+					  * @param parentNode:可以指定在某个父节点下的子节点中搜索,为null时表示在全部节点中搜索
+					  * @return ArrayList(json)
+					  */
+					  zTreeObj${treeId}.getNodesByParam(key,value,parentNode);
+-->		 
+<#--废弃,推荐使用inputTree 参考input_tree.ftl--> 
+<#macro treeInput treeId=""  json="" jsonId="" jsonPid="" jsonName="" jsonUrl="" addNodesName="" buttonText="" inputName="" inputValue="" inputId="" selectParent="" clickZtreeId="" expandAll="true" showIcon="false" >
+	<!-- css样式开始 -->
+	<style type="text/css">
+		.ztree${treeId}{width:100%;max-height: 240px;overflow:auto;}
+		.ztree${treeId} li a{padding:0}
+	</style>	
+	<!-- css样式结束 -->
+
+
+	<!-- 初始化样式开始 -->
+	<div class="dropdown" id="${treeId}">
+		<button type="text" id="treeLabel${treeId}" class="form-control dropdown-toggle" data-toggle="dropdown" aria-expanded="true" style="text-align:left">
+			${buttonText?default('请选择')}
+		</button>
+		<input type="hidden" <#if inputName?has_content>name="${inputName}"</#if> <#if inputId?has_content>id="${inputId}"</#if> value="${inputValue?default(0)}">
+		<ul class="ztree ztree${treeId} dropdown-menu" role="menu" id="treeDome${treeId}" aria-labelledby="treeLabel${treeId}">
+		</ul>
+	</div>
+	<!-- 初始化样式结束 -->
+	
+	<!-- js操作方法开始 input -->	
+	<script>
+		//初始化树形数据
+		var zNodes${treeId} = <#if json?has_content>${json}<#else>[]</#if>;
+		
+		//初始化树形结构
+		var setting${treeId} = {
+			view:{//控制视图
+				fontCss:{"white-space":"normal","display":"initial","word-break":"break-all"},
+				showIcon:${showIcon},//是否显示节点文件夹图标
+				showLine:true,//是否显示借点连接线
+				expandSpeed:"",//折叠时的动画速度,参考jquery中动画效果的speed参数,三种预定速度之一的字符串("slow", "normal", or "fast")
+			},
+			data: {//控制显示数据
+				simpleData: {
+					enable: true,//是否采用简单数据模式 (Array)
+					idKey:"${jsonId}",//节点ID名称
+					pIdKey:"${jsonPid}",//父节点ID名称
+				},
+				key:{
+					name:"${jsonName}",//节点数据保存节点名称的属性名称。
+					url:"${jsonUrl}",//节点跳转地址属性
+				}
+			},
+			callback: {//控制获取选择的节点数据
+				beforeClick:<#if selectParent?has_content>beforeClick${treeId}<#else>null</#if>,//用于捕获单击节点之前的事件回调函数,并且根据返回值确定是否允许单击操作
+				onClick:getZtreeId${treeId},//用于捕获节点被点击的事件回调函数
+			},
+			check:{//控制节点的选中方式(暂时未启用,根据后期需求再做调整)
+				autoCheckTrigger:true,//是否触发自动勾选
+				enable:false,//节点上是否显示选择框,false:不显示,true:显示。
+				chkStyle:"checkbox",//勾选框类型(checkbox[默认值] 或 radio)
+				chkboxType:{"Y":"ps","N":"ps"},//设置勾选关联关系
+			},
+		};	
+		
+		var zTreeObj${treeId}="";
+		$(function(){
+			//自定义顶级栏目
+			<#if addNodesName?has_content>
+				zNodes${treeId}[zNodes${treeId}.length] = {${jsonName}:"${addNodesName}",${jsonId}:0,${jsonPid}:0};
+			</#if>
+			
+			//加载树形
+			$.fn.zTree.init($("#treeDome${treeId}"),setting${treeId},zNodes${treeId});	
+			
+			//zTree内部函数对象,主要用户调用zTree内部方法
+			zTreeObj${treeId} = $.fn.zTree.getZTreeObj("treeDome${treeId}");
+			
+			//展开(true)/折叠(false)全部节点(zTree内部方法)
+			zTreeObj${treeId}.expandAll(${expandAll});
+
+			//加载默认节点
+			<#if inputValue?has_content>
+				zTreeObj${treeId}.selectNode(zTreeObj${treeId}.getNodeByParam("${jsonId}",${inputValue},null));
+			</#if>
+			
+			//当属性为折叠时,控制下拉菜单的开启和关闭
+			<#if expandAll = "false">
+				$("body").on("click",function(e) {
+			        e = window.event || e; // 兼容IE7
+			        
+			        //获取当前点击事件对象
+			        var objZtree = $(e.srcElement||e.target);
+			        
+			        //获取当前点击事件ID,并对点击的子节点ID进行切割获取自定义ID
+			        var objZtreeId = objZtree.attr("id");
+			        
+			        //当用户点击选择框时还原下拉框属性
+			        if(objZtreeId != undefined && objZtreeId.split("_")[0] == "treeLabel${treeId}"){
+			        	$("#treeDome${treeId}").attr("style","");
+			        	return ;
+			        }
+			        
+			        //切割获取到的ID判断点击事件是否产生在下拉框
+			        if(objZtreeId != undefined && objZtreeId.split("_")[0] == "treeDome${treeId}"){
+			        	$("#treeDome${treeId}").attr("style","display:block");
+			        }else{
+			        	$("#treeDome${treeId}").attr("style","display:none");
+			        }
+				});
+			</#if>
+			
+		});
+		
+		<#if selectParent?has_content>
+			//对节点选择进行限制,用户只能选择子节点
+			function beforeClick${treeId}(treeId,treeNode) {
+				var check = (treeNode && !treeNode.isParent);
+				if (!check){
+					$("#treeLabel${treeId}").text("${selectParent}");
+				};
+				return check;
+			}		
+		</#if>
+		
+		//获取树形中选中的值,将选择值加载到隐藏框中
+		function getZtreeId${treeId}(event,treeId,treeNode){
+			var booleanClick = true;
+			//用于捕获节点被点击的事件回调函数
+			<#if clickZtreeId?has_content>
+				booleanClick=${clickZtreeId};
+			</#if>
+			if(booleanClick==false){
+				return;
+			}
+			//将用户选择数据ID加载到隐藏框
+			$("#${treeId} input[name='${inputName}']").val(treeNode.${jsonId});
+			//将用户选择数据的名称加载到输入框
+			$("#treeLabel${treeId}").text(treeNode.${jsonName});
+			
+		}
+	</script>
+	<!-- js操作方法结束 -->
+</#macro>
+
+<#------------------------------------------------------------------------------------------------------------------------------------------------------------------>
+
+<#-- 
+	getZtreeId:外部重写JS方法:
+		/**
+		 * 外部点击树形节点时触发的事件,(传入参数必须与下述参数名保持一致)
+		 * event:获取到的触发事件
+		 * treeId:载体ID,这里为:treeDome${treeId}
+		 * treeNode:内置函数对象,这里可直接调用内置函数方法
+		 *				treeNode.${jsonId}:获取点击的树形节点的ID
+		 *				treeNode.${jsonName}:获取点击树形节点的名称
+		 *				.....
+		 */
+		getZtreeId${treeId}(event,treeId,treeNode);
+-->
+<#-- 树形控件,以input下拉框的形式显示(官网:http://www.ztree.me/v3/main.php#_zTreeInfo) -->
+<#-- treeId(必须):树形加载和控制区域的ID,一张页面同时加载多个树形时必须用该值进行区分 -->
+<#-- json(必须):需要加载成树形的数据,数据结构为:[{categoryId:1,categoryCategoryId:0,categoryTitle:""},{categoryId:2,categoryCategoryId:1,categoryTitle:""}] -->
+<#-- jsonId(必须):json数据中ID名称,如:categoryId -->
+<#-- jsonPid(必须):json数据中关联的父ID,如:categoryCategoryId -->
+<#-- jsonName(必须):json数据中需要显示的数据名称,如:categoryTitle -->
+<#-- jsonUrl:如过json数据中存在跳转地址则直接将字段名称填入点击树形时可自动跳转 -->
+<#-- addNodesName:增加顶级根节点,直接传入根节点名称即可。如:顶级分类 -->
+<#-- expandAll:控制节点数据显示的时候是全部展开还是全部折叠(true[默认]:全部展开,false:全部折叠)。 -->
+<#-- showIcon:是否显示文件夹图标,true:显示;false(默认):不显示 -->
+<#-- 内置函数调用方法说明:
+				调用对象的函数名:	zTreeObj${treeId}(treeId为自定义的ID名称);
+					/**
+					 * 根据节点数据的属性搜索,获取条件完全匹配的单一节点数据 JSON 对象
+					 * 如有重复则返回最近的一条。
+					 * @param key:需要精确匹配的属性名称
+					 * @param value:需要精确匹配的属性值,可以是任何类型,只要保证与 key 指定的属性值保持一致即可
+					 * @param parentNodeJSON:搜索范围,指定在某个父节点下的子节点中进行搜索忽略此参数,为null时表示在全部节点中搜索
+					 * @return JSON
+					 */
+					zTreeObj${treeId}.getNodeByParam(key,value,parentNode);
+					
+					/**
+					 * 获取根节点数据,既获取PID=0的数据集合
+					 * @return ArrayList(json)
+					 */
+					 zTreeObj${treeId}.getNodes();
+					 
+					 /**
+					  * 根据节点数据的属性搜索,获取条件完全匹配的节点数据 JSON 对象集合
+					  * @param key:需要精确匹配的属性名称
+					  * @param value:需要精确匹配的属性值,可以是任何类型,只要保证与 key 指定的属性值保持一致即可
+					  * @param parentNode:可以指定在某个父节点下的子节点中搜索,为null时表示在全部节点中搜索
+					  * @return ArrayList(json)
+					  */
+					  zTreeObj${treeId}.getNodesByParam(key,value,parentNode);
+-->	
+<#macro tree id="ztree${.now?string('yyyyMMddhhmmss')}" type="default" data=[] url="" idKey="" pIdKey="" text=""  label="" treeId="" json="" jsonId="" jsonPid="" jsonName="" jsonUrl="" validation="" addNodesName="" expandAll="true" showIcon="false" getZtreeId="" ischeck="false" help="">
+<#if type="checkbox">
+	<ul id="${id}" class="ztree"></ul>
+	<SCRIPT type="text/javascript">
+		<!--
+		var ${id};
+		ms.post("${url}",null,function(json){
+			var setting = {
+				check: {
+					enable: true,
+					chkboxType: { "Y" : "ps", "N" : "ps" }
+				},		
+				data: {
+					simpleData: {
+						enable: true,//是否采用简单数据模式 (Array)
+						idKey:"${idKey}",//节点ID名称
+						pIdKey:"${pIdKey}",//父节点ID名称
+					},
+					key:{
+						name:"${text}"//节点数据保存节点名称的属性名称。
+					}
+				}
+			};
+			
+			$(document).ready(function(){
+				$.fn.zTree.init($("#${id}"), setting, json);
+				${id} = $.fn.zTree.getZTreeObj("${id}");
+				${id}.expandAll(true);
+			});
+			
+		});
+		//-->
+	</SCRIPT>
+
+<#elseif type=="default"> <#--默认调用方式在4.5.5将废弃-->
+<!-- 初始化样式开始 -->
+	<div class="form-group ms-form-group ">	
+		<#include "control.ftl"/><#rt/>
+		<div  class="ms-form-control <#if label!="">col-sm-9</#if>">	
+			<ul class="ztree" id="treeDome${treeId}">
+			</ul>
+		</div>
+	</div>
+<!-- 初始化样式结束 -->
+	
+<!-- js操作方法开始 tree-->	
+	<script>
+		//初始化树形数据
+		var zNodes${treeId} = ${json?default('[]')};
+		var zTreeObj${treeId};
+		//初始化树形结构
+		var setting${treeId} = {
+			view:{//控制视图
+				fontCss:{"white-space":"normal","display":"initial","word-break":"break-all"},
+				showIcon:${showIcon},//是否显示节点文件夹图标
+				showLine:true,//是否显示借点连接线
+				expandSpeed:"fast",//折叠时的动画速度,参考jquery中动画效果的speed参数,三种预定速度之一的字符串("slow", "normal", or "fast")
+			},
+			data: {//控制显示数据
+				simpleData: {
+					enable: true,//是否采用简单数据模式 (Array)
+					idKey:"${jsonId}",//节点ID名称
+					pIdKey:"${jsonPid}",//父节点ID名称
+				},
+				key:{
+					name:"${jsonName}",//节点数据保存节点名称的属性名称。
+					url:"${jsonUrl}",//节点跳转地址属性
+				}
+			},
+			callback: {//控制获取选择的节点数据
+				onClick:<#if getZtreeId?has_content>getZtreeId${treeId}<#else>null</#if>,//用于捕获节点被点击的事件回调函数
+			},
+			check:{//控制节点的选中方式(暂时未启用,根据后期需求再做调整)
+				autoCheckTrigger:true,//是否触发自动勾选
+				enable:${ischeck},//节点上是否显示选择框,false:不显示,true:显示。
+				chkStyle:"checkbox",//勾选框类型(checkbox[默认值] 或 radio)
+				chkboxType:{"Y":"ps","N":"ps"},//设置勾选关联关系
+			},
+		};	
+		
+		
+		$(function(){
+			//自定义顶级栏目
+			<#if addNodesName?has_content>
+				zNodes${treeId}[zNodes${treeId}.length] = {${jsonName}:"${addNodesName}",${jsonId}:0,${jsonPid}:0};
+			</#if>
+			
+			//加载树形
+			$.fn.zTree.init($("#treeDome${treeId}"),setting${treeId},zNodes${treeId});	
+			
+			//zTree内部函数对象,主要用户调用zTree内部方法
+			zTreeObj${treeId} = $.fn.zTree.getZTreeObj("treeDome${treeId}");
+			
+			//展开(true)/折叠(false)全部节点(zTree内部方法)
+			zTreeObj${treeId}.expandAll(${expandAll});
+		});
+		
+		<#if getZtreeId?has_content>
+			function getZtreeId${treeId}(event,treeId,treeNode){
+				${getZtreeId};
+			}
+		</#if>
+	</script>
+<!-- js操作方法结束 -->
+
+</#if>
+</#macro>
+
+
+<#-------------------------------------------------------------------------- -->
+<#-- 树形控件,树形结构table 格式-->
+<#-- tbodyId(必须) 需要进行委派的容器Id, 如要委派到tbody的id值-->
+<#-- treeId(必须):树形加载和控制区域的ID,一张页面同时加载多个树形时必须用该值进行区分 -->
+<#-- json(必须):需要加载成树形的数据,数据结构为:[{categoryId:1,categoryCategoryId:0,categoryTitle:""},{categoryId:2,categoryCategoryId:1,categoryTitle:""}] -->
+<#-- jsonId(必须):json数据中ID名称,如:categoryId -->
+<#-- jsonPid(必须):json数据中关联的父ID,如:categoryCategoryId -->
+<#-- jsonName(必须):json数据中需要显示的数据名称,如:categoryTitle -->
+<#-- tmplBefored是否插入节点图标之前 false不插入, true插入-->
+<#-- #befored${treeId} 在节点图标之前需要插入列表属性,如果要使用必须tmplBefored="true"-->
+<#-- #after${treeId}(必须) 在节点图标之后需要插入列表属性-->
+
+<#-- 该结构中调用方法简略说明,如果需要其他更改,请添加方法:
+	clickDome${treeId},展开节点|关闭节点
+	getChilds${treeId},获取当前点击的子节点
+	removeChilds${treeId},/移除点击节点的所有子节点
+-->
+
+<#macro treeTable tbodyId="" treeId="" json="" jsonId="" jsonPid="" jsonName="" style="" tmplBefored="false">
+	<ul class="ztreeTable" id="treeDome${treeId}" style="display:none">
+	</ul>
+	<!-- 列表HTML模版开始 -->
+	<script id="treeTableTmpl${treeId}" type="text/x-jquery-tmpl">
+		<tr data-id="{{= ${jsonId}}}"   id="columnTitle{{= ${jsonId}}}" >
+			<td>{{= ${jsonId}}}</td>
+			<#if tmplBefored== "true" >
+				{{tmpl($data) '#befored${treeId}'}}
+			</#if>
+			<td>
+				<a class="btn btn-xs red tooltips switch-list columnTitle" data-id="{{= ${jsonId}}}" onclick="clickDome${treeId}(this)" data-parentId="{{= ${jsonPid}}}" data-toggle="tooltip" data-original-title="查看子节点">
+				 	<i class="glyphicon glyphicon-folder-close"></i>
+				</a>
+				{{= ${jsonName}}}
+			</td>
+			{{tmpl($data) '#after${treeId}'}}
+		</tr> 
+	</script>  
+<!-- 列表HTML模版结束 -->
+<!-- js操作方法开始 -->	
+	<script>
+		
+		var zTreeObj${treeId};	//zTree内部函数对象变量,主要用户调用zTree内部方法
+		
+		//初始化树形结构
+		var setting${treeId} = {
+			data: {//控制显示数据
+				simpleData: {
+					enable: true,//是否采用简单数据模式 (Array)
+					idKey:"${jsonId}",//节点ID名称
+					pIdKey:"${jsonPid}",//父节点ID名称
+				},
+				key:{
+					name:"${jsonName}",//节点数据保存节点名称的属性名称。
+				}
+			},
+		};
+		$(function(){
+			//初始化树形数据
+			var zNodes${treeId} = ${json?default('[]')};
+			//加载树形
+			$.fn.zTree.init($("#treeDome${treeId}"),setting${treeId},zNodes${treeId});	
+			
+			//zTree内部函数对象,主要用户调用zTree内部方法
+			zTreeObj${treeId} = $.fn.zTree.getZTreeObj("treeDome${treeId}");
+			
+			//获取zTree中的数据对象
+			var zTreeList = zTreeObj${treeId}.getNodes();
+			
+			//将内容委派到其中
+			$("#treeTableTmpl${treeId}").tmpl(zTreeList).appendTo("#${tbodyId}");
+			
+			
+		});
+		
+		//展开节点|关闭节点
+		function clickDome${treeId}(obj){
+			var columnId = $(obj).attr("data-id");//当前点击的节点
+			var booleanBeging= true;	//用来处理是否展开/关闭节点
+			$(".columnTitle").each(function(){	//判断是否存在子节点
+				if($(this).attr("data-parentId")==columnId){
+					booleanBeging=false;
+					return false;
+				}
+			});
+			//判断节点文件夹关闭图标是否存在,存在则显示打开的文件夹图标
+			if($(obj).find(".glyphicon").hasClass("glyphicon-folder-close")){
+				$(obj).find(".glyphicon").removeClass("glyphicon-folder-close");
+				$(obj).find(".glyphicon").addClass("glyphicon-folder-open");
+			}else if($(obj).find(".glyphicon").hasClass("glyphicon-folder-open")){//判断节点文件夹打开图标是否存在,存在则显示关闭的文件夹图标
+				$(obj).find(".glyphicon").removeClass("glyphicon-folder-open")
+				$(obj).find(".glyphicon").addClass("glyphicon-folder-close");
+			}
+			
+			if(booleanBeging==true){
+				getChilds${treeId}(columnId);//获取当前点击的子节点
+			}else{
+				removeChilds${treeId}(columnId);//移除点击节点的子节点
+			}
+		}
+					
+		//获取当前点击的子节点
+		function getChilds${treeId}(jsonId){
+			//拿到所有节点,比对该节点内是否存在父节点id跟当前点击节点id一致,累加到数组内容,循环完毕后委派到html内
+			var rootNodes=zTreeObj${treeId}.getNodes();	//获取根节点
+			var allNodes=zTreeObj${treeId}.transformToArray(rootNodes); //很据跟节点获取所有节点
+			var selectNodes;	//选中的节点
+			var arrayNodes = new Array();	//需要委派的节点
+			for(var i=0;i<allNodes.length;i++){//将所有节点选中
+				zTreeObj${treeId}.selectNode(allNodes[i],true);
+			}
+			selectNodes=zTreeObj${treeId}.getSelectedNodes();
+			for(var j=0;j<selectNodes.length;j++){	//判断是否是当前点击的节点的子节点
+				if(selectNodes[j].${jsonPid}== jsonId ){
+					arrayNodes.push(selectNodes[j]);
+				}
+			}
+			$("#treeTableTmpl${treeId}").tmpl(arrayNodes).insertAfter("#columnTitle"+jsonId);
+			//文字首行缩进
+			$(".columnTitle").each(function(){
+				var id = $(this).attr("data-id");
+				var curChilds = zTreeObj${treeId}.getNodesByParam("${jsonId}",id,null);
+				var indent = curChilds[0].level;
+				$(this).parents("td").css("text-indent",(indent*5)+"px");
+			});
+			
+		}
+
+		//移除点击节点的子节点
+		function removeChilds${treeId}(jsonId){
+			$(".columnTitle").each(function(){
+				if($(this).attr("data-parentId")==jsonId){
+					removeChilds${treeId}($(this).attr("data-id"));
+					$("#columnTitle"+$(this).attr("data-id")).detach();
+				}
+			});
+		}
+	</script>
+<!-- js操作方法结束 -->
+</#macro>

+ 344 - 0
src/main/webapp/WEB-INF/manager/include/ui/upload.ftl

@@ -0,0 +1,344 @@
+<#--上传控件-->
+
+
+
+<#--上传控件-->
+<#--path:上传路径,文件夹是在ms属性配置文件里面配置,会自动增加当前appId-->
+<#--uploadFloderPath:如果path路径无法满足可以使用这个参数重新定义上传路径-->
+<#--inputName:name值-->
+<#--filetype:上传规则-->
+<#--size:上传数量-->
+<#--msg:提示信息-->
+<#--imgs:默认显示的图片-->
+<#--maxSize:默认文件大小 单位m-->
+<#--如果是反复显示图片需要调用showImgs(imgs地址可以包含"|"符合,input的名称)-->
+<#macro uploadImg path  inputName size="1" uploadFloderPath="" filetype="*.jpg;*.png;*.gif;*.bmp;*.jpeg" msg="" imgs="" maxSize="1">
+	<div id="ms__uploadPic_${inputName}">
+		<style>
+			.msUploadImgs{margin: 0;padding: 0;list-style: none;}
+			.msUploadImgs li {list-style:none;float: left;text-align: center;border: 1px solid #F3F3F3;margin: 8px; width:100px;}
+			.msUploadImgs img {width:100%; height:100px;}
+			.msUploadImgs li span {cursor: pointer;}
+			.divUploader{clear:both}
+		</style>
+		<ul class="msUploadImgs">
+			<#if imgs!="">
+				<#list imgs?split("|") as img>
+					<#if img!="">
+						<li id="SWFUpload_9_${img_index}">
+							<div class="displayimg">
+								<img src="${basePath}/${img}">
+							</div>
+							<span class="front-cover" onclick="removePreview${inputName}(this,'${img}'+'|')"><a class="btn btn-xs red tooltips " data-original-title="点击删除图片"><i class="glyphicon glyphicon-trash"></i></a>
+							</span>
+						</li>
+					</#if>			
+				</#list>	
+			</#if>
+		</ul>
+		<div class="divUploader"><input type="button" id="up_file_${inputName}" />
+		<#if msg!="">
+		<div class="alert alert-warning alert-dismissable">${msg}</div>
+		</#if>
+		</div>
+		<input type="hidden" size="100" name="${inputName}" id="${inputName}" value="${imgs?default('')}" />
+	</div>
+	<script type="text/javascript">
+		    $(function ()  {
+		        $('#ms__uploadPic_${inputName}').swfupload({
+		            upload_url: "${basePath}/file/upload.do",
+		            post_params:{"uploadPath":"${path}","uploadFloderPath":"${uploadFloderPath}","isRename":"true","maxSize":"${maxSize}","allowedFile":"${filetype}","allowedFile":""},
+		            file_size_limit: ${maxSize?default("1")}*1024,
+		            file_types: "${filetype?default("*.jpg;*.png;*.gif;*.bmp;*.jpeg")}",
+		            file_types_description: "Image files",
+		            file_upload_limit: ${size?default("5")},
+		            flash_url: "${basePath}/static/plugins/jquery.swfupload/1.0.0/swfupload.swf",
+		            button_image_url: static+"/plugins/jquery.swfupload/1.0.0/button.png", 
+		         	button_width: 92,
+					button_height: 34,
+		            button_placeholder: $('#up_file_${inputName}')[0],
+		            debug: false
+		        })
+				.bind('fileQueued', function (event, file) {	
+				   if ($("#ms__uploadPic_${inputName} .msUploadImgs").children().length>=${size?default("5")}) {
+						  $(this).swfupload('cancelUpload');
+						  <@ms.notify msg= "最多上传${size}个文件!" type= "warning" />
+					} else {
+					    var listitem = '<li id="' + file.id + '"><div class="displayimg"><img src="'+static+'/plugins/jquery.swfupload/1.0.0/load.gif" /></div><span class="front-cover">0%</span></li>';
+			            $('#ms__uploadPic_${inputName} ul').append(listitem);
+					    $(this).swfupload('startUpload');
+				    }
+				    
+				})
+				.bind('fileQueueError', function (event, file, errorCode, message) {
+				    if (errorCode==-130) {
+				    	<@ms.notify msg= "文件类型错误!" type= "warning" />
+				    } else if (errorCode==-100) {
+				    	<@ms.notify msg= "最多上传${size}个文件!" type= "warning" />
+				    } else {
+				    	<@ms.notify msg= "上传图片过多或上传图片过大!" type= "warning" />
+				    }
+				})
+				.bind('uploadStart', function (event, file) {
+						$('#ms__uploadPic_${inputName} ul li#' + file.id).find('span.front-cover').text('0%');
+				})
+				.bind('uploadProgress', function (event, file, bytesLoaded) {
+					   var percentage = Math.round((bytesLoaded / file.size) * 100);
+				       $('#ms__uploadPic_${inputName} ul li#' + file.id).find('span.front-cover').text(percentage + '%');
+				})
+				.bind('uploadSuccess', function (event, file, serverData) {
+				    var item = $('#ms__uploadPic_${inputName} ul li#' + file.id);
+				    item.find('div.displayimg').html('<img src="${basePath}/' + serverData + '" />');
+				    item.find('span.front-cover').html('<a class="btn btn-xs red tooltips " data-original-title="点击删除图片"><i class="glyphicon glyphicon-trash"></i></a>');
+				    if($('#${inputName}').val()!=""){
+				    	 $('#${inputName}').val($('#${inputName}').val() + "|"+ serverData )
+				    }else{
+				    	 $('#${inputName}').val(serverData )
+				    }
+				    
+				    $('#ms__uploadPic_${inputName} ul li#' + file.id + ' span.front-cover').bind('click', function () {
+				        $('#ms__uploadPic_${inputName} ul li#' + file.id + '').slideUp('fast');
+				        var swfu = $.swfupload.getInstance('#ms__uploadPic_${inputName}');
+				        var stats = swfu.getStats();
+				        stats.successful_uploads--;
+				        swfu.setStats(stats);
+				        
+				        //判断保存图片的输入框中是否存在"|"如果存在则表示图片至少要两张
+				        if ($('#${inputName}').val().indexOf("|")<0) {
+				        	$('#${inputName}').val($('#${inputName}').val().replace(serverData, ""));
+				        }else{
+				        	 $('#${inputName}').val($('#${inputName}').val().replace(serverData+"|", ""));
+				        }
+				      
+				        $('#ms__uploadPic_${inputName} ul li#' + file.id).remove();
+				        
+				        setInputValue${inputName}();
+				    });
+				})
+				.bind('uploadComplete', function (event, file) {
+				    $(this).swfupload('startUpload');
+				})
+		    });
+		    
+		    // 设置文本框的值 用于提交数据
+		    function setInputValue${inputName}(){
+		    	var value = "";
+		        // 设置文本的值
+		        $("#ms__uploadPic_${inputName}").find("ul li .displayimg img").each(function(){
+		      		var src = $(this).attr('src').replace('${basePath}/', '');
+		        	value += src + '|';
+		        });
+		        // 删除最后一个"|"
+		        if (value){
+		        	value = value.slice(0, -1);
+		        }
+		        
+		      	$('#${inputName}').val(value);
+		    }
+		     
+		    function removePreview${inputName}(uid,imgPath) {
+		        var swfu = $.swfupload.getInstance('#ms__uploadPic_${inputName}');
+		        var stats = swfu.getStats();
+		        stats.successful_uploads--;
+		        swfu.setStats(stats);
+		        //imgPath=imgPath.replace("|","")
+		        
+				//判断保存图片的输入框中是否存在"|"如果存在则表示图片至少要两张
+				//if ($('#${inputName}').val().indexOf("|")<0) {
+				     //$('#${inputName}').val($('#${inputName}').val().replace(imgPath, ""));
+				// }else{
+				     //$('#${inputName}').val($('#${inputName}').val().replace(imgPath+"|", ""));
+				// }
+				
+				//var obj=$("#ms__uploadPic_${inputName}").find("ul li:last");
+				//var imgSrcPath = obj.find(".displayimg img").attr("src").replace("${basePath}/","");
+				//判断是否删除的是最后一张,如果是则删除时不含"|"
+				//if(imgSrcPath==imgPath.replace("|","")){
+				    //$('#${inputName}').val($('#${inputName}').val().replace("|"+imgPath.replace("|",""), ""));
+				//}
+				
+		        $('#ms__uploadPic_${inputName} ul li#' + uid.parentNode.id).slideUp('fast',function() {
+		        	$(this).remove();
+		        	setInputValue${inputName}();
+		        });
+		    }
+		    
+		    /**
+		    *提供给弹窗显示图片使用
+		    */
+		    function showImgs${inputName}(imgs,inputName) {
+		    	//var swfu = $.swfupload.getInstance('#ms__uploadPic_'+inputName);
+		        //var stats = swfu.getStats();
+		    	$(".msUploadImgs").children().remove();
+		    	  if (imgs) {
+		    	  	 var _imgs = imgs.split("\|");
+		    	    for (i=0;i<_imgs.length;i++) {
+		    	    	  if (_imgs[i]!="") {
+								var imgLi = '<li id="SWFUpload_9_'+i+'">';
+									imgLi+='<div class="displayimg">';
+													imgLi+='<img src="${basePath}/'+_imgs[i]+'">';
+									imgLi+='</div>';
+									imgLi+='<span class="front-cover" onclick="removePreview${inputName}(this,\''+_imgs[i]+'\'+'|')"><a class="btn btn-xs red tooltips " data-original-title="点击删除图片"><i class="glyphicon glyphicon-trash"></i></a>';
+									imgLi+='</span>';
+								imgLi+='</li>';
+								$(".msUploadImgs").append(imgLi);;
+								//stats.successful_uploads++;
+								//swfu.setStats(stats);
+							}
+						}
+				    }
+		    }			
+			</script>
+</#macro>
+
+<#--上传控件-->
+<#--path:上传路径,文件夹是在ms属性配置文件里面配置,会自动增加当前appId-->
+<#--uploadFloderPath:如果path路径无法满足可以使用这个参数重新定义上传路径-->
+<#--inputName:name值-->
+<#--filetype:上传规则-->
+<#--size:上传数量-->
+<#--msg:提示信息-->
+<#--callBack:回调提示信息-->
+<#--isRename:是否重命名true:将使用时间命名,否则使用上传是文件名,可能会出现同名称覆盖的问题,中文也会存在问题-->
+<#--maxSize:默认文件大小 单位m-->
+<#macro uploadFile path inputName uploadFloderPath="" size=1 filetype="*.zip,*.rar,*.doc,*.xls,*.doc,*.txt,*.pdf" msg=""  maxSize="10" callBack="" isRename=false>
+	<div id="ms__uploadPic_${inputName}">
+		<div class="divUploader"><input type="button" id="up_file_${inputName}" />
+		<#if msg!="">
+		<div class="alert alert-warning alert-dismissable">${msg}</div>
+		</#if>
+		</div>
+		<input type="hidden" size="100" name="${inputName}" id="${inputName}" value="${imgs?default('')}" />
+	</div>
+	<script type="text/javascript">
+		    $(function ()  {
+		        $('#ms__uploadPic_${inputName}').swfupload({
+		            upload_url: "${basePath}/file/upload.do",
+		            post_params:{"uploadPath":"/${path}","uploadFloderPath":"${uploadFloderPath}","isRename":"${isRename?default("true")}","maxSize":"${maxSize}","allowedFile":"${filetype}","allowedFile":""},
+		            file_size_limit: ${maxSize?default("1")}*1024,
+		            file_types: "${filetype?default("*.jpg;*.png;*.gif;*.bmp;*.jpeg;*.zip;*.rar")}",
+		            file_upload_limit: ${size?default("5")},
+		            flash_url: "${basePath}/static/plugins/jquery.swfupload/1.0.0/swfupload.swf",
+		            button_image_url: static+"/plugins/jquery.swfupload/1.0.0/button_file.png",
+		         	button_width: 92,
+					button_height: 34,
+		            button_placeholder: $('#up_file_${inputName}')[0],
+		            debug: false
+		        })
+				.bind('fileQueued', function (event, file) {	
+				   if ($("#ms__uploadPic_${inputName} .msUploadImgs").children().length>=${size?default("5")}) {
+						  $(this).swfupload('cancelUpload');
+						  <@ms.notify msg= "上传图片过多或上传图片过大!" type= "warning" />
+					} else {
+					    $(this).swfupload('startUpload');
+				    }
+				    
+				})
+				.bind('fileQueueError', function (event, file, errorCode, message) {
+				    if (errorCode==-130) {
+				    	<@ms.notify msg= "文件类型错误!" type= "warning" />
+				    } else if (errorCode==-100) {
+				    	<@ms.notify msg= "最多上传${size}个文件!" type= "warning" />
+				    } else {
+				    	//alert(errorCode+'上传图片过多或上传图片过大!');
+				    	<@ms.notify msg= "上传文件过大!" type= "warning" />
+				    }
+				    <#if callBack!=""> 
+				    	eval("${callBack}(errorCode)");
+				    </#if>
+				})
+				.bind('uploadStart', function (event, file) {
+						$('#ms__uploadPic_${inputName} ul li#' + file.id).find('span.front-cover').text('0%');
+				})
+				.bind('uploadProgress', function (event, file, bytesLoaded) {
+					   var percentage = Math.round((bytesLoaded / file.size) * 100);
+				})
+				.bind('uploadSuccess', function (event, file, serverData) {
+						$('#${inputName}').val(serverData);
+						<#if callBack!=""> 
+							eval("${callBack}(serverData)");
+						<#else>
+							<@ms.notify msg= "上传成功" type= "success" />
+						</#if>
+				})
+				.bind('uploadComplete', function (event, file) {
+				    $(this).swfupload('startUpload');
+				})
+		    });
+			</script>
+</#macro>
+
+<#-- plupload 图片上传组件 -->
+<#-- path 图片上传地址-->
+<#-- triggerBtnId 触发上传对话框的dom元素id-->
+<#-- imgId 放置图片的的标签id 为空的话不显示 -->
+<#-- container 用来指定Plupload所创建的html结构的父容器,默认为前面指定的browse_button的父元素。该参数的值可以是一个元素的id,也可以是DOM元素本身。-->
+<#-- filetype 图片文件类型用 , 隔开-->
+<#-- maxSize 文件最大值 单位 M-->
+<#macro pluploadImg path triggerBtnId imgId="" filetype="*.jpg;*.png;*.gif;*.bmp;*.jpeg" maxSize="1" callback="" isRename=true>
+
+<#assign onlyId = triggerBtnId />
+	<script type="text/javascript">
+	var ms__uploader_${onlyId} = new plupload.Uploader({
+		runtimes: 'html5',
+		browse_button: '${triggerBtnId}',
+		url: "${basePath}/upload",			// 接收上传请求的servlet地址
+		multi_selection: false,				// 只能选择1个文件
+		filters : {
+	        max_file_size : '${maxSize}mb',
+	        mime_types: [{title:"ImageFiles", extensions:"jpg,gif,png,bmp,jpeg"}]
+	    },
+	    // 上传服务器数据 post
+	    multipart_params: {
+	    	"uploadPath": "/${path}", 
+	    	"isRename": "${isRename?default("true")}",
+	    	"maxSize": ${maxSize},
+	    	"allowedFile": "${filetype?default('*.jpg;*.png;*.gif;*.bmp;*.jpeg')}"
+	    }
+	});
+	
+	//在实例对象上调用init()方法进行初始化
+	ms__uploader_${onlyId}.init();
+	
+	// 初始化方法
+	ms__uploader_${onlyId}.bind('Init', function(loader){
+	
+	});
+	
+	// 用户添加文件, 开始的时候立即添加
+	ms__uploader_${onlyId}.bind('FilesAdded', function(up, files){
+		uploader.start();
+	});
+	
+	// 队列中所有文件被上传完
+	ms__uploader_${onlyId}.bind('UploadComplete', function(up, file){
+		
+	});
+	
+	// 当一个文件开始上传的时候触发
+	ms__uploader_${onlyId}.bind('UploadFile', function(up, file){
+		
+	});
+	
+	// 文件上传成功的时候触发
+	ms__uploader_${onlyId}.bind('FileUploaded', function(uploader, file, result){
+	
+		if (result.status == 200){
+			// 图片的服务器路径
+			var imgUrl = result.response;
+			$('#${imgId}').attr('src', '${basePath}/' + imgUrl);
+		}
+		else{
+			$('.ms-notifications').offset({top:43}).notify({
+				type:'success',
+				message: { text:'上传失败,请求返回码:' + result.status }
+			}).show();
+		}
+		
+		<#if callback != "" > 
+			eval("${callBack}(result)");
+		</#if>
+	});
+
+</script>
+</#macro>

+ 198 - 0
src/main/webapp/WEB-INF/manager/index.ftl

@@ -0,0 +1,198 @@
+<!DOCTYPE html>
+<html lang="zh">
+<head>
+<title><#if app?has_content>${app.basicTitle}<#else>MS</#if>管理系统</title>
+<link rel="bookmark" href="favicon.ico"/> 
+<#include "${managerViewPath}/include/macro.ftl"/>
+<#include "${managerViewPath}/include/meta.ftl"/>
+<script src="http://cdn.mingsoft.net/model/4.6.0/ms.mstore.client.min.js"></script>
+</head>
+<script type="text/javascript">
+    $(function(){
+        var menuJson=${modelList};
+        $('.dropdown-toggle').dropdown();
+        //加载头部菜单
+        manager.topMenu.initMenu(menuJson);
+        //点击头部菜单从左侧显示当前菜单子菜单
+        $(".ms-menu-list").delegate(".ms-menu-detail","click",function(){
+            manager.topMenu.showChildMenu($(this),menuJson);
+        });
+        
+        //获取管理员帐号
+		$("#editLoginPassword").click(function() {
+			$.ajax({
+				type: "post",
+				dataType: "json",
+				url:  "${managerPath}/editPassword.do",
+				success: function(msg){
+					var json =JSON.parse(msg.resultMsg);
+					$(".editLoginPassword input[name='managerName']").val(json);
+					//$(".editLoginPassword").modal();
+				}
+			});
+		});
+		
+		
+		//修改密码
+		$("#editLoginPasswordButton").click(function() {		
+			var vobj = $("#updatePasswordFrom").data('bootstrapValidator').validate();
+			if(vobj.isValid()){
+				$(this).postForm("#updatePasswordFrom",{func:function(data) {
+					if(data.result){
+						alert("密码修改成功!");
+						location.reload();
+					}else{
+						alert(data.resultMsg);
+					}
+		 			
+				}});	
+			} else {
+				alert("表单验证失败");
+			}	
+			
+		});
+		
+		 //退出系统
+		$("#loginOutBtn").click(function() {	
+			//$(this).request({func:function(data) {
+		 	//		location.reload();
+			//}});
+			window.location.href="${managerPath}/logout"		
+		});
+	
+		$(".ms-menu-child li a").each(function() {
+			var tag = "?";
+			if ($(this).data("url").indexOf("?") > 0) {
+				tag="&";
+			}
+			$(this).data("url", "${managerPath}/"+$(this).data("url")+tag+"modelId="+$(this).data("id")+"&modelTitle="+encodeURI($(this).data("title")));
+		});
+    });
+</script>
+
+<body class="over-hide theme-index" >
+    <!--顶部开始 -->
+    <div class="ms-top">
+        <!--头部LOGO-->
+        <div class="ms-top-logo">
+            <img src="${skin_manager_logo}"/>
+            <!--span class="slideMenu">
+                <span class="icon iconfont icon-open">&#xe823;</span>
+                <span class="icon iconfont icon-close" style="display: none;">&#xe80d;</span>
+            </span-->
+        </div>
+        
+        <!--头部一级菜单-->
+        <div class="ms-top-menu">
+            <div class="menu-default">
+            	<#noparse>
+                <script id="ms-menu-list-tmpl" type="text/x-jquery-tmpl">
+                {{if modelModelId==0}}
+                    <li data-model-id="${modelId}" data-model-icon="${modelIcon}" class="ms-menu-detail">${modelTitle}</li>
+                {{/if}}
+                </script>
+                </#noparse>
+                <ul class="ms-menu-list">
+
+                </ul>
+                <span class="glyphicon glyphicon-menu-hamburger openMenu"></span>
+            </div>
+        </div>
+        <!--头部用户信息/进入MStore-->
+        <div class="ms-top-user">
+            <div class="dropdown">
+                <div id="dLabel" class="ms-top-info" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false">
+                    <span class="glyphicon glyphicon-user"></span>
+                    ${Session.manager_session.managerName}
+                    <span class="caret"></span>
+                </div>
+                <ul class="dropdown-menu" role="menu" aria-labelledby="dLabel">
+                	<li role="presentation" data-toggle="modal" data-target="#editLoginPassword">
+                    	<a role="menuitem" tabindex="-1"><span class="glyphicon glyphicon-cog"></span> 修改密码</a>
+                    </li>
+                	<li role="presentation" data-toggle="modal" data-target="#loginOut">
+                    	<a role="menuitem" tabindex="-1"><span class="glyphicon glyphicon-off"></span> 退出</a>
+                    </li>
+                </ul>
+            </div>
+
+            <div class="ms-top-mstore" data-toggle="tooltip" data-placement="bottom" title="点击进入Mstore">
+                <span class="glyphicon glyphicon-th-large animated"></span>
+                <span class="mstore-update"></span>
+            </div>
+        </div>
+    </div>
+
+	<#noparse>
+    <script id="ms-menu-tmpl" type="text/x-jquery-tmpl">
+    {{if modelModelId==0}}
+        <div class="ms-menu-parent" data-model-id="${modelId}">
+            <div class="ms-menu-parent-header ms-menu-parent-active">
+                <div class="ms-menu-parent-title" data-flag="true">
+                    <i class="icon iconfont icon-logo">${modelIcon}</i>
+                    ${modelTitle}    
+                </div>
+                <span class="closeMenu">×</span>
+            </div>
+            <ul class="ms-menu-child child-list${modelId}" id="tab-tools">
+            </ul>
+        </div>
+    {{/if}}
+    </script>
+    <script id="ms-menu-child-tmpl" type="text/x-jquery-tmpl">
+        <li><a style="cursor: pointer;"  data-title='${modelTitle}' data-url='${modelUrl}' data-id='${modelId}'><!--span class="caret"></span-->${modelTitle}</a></li>
+    </script>
+    </#noparse>
+    
+    <!--左边菜单开始-->
+	<div class="ms-menu-div">
+        <div class="slideMenu">
+            <span class="icon iconfont icon-open">&#xe823;</span>
+            <span class="icon iconfont icon-close" style="display: none;">&#xe80d;</span>
+        </div>
+    </div>
+    <div class="ms-menu">
+        <div class="ms-menu-none"></div>
+        <!--span class="slideMenu glyphicon glyphicon-tasks"></span-->
+    </div>
+    <!--左边菜单结束-->
+
+    <!--右边开始-->
+    <div class="ms-content">
+        <div class="wellcome">
+            <h2>欢迎进入MS系统</h2>
+            <p>欢迎加群: 221335098 或到
+                <a href="http://ms.mingsoft.net/mbbs/main.do" target="_blank" style="text-decoration: none;">官方论坛进行技术交流</a>
+            </p>
+        </div>
+        <div class="easyui-tabs">
+        
+        </div>
+        
+    </div>
+    <!--右边结束-->
+    
+    <!--修改登录密码模态框-->
+	<@ms.modal id="editLoginPassword" title="修改密码">
+		  <@ms.modalBody>
+		  		<@ms.form  isvalidation=true name="updatePasswordFrom"  action="${managerPath}/updatePassword.do">
+		    		<@ms.text name="managerName" width="280" label="账号:" title="managerName" value="" readonly="readonly" validation={"required":"true", "data-bv-notempty-message":"必填项目"} />
+		    		<@ms.password width="280" name="oldManagerPassword" label="旧密码:" title="managerPassword" validation={"required":"true","minlength":"6","maxlength":"20","data-bv-notempty-message":"必填项目","data-bv-stringlength-message":"6-20个字符以内!"}/>
+		    		<@ms.password width="280" name="newManagerPassword" label="新密码:" title="managerPassword" validation={"required":"true", "minlength":"6","maxlength":"20", "data-bv-notempty-message":"必填项目","data-bv-stringlength-message":"6-20个字符以内!"}/>
+		    	</@ms.form>	
+	     </@ms.modalBody>
+		 <@ms.modalButton>
+		 	<@ms.savebutton value="更新密码" id="editLoginPasswordButton"/>
+		 </@ms.modalButton>
+	</@ms.modal>
+	
+	<@ms.modal id="loginOut" title="退出提示!">
+		  <@ms.modalBody>
+		  		确认退出?
+	     </@ms.modalBody>
+		 <@ms.modalButton>
+		 	<@ms.button value="确认退出" id="loginOutBtn" url="${managerPath}/loginOut.do"/>
+		 </@ms.modalButton>
+	</@ms.modal>
+</body>
+</html>

+ 247 - 0
src/main/webapp/WEB-INF/manager/login.ftl

@@ -0,0 +1,247 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+<#include "${managerViewPath}/include/meta.ftl"/>
+<title><#if app?has_content>${app.appName}<#else>MS</#if>管理系统${managerViewPath}</title>
+<link rel="shortcut icon" href="${static}/global/images/ms.ico"/>     
+<link rel="bookmark" href="${static}/global/images/ms.icoo"/> 
+<script type="text/javascript" src="http://cdn.mingsoft.net/plugins/vue/2.3.3/vue.min.js"></script>
+<script type="text/javascript" src="http://cdn.mingsoft.net/plugins/validator/5.5.0/validator.min.js"></script>
+<link rel="stylesheet/less" type="text/css" href="${static}/skin/manager/${manager_ui}/less/login.less" media="all" />
+<script type="text/javascript" src="http://cdn.mingsoft.net/plugins/less/2.5.3/less.min.js" ></script>
+<script>
+			if(top.location != location){  
+			    top.location.href= location.href;  
+			}  
+			
+</script>
+</head>
+<style>
+	.gray{background:#92908E}
+</style>
+<body>
+        <#if app?has_content>
+        <div id="mcms-login">
+            <img src="${static}/skin/manager/${manager_ui}/images/pic.png" class="login-images login-float" />
+            <div class="login-form-container login-float">
+                <div class="login-title">
+                    <span class="login-chinese-title">账号登录 /</span>
+                    <span class="login-english-title">User login</span>
+                </div>
+				<div class="ms-login-error-text">
+					<img src="${static}/skin/manager/${manager_ui}/images/error.png" v-show="errorText != ''" />
+					<span v-text="errorText" v-show="errorText != ''"></span>
+				</div>
+                <form class="form-horizontal" id="loginForm" action="${managerPath}/checkLogin.do">
+                    <input type="text" maxlength="12" class="login-people-name" :class="{'ms-error':error == 'peopleName'}" id="managerName" name="managerName" @blur="checkPeopleName" @keyup="chanageBackgroundColor" placeholder="用户名" v-model="peopleName" />
+                    <input type="password" maxlength="20" class="login-people-name" :class="{'ms-error':error == 'peoplePassword'}" id="managerPassword" name="managerPassword" @blur="checkPeoplePassword" @keyup="chanageBackgroundColor" placeholder="密码" v-model="peoplePassword" />
+                    <div class="login-code">
+                        <input type="text" onKeyUp ="value=value.replace(/[\W]/g,'')" maxlength="4" class="login-float login-code-input" :class="{'ms-error':error == 'rand_code'}" id="rand_code" name="rand_code" @blur="checkCode" @keyup="chanageBackgroundColor" placeholder="验证码" v-model="code" />
+                        <img id="ms-login-code" class="login-code-img login-float" src="${basePath}/code" @click="changeCode"/>
+                        <p class="login-float login-code-text">
+                            <span>看不清?</span><br/>
+                            <spna class="login-code-change" @click="changeCode">换一张</span>
+                        </p>
+                    </div>
+                    <p  class="login-remmember-password">
+                        <input id="remember" type="checkbox" name="" />
+                        <label class="login-remember" for="remember">记住密码</label>
+                    </p>
+                    <div  id="login-button" class="login-button"  v-on:click="toLogin">登录</div>
+                </form>
+            </div>
+        </div>
+        <#else>
+            <div id="errorDisplay">
+        	    <img src="${static}/skin/manager/${manager_ui}/images/errorDisplay.png"/>
+        	    <div class="errorData">
+        	    <p >系统配置异常,请手动去掉WEB-INF/ms.install.bak文件的后缀.bak,再重启系统进入登录界面进行初始化</p>
+        	    </div>
+        	<div>
+
+        </#if>
+    </body>
+   
+	<script>
+	    
+        var loginForm = new Vue({
+            el:'#mcms-login',
+            data:{
+                isRight: true,
+                errorText:"",//错误提示
+                error:"",//输入框错误的显示
+                peopleName:"",//用户名输入框
+                peoplePassword:"",//密码输入框
+				code:"",//验证码
+            },
+            watch: {
+				peopleName: function() {
+                    var pattern = /[^\w\u4E00-\u9FA5]/ig;
+                    if(!validator.isNull(this.peopleName) && this.peopleName.indexOf(" ") < 0 && validator.isLength(this.peopleName, {min:6,max:20}) && pattern.test(this.peopleName) == false && this.error == 'peopleName'){
+                        this.errorText = "";
+                        this.error = "";
+					}
+				},
+                peoplePassword: function() {
+                    if(!validator.isNull(this.peoplePassword) && this.peoplePassword.indexOf(" ") < 0 && validator.isLength(this.peoplePassword, {min:6,max:20}) && this.error == 'peoplePassword'){
+                        this.errorText = "";
+                        this.error = "";
+					}
+				},
+				code: function(){
+					if(!validator.isNull(this.code) && this.code.length == 4 && this.error == 'rand_code'){
+						this.errorText = "";
+                        this.error = "";
+					}
+				}
+			},
+			mounted: function() {
+			      var _this = this;
+		          //页面初始化时,如果帐号密码cookie存在则填充
+                  if($.cookie('managerName') && $.cookie('managerPassword')){
+                      _this.peopleName = $.cookie('managerName');
+                      _this.peoplePassword = $.cookie('managerPassword');
+                      $("#remember").attr("checked",true);
+                  }
+			      //检测浏览器版本
+			      if (navigator.userAgent.toLowerCase().indexOf("msie") > 0) {
+			      	    alert("您当前的浏览器版本太低,建议使用IE8以上版本浏览器,推荐使用Chrome浏览器");
+			      }
+			      
+			      //js监听回车键 
+			      document.onkeydown = function(e) {
+			      	e = e ? e : window.event;
+			      	var keyCode = e.which ? e.which : e.keyCode;
+			      	if (keyCode == 13) {
+			      		_this.login(); 
+			      	}
+			      }
+			},
+            methods:{
+                //错误提示显示
+                errorShow:function(msg,type){
+                    this.errorText = msg;
+                    this.error = type;
+                },
+                changeCode:function(){
+                	$("#ms-login-code").attr("src","${basePath}/code?t="+new Date().getTime())
+                },
+                //判断用户名
+                checkPeopleName:function(){
+                    var pattern = /[^\w\u4E00-\u9FA5]/ig;
+					if(validator.isNull(this.peopleName)){
+						this.errorShow("用户名不能为空",'peopleName');
+						this.isRight = false;
+						return;
+					}else if(this.peopleName.indexOf(" ") >= 0) {
+						this.errorShow("用户名不能包含空格",'peopleName');
+						this.isRight = false;
+						return;
+					}else if(!validator.isLength(this.peopleName, {min:3,max:12})){
+						this.errorShow("用户名为3~12个字符",'peopleName');
+						this.isRight = false;
+						return;
+					}else if(pattern.test(this.peopleName)){
+                        this.errorShow("用户名不能包含特殊字符",'peopleName');
+                        this.isRight = false;
+						return;
+                    }
+                },
+                //判断密码
+                checkPeoplePassword:function(){
+                    if(validator.isNull(this.peoplePassword)){
+						this.errorShow("密码不能为空",'peoplePassword');
+						this.isRight = false;
+						return;
+					}else if(!validator.isLength(this.peoplePassword, {min: 6,max: 20})){
+						this.errorShow("密码长度在6~20位之间!",'peoplePassword');
+						this.isRight = false;
+						return;
+					}else if(this.peoplePassword.indexOf(" ") >=0){
+                        this.errorShow("密码是不能包含空格",'peoplePassword');
+                        this.isRight = false;
+						return;
+					}
+                },
+				//判断验证码
+                checkCode:function(){
+                    if(validator.isNull(this.code)){
+						this.errorShow("验证码不能为空",'rand_code');
+						this.isRight = false;
+						return;
+					}else if(this.code.length != 4){
+						this.errorShow("验证码为4位!",'rand_code');
+						this.isRight = false;
+						return;
+					}
+                },
+                //登录判断验证
+                checkLogin:function(){
+                    this.checkPeoplePassword();
+                    this.checkPeopleName();
+                    this.checkCode();
+                },
+                //验证登录数据
+                login:function(){
+                    loginForm.checkLogin(); 
+		            if(this.isRight){
+		                $("#login-button").html("正在登录");
+		                $("#login-button").attr("style","pointer-events: none;");
+				        $(this).postForm("#loginForm",{loadingText:"正在登录中..",func:function(data) {
+    				        if(data.result){
+    					    location.href=base+"${baseManager}/index.do";
+    				            }else{
+    				        alert(data.resultMsg);
+    				        $("#ms-login-code").attr("src","${basePath}/code?t="+new Date().getTime())
+    				        $("#login-button").html("登录");
+    				        $("#login-button").attr("style","pointer-events: auto;");
+    				        $("#login-button").css({"background-color":"#0099ff"});
+				        };
+				        }});
+				     }else{
+				         this.isRight=true;
+				        
+				          }
+                     },
+                   //删除cookies
+                delCookies: function(names){
+                     for(i=0;i<names.length;i++){
+                     $.cookie(names[i],null,{ expires: -1 });
+                     }
+                  },
+                  //删除并且修改cookies
+                delAndSetCookies: function(names,values,date){
+                     this.delCookies(names);
+                     for(i=0;i<values.length;i++){
+                        $.cookie(names[i], values[i], { expires: date });
+                     }
+                  },
+                  //改变登录按钮背景色
+                chanageBackgroundColor: function(){
+                     if($("#managerName").val().length >= 3 && $("#managerPassword").val().length >= 6 && $("#rand_code").val().length == 4){
+                         $("#login-button").css({"background-color":"#0099ff"});
+                     }else{
+                          $("#login-button").css({"background-color":"#eeeeee"});
+                     }
+                  },
+                  //点击登录方法
+                toLogin: function(){
+                     var names=new Array('managerName','managerPassword');
+			         var values=new Array($("#managerName").val(),$("#managerPassword").val());
+			         if($("#remember").is(":checked")){ 
+                         this.delAndSetCookies(names,values,1);
+                     }else{
+                         this.delCookies(names);
+                     }
+                         this.login();
+                     }
+                 
+                       
+            }
+            
+			
+        })
+		
+	</script>
+   
+</html>

+ 15 - 0
src/main/webapp/WEB-INF/manager/main.ftl

@@ -0,0 +1,15 @@
+<!DOCTYPE html>
+<html lang="en">
+<head> 
+  <title>铭飞MCMS</title> 
+  <meta content="IE=edge" http-equiv="X-UA-Compatible" /> 
+  <meta name="viewport" content="width=device-width, initial-scale=1.0" /> 
+  <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=no" /> 
+  <meta content="text/html; charset=utf-8" http-equiv="Content-Type" /> 
+<style>
+body{  height: 100%;}
+</style>
+</head>
+<body>
+</body>
+</html>

+ 360 - 0
src/main/webapp/WEB-INF/manager/manager/manager.ftl

@@ -0,0 +1,360 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+  	<#include "${managerViewPath}/include/macro.ftl"/>
+  	<#include "${managerViewPath}/include/meta.ftl"/>   
+</head>
+<body>
+<@ms.content>
+		<@ms.contentBody>
+			<@ms.contentNav title="管理员管理">
+				<@ms.panelNavBtnGroup>
+						<@ms.panelNavBtnAdd  id="totalAdd" title=""/>
+						<@ms.panelNavBtnDel  id="totalDelete"/>
+					</@ms.panelNavBtnGroup>
+			</@ms.contentNav >
+			<@ms.contentPanel>
+	              <@ms.table head=['账号','昵称','密码','角色名称',"<th style='text-align:center'>添加时间</th>"] checkbox="checkbox">
+	           			<#if listManager?has_content>
+	           				<#list listManager as manager>
+	                    	<tr>
+						          	<td style="text-align:center;width:10%;">
+					            		<#if manager.managerName != managerSession.managerName>
+		  									<input type="checkbox" name="checkbox" value="${manager.managerId?c?default(0)}">
+		  								</#if>
+						            </td>	          	
+						            <td style="width:10%">
+						            	
+						            	<#if manager.managerName != managerSession.managerName>
+						                    
+						                    <a class="btn btn-xs tooltips updateModalBtn" data-toggle="tooltip" data-id="${manager.managerId?c?default(0)}" data-original-title="编辑">
+					                     		${manager.managerName?default("暂无")}
+					                    	</a>
+					                    	<#else>
+					                    	${manager.managerName?default("暂无")}
+				                    	</#if>	
+						            </td>
+						            <td style="width:10%">${manager.managerNickName?default("暂无")}</td>
+						 			<td style="width:25%">${manager.managerPassword?default("暂无")}</td>
+						            <td style="width:10%" >${manager.roleName?default("暂无")}</td>
+						            <td class="text-center">${manager.managerTime?string("yyyy-MM-dd HH:mm:ss")}</td>
+						         </tr>
+	                    	</#list>
+	                 		<#else>
+	                 			<tr>
+						            <td colspan="5" class="text-left">
+						            	<@ms.nodata/>
+									</td>
+					          	</tr>
+	        			</#if>
+	        			</@ms.table>
+					<@showPage page=page/>
+			</@ms.contentPanel>		
+		</@ms.contentBody>
+		<!--=================模态框部分开始=================-->
+		
+		<!--修改/保存的模态框开始-->
+		<@ms.modal modalName="update" title="">
+			 <@ms.modalBody height="250">
+				<@ms.form isvalidation=true name="updateManager" id="updateManager"  action="">	
+		    		<@ms.text name="managerName"    label="账号" title="账号" maxlength="30" placeholder="请输入账号" validation={"required":"true", "data-bv-notempty-message":"账号不能为空"}/>
+		    		<@ms.text name="managerNickName"    label="昵称" title="昵称"  maxlength="30" placeholder="请输入昵称" validation={"required":"true", "data-bv-notempty-message":"昵称不能为空"}/>
+		    		<@ms.text name="managerPassword"    label="密码" title="密码"  maxlength="100" placeholder="请输入密码"/>	
+					<@ms.select  name="managerRoleID" label="选择角色"  list=listRole  id="orderStatus" listKey="roleId"  listValue="roleName" value="" style="width:57%" validation={"required":"true", "data-bv-notempty-message":"角色不能为空"}/>
+	    			<input type="hidden" class="managerPeopleID" name="managerPeopleID" value="0"/>
+					<input type="hidden" class="oldManagerName" name="oldManagerName" value=""/>
+		    	</@ms.form>		          	
+		     </@ms.modalBody>
+		     <@ms.modalButton>
+	 			<@ms.savebutton id="updateButton"/>  
+	 		 </@ms.modalButton>
+		</@ms.modal>
+		<!--修改/保存的模态框结束-->
+		
+		<!--多选删除的模态框开始-->
+		<@ms.modal modalName="deleteAll" title="批量删除管理员">
+			 <@ms.modalBody>
+				您确定删除您所勾选的管理员吗?
+		     </@ms.modalBody>
+		     <@ms.modalButton>
+	    		<@ms.button value="返回" id="closeDelete"/>  
+	 			<@ms.button class="btn btn-danger" id="deleteButton" value="删除"/>  
+	 		 </@ms.modalButton>
+		</@ms.modal>
+		<!--多选删除的模态框结束-->
+		<!--单个删除的模态框开始-->
+		<@ms.modal modalName="deleteRadio" title="删除管理员">
+			 <@ms.modalBody>
+				您确定删除您所勾选的管理员吗?
+		     </@ms.modalBody>
+		     <@ms.modalButton>
+	    		<@ms.button value="返回" id="closeRadio"/>  
+	 			<@ms.button class="btn btn-danger" id="deleteRadio" value="删除"/>  
+	 		 </@ms.modalButton>
+		</@ms.modal>
+		<!--单个删除的模态框结束-->
+		
+		<@ms.modal modalName="managerPageModel" title="主页面绑定">
+			 <@ms.modalBody>
+				<@ms.form isvalidation=true name="managerPageForm" id="managerPageForm" class="form-inline" action="${managerPath}/managerModelPage/save.do">	
+		    		<@ms.text name="managerModelPageUrl"    label="主界面地址:" title="主界面地址:" size="5" maxlength="30" placeholder="请输入主页面地址"/>
+		    		<@ms.select  name="managerModelPageModelId" label="选择模块"  list=listManager  id="orderStatus" listKey="managerRoleID"  listValue="roleName" value="" style="width:57%"/>
+		  			<input type="hidden"  name="managerModelPagemanagerId">
+		    	</@ms.form>		          	
+		     </@ms.modalBody>
+		     <@ms.modalButton>
+	    		<@ms.button value="返回" id="closeSaveUrl"/>  
+	 			<@ms.savebutton id="saveUrl"/>  
+	 		 </@ms.modalButton>
+		</@ms.modal>
+		<!--=================模态框部分结束=================-->
+	</@ms.content>
+	<script>				
+	var URL='';
+	//模态框的操作
+	$(function () {	
+		$("#totalAdd").click(function(){
+			$("#updateTitle").text("新增管理员");	
+			$("#updateButton").text("保存");
+			URL="${managerPath}/manager/save.do";
+	 		$(".update").modal();
+	 	});
+	 	$("#closeUpdate").click(function(){
+	 		$(".update").modal("hide");
+	 	});
+	 	
+	 	$("#closeDelete").click(function(){
+	 		$(".deleteAll").modal("hide");
+	 	});
+	 	
+	 	$("#closeRadio").click(function(){
+	 		$(".deleteRadio").modal("hide");
+	 	});
+	 	
+	 	$("#closeSaveUrl").click(function(){
+	 		$(".managerPageModel").modal("hide");
+	 	});	
+	});
+	 	
+ 		//全选
+	   	$("#allCheck").on("click",function(){   
+			if(this.checked){
+			      $("input[name='checkbox']").each(function(){this.checked=true;});
+			}else{
+			      $("input[name='checkbox']").each(function(){this.checked=false;});   
+			}   
+		}); 
+		
+	 //点击更新按钮
+	 $("#updateButton").click(function() {
+			var formData = $("#updateManager").serialize();
+			var vobj = $("#updateManager").data('bootstrapValidator').validate();
+			var buttonHtml = $("#updateButton").html();
+			if(vobj.isValid()){
+					$.ajax({
+					   type: "post",
+					   dataType: "json",
+					   url:  URL,
+					   data: formData, 
+					   beforeSend:function(){
+					   		$("#updateButton").text($("#updateButton").text()+"中");
+					   		$("#updateButton").attr("disabled",true);
+					   },
+					   success: function(msg){ 
+					   		if(msg.result==true){
+					   			$('.ms-notifications').offset({top:43}).notify({
+									type:'success',
+									message: { text:buttonHtml+"成功" }
+								}).show();
+					   			location.reload();
+					   		}else{
+					   			$('.ms-notifications').offset({top:43}).notify({
+									type:'warning',
+									message: { text:msg.resultMsg }
+								}).show();
+					   			$("#updateButton").text(buttonHtml);
+					   			$("#updateButton").attr("disabled",false);
+					   		}
+					   },error: function(){
+					   	  <@ms.notify msg= "数据请求失败,请检查请求地址和参数是否正确" type= "danger" />
+					   	  location.href = base+"${baseManager}/role/add.do";
+					   }
+				});
+			 }
+			
+	 });
+	 
+	$(".updateModalBtn").click(function(){
+		$("#updateTitle").text("编辑管理员");			
+		$("#updateButton").text("更新");	
+		//找到点击的id
+		var managerId =  $(this).attr("data-id");
+		URL="${managerPath}/manager/"+managerId+"/edit.do";
+		$.ajax({
+			type: "post",
+			dataType:"json",
+			url:  URL,
+			data: "managerId=" + managerId,
+			success: function(msg){	
+	   			if(msg.manager != null){
+			   		$("input[name='managerName']").val(msg.manager.managerName);
+			   		$("input[name='oldManagerName']").val(msg.manager.managerName);
+			   		$("input[name='managerNickName']").val(msg.manager.managerNickName);
+			   		$("input[name='managerPassword']").val(msg.manager.managerPassword);
+			   		$("input[name='managerRoleID']").val(msg.manager.managerRoleID);
+			   		$("select[name=managerRoleID]").find("option[value="+msg.manager.managerRoleID+"]").attr("selected",true);
+		   		}
+		   },error: function(){
+		   	  <@ms.notify msg= "系统异常" type= "danger" />
+		   }
+		});
+		URL = "${managerPath}/manager/update.do?managerId="+managerId;
+		$(".update").modal();
+	});
+	 
+	 $("#totalDelete").click(function(){
+	 	var radioData = $("input[name='checkbox']").serialize();
+		if(radioData!=""){
+			$(".deleteAll").modal();//打开
+		}else{
+			<@ms.notify msg= "请选择需要删除的管理员!" type= "warning" />
+		}
+	 });
+	 
+	 
+	 	//批量删除管理员
+		$("#deleteButton").click(function(){
+			var count = 0;
+			var checkboxData = $("input[name='checkbox']").serialize();
+			$("input[name='checkbox']").each(function(){
+				if(this.checked==true){
+					count++;
+				}
+			});
+			if(checkboxData.length != 0) {
+				$.ajax({
+				   type: "post",
+				   dataType: "json",
+				   url:  base+"${baseManager}/manager/allDelete.do",
+				   data: checkboxData,
+				   beforeSend:function(){
+				   		$("#deleteButton").text("删除中");
+				   		$("#deleteButton").attr("disabled",true);
+				   },
+				   success: function(msg){
+				   		<@ms.notify msg= "删除管理员成功" type= "success" />
+				   		if($("tbody tr").length == count && msg != 1){
+				     		location.href = base+"${baseManager}/manager/queryList.do?pageNo="+(msg-1);
+						}else{
+				     		location.href = base+"${baseManager}/manager/queryList.do?pageNo="+msg;
+						}
+				   },error: function(){
+				   	  <@ms.notify msg= "批量删除管理员失败" type= "danger" />
+				      $(".deleteAll").modal("hide");
+				   }
+				});
+			 } else {
+			 	<@ms.notify msg= "删除失败,请先选择管理员" type= "danger" />
+				$(".deleteAll").modal("hide");
+			 }
+		 });
+		 
+		 
+		 var radioManagerId 
+		 $(".delete").click(function(){
+		 	radioManagerId =  $(this).attr("data-id");
+ 		 	$(".deleteRadio").modal();
+		 });
+		 
+		 //删除单个
+		 $("#deleteRadio").click(function(){
+		 	$.ajax({
+			   type: "post",
+			   dataType: "json",
+			   url:  "${managerPath}/manager/"+radioManagerId+"/delete.do",
+			   data: "managerId=" + radioManagerId,
+			   success: function(msg){
+			    	if(msg != 0) {
+			    		<@ms.notify msg= "删除管理员成功" type= "success" />
+			    		if($("tbody tr").length==0 && msg != 1){
+			    			location.href = base+"${baseManager}/manager/queryList.do?pageNo="+(msg-1);
+						}else{
+							location.href = base+"${baseManager}/manager/queryList.do?pageNo="+msg;
+						}
+			    	} else {
+						<@ms.notify msg= "删除管理员失败" type= "danger" />
+				    	$(".closeModal").click();
+			    	}
+			   },error: function(){
+			   	  <@ms.notify msg= "系统异常" type= "danger" />
+			   }
+			});
+		 });
+		 
+		
+		 //点击弹出管理员主界面新增或更新弹出框
+		$(".addPage").click(function(){
+			var managerModelPageModelId = $(this).attr("data-id");
+			$("input[name='managerModelPagemanagerId']").val($(this).attr("data-id"));
+			//查询该管理员的模块信息
+			$.ajax({
+			   type: "post",
+			   dataType: "json",
+			   url:  base+"${baseManager}/model/"+$(this).attr("data-id")+"/queryModelByRoleId.do",
+			   data:$("#managerPageForm").serialize(),
+			   success: function(msg){
+			     	if(msg.result){
+			     		var modelJson =jQuery.parseJSON( msg.resultMsg);
+			     		$("select[name='managerModelPageModelId']").html("");
+			     		for (i=0;i<modelJson.length;i++) {
+							if (modelJson[i].modelModelId==0) {
+								$("select[name='managerModelPageModelId']").append("<option  value="+modelJson[i].modelId+">"+modelJson[i].modelTitle+"</option>");
+							}
+						}
+			     	} 
+			   }
+			});
+			//查询该管理员是否绑定主界面
+			var modelId=0;
+			queryModelPage(modelId,managerModelPageModelId);
+			$(".managerPageModel").modal();
+		});
+		//查询模块是否绑定主界面
+		function queryModelPage(modelId,managerModelPageModelId){
+			$.ajax({
+			   type: "post",
+			   dataType: "json",
+			   url:  "${managerPath}/managerModelPage/"+modelId+"/getEntity.do",
+			   data:"managerModelPageModelId="+managerModelPageModelId,
+			   success: function(msg){
+			     	if(msg.result){
+			     		var json =jQuery.parseJSON(msg.resultMsg);
+			     		alert(msg);
+			     		$("input[name='managerModelPageUrl']").val(json.managerModelPageUrl);
+			     	} 
+			   }
+			});
+		}
+		
+		//点击保存时,开始主界面信息的保存
+		$("#saveUrl").click(function(){
+			$.ajax({
+				type: "post",
+				dataType: "json",
+				url:  "${managerPath}/managerModelPage/save.do",
+				data:$("#managerPageForm").serialize(),
+				beforeSend:function(){
+					$("#saveUrl").text("保存中");
+					$("#saveUrl").attr("disabled",true)
+				},
+				success: function(msg){
+					if(msg){
+			     		<@ms.notify msg= "保存成功!" type= "success" />
+			     		location.href = base+"${baseManager}/manager/queryList.do";
+			     	} 
+			   	}
+			});
+		});
+	</script>
+</body>
+</html>

+ 248 - 0
src/main/webapp/WEB-INF/manager/model/index.ftl

@@ -0,0 +1,248 @@
+<@ms.html5>
+	<@ms.nav title="菜单管理"></@ms.nav>
+	<@ms.panel>
+		<div id="toolbar">
+			<@ms.panelNav>
+				<@ms.buttonGroup>
+					<@shiro.hasPermission name="model:save"><@ms.panelNavBtnAdd title="" id="addModelBtn"/></@shiro.hasPermission> 
+					<@shiro.hasPermission name="model:del"><@ms.panelNavBtnDel title="" id="delModelBtn"/></@shiro.hasPermission> 
+				</@ms.buttonGroup>
+			</@ms.panelNav>
+		</div>
+		<table id="modelList" 
+			data-show-refresh="true"
+			data-show-columns="true"
+			data-show-export="true"
+			data-method="post" 
+			data-side-pagination="server">
+		</table>
+	</@ms.panel>
+ 	<!--添加模块-->    
+	<@ms.modal modalName="addEditModel" title="添加模块">
+		<@ms.modalBody height="350">
+			<@ms.form isvalidation=true name="addEditForm"  action="" method="post"  >
+				<@ms.formRow label="父级菜单">
+					<@ms.treeInput treeId="modelInputTree" json="${parentModelList?default('')}" jsonId="modelId" jsonPid="modelModelId" jsonName="modelTitle"  addNodesName="顶级模块" buttonText="顶级模块" inputName="modelModelId" inputValue="0" clickZtreeId="clickZtreeId(event,treeId,treeNode);" expandAll="true" showIcon="true"/>
+				</@ms.formRow>
+				<@ms.text name="modelTitle" label="标题" title="模块标题" placeholder="请输入模块标题" value="" validation={"required":"true", "data-bv-notempty-message":"请输入模块标题!","data-bv-stringlength":"true","minlength":"1","maxlength":"10","data-bv-stringlength-message":"模块标题为1-10个字符!"} />
+				<@ms.text name="modelIcon"  label="图标" title="模块图标"  placeholder="请输入模块图标" value="" validation={"maxlength":"20","data-bv-stringlength-message":"模块图标为1-20个字符!"}/>
+				<@ms.text name="modelUrl"  label="链接地址" title="模块链接地址"  placeholder="请输入模块链接地址" value="" validation={"maxlength":"255","data-bv-stringlength-message":"模块链接地址为1-255个字符!"}/>
+				<#assign isMenu=[{"id":"0","name":"否"},{"id":"1","name":"是"}]>
+				<@ms.text name="modelSort" label="排序" title="模块排序" width="165px;" value="" placeholder="请输入排序" validation={"required":"true","maxlength":"5", "data-bv-notempty-message":"请输入模块排序!"}/>
+				<@ms.select name="modelIsMenu" style="width: 25%;" id="modelMenuSelect" list=isMenu  listKey="id" listValue="name" label="是否是菜单"  value="0" title="是否是菜单" />
+				<@ms.hidden name="modelId" value="" id="hideModelId"/>
+			</@ms.form>
+		</@ms.modalBody>
+		<@ms.modalButton>
+			<@ms.button  value=""  id="addEditBtn"/>
+		</@ms.modalButton>
+	</@ms.modal>	
+	<@ms.modal  modalName="delModel" title="模块数据删除" >
+		<@ms.modalBody>删除此模块
+			<@ms.modalButton>
+				<!--模态框按钮组-->
+				<@ms.button  value="删除" class="btn btn-danger rightDelete"  id="deleteModelBtn"  />
+			</@ms.modalButton>
+		</@ms.modalBody>
+	</@ms.modal>
+</@ms.html5>
+
+<script>
+	var modelId;
+	var postMessage;
+	$(function(){
+		$("#modelList").bootstrapTable({
+			url:"${managerPath}/model/list.do",
+			contentType : "application/x-www-form-urlencoded",
+			queryParamsType : "undefined",
+			toolbar: "#toolbar",
+			idField: 'modelId',
+            treeShowField: 'modelTitle',
+            parentIdField: 'modelModelId',
+	    	columns: [{ checkbox: true},
+				    	{
+				        	field: 'modelIcon',
+				        	title: '模块图标',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		if(value != null){
+				        			return "<i class='iconfont'>"+value+"</i>";
+				        		}else{
+				        			return "";
+				        		}
+				        	}
+				        	
+				    	},{
+				        	field: 'modelTitle',
+				        	title: '模块标题',
+				        	formatter:function(value,row,index) {
+				        		<@shiro.hasPermission name="model:update">	        
+					        	return "<a style='cursor:pointer;text-decoration:none;' onclick='editModal("+row.modelId+")'>" + value + "</a>";
+					    		</@shiro.hasPermission> 
+					    		<@shiro.lacksPermission name="model:update">
+					    			return value;
+					    		</@shiro.lacksPermission>
+				        		
+				        	}
+				    	},{
+				        	field: 'modelUrl',
+				        	title: '模块连接地址',
+				        	formatter:function(value,row,index) {
+				        		if(value == null){
+				        			return "";
+				        		}else{
+				        			return value;
+				        		}
+				        	}
+				        	
+				    	},{
+				        	field: 'isChild',
+				        	title: '菜单类型'
+				    	},{
+				        	field: 'modelSort',
+				        	title: '模块的排序'
+				    	},{
+				        	field: 'modelIsMenu',
+				        	title: '模块是否是菜单',
+				        	align: 'center',
+				        	formatter:function(value,row,index) {
+				        		if(value == 0){
+				        			return "否";
+				        		}else if(value == 1){
+				        			return "是";
+				        		}else{
+				        			return "";
+				        		}
+				        	}
+				    	}]
+	    })
+	})
+	//新增模块
+	$("#addModelBtn").click(function(){
+		$("#addEditForm").data("bootstrapValidator").validate();
+			var isValid = $("#addEditForm").data("bootstrapValidator").isValid();
+			if(!isValid) {
+				<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+				return;
+		}
+		postMessage="保存成功!";
+		$("#addEditBtn").text("保存");
+		$("#addEditForm").attr("action","${managerPath}/model/save.do");
+		$("#addEditForm")[0].reset(); 
+		$(".addEditModel").modal();
+		$("input[name='modelSort']").val(0);
+		$("#hideModelId").attr("disabled",true);
+	});
+	//编辑模块
+	function editModal(id){
+	$("#addEditForm").data("bootstrapValidator").validate();
+		var isValid = $("#addEditForm").data("bootstrapValidator").isValid();
+		if(!isValid) {
+			<@ms.notify msg= "数据提交失败,请检查数据格式!" type= "warning" />
+			return;
+	}
+	var editUrl="${managerPath}/model/get.do?modelId="+id;
+	$(this).request({url:editUrl,type:"json",method:"post",func:function(data){
+		var model = data.model;
+		// 给表单赋值
+		if(model!=null){
+			$("input[name='modelId']").val(model.modelId);
+			if(model.modelIcon!=undefined){
+				$("input[name='modelIcon']").val(model.modelIcon);
+			}
+			if(model.modelModelId==0){
+				$("#treeLabelmodelInputTree").text("顶级模块");
+			}else{
+				$("#treeLabelmodelInputTree").text(data.parentModel.modelTitle);
+			}
+			$("#modelMenuSelect").get(0).selectedIndex = model.modelIsMenu;
+			$("input[name='modelTitle']").val(model.modelTitle);
+			$("input[name='modelSort']").val(model.modelSort);
+			$("input[name='modelUrl']").val(model.modelUrl);
+			$("input[name='isChild']").val(model.isChild);
+			$("#modelMenuSelect option[value="+model.modelMenu+"]").attr("selected",true);
+			$("input[name='modelModelId']").val(model.modelModelId);
+			$(".addEditModel").modal();
+			postMessage="更新成功!";
+			$("#addEditBtn").text("更新");
+			$("#hideModelId").attr("disabled",false);
+			$("#hideModelId").val(model.modelId);
+			$("#addEditForm").attr("action","${managerPath}/model/update.do");
+		}		
+	}});
+}
+	//提交表单
+	$("#addEditBtn").on("click",function(){
+		var vobj = $("#addEditForm").data('bootstrapValidator').validate();
+		if(vobj.isValid()){
+			$(this).postForm("#addEditForm",{func:function(msg) {
+				if(msg.result){
+					<@ms.notify msg="更新成功!" type="success"/>
+			    	location.reload();
+				}else{
+			 	        $('.ms-notifications').offset({top:43}).notify({
+			    		    type:'warning',
+						    message: { text:msg.resultMsg }
+						 }).show();
+				}
+			}});
+		}
+	});
+	
+	//删除按钮
+	$("#delModelBtn").click(function(){
+		//获取checkbox选中的数据
+		var rows = $("#modelList").bootstrapTable("getSelections");
+		//没有选中checkbox
+		if(rows.length <= 0){
+			<@ms.notify msg="请选择需要删除的记录" type="warning"/>
+		}else{
+			$(".delModel").modal();
+		}
+	})
+	
+	$("#deleteModelBtn").click(function(){
+		var rows = $("#modelList").bootstrapTable("getSelections");
+		$(this).text("正在删除...");
+		$(this).attr("disabled","true");
+		var ids = "";
+		for(var i=0;i<rows.length;i++){
+			if(ids == ""){
+				ids = rows[i].modelId;
+			}else{
+				ids = ids+","+rows[i].modelId
+			}
+		}
+		$.ajax({
+			type: "post",
+			url: "${managerPath}/model/delete.do?ids="+ids,
+			dataType: "json",
+			contentType: "application/json",
+			success:function(msg) {
+				if(msg.result == true) {
+					<@ms.notify msg= "删除成功" type= "success" />
+				}else {
+					<@ms.notify msg= "删除失败" type= "danger" />
+				}
+				location.reload();
+			}
+		})
+	});
+	//查询功能
+	function search(){
+		var search = $("form[name='searchForm']").serializeJSON();
+        var params = $('#modelList').bootstrapTable('getOptions');
+        params.queryParams = function(params) {
+        	$.extend(params,search);
+	        return params;  
+       	}  
+   	 	$("#modelList").bootstrapTable('refresh', {query:$("form[name='searchForm']").serializeJSON()});
+	}
+	//排除添加功能按钮
+	function clickZtreeId(event,treeId,treeNode){
+		if (treeNode.modelIsMenu==0) {
+			<@ms.notify msg= "不能将功能按钮添加为菜单" type= "danger" />
+			return false;
+		} 
+	} 
+</script>

+ 9 - 0
src/main/webapp/WEB-INF/manager/rf.html

@@ -0,0 +1,9 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<META HTTP-EQUIV="Refresh" CONTENT="120">
+</head>
+<body>
+***><***
+</body>
+</html>

+ 122 - 0
src/main/webapp/WEB-INF/manager/role/role.ftl

@@ -0,0 +1,122 @@
+<@ms.html5>
+	<@ms.nav title="角色设置" back=true>
+		<@ms.saveButton id="save"/>
+		<@ms.resetButton id="reset" value="重置" onclick=" " />
+	</@ms.nav>
+	<@ms.panel>
+		<@ms.form isvalidation=true name="saveRoleFrom" style="width: 55%" action="">
+    		<@ms.text name="roleName" label="角色名称:" title="角色名称"  maxlength="30"  validation={"required":"true", "data-bv-notempty-message":"请填写标题"}/>
+    		<#if flag == false><input type="hidden" name="roleId" value="${role.roleId}"/><input type="hidden" id="oldRoleName" name="oldRoleName" value="${role.roleName}"/></#if>
+    		<!-- 树形模块菜单开始 -->	
+				<#if listModel?has_content>
+					<@ms.tree label="模块列表:" treeId="tree" json="${listModel?default('')}" jsonId="modelId" jsonPid="modelModelId" jsonName="modelTitle"  showIcon="true" expandAll="true" ischeck="true"/>
+				<#else> 
+					<@ms.treeInput  treeId="errorTree"  buttonText="暂无数据"/>
+				</#if>	
+			<!-- 树形模块菜单结束 -->
+		</@ms.form>	
+		<#if !listModel?has_content>
+			<@ms.nodata/>	
+		</#if>
+	</@ms.panel>
+</@ms.html5>
+	
+	<script type="text/javascript">
+		
+			
+		<#if flag == true>
+	     	 $("input[name='roleName']").attr("placeholder","请输入角色名称")       
+		<#else>
+			 $("input[name='roleName']").val("${role.roleName}");
+		</#if>
+			
+		$(function () {
+			//前端验证角色名称是否存在
+			$("input[name='roleName']").blur(function(){
+				var oldRoleName = $("#oldRoleName").length;
+				var roleName = $(this).val();
+				if((oldRoleName != 0 && $("#oldRoleName").val() != roleName) || (oldRoleName == 0)){
+					$.ajax({
+					   type: "post",
+					   dataType: "json",
+					   url:  "${managerPath}/role/judgeRoleNameExist.do",
+					   data: "roleName=" + roleName,
+					   success: function(msg){
+					     	if(msg){
+					     		<@ms.notify msg= "该角色名称已存在,请再次输入" type= "warning" />
+					     		$("input[name='roleName']").val(null);
+					     	} 
+					   }
+					});
+				}
+			});
+			//点击重置按钮取消树形菜单的选中
+			$("#reset").click(function(){
+				 zTreeObjtree.checkAllNodes(false);
+			});
+			
+			
+			//更新角色时勾选出该角色所拥有的模块
+	   		var nodes = zTreeObjtree.transformToArray(zTreeObjtree.getNodes());
+			<#if listSelModel?has_content>
+	   			<#list listSelModel as selModel>
+	   				for(i=0; i<nodes.length; i++){
+						if(nodes[i].modelId==${selModel.modelId}){
+							zTreeObjtree.checkNode(nodes[i], true, false);
+						} 
+					}
+				</#list>
+			</#if> 
+			//声明需要获取的树形菜单的每一个子节点的id
+			var modelId = new Array();
+			
+			//保存按钮点击提交表单
+			$("#save").click(function(){
+				if($("#saveRoleFrom").data('bootstrapValidator').validate().isValid()){
+					$(this).attr("disabled","true");
+					var nodes = zTreeObjtree.getCheckedNodes(true);
+					for(var i=0; i<nodes.length; i++){
+						modelId[i] = nodes[i].modelId;
+					}
+					if(modelId==""||modelId==null||modelId==undefined){
+						<@ms.notify msg= "请选择功能模块!" type= "warning"/>
+						$("#save").removeAttr("disabled");
+						return;
+					}
+					var URL = "${managerPath}/role/<#if flag == true>save<#else>update</#if>.do";
+					$.ajax({
+					   type: "post",
+					   dataType: "json",
+					   url:  URL,
+					   data: $("#saveRoleFrom").serialize() + "&modelId=" + modelId,
+					   beforeSend:function(){
+					   		$("#save").attr("disabled",true);
+					   },
+					   success: function(msg){
+					     	if(msg.result){
+					     		<#if flag == true>
+					     			<@ms.notify msg= "保存成功" type= "success" />
+					     		<#else>
+					     			<@ms.notify msg= "更新成功" type= "warning" />
+					     		</#if>
+					   			location.href = "${managerPath}/role/queryList.do";
+					    	} else {
+					    	    $('.ms-notifications').offset({top:43}).notify({
+					    			type:'warning',
+					    			message: { text:msg.resultMsg }
+					 			}).show();	
+					    	}
+					    	$("#save").removeAttr("disabled");
+					   },error: function(){
+					   	  	<@ms.notify msg= "操作失败" type= "danger" />
+					   		$("#save").removeAttr("disabled");
+					   	  	location.href = "${managerPath}/role/queryList.do";
+					   }
+					});
+				}
+			});
+		});	
+		
+		
+		
+	</script>

+ 177 - 0
src/main/webapp/WEB-INF/manager/role/role_list.ftl

@@ -0,0 +1,177 @@
+<!DOCTYPE html>
+<html lang="en">
+<head>
+	<#include "${managerViewPath}/include/meta.ftl"/>
+	<#include "${managerViewPath}/include/macro.ftl"/>
+<style>
+
+</style>
+</head>
+<body>
+	<@ms.content>
+		<@ms.contentBody>
+			<@ms.contentNav title="角色管理">
+				<@ms.panelNavBtnGroup>
+					<@ms.panelNavBtnAdd  id="totalAdd"/>
+					<@ms.panelNavBtnDel  id="totalDelete"/>
+				</@ms.panelNavBtnGroup>
+			</@ms.contentNav>
+			<@ms.contentPanel>
+					<@ms.table head=['<input type="checkbox" id="allCheck"/>,10','编号,50','角色名称']>
+						<#if listRole?has_content>
+		           			<#list listRole as role>
+					          <tr>
+					            <td>
+						          	<#if role.roleId!=managerRoleId>
+		  								<input type="checkbox" name="ids" value="${role.roleId?c?default(0)}">
+						            </#if>
+					            </td>
+					            <input type="hidden" name="${role.roleId?c?default(0)}" />
+					            <td>${role.roleId?c?default(0)}</td>
+			            		<td><a href="${managerPath}/role/${role.roleId}/edit.do" target="_self">${role.roleName?default("匿名")}</a></td>
+					          </tr>
+				           </#list>
+						<#else>
+		           			<tr>
+					            <td colspan="4" class="text-center">
+					            	<a href="${managerPath}/role/add.do"><@ms.nodata/></a>
+								</td>
+				          	</tr>
+		           		</#if>
+					</@ms.table>	
+					<@showPage page=page/>
+			</@ms.contentPanel>
+		</@ms.contentBody>
+		<!--=================模态框部分开始=================-->
+		<!--删除的模态框开始-->
+		<@ms.modal modalName="delete" title="删除角色">
+			 <@ms.modalBody>
+				确定删除该角色吗?
+		     </@ms.modalBody>
+		     <@ms.modalButton>
+	    		<@ms.button value="返回" id="closeDelete"/>  
+	 			<@ms.button class="btn btn-danger" id="deleteButton" value="删除"/>  
+	 		 </@ms.modalButton>
+		</@ms.modal>
+		<!--删除的模态框结束-->
+		<!--多选删除的模态框开始-->
+		<@ms.modal modalName="deleteAll" title="多选删除角色">
+			 <@ms.modalBody>
+				您确定删除您所勾选的角色么?
+		     </@ms.modalBody>
+		     <@ms.modalButton>
+	    		<@ms.button value="返回" id="closeAllDelete"/>  
+	 			<@ms.button class="btn btn-danger" id="deleteButtonAll" value="删除"/>  
+	 		 </@ms.modalButton>
+		</@ms.modal>
+		<!--多选删除的模态框结束-->
+		<!--=================模态框部分结束=================-->
+	</@ms.content>
+	
+	<script type="text/javascript">	
+		
+		//触发模态框事件或者是模态框中按钮的事件
+		$(function(){
+				var roleId;
+				//删除角色
+				$(".del-btn").on("click",function(){
+					roleId = $(this).attr("data-id");
+					$(".delete").modal();
+				});
+		
+				$("#deleteButton").click(function(){
+					deleteRole(roleId);
+				});
+				
+				$("#closeDelete").click(function(){
+					$(".delete").modal("hide");
+				});
+				
+				$("#totalDelete").click(function(){
+					$(".deleteAll").modal();
+				});
+				$("#closeAllDelete").click(function(){
+					$(".deleteAll").modal("hide");
+				});
+				
+				
+				
+				//全选
+			   	$("#allCheck").on("click",function(){   
+					if(this.checked){   
+						$("input[name='ids']").each(function(){this.checked=true;});
+					}else{   
+						$("input[name='ids']").each(function(){this.checked=false;});   
+					}   
+				}); 
+				
+				//批量删除
+				$("#deleteButtonAll").on("click",function(){
+					batchDelete();
+				});
+		});
+	
+		//删除角色
+		function deleteRole(roleId){
+			//拼接ajax地址
+			var URL="${managerPath}/role/"+roleId+"/delete.do";
+			$("#deleteButtonAll").text("删除中");
+			$("#deleteButtonAll").attr("disabled",true);
+			$(this).request({url:URL,data:"roleId=" + roleId,type:"json",method:"post",func:function(msg) {
+				//回调处理方式
+				if(msg != 0) {
+			    	$("input[name="+roleId+"]").parent().remove();
+		    		<@ms.notify msg= "删除角色成功!" type= "success" />
+		    		if($("tbody tr").length==0 && msg != 1){
+		    			location.href = base+"${baseManager}/role/queryList.do?pageNo="+(msg-1);
+					}else{
+						location.href = base+"${baseManager}/role/queryList.do?pageNo="+msg;
+					}
+		    	} else {
+		    		<@ms.notify msg= "删除失败" type= "danger"/>
+		    	}
+		    	location.reload();
+			}});
+		}
+		
+		//批量删除角色
+		function batchDelete(){
+			var count = 0;
+			var ids = $("input[name='ids']").serialize();
+			$("input[name='ids']").each(function(){
+				if(this.checked==true){
+					count++;
+				}
+			});	
+			if(ids.length != 0) {
+				var URL= "${managerPath}/role/allDelete.do";
+				$("#deleteButtonAll").text("删除中");
+				$("#deleteButtonAll").attr("disabled",true);
+				$(this).request({url:URL,data:ids,type:"json",method:"post",func:function(msg) {
+                	if(msg != 0) {
+			   			<@ms.notify msg= "批量删除成功" type= "success" />
+			   			if($("tbody tr").length == count && msg != 1){
+		    				location.href = base+"${baseManager}/role/queryList.do?pageNo="+(msg-1);
+						}else{
+							location.href = base+"${baseManager}/role/queryList.do?pageNo="+msg;
+						}
+			   		} else {
+			    		<@ms.notify msg= "删除角色失败" type= "danger"/>
+			    		$("#deleteButtonAll").text("删除");
+						$("#deleteButtonAll").attr("disabled",false);
+						$(".deleteAll").modal("hide");
+			    	}
+				}});
+			 } else {
+				<@ms.notify msg= "删除失败,请先选择管理员" type= "warning" />
+				$(".deleteAll").modal("hide");
+			 }
+		}
+		
+		$("#totalAdd").click(function(){
+			location.href = "${managerPath}/role/add.do"
+		});
+	</script>
+	
+</body>
+</html>

+ 41 - 0
src/main/webapp/WEB-INF/manager/template/template_edit_file.ftl

@@ -0,0 +1,41 @@
+	<@ms.html5>
+		<@ms.nav title="编辑模版文件" back=true>
+			<@ms.savebutton  id="update" value="修改"/>
+		</@ms.nav>
+		<@ms.panel>		
+			<@ms.form name="form"  id="editFileForm">
+				<!--文件名称-->
+				<@ms.text label="文件名称" value="${name?default('')}" readonly="readonly"/>
+				<@ms.hidden value="${fileName}" name="fileName" />
+				<!--文件内容-->
+				<@ms.textarea name="fileContent" label="文件内容"   wrap="Soft" rows="21"  size="" value="${fileContent}"/>
+				<@ms.hidden id="fileName" value="${fileName}" />
+				<@ms.hidden id="fileNamePrefix" value="${fileNamePrefix}" />		
+    		</@ms.form>
+		</@ms.panel>
+	</@ms.html5> 
+	<script type="text/javascript">		
+		$(function () {	
+			//修改文件
+			$("#update").on("click",function(){
+				var formData = $("#editFileForm").serialize();
+				var URL=base+"${baseManager}/template/writeFileContent.do"
+				var oldFileName = $("#fileName").val();
+				var fileNamePrefix = $("#fileNamePrefix").val();
+				$(this).text("修改中");
+				$(this).attr("disabled",true);
+				$(this).request({url:URL,type:"json",method:"post",data:formData+"&oldFileName="+oldFileName+"&fileNamePrefix="+fileNamePrefix,func:function(msg) {
+					//回调处理方式
+					if(msg.result){
+			    		<@ms.notify msg= "修改模版文件成功" type= "success" />
+			    	} else {
+			    		<@ms.notify msg= "修改模版文件失败" type= "warning" />
+			   	  	}
+			   	  	var fileNameUrl = $(".fileNamePrefix").val();
+			   	  	$("#update").text("修改");
+					$("#update").attr("disabled",false);
+				}});
+			});
+		});
+	</script>
+

+ 152 - 0
src/main/webapp/WEB-INF/manager/template/template_file_list.ftl

@@ -0,0 +1,152 @@
+<@ms.html5>
+	<@ms.nav title="文件列表" back=true></@ms.nav>
+	<@ms.panel>
+			<@shiro.hasPermission name="template:upload"><@ms.uploadFile uploadFloderPath="${uploadFileUrl}" path="" inputName="file" size="20" filetype="*.htm;*.html;*.jpg;*.gif;*.png;*.css;*.js;*.ico;*.swf;*.less" msg="建议上传5M以下htm/html/css/js/jpg/gif/png/swf文件"  maxSize="5" callBack="refresh" isRename="false"/></@shiro.hasPermission> 
+			<@ms.table head=['<th class="text-center">图标</th>','模板名称',"<th style='width:20%;text-align:center'>类型</th>","<th class='text-center' style='width:10%;'>操作</th>"]>
+				<#if fileNameList?has_content>
+	           		<#list fileNameList as fileName>
+			        	<tr> 
+				            <td style="width:10%" class="pic text-center"></td>
+				            <td style="width:35%" class="name">${fileName?replace("\\","/")}</td>
+				            <td class="text-center type"></td>
+				            <td style="width:10%;text-align:center">	
+				            	<@shiro.hasPermission name="template:del">	        
+					        	<a class="btn btn-xs tooltips deleteIcon" data-toggle="tooltip" data-title="${fileName?replace("\\","/")}" data-original-title="删除">
+			                        <i class="glyphicon glyphicon-trash" style="color:#428BCA"></i>
+			                    </a>
+					    		</@shiro.hasPermission> 
+		                    	<@shiro.hasPermission name="template:update">	        
+					        	 <a class="btn btn-xs tooltips editFileBtn" data-toggle="tooltip" data-title="templets/${websiteId}/${fileName?replace("\\","/")}" data-original-title="编辑">
+		                     		<i class="glyphicon glyphicon-pencil" style="color:#428BCA"></i>
+		                    	</a>
+					    		</@shiro.hasPermission> 
+			                   			                    	
+							</td>
+				        </tr>
+		        	</#list>	  
+	        	<#else>         	
+	           		<tr>
+			            <td colspan="5" class="text-left">
+			            	<@ms.nodata/>
+						</td>
+		          	</tr>
+				</#if>
+			</@ms.table>
+	</@ms.panel>
+</@ms.html5>	
+	<!--=================模态框部分开始=================-->
+	<@ms.modal modalName="delete" title="删除评论">
+		 <@ms.modalBody>
+			确定删除该模板吗?
+	     </@ms.modalBody>
+	     <@ms.modalButton>
+    		<@ms.button value="返回" id="closeDelete"/>  
+ 			<@ms.button class="btn btn-danger" id="deleteButton" value="删除"/>  
+ 		 </@ms.modalButton>
+	</@ms.modal>
+	<!--=================模态框部分结束=================-->
+	
+	<script type="text/javascript">
+		var fileName;
+		var isSuccess = false;
+		var fileUrl;
+		var skinFolderName = "${uploadFileUrl?replace("\\","/")}";
+		
+	   var interval;  
+       function refresh(e){
+        <@ms.notify msg= "上传成功!" type= "success" />
+       	location.reload();
+	   }
+       function chat() {  
+       	  	  var temp = $(".deleteIcon").attr("data-title");
+       	  	  if(temp == null || temp == ""){
+       	  	  	temp = $(".editFileBtn").attr("data-title");
+       	  	  }
+       	  	  if(temp != null && temp != ""){
+       	  	  	temp = temp.substring(0,temp.lastIndexOf("/"));
+       	  	  } else {
+       	  	  	temp = skinFolderName.substring(skinFolderName.indexOf("/"));
+       	  	  	temp = temp.substring(temp.indexOf("/"));
+       	  	  }
+       	  	  //若上传的为zip压缩文件则直接解压
+       	  	  if($("#file").val().substring($("#file").val().lastIndexOf(".")+1) == "zip"){
+	       	  	  $.ajax({
+					   type: "post",
+					   url: base+"${baseManager}/template/unZip.do",
+					   data: "fileUrl=" + fileUrl,
+					   success: function(msg){ 
+					     	location.href=base+"${baseManager}/template/showChildFileAndFolder.do?skinFolderName="+temp;
+					     	fileName = temp + fileUrl.substring(fileUrl.lastIndexOf("/"));
+					     	//deleteTempletsFile();
+					     	$("#deleteButton").click();
+					   }
+				  });
+			  } else {
+	     	 	 location.href=base+"${baseManager}/template/showChildFileAndFolder.do?skinFolderName="+temp;
+	     	  }
+       }
+		
+		//删除模版文件
+		$("#deleteButton").click(function(){
+			
+			var URL = base+"${baseManager}/template/deleteTemplateFile.do";
+			var DATA = "fileName=" + fileName;
+			$(this).request({url:URL,data:DATA,type:"json",method:"post",func:function(msg) {
+					if(msg != 0) {
+						<@ms.notify msg= "删除模版文件成功" type= "success" />
+						location.reload();
+			    	} else {
+			    		<@ms.notify msg= "删除模版文件失败" type= "warning" />
+			   	  	}
+			}});
+			
+		});
+		
+		$(function () {	
+			//加载页面时启动定时器  
+	        
+	        //若为文件夹,则左侧显示文件夹图标;若为文件,则左侧显示文件图标,且稍向右偏移
+	       $(".name").each(function(i){
+	        	var temp = $(this).html();
+	        	if(temp.indexOf(".") >= 0){
+	        		$(this).parent().find(".pic").prepend("<span class='glyphicon glyphicon-file'></span>")
+	        		$(this).parent().find(".type").prepend("文件")
+	        	} else {
+	        		$(this).parent().find(".pic").prepend("<span class='glyphicon glyphicon-folder-close'></span>")
+	        		$(this).parent().find(".type").prepend("文件夹")
+	        		$(this).parent().find(".editFileBtn").attr("data-original-title","打开文件夹");
+	        		$(this).parent().find(".editFileBtn").find(".glyphicon").removeClass("glyphicon-pencil");
+	        		$(this).parent().find(".editFileBtn").find(".glyphicon").addClass("glyphicon-log-in");	        		
+	        		$(this).parent().find(".deleteIcon").remove();
+	        	}
+	        	var suffix = temp.substring(temp.lastIndexOf(".")+1);
+				if(suffix == "jpg" || suffix == "gif" || suffix == "png"){
+					$(this).parent().find(".type").prepend("图像")
+					$(this).parent().find(".editFileBtn").remove();
+				}
+	        });
+
+	        
+	        //编辑模版文件,若为文件夹,则跳至显示子文件和子文件夹action;若为文件,则直接读取代码内容,且跳至模版文件修改页面
+			$("table").delegate(".editFileBtn","click",function(){
+				fileName = $(this).attr("data-title");
+		        if(fileName.indexOf(".") >= 0){
+		        	location.href = base+"${baseManager}/template/readFileContent.do?fileName="+encodeURIComponent(fileName);
+		        } else {
+					location.href=base+"${baseManager}/template/showChildFileAndFolder.do?skinFolderName="+encodeURIComponent(fileName);
+				}
+			});
+	        
+			//点击返回按钮,关闭模态框
+	       $("#closeDelete").click(function() {
+	       		$(".delete").modal("hide");
+	       })
+			
+			//删除模版
+			$("table").delegate(".deleteIcon","click",function(){
+				fileName = $(this).attr("data-title");
+				$(".delete").modal();
+			});	
+		});
+	</script>
+	

+ 93 - 0
src/main/webapp/WEB-INF/manager/template/template_list.ftl

@@ -0,0 +1,93 @@
+<@ms.html5>
+	<@ms.nav title="模板管理"></@ms.nav>
+	<@ms.panel>
+		<@shiro.hasPermission name="template:upload"><@ms.uploadFile path="" uploadFloderPath="templets/${websiteId}/" inputName="websiteStyle" size="10" filetype="*.zip" msg="建议上传30M以下的zip文件,模版名称不能使用中文,zip的压缩方式为:存储"  maxSize="30" callBack="setUrl" isRename="false"/></@shiro.hasPermission> 
+		<@ms.table head=['<th class="text-center">图标</th>','模板名称',"<th style='width:20%;text-align:center'>类型</th>","<th class='text-center' style='width:10%;'>操作</th>"]>
+			<#if folderNameList?has_content>
+           		<#list folderNameList as folderName>
+		        	<tr> 
+			            <td style="width:7%" class="pic text-center"><span class='glyphicon glyphicon-folder-close'></span></td>
+			            <td style="width:35%">${folderName}</td>
+			            <td class="text-center">文件夹</td>
+			            <td style="width:10%;text-align:center">
+			            	<@shiro.hasPermission name="template:del">	
+			            	<a class="btn btn-xs tooltips deleteIcon" data-toggle="tooltip" data-title="${folderName}" data-original-title="删除">
+		                        <i class="glyphicon glyphicon-trash" style="color:#428BCA"></i>
+		                    </a>	
+		                    </@shiro.hasPermission>	
+		                    <@shiro.hasPermission name="template:update">	      
+	                    	<a  class="btn btn-xs tooltips" href="${managerPath}/template/showChildFileAndFolder.do?skinFolderName=templets/${websiteId}/${folderName}" data-toggle="tooltip" target="_self" data-original-title="打开文件夹" >
+	                     		<i class="glyphicon glyphicon-log-in" style="color:#428BCA"></i>
+	                    	</a>	
+	                    	</@shiro.hasPermission>		                    	
+						</td>
+			        </tr>
+	        	</#list>
+           	<#else>		           	
+	           	<tr>
+		            <td colspan="5" class="text-left">
+		            	<@ms.nodata/>
+					</td>
+	          	</tr>
+          	</#if>
+		</@ms.table>		
+	</@ms.panel>
+</@ms.html5>
+	<!--=================模态框部分开始=================-->
+	<@ms.modal modalName="delete" title="删除模板">
+		 <@ms.modalBody>
+			确定删除该模板吗?
+	     </@ms.modalBody>
+	     <@ms.modalButton>
+    		<@ms.button value="返回" id="closeDelete"/>  
+ 			<@ms.button class="btn btn-danger" id="deleteButton" value="删除"/>  
+ 		 </@ms.modalButton>
+	</@ms.modal>
+	<!--=================模态框部分结束=================-->
+	
+	<script type="text/javascript">
+	   var name;
+	   var fileUrl;
+       function setUrl(e){
+       		fileUrl = e;
+           	 $.ajax({
+				   type: "post",
+				   url: base+"${baseManager}/template/unZip.do",
+				   data: "fileUrl=" + fileUrl,
+				   success: function(msg){ 
+				   		<@ms.notify msg= "模版上传成功!" type= "success" />
+				     	location.href=base+"${baseManager}/template/queryTemplateSkin.do"
+				   }
+			  });            	   
+	   	} 
+       
+       	//点击返回按钮,关闭模态框
+       	$("#closeDelete").click(function() {
+       		$(".delete").modal("hide");
+       	})
+       
+       	//点击删除按钮进行删除模版
+		$("#deleteButton").click(function(){
+			var URL = base+"${baseManager}/template/delete.do";
+			var DATA = "fileName=" + name;
+			$(this).attr("disabled",true);
+			$(this).text("删除中");
+			$(this).request({url:URL,data:DATA,type:"json",method:"post",func:function(msg) {
+				if(msg){
+			      	<@ms.notify msg= "删除模版成功" type= "success" />
+			      	location.href=base+"${baseManager}/template/queryTemplateSkin.do"
+			      } else {
+			      	<@ms.notify msg= "删除模版失败" type= "warning" />
+			      	$("#deleteButton").attr("disabled",false);
+					$("#deleteButton").text("删除");
+			      }
+			}});
+			
+		});
+		
+       	//删除模版
+		$("table").delegate(".deleteIcon","click",function(){
+			name = $(this).attr("data-title");
+			$(".delete").modal();
+		});	   
+	</script>

+ 90 - 0
src/main/webapp/WEB-INF/web.xml

@@ -0,0 +1,90 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+	xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
+	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
+	id="WebApp_ID" version="3.0">
+	<display-name>mybatis</display-name>
+	<context-param>
+		<param-name>contextConfigLocation</param-name>
+		<param-value>classpath:spring-mvc.xml,classpath:spring-mybatis.xml,classpath:spring-shiro.xml</param-value>
+	</context-param>
+	<filter>
+		<description>字符集过滤器</description>
+		<filter-name>encodingFilter</filter-name>
+		<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
+		<init-param>
+			<description>字符集编码</description>
+			<param-name>encoding</param-name>
+			<param-value>UTF-8</param-value>
+		</init-param>
+	</filter>
+	<filter-mapping>
+		<filter-name>encodingFilter</filter-name>
+		<url-pattern>/*</url-pattern>
+	</filter-mapping>
+	<listener>
+		<description>spring监听器</description>
+		<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
+	</listener>
+	<!-- 防止spring内存溢出监听器 -->
+	<listener>
+		<listener-class>org.springframework.web.util.IntrospectorCleanupListener</listener-class>
+	</listener>
+	<!-- spring mvc servlet -->
+	<servlet>
+		<description>spring mvc servlet</description>
+		<servlet-name>springMvc</servlet-name>
+		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
+		<init-param>
+			<description>spring mvc 配置文件</description>
+			<param-name>contextConfigLocation</param-name>
+			<param-value>classpath:spring-mvc.xml</param-value>
+		</init-param>
+		<load-on-startup>1</load-on-startup>
+	</servlet>
+	<servlet-mapping>
+		<servlet-name>springMvc</servlet-name>
+		<url-pattern>*.do</url-pattern>
+	</servlet-mapping>
+	<!-- Apache Shiro -->
+	<filter>
+		<filter-name>shiroFilter</filter-name>
+		<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
+		<init-param>
+			<param-name>targetFilterLifecycle</param-name>
+			<param-value>true</param-value>
+		</init-param>
+	</filter>
+	<filter-mapping>
+		<filter-name>shiroFilter</filter-name>
+		<url-pattern>/*</url-pattern>
+	</filter-mapping>
+	<welcome-file-list>
+		<welcome-file>index</welcome-file>
+		<welcome-file>default.html</welcome-file>
+		<welcome-file>default.htm</welcome-file>
+		<welcome-file>index.htm</welcome-file>
+		<welcome-file>index.html</welcome-file>
+		<welcome-file>login.do</welcome-file>
+	</welcome-file-list>
+	<!-- 配置session超时时间,单位分钟 -->
+	<error-page>
+		<error-code>404</error-code>
+		<location>/error/404.do</location>
+	</error-page>
+	<error-page>
+		<error-code>500</error-code>
+		<location>/error/500.do</location>
+	</error-page>
+	<error-page>
+		<error-code>405</error-code>
+		<location>/error/405.do</location>
+	</error-page>
+	<error-page>
+		<error-code>504</error-code>
+		<location>/error/504.do</location>
+	</error-page>
+	<session-config>
+		<session-timeout>15</session-timeout>
+	</session-config>
+</web-app>