Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Sign up for free
Menu
Search
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Features
All features
Private URLs
Password Protection
Custom URLS
Scheduled publishing
Remove Branding
Restrict embedding
Deck Collections
Notes
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Explore
Featured decks
Featured speakers
Programming
Technology
Storyboards
Pricing
Search
Sign in
Sign up for free
部门后台框架
Search
Sponsored
·
Ship Features Fearlessly
Turn features on and off without deploys. Used by thousands of Ruby developers.
→
cssrain
September 02, 2014
Technology
220
0
Share
Embed
Copy iframe code
Copy JS code
Copy link
Start on current slide
部门后台框架
部门后台框架
cssrain
September 02, 2014
More Decks by cssrain
See All by cssrain
UED工作流程分享和交流
cssrain
1
520
解读HTML
cssrain
0
190
解读HTML5
cssrain
2
210
基础CSS(1)
cssrain
0
200
基础CSS(2)
cssrain
0
150
高效的CSS
cssrain
0
200
高级CSS—继承
cssrain
0
170
PhoneGap分享和交流
cssrain
0
150
PhoneGap实践
cssrain
0
99
Other Decks in Technology
See All in Technology
エージェントはローカル、検証はMicroVM — Lambda MicroVMsでつくるServerless CI
fujioka6789
3
730
The Knowledge Spine: A Machine-Executable Ontology for Governed Marketing Activation
vananth22
0
120
SREへの勘違いに気づいた後の話
tomodakengo
0
150
GoのInterface内部構造から学ぶ!最高パフォーマンスを出すコード設計
yappli_developers
1
270
AI Agent入門〜今更聞けないAgentの話〜
hiromimaganuma
0
110
「ピッケル本」日本語版は4.0(第6版)が出版されるべき / pickaxe4-nagoyark05
kakutani
2
280
AI de Idea
kawaguti
PRO
2
130
C#コードの結合を可視化する Roslyn解析による設計改善と リファクタリング判断
dora56
0
520
俺の仕事は AIに奪われないし、たぶんその BIも要らない
hikaruri
0
540
作って終わりじゃないサーバーレス 〜9年運用する大規模EC物流API基盤の設計・運用のリアル〜
zozotech
PRO
0
480
え、こんなに早く改修できるの?──新人エンジニアとスクラムマスターの2人が語る、AI×アジャイル開発の現場
ysasago
2
690
2026_devsumi_ozono.pdf
o3
3
590
Featured
See All Featured
What the history of the web can teach us about the future of AI
inesmontani
PRO
1
710
Statistics for Hackers
jakevdp
799
230k
Avoiding the “Bad Training, Faster” Trap in the Age of AI
tmiket
0
250
Optimising Largest Contentful Paint
csswizardry
37
4k
Crafting Experiences
bethany
1
350
HU Berlin: Industrial-Strength Natural Language Processing with spaCy and Prodigy
inesmontani
PRO
0
710
Unsuck your backbone
ammeep
672
58k
How People are Using Generative and Agentic AI to Supercharge Their Products, Projects, Services and Value Streams Today
helenjbeal
1
330
The Myth of the Modular Monolith - Day 2 Keynote - Rails World 2024
eileencodes
28
3.6k
A Modern Web Designer's Workflow
chriscoyier
699
190k
Noah Learner - AI + Me: how we built a GSC Bulk Export data pipeline
techseoconnect
PRO
0
440
Technical Leadership for Architectural Decision Making
baasie
3
580
Transcript
项目开发框架分享 --框架一小步,开发一大步 UED分享 · 交流 http://cssrain.github.io
项目框架结构 Broswer、Phone、Pad等终端 系统表结构 客户端 项 目 前 台 模 版
项 目 后 台 模 版 数据库 Request Web Services JSON JSON JDBC 请求参数验证(XML) 代 码 插 件 Action控制类 IControlService 统一调用接口 Action控制类 IControlService 统一调用接口 IControlService Service服务类 Dao操作类 Java Bean InputObject OutputObject 统一调用接口 JSON JSON
Html Filter Interceper Action IControlService Service Dao || tp Converter
IControlService (1) 页面请求 (3) (2) (4) (5) (6) (10) (9) (8) (7) WebService调用 WebService调用 (1) 验证参数个数、顺序、正则表达式 (2) 根据control.xml封装InputObject对象, 存 储在ActionContext中 (3) 获取InputObject对象 (4) 将InputObject对象转成Json (5)将Json转换成InputObject (6)数据处理 (7)封装OutputObject对象 (8)将OutputObject对象转成Json (9) 将Json转换成OutputObject对象 (10) 封装Json 项目框架流程 返回数据,处理完成
<control> <action path="" service="" method=""> <input uid="1" service="" method=""> <parameter
key="" order="" regex="" scope="" toKey=""/> <parameter key="" order="" regex="" scope="" toKey=""/> ……… </input> <output uid="1" convertor="" method=""/> ……… </action> …….. </control> control.xml文件配置
<control>标签 整个应用的控制请求,control.xml的根标签。 control.xml详解 <action>标签 <!ELEMENT control (action+)> 请求动作标签,代表一个请求动作,各请求根据path属性进行区别。
<path>属性: Request请求路径; #REQUIRED <service>属性:Request请求调用后台的WebService服务类,值为后台工程中 spring-services.xml中Service对应的id值; #IMPLIED <method>属性:服务类中的方法; #IMPLIED <input>标签 <!ELEMENT action (input,output?)*> 请求参数标签,<action>中可包含多个<input>标签,各标签通过uid区别。 <uid>属性: 请求的唯一编号; #IMPLIED <service>属性:若填写,则重写父类action属性的service; #IMPLIED <method>属性:若填写,则重写父类action属性的method; #IMPLIED
<parameter>标签 <!ELEMENT input (parameter*)> Request的参数映射标签,参数列表 <key>属性: Request中对应的key; #REQUIRED <toKey>属性:InputObject对象中params属性中的key值;
#IMPLIED <order>属性:参数的顺序,按照验证需求添加; #IMPLIED <regex>属性:正则表达式验证,按照验证需求添加; #IMPLIED <scope>属性: key属性对应值的取值范围; (request|session|constants|properties) #IMPLIED control.xml详解 注意: 1、若scope不配置,则默认为“request”,从前台请求中获取数据; 2、若scope为“session” ,则根据key到session中获取对应值,并以toKey属性的值作为 params的键值存储,key的配置规则为: session中key值[.属性][.属性]; 3、若scope为“constants”,则从com.ai.***.util.Constants.java中读取属性为key的值; 4、若scope为“properties”,则从config/system.properties中读取数据; 5、若toKey属性不配置,则以key为params的键值存储。
control.xml详解 <output>标签 <!ELEMENT action (input,output?)*> 请求返回结果转换标签,output标签通过uid属性和input匹配 <uid>属性: 请求的唯一编号; #REQUIRED
<convertor>属性:Json转换类 ; #REQUIRED <method>属性:调用的方法; #IMPLIED 注意: 1、 output标签是否需要可视Action返回给前台的Json而定; 2、 convertor属性为转换类全称,形如“com.ai.***. convertor.****Convertor”; 3、转换类需要继承com.ai.frame.convertor.BaseConvertor; 4、方法定义: public String XXX(InputObject inputObject , OutputObject outputObject);
InputObject对象 private String service; // 调用后台服务类的名称 private String method; //
服务类中的方法名 private String serverIp; // 调用服务的主机IP private String userId; // 用户信息 private Map<String, String> params; // 参数信息 private List<Map<String, String>> beans; // 参数集 private Map<String, String> logParams ; // 日志参数 // 将params属性转换成JavaBean public <T> T convertParams2Bean(Class<T> clz); // 将beans属性转化成List<JavaBean> public <T> List<T> convertBeans2Beans(Class<T> clz);
InputObject对象获取 从ActionContext中获取 InputObject input= (InputObject) ServletActionContext.getContext().get("inputObject"); 自创建InputObject对象 InputObject inputObject =
new InputObject(); 注意:框架中已对该方法进行封装,在Action中可调用父类BaseAction中的 getInputObject()方法获得。 提醒:创建的inputObject对象中的params、 beans等属性已被实例化,可直接通过 getter方法获取使用。
前后台交互 在前台注入IControlService对象,通过调用 OutputObject execute(InputObject inputObject)完成方法调用。 同样,在基类BaseAction中,已对该方法进行封装,重载了两种方法: OutputObject getOutputObject(); 从ActionContext中读取创建的InputObject对象,作为参数调用后台服务。 OutputObject
getOutputObject(InputObject inputObject); 自创建InputObject对象作为参数,调用后台服务。
public String getWaitCheckByPage(){ String start = getRequest().getParameter("start"); String everyPage =
getRequest().getParameter("limit"); User user = (User)getSession().getAttribute("User"); int userId = user.getId(); InputObject inputObject = new InputObject(); inputObject.setService("mediastoreService"); inputObject.setMethod("getWaitCheckByPage"); Map<String,String> map= new HashMap<String,String>(); map.put("compareName", String.valueOf(userId)); map.put("start", start); map.put("everyPage", everyPage); inputObject.setParams(map); OutputObject outputObject = getControlService().execute(inputObject); String json = JsonDataUtil.getWaitCheckJson(outputObject); sendJson(json); return null; } 使用示例1 当 前 开 发 模 式
public String execute() { OutputObject object = super.getOutputObject(); super.sendJson(super.convertOutputObject2Json(object)); return
null; } <control> <action path="/front/sh/common!execute"> ………. <input uid= "4" service="mediastoreService" method="getWaitCheckByPage"> <parameter key="start" order="0" regex="" toKey="start"/> <parameter key="limit" order= "1" regex="" toKey="everyPage"/> <parameter key="User.id" regex="" scope="session" toKey ="compareName" /> </input> <output uid= "4" convertor="com.ai.mpt.convertor.NoticeConvertor" /> </action> </control> 框 架 模 式
Tools是一个可实现常规代码的自动生成的插件! 代码生成插件Tools 公告表: CREATE TABLE DB_AP_MPT_NOTICE( ID NUMBER NOT NULL,
--公告ID REGION_ID VARCHAR2(2), --归属地市 NAME VARCHAR2(100), --公告名称 CONTENT VARCHAR2(2000), --公告内容 CREATE_OPID VARCHAR2(50), --创建人 CREATE_DATE DATE --创建时间 );
单表操作 后台工程右键选择AILK_TOOLSSingle-Table, 输入数据库Url、用户名、密码 下一步 双击选择需要操作的表,点击确定即完成操作!
文件名称 文件路径 备注 Notice.java java/**/bean/ 创建Bean文件 Notice.xml resources/orm/ 创建Ibatis配置文件 SqlMapConfig.xml
resources/orm/ 修改主配置文件 INoticeDao.java java/**/dao/ 创建Dao接口类 NoticeDaoImpl.java java/**/dao/impl/ 创建Dao接口的实现类 INoticeDaoTest.java test/**/dao/ 创建Dao的测试类 INoticeService.java java/**/service/ 创建Service接口类 NoticeServiceImpl.java java/**/service/impl/ 创建Service接口的实现类 INoticeServiceTest.java test/**/service/ 创建Service的测试类 spring-dao.xml resources/spring/ 修改文件,添加Dao声明 spring-services.xml resources/spring/ 修改文件,添加Service声明 生成文件列表:
多表操作 后台工程中选择AILK_TOOLSMulti-Table,输入SQL、选择Dao、输入方法名、选择是否同 步Service,点击确定即可。 文件名称 文件路径 备注 Notice.xml resources/orm/ 修改Bean的ORM文件 INoticeDao.java
java/**/dao/ Dao中添加声明方法 NoticeDaoImpl.java java/**/dao/impl/ Dao实现类实现该方法 INoticeDaoTest.java test/**/dao/ 测试该方法 INoticeService.java java/**/service/ 不勾选则不生成 NoticeServiceImpl.java java/**/service/impl/ 不勾选则不生成 INoticeServiceTest.java test/**/service/ 不勾选则不生成 生成文件列表:
使用示例2 需求:获取当前登录用户所在地区的公告名称包含“test”的 信息列表。 Region.java int id; String regionName; User.java int
id; String name; Region region; Notice.java int id; String regionId; String name; String content; String createOpid; Date createDate; 假设: session.setAttribute("user",user);
步骤1:使用Tools生成后台服务 SQL: SELECT * FROM DB_AP_FWE_NOTICE N WHERE N.REGION_ID =
#regionId# AND N.NAME LIKE '%' || #name# || '%' 选中的DAO: INoticeDao 方法名: getNoticesByName 同步Service: √
步骤2:配置前台control.xml文件 <control> <action path="/front/sh/common!execute"> ………. <input uid="2" service="noticeService " method="getNoticesByName">
<parameter key= "a" order="0" regex="" toKey="name"/> <parameter key="user.region.id" regex="" scope="session" toKey ="regionId" /> </input> <output uid="2" convertor="com.ai.fwe.convertor.NoticeConvertor" method=“convert2Json" /> </action> </control> 配置output标签,需 自行编写Json转换类
步骤3:编写转换类(如果需要) public class NoticeConvertor extends BaseConvertor { public String convert2Json(InputObject
input, OutputObject output) { String json = "{\"colmodel\":[],\"rows\":"; json += JsonUtil.convertObject2Json(output.getBeans()); json += ",\"total\":"+output.getBean.get("total")+"}"; return json; } } Json工具:JsonView \\192.168.1.217\software\tools
步骤4:前台请求 $.AjaxJson(contextPath+"/front/sh/common! execute?a="+$("#name").val(), dealData); function dealData (state,data){ //处理数据 } common.js
$.extend({ AjaxJson: function(url,callback){ $.ajax({ url:url, type:"post", cache:false, dataType : "json", success:function(data){ callback("success", data); }, error:function(){ callback("error", null); } }); } }); 框架示例 FrameWork Example svn://192.168.1.217/fwe
感谢聆听!!