ExtJS做的一个信息管理界面

前段时间公司让我们学习ExtJS,学习了一个礼拜,完成了个小练习,思来想去决定做个总结,但是又懒得敲word,于是就在代码上每行都加上注释,以后忘记了就翻开来看看。

在这里给出代码。

完成的功能如图所示。

Js代码 收藏代码
  1. /**
  2. *默认页面
  3. *
  4. *@authorleaves.qq:1330771552
  5. */
  6. Ext.define('SupplyManagementDesktop.defaultsWindow',{
  7. extend:'Ext.ux.desktop.Module',
  8. requires:['Ext.data.ArrayStore','Ext.util.Format','Ext.grid.Panel',
  9. 'Ext.grid.RowNumberer','Ext.ux.LiveSearchGridPanel'],
  10. id:'defaultsWindow-win',
  11. /***************************************************************************
  12. *ExtJS控件使用按照如下规则。首先,创建控件,调用Ext.create
  13. *weightName:空间命名空间,args:空间参数,用{}包围,当做对象传入
  14. *
  15. *#######################################注意JS中有如下语法:varobject={
  16. *paramter1:value1,paramter2:value2,paramter3:value3}
  17. *object.paramter1可以直接获得value1#####################################
  18. *
  19. *ExtJS中所有空间创建方法都如上
  20. *
  21. *Ext.create(StringweightName,Mixedargs)
  22. *所以此处args相当于一个匿名对象(没有引用),但并非真的匿名对象
  23. *
  24. */
  25. //初始化窗体的方法
  26. init:function(){
  27. this.launcher={
  28. text:'DefaultsWindow',
  29. iconCls:'icon-grid',
  30. //调用createWindow方法
  31. handler:this.createWindow,
  32. scope:this
  33. //this指向Ext.define(这个方法用来声明命名空间。)定义的命名空间
  34. };
  35. },//初始化窗体的方法结束
  36. //创建窗体的方法
  37. createWindow:function(){
  38. //下面进行预定义。就好像C里面的先定义后使用。不然后定义的在前面使用会认为未初始化。(猜测:可能不跟JS一样,属于ExtJS的语法)
  39. vardataPanel;//预定义一个GridPanel,用来显示数据
  40. varinnerPanel;//存放Panel的容器
  41. varworkerPanel;
  42. varwestPanel;
  43. vardeptStore;
  44. varmoduleObj=this;//创建windows窗体的时获取下本身的环境,此处不能确定,这个this是指向Ext.define还是指向创建的这个窗体
  45. vardesktop=this.app.getDesktop();
  46. //获取窗体,外部最大窗体,具体方法不清楚。
  47. varwin=desktop.getWindow('defaultsWindow-win');
  48. //创建按钮bar组件,是上面的几个按钮。
  49. varbuttonBar=Ext.create('Ext.toolbar.Toolbar',{
  50. dock:'top',
  51. items:[{
  52. xtype:'button',
  53. text:'新建',
  54. iconCls:'add',
  55. handler:function(){
  56. //自行新建操作,传入一个create字符串用来标示是什么按钮事件,传入dataPanel(注意:上面没有var
  57. //dataPanel;此处会报错。)因为后面的新建需要用到表格显示的数据(dataPanel.getSelectionModel().getSelection())
  58. moduleObj.proAction("create",dataPanel,
  59. workerPanel);
  60. }
  61. },{
  62. //分隔符,不解释。
  63. xtype:'tbseparator'
  64. },{
  65. xtype:'button',
  66. text:'删除',
  67. iconCls:'remove',
  68. handler:function(){
  69. moduleObj.proAction("delete",dataPanel);
  70. }
  71. },{
  72. xtype:'tbseparator'
  73. },{
  74. xtype:'button',
  75. text:'复制',
  76. iconCls:'copy',
  77. handler:function(){
  78. moduleObj.proAction("copy",dataPanel,workerPanel);
  79. }
  80. },{
  81. xtype:'button',
  82. text:'重置检索',
  83. iconCls:'reset',
  84. handler:function(){
  85. dataPanel.resetSearch();
  86. }
  87. }]
  88. });//创建按钮bar组件结束
  89. //临时创建的一个用来展示的store
  90. vartheStore=Ext.create('Ext.data.Store',{
  91. fields:[{
  92. name:'projectId',
  93. type:'String'
  94. },{
  95. name:'projectCode',
  96. type:'String'
  97. },{
  98. name:'projectName',
  99. type:'String'
  100. },{
  101. name:'startDate',
  102. type:'String'
  103. },{
  104. name:'endDate',
  105. type:'string'
  106. },{
  107. name:'qualityTarget',
  108. type:'string'
  109. },{
  110. name:'projectLeader',
  111. type:'string'
  112. },{
  113. name:'projectStatus',
  114. type:'string'
  115. },{
  116. name:'qualification',
  117. type:'string'
  118. },{
  119. name:'constructionUnit',
  120. type:'string'
  121. }],
  122. pageSize:20,//每页显示数量。此处设置可以在向后台申请数据的时候“自动”传参一个
  123. //limit和satrt,start不需要指定ExtJS会自动计算,然后传值。
  124. proxy:{
  125. type:'ajax',//使用传输方式为ajax(ajax是异步执行的操作,即不需要刷新页面即可申请后台资源。)
  126. method:'POST',//post和get是HTML中表单(form)提交两种方式,get会在地址栏显示参数,post不显示
  127. url:'/Training/myProjectInfoController/getAllProjectInfo.action?deptId='
  128. +0,
  129. reader:{//设置读取方式属性
  130. type:'json',//设置读取方式格式为:json字符串
  131. root:'root',//设置根元素,即读取上面fields种的name中对应值的元素,此处多为元素组,json字符串如:{A:a,B:[{},{},{},………………]}
  132. totalProperty:'totalProperty'//设置总页码
  133. }
  134. },
  135. autoLoad:true
  136. //自动读取,即显示绑定该store的组件的时候直接读取数据
  137. });
  138. //创建临时Store结束
  139. //创建分页bar组建
  140. varpagebar=Ext.create('Ext.toolbar.Paging',{
  141. pageSize:20,
  142. store:theStore,
  143. dock:'bottom',
  144. setActive:false,
  145. refresh:false,
  146. displayInfo:true,
  147. plugins:Ext.create('Ext.ux.ProgressBarPager',{})
  148. });
  149. //创建分页bar组建结束
  150. //为theGirdPanel创建一个SelectionModel
  151. varselectionModeltoGridPanel=Ext
  152. .create('Ext.selection.CheckboxModel');//想要能进行选择或者多选,就需要设置selModel属性这是设置selection的模型,创建一个模型Ext.selection.CheckboxModel
  153. //初始化gridPanel
  154. dataPanel=Ext.create('Ext.ux.LiveSearchGridPanel',{
  155. title:'<fontcolor=red>工程详细信息</font>',
  156. region:'center',
  157. width:'100%',
  158. height:'96%',
  159. store:theStore,
  160. selModel:selectionModeltoGridPanel,
  161. //一系列行,不解释,也可以varcolumn=[`````````]然后columns:column
  162. iconCls:'remove',
  163. columns:[{
  164. dataIndex:'projectId',
  165. width:80,
  166. text:'项目号'
  167. },{
  168. dataIndex:'projectCode',
  169. width:80,
  170. text:'项目序号'
  171. },{
  172. dataIndex:'projectName',
  173. width:100,
  174. text:'项目名称'
  175. },{
  176. dataIndex:'constructionUnit',
  177. width:100,
  178. text:'建设单位'
  179. },{
  180. dataIndex:'startDate',
  181. width:80,
  182. text:'开工日期'
  183. },{
  184. dataIndex:'endDate',
  185. width:80,
  186. text:'竣工日期'
  187. },{
  188. dataIndex:'qualityTarget',
  189. width:100,
  190. text:'质量目标'
  191. },{
  192. dataIndex:'projectLeader',
  193. width:100,
  194. text:'项目负责人'
  195. },{
  196. dataIndex:'projectStatus',
  197. width:80,
  198. text:'项目状态'
  199. },{
  200. dataIndex:'qualification',
  201. width:80,
  202. text:'需要资质'
  203. }],
  204. dockedItems:[buttonBar,pagebar]
  205. });
  206. //绑定dataPanel鼠标双击事件。
  207. dataPanel.on('itemdblclick',function(){
  208. moduleObj.proAction("update",dataPanel,workerPanel);
  209. });
  210. //初始化gridPanel结束
  211. //为下面的部门信息分类栏(grid)创建一个store数据用jsonu读取/Training/DeptInfoController/getAllDeptInfo.action地址申请到的资源。
  212. deptStore=Ext.create('Ext.data.Store',{
  213. fields:[{
  214. name:'deptId',
  215. type:'String'
  216. },{
  217. name:'deptName',
  218. type:'String'
  219. }],
  220. proxy:{
  221. type:'ajax',
  222. method:'POST',
  223. url:'/Training/DeptInfoController/getAllDeptInfo.action',
  224. reader:{
  225. type:'json',//用json字符串
  226. root:'root'
  227. }
  228. },
  229. autoLoad:true
  230. });
  231. //创建部门信息分类栏,
  232. workerPanel=Ext.create('Ext.grid.Panel',{
  233. title:'部门信息',
  234. border:false,
  235. store:deptStore,
  236. hideHeaders:true,
  237. columns:[{
  238. dataIndex:'deptId',
  239. hidden:true,
  240. sortable:false,
  241. width:180
  242. },{
  243. dataIndex:'deptName',
  244. sortable:false,
  245. width:180
  246. }]
  247. });
  248. //给部门信息的grid绑定事件,当单击的时候触发事件,此事件用来刷新右侧列表
  249. workerPanel.on('itemclick',function(grid,record){
  250. //获取当前行的deptId列的值
  251. varid=record.data.deptId;
  252. //dataPanel.store:获取dataPanel的store属性的值,dataPanel.store.proxy获取数据来源属性,ataPanel.store.proxy.url获取数据来源属性的URL,
  253. //这个方法用来重新设置数据来源的地址,
  254. //注意:后面的?deptId是HTML传参方法,地址栏传参。跟form直接传参一样,后台可以接受。
  255. dataPanel.store.proxy.url='/Training/myProjectInfoController/getAllProjectInfo.action?deptId='
  256. +id;
  257. dataPanel
  258. .setTitle("<fontcolor=red>"
  259. +(workerPanel.getSelectionModel().getSelection())[0].data.deptName
  260. +"</font>部门信息");//ExtJS中的标题等字符串属性支持HTML语言,直接设置格式。
  261. dataPanel.store.load();//dataPanel.store:获取dataPanel的store属性的值,dataPanel.store.load():调用取得的值的load()方法,用来重新加载store数据,实现grid刷新
  262. });
  263. //初始工人信息Panel,同下
  264. workerPane2=Ext.create('Ext.grid.Panel',{//Ext.grid.Panel可以直接显示grid的panel不需要create一个Grid放置panel中
  265. title:'BBBBBB',//随便取标题
  266. border:false,//没有边框
  267. store:theStore,
  268. hideHeaders:true,
  269. columns:[{
  270. dataIndex:'projectName',
  271. sortable:false,//不能排序
  272. width:180
  273. }]
  274. });
  275. //初始工人信息Panel,用来实现折叠效果的panel
  276. workerPanel3=Ext.create('Ext.grid.Panel',{//Ext.grid.Panel可以直接显示grid的panel不需要create一个Grid放置panel中
  277. title:'CCCCCCC',//随便取标题
  278. border:false,//没有边框
  279. store:theStore,
  280. hideHeaders:true,//隐藏grid每列数据的标题
  281. columns:[{
  282. dataIndex:'projectName',
  283. sortable:false,//不能排序
  284. width:180
  285. }]
  286. });
  287. //左边伸缩栏
  288. westPanel=Ext.create("Ext.panel.Panel",{
  289. collapsible:true,//这个属性设置此panel容易可以隐藏(最小化)
  290. title:'分类查看',
  291. layout:'accordion',//这个属性设置此panel容易可以实现折叠效果
  292. width:200,
  293. region:'west',
  294. iconCls:'reset',
  295. items:[workerPanel,workerPane2,workerPanel3]
  296. //放置三个小panel容器,如上定义
  297. });
  298. //创建容器,用来存放整个窗体的组件,并且在下面直接放置到win中。
  299. theContainer=Ext.create('Ext.container.Container',{
  300. layout:'border',
  301. items:[dataPanel,westPanel]
  302. });
  303. //判断是否已经创建最外边窗体,如果创建了,(JS是弱类型语言,认为null相当于false)
  304. if(!win){
  305. win=desktop.createWindow({//所以此处的目的是:如果win已经初始化存在了,那么就不新创建窗体,直接调用下面的show()方法
  306. //下面属性不具体解释,详细可以查看API手册
  307. id:'defaultsWindow-win',
  308. title:'工程详细信息设置',
  309. width:1100,
  310. height:600,
  311. iconCls:'icon-grid',
  312. animCollapse:false,
  313. constrainHeader:true,
  314. layout:'fit',
  315. items:[theContainer]
  316. //把创建好存放所有组件的窗体放置到外围窗体中
  317. });
  318. }
  319. win.show();//显示窗体。
  320. returnwin;//把窗体的句柄(相当于内存引用)返回
  321. },
  322. //创建窗体的方法结束
  323. //显示一个对话框的方法,暂时带有一个用来判断是什么按钮的属性
  324. proAction:function(btn,dataPanel,workerPanel){
  325. varselectData;//预设一个用来存放被选中的数据的变量
  326. varinnerPanel;
  327. //如果选择的是复制
  328. if("copy"==btn){
  329. if(dataPanel.getSelectionModel().getSelection().length==0){
  330. Ext.hx.msg("提示","请先选择您要复制的行");
  331. return;
  332. }
  333. selectData=(dataPanel.getSelectionModel().getSelection())[dataPanel
  334. .getSelectionModel().getCount()
  335. -1].data;//如果是删除的话需要读取被选中的数据,就初始化被selectData。
  336. }
  337. //如果选择的是新建
  338. if("create"==btn){
  339. //新建的时候设置选择的行为null,没有值。也就不会在创建的panel中显示当前行。此处是因为在复制的时候会去读取。
  340. selectData=null;
  341. }
  342. //如果选择的是复制
  343. if("update"==btn){
  344. selectData=(dataPanel.getSelectionModel().getSelection())[0].data;//先取出所有的记录组成的数组。
  345. }
  346. //如果选择的是删除
  347. if("delete"==btn){
  348. varoneDate;//预设一个用来存放一条数据进行操作的变量
  349. varrecords=dataPanel.getSelectionModel().getSelection();//先取出所有的记录组成的数组。
  350. //判断如果还没有选择任何行就提示并且返回方法
  351. if(records.length==0){
  352. Ext.hx.msg("提示","请先选择您要删除的行");
  353. return;
  354. }
  355. //遍历所有的数组然后设置里面的各种标志
  356. vararray=newArray();//预设一个用来存放新的data的数组
  357. for(vari=0;i<records.length;i++){
  358. oneDate=records[i].data;//取出其中一条
  359. oneDate.deleteFlg=true;//设置删除标志
  360. array.push(oneDate);//放置到数组中
  361. }
  362. //用ajax来进行后台交互
  363. Ext.Ajax.request({
  364. url:'/Training/myProjectInfoController/deleteProjectInfo.action',
  365. method:'POST',
  366. success:function(res,opts){//交互成功的时候
  367. Ext.hx.msg("提示",'删除成功!');//提示
  368. dataPanel.store.load();//表格数据刷新
  369. },
  370. failure:function(res,opts){
  371. Ext.hx.msg("提示",'删除失败!');
  372. },
  373. params:{
  374. jsonString:Ext.JSON.encode(array)
  375. //调用ExtJS内置对象的方法,把数组转换成json字符串
  376. },
  377. scope:this
  378. //作用范围本页。//具体不知道,没用。、
  379. });
  380. return;//执行完成操作马上返回,不执行下面代码。
  381. }
  382. /*下面定义一系列用来输入的文本框*/
  383. deptBoxStore=Ext.create('Ext.data.Store',{
  384. fields:[{
  385. name:'deptId',
  386. type:'String'
  387. },{
  388. name:'deptName',
  389. type:'String'
  390. }],
  391. proxy:{
  392. type:'ajax',
  393. method:'POST',
  394. url:'/Training/DeptInfoController/getAllDeptInfo.action',
  395. reader:{
  396. type:'json',//用json字符串
  397. root:'root'
  398. }
  399. },
  400. autoLoad:true
  401. });
  402. //下面是一个下来选择菜单,用来下拉选择部门。
  403. vardptBox=Ext.create("Ext.form.field.ComboBox",{
  404. fieldLabel:'部门选择',
  405. store:deptBoxStore,
  406. displayField:'deptName',
  407. valueField:'deptId',
  408. allowBlank:false,//不允许为空
  409. editable:false,//不允许编辑
  410. x:10,
  411. y:20
  412. });
  413. //设置上面部门选择的Combox默认值
  414. deptBoxStore.load({
  415. callback:function(records){
  416. dptBox.setValue(workerPanel.getSelectionModel().getSelection().length==0?null:(workerPanel.getSelectionModel().getSelection())[0].data.deptId);
  417. }
  418. });
  419. //各种输入框,制定value(默认值)在没有selectData是null(即if("create"==
  420. //btn)的时候)设置为“”(空字符串),否则分别取出选择行的每一个数据。作为默认数据,
  421. varprojectIdField=Ext.create('Ext.form.field.Text',{
  422. fieldLabel:'项目号',
  423. x:10,
  424. y:20,
  425. value:selectData!=null?selectData.projectId:""
  426. });
  427. varprojectCodeField=Ext.create('Ext.form.field.Text',{
  428. fieldLabel:'项目序号',
  429. x:10,
  430. y:50,
  431. value:selectData!=null?selectData.projectCode:""
  432. });
  433. varprojectNameField=Ext.create('Ext.form.field.Text',{
  434. fieldLabel:'项目名称',
  435. allowBlank:false,
  436. blankText:'不可以为空',
  437. x:10,
  438. y:80,
  439. value:selectData!=null?selectData.projectName:""
  440. });
  441. varconstructionUnitField=Ext.create('Ext.form.field.Text',{
  442. fieldLabel:'建设单位',
  443. x:10,
  444. y:110,
  445. value:selectData!=null
  446. ?selectData.constructionUnit
  447. :""
  448. });
  449. varstartDateField=Ext.create('Ext.form.field.Date',{
  450. format:'Y-m-dh:m:s',
  451. fieldLabel:'开工日期',
  452. blankText:'不可以为空',
  453. allowBlank:false,
  454. x:10,
  455. y:140,
  456. value:selectData!=null
  457. ?selectData.startDate
  458. :newDate()
  459. });
  460. varendDateField=Ext.create('Ext.form.field.Date',{
  461. format:'Y-m-dh:m:s',
  462. fieldLabel:'竣工日期',
  463. blankText:'不可以为空',
  464. allowBlank:false,
  465. x:10,
  466. y:170,
  467. value:selectData!=null
  468. ?selectData.endDate
  469. :newDate()
  470. });
  471. varqualityTargetField=Ext.create('Ext.form.field.Text',{
  472. fieldLabel:'质量目标',
  473. x:10,
  474. y:200,
  475. value:selectData!=null?selectData.qualityTarget:""
  476. });
  477. varprojectLeaderField=Ext.create('Ext.form.field.Text',{
  478. fieldLabel:'项目负责人',
  479. x:10,
  480. y:230,
  481. value:selectData!=null?selectData.projectLeader:""
  482. });
  483. varprojectStatusField=Ext.create('Ext.form.field.Text',{
  484. fieldLabel:'项目状态',
  485. x:10,
  486. y:260,
  487. value:selectData!=null?selectData.projectStatus:""
  488. });
  489. varqualificationField=Ext.create('Ext.form.field.Text',{
  490. fieldLabel:'需要资质',
  491. x:10,
  492. y:290,
  493. value:selectData!=null?selectData.projectStatus:""
  494. });
  495. varsubmitButton=Ext.create('Ext.button.Button',{
  496. text:'确定',
  497. x:10,
  498. y:320,
  499. value:selectData!=null?selectData.projectStatus:"",
  500. handler:function(){
  501. vararr=newArray();
  502. //上面说道的JS的定义对象的方法,
  503. /**
  504. *#######################################注意JS中有如下语法:var
  505. *object={paramter1:value1,paramter2:value2,paramter3:value3}
  506. *object.paramter1可以直接获得value1
  507. *#####################################
  508. */
  509. vardata={
  510. projectId:projectIdField.getValue(),
  511. projectCode:projectCodeField.getValue(),
  512. projectName:projectNameField.getValue(),
  513. constructionUnit:constructionUnitField.getValue(),
  514. startDate:startDateField.getValue(),
  515. endDate:endDateField.getValue(),
  516. qualityTarget:qualityTargetField.getValue(),
  517. projectLeader:projectLeaderField.getValue(),
  518. projectStatus:projectStatusField.getValue(),
  519. qualification:qualificationField.getValue(),
  520. deptId:dptBox.getValue(),
  521. modifyFlg:"update"==btn?true:false
  522. };
  523. //上面定义的data有了projectId,projectCode,······deptId,modifyFlg这些属性,可以直接data.modifyFlg取得值。
  524. if(!confirm("确定?")){//confirm("确定?")弹出对话框,显示确定?点击是的时候返回true,此处判断如果端机否,直接返回方法不执行下面语句。
  525. return;
  526. }
  527. arr.push(data);//把设置好属性的data对象放置到arr数组中。
  528. //用AJAX跟后台交互。
  529. Ext.Ajax.request({
  530. url:'/Training/myProjectInfoController/saveProjectInfo.action',
  531. params:{
  532. jsonString:Ext.JSON.encode(arr)
  533. },
  534. success:function(response){
  535. Ext.hx.msg("提示","成功");
  536. vardialog=Ext.getCmp('theDialog');//Ext.getCmp(String
  537. //comID);传入组件ID,返回组件句柄(内存引用)
  538. dataPanel.store.load();//刷新panel不解释
  539. dialog.close();//把窗体关闭(不显示)
  540. dialog.destroy();//把窗体销毁(清空内存)
  541. },
  542. failure:function(response){//失败提示
  543. Ext.hx.msg("提示","失败");
  544. }
  545. });
  546. }
  547. });
  548. varresetButton=Ext.create('Ext.button.Button',{
  549. text:'重置',
  550. x:70,
  551. y:320,
  552. value:selectData!=null?selectData.projectStatus:"",
  553. handler:function(){
  554. /*
  555. *API上抄来的,不知道什么意思。up(Stringselector):Container
  556. *WalksuptheownerCtaxislookingforanancestor
  557. *Containerwhichmatchesthepassedsimpleselector.
  558. */
  559. this.up('form').getForm().reset();//查找form上面的form(记住这么用吧,说不清楚。仔细看
  560. //innerPanel=
  561. //Ext.create('Ext.form.Panel',
  562. //{
  563. //这句就知道了。)向上找form元素获取form表单,然后重置
  564. }
  565. });
  566. //创建用来进行输入的文本框数组
  567. /**
  568. *此处使用的是Ext.form.Panel目的是为了上面的this.up('form').getForm().reset();
  569. */
  570. innerPanel=Ext.create('Ext.form.Panel',{//创建一个表单控件,
  571. id:'innerPanel',
  572. height:"100%",
  573. width:"100%",
  574. layout:{
  575. type:'absolute'
  576. },
  577. id:'innerPanel',
  578. waitMsgTarget:true,//显示错误提示的小叹号
  579. fieldDefaults:{
  580. labelWidth:85,
  581. msgTarget:'side'//错误提示的字体
  582. },
  583. items:[dptBox,projectCodeField,projectNameField,
  584. constructionUnitField,startDateField,endDateField,
  585. qualityTargetField,projectLeaderField,projectStatusField,
  586. qualificationField,submitButton,resetButton]
  587. });
  588. //准备好一个用来显示窗体的dialog,实际上是一个窗体
  589. vardlalog=Ext.create('Ext.window.Window',{
  590. id:'theDialog',
  591. title:'要点击之后显示的窗体',
  592. height:500,
  593. width:300,
  594. layout:'fit',
  595. items:[innerPanel],
  596. modal:true
  597. //模态窗体,显示的时候不允许操作后面的控件。
  598. });
  599. dlalog.show();
  600. }
  601. //显示一个对话框的方法结束
  602. });


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值