中国重汽微服务管理_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,一经查实,立即删除!

相关文章

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;今…

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

你家门锁真的安全吗&#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…

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

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

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

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

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

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

分享到facebook没有封面图_拾柒自制书封面图分享~

最近大家都在写书 我自己写完收集了很多图片和文字素材现在拿出来分享给大家~希望你们可以用的到分享几张时候做封面的图片给大家哈&#xff01;还有特别多文字素材 大家需要也可以分享给大家呀&#xff01;祝大家都能幸福快乐❤️

桌面计算机盖帘,一种可调节高度的计算机显示器支架的制作方法

本实用新型涉及计算机硬件领域&#xff0c;尤其是一种可调节高度的计算机显示器支架。背景技术&#xff1a;随着科技的进步&#xff0c;社会的发展&#xff0c;人们的生活水平得到了很大的提高&#xff0c;计算机对人们已不再陌生&#xff0c;几乎每家必备一台。通常情况下&…

win10软件拒绝访问删不掉_Win10右键菜单添加“获取文件管理员权限”选项

文件访问被拒绝&#xff0c;你需要TrustedInstaller提供的权限才能对此文件进行更改/文件访问被拒绝&#xff0c;你需要权限才能执行此操作/你需要提供管理员权限才能移动此文件”两种方案一长期为Win10右键菜单添加“获取文件管理员权限”选项 - Windows10.Pro​www.windows10…

db2中null和空值的区别_MySQL数据库的表中 NULL 和 空值 到底有什么区别呢?

作者&#xff1a;极客小俊 一个专注于web技术的80后我不用拼过聪明人&#xff0c;我只需要拼过那些懒人 我就一定会超越大部分人!知乎极客小俊&#xff0c;官方首发原创文章浅谈 NULL 和 空值的区别NULL也就是在字段中存储NULL值空字符串值也就是字段中存储空字符()我们来通过测…

新联会是什么组织的作用_“新国标”脚蹬子受到人们热议!它的作用是什么,可有可无吗?...

在“新国标”实施的这段时间里&#xff0c;有很多人都开始正常出行&#xff0c;人们也不再为电动车而烦恼。因为你要骑行老国标电动车&#xff0c;那么你就去上牌即可。如果你想体验“新国标”电动车&#xff0c;那么在你购买的时候也会给你上牌&#xff0c;那么上路是没有任何…

server精简版代理意外终止 sql_来自阿里巴巴内部JAVA面试宝典意外流出

前言来自阿里巴巴内部面试宝典意外流出&#xff01;面试宝典内容(JVMMybatisZookeeper)&#xff0c;附答案解析MyBatis系列面试宝典1.MyBatis是什么&#xff1f;Mybatis 是一个半 ORM(对象关系映射)框架&#xff0c;它内部封装了 JDBC&#xff0c;开发时只需要关注 SQL 语句本身…

天津科技大学计算机网络,计算机网络PPT(天津科技大学讲稿-张强)第一章英文对照...

计算机网络课程讲义Chapter 1 IntroductionA note on the use of these ppt slides:We’re making these slides freely available to all (faculty, students, readers). They’re in PowerPoint form so you can add, modify, and delete slides (including this one) and sl…

sox处理mp3_音频处理常用Linux命令总结(一)

今天总结一下常用的linux音频处理工具soX - Sound eXchangesoxisoxi 常用选项soxi: SoX vUsage: soxi [-V[level]] [-T] [-t|-r|-c|-s|-d|-D|-b|-B|-p|-e|-a] infile1 ...-V[n] Increment or set verbosity level (default is 2)-T With -s, -d or -D, display the tota…

2019年12月计算机统考答案,2019年12月计算机等级WPS考前冲刺练习题及答案

【导语】2019年12月计算机等级考试已经进入冲刺阶段&#xff0c;为了方便考生及时有效的备考&#xff0c;那么&#xff0c;无忧考网为您精心整理了2019年12月计算机等级WPS考前冲刺练习题及答案&#xff0c;把握机会抓紧练习吧。如想获取更多计算机等级考试的模拟题及备考资料&…

七乐彩中奖规则表_【开奖】双色球第2020094期开奖结果出炉!你中奖了吗?

东莞福彩——让您人生多福&#xff0c;生活多彩&#xff01;购福彩&#xff0c;做公益&#xff0c;圆梦想。●活动进行时●点击了解↓↓↓●【活动1】727福彩嘉年华&#xff1a;福彩携1000万体验券喊你来生日趴&#xff01;●【活动2】刮刮乐新票“超给力”重磅来袭&#xff01…

远程计算机 函数不支持,win7远程桌面连接提示要求的函数不受支持怎么办

摘要 腾兴网为您分享:win7远程桌面连接提示要求的函数不受支持怎么办&#xff0c;作业大师&#xff0c;智学网&#xff0c;虚拟助手&#xff0c;喜马拉雅等软件知识&#xff0c;以及winrar纯净&#xff0c;powerdesigner中文&#xff0c;云协同&#xff0c;smc选型软件&#xf…

arcgis vue 添加图层优化_行业 | ArcGIS制图技巧(超全)

↑ 点击上方「中国测绘学会」可快速关注我们地理信息系统(Geographic Information System或 Geo&#xff0d;Information system&#xff0c;GIS)有时又称为“地学信息系统”。它是一种特定的十分重要的空间信息系统。它是在计算机硬、软件系统支持下&#xff0c;对整个或部分地…

图片大_2020跨年图片 元旦快乐祝福图片 2019再见2020你好图片大全 新年图片

听说你会画蛋&#xff0c;“圆蛋”画得好这是上天的垂青&#xff0c;但要成为一名令人仰慕的画家&#xff0c;还要靠你不懈的追求。愿你为“圆蛋”而努力&#xff0c;因元旦而快乐终生&#xff01;元旦要到&#xff0c;预祝你用开心享受节日每一秒&#xff0c;用高兴感受生活真…