常规功能和模块自定义系统 (cfcmms)—032开发日志(用GoJS来绘制模块关系图)

032开发日志(用GoJS来绘制模块关系图)

  本系统现在尚没有流程和图表的功能,现在感觉在操作模块的各种功能的时候如果有一个模块关系图,那么就会更直观。网上找了一些绘制图表的库,看了一下GoJS也不错,入门也比较容易。经过一些工作,对业务模块作了一个简单的关系图。

  GoJS的基础知识请看官网的介绍,在上面的模块图中,有模块节点和连线二种信息需要定义。用户业务模块数据都是由后台组织好后发送到前台的。

  整个绘制流程图的界面模块是一个Panel,在render的时候从后台加载数据,然后绘制。js类如下:

Ext.define('app.view.main.widget.Gojs', {

	extend : 'Ext.panel.Panel',
	title : '业务模块图',

	iconCls : 'fa fa-star',

	listeners : {
		render : function(panel) {
			panel.drawHierarchy();
		}
	},
	layout : 'fit',
	items : [ {
		xtype : 'container',
		id : 'myDiagramDiv'
	} ],

	drawHierarchy : function() {

		var modules, moduleshierarchy;
		// 从后台取得用户模块的Ajax请求
		Ext.Ajax.request({
			url : 'modulehierarchy/allmodule.do',
			async : false,
			success : function(response) {
				modules = Ext.decode(response.responseText, true)
			}
		});
		// 从后台取得用户模块关联关系的Ajax请求
		Ext.Ajax.request({
			url : 'modulehierarchy/allmodulehierarchy.do',
			async : false,
			success : function(response) {
				moduleshierarchy = Ext.decode(response.responseText, true)
			}
		});

		var $ = go.GraphObject.make;
		this.$ = $;
		var diagram = $(go.Diagram, "myDiagramDiv", {
			initialContentAlignment : go.Spot.Center, // center Diagram contents
			"undoManager.isEnabled" : true,
			// enable Ctrl-Z to undo and Ctrl-Y to redo
			scale : .8,
			doubleClick : function() {
				console.log('doubleClick');
			},
			layout : $(go.TreeLayout, { // this only lays out in trees nodes
				// connected by
				// "generalization" links
				angle : 270,
				path : go.TreeLayout.PathSource, // links go from child to parent
				setsPortSpot : false, // keep Spot.AllSides for link connection
				// spot
				setsChildPortSpot : false, // keep Spot.AllSides
				// nodes not connected by "generalization" links are laid out
				// horizontally
				arrangement : go.TreeLayout.ArrangementHorizontal
			})

		});
		this.diagram = diagram;
		diagram.nodeTemplate = $(go.Node, "Auto", $(go.Shape, {
			fill : $(go.Brush, go.Brush.Linear, {
				0 : "white",
				1 : "lightblue"
			}),
			stroke : "darkblue",
			strokeWidth : 1
		}), $(go.Panel, "Table", {
			defaultAlignment : go.Spot.Left,
			margin : 4
		}, $(go.RowColumnDefinition, {
			column : 1,
			width : 4
		}),

		$(go.TextBlock, {
			row : 0,
			column : 0,
			columnSpan : 3,
			alignment : go.Spot.Center
		}, {
			font : "bold 12pt sans-serif"
		}, new go.Binding("text", "title"), new go.Binding("stroke", "color")),

		$(go.TextBlock, "模块名称: ", {
			row : 1,
			column : 0
		}), $(go.TextBlock, {
			row : 1,
			column : 2
		}, new go.Binding("text", "moduleName"))));

		diagram.model = new go.GraphLinksModel(modules, moduleshierarchy);

	}

})

  后台的提供数据的java代码:

</pre><pre name="code" class="java">package com.jfok.cfcmms.controller.moduleHierarchy;

import java.util.List;

import javax.annotation.Resource;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;

import com.jfok.cfcmms.service.ModuleHierarchyService;

import net.sf.json.JSONObject;

@Controller
@RequestMapping("/modulehierarchy")

public class ModuleHierarchyController {

  @Resource
  private ModuleHierarchyService moduleHierarchyService;

  @RequestMapping("/allmodule.do")
  public @ResponseBody List<JSONObject> getAllModule() {

    return moduleHierarchyService.allModulesInfo();

  }

  @RequestMapping("/allmodulehierarchy.do")
  public @ResponseBody List<JSONObject> getAllModuleHierarchy() {

    return moduleHierarchyService.allModulesHierarchyInfo();

  }
}
package com.jfok.cfcmms.service;

import java.util.ArrayList;
import java.util.List;

import org.springframework.stereotype.Service;

import com.jfok.cfcmms.hibernate.system.module._Module;

import net.sf.json.JSONObject;

/**
 *
 * 模块之间层次关系的Service,用于提供gojs的显示模块的总结构图,和每一个模块的图。
 *
 * @author jiangfeng
 *
 */

@Service
public class ModuleHierarchyService {

  /**
   * 返回所有的业务模块
   * @return
   */
  public List<JSONObject> allModulesInfo() {
    List<JSONObject> result = new ArrayList<JSONObject>();
    for (_Module module : SystemAndLoginInfoService.getModules()) {
      if (!module.getTf_moduleName().startsWith("_")) {
        JSONObject m = new JSONObject();
        m.put("moduleName", module.getTf_moduleName());
        m.put("key", module.getTf_moduleName());
        m.put("title", module.getTf_title());
        m.put("moduleId", module.getTf_moduleId());
        result.add(m);
      }
    }
    return result;
  }

  /**
   * 返回所有的业务模块之间的关联关系
   * @return
   */
  public List<JSONObject> allModulesHierarchyInfo() {
    List<JSONObject> result = new ArrayList<JSONObject>();
    for (_Module module : SystemAndLoginInfoService.getModules()) {
      if (!module.getTf_moduleName().startsWith("_"))
        for (_Module pm : module.getParents()) {
          JSONObject m = new JSONObject();
          m.put("from", pm.getTf_moduleName());
          m.put("to", module.getTf_moduleName());
          result.add(m);
        }
    }
    return result;
  }
}

  第一个返回所有module ,数据如下:

[{"moduleName":"Customer","key":"Customer","title":"客户单位","moduleId":"6010"},{"moduleName":"Salesman","key":"Salesman","title":"业务员","moduleId":"6020"},{"moduleName":"Product","key":"Product","title":"商品","moduleId":"6030"},{"moduleName":"Orders","key":"Orders","title":"订单","moduleId":"6040"},{"moduleName":"OrdersDetail","key":"OrdersDetail","title":"订单明细","moduleId":"6050"},{"moduleName":"Province","key":"Province","title":"省份","moduleId":"7010"},{"moduleName":"City","key":"City","title":"市","moduleId":"7012"},{"moduleName":"Rate","key":"Rate","title":"客户等级","moduleId":"7014"},{"moduleName":"Trade","key":"Trade","title":"行业","moduleId":"7016"},{"moduleName":"ProductClass","key":"ProductClass","title":"商品类别","moduleId":"7018"},{"moduleName":"Storage","key":"Storage","title":"商品仓库","moduleId":"7020"}]

  第二个返回模块关联关系,数据如下:

[{"from":"City","to":"Customer"},{"from":"Trade","to":"Customer"},{"from":"Rate","to":"Customer"},{"from":"_Department","to":"Salesman"},{"from":"ProductClass","to":"Product"},{"from":"Customer","to":"Orders"},{"from":"Salesman","to":"Orders"},{"from":"Storage","to":"Orders"},{"from":"Orders","to":"OrdersDetail"},{"from":"Product","to":"OrdersDetail"},{"from":"Province","to":"City"}]

  上面的例子只是一个最基本的模块图。以后会加入各种操纵。比如选择筛选条件,导航等等功能。加入图表的一个更重要的原因是现在的模块关系已经不能适合复杂系统的需求,下面将会对模块关联关系进行升级,在升级过程中模块图就是一个重要的操作工具。

时间: 2024-10-28 10:15:32

常规功能和模块自定义系统 (cfcmms)—032开发日志(用GoJS来绘制模块关系图)的相关文章

常规功能和模块自定义系统 (cfcmms)—030开发日志(创建ManyToMany的column5)

030开发日志(创建ManyToMany的column5) 现在对于这个字段来说,还剩最后一个功能了,那就是可以修改ManyToMany的值了.在grid的inline操作里面,是可以直接删除已有值,但是如果要新增的话,就必须要有一个新的界面了.下面来看看开发修改ManyToMany字段所需要的步骤. 1.创建一个修改窗口,在里面创建一个可check的树: 2?到后台请求数据,读取当前记录的所有的ManyToMany的可选项,并把已经选中的打勾: 3?根据读取到的数据更新树: 4?用户操作che

常规功能和模块自定义系统 (cfcmms)—029开发日志(创建ManyToMany的column4)

029开发日志(创建ManyToMany的column4) 根据以上几节的准备,在这一节中可以加入ManyToManyColumn.js了.先来看看做好的样子如下图: 单击文字链接可以显示该条记录的情况.按下删除按钮则会显示一个提示窗口,询问是否删除此项. 下面即为ManyToManyColumn.js的代码. /** * * ManyToMany记录的管理,将根据权限设置来显示修改或删除按钮 * * 蒋锋 2015.12.31 * */ Ext .define( 'app.module.wid

常规功能和模块自定义系统 (cfcmms)—007Extjs的配置文件和自定义ui

常规功能和模块自定义系统 (cfcmms)-007Extjs的配置文件和自定义ui 一.在自动生成的项目中,文件 app.json 是整个前台系统的配置文件,可以在里面增加或修改配置参数来完成相应的功能.该文件的部分参数如下: { "name": "cfcmms", //项目命名空间 "version": "1.0.0.0", //项目版本号 "indexHtmlPath": "index.htm

常规功能和模块自定义系统 (cfcmms)—018自定义grid方案(2)

常规功能和模块自定义系统 (cfcmms)-018自定义grid方案(2) 下面来看看在系统中如何定义一个grid方案.当前定义grid方案也是采用对记录模块操作的方式,并没有采用所见即所得得的设计方式,以后有时间将会修改成所见即所得得方式. 上图中可以看到在进入了"模块列表方案"后,会显示所有的模块的列表方案,在导航里选择了"省份"这后,会只显示省份的2个列表方案.每个方案都有若干个字段组,选中一条记录以后,按"列表字段分组"可以看到当前方案的

常规功能和模块自定义系统 (cfcmms)—015模块自定义概述(2权限)

常规功能和模块自定义系统 (cfcmms)-015模块自定义概述(2权限) 模块的权限的自定义也是这个系统的重要部分.在本系统中现在模块的权限有三大类:模块操作权限.记录可视范围限定.附加操作权限. 模块操作权限:可以对模块进行浏览.新增.修改.删除.审核.审批等的设置.可以通过生成和隐藏相应的按钮来具体控制权限的设置.如某人无删除权限,则在该模块的操作界面上没有删除按钮.对于一般的管理系统而言这些功能基本上是够用了. 记录可视范围限定:可以在任意模块加上可视范围的限定.在某个父模块上加上可视范

常规功能和模块自定义系统 (cfcmms)—009主界面和菜单的展示和控制(1)

常规功能和模块自定义系统 (cfcmms)-009主界面和菜单的展示和控制(1) 先从主界面和菜单.主tab标签以及一些附加的设置说起. 一个比较传统的管理软件中,一般会包括一个顶部区域.底部区域.菜单条(树状菜单)和主操作区域.本系统亦是如此,只是增加了一点灵活控制的地方.首先来看看本系统中的界面布局和extjs的类之间的对应关系,extjs中的面象对象的功能已经比较完善了,现在开发b/s程序就和我以前用组件开发delphi系统差不多,建好一个个组件类,然后直接使用即可. 和主界面.菜单相关的

常规功能和模块自定义系统 (cfcmms)—008测试试用版(6.0.0)下载及使用

常规功能和模块自定义系统 (cfcmms)-008测试试用版(6.0.0)下载及使用 在经过了一些调试和优化后,现在可以下载和测试试用版(6.0.0).在这个版中本主界面和菜单改用了mvvm方式来显示和控制. 程序和数据下载地址:http://pan.baidu.com/s/1c0sIGPq 所用到的java包下载地址:http://pan.baidu.com/s/1kTF5cIN 安装说明: 程序和数据下载好后解压缩,在eclipse中导入即可.数据库采用mysql,先用命令 CREATE S

常规功能和模块自定义系统(cfcmms)—004可自定义的项目

常规功能和模块自定义系统(cfcmms)-004可自定义的项目 可以在前台浏览器里可进行的配置项目如下图: 版权声明:本文为博主原创文章,未经博主允许不得转载.

常规功能和模块自定义系统 (cfcmms)—019自定义grid方案(3)

常规功能和模块自定义系统 (cfcmms)-019自定义grid方案(3) 这一节开始进入自定义的内部,来看看第一个自定义的功能是如何实现的. 1?在系统登录的时候,将所有的登录用户有权限的模块定义信息全部发送到前端.这段代码在app/view/main/MainModel.js中.在MainModel创建的时候,通过会发送一个同步的ajax请求来获取数据.取得数据后将所有的module信息放到MainView的data中. Ext.Ajax .request({ url : 'applicat