一个礼拜开发出一个栏目(总结/反思)

架构:JEECMS+三大框架

开发人员:1人

1. 数据库设计

涉及到的数据库:nubb_movie(电影)/nubb_movie_type(电影类型)/nubb_movie_year(电影年份)/nubb_movie_area(电影地区)/nubb_movie_tag(电影标签)/nubb_actor(明星)

我不知道该怎么评价自己这一个礼拜的开发效率,尽管在投入编码之前,一再告诉自己,设计好一个数据库非常重要,但是事情做得不尽人意。

对电影栏目这一块的东西,在网上很常见,自己平时看网页的时候也去想怎样去设计这方面的数据库表、怎样去建立表与表之间的关联,这样就按照我自己脑子里想的方式去执行,但是到了整理/编写前台数据时,自己却发现有很多信息没有涉及到,导致回过头来重新加表,加字段!  原因在于自己没和编辑部沟通好,在对方的详细页面出来之后,应该要第一时间去分析功能需求,提出疑问。 

数据库设计总结: 在把握整个功能需要之后,宁可多花时间来设计数据库,也不能跟着自己的感觉走,否则可能导致设计得不够全面,让开发工作断断续续。

2. 开发阶段

中间出现的问题:

 # 映射文件 第一行声明class,其中有个catelog="test" 起初是用的MyEclipse自动生成的实体类和映射文件,多出这么个属性,我就没怎么管。但是到后台操作时,发现插入数据后列表有显示,但在数据表中没有任何记录! 重启服务器也没有用!  通过这一属性值test直面意思就是测试用的,也就是将存储的数据存入本地临时文件中,而并没有存入数据表中。

 # struts 对实体bean的操作,至于简单的set/get赋值,取值的操作我就不细说了,为了减少对数据库的请求次数,我们在对有关联关系的实体类,通常的做法是:

public String add()
    {
        try {
            if(year_id > 0 && area_id > 0){
                try {
                    bean.setYear(myMng.findById(year_id));
                    bean.setMovieArea(areMng.findById(area_id));
                    this.setNubbMovieSet();
                    mMng.save(bean);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }else{
                addActionError("添加失败!年度信息、地区未选择!");
                return SHOW_ERROR;
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return this.list();
    }

在one-to-many的关联中,many的那一方这样做大可不必,直接利用传主键ID的构造,new 出一个新的对象,如:

bean.setYear(new Year(year_id));
bean.setMovieArea(new Area(area_id));
this.setNubbMovieSet();
mMng.save(bean);

这样会不会很好用呢! :)   同理,我们都知道many-to-many从查询到插入、更新的效率都很慢,我们可以添加第三方表转换为one-to-many的关联关系,也能用到上述方法!

 # 多项选择select组件

最近遇到一个新的需求,需要在明星添加页面中,关联多个电影,这样让想到了struts2中有个select多选组件。于是派上用场了:

<tr>
                        <td width="20%" class="pn-flabel pn-flabel-h">
                            电影电视剧:
                        </td>
                        <td width="80%" class="pn-fcontent">
                            <table border="0">
                                <tr>
                                    <td>
                                        <label for="leftTitle">全部明星</label><br/>
                                        搜索:<input type="text" id="search" size="15"/><input type="button" value="搜索" id="searchActors"/><br/>
                                        <select size="15" id="leftSideCartoonCharacters" multiple="multiple">
                                            <option value="-1">--- 全部影片 ---</option>
                                            <#list mlist as t>
                                                <option value="${t.id!}" class="search">${t.zhName!}</option>
                                            </#list>
                                        </select>
                                        <input type="button" 
                                            onclick="moveOptionDown(document.getElementById('leftSideCartoonCharacters'), 'key', 'headerKey');"
                                            value="v"
                                        />
                                        <input type="button"
                                            onclick="moveOptionUp(document.getElementById('leftSideCartoonCharacters'), 'key', 'headerKey');"
                                            value="^"
                                        />
                                    </td>
                                    <td valign="middle" align="center">
                                        <input type="button" value="<-" οnclick="moveSelectedOptions(document.getElementById('rightSideCartoonCharacters'), document.getElementById('leftSideCartoonCharacters'), false, 'doubleHeaderKey', '');" /><br /><br />
                                        <input type="button" value="->" οnclick="moveSelectedOptions(document.getElementById('leftSideCartoonCharacters'), document.getElementById('rightSideCartoonCharacters'), false, 'headerKey', '');" /><br /><br />
                                        <input type="button" value="<<--" οnclick="moveAllOptions(document.getElementById('rightSideCartoonCharacters'), document.getElementById('leftSideCartoonCharacters'), false, 'doubleHeaderKey', '');" /><br /><br />
                                        <input type="button" value="-->>" οnclick="moveAllOptions(document.getElementById('leftSideCartoonCharacters'), document.getElementById('rightSideCartoonCharacters'), false, 'headerKey', '');" /><br /><br />    
                                        <input type="button" value="<*>" οnclick="selectAllOptionsExceptSome(document.getElementById('leftSideCartoonCharacters'), 'key', 'headerKey');selectAllOptionsExceptSome(document.getElementById('rightSideCartoonCharacters'), 'key', 'doubleHeaderKey');" /><br /><br />
                                    </td>
                                    <td>
                                        <label for="rightTitle">已选影片</label><br />
                                        <select name="movie_ids" size="15" multiple="multiple" id="rightSideCartoonCharacters">
                                            <option value="-1">--- 已选影片 ---</option>
                                        </select>
                                        <input type="button" 
                                            onclick="moveOptionDown(document.getElementById('rightSideCartoonCharacters'), 'key', 'doubleHeaderKey');"
                                            value="v"
                                        />
                                        <input type="button" 
                                            onclick="moveOptionUp(document.getElementById('rightSideCartoonCharacters'), 'key', 'doubleHeaderKey');"
                                            value="^"
                                        />
                                    </td>
                                </tr>
                                </table>
                        </td>
                    </tr>

在提交表单时,将选取项以一个数组的形式给Action操作,如下代码:

function checkForm(){
    var selectedComs = document.getElementById("rightSideCartoonCharacters");  
    for(var i=0;i<selectedComs.length;i++){  
        selectedComs.options[i].selected = true;  
    }
    $("#jvForm").submit;
}
$("#searchActors").bind("click",function(){
    var $sou = $("#search").val();
    if($sou == ""){
        alert("搜索内容不能为空!");
        return ;
    }
    $.post("/admin/auxiliary/movieactor/Com_search.htm", 
            { val: $sou },
               function(data){
                   $(".search").remove();
                $("#leftSideCartoonCharacters").append(data);    
                },"html");    
});
</script>
<script type="text/javascript" src="/script/optiontransferselect.js"></script>
    </body>

页面如下:

 

3. 反思

 # 代码重构

简单来说将共用、重用性较高的代码抽取出来。 当然我们也不能觉得重构这东西很方便,一味的借助它。 我觉得:

1. 在找到目前最好的解决方案之后,适当使用重构

2. 可使用常用的设计模式处理业务逻辑,完了以后你再回头看看,有些方法大可不必使用重构的!

3. 利用继承体系来处理,有效的替代重构,比如:咱们对后台数据的增删改查,这就设置一个基类 存在公用的方法,让各个Action子类调用,如果有什么特殊的操作,也能扩展。

 # 前台添加、编辑页面合并公用。

 # 善于利用现有插件提升网页友好度

转载于:https://www.cnblogs.com/xmaomao/p/3199290.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值