最近做的一个项目,遇到的问题及其总结。
项目用的是ssh+maven管理。后台的前端用的是datatables,前台前端是其他小伙伴h5写的,讲真,写的挺烂。
需求:后台管理问卷,三种问卷,计分,统计,投票。
计分类型支持单选多选,单选时可以通过选项跳入自定义的下一题,多选时只能进入下一题,计分类型独特的一点是有每一个选项的分值;
统计类型是在计分类型的基础上排除了分值新增了填空及其他选项(比如三个选项出题者设置了可以选择其他,则答卷人是可以选择其他选项来自己书写的,在完成后,发现设计数据库表时有问题,其他选项应该也设置成一个选项);
投票类型最简单,只有一题,可多选可单选可以选其他。
先总结一下出现的问题及解决方案。
survey-----suerveyQuestion-----suerveyOption三个表,表关联。
1.公司不允许真实删除记录,所以所有的删除功能都改为了修改功能,即在实体类后加delFlag(1删除,0没删除)。
json解析多对一的表会出现循环解析从而导致死循环。如果在getSurveyQuestionList()方法上添加@Transient,在利用网上的代码是没问题的,但是在解析时会将delflag=0和1的都解析出来。
重写getter方法,注意,不要在getSurveyQuestionList()这个基础上改,而是新建一个属性改,后期用新建的这个属性。详见代码:
1 private ListquestionList; 2 3 //取消数据库绑定,因为json解析需要取消关联,所以无法排除deleteflag标识 4 @Transient 5 @OrderBy(clause = "serialNumber asc") 6 public List getQuestionList() { 7 List list=new ArrayList (); 8 if(surveyQuestionList!=null && surveyQuestionList.size()>0){ 9 for(int i=0;i questionList) {19 this.questionList = questionList;20 }
然后解析的时候,见下:
1 Survey surveyFromSql=super.getSurveyService().getSurvey(surveyId);2 //这个是从数据库取的数据,自行判断3 4 //按需求解析实体类,解除绑定5 JsonConfig cfg = new JsonConfig();6 cfg.registerJsonValueProcessor(Date.class, new JsonDateValueProcessor());//设置默认时间格式7 cfg.setExcludes(new String[]{"handler","hibernateLazyInitializer"});8 cfg.setCycleDetectionStrategy(CycleDetectionStrategy.LENIENT);9 JSONObject tmp = JSONObject.fromObject(surveyFromSql,cfg);
2.推荐使用
运用if--else if时最后要加入else判断不存在的情况,在撸码的时候还真存在所有的if没有判断的情况,避免找半天都没找到哪里有问题。
运用的有spring等框架,那么可以用其内部的一些源码,比如Assert,logger等。
能用一句sql,hql解决的绝不用两句。
前期可以不校验空值,但总结的时候必选用Assert校验。
3.前端传参到后台的时候,不支持数组里面套用数组,[[1,2,3],[4,5,6],[7,8,9]]类似于这种。
起初我是将1~9都放在字符串里用逗号隔开然后后台解析,发现真的是麻烦,解决:
1 var answer=new Array();2 3 4 answer[i]={'questionId':questionId,'questionType':type2,'questionName':questionName,'optionId':optionId,'optionName':optionName,"txt":txt};5 6 7 var data={'surveyType':2,'surveyId':surveyId,'title':surveyTitle,'content':JSON.stringify(answer).toString(),'name':name,'mobile':mobile};8 9 //data是ajax的参数
4.其他的都是一些逻辑问题,没什么好总结的。