中国重汽微服务管理_springcloud微服务架构实战:商家管理微服务设计

商家管理微服务设计

商家管理微服务是一个独立的RESTAPI应用,这个应用通过接口服务对外提供商家信息管理、商家权限管理和菜单资源管理等方面的功能。

商家管理微服务开发在merchant-restapi模块中实现,有关这一类型模块的依赖引用、配置、启动程序的设计等,可以参考前面章节中有关RESTAPI微服务开发中的相关说明,不再重复。

商家管理微服务将直接调用权限管理模型的领域服务,在调用之前,我们可以对领域服务层进行一个单元测试,以验证领域服务层的程序正确性。同时,也可以通过单元测试生成一个管理员用户,以方便后面的操作体验。

f477d9d30c4b3d8617bd4c530d38061b.png

商家管理服务层单元测试

首先,在merchant-restapi模块中,对10.1节开发的各个领域服务进行测试,从而对整个商家业务领域的开发进行全面的验证。这些测试包括各个实体的创建、数据获取、对象更新、删除和分页查询等内容。

创建商家及其用户实体的测试用例如下所示:

@RunWith (Spr ingRunner.class)@ContextConfiguration(classes = {JpaConfiguration.class,MerchantRestApiAppl ication.class})@SpringBootTes tpublic class UserTest {private static Logger logger = LoggerFactory. getLogger (UserTest.class) ;@Autowi redprivate UserService userService;@Autowiredprivate RoleService roleService;@Autowiredprivate ResourceService resourceService;CAutowiredprivate ModelService modelService;CAutowiredprivate KindService kindService;@Autowiredprivate MerchantService merchantService;@Testpublic void insertData() {Kind kind = new Kind() ;kind.setName("商家系统");kind. setLink ("merchantweb") ;kindService. save (kind) ;Assert .notNull (kind.getId(), "create kind error") ;Model model = new Model () ;model . setName("用户管理") ;model. setHost ("/user/ index") ;model. setKind(kind) ;modelService.save (model) ;Assert. notNull (model.getId(),"create model error") ;Resource resource = new Resource() ;resource.setName("用户修改");resource.setUrl ("/user/edit/**") ;resource . setModel (model) ;resourceService. save (resource) ;Assert. notNull (resource.getId(), "create resource error") ;Role role = new Role() ;role.setName("商家管理员");List resources = new ArrayList<>() ;resources. add (resource) ;role. setResources (resources) ;roleService.save (role) ;Assert. notNull (role.getId(),"create role error") ;Merchant merchant = new Merchant() ;merchant . setName ("测试商家") ;merchantService. save (merchant) ;Assert .notNull (merchant.getId(), "create merchant error") ;User user = new User() ;user. setName ("admin") ;BCryptPasswordEncoder bpe = new BCryptPasswordEncoder() ;user. setPassword (bpe. encode ("123456")) ;user . setEmail ("admin@com.cn") ;List roles = new ArrayList<>() ;roles.add(role) ;user . setRoles (roles) ;user . setMerchant (merchant) ;userService. save (user) ;Assert .notNull (user.getId(), "create user error");}}

在这个测试用例中,包含了商家业务模型中所有实体的创建,这些实体包括分类、模块、资源、角色、商家、用户等。如果测试通过,则可以生成一个由分类、模块和资源组成的三级菜单,同时创建一个具有所属商家、 具有一个角色和相关访问资源权限的用户实体。这个用户实体的用户名和密码为“admin/123456”。在后面的开发中,我们可以使用这个用户来登录系统。

99900e9057285734557019e33cfcc493.png

如果测试不能通过,则可以根据断言中提示的错误信息,在相关的服务组件中查找出错的原因。

获取实体的测试用例如下所示:

@Testpublic void getData() {User user = userService. findOne (1L) ;Assert.notNull (user, "not find") ;logger . info("====user==={}", new Gson() . toJson (user));}

这个测试用例通过用户ID获取用户信息,如果测试通过,则输出用户实体的完整信息,包括用户、用户拥有的角色和角色包含的资源等。

分页查询的测试如下所示:

@Testpublic void findAll() throws Exception{SimpleDateFormat sdf = new SimpleDateFormat ("yyyy-MM-dd HH:mm:ss");Date date = sdf.parse ("2017-01-0100:00:00") ;UserQo userQo = new UserQo() ;userQo. setCreated(date) ;Merchant merchantmerchantService. findOne (1L) ;MerchantQo merchantQo = CopyUtil.copy (merchant, MerchantQo .class);userQo. setMerchant (merchantQo) ;Page page = userService. findA1l (userQo) ;Assert.notEmpty (page .getContent(), "list is empty");List list = page. getContent() ;for(User user : list) {logger. info("====user===={},", new Gson() .toJson(user));}}

这个测试用例使用查询对象UserQo配置了分页查询的参数,来执行用户信息的分页查询。

在查询参数中设定了创建日期和所属商家等属性。在查询成功后,将输出每条记录的信息,这些信息有用户对象、用户拥有的角色、角色关联的资源和资源所属的模块等。

其他有关更新和删除等测试,可以参照上面的方法进行设计。

单元测试在进行工程打包时,可以作为程序正确性的一一个验证手段。如果测试不通过,则不能成功打包。当使用Maven进行项目管理时,这项功能默认是打开的。如果想要在关闭打包时执行测试,可以在工程中使用下面所示的配置:

org. apache . maven.pluginsmaven-surefire-plugin2.20true configuration>

商家服务的接口开发

在商家管理的REST API应用中,包含了商家信息管理、商家用户权限管理和菜单资源管理等接口的开发。每一个接口的设计我们分别使用一个RestController来实现。这些接口的设计基本上大同小异,下面我们以用户接口的设计为例进行说明。

用户的查询接口是使用GET方法实现的,几种查询接口的实现方法如下所示:

@RestController@RequestMapping("/user")public class UserControllerprivate static Logger logger 二LoggerFactory .getLogger (UserController.class) ;@Autowi redprivate UserService userService;@RequestMapping("/{id}")public String findById (EPathVariable Long id) {return new Gson() . toJson (userService. findOne(id));@RequestMapping ("/names/ {name}")public String findByName (@PathVariable String name) {return new Gson() . toJson (userService. findByName (name)) ;@RequestMapping("/list")public String findList() {return new Gson() . toJson (userService. findAll());@RequestMapping (value = "/page")public String findPage (Integer index, Integer size, String name, LongmerchantId) {try {UserQo userQo = new UserQo() ;if (Commonutils. isNotNull (index)) {userQo. setPage (index) ;if (CommonUtils. isNotNull (size)) {userQo.setSize (size) ;}if (CommonUtils. isNotNull (name)) {userQo. setName (name) ;if (CommonUtils. isNotNull (merchantId)) {MerchantQo merchantQo = new MerchantQo();merchantQo . setId (merchantId) ;userQo. setMerchant (merchantQo) ;Page users = userService. findAll (userQo) ; Map page = new HashMap<>() ;page.put ("content", users .getContent());page .put ("totalPages", users . getTotalPages();page.put ("totalelements", users . getTotalElements());return new Gson() . toJson(page) ;} catch (Exception e) {e. printStackTrace() ;return null ;}}

这些查询接口有单个对象查询、列表查询和分页查询等。因为是接口调用,所以查询的结果最终都是以JSON结构的方式返回文本数据。

如果要新建-一个商家用户,则可以使用POST方法实现,代码如下所示:

@RestControllerERequestMapping ("/user")public class UserControllerprivate static Logger logger =LoggerFactory . getLogger (UserController.class) ;@Autowiredprivate UserService userService;CRequestMapping (value=" /save", method = RequestMethod. POST)public String save (@RequestBody UserQo userQo) throws Exception{User user = CopyUtil. copy (userQo, User.class);List roleList = CopyUtil. copyList (userQo . getRoles(), Role.class);user.setRoles (roleList) ;user.setMerchant (CopyUtil. copy (userQo. getMerchant (),Merchant.class));String ret = userService. insert (user) ;logger. info("新增=" + ret) ;return ret;}}

当创建实体提交给数据服务进行处理时,必须将输入参数中的查询对象转化为实体,使用实体调用领域服务进行数据保存。并且在创建-一个商家用户实体时,为了保证商家用户的合法性,还必须指定用户的所属商家,并且给其分配一个角色,这样,这个商家用户才可以用来登录商家系统。

商家用户的更新设计可以使用PUT方法实现,代码如下所示:

@RestController@RequestMapping ("/user")public class UserControllerprivate static Logger logger =LoggerFactory.getLogger (UserController.class) ;@Autowi redprivate UserService userService;@RequestMapping (value=" /update", methodRequestMethod. PUT)public String update (@RequestBody UserQo userQo) throws Exception{User user = CopyUtil.copy (userQo, User. class);List roleList = CopyUtil.copyList (userQo.getRoles(), Role.class);user .setRoles (roleList) ;user . setMerchant (CopyUtil.copy (userQo. getMerchant (), Merchant.class));String ret = userService. update (user);logger. info("修改="+ ret) ;return ret;}}

商家用户的更新设计与创建一个商 家用户的实现方法相差不多,不同之处在于请求方法及传输的参数。

删除一个商家用户的设计可以使用DELETE方法实现,代码如下所示:

@RestController@RequestMapping (" /user")public class UserControllerprivate static Logger logger = LoggerFactory. getLogger (UserController .class) ;@Autowiredprivate UserService userService;@Reques tMapping (value="/delete/{id}",method = RequestMethod . DELETE)public String delete(@Pathvariable Long id) throws Exception {String ret = userService .delete(id) ;logger. info("删除=" + ret) ;return ret;}}

当要删除的实体具有关联关系时,则必须先删除它们之间的关联关系,然后才能执行删除操作。例如,在角色删除的设计中,使用了如下所示的设计: .

@RequestMapping (value="/delete/ {id}", method = RequestMethod. DELETE)public String delete (@PathVariable Long id) throws Exception {//让具有此角色的用户脱离关系List userList = userService. findByRoleId(id) ;if (userList != null && userList.size() > 0) {for(User user : userList) {for (Role role : user.getRoles()) {if(role.getId() .equals(id)) {user .getRoles() . remove (role) ;userService. update (user) ;break;}}}}//安全删除角色String ret = roleService.delete(id) ;logger. info("删除=" + ret) ;return ret;}

即在删除角色之前,要保证角色没有被用户关联。如果已经存在关联关系,则必须将这些关联关系删除之后,才能成功删除角色。

在完成接口开发之后,可以启动REST API应用,对一些查询接口可以使用浏览器进行-一个简单的测试。例如,对于用户信息的分页查询,可以使用如下所示的链接进行测试:

http://localhost: 9081/user/page

如果数据库中存在商家用户数据,则打开链接之后,可以看到如图10-3所示的JSON结构的数据。

b986d6f48083174bc60e55d96661f801.png

对于上面设计的这些接口调用方法,我们都以FeignClient的方式进行了封装。更详细的信息可以参照前面章节中相关内容的说明。商家服务的接口调用设计,在模块merchant-client 中实现。在后面的开发中,我们只需在项目管理中配置模块merchant-client的依赖引用,就可以使用这些接口调用方法实现商家管理的各项功能设计了。

本文给大家讲解的内容商家管理后台与sso设计:商家管理微服务设计

  1. 下篇文章给大家讲解的是商家管理后台与sso设计: SSO设计;
  2. 觉得文章不错的朋友可以转发此文关注小编;
  3. 感谢大家的支持!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/526926.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

计算机自带游戏在哪里打开,电脑自带游戏选项在哪里打开

如果只是这个游戏有这个问题&#xff0c;就是软件有问题了&#xff0c;重装这游戏&#xff0c;如果有好几个软件都有这个问题&#xff0c;无疑是中毒了&#xff0c;用360彻底查杀。不行重装系统&#xff0c;装完后马上装360&#xff0c;再升级查杀。重装游戏。不行就-------那是…

html文字竖直书写,css 文字竖直居中的写法和图片垂直居中代码(图文)

界面上文章左右居中使用text-aligin:center&#xff0c;上下竖直居中的写法如下&#xff0c;图片垂直居中的代码文字、图片居中显示的方法.content{height: 40px;line-height: 40px;border:1px double #abc;}.myimg{/*非IE的主流浏览器识别的垂直居中的方法*/display: table-ce…

怎么判断到了月初_双春年与无春年怎么区分?2021年是寡妇年吗?

导读&#xff1a;双春年与无春年怎么区分&#xff1f;2021年是什么春年&#xff1f;就在昨天&#xff0c;我写了一篇关于寡妇年的文章&#xff0c;没想到大家热情高涨&#xff0c;关注度挺高的&#xff0c;还有的朋友私信问我这个双春年、有春年和无春年该怎么分&#xff0c;今…

微型计算机中的奔四指的是,2015云南省计算机等级考试二级理论考试试题及答案...

1、在微型计算机中&#xff0c;微处理器的主要功能是进行( D )A、算术运算 B、逻辑运算C、算术逻辑运算 D、算术逻辑运算及全机的控制2、下列各进制数中最小的数是( A )A、101001B B、520 C、2BH D、44D3、通常&#xff0c;在微机中标明的P4或奔腾4是指( D )A、产品型号 B、主频…

乐橙本地录像回放不了_乐橙智能锁来告诉你:你家门真的安全吗?

你家门锁真的安全吗&#xff1f;你以为家门反锁就没事了&#xff1f;最近&#xff0c;看到一则新闻&#xff1a;女主人反锁门后出门喝喜酒&#xff0c;回家后发现家中遭窃&#xff0c;现金、珠宝首饰等全部遗失。还有那些专门行窃的小偷&#xff0c;他们会先按下房间门铃&#…

swift html编辑器,SwiftUI 的可视化编辑工具

原标题&#xff1a;SwiftUI 的可视化编辑工具作者&#xff1a;希德&#xff0c;iOS 开发者&#xff0c;前“有经验的前端开发工程师”&#xff0c;就职于网易严选。正在写书《Thinkable SwiftUI》(严重拖稿中)Session 10185: https://developer.apple.com/videos/play/wwdc2020…

在百模大战中AI行业发展有何新趋势?

前言 在百模大战中&#xff0c;AI行业的发展正在经历前所未有的变革。这场竞争不仅推动了AI技术的快速发展&#xff0c;也揭示了AI行业的新趋势。这些趋势不仅影响着我们如何看待和使用AI&#xff0c;也预示着AI未来的发展方向。在这个快速发展的领域&#xff0c;了解这些新趋…

如何备份数据_如何通过归档、备份和灾难恢复实现多云数据保护

点击上方“蓝色字体”&#xff0c;选择 “设为星标”关键讯息&#xff0c;D1时间送达&#xff01;为了提高业务连续性并更好地控制成本&#xff0c;企业将在2020年向IT专业人员施加压力&#xff0c;要求他们打破内部和外部基础设施之间以及公共云提供商离散环境之间的孤岛。为此…

清华大学计算机专业高中选课系统,【清华大学计算机实验教学中心】_清华大学计算机实验教学中心...

计算机实验教学中心面向全校所有专业本科生开课,每年开出计算机实验教学课超过7000人门,完成实验学时数逾750000.计算机学科是一门理论与实践结合得非常紧密的学科,因此实验教学中心的教学指导小组在教学实践中归纳出一套计算机学科特有的实验教学模式:除了独立设置的部分专题实…

机器人测钢卷直径_酒钢碳钢冷轧钢卷自动焊接机器人上线

10月18日消息&#xff0c;在酒钢集团宏兴股份公司碳钢薄板厂冷轧生产现场&#xff0c;一款白色自动焊接机器人上线作业。“这款机器人可进一步降低职工劳动强度&#xff0c;保证职工作业安全&#xff0c;最重要的是能够代替人工完成有害环境下的作业。”该厂电气责工刘世忠介绍…

html ace编辑器,Tiny-editor

Tiny-editor是和jsFiddle一样具有在线运行js功能的在线代码编辑器&#xff0c;基于Ace。Usage1.下载slidePagegit clone https://github.com/lipten/Tiny-editor.git2.引用相关文件3.引用js文件4.html结构//--html结构比较复杂&#xff0c;看下载后的editor.html比较完整5.初始…

树展示 移动端_百度移动端开始用网站品牌名代替网址显示

最近&#xff0c;有站长发现&#xff0c;百度移动端最近做了部分改版&#xff1a;移动端部分网站域名开始逐渐被网站相关名称代替&#xff0c;PC端还是用域名展示&#xff0c;卢松松博客网站域名也被替换成网站品牌名显示!点击添加图片描述&#xff08;最多60个字&#xff09;编…

html视频标签略缩图,JS可以截取video的标签视频缩略图吗?

这次给大家带来JS可以截取video的标签视频缩略图吗&#xff1f;&#xff0c;JS截取video的标签视频缩略图的注意事项有哪些&#xff0c;下面就是实战案例&#xff0c;一起来看一下。JavaScript截取video标签视频缩略图,前几天做个小项目以瀑布流加载MP4视频,一个页面差不多会加…

cp命令显示进度条_利用rsync命令和scp命令实现本机带进度条提示拷贝

rsync命令#rsync -av --progress /mnt/yidong2/full20100526.tar.gz /mnt/yidong1/[以上命令] 可以实现本机带进度条提示拷贝&#xff0c;可以实现不同机器带进度条提示拷贝&#xff0c;可以拷贝多个文件scp命令#scp -v /mnt/yidong2/full20100526.tar.gz /mnt/yidong1/[以上命…

HTML用css让input无法使用,html – 是否可以使用CSS设置一个禁用的INPUT元素?

我需要设置禁用的< select>元素,使其看起来像启用它们.有人可以帮忙吗&#xff1f;PS.我完全知道对HCI原则等做这样的事情的缺点,但是它的要求,所以我必须做,如果可能的话…谢谢.编辑&#xff1a;AlexThomas’方法在HTML代码中禁用元素时效果很好,但不幸的是我正在使用JQ…

python framework threads_Python - 多线程

当我们写的程序需要并发时&#xff0c;我们就需要用到 Python 中的一些并发库&#xff0c;例如 asyncio、thread、 multiprocessing 等&#xff0c;本文主要介绍 Python 标准库中的多线程库 threadthreading 基本使用使用多线程的优势在于程序运行更快适用于 IO 密集的场景Pyth…

计算机关机键桌面,电脑桌面按钮关机关不了怎么办? 爱问知识人

【问题描述】:屏幕抖动,显示异常【原因分析】:1。 显卡驱动异常2。 显示器和主机的连接线虚接3。 显示器本身出现故障【简易步骤】:1。打开【60软件管家】—【软件卸载】2。 【我的电脑】—右击—【管理】—【设备管理器】—右键【卸载】【操作步骤】:方案一&#xff1a;卸载显…

如何快速的学习html5,高效快速学习HTML5的技巧

HTML5是非常新前端必备技能&#xff0c;作为第五代HTML语言&#xff0c;包含的算法、实现的功能都大大超过从前。不同的人学习效率、成果都各不相同&#xff0c;那么如何高效快速学习HTML5呢&#xff1f;学码思前端开发培训老师给大家分享一些小技巧&#xff0c;一起来看看吧。…

java格式化日期时分秒_java怎么格式化时间类型的时间,结果要求是时间类型

你好小SongSimpleDateFormat sdf new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");1.Calendar 转化 String//获取当前时间的具体情况,如年,月,日,week,date,分,秒等Calendar calendat Calendar.getInstance();SimpleDateFormat sdf new SimpleDateFormat("yyyy…

云南大学计算机网络期中考试刘春花,实验九基于CRC编码的检错程序的实现.doc...

实验九基于CRC编码的检错程序的实现.doc云南大学软件学院实 验 报 告课程 计算机网络原理实验 任课教师 刘春花&#xff0c;刘宇 姓名 学号 专业 成绩 实验九、链路层实验基于 CRC 编码的检错程序的实现实验报告一、实验目的1、通过实验&#xff0c;掌握 CRC 编码和解码的原理。…