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

029开发日志(创建ManyToMany的column4)


  根据以上几节的准备,在这一节中可以加入ManyToManyColumn.js了。先来看看做好的样子如下图:
  单击文字链接可以显示该条记录的情况。按下删除按钮则会显示一个提示窗口,询问是否删除此项。


  下面即为ManyToManyColumn.js的代码。
/**
 * 
 * ManyToMany记录的管理,将根据权限设置来显示修改或删除按钮
 * 
 * 蒋锋 2015.12.31
 * 
 */

Ext
		.define(
				'app.module.widget.column.ManyToManyColumn',
				{
					extend : 'Ext.grid.column.Column',
					alias : 'widget.manytomanycolumn',
					minWidth : 200,
					editButtonSpan : '',
					deleteButtonSpan : '',
					manyToManyModuleName : null,
					manyToManyModuleTitle : null,

					initComponent : function() {

						var joinTable = this.fieldDefine.tf_joinTable;
						// 取得joinTable的模块定义
						var joinModule = app.modules.getModule(joinTable);

						// manyToMany 另一端的模块名称,模块的字段名为Set<modulename>,或
						// List<module>,利用正则表达式,取得<>之间的内容。
						this.manyToManyModuleName = /\w+/.exec(/<\w+>/
								.exec(this.fieldDefine.tf_fieldType)[0])[0];
						this.manyToManyModuleTitle = app.modules
								.getModule(this.manyToManyModuleName).tf_title;

						// 如果有可以修改joinTable值的权限,那么就加上前面的一个可以修改的按钮。
						if (joinModule.tf_userRole.tf_allowEdit) {
							this.editButtonSpan = '<span class="manyToManyEdit fa fa-edit"></span>';
						}
						// 如果可以删除的话,加上可以删除的按钮。
						if (joinModule.tf_userRole.tf_allowDelete) {
							this.deleteButtonSpan = '<span class="manyToManyContextClose fa fa-close"></span>';
						}
						this.callParent();
					},

					renderer : function(val, metaData, model, row, col, store, gridview) {
						if (val) {
							// "0000,管理员,1700|||0005,市级管理员,1701|||0010,查询角色,1702" ,
							// 第三个值表示joinTable的主键
							var records = val.split('|||');
							var column = gridview.headerCt.getGridColumns()[col];
							var tpl = new Ext.Template(column.editButtonSpan
									+ '<span class="manyToManyTD">{val}</span>');
							var result = '';
							for ( var i in records) {
								var fields = records[i].split(',');
								result += '<span class="manyToManyContext" _id="' + fields[0]
										+ '" _joinid="' + fields[2] + '">' + fields[1] + '</span>'
										+ column.deleteButtonSpan;
							}
							return tpl.apply({
								val : result
							});
						}
					},

					processEvent : function(type, view, cell, recordIndex, cellIndex, e,
							record, row) {
						var me = this;
						if (type === 'click') {
							if (e.getTarget().className === 'manyToManyContext') {
								app.modules.showModuleRecord(this.manyToManyModuleName, e
										.getTarget().getAttribute('_id'));
							} else if (Ext.String.startsWith(e.getTarget().className,
									'manyToManyContextClose')) {
								// 点击了删除按钮,先找到前面一个节点,里面包含了要删除的信息
								var target = e.getTarget().previousElementSibling;
								var module = this.up('modulegrid').module;
								var text = module.tf_title + ' ' + record.getTitleTpl() + ' 的 '
										+ this.manyToManyModuleTitle + '【' + target.innerHTML + '】';
								Ext.MessageBox.confirm('确定删除', '确定要删除' + text + '吗?', function(
										btn) {
									if (btn == 'yes') {
										// 使用module里面批量删除的ajax
										Ext.Ajax.request({
											url : 'rest/module/removerecords.do',
											params : {
												moduleName : me.fieldDefine.tf_joinTable,
												ids : target.getAttribute('_joinid'),
												titles : target.innerHTML
											},
											success : function(response) {
												var info = Ext.decode(response.responseText, true);
												if (info.resultCode == 0) {
													Ext.toastInfo(text + ' 已成功被删除。');
													// 删除记录后,刷新当前记录
													me.up('modulegrid').refreshSelectedRecord();
												} else {
													Ext.MessageBox.show({
														title : '删除结果',
														msg : text + '删除失败:<br/><br/>'
																+ info.errorMessageList,
														buttons : Ext.MessageBox.OK,
														icon : Ext.MessageBox.ERROR
													});

												}
											},
											failure : function() {
												window.alert('删除时,服务器返回返回错误');
											}
										})
									}
								});
							} else if (Ext.String.startsWith(e.getTarget().className,
									'manyToManyEdit'))
								console.log('编辑当前记录的manyToMany字段');
						}
					}
				})

  另外需要在WebContent/sass/src/module/widget/column的目录下建立css文件 ManyToManyColumn.scss 文件,然后用sencha 命令编译一下即可把scss加入到主css文件中。
.manyToManyTD {
	white-space: pre-line;
	word-wrap: break-word;
}


.manyToManyEdit {
	cursor: pointer;
	font-size: 12px;
}



.manyToManyContext {
	margin-left : 3px;
	cursor: pointer;
	text-decoration: underline;
	color : #11264f;
	white-space:nowrap;
}

.manyToManyContextClose {
	cursor: pointer;
	font-size: 9px;
	vertical-align: super;
}

  按下编辑按钮后的选择当前记录的ManyToMany值的窗口下节做。

  既然ManyToMany是双向的,我们既然可以在用户模块中管理操作角色,那么也应该能在操作角色里面控制用户。下面只要配置一下就可以了,并不需要修改任何代码。_Role中的@ManyToMany字段可以加,也可以不加。下面只需二步就可以在用户角色中加入用户的ManyToMany控制。
  1、给用户操作色色_Role,添加一个如下字段:
  2、在用户操作角色的grid方案中加入这个用户列表字段即可。

  下图即为用户操作角色的grid。


  以后所有的ManyToMany字段都可以通过配置来进行操作了。





  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
ManyToMany是关系型数据库中的一种关联关系,它表示两个实体类之间的多对多关系。通过中间表来存储两个实体类之间的关联关系。 在使用ManyToMany关系时,我们可以通过两种参数来进一步配置关系。第一个参数是through参数,它指定了中间表的名称。通过这个参数,我们可以自定义中间表的名称和字段。第二个参数是through_fields参数,它指定了中间表中哪些字段用来表示两个实体类的关系。 例如,在Django中,我们可以使用@ManyToMany注解来定义ManyToMany关系。被控方的代码示例如下:@ManyToMany(fetch = FetchType.LAZY, mappedBy = "students") public Set<Teacher> getTeachers() { return teachers; } 通过使用@ManyToMany注解,我们可以指定fetch参数来定义关联关系的加载策略,以及通过mappedBy参数来指定关联关系的所有者方。 总之,ManyToMany关系是一种常见的关联关系,它可以用于表示两个实体类之间的多对多关系。通过配置through和through_fields参数,我们可以自定义中间表的名称和字段,从而更好地管理ManyToMany关系。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [Django笔记七之ManyToMany和OneToOne介绍](https://blog.csdn.net/weixin_43354181/article/details/122897334)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *2* [(转)ManyToMany注解](https://blog.csdn.net/u012102536/article/details/88995200)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] - *3* [基于django ManyToMany 使用的注意事项详解](https://download.csdn.net/download/weixin_38599545/12860677)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_1"}}] [.reference_item style="max-width: 33.333333333333336%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值