图可以包含的寓意和含义是文字不能比拟的,先有一个效果图你也就知道这篇文章的主要内容是关于什么问题的,省去了一大堆文字的累述,看下面这张图:
这个需求就是要实现某个人具有另外一种特性,具有多对多关系,比如某个人既喜欢运动、有喜欢上网等等,这样类似的需求在几乎在每个系统里面都有设计,而且很多框架都实现了这样的功能,如果让自己去实现就需要自己从建立表、逻辑、以及界面JS都需要自己手动去写,下面是说下我的设计思路。
设计思路
将多个checkbox放到一个div元素中,利用jquery的函数进div和checkbox进行控制选取,取值和赋值可以写一个循环既可以完成,至于表单提交既可以利用form标签调教,也可以利用jquery的ajax方式提交,在对用户体验度要求高的系统中最好使用ajax方式提交,这是界面的设计部门,另外还有数据库表的建立,我在做数据库表时觉得很简单但也遇到了一些问题。
数据库需要建立一张关系表来存储多对多关系,大家都知道到,需要注意的是在这张关系表里面怎么存储,即多个复选框的ID是存储在一个字段里面还是一个ID一条记录呢,这两种方式都可以实现;如果存储在一个字段里面就需要把处理这个字段的逻辑写在java类里面,我在做表单时从表单界面直接到数据库SQL语句,中间逻辑已经封装不可以修改,因此只能把IDS存在一个字段里面,感觉这种方式实现也挺快,减少了逻辑。
如下有两张表fcs_checkitem、fcs_useritem,fcs_useritem为关系表它的itemids字段保存了fcs_checkitem表的itemid数组,想利用下面嵌套语句查询:
SELECT * FROM fcs_checkitem WHERE itemid IN ( SELECT itemids FROM fcs_useritem WHERE userid='00000075' )
经测试这样写并不能查询出结果,因为里面嵌套的查询返回的结果是一个逗号隔开的字符串数据(001,002,,003),如果手动写一个这样的数据是可以查询出来的,但是这样动态的方式是查不出来的,上网查发现mysql是不支持这样动态查询的,发现有另一种思路实现这种关键字 “IN” 的功能。
SELECT group_concat(b.itemname) as itemnames FROM fcs_useritem a, fcs_checkitem b WHERE CONCAT(CONCAT(',',a.checkid),',') LIKE CONCAT(CONCAT('%,',b.itemid),',%') AND a.userid=':{$urlParam("formid")}:'
上面利用了concat()以及group_concat()这两个函数,它原理是可以用几个字理解:用LIKE 实现IN的功能。
这样的例如有两张表A和表B,A表的一个字段ids是B表字段id的数组,那么给B.id两天加上%,让A.ids字符数组两端加上逗号,拿一个具体的数字举个例子即是,1,去匹配,1,2,3,这个字符串,只要找到一个匹配的就会返回一条记录,用这种方式实现类似于in的查询。
Concat()函数
这个函数常用语连接多个字符串,例如
String Str1="世界";
String str2="你好"
Str3=concat(str1,str2);
Str3="世界你好",这个函数把这两个字符串连接了起来,有时会觉得很有用;
Group_concat()函数,看一下效果
这是一个简单的查询结果,再看一下使用这个函数的效果
该函数实现了将表中查出的某一列数据,转换成一个字符串数组,如上图所示,如果你就是想把查出的某一列转为字符串数组会很有用。
这个多选可以封装为一个颗粒、把公共的东西抽象出来弄成一个个的颗粒,把它封装为一个控件,这个控件有自己的函数获得checkbox值和赋值等方法,还可以封装一些样式等,还在考虑怎么才能把checkbox封装到div标签中,以后再用到时只需要引入这个div标签即可,通过div标签传参控制多选,这涉及到自定义标签怎么弄,在.NET中可以开发用户自定义控件,那么在标签中觉得也是可以开发自定义标签库,还有类似于下拉列表框等等,都可以封装起来。
不知道还有没有别的思路可以实现用户控件、或标签的封装?开发自定义标签查了一下好实现,把开发jar包引入进来实现几个接口就可以定义自己的标签库了,开发自定义标签库可以实现用户自定义功能,方便页面上的布局,同时发现现在的很多产品有关界面框架,无论界面多美观、高端大气,都是封装原始的html标签元素,封装也就意味着可以带了自己心的特性,如果有特殊需求的时候可以自己适当封装一下。
方便别人编程、也提高了开发效率和编码的灵活性。