学习品优购总结[七](商品修改与审核)

查询商家商品列表

为了防止登录的商家查询到不是自己的商品,需要获取当前商家id作为查询商品的条件,但是通过代码生成器生成的代码条件查询中的条件都是模糊查询,防止两个商家的名称是包含关系,所以将模糊查询改为精确匹配:

	    //获取商家ID       web层中
		String sellerId = SecurityContextHolder.getContext().getAuthentication().getName();
		//添加查询条件 
		goods.setSellerId(sellerId);	
		
		if(goods.getSellerId()!=null && goods.getSellerId().length()>0){    service层中
		//criteria.andSellerIdLike("%"+goods.getSellerId()+"%");
		criteria.andSellerIdEqualTo(goods.getSellerId());
		}

查询出来的商品列表中有分类字段,分类字段在数据库商品表中存储的是分类的id所以查询出来显示在页面上的分类也是每个分类的id,是纯数字编号,用户的体验非常差并不能知道编号代表什么,所以要解决这个问题:
(1)在后端代码写关联查询语句,返回的数据中直接有分类名称。
(2)在前端代码用ID去查询后端,异步返回商品分类名称。
采用方案二好处:降低编写sql语句的复杂性,而且只用编写前端代码。
前端:

$scope.itemCatList=[];//商品分类列表
//加载商品分类列表
$scope.findItemCatList=function(){		
	itemCatService.findAll().success(
			function(response){							
				for(var i=0;i<response.length;i++){
					$scope.itemCatList[response[i].id]=response[i].name;
				}
			}
	);
}

通过itemCatService.findAll()获取到分类表中的所有分类,得到的数据是list集合,将这个集合遍历从0开始也就是从数组的索引0也就是分类表的id开始将分类的名字存入分类表中对应的name,数组的下标就是id的值,通过id可以取到对应的name。页面初始的时候加载findItemCatList方法后,商品分类列表就存了所有分类的name,在前端中通过从商品表中查询出来的分类id在数组中找对应的分类name即可实现分类名称的显示

	<td>{{itemCatList[entity.category1Id]}}</td>

查询出来的状态显示的也是数据库中看不懂的0(未审核),1(已审核),2(审核未通过),3(关闭),那么在页面中就需要将这些数字转换成数字对应的具体的含义:

    $scope.status=['未审核','已审核','审核未通过','关闭'];//商品状态
    //页面上修改列表显示
    {{status[entity.auditStatus]}}

先创建一个数组,按照索引存放分类的具体含义,在页面上通过数字(索引)去数组中拿到数字(索引)对应的具体文字显示到页面就可以了。

通过下拉列表进行条件查询:

    <div class="has-feedback">
        	状态:<select ng-model="searchEntity.auditStatus">
          	      <option value="">全部</option>      
                   <option value="0">未审核</option>    
                   <option value="1">已审核</option>    
                   <option value="2">审核未通过</option>    
                   <option value="3">关闭</option>                                     
               </select>
    		商品名称:<input ng-model="searchEntity.goodsName">						
    		<button class="btn btn-default" ng-click="reloadList()">查询</button>
    </div>

商品修改

需求分析:
在商品列表页面点击修改,进入商品编辑页面,并传递参数商品ID,商品编辑页面接受该参数后从数据库中读取商品信息,用户修改后保存信息。
基本信息读取:
1.点击商品管理页面中的"修改"按钮,跳转到新增商品页面修改数据。
2.在service和controller的findone方法中,修改返回值为组合实体类Goods,并在service中查询数据,返回给controller,controller返回页面。增加商品是往三个表中增加数据,回显查询也是要从三个表中查询数据。
3.从商品管理跳转到新增商品页面需要获取传递过来的id,根据id查询回显数据:

问题:
商品管理页面如何传递id给新增商品页面?
	location.href = "...goods_edit.html#?id=xxxxx"
新增商品页面如何获取传递过来的id?
	var id=$location.search()['id'];//获取请求路径中的id参数
	if(id==null){ return; }//增加程序的健壮性

富文本编辑器内容读取:

    //向富文本编辑器添加商品介绍
	editor.html($scope.entity.goodsDesc.introduction);

图片显示:

     //显示图片列表,将图片列表由字符串转换为json集合对象
    $scope.entity.goodsDesc.itemImages=JSON.parse($scope.entity.goodsDesc.itemImages);

读取扩展属性:
问题:回显扩展属性的时候,扩展属性的值没有
原因:在页面打开的时候会执行findOne操作,查询数据回显,这个时候扩展属性是可以回显成功,但是我们在回显数据的时候,还会回显模板id,模板id是由监听其变化的操作,当模板id发生改变的时候,会查询tb_type_template表查询扩展属性,tb_type_template表中的扩展属性是没有value之,所以页面显示的时候原本有值的操作会被覆盖,变为没值
解决:在监听模板id发生改变的操作中

if( $location.search()['id']==null ){//如果请求路径没有携带id,表示是新增商品
     $scope.entity.goodsDesc.customAttributeItems= JSON.parse($scope.typeTemplate.customAttributeItems);}

读取商品规格属性

//规格,将读取出来的规格属性转换为JSON对象		
$scope.entity.goodsDesc.specificationItems=JSON.parse($scope.entity.goodsDesc.specificationItems);	

在这里插入图片描述

	$scope.searchObjectByKey = function (list, key, keyValue) {
        for (var i = 0; i < list.length; i++) {
            if(list[i][key]==keyValue){
                return list[i];
            }
        }
        return null;
    }

前端:

<input  type="checkbox"  ng-click="updateSpecAttribute($event,pojo.text,p.optionName);createSKUTable()"          		
ng-checked="checkAttributeValue(pojo.text,p.optionName)">{{p.optionName}}

ng-checked:根据返回值决定是否勾选,返回true勾选,返回false不勾选。
每一个复选框上都绑定了ng-checked,根据checkAttributeValue方法的返回值判断此复选框是否要勾选,checkAttributeValue方法的第一个参数是规格的名称,第二个参数是规格名称对应的某一个值,当页面加载时进入此方法判断。
items保存的是所有选则的规格字符串,格式如图所示,需要先将字符串转换为JSON对象,再通过上一次的代码来判断items中是否包含此复选框的值,如果包含返回的是规格的名称加规格的值object如图所示,如果不包含则返回null。
判断object的值,如果不为空代表此规格是选则的,再通过值在集合中的索引是否大于0判断具体是哪一个复选框被选中。

保存和修改

	//1.校验是否是当前商家的id		
	Goods goods2 = goodsService.findOne(goods.getGoods().getId());
	//2.获取当前登录的商家ID
	String sellerId = SecurityContextHolder.getContext().getAuthentication().getName();
	//3.如果传递过来的商家ID并不是当前登录的用户的ID,则属于非法操作
	if(!goods2.getGoods().getSellerId().equals(sellerId) ||!goods.getGoods().getSellerId().equals(sellerId) ){
		return new Result(false, "操作非法");		
	}	

1.拿到这个商品的id找到此商品的组合类。
2.获取当前登录的商家ID。
3.如果商品对应的商家ID和当前登录的商家ID不相等或者传过来想要保存的商品ID和商家ID不相等就当作是非法操作。

注解式事务解决方案

1.applicationContext-tx.xml

 	<!-- 事务管理器  -->  
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">  
        <property name="dataSource" ref="dataSource" />  
    </bean>  
    <!-- 开启事务控制的注解支持 -->  
    <tx:annotation-driven transaction-manager="transactionManager"/>

2.在service中

/**
 * 服务实现层
 * @author Administrator
 *
 */
@Service
@Transactional
public class GoodsServiceImpl implements GoodsService{
........
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值