实战SSM_O2O商铺_39【前端展示】首页轮播图和一级商铺Dao+Service+Controller层的实现

2021-08-17 14:34:43 浏览数 (2)

文章目录

  • 概述
  • HeadLine Dao层
    • 接口
    • 映射文件
    • 单元测试
  • HeadLine Service层
    • 接口
    • 实现类
    • 单元测试
  • ShopCategory Dao层完善
    • 映射文件完善
    • 单元测试
  • Controller层
    • MainPageController
    • 测试
  • Github地址

概述

接下来我们来完成前端展示模块部分的功能,极其丑陋的页面原型如下

可以分析得出,主页中轮播图需要从后台加载数据,同样的一级类别(即parent_id = null )的商铺信息也需要从后台加载数据


HeadLine Dao层

接口

代码语言:javascript复制
package com.artisan.o2o.dao;

import java.util.List;

import org.apache.ibatis.annotations.Param;

import com.artisan.o2o.entity.HeadLine;

public interface HeadLineDao {
	/**
	 * 
	 * 
	 * @Title: selectHeadLineList
	 * 
	 * @Description: 根据enable_status查询符合条件的头条信息
	 * 
	 * @param headLineConditon
	 * @return
	 * 
	 * @return: List
	 */
	List<HeadLine> selectHeadLineList(@Param("headLineConditon") HeadLine headLineConditon);
}

映射文件

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.artisan.o2o.dao.HeadLineDao">
	<select id="selectHeadLineList" resultType="HeadLine">
		SELECT
			line_id,
			line_name,
			line_link,
			line_img,
			priority,
			enable_status,
			create_time,
			last_edit_time
		FROM
			tb_head_line
		<where>
			<if test="headLineConditon.enableStatus != null">
				and enable_status = #{headLineConditon.enableStatus}
			</if>
		</where>
		ORDER  BY 
			priority 
		DESC 
	</select>
</mapper>   

单元测试

模拟数据:

代码语言:javascript复制
package com.artisan.o2o.dao;

import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.artisan.o2o.BaseTest;
import com.artisan.o2o.entity.HeadLine;

public class HeadLineDaoTest extends BaseTest {

	@Autowired
	private HeadLineDao headLineDao;

	@Test
	public void testSelectHeadLineList() {
		HeadLine headLineConditon = new HeadLine();
		// 状态 0 不可用 1 可用
		headLineConditon.setEnableStatus(0);

		// 查询不可用的头条信息
		List<HeadLine> headLineList = headLineDao.selectHeadLineList(headLineConditon);
		Assert.assertEquals(2, headLineList.size());
		for (HeadLine headLine : headLineList) {
			System.out.println(headLine);
		}
		// 查询可用的头条信息
		headLineConditon.setEnableStatus(1);
		headLineList = headLineDao.selectHeadLineList(headLineConditon);
		Assert.assertEquals(3, headLineList.size());
		for (HeadLine headLine : headLineList) {
			System.out.println(headLine);
		}

		// 查询全部状态的头条信息
		headLineList = headLineDao.selectHeadLineList(new HeadLine());
		Assert.assertEquals(5, headLineList.size());
		for (HeadLine headLine : headLineList) {
			System.out.println(headLine);
		}
	}
}

单元测试日志:

代码语言:javascript复制
JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@7e6ef134] will not be managed by Spring
==>  Preparing: SELECT line_id, line_name, line_link, line_img, priority, enable_status, create_time, last_edit_time FROM tb_head_line WHERE enable_status = ? ORDER BY priority DESC 
==> Parameters: 0(Integer)
<==    Columns: line_id, line_name, line_link, line_img, priority, enable_status, create_time, last_edit_time
<==        Row: 4, test4, aa, bb, 96, 0, null, null
<==        Row: 5, test5, cc, dd, 95, 0, null, null
<==      Total: 2
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@4716be8b]
HeadLine [lineId=4, lineName=test4, lineLink=aa, lineImg=bb, priority=96, enableStatus=0, createTime=null, lastEditTime=null]
HeadLine [lineId=5, lineName=test5, lineLink=cc, lineImg=dd, priority=95, enableStatus=0, createTime=null, lastEditTime=null]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@21a21c64] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@42bc14c1] will not be managed by Spring
==>  Preparing: SELECT line_id, line_name, line_link, line_img, priority, enable_status, create_time, last_edit_time FROM tb_head_line WHERE enable_status = ? ORDER BY priority DESC 
==> Parameters: 1(Integer)
<==    Columns: line_id, line_name, line_link, line_img, priority, enable_status, create_time, last_edit_time
<==        Row: 1, test1, xxx, yyy, 99, 1, null, null
<==        Row: 2, test2, x, y, 98, 1, null, null
<==        Row: 3, test3, xx, yy, 97, 1, null, null
<==      Total: 3
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@21a21c64]
HeadLine [lineId=1, lineName=test1, lineLink=xxx, lineImg=yyy, priority=99, enableStatus=1, createTime=null, lastEditTime=null]
HeadLine [lineId=2, lineName=test2, lineLink=x, lineImg=y, priority=98, enableStatus=1, createTime=null, lastEditTime=null]
HeadLine [lineId=3, lineName=test3, lineLink=xx, lineImg=yy, priority=97, enableStatus=1, createTime=null, lastEditTime=null]
Creating a new SqlSession
SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@74f5ce22] was not registered for synchronization because synchronization is not active
JDBC Connection [com.mchange.v2.c3p0.impl.NewProxyConnection@16fdec90] will not be managed by Spring
==>  Preparing: SELECT line_id, line_name, line_link, line_img, priority, enable_status, create_time, last_edit_time FROM tb_head_line ORDER BY priority DESC 
==> Parameters: 
<==    Columns: line_id, line_name, line_link, line_img, priority, enable_status, create_time, last_edit_time
<==        Row: 1, test1, xxx, yyy, 99, 1, null, null
<==        Row: 2, test2, x, y, 98, 1, null, null
<==        Row: 3, test3, xx, yy, 97, 1, null, null
<==        Row: 4, test4, aa, bb, 96, 0, null, null
<==        Row: 5, test5, cc, dd, 95, 0, null, null
<==      Total: 5
Closing non transactional SqlSession [org.apache.ibatis.session.defaults.DefaultSqlSession@74f5ce22]
HeadLine [lineId=1, lineName=test1, lineLink=xxx, lineImg=yyy, priority=99, enableStatus=1, createTime=null, lastEditTime=null]
HeadLine [lineId=2, lineName=test2, lineLink=x, lineImg=y, priority=98, enableStatus=1, createTime=null, lastEditTime=null]
HeadLine [lineId=3, lineName=test3, lineLink=xx, lineImg=yy, priority=97, enableStatus=1, createTime=null, lastEditTime=null]
HeadLine [lineId=4, lineName=test4, lineLink=aa, lineImg=bb, priority=96, enableStatus=0, createTime=null, lastEditTime=null]
HeadLine [lineId=5, lineName=test5, lineLink=cc, lineImg=dd, priority=95, enableStatus=0, createTime=null, lastEditTime=null]

HeadLine Service层

接口

代码语言:javascript复制
package com.artisan.o2o.service;

import java.util.List;

import com.artisan.o2o.entity.HeadLine;

public interface HeadLineService {
	/**
	 * 
	 * 
	 * @Title: queryHeadLineList
	 * 
	 * @Description: 查询headLine
	 * 
	 * @param headLineConditon
	 * 
	 * @return: List
	 */
	List<HeadLine> queryHeadLineList(HeadLine headLineConditon);
}

实现类

代码语言:javascript复制
package com.artisan.o2o.service.impl;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.artisan.o2o.dao.HeadLineDao;
import com.artisan.o2o.entity.HeadLine;
import com.artisan.o2o.service.HeadLineService;

@Service
public class HeadLineServiceImpl implements HeadLineService {

	@Autowired
	HeadLineDao headLineDao;

	@Override
	public List<HeadLine> queryHeadLineList(HeadLine headLineConditon) {
		return headLineDao.selectHeadLineList(headLineConditon);
	}

}

单元测试

代码语言:javascript复制
package com.artisan.o2o.service;

import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.artisan.o2o.BaseTest;
import com.artisan.o2o.entity.HeadLine;

public class HeadLineServiceTest extends BaseTest {

	@Autowired
	private HeadLineService headLineService;

	@Test
	public void testQueryHeadLineList() {
		HeadLine headLineConditon = new HeadLine();
		// 状态 0 不可用 1 可用
		headLineConditon.setEnableStatus(0);

		// 查询不可用的头条信息
		List<HeadLine> headLineList = headLineService.queryHeadLineList(headLineConditon);
		Assert.assertEquals(2, headLineList.size());
		for (HeadLine headLine : headLineList) {
			System.out.println(headLine);
		}
		// 查询可用的头条信息
		headLineConditon.setEnableStatus(1);
		headLineList = headLineService.queryHeadLineList(headLineConditon);
		Assert.assertEquals(3, headLineList.size());
		for (HeadLine headLine : headLineList) {
			System.out.println(headLine);
		}

	}
}

检查是否符合预期,单元测试正常


ShopCategory Dao层完善

因为按照设计,首页展示的商品类别是一级商品类别,即parent_id为null的商铺类别信息。 因此需要扩招之前写好的Dao层的SQL映射文件。

映射文件完善

代码语言:javascript复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.artisan.o2o.dao.ShopCategoryDao">
	<select id="queryShopCategoryList" resultType="com.artisan.o2o.entity.ShopCategory">
		SELECT
			shop_category_id ,
			shop_category_name,
			shop_category_desc,
			shop_category_img,
			priority,
			create_time,
			last_edit_time,
			parent_id
		FROM
			tb_shop_category
	<where>
		<!-- 首页查询一级类别的商铺信息 -->
		<if test="shopCategoryCondition == null">
			and parent_id is null
		</if>
	
		<!-- 控制层getshopinitinfo的方法 shopCategoryService.getShopCategoryList(new ShopCategory());
			只能选择二级商铺类别,不能挂载一级商铺类别大类目录下
		 -->
		<if test="shopCategoryCondition != null">
			and parent_id is not null
		</if>
		<!-- 如果传递了父类的id,则查询对应父类下的目录 -->
		<if test="shopCategoryCondition != null and shopCategoryCondition.parent != null">
			and parent_id = #{shopCategoryCondition.parent.shopCategoryId}
		</if>
	</where>	
		ORDER BY priority 
		DESC	
	</select>
</mapper>   

单元测试

代码语言:javascript复制
package com.artisan.o2o.dao;

import java.util.List;

import org.junit.Assert;
import org.junit.Test;
import org.springframework.beans.factory.annotation.Autowired;

import com.artisan.o2o.BaseTest;
import com.artisan.o2o.entity.ShopCategory;

public class ShopCategoryDaoTest extends BaseTest {
	

	@Autowired
	ShopCategoryDao shopCategoryDao;
	
	@Test
	public void testQueryShopCategoryList() {

		// shopCategoryCondition 不为null的情况,查询parent_id is not null 的数据
		ShopCategory shopCategory = new ShopCategory();
		List<ShopCategory> categoryList = shopCategoryDao.queryShopCategoryList(shopCategory);
		Assert.assertEquals(2, categoryList.size());
		for (ShopCategory shopCategory2 : categoryList) {
			System.out.println(shopCategory2);
		}

		// shopCategoryCondition.parent 不为null的情况

		// 查询parent=1的店铺目录
		ShopCategory child = new ShopCategory();
		ShopCategory parent = new ShopCategory();
		parent.setShopCategoryId(1L);
		child.setParent(parent);

		categoryList = shopCategoryDao.queryShopCategoryList(child);
		Assert.assertEquals(2, categoryList.size());
		for (ShopCategory shopCategory2 : categoryList) {
			System.out.println(shopCategory2);
		}

		// 查询 parent is null 的情况
		categoryList = shopCategoryDao.queryShopCategoryList(null);
		Assert.assertEquals(1, categoryList.size());
		System.out.println(categoryList.get(0));
	}


}

检查是否符合预期,单元测试正常


Controller层

MainPageController

代码语言:javascript复制
package com.artisan.o2o.web.frontend;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;

import com.artisan.o2o.entity.HeadLine;
import com.artisan.o2o.entity.ShopCategory;
import com.artisan.o2o.enums.HeadLineStateEnum;
import com.artisan.o2o.enums.ShopCategoryStateEnum;
import com.artisan.o2o.service.HeadLineService;
import com.artisan.o2o.service.ShopCategoryService;

@Controller
@RequestMapping("/frontend")
public class MainPageController {

	@Autowired
	private HeadLineService headLineService;
	@Autowired
	private ShopCategoryService shopCategoryService;

	@RequestMapping(value = "/listmainpage", method = RequestMethod.GET)
	@ResponseBody
	public Map<String, Object> listMainPage() {
		Map<String, Object> modelMap = new HashMap<String, Object>();
		List<ShopCategory> shopCategoryList = new ArrayList<ShopCategory>();
		List<HeadLine> headLineList = new ArrayList<HeadLine>();
		try {
			// 查询状态为1的可见的headLine信息
			HeadLine headLineConditon = new HeadLine();
			headLineConditon.setEnableStatus(1);
			headLineList = headLineService.queryHeadLineList(headLineConditon);
			
			modelMap.put("headLineList", headLineList);
		} catch (Exception e) {
			e.printStackTrace();
			modelMap.put("errMsg", HeadLineStateEnum.INNER_ERROR.getStateInfo());
		}
		
		try{
			// 查询parentId为null的一级类别
			shopCategoryList = shopCategoryService.getShopCategoryList(null);
			modelMap.put("shopCategoryList", shopCategoryList);
		} catch (Exception e) {
			e.printStackTrace();
			modelMap.put("success", false);
			modelMap.put("errMsg", ShopCategoryStateEnum.INNER_ERRO.getStateInfo());
		}

		modelMap.put("success", true);

		return modelMap;
	}
}

测试

启动tomcat,访问 http://localhost:8080/o2o/frontend/listmainpage

得到JSON字符串如下

代码语言:javascript复制
{
    "shopCategoryList": [
        {
            "shopCategoryId": 1,
            "shopCategoryName": "咖啡奶茶",
            "shopCategoryDesc": "咖啡奶茶大类",
            "shopCategoryImg": "/xxxx/xxxx",
            "priority": 0,
            "createTime": 1526580836000,
            "lastEditTime": 1526580838000,
            "parent": null
        }
    ],
    "success": true,
    "headLineList": [
        {
            "lineId": 1,
            "lineName": "test1",
            "lineLink": "xxx",
            "lineImg": "yyy",
            "priority": 99,
            "enableStatus": 1,
            "createTime": null,
            "lastEditTime": null
        },
        {
            "lineId": 2,
            "lineName": "test2",
            "lineLink": "x",
            "lineImg": "y",
            "priority": 98,
            "enableStatus": 1,
            "createTime": null,
            "lastEditTime": null
        },
        {
            "lineId": 3,
            "lineName": "test3",
            "lineLink": "xx",
            "lineImg": "yy",
            "priority": 97,
            "enableStatus": 1,
            "createTime": null,
            "lastEditTime": null
        }
    ]
}

符合预期。后端完成,接下来我们来试下View层的逻辑。


Github地址

代码地址: https://github.com/yangshangwei/o2o

0 人点赞