# 项目开发流程、结构及知识 --- 项目架构: demo-api:为后端与后端交互而提供的接口服务。【为服务层和通用处理层提供的接口。】 demo-dao:后端与数据库直接交互的地方。【数据持久层】 demo-manager:代码管理层。【通用处理层:处理三方平台和三方平台的接口】 demo-service:复杂业务层。 demo-web:为前端提供接口。【这里从某种角度,就是图中的开放接口】 start:启动和测试使用。 项目主提结构:【根据阿里巴巴项目目录结构所分析的图形化】 ![项目目录结构图形化](https://images.gitee.com/uploads/images/2022/0119/145654_69e1b56a_8844212.png) --- ## 用户角色设计 采用分层权限模型,来对公司各职务权限和人员进行管理。 如下所示: ![分层设计表](https://img-blog.csdnimg.cn/92f89e1506b04bbc9a30f234bc59b52b.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAYWR2ZW50dXJlLkxp,size_20,color_FFFFFF,t_70,g_se,x_16#pic_center) user 对应 用户 role 对应 角色 permission 对应 权限 通过两个关联表来实现分层权限。【分别为:user_role、role_permission】 对于权限,我们将其分为操作权限,和访问权限。分别对应为:menu、operation。 > 对于访问权限和操作权限的表跟权限表,我采用两个表分别进行关联起来。【menu_permission、operation_permission】 这样就可以更详细的描述公司人员之间的关系了。 --- ## 前后分离思路 > 这里的需要注意的是,token的作用是给系统系别你这账号的权限的。cookie则是自己设置系统是否开启cookie的功能的。如果开启,浏览器就会生成一个cookie给用户,让用户下次登录就不用再次输入账号密码之类的操作。 在做前后分离时,首先要考虑自己的所提供给前端,应该是按照什么格式去反馈。 即请求体和响应体的格式,不同开发人员所定义的请求结构是不同的。所以要找到适合自己习惯的。 下面是自己所觉得合理的请求、响应体: ```json {// 登录响应 "code": 200, "msg": "", "data": null, "token": null } {//请求体 "token": null, "data": { .... } } ``` 实现的流程1 : ![实现流程](https://img-blog.csdnimg.cn/20210625221859278.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L2d1b3J1aV9qYXZh,size_16,color_FFFFFF,t_70) 实现流程2: ![登录认证校验流程](https://kirk.cdkm.com/convert/file/st3xzn75cqvutfbel6opamuyhd6woldg/登录认证校验流程.jpg) ![登录授权流程](https://viewer.diagrams.net/?tags=%7B%7D&highlight=0000ff&edit=_blank&layers=1&nav=1&title=%E6%9D%80%E6%9D%80%E6%9D%80.drawio#R3Vptc6M2EP41mmk%2FeMa8i4%2BAcdOZZuY67t3N9ZuCZZs7jFwhkvh%2BfVcv2MaQlFzPIfEni5W0SLsPj3ZXRk6yffyNk93mli1pgezp8hE5M2Tbluu48CMley0J3KkWrHm%2BNIOOgkX%2BnRphM6zOl7RqDRSMFSLftYUZK0uaiZaMcM4e2sNWrGi%2FdUfWtCNYZKToSj%2FnS7HRUmwHR%2FkNzdeb5s2WH%2BqeLWkGm51UG7JkDyciJ0VOwhkTurV9TGghjdfYRc%2BbP9F7WBinpRgy4e%2FZ9M8SxzfWd%2FJ5%2FhAmnzw8nzhayz0parNhs1ixbyxAl2AQ88i42LA1K0mRHqUxZ3W5pPI1U3g6jvmDsR0ILRB%2BpULsjXdJLRiINmJbmF79TvmiJ%2FdmRBWreUaf2VCDEcLXVDwzzj54AKBL2ZYKvod5nBZE5PftdRCDofVh3NHM0DCWfoHVrY7VsyKXWz23fduyD5tc0MWOKAM8wPfWZ8V7ygV9fN6O3X2bCdhgdd%2Bg2Tw%2FHKFvNXjenMDen17IUt614dMeiE93THzaXaunGEVzFAco9VFsIdz1w3%2Bgs%2B2En49V2xsbq8G1YdUdiFV%2FTKy6Hauv8kJQDjKrY%2F%2BRMeqEY2O0IfTrAak%2FEKThmCD1nwbp%2BET6BlHacwC9b5SGA1FqPeGq14Fp2DF7TCoKkrlB68hIdd8eUrvHzztHqjU0g7KcMaFqdXOoqBYb2G6ewetZeUtKyM0Bs34Bu4irHSlbbvH%2FqWXmHWesYBw5kVz5%2Bu4XKwDFiQweAmwaofWrMvF0xUoxWZFtXuz1BNBCthL0RtdCG9eeJmwpfz5wdj5E6zyXzuhX8qmGjgUpK%2Fi5ZeXAmR%2Fv6lLUL5oSlazcb1ldvWiFnIE%2FBizwlpYFM03AcGbaCSsrVgAM1NPvZaafBWm6a55Lb8mHLSivFKv0LuVDXq7npFzL1STDVn%2BbZ5xVbAUZ9vQLuaF5%2F7QKNjepKM9XJw6v1Ecn3W25u8eTjnvCcwK%2FRb4mouaySiVHlWySsS3s4bRDTgLeExMCwlIPrOAT0%2B%2Be3pHs21qxwOQMj7JcJpfmuvrXszUY%2FcPC%2FbVR0kAdvieN9qZnZNb2h7C2%2F6qs3Y3H3jtrO0NZ2xuVtbv1xjZro9RBABdASOojHKIoUJUHC%2BFENVIUuaYWgS2UBiiMEAaJh8IExWpW6KM4bPSMnwKeo99zRkd%2Ft6i2oBnwr9gDS0uWumHFkvJqfNsFXst2ftBju%2BBVbddT5OnBpSclErLQmKEQywaGtmcMjFIXxVj2nZtY9basak6MWQZGgxPSiaVJ4XMpItOxzZdLTUgUzipyp1RJD%2BxYXgplAS9G3kzqAg7S55lSXQnOvtFEnzgzCAukFshMizPRT3BlELQ%2FA3%2FqdV3p9rjSuZQr7b5SiD5B5fHeGyyeBwShCQg6pzFAIZ6jMFSOjlAYK2ZS%2BHiOxg4NGAwENlPTZ5LbNJ9hW%2FEiVgQJkALNc0V%2B0JXKBlBgbDVv17wYozCVmuNYrceTtCo1ByiK1XoUFEG5wWT0F2CiPAkmtDV%2BLJj4Gcg5488eDjjkhafAsbyLIefqbs3soUmf3ulo9xKDL84uD0vrcGg3jOaPXYywr%2B%2B2zB6Ky3Hvy3rqlZKMgU19xeUJkK6m1SPF%2F98LtUtg2LNHx%2FDV3aLZQ6%2FR7FHv0eyeSqaJI%2BJD%2BColGAKHyIS4AGUZNYQypmiQ%2FWO14kug2cGjo7lbUX%2FvaB5632bjUdHcU%2BGRSAXIziTjRoksKvTiGyRYs3KsonRPhs0RfguAtt2xAe10I7D3Dmg8ENDOtN9ZrwRo3DH8x0pdIM%2BoILmcPxrxhm8Ppj25fU9SfJ75PlHK8WQOflprhAMv9s0srdBUeXz5GKcm68c6%2BJsh7KA0lDQi03Ysg75Ipe0w8jTrNyn3HW%2BybdLURkdwavCKToXH4%2F9gVd%2FJv4md9F8%3D) ## 数据库表 ![数据库表](https://img-blog.csdnimg.cn/1777a1fd625a4c2faaa620f048f382ed.png) ## Spring boot 事务操作 ### 注意事项 1. 同一个类中方法调用,导致@Transactional失效 开发中避免不了会对同一个类里面的方法调用,比如有一个类Test,它的一个方法A,A再调用本类的方法B(不论方法B是用public还是private修饰),但方法A没有声明注解事务,而B方法有。则外部调用方法A之后,方法B的事务是不会起作用的。这也是经常犯错误的一个地方。 那为啥会出现这种情况?其实这还是由于使用Spring AOP代理造成的,因为只有当事务方法被当前类以外的代码调用时,才会由Spring生成的代理对象来管理。 ———————————————— 版权声明:本文为CSDN博主「丶炜钦」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。 原文链接:https://blog.csdn.net/weixin_44521690/article/details/116797363 这里该怎么做? ## 数据库的设计测试案例及方案 --- ```mysql create database test; use test; # 用户 create table users( id int primary key auto_increment, # 自动递增主键 name varchar(244), password varchar(244), rolesid int, # 外键 关联角色的ID createdate timestamp, updatedate timestamp ) character set = UTF8MB4; # 角色 create table roles( id int not null default 0 , # 主键 默认0 name varchar(30), permissionid int not null auto_increment, # 非主键 约束唯一索引 自动递增 并 外键 关联 permission 的ID createdate timestamp, updatedate timestamp, primary key (`id`), unique key (`permissionid`) )character set = UTF8MB4; # 权限表 create table permission( id int primary key auto_increment, # 自动递增主键 rolesid int, name varchar(20), operationid int, # 外键 关联operation的ID createdate timestamp, updatedate timestamp )character set = UTF8MB4; # menu操作权限访问模块表 create table operation( id int primary key , # 主键 非自动递增 name varchar(20), url varchar(20), createdate timestamp, updatedate timestamp )character set = UTF8MB4; # 用户---角色的外键 alter table users add constraint ur foreign key (rolesid) references roles(id); # 角色---权限 & 权限---menu访问模块 的外键。 alter table permission add constraint pr foreign key (rolesid) references roles(id); alter table permission add constraint op foreign key (operationid) references operation(id); alter table permission drop foreign key op; alter table users drop foreign key ur; drop table users; drop table roles; drop table permission; # 用户 insert into users (name,password,rolesid,createdate,updatedate) VALUES ('123333','vip2333','1',now(),now()); insert into users (name,password,rolesid,createdate,updatedate) VALUES ('123343','vip2343','2',now(),now()); insert into users (name,password,rolesid,createdate,updatedate) VALUES ('123353','vip2353','3',now(),now()); # 角色 insert into roles (id, name, createdate, updatedate) VALUES ('1','admin1',now(),now()); insert into roles (id, name, createdate, updatedate) VALUES ('2','admin2',now(),now()); insert into roles (id, name, createdate, updatedate) VALUES ('3','admin3',now(),now()); insert into roles (id, name, createdate, updatedate) VALUES ('4','admin4',now(),now()); # 权限 insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','add','1',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','delete','1',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','select','1',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','updata','1',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','add','191',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','delete','191',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','select','191',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','updata','191',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','add','1101',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','delete','1101',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','select','1101',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','updata','1101',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','add','1111',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','delete','1111',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','select','1111',now(),now()); insert into permission (rolesid, name,operationid, createdate, updatedate) VALUES ('3','updata','1111',now(),now()); # 菜单功能访问模块 # 设置menu 1 【】 insert into operation (id, name, url, createdate, updatedate) VALUES ('1','个人信息','/me',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('21','部门管理','/index/work',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('31','人员管理','/index/people',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('41','资产类别','/index/assettype',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('51','品牌','/index/brand',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('61','取得方式','/index/method',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('71','供应商','/index/vendor',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('81','存放地点','/index/address',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('91','设备用途','/index/driver',now(),now()); # insert into operation (id, name, url, createdate, updatedate) VALUES ('11','报废方式','/index/repair',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('111','资产申购','/:user/by',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('121','资产入库','/:user/input',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('131','资产信息维护','/:user/edit',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('141','资产借还','/:user/debit',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('151','资产转移','/:user/Transfer',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('161','资产维修','/:user/fix',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('171','资产报废','/:user/repair',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('181','资产盘点','/:user/Inventory',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('191','资产查询统计','/:user/Query',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('1101','资产申购审批','/:user/Approval/by',now(),now()); insert into operation (id, name, url, createdate, updatedate) VALUES ('1111','资产报废审批','/:user/Approval/repair',now(),now()); select * from users; select * from roles; select * from operation; select * from permission; # 通过角色去查询权限。 select distinct u.name,o.id,o.url from users as u left join roles as r on u.rolesid = r.id left join permission p on u.rolesid = p.rolesid right join operation o on p.operationid = o.id where u.name = 123353; # 结果:1 = 40 = admin1 ;2 = 80 = admin2 ;3 = 32 = admin3; # 过滤用户名,权限:四种权限的operation # 角色添加? # 用户授权? # 超级用户:拥有对整个系统的权限角色分配,功能分配有着绝对的操作。并且可对所存在的公司员工进行查询。 ``` 在设计数据库中的时候,对于公司类型的管理系统,我们可以通过分层权限结构来对其人员权限进行设计,这样才更贴近公司层级。 #### 分页查询 需要展示的数据,分两部分:1. 当前页的数据信息;2. 分页信息 分页信息: beginPage: 首页 prevPage: 上一页 nextPage: 下一页 totalPage: 总页数/末页 totalCount/rows: 总条数 currentPage: 当前页 pageSize: 每页显示多少条数据 --- 查阅的资料地址: [地址1](https://www.yii666.com/blog/335776.html)