首页 > 其他分享 >一个电商项目的Web服务化改造

一个电商项目的Web服务化改造

时间:2023-05-05 14:33:15浏览次数:58  
标签:Web java 服务化 int brand List id 电商 public


一个电商项目的Web服务化改造

项目,早期是随便瞎做的,没啥架构,连基本的设计也没。

有需求,实现需求,再反复修改。

大致就是这么做的。

最近,项目要重新架构,和某boss协商的结果是,采用阿里开源的dubbo实现服务化。

前几天,写了一篇dubbo入门案例,分布式服务框架Dubbo入门案例和项目源码

最近,开始实现基本业务功能模块的开发。完成1个模块,原有项目就接入进来,从而完成项目的服务化改造。

在和某boss的商讨之后,我们的做法是

1.只做单表操作,mysql数据库层次不写“关联查询”。

2.针对单个表,实现CRUD等基本操作。

3.层次划分

  mapper:基本的数据库CRUD,全部是原子操作

  dao:对mapper的数据进行组装,比如关联查询。

   之前,是在service层进行代码组装的。

  bizService:业务逻辑操作

  webService:对外服务层

  由于当前阶段,我们的业务逻辑比较简单,bizService和webService可以看成是1层的。

  

  好处:严格的层次划分,上层可以调用下层,同层之间不能互相调用。比如service不能调用其它的service。

4.结合Freemarker,写代码自动生成的工具。根据数据库表,自动生成标准化的代码。

  书写中...

  

  类结构

  Base*:基础的公共的类

  Brand: 具体的,以品牌brand表为例

  

  brand表结构

 

CREATE TABLE `brand` (
  `id` varchar(50) NOT NULL COMMENT 'ID',
  `name` varchar(30) DEFAULT NULL COMMENT '品牌名称',
  `logo` varchar(100) DEFAULT NULL COMMENT '品牌LOGO',
  `isDelete` int(11) NOT NULL DEFAULT '0' COMMENT '是否删除',
  `createTime` datetime DEFAULT NULL COMMENT '创建日期',
  `updateTime` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='品牌表';


 Brand.java:数据库表对应的模型

 

/**
 * 品牌
 *
 */
public class Brand {
	private String id;
	private String name;
	private String logo;
	private Date createTime;
	private Date updateTime;
	private Integer isDelete;
	
}



 

  BaseMapper.java:定义最通用的sql映射。注意,这个mapper没有对应的Mybatis xml配置。

 

import java.util.List;

public interface BaseMapper<ID, Entity> {
	Entity get(ID id);

	List<Entity> listByIdList(List<String> idList);

	List<Entity> listAll();

	int add(Entity entity);

	int update(Entity entity);

	int remove(ID id);

	int removeByIdList(List<ID> idList);

}


  

  BrandMapper.java:品牌的sql映射,Java接口定义

  import java.util.List;

@Mapper
public interface BrandMapper extends BaseMapper<String, Brand> {
	// read

	List<Brand> listByShopIdList(List<String> shopIdList);

	List<Brand> list(BrandBean brandBean);

	// write

}


  BrandMapper.xml:品牌的sql映射,sql语句

 

<?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.webservice.mapper.BrandMapper">
	<sql id="columns">
		id,name,logo,createTime,updateTime,isDelete
	</sql>

	<select id="get" resultType="Brand">
		select
		<include refid="columns" />
		from brand
		where id =
		#{id}
	</select>

	<select id="list" resultType="Brand">
		select
		<include refid="columns" />
		from brand where
		isDelete=0
		<if test="name != null and name !=''">
			and name like '%${name}%'
		</if>
		order by createTime desc
	</select>
	
	...
}


  BaseDao.java:定义最基础、最通用的dao层接口。

 

import java.util.List;

public interface BaseDao<ID, Entity,Bean> {
	//read
	Entity get(ID id);

	List<Entity> listByIdList(List<String> idList);
	
	List<Entity> list(Bean bean);
	
	List<Entity> listAll();

	//write
	int add(Entity entity);

	int update(Entity entity);

	int remove(ID id);
	
	int removeByIdList(List<ID> idList);

}


  BrandDao.java: 品牌的dao接口

 

import java.util.List;


public interface BrandDao extends BaseDao<String, Brand,BrandBean> {
	// read
	List<Brand> listByShopIdList(List<String> shopIdList);

	List<String> listLogoByIdList(List<String> idList);

	// write

}


  BrandDaoImpl.java:品牌的dao接口实现类

 

@Component
public class BrandDaoImpl implements BrandDao {

	@Autowired
	private BrandMapper brandMapper;

	private Logger logger = Logger.getLogger(getClass());
	
	@Override
	public Brand get(String id) {
		if(StringUtils.isEmpty(id)){
			logger.error("The id is null");
			return null;
		}
		return brandMapper.get(id);
	}

	@Override
	public List<Brand> listByIdList(List<String> idList) {
		if (CollectionUtils.isEmpty(idList)) {
			logger.error("The idList is empty");
			return null;
		}
		return brandMapper.listByIdList(idList);
	}
	
	}


  BrandService.java: 品牌,业务层的接口定义

  代码类似

  

  BrandServiceImpl.java:品牌,业务层的接口实现

  代码类似

  

  junit单元测试:测dao和service层,mapper层忽视

  BaseDaoTest.java:dao基础配置

 

//单元测试的mysql数据库,最好是单独的一套库,没有任何数据。如果开发和单元测试共用数据库,listAll之类的方法会有影响。
//单元测试:1.构造数据,2.执行操作,3.断言,4.回滚
//设置自动回滚
@TransactionConfiguration(transactionManager = "transactionManager", defaultRollback = true)  
@Transactional  
@ContextConfiguration(locations={"classpath*:spring-dataSource.xml"})
@RunWith(SpringJUnit4ClassRunner.class)
public class BaseDaoTest {
	public static final String NOT_EXIST_ID_STRING="not_exist_id_string";
	public static final String NOT_EXIST_ID_INT="not_exist_id_int";
	public static final String EXIST_NAME = "test";
	public static final String NOT_EXIST_NAME = "not_exist_name";
}

  BrandDaoTest.java:brand的基础测试用例
  public class BrandDaoTest extends BaseDaoTest {

	@Autowired
	private BrandDao brandDao;

	// //read//
	@Test
	public void testGet() {
		Brand brand = TestDataCenter.brand();
		brandDao.add(brand);
		Brand dbBrand = brandDao.get(brand.getId());
		assertNotNull(dbBrand);
	}

	@Test
	public void testGetNotExist() {
		Brand brand = TestDataCenter.brand();
		brandDao.add(brand);
		Brand nullBrand = brandDao.get(NOT_EXIST_ID_STRING);
		assertNull(nullBrand);
	}
	}


  BaseServiceTest.java:service基础配置

    代码类似

  BrandServiceTest.java:brand的基础测试用例

    代码类似

   

 单元测试结果图

一个电商项目的Web服务化改造_分层架构


一个电商项目的Web服务化改造_分层架构_02

一个电商项目的Web服务化改造_List_03


  spring数据源配置,spring-dataSource.xml

  

  除了Base基础接口,具体的业务类,计划通过代码生成工具自动生成。

  

  

  我们保证内部代码mapper层和dao层代码正确,保证service层正确,然后用dubbo把service的代码,稍微做点配置,对外提供服务。

  其它项目,比如front前端商城系统、mobile移动App、backend后端运营系统,直接调用咱们的服务接口即可。

标签:Web,java,服务化,int,brand,List,id,电商,public
From: https://blog.51cto.com/fansunion/6245773

相关文章

  • 商业研究(12):下厨房,美食菜谱分享社区及新型电商,唯有美食与爱不可辜负
     下厨房,2014年就注意到了这个产品,网站做得简洁,有价值。作为C端用户,很喜欢这样的网站。    下厨房是一个美食菜谱分享社区及新型电商平台,提供有版权的实用菜谱做法与饮食知识,为厨师和美食爱好者打造一个记录、分享的平台。    网站的主要用户,是对美食感兴趣的消费者,尤其......
  • 一个电商项目的Web服务化改造7:Dubbo服务的调用,4个项目
    使用dubbo服务的过程,很简单,和之前学习的WebService完全一样,和本地接口调用也基本一致。   dubbo和WebService的区别:我认为dubbo就是封装了WebService,然后提供了更多的配套功能。看jar包依赖,dubbo依赖的WebService。(青出于蓝,而胜于蓝。冰,水为之,而寒于水。)   dubbo接口和......
  • 获取WebView发送给服务端的Accept-Language请求头
    1,WebView没有提供获取Accept-Language请求头的接口2,WebView的publicWebResourceResponseshouldInterceptRequest(WebViewview,WebResourceRequestrequest){}回调中WebResourceRequest不包含Accept-Language请求头,即使客户端向服务器端发送的请求中包含该请求头3,javascr......
  • jsp Web超大文件上传和断点续传的实现
    ​ 对于大文件的处理,无论是用户端还是服务端,如果一次性进行读取发送、接收都是不可取,很容易导致内存问题。所以对于大文件上传,采用切块分段上传,从上传的效率来看,利用多线程并发上传能够达到最大效率。 本文是基于springboot+vue实现的文件上传,本文主要介绍服务端实现文件......
  • WebAPi实现多文件上传,并附带参数
    1、目的及需求需要实现的效果为,通过WebAPI实现多文件上传功能,并且在上传时需要能附带文件说明参数,用于保存文件记录 2、参数说明这里先说明以下需要的文件说明参数类///<summary>///前端文件上传时参数数据///</summary>publicclassDistributionDat......
  • Java Web超大文件上传和断点续传的实现
    ​前言文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比......
  • 电商产品评论数据情感分析
    1.评论去重的代码,数据清洗、分词、词性标注、去除停用词代码。 importpandasaspdimportreimportjieba.possegaspsgimportnumpyasnp#去重,去除完全重复的数据reviews=pd.read_csv("./reviews.csv")reviews=reviews[['content','content_type']].drop_duplicate......
  • 关于Android studio的虚拟机Webview出现网页无法加载,显示net::ERR_NAMENOT_RESOLVED的
    一开始出现了这个错误net::ERR_CLEARTEXT_NOT_PERMITTED参考这三个文献,https://www.cnblogs.com/suhq/p/14414882.htmlhttps://blog.csdn.net/qq_59125846/article/details/121953461https://blog.csdn.net/weixin_43169336/article/details/128379580都试了一遍后,问题消失,......
  • 电商产品评论数据情感分析
    1、评论去重的代码importpandasaspdimportreimportjieba.possegaspsgimportnumpyasnp#去重,去除完全重复的数据reviews=pd.read_csv("./reviews.csv")reviews=reviews[['content','content_type']].drop_duplicates()content=reviews......
  • tomcat——创建MavenWeb项目
      ......