在今天的工程学习中,我们遇到的问题是在首页面初始化后,我们在登陆过后返回到第一个页面时,出现点击首页,上边的用户名没有的情况。这个问题主要是由于点击首页时直接返回了工程的首页,此时的uvo的值被清空了,所以我们需要添加一个controller,通过这个controller来重刷首页面,但同时要实现之前的uvo的值要对应的传到首页面。但是,之前我们想到的问题是重刷页面使用同一个controller,这样就会遇到首页面原本的controller中的uvo值在登陆一次之后,返回首页退出登陆都无法实现退出的功能,因为用的一个controller会记忆uvo的值传到前台。所以,要想实现退出功能需要在第一个页面新建一个空的uvo,退出后调用时也是没有登陆的页面。
首页面的图标缺失问题,主要是因为之前没有给对应的商品的类型设置样式表class值,导致对应的图标样式丢失。
int sum=commodityType.size();
for(int i=1;i<=sum;i++){
commodityType.get(i-1).setCount(i+"F");
commodityType.get(i-1).setCss("columnT"+" "+"columnT-"+(i%6+1));
}
model.addAttribute("commodityType",commodityType);
在首页面每类商品只显示前六项的方法:
public List<GoodsForm> searchGoodsListLimit(GoodsForm frm) {
List<GoodsForm> result = queryDao.executeForObjectList("Goods.selectGoodsListLimit", frm,0,6);//从第一项开始的后六项
return result;
}
在sql文中的orderby语句使用:
SELECT commodity.commodity_id as commodityId,
commodity.type as type,
stock.stock as stock
FROM commodity, supplier, brand, stock,commodity_type
WHERE commodity.commodity_id = stock.commodity_id
AND commodity.supplier_id = supplier.supplier_id
AND commodity.brand_id = brand.brand_id
AND commodity.type = commodity_type.commodity_type_id
ORDER BY cast(stock.stock as signed) DESC
注意上边这句话的写法,cast(stock.stock as signed)DESC
在购物车中初始化页面实现每个商品最初状态的小计结果,并返回到页面上。
List<CartForm> cartFormList=cartService.searchCartList(cartForm); //选择购物篮内的所有商品
for(int i=0;i<cartFormList.size();i++){
cartFormList.get(i).setSmallSumPrice(Double.toString(Double.valueOf(cartFormList.get(i).getCount())*Double.valueOf(cartFormList.get(i).getRetailPrice()))); //计算出每一类商品的总价
}
model.addAttribute("cartList", cartFormList);
下面的代码实现的功能是:将选中的每一类商品的cartId值得到拼成一个字符串,用于后边的商品账单支付状态的修改,首先需要核对哪些是被选中的商品,通过一个循环,判断其库存是否有,有的话对应的库存减少,然后将cartId的值传入字符串cartId中。
if (check != null) { //判断是否被选中
cartForm.setCartId(listBean.get(i).getCartId()); //通过cartForm的cartId的值实现修改库存
boolean result = cartService.editStockByCart(cartForm);
if (!result) {
throw new SQLException("库存不足!");
}
boolean hisResult = cartService.updateCart(cartForm); //库存修改结束后,更新购物篮内的内容到cart表
if (!hisResult) {
throw new SQLException("添加支付宝失败");
}
cartIds = cartIds + ",'" + listBean.get(i).getCartId() + "'"; //实现cartIds的多个商品Id的拼接cartForm.setCartId(cartIds.substring(1)); //截取第一个字符后的内容
上边的得到的cartId是一个用逗号隔开的字符串,其实是多个商品的cartId,这个在sql文中使用了:
SELECT cart.cart_id as cartId,
cart.guest_id as guestId,
cart.count as count,
commodity.commodity_id as commodityId,
commodity.type as type
FROM cart, commodity, supplier, brand
WHERE cart.commodity_id = commodity.commodity_id
AND commodity.supplier_id = supplier.supplier_id
AND commodity.brand_id = brand.brand_id
AND cart.status = #status#
AND cart.cart_id in($cartId$)
注意上边的最后一句使用的是一个cartId,这个是一个集合,而这个集合就是之前的cartIds的值。这里和我们之前的模糊查询时候的表达式写的比较像。
在购物篮页面,我们会对商品的购买数量进行调整,这时我们需要实现一个动态的数量的添加减少,每类商品的小计和最终商品的总价。这个功能的实现是一个javascript的代码,具体如下:
已选择<i id="sumCount" class="yh">0</i>种商品 合计¥<i id="sumMoney" class="yh">0</i>元
<span name="xiaoji" th:id="${#strings.concat('sum').concat(cartsInfo.commodityId)}" th:text="${cartsInfo.smallSumPrice}"></span>元
<a href="javascript:void(0);" th:οnclick="${#strings.concat('subNum(').concat(cartsInfo.commodityId).concat(')')}"></a> //注意到这里使用的href=“javascript:void(0)”,作用是为了使这个链接不执行跳转功能,只执行点击事件。
<input th:id="${cartsInfo.commodityId}" type="text" class="fl inp-t" th:name="${#strings.concat('listBean[').concat(status.index).concat('].countArray')}" th:value="${cartsInfo.count}" value="1" />
<a href="javascript:void(0);" th:οnclick="${#strings.concat('addNum(').concat(cartsInfo.commodityId).concat(')')}"></a>
单价:<span th:id="${#strings.concat('single').concat(cartsInfo.commodityId)}" th:text="${cartsInfo.retailPrice}"></span>元
规格:每<span th:text="${#strings.concat(cartsInfo.unit).concat(cartsInfo.specifications)}"></span>
<input type="checkbox" th:name="${#strings.concat('listBean[').concat(status.index).concat('].checkArray')}" οnclick="check();"/></td> //复选框的选定onclick事件
<input type="hidden" th:name="${#strings.concat('listBean[').concat(status.index).concat('].cartId')}" th:value="${cartsInfo.cartId}"/>, //这里隐藏的是每一项cartId的值,注意这里不能实现一个数据类型的隐藏,只能是字符串。
<input type="checkbox" id="checkAllId" οnclick="checkAll(this);" class="vm" /> 全选
(与javascript相关的html代码)下面的javascript的代码:
function addNum(inputId) {
document.getElementById(inputId).value = parseInt(document
.getElementById(inputId).value) + 1;
document.getElementById("sum" + inputId).innerText = document.getElementById("single" + inputId).innerText * document.getElementById(inputId).value;//这里实现了小计的计算,<span>的值是innerText来取得,input中的值是value来得到的
}
function subNum(inputId) {
if (document.getElementById(inputId).value == "1") {
return;
}
document.getElementById(inputId).value = parseInt(document
.getElementById(inputId).value) - 1;
document.getElementById("sum" + inputId).innerText = document.getElementById("single" + inputId).innerText * document.getElementById(inputId).value;
}
function checkAll(obj) {
var el = document.getElementsByTagName('input');
if(obj.checked == true) {
var sumXiaoji = 0;
var sumCount = 0;
var xiaojiLen = document.getElementsByName("xiaoji");
for(var xiaoji in xiaojiLen) {
if (xiaojiLen[xiaoji].tagName == 'SPAN') {
sumXiaoji = sumXiaoji + parseFloat(xiaojiLen[xiaoji].innerText);
sumCount = sumCount + 1;
}
}
document.getElementById("sumCount").innerText = sumCount;
document.getElementById("sumMoney").innerText = sumXiaoji;
for (var key in el) {
if (el[key].type == 'checkbox') {
el[key].checked = true;
}
}
} else {
document.getElementById("sumCount").innerText = 0;
document.getElementById("sumMoney").innerText = 0;
for (var key in el) {
if (el[key].type == 'checkbox') {
el[key].checked = false;
}
}
}
}
function check() {
var el = document.getElementsByTagName('input');
var xiaojiLen = document.getElementsByName("xiaoji");
var xiaojiArray=new Array();
var xiaojiInt = 0;
var allCheckFlag = true;
for (var key in el) {
if (el[key].type == 'checkbox') {
if(el[key].id !="checkAllId") {
xiaojiArray[xiaojiInt] = el[key].checked;
xiaojiInt++;
if (el[key].checked == false) {
allCheckFlag = false;
}
}
}
}
document.getElementById("checkAllId").checked = allCheckFlag;
var sumXiaoji = 0;
var sumCount = 0;
for(var xiaoji in xiaojiLen) {
if (xiaojiLen[xiaoji].tagName == 'SPAN') {
if(xiaojiArray[xiaoji] == true) {
sumXiaoji = sumXiaoji + parseFloat(xiaojiLen[xiaoji].innerText);
sumCount = sumCount + 1;
}
}
}
document.getElementById("sumCount").innerText = sumCount;
document.getElementById("sumMoney").innerText = sumXiaoji;
}
如果在前台需要给后台传送一个list,且这个是隐藏的,我们可以通过一个动态的name来实现:
<ul>
<li th:each="cartForm,status:${alipayForm.cartFormList}">
<input type="hidden" th:name="${#strings.concat('cartFormList[').concat(status.index).concat('].cartId')}" th:value="${cartForm.cartId}"/>
</li>
</ul>
这里实现的是一个循环无序表的动态拼接的name,这个传到后台的时候还是用过之前定义的cartFormList来传递的结果。,这里的动态name的使用主要就是为了后台能接收到相应的值,在显示的页面上是没有影响的。