开发文档

. 系统架构概述
本系统核心架构为 FreeMarker+hibernate+Spirng 的 mvc 分层架构。 1.1 分层架构模型
img 1.2 数据流转模型 (前端)
img . 框架目录介绍
.1Cms 包介绍
具体包名 相关功能描述
com\mi\cms 常量包
com\mi\cms\action 通用 action 抽象类包
com\mi\cms\action\directive cms 自定义标签包, 公用部分继承于 abs 包
com\mi\cms\action\directive\abs 公用部分自定义标签的抽象包
com\mi\cms\action\front 前台 action 包
com\mi\cms\action\member 会员中心包
com\mi\cms\api
com\mi\cms\api\admin\assist Api 辅助包
com\mi\cms\api\admin\main Api 主要 controller 包
com\mi\cms\api\front API 前端包
com\mi\cms\api\member Api 会员中心包
com\mi\cms\dao\assist 辅助 dao 的接口层
com\mi\cms\dao\assist\impl 辅助 dao 的接口实现层
com\mi\cms\dao\main 核心的 dao 接口层
com\mi\cms\dao\main\impl 核心的 dao 接口实现层
com\mi\cms\entity\assist cms 辅助实体类子类
com\mi\cms\entity\assist\base cms 辅助实体类基类
com\mi\cms\entity\assist\hbm hibernate 辅助实体类的关系映射文件
com\mi\cms\entity\back cms 备份实体类子类
com\mi\cms\entity\back\base cms 备份实体类基类
com\mi\cms\entity\back\hbm hibernate 备份实体类类的关系映射文件
com\mi\cms\entity\main cms 核心实体类子类
com\mi\cms\entity\main\base cms 核心实体类基类
com\mi\cms\entity\main\hbm hibernate 核心实体类的关系映射文件
com\mi\cms\lucene 搜索引擎封装包
com\mi\cms\manager\assist 辅助的 service 接口层
com\mi\cms\manager\assist\impl 辅助的 service 接口实现层
com\mi\cms\manager\main 核心的 service 接口层
com\mi\cms\manager\main\impl 核心的 service 接口实现层
com\mi\cms\service service 封装层
com\mi\cms\staticpage 静态页的封装包包
com\mi\cms\staticpage\exception 静态页的异常处理类型
com\mi\cms\statistic 内容发布统计包
com\mi\cms\statistic\workload 流量统计包
com\mi\cms\web 拦截器包
com\mi\cms\task 任务包
com\mi\cms\task\job 具体任务包
.2Common 包介绍
具体包名 相关功能描述
com\mi\common\captcha 验证码封装包
com\mi\common\dic 分词
com\mi\common\email 邮件包
com\mi\common\fck fck 编辑器封装包
com\mi\common\file 文件操作封装包
com\mi\common\hibernate4 hibeinate 封装包
com\mi\common\image 图片的封装包
com\mi\common\ipseek ip 地址库封装
com\mi\common\lucene 收索引擎的基础包
com\mi\common\office 文档转换相关工具类
com\mi\common\page jeecms 分页封装包
com\mi\common\security 安全认证相关的包
com\mi\common\security\annotation
com\mi\common\security\encoder
com\mi\common\security\rememberme
com\mi\common\security\userdetails
com\mi\common\upload 上传封装包
com\mi\common\util 工具包
com\mi\common\web 常量包
com\mi\common\web\freemarker freemarker 视图封装包
com\mi\common\web\session session 包
com\mi\common\web\session\cache session 缓存包
com\mi\common\web\springmvc springMVC 的简单封装
com\mi\cms\manager\main 核心的 service 接口层
com\mi\cms\manager\main\impl 核心的 service 接口实现层
com\mi\cms\service service 封装层
com\mi\cms\staticpage 静态页的封装包
com\mi\cms\staticpage\exception 静态页的异常处理类型
com\mi\cms\statistic 流量统计包
com\mi\cms\statistic\workload 内容发布统计包
com\mi\cms\web 拦截器包
.3Core 包介绍
具体包名 相关功能描述
com\mi\core 一般常量和异常处理
com\mi\core\action\front 核心前台的 action
com\mi\core\dao 核心 dao 的接口
com\mi\core\dao\impl 核心 dao 的接口实现类
com\mi\core\entity 登录认证和核心用户的实体子类
com\mi\core\entity\base 登录认证和核心用户的实体基类
com\mi\core\entity\hbm 相关的 hibernate 的映射文件
com\mi\core\manager 核心的 service 接口层
com\mi\core\manager\impl 核心的 service 接口实现层
com\mi\core\security 认证登录、退出相关
com\mi\core\tpl 模板接口和相关 service 层
com\mi\core\web 定义内容显示的接口,工具类,和错误页面的指定
com\mi\core\web\util uri 帮助类
2.4 页面资源介绍
具体包名 相关功能描述
WebContent
r 前台资源文件,如 css、img、js 等
jeeadmin 后台页面和资源文件(由 vue 源码工程打包)
thirdparty 第三方插件(ckeditor 编辑器、swf 上传、My97DatePicker 日期选择)
u 默认的用户上传资源目录
WebContent/WEB-INF
cache 缓存文件
common 通用页面
config 核心的配置文件,如果 action,service,manager,dao,bean 等 plug 为插件配置文件目录
directive 标签向导模板文件
error 错误页面
ftl 自定义的 freemark 宏文件
ispeek ip 地址库
languages 国际化配置
jeecms/admin 后台
jeecms/front 前台
jeecms/tpl 模版
jeecore/admin 公用国际化
jeecms/adminapi API 接口消息国际化
plug 插件国际化配置
lucene lucene 文件夹
t/cms 前台模板页面
t/cms/www 站点资源目录
t/cms/www/default 站点方案
. 开发流程指导
3.1 展现层
3.1.1Freemarer 介绍
FreeMarker 是一个用 Java 语言编写的模板引擎,它基于模板来生成文本输出。FreeMarker 与 Web 容器无关,即在 Web 运行时,它并不知道 Servlet 或 HTTP。它不仅可以用作表现层的实现技术,而且还可以用于生成 XML,JSP 或 Java 等。 img 3.1. 后台页面
后台管理页面全部采用 vue 工程开发,参考 . 后台管理页面 vue 工程开发](#_4. 后台管理页面 vue 工程开发) 3.1. 前台模版页面
img 在 default 目录相应的文件夹添加 html,在 html 文件中引入 freemark 机制控制 control 层传输对象的显示。 3.2 控制层
3.2.1SpringMVC 简介
Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 FreeMarker、JavaServer Pages(JSP)技术、Velocity、Tiles、iText 和 POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。 3.2. 控制层实现
3.2.2.1 配置 SpringMVC 支持
Web.xml 配置 Spring 后台核心调度器 <servlet> <servlet-name>JeeCmsAdminApi</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>dispatchOptionsRequest</param-name> <param-value>true</param-value> </init-param> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/config/jeecms-servlet-admin-api.xml </param-value> </init-param> <load-on-startup></load-on-startup> </servlet>
Web.xml 配置 Spring 后台核心调度器匹配路径 <servlet-mapping> <servlet-name>JeeCmsAdminApi</servlet-name> <url-pattern>/api/admin/*</url-pattern> </servlet-mapping>
Web.xml 配置 Spring 前台核心调度器 <servlet> <servlet-name>JeeCmsFront</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> <param-name>contextConfigLocation</param-name> <param-value> /WEB-INF/config/jeecms-servlet-front.xml /WEB-INF/config/plug/*/-servlet-front-action.xml </param-value> </init-param> <load-on-startup></load-on-startup> </servlet>
Web.xml 配置 Spring 前台核心调度器匹配路径 <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.jhtml</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.jspx</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.jsp</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>JeeCmsFront</servlet-name> <url-pattern>*.htm</url-pattern> </servlet-mapping>
3.2..2Spring Controller
com.mi.cms.api.admin.main核心管理模块Controller
com.mi.cms.api.admin.assist辅助管理模块Controller
@Controller public class CmsLogApiAct {
@RequestMapping("/log/operating_list") publicvoid list(String queryUsername, String queryTitle,Integer category, StringqueryIp, Integer pageNo, Integer pageSize,HttpServletRequest request, HttpServletResponseresponse){ Stringbody = "\"\""; Stringmessage = Constants.API_MESSAGE_SUCCESS; Stringcode = ResponseCode.API_CODE_CALL_SUCCESS; if(pageNo==null) { pageNo=; } if(pageSize==null) { pageSize=; } if(category==null) { category=CmsLog.OPERATING; } Paginationpage =null; CmsSitesite = CmsUtils.getSite(request); WebErrorserrors = WebErrors.create(request); if(category.equals(CmsLog.OPERATING)) { page= manager.getPage(CmsLog.OPERATING, site.getId(),queryUsername, queryTitle,queryIp, pageNo, pageSize); }elseif (category.equals(CmsLog.LOGIN_SUCCESS)) { page= manager.getPage(CmsLog.LOGIN_SUCCESS, null,queryUsername, queryTitle,queryIp, pageNo, pageSize); }elseif (category.equals(CmsLog.LOGIN_FAILURE)) { page= manager.getPage(CmsLog.LOGIN_FAILURE, null,null, queryTitle, queryIp, pageNo,pageSize); }else{ errors.addErrorString(Constants.API_MESSAGE_PARAM_ERROR); } if(errors.hasErrors()) { message= errors.getErrors().get(); code= ResponseCode.API_CODE_PARAM_ERROR; }else{ inttotalCount = page.getTotalCount(); List<CmsLog>list = (List<CmsLog>) page.getList(); JSONArrayjsonArray = new JSONArray(); if(list!=null&&list.size()>) { for(int i = ; i < list.size(); i++) { jsonArray.put(i,list.get(i).convertToJson()); } } body= jsonArray.toString()+",\"totalCount\":"+totalCount; } ApiResponseapiResponse = new ApiResponse(request, body, message, code); ResponseUtils.renderApiJson(response,request, apiResponse); } //自动装配对象
@Autowired
privateCmsLogMng manager;
}
//统一返回JSON对象 ApiResponse apiResponse = newApiResponse(request, body, message, code);
ResponseUtils.renderApiJson(response,request, apiResponse);
另外一个例子 // 需要签名认证(建议保存、修改、删除类方法添加签名注解) @SignValidate @RequestMapping("/group/save") public void save(CmsGroup bean,StringviewChannelIds,String contriChannelIds, HttpServletRequestrequest,HttpServletResponse response){ Stringbody = "\"\""; Stringmessage = Constants.API_MESSAGE_PARAM_REQUIRED; Stringcode = ResponseCode.API_CODE_PARAM_REQUIRED; WebErrorserrors = WebErrors.create(request); //通用认证必填参数 errors= ApiValidate.validateRequiredParams(request, errors, bean.getName(),bean.getPriority(), bean.getAllowMaxFile(),bean.getAllowPerDay(),bean.getAllowFileSize(),bean.getAllowFileTotal()); if(!errors.hasErrors()) { Integer[]viewChannel = StrUtils.getInts(viewChannelIds); Integer[]contriChannel = StrUtils.getInts(contriChannelIds); errors= validateArrayLength(errors, viewChannel, contriChannel); if(errors.hasErrors()) { message= errors.getErrors().get(); code= ResponseCode.API_CODE_PARAM_ERROR; }else{ bean.init(); bean= manager.save(bean, viewChannel, contriChannel); log.info("saveCmsGroup id={}", bean.getId()); cmsLogMng.operating(request,"cmsGroup.log.save", "id=" + bean.getId() +";name=" + bean.getName()); body="{\"id\":"+"\""+bean.getId()+"\"}"; message =Constants.API_MESSAGE_SUCCESS; code= ResponseCode.API_CODE_CALL_SUCCESS; } } ApiResponseapiResponse = new ApiResponse(request, body, message, code); ResponseUtils.renderApiJson(response,request, apiResponse); }
3.2..3SpringMVC 扩展配置
jeecms-servlet-admin-api.xml后台Spring国际化、拦截器、SpringMVC视图解析器配置 jeecms-servlet-front.xml前台Spring国际化、拦截器、SpringMVC视图解析器配置 jeecms-servlet-admin-api-action.xml 后台action配置文件 jeecms-servlet-front-action.xml前台action配置文件 配置 action bean <bean id="ftpApiAct"class="com.mi.cms.api.admin.main.FtpApiAct"></bean>
3.3 逻辑层
3.3. 类存放包介绍
com.mi.cms.manager.main.impl核心service层 com.mi.cms.manager.assist.impl 辅助service层 com.mi.cms.service 采集、栏目、内容、流量公用service包 3.3.2service 类代码编写样例
@Service @Transactional public class CmsConfigMngImplimplements CmsConfigMng { @Transactional(readOnly= true) publicCmsConfig get() {
CmsConfigentity = dao.findById();
returnentity;
}
publicvoid updateCountCopyTime(Date d) { dao.findById().setCountCopyTime(d); } publicvoid updateCountClearTime(Date d) { dao.findById().setCountClearTime(d); } publicCmsConfig update(CmsConfig bean) { Updater<CmsConfig>updater = new Updater<CmsConfig>(bean); CmsConfigentity = dao.updateByUpdater(updater); entity.blankToNull(); returnentity; } publicMarkConfig updateMarkConfig(MarkConfig mark) { get().setMarkConfig(mark); returnmark; } publicvoid updateMemberConfig(MemberConfig memberConfig) { get().getAttr().putAll(memberConfig.getAttr()); }
privateCmsConfigDao dao; //自动装配dao层 @Autowired publicvoid setDao(CmsConfigDao dao) { this.dao= dao;
}
}
需要@Service@Transactional 注解标志该类为业务逻辑层,所有的 service 层均采用接口开发模式 @Transactional(readOnly = true)只读事物 3.3. 配置 service bean
jeecms-context.xml 中增加 servicebean 的配置 <bean id="cmsConfigMng"class="com.mi.cms.manager.main.impl.CmsConfigMngImpl"/>
3.4 持久层
3.4.1Hibernate4 简介
Hibernate 是一个开放源代码的对象关系映射框架,它对 JDBC 进行了非常轻量级的对象封装,使得 Java 程序员可以随心所欲的使用对象编程思维来操作数据库。 Hibernate 可以应用在任何使用 JDBC 的场合,既可以在 Java 的客户端程序使用,也可以在 Servlet/JSP 的 Web 应用中使用 3.4.2DAO 类代码编写样例
持久层采用 Hibernate4,缓存采用 Ehcache com.mi.cms.dao.main.impl 核心DAO层 com.mi.cms.dao.assist.impl 辅助DAO层 @Repository public class CmsConfigDaoImplextends HibernateBaseDao<CmsConfig, Integer> implementsCmsConfigDao { publicCmsConfig findById(Integer id) { CmsConfigentity = get(id); returnentity; } //重写getEntityClass方法 @Override protectedClass<CmsConfig> getEntityClass() {
returnCmsConfig.class;
}
}
@Repository 注解标志该类是 DAO 层组件,可以选择继承 HibernateBaseDao 基础类,需要实现接口。 3.4. 配置 DAO bean
jeecms-context.xml 中增加 dao bean 的配置 <beanid="cmsConfigDao"class="com.mi.cms.dao.main.impl.CmsConfigDaoImpl"/>
3.4.4POJO
com.mi.cms.entity.main核心功能包的pojo com.mi.cms.entity.main.base 辅助功能包的pojo基础类 com.mi.cms.entity.main.hbm 辅助功能包Hibernate实体映射文件 com.mi.cms.entity.assist辅助功能包的pojo com.mi.cms.entity.assist.base辅助功能包的pojo基础类 com.mi.cms.entity.assist.hbm辅助功能包Hibernate实体映射文件 3.5 自定义标签
3.5. 定义标签类
​ 自定义标签类所属包 com.mi.cms.action.directive ​ 标签类需要实现 Freemarker 内置接口 TemplateDirectiveModel ​ 获取标签参数可以用 DirectiveUtils 工具类获取 public classChannelDirective implements TemplateDirectiveModel { /** * 输入参数,栏目ID。 */ publicstatic final String PARAM_ID = "id"; /** * 输入参数,栏目路径。 */ public static final String PARAM_PATH ="path"; /** * 输入参数,站点ID。存在时,获取该站点栏目,不存在时获取当前站点栏目。 */ publicstatic final String PARAM_SITE_ID = "siteId"; @SuppressWarnings("unchecked") publicvoid execute(Environment env, Map params, TemplateModel[] loopVars, TemplateDirectiveBodybody) throws TemplateException, IOException { CmsSitesite = FrontUtils.getSite(env); //getrequired params from directive Integerid = DirectiveUtils.getInt(PARAM_ID, params); Channelchannel; if(id != null) { channel= channelMng.findById(id); }else { Stringpath = DirectiveUtils.getString(PARAM_PATH, params); if(StringUtils.isBlank(path)) { //如果path不存在,那么id必须存在。 thrownew ParamsRequiredException(PARAM_ID); } IntegersiteId = DirectiveUtils.getInt(PARAM_SITE_ID, params); if(siteId == null) { siteId= site.getId(); } channel= channelMng.findByPathForTag(path, siteId); } Map<String,TemplateModel> paramWrap = new HashMap<String, TemplateModel>( params); //putresult to view paramWrap.put(OUT_BEAN,DEFAULT_WRAPPER.wrap(channel)); Map<String,TemplateModel> origMap = DirectiveUtils .addParamsToVariable(env,paramWrap); //render result to response body.render(env.getOut()); DirectiveUtils.removeParamsFromVariable(env,paramWrap, origMap); } //装配所需service @Autowired privateChannelMng channelMng; }
3.5. 配置标签
.jeecms-context.xml 配置 Spring bean <bean id="cms_content_list"class="com.mi.cms.action.directive.ContentListDirective"/>
.jeecms-context 文件中 jeecms.properties 文件中引入自定义标签 bean directive.cms_channel_list=cms_channel_list 3.5. 标签应用
[@cms_content_list count=''titLen='' orderBy='' channelOption='' channelId=''] [#list tag_list as a] <li><ahref="${a.url}" title="${a.title}"target="_blank">[@text_cut s=a.title len=titLenappend=append/]</a></li> [/#list] [/@cms_content_list]
cms_content_list 标签名称 count、titLen、orderBy、channelOption、channelId 标签参数 tag_list 标签结果 a 循环变量 ${a.url} 输出 a 对象的 url 属性 . 后台管理页面 vue 工程开发
4.1 环境准备
Vue 简介 Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用。该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程。只需几分钟即可创建并启动一个带热重载、保存时静态检查以及可用于生产环境的构建配置的项目: 推荐查阅官方文档 https://cn.vuejs.org/v2/guide/installation.html 、安装必要环境 Node.js 下载地址 http://nodejs.cn/. 安装最新版本 Npm(最新版 node 自带) 、开发环境安装和启动 使用命令行执行以下命令 执行安装 node 包 cd 项目路径(vue 工程路径) npminstall (推荐使用 cnpm install,http://npm.taobao.org/ 加快依赖下载速度) npmrun dev; 4.2 工程包介绍
目录结构: img img 一级目录说明: build webpack 打包配置文件 config 全局配置文件 api 域名 appid 配置 node_modules:node依赖文件夹 src项目源代码
static 全局资源文件夹(css images js)
index.html 入口文件 二级目录说明: \. config/dev.env.js 开发环境配置文件,修改源代码时会读取此文件中的配置项 config/prod.env.js 生产环境配置文件,打包完成时会读取使用此文件中的配置项 img img 以上图(config/dev.env.js)为例,定义了 个属性 NODE_ENV : 标识当前环境 (当前环境为开发者环境) BaseUrl:项目的 api 资源 地址 Appid:项目的 appid aesKey:项目的 aesKey (加密用) ivKey:项目的 ivKey (加密用) appKey:项目的 appKey (加密用) 配置好相应的属性 即可在任意 js 文件中使用该变量,调用方式为 process.env.xxx process.env.baseUrl img . src/api api 以及全局拦截器 src/assets 源码中的资源文件(JS,CSS,iamges) src/components 自定义组件目录 src/directive 自定义指令目录 src/mixins 自定义混合目录 src/plugs 第三方插件目录(jquery 相关的插件可存放在此) src/router 路由,角色目录 src/store vuex 定义目录 src/untils 全局方法,签名,加密函数存放目录 src/views 功能页面目录 src/APP.vue 根组件(无需修改) src/config.js 项目路径配置文件 src/main.js 页面入口文件 src/permissions.js 全局路由钩子配置文件 4.3 新增功能模块讲解
4.3. 新增页面
后台管理页面采用单页组件化开发 功能模块统一存放在 src/views 目录下,推荐以导航树层级管理页面,例如下图 img 功能某块统一以单文件组件的形式构造,命名以. vue 结尾,单文件组件开发详情查看 https://cn.vuejs.org/v2/guide/single-file-components.html . 页面基础样式框架基于 element-ui2.x 版本 . 页面详解: 此处以用户列表功能为事例说明 用户功能列表路径为 src/views/userMange/list.vue 4.3. 数据交互
后台数据交互采用 axios, 更多 https://www.npmjs.com/package/axios(推荐) https://www.kancloud.cn/yunye/axios/234845(汉化文档) . 创建数据请求方法 (请求方法统一存放在 src/api.js 文件下) . 将所有的接口地址统一存放在 src/api.js 下如图 imgimg 如图:api.js 定义了一个 setAdminApi 函数 用于拼接重复的 api 地址 api 文档中以 / api/admin / 为路径的则可使用该函数 ,否则直接填写完整路径 例如 bsaeUpload:’/api/member/upload/o_upload’,// 普通文件上传 .数据请求示例 . 普通未封装请求接口示例 在页面的<script>下引用 axios ![img](http://ovi3ob9p4.bkt.clouddn.com/cms/cms026.png)
然后在需要的方法中调用 axios 请求 此处以 created 方法中调用为示例 (具体功能,请根据自身情况修改使用) axios.post(this.$api.memberList,this.params) .then(res=>{~! //此处为请求成功的回调 }) .catch(error=>{ //此处为请求失败的回调 })
说明:axios.post() 方法可以发送一个 post 请求,其他请求类型有 get ,put ,delete 等,具体参考 axios 文档 this.$api.memberList 此参数为 api 地址 在页面中使用 this.​$api.XXX 即可调用 src/api 中的 地址变量 此方法为获取所有用户列表信息,传递了一个参数对象 params: {// 只需要业务参数 ​ queryUsername: "", queryEmail: "", queryGroupId: "", queryStatus: "", pageNo: "", pageSize: "" }
在成功的回调函数中,可以将列表数据赋值给自定义的一个变量,在页面中调用该变量即可, 列表封装接口示例 本系统封装了一个 list 和一个 form 混合 img 此类文件的作用为 将一些公用的方法和变量插入页面组件中,在页面则可直接使用该变量以及方法 以 src/views/userMange/list.vue 为例 在页面<script></script>中引入mixins img 此处引入了 list.js 此文件预先定义了基础列表所需要的变量以及方法,简单的列表查询及操作,可直接使用该混合文件,具体变量及方法,查看文件内注释 在页面中的 created 方法中 调用了 created(){ this.initTableData(this.$api.memberList,this.params); } 该方法为混合方法,作用为初始化列表信息,第一个参数传递的为 api 接口地址,第二个参数为自定义参数对象,调用该函数后会自动初始化列表以及赋值,在页面上直接使用 tableData 属性即可 数据加密方法介绍 如业务参数需要加密,则需要在页面组件中引用 src/untils/aes.js 调用示例: import { Encrypt } from "../untils/aes"; let aesKey = this.$store.state.aesKey letivKey = this.$store.state.ivKey; letaesPassword = Encrypt(this.params.pwd, aesKey, ivKey);
4.3. 将组件添加至路由表
页面编写完成后需要将组件注册到路由中 关于路由采用的是 vue-router,更多详细:https://router.vuejs.org/zh-cn/index.html 路由表文件为 src/router/routes.js { path:'/', name:'用户管理', //用户管理 component: body, iconCls: 'icon-user', meta:{ isLink: true }, children: [{ path:'/user', name:'会员管理', //会员管理 component: childView, isParent: true, redirect: '/user/list', children: [{ path: '/user/list', //会员列表 name: '会员列表', component:resolve => { require(['@/views/user/userMange/list.vue'], resolve) }, }, { path: '/user/save', //会员添加 name: '会员添加', component:resolve => { require(['@/views/user/userMange/add.vue'], resolve) }, hidden: true }, { path: '/user/update', //会员添加 name: '会员修改', component:resolve => { require(['@/views/user/userMange/edit.vue'], resolve) }, hidden: true } ] }, {
path:访问地址(唯一不可重复) meta:{role:’xxxx’} 角色权限名, 不可重复,而且不同板块前缀要不同,比如用户模块叫 user 另外会员管理叫 userMember 这样是不行的 name:’路由名称’, 【也就是菜单名】 component: component:resolve => { require(['@/views/user/userMange/list.vue'], resolve) }, 懒加载页面组件,在点击该功能时才加载文件 children:子路由 4.3. 权限控制
权限文件为 src/routers/roles.js 角色权限编是一个按照路由层级来构造的 json 对象(自定义添加时,也保持同样的规则) 以用户列表角色为例 { name:'用户管理', role:'userlist', api:[ '/api/admin/user/list', '/api/admin/user/get' ], children: [{ name:'添加', role:'useradd', api:[ '/api/admin/user/save' ], }, { name:'修改', role:'useredit', api:['/api/admin/user/update'], }, { name:'删除', role:'userdelete', api:[ '/api/admin/user/delete' ], }, ]
name:角色权限名称(角色管理中树状结构的名字) role:页面显示权限(就是路由表中的 meta:{role:’xxxx’}) api:页面组件所拥有的调用后台 api 的地址 4.3. 组件使用
vue 是一个组件化开发的 js 一切皆为组件 在本系统中页面基础组件采用了 element2. 组件库 (页面中以 el-xxxx 开头) 自定义组件为自行封装(页面中以 cms-xxxx 开头) 自定义组件存放在 img 开发中,一些公用的功能可以封装为自定义组件 此处以 cms-input 组件为例 img 组件页面与功能页面结构完全相同 <
template> <divclass="cms-inline-input"> <labelfor=""class="cms-inline-label">{{label}}:</label> <el-input :value="currentValue"@input="handleInput" :style="{width:width+'px'}" ></el-input> </div> </template> <script> exportdefault { name:'cms-input', props:{ value:'', label:{ type:String, default:'label' }, width:{ type:Number, default: } }, data(){ return{ currentValue:this.value } }, methods:{ handleInput(value){ this.$emit('input',value);//触发input 事件,并传入新值 } } } </script> <stylescoped lang="scss"> .cms-inline-input{ display:inline-block; position:relative; margin-left:12px; } .cms-inline-label{ font-size:14px; color:#5a5e66; } </style>
此处封装了一个标签和输入框,对外 props 暴露了 个属性 value label width 在页面上使用方法为 <cms-inputlabel=’标签名’ width=’’ v-model=’xxx’></cms-input> 通过this.$emit('input',value);//触发input 事件,并传入新值 向使用者传递返回值 4.4 后台页面发布
后台源码的开发文件不可直接运行在浏览器中,需要通过命令打包将源码生成为静态文件 . 使用命令行工具进入 工程目录 img 项目工程中如果没有 node_modules 文件夹,则执行
npminstall (推荐使用 cnpm install,http://npm.taobao.org/ 加快依赖下载速度) 如果有则忽略此步骤 . 执行命令 npm run build 出现 building for production 则成功执行,等待命令完成完成后会出现下图 img 出现上图,说明打包编译完成,在项目中会有一个 dist 文件夹 img dist 文件夹中有两个文件 img 、将 index.html 改名为 index.do 后,将 index.do 和 static 文件夹放到 ROOT 下的 / jeeadmin/jeecms 文件夹下,eclipse 下放到 / WebContent/jeeadmin/jeecms 下 4.5 修改后台地址
. 带部署路径和端口的此类情况无须修改,如下 http://xxx.jeecms.com/jeeadmin/jeecms/index.do http://xxx.jeecms.com/project/jeeadmin/jeecms/index.do \. 需要调整后台路径此类情况须要修改 http://xxx.jeecms.com/admin/jeecms/index.do http://xxx.jeecms.com/project/admin/jeecms/index.do 此处修改源码工程中的 src/config.js img 将 jeeadmin 文件夹重命名为 admin 即可 本文作者: IIsKei
本文链接: http://www.iskei.cn/posts/48599.html
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!

jeecms v9开发资料的更多相关文章

  1. 【Android开发资料分享】自己整理的Android开发资料,非常全面

    学习Android以来,不知不觉中收集了大量非常优秀的Android开发资料,一直没有系统的整理,最近抽时间把收藏夹中的资料做了一下整理,现在分享给大家,希望能够帮助到需要的人.这份资料我还会不断的更 ...

  2. 如何查找STM32开发资料

    Ⅰ.概述 该文写给那些处于初学ST芯片开发.英文不好而又想偷懒的人. 该文主要的目的是提醒大家:学习一门技术是需要舍得花功夫,捷径是你在起点与终点之间不断的探索,最终总结出来的一条适合自己的路. 下面 ...

  3. 推荐资料——最受网友力荐的30份HTML前端开发资料

    w3cmark最近会新增一个栏目,专注于搜集前端资源的下载,包括和前端相关的电子书.文档PPT.手册.视频教程等等.而下载的媒介是用微博的微盘,至于为什么选择微盘的,那是因为和微博关联起来,通过微盘上 ...

  4. 基于STM32L4的开源NBIOT开发资料

    基于STM32L4的开源NBIOT开发资料 1. 参考路径:http://www.stmcu.org/module/forum/forum.php?mod=viewthread&tid=615 ...

  5. WP7 开发资料

    前言 离Windows Phone 7正式发布已过去几个月了,但国内关于Windows Phone 7的中文书籍资料太少了,大多数是英文资料,一本真正的中文开发教程书都没有, 要啃英文资料对大部分的开 ...

  6. BACnet开发资料与调试工具

    一.开发资料 1.认识BACnet协议 2.BACnet网络讲义: 链接:https://pan.baidu.com/s/1A6OOUxvJe1zIYbockqTEsQ提取码:wz49 二.调试工具 ...

  7. 史上最全USB HID开发资料

    史上最全USB HID开发资料 史上最全USB HID开发资料,悉心整理一个月,亲自测试. 涉及STM32 C51 8051F例子都有源码,VC上位机例子以及源码,USB协议,HID协议,USB抓包工 ...

  8. jeecms v9.3 has a stroed xss vulnerability

    转载:https://blog.csdn.net/libieme/article/details/83588929 jeecms v9.3 has a stroed xss vulnerability ...

  9. jeecms v9 vue-CLI开发环境配置

    vue-CLI开发环境配置 Vue.js 提供一个官方命令行工具,可用于快速搭建大型单页应用.该工具提供开箱即用的构建工具配置,带来现代化的前端开发流程.只需几分钟即可创建并启动一个带热重载.保存时静 ...

随机推荐

  1. 【POJ】3268 Silver Cow Party

    题目链接:http://poj.org/problem?id=3268 题意 :有N头奶牛,M条单向路.X奶牛开party,其他奶牛要去它那里.每头奶牛去完X那里还要返回.去回都是走的最短路.现在问这 ...

  2. vue axios简单配置

    参考:https://www.cnblogs.com/sophie_wang/p/7844119.html 1. 安装 npm install axios 2. main.js import axio ...

  3. LinkedHashMap+Spring Aop实现简易的缓存系统

    之前介绍说要做在线文库的系统,当数据量大的时候,根据标签tag的对文档信息的查询将是一个很耗时的工作,原来分析LinkedHashMap源码的时候了解到它有一个双向链表的结构,可以通过将刚被访问的元素 ...

  4. META标签的定义与使用(二、页面描述信息(NAME))

    二.name的content指定实际内容.如:如果指定level(等级)为value(值),则Content可能是beginner(初级).intermediate(中级).advanced(高级). ...

  5. heartbeat 高可用

    转载来自 http://www.cnblogs.com/liwei0526vip/p/6391833.html 使用HeartBeat实现高可用HA的配置过程详解 一.写在前面 HA即(high av ...

  6. js 阻止事件

    event.stopPropagation();//阻止事件冒泡 ,可阻止父类事件的发生 event.preventDefault();//阻止默认行为 如A标签

  7. Linux课程---13、linux中任务计划介绍(任务计划分类)

    Linux课程---13.linux中任务计划介绍(任务计划分类) 一.总结 一句话总结: 1.一次性任务计划:at 2.周期性任务计划:crontab 1.linux中如何添加一次性任务计划? at ...

  8. 如何清除本机DNS缓存

    如何清除本机DNS缓存 在实际应用过程中可能会遇到DNS解析错误的问题,就是说当我们访问一个域名时无法完成将其 解析到IP地址的工作,而直接输入网站IP却可以正常访问,这就是因为DNS解析出现故障造成 ...

  9. 详解JDBC与Hibernate区别

    详解JDBC与Hibernate区别 引用地址:http://www.cnblogs.com/JemBai/archive/2011/04/13/2014940.html 刚开始学习JAVA时,认为H ...

  10. Java并发编程中的若干核心技术,向高手进阶!

    来源:http://www.jianshu.com/p/5f499f8212e7 引言 本文试图从一个更高的视角来总结Java语言中的并发编程内容,希望阅读完本文之后,可以收获一些内容,至少应该知道在 ...