在工作室框架下开发的体会与心得

        感觉好久没写博客啦···有么?好的吧,起始感觉我写的博客基本是给我自己看的,感觉别人看的概率会比较下吧,废话不多说,写一下这几点在工作室做项目的心得吧(我是做网站后端的)。心得如下:

         1.感觉做网站的过程中如过只会做后端的话光开发后端应该没问题,比较简单,个人感觉难的地方在于套页,因为关于前台的知识了解甚少,有些东西虽然是前台的但是个人感觉后台也必须掌握,这样才能在拿到页面后作出相应的调整然后完成套页。

          2.说一下此次开发的心路历程吧,这次是头一次跟着学长学姐们一起做项目,用的是工作室框架,我负责的是一个小的模块,菜品成本卡模块,但是成本卡编写这块不是我写的,我负责的就是将成本卡展示出来,一个菜品的成本卡包括成本卡编号,菜品名称,主料成本,辅料成本,调料成本和总成本,菜品名称和其它属性不在同一个表,就在两个表中,通过菜品的id便可进行关联查询,这点到没什么,顺便在网上了解了一下LEFT JOIN 和RIGHT JOIN,因为在看学长他们编写的代码中经常有左外连接和右外连接,虽然学数据库的时候学了,但是好久没用给忘记了,于是看了一下,简单的说就是LEFT JOIN的时候左表的属性不为空,右面连接的表的属性可能为空,RIGHT JOIN的时候相反。

          3.工作室开发网站的时候有前端访问地址和后端访问地址,后端需要什么页面的时候可以到前端访问地址下看,看页面在哪个文件夹下的什么位置,还有就是点击按钮发送的是什么请求,我们是用GIT开发的,本以为pull一下前端的页面如果做好了会出现在项目中,但是我想多了,前端的页面是需要自己用GIT再拷贝到一个文件夹下的!拷贝的时候2B了,没加分支,但是我也不知道是有分支了,git命令如下:git clone http://XXXXXX -b develop 这样便拷贝了正确的前端网页,前端做好了是以HTML的形式给出的,工作室前端采用的是一个整合的框架(具体先这么说吧···有一个叫法但是忘记了),就是在一个JSP页面中把body和script引入,body和script全在html中,script在下面,刚开始找了半天没找到,把body和script放入到两个jsp文件中,然后再引入即可,页面便形成啦。

           4.启动项目,我发现没有我的这个页面对应的按钮,工作室的页面中有一个header和sidebar,表示的是上面的标签和右边的标签,都没有,这个时候就要自己找到前端代码往里面加东西啦,不会加没关系,可以参照别的是什么样的,然后复制粘贴,改一改就好啦!代码:

<li <c:if test="${PWModule eq 'Admin:DishManagement'}">class="active" </c:if> >
    <a class="menu-list J_layer_1_menu" data-menu-id="3" href="javascript:;">菜品管理</a>
    <ul class="dropdown-menu arrow" aria-labelledby="dLabel">
        <li><a class="J_menu" href="${website}admin/dish/unit">菜品单位管理</a></li>
        <li><a class="J_menu" href="${website}admin/dish/tag">菜品分类管理</a></li>
        <li><a class="J_menu" href="${website}admin/dish/taste">菜品口味管理</a></li>
        <li><a class="J_menu" href="${website}admin/dish">菜品管理</a></li>
        <li><a class="J_menu" href="${website}admin/dish/cost/card">菜品成本卡管理</a></li>
        <li><a class="J_menu" href="${website}admin/dish/package">套餐管理</a></li>
        <li><a class="J_menu" href="${website}admin/dish/feature">本店特色</a></li>
    </ul>
</li>
菜品成本卡管理是我添加的,顺便在这里配置下controller的地址,这个是header部分。

<c:if test="${PWModule eq 'Admin:DishManagement'}">class="active" </c:if>

这段代码很重要,是关于权限显示页面的代码,简单的就是说你只有

'Admin:DishManagement'
这个权限的时候,才会显示这个下拉列表,这个权限在后端的话是用@Module注解来配置的,代码如下:

@Module(value = ModuleEnums.AdminDishManagement)
@Module(value = ModuleEnums.AdminDishCostCard, extModule = ModuleEnums.AdminDishCostCardList)
两个权限底下的这个得exModule个人理解为是把权限更加细化了,或者是说告诉你更具体的权限,但是整体还是在大的权限下,权限的字符串是以常量的形式定义在了ModuleEnums里面。

ps:···听到后面学长在讨论我写的那个了,其实在我写的时候就感觉有问题,菜品成本卡管理部应该在菜品管理的目录下么,就是在几级目录下,菜品成本卡管理放在菜品管理下面,但是我问宝荣的时候宝荣说直接写上去就行,不是放在那下面···好的吧,看来有时候跟着自己感觉走才对!

接下来附上sidebar的代码:

<li <c:if test="${MethodModule eq 'Admin:DishManagement:CostCard'}">class="active" </c:if>>
    <a class="J_menu" href="${website}admin/dish/cost/card">菜品成本卡管理</a>
</li>
<li <c:if test="${MethodModule eq 'Admin:DishManagement:Package'}">class="active"</c:if> >
    <a class="J_menu" href="${website}admin/dish/package">套餐管理
        <c:if test="${ExtModule eq 'Admin:DishManagement:Package:New'
                    or ExtModule eq 'Admin:DishManagement:Package:Update'}">
            <i class="fa fa-angle-right angle-right"></i>
        </c:if>
    </a>
    <c:if test="${ExtModule eq 'Admin:DishManagement:Package:New'
                    or ExtModule eq 'Admin:DishManagement:Package:Update'}">
        <ul>
            <li <c:if test="${ExtModule eq 'Admin:DishManagement:Package:New'}">class="active"</c:if> >
                <a href="${website}admin/dish/package/new" >添加套餐</a>
            </li>
            <c:if test="${ExtModule eq 'Admin:DishManagement:Package:Update'}">
                <li class="active"><a href="${website}admin/dish/package/update">编辑套餐</a></li>
            </c:if>
        </ul>
    </c:if>
</li>
还是仿照这个页面已经有的代码写。之后写一个controller方法返回页面就好啦,但是返回的页面前端需要收到菜品分类的数据,这个要我们后台给前端返回去,如何返回去呢?就是用
model.addAttribute("tagList",tagList);
,在前端就可以通过${tagList.XXX}在获取。问题还没有解决,前端自己测试的时候是把这个东西写死了,就是没用到我们给它返回去的东西,而且我返回的是个Lisi,我不知道前端怎么改才能一条一条把我返回的结果显示出来,这里用到了foreach循环··这个不是前端的么?为啥写的时候不直接写好么··好的吧 写好的话可能前端测试不了吧?所以后台还是要知道一些关于前端的知识的···附上代码:

<div class="checkbox block">
   <label>
      <input class="J_selectAll"  type="checkbox" value="0" name="bigTag"> 全部大类
   </label>
   <c:forEach var="tag" items="${tagList}">
   <label>
      <input class="J_selectAll"  type="checkbox" value="${tag.id}" name="tagIdList"> ${tag.name}
   </label>
   </c:forEach>
</div>
之后启动项目,发现页面显示的不对,参照了已经写好的页面,发现自己多了三个div标签,于是把标签去掉了就对了,但是左侧的sidebar不显示,原因就是我说的那个权限问题,在Controller方法里把权限配置了就好啦。

           5.到了页面,使用ajax来刷新页面的,分页是用KISSY写的,配置的地址在KISSY里面,把里面的地址改成Controller的地址,有的时候发送的请求地址会写在配置文件里,反正要自己找一找这个url到底写在哪里然后改了,有的时候还可能就是这个地址没写url:javascript;例如表单提交,这个时候需要自己配置地址。

            6.这个主页面上面有个搜索,前面说过了后台把菜品的分类回传给前台,点击搜索按钮的ajax和直接进入页面的ajax是相同的,地址是一样的,搜索里面还有可以根据菜品名称,或者菜品的助记码搜索菜品的成本卡,这时候我就蒙了,对了,还要补充一点,ajax要完成分页的话前端还要返回一个页数号码,在kissy里面本来知道返回一个url,但是为了分页需要改成url+'/'+page就可以了。继续说搜索的问题,之前没做过这样的刷页,后来想想其实也不难,就是把搜索条件作为参数然后重新写一个dto类用来接收这些参数就行,如果搜索里面没选择任何条件,这个用来搜索的dto就为null呗,然后根据这个dto和offset(用来分页的偏移量)写一个sql语句,Controller方法的头是这样写的:

@Module(value = ModuleEnums.AdminDishCostCard, extModule = ModuleEnums.AdminDishCostCardList)
@RequestMapping(value = "/ajax/list/cost/card/{pageNo}",method = RequestMethod.GET)
@ResponseBody
public JSONObject ajaxListCostCard(@PathVariable("pageNo") Integer pageNo
                                  ,@RequestParam("pageSize") Integer pageSize
                                    ,DishSearchDto searchDto)throws SSException
searchDto用来接收搜索参数,这里有一点很神奇,例如前端传来的参数叫keyword,在DishSearchDto类里面只要有一个keyword的参数就可以接收到这个参数,综上,所有的搜索条件都会传到searchDto里面,前端页面要获取的成本卡对象没有这个类能包含这些属性,所以可以再建一个类CostCardDto,用来传递前端需要的参数。

虽然前端的参数接收到了,刚开始以为接收到的菜品名称会给到类里面的name属性,但是前端哪里知道它就是菜品名称不是助记码呢,所以这个参数只会给到keyword里,事实也是如此,前端传递的参数就叫keyword,菜品类别的话给传递给searchDto里面的一个数组了,sql语句查询的时候查询出的菜品要在这些分类里,刚开始不会写,问了下宝荣,宝荣说用in就行,真是太久没接触sql语句了,但是在mybitas下好像不能直接写in,因为是用和searchDto里面tagList的属性一个一个的进行对比吧,不可能直接写一个in {searchDto.tagList},这时候我并不知道怎么写,还好有学长的例子,针对这种复杂查询我也是学到了不少东西,sql代码如下:

<select id ="queryCostCardDto" resultType="CostCardDto">
    SELECT t_cost_card.id as id,t_dish.name AS name,assistant_code AS assistantCode
    ,cost_card_number AS costCardNumber,main_cost AS mainCost
    ,assist_cost AS assistCost,delicious_cost AS deliciousCost
    ,standard_cost AS standardCost
    FROM  t_cost_card LEFT JOIN t_dish
    ON t_dish.id = t_cost_card.dish_id
    LEFT JOIN t_dish_tag
    ON t_dish.id = t_dish_tag.dish_id
    <where>
        <if test="searchDto.keyword != null and searchDto.keyword !='' ">
            (
              t_dish.name LIKE "%"#{searchDto.keyword}"%"
              OR t_dish.assistant_code LIKE "%"#{searchDto.keyword}"%"
            )
        </if>
        <if test = "searchDto.tagIdList != null and searchDto.tagIdList.size >0 ">
            AND t_dish.tag_id IN
            <foreach collection="searchDto.tagIdList" item="tagId" open="(" separator="," close=")">
                #{tagId}
            </foreach>
        </if>
    </where>
    <if test="offset >= 0 and searchDto.pageSize > 0">
        LIMIT #{offset}, #{searchDto.pageSize}
    </if>
</select>
第一个if标签用来判断搜索的关键字为不为空,不为空则把这个拼接到sql语句中,
LIKE "%"#{searchDto.keyword}"%"
这个是进行模糊查询的写法,第二个if用来判断菜品分类是否为空,不为空则判断菜品的类别在不在这些分类中,因为是拼接,所以别忘了写AND

 <foreach collection="searchDto.tagIdList" item="tagId" open="(" separator="," close=")">
                #{tagId}
            </foreach>
这个便是遍历数组里面的id,看菜品的id是不是其中的一个。

<if test="offset >= 0 and searchDto.pageSize > 0">
        LIMIT #{offset}, #{searchDto.pageSize}
    </if>
最后这个LIMIT就是分页啦,要判断一下偏移一定要大于等于0,显示的数据个数呢要大于0个。


            于是此次开发任务终于完成啦,第一次跟着工作室开发就学到了这么多东西也是不容易啊!哈哈哈!




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值