# managementSystem_front **Repository Path**: JYbill/management-system_front ## Basic Information - **Project Name**: managementSystem_front - **Description**: vue + adminTEL + axios前端管理系统配合后端SSM项目 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-02-01 - **Last Updated**: 2021-03-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README --- typora-root-url: ./ --- # 数据库 ## SQL语句 ```sql CREATE TABLE product( id varchar2(32) default SYS_GUID() PRIMARY KEY, productNum VARCHAR2(50) NOT NULL, productName VARCHAR2(50), cityName VARCHAR2(50), DepartureTime timestamp, productPrice Number, productDesc VARCHAR2(500), productStatus INT, CONSTRAINT product UNIQUE (id, productNum) ) insert into PRODUCT (id, productnum, productname, cityname, departuretime, productprice, productdesc, productstatus) values ('676C5BD1D35E429A8C2E114939C5685A', 'itcast-002', '北京三日游', '北京', to_timestamp('10- 10-2018 10:10:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 1200, '不错的旅行', 1); insert into PRODUCT (id, productnum, productname, cityname, departuretime, productprice, productdesc, productstatus) values ('12B7ABF2A4C544568B0A7C69F36BF8B7', 'itcast-003', '上海五日游', '上海', to_timestamp('25- 04-2018 14:30:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 1800, '魔都我来了', 0); insert into PRODUCT (id, productnum, productname, cityname, departuretime, productprice, productdesc, productstatus) values ('9F71F01CB448476DAFB309AA6DF9497F', 'itcast-001', '北京三日游', '北京', to_timestamp('10- 10-2018 10:10:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 1200, '不错的旅行', 1); ``` ## 产品表 ![image-20210202163541633](./mdImgRoot/产品表.png) ## 订单表 ![image-20210202163541633](./mdImgRoot/订单表.png) ## 会员表 ![image-20210202163541633](./mdImgRoot/会员表.png) ## 旅客表 ![image-20210202163541633](./mdImgRoot/旅客表.png) ```sql --创建顺序: 会员 -> 旅客 -> 订单 -> 旅客/订单中间(oracle一定要commit提交, 默认Oracle开启手动事务) -- 订单 drop table orders; CREATE TABLE orders( id varchar2(32) default SYS_GUID() PRIMARY KEY, orderNum VARCHAR2(20) NOT NULL UNIQUE, orderTime timestamp, peopleCount INT, orderDesc VARCHAR2(500), payType INT, orderStatus INT, productId varchar2(32), memberId varchar2(32), FOREIGN KEY (productId) REFERENCES product(id), FOREIGN KEY (memberId) REFERENCES member(id) ) insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('0E7231DC797C486290E8713CA3C6ECCC', '12345', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('5DC6A48DD4E94592AE904930EA866AFA', '54321', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '676C5BD1D35E429A8C2E114939C5685A', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('2FF351C4AC744E2092DCF08CFD314420', '67890', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('A0657832D93E4B10AE88A2D4B70B1A28', '98765', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('E4DD4C45EED84870ABA83574A801083E', '11111', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('96CC8BD43C734CC2ACBFF09501B4DD5D', '22222', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '12B7ABF2A4C544568B0A7C69F36BF8B7', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('55F9AF582D5A4DB28FB4EC3199385762', '33333', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('CA005CF1BE3C4EF68F88ABC7DF30E976', '44444', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB'); insert into ORDERS (id, ordernum, ordertime, peoplecount, orderdesc, paytype, orderstatus, productid, memberid) values ('3081770BC3984EF092D9E99760FDABDE', '55555', to_timestamp('02-03-2018 12:00:00.000000', 'dd-mm-yyyy hh24:mi:ss.ff'), 2, '没什么', 0, 1, '9F71F01CB448476DAFB309AA6DF9497F', 'E61D65F673D54F68B0861025C69773DB'); -- 会员 drop table member; CREATE TABLE member( id varchar2(32) default SYS_GUID() PRIMARY KEY, NAME VARCHAR2(20), nickname VARCHAR2(20), phoneNum VARCHAR2(20), email VARCHAR2(20) ); insert into MEMBER (id, name, nickname, phonenum, email) values ('E61D65F673D54F68B0861025C69773DB', '张三', '小三', '18888888888', 'zs@163.com'); -- 旅客 drop table traveller; CREATE TABLE traveller( id varchar2(32) default SYS_GUID() PRIMARY KEY, NAME VARCHAR2(20), sex VARCHAR2(20), phoneNum VARCHAR2(20), credentialsType INT, credentialsNum VARCHAR2(50), travellerType INT ) insert into TRAVELLER (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype) values ('3FE27DF2A4E44A6DBC5D0FE4651D3D3E', '张龙', '男', '13333333333', 0, '123456789009876543', 0); insert into TRAVELLER (id, name, sex, phonenum, credentialstype, credentialsnum, travellertype) values ('EE7A71FB6945483FBF91543DBE851960', '张小龙', '男', '15555555555', 0, '987654321123456789', 1); -- 订单与旅客中间表 drop table order_traveller; CREATE TABLE order_traveller( orderId varchar2(32), travellerId varchar2(32), PRIMARY KEY (orderId,travellerId), FOREIGN KEY (orderId) REFERENCES orders(id), FOREIGN KEY (travellerId) REFERENCES traveller(id) ) insert into ORDER_TRAVELLER (orderid, travellerid) values ('0E7231DC797C486290E8713CA3C6ECCC', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('2FF351C4AC744E2092DCF08CFD314420', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('3081770BC3984EF092D9E99760FDABDE', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('55F9AF582D5A4DB28FB4EC3199385762', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('5DC6A48DD4E94592AE904930EA866AFA', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('96CC8BD43C734CC2ACBFF09501B4DD5D', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('A0657832D93E4B10AE88A2D4B70B1A28', '3FE27DF2A4E44A6DBC5D0FE4651D3D3E'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('CA005CF1BE3C4EF68F88ABC7DF30E976', 'EE7A71FB6945483FBF91543DBE851960'); insert into ORDER_TRAVELLER (orderid, travellerid) values ('E4DD4C45EED84870ABA83574A801083E', 'EE7A71FB6945483FBF91543DBE851960'); ``` 订单-旅客-产品-会员关系图: ![image-20210202163541633](./mdImgRoot/订单-旅客-会员-产品关系.png) ## 用户表 ![image-20210202163541633](./mdImgRoot/用户表.png) ## 角色表 ![image-20210202163541633](./mdImgRoot/角色表.png) ## 资源权限表 ![image-20210202163541633](./mdImgRoot/资源权限.png) ![image-20210202163541633](./mdImgRoot/用户表-角色表-资源权限表关系.png) + sql语句: ```sql -- 用户表 CREATE TABLE users( id varchar2(32) default SYS_GUID() PRIMARY KEY, email VARCHAR2(50) UNIQUE NOT NULL, username VARCHAR2(50), PASSWORD VARCHAR2(50), phoneNum VARCHAR2(20), STATUS INT ) -- 角色表 CREATE TABLE role( id varchar2(32) default SYS_GUID() PRIMARY KEY, roleName VARCHAR2(50) , roleDesc VARCHAR2(50) ) -- 用户角色关联表 CREATE TABLE users_role( userId varchar2(32), roleId varchar2(32), PRIMARY KEY(userId,roleId), FOREIGN KEY (userId) REFERENCES users(id), FOREIGN KEY (roleId) REFERENCES role(id) ) -- 资源权限表 CREATE TABLE permission( id varchar2(32) default SYS_GUID() PRIMARY KEY, permissionName VARCHAR2(50) , url VARCHAR2(50) ) -- 角色权限关联表 CREATE TABLE role_permission( permissionId varchar2(32), roleId varchar2(32), PRIMARY KEY(permissionId,roleId), FOREIGN KEY (permissionId) REFERENCES permission(id), FOREIGN KEY (roleId) REFERENCES role(id) ) ``` ## 日志表 ![image-20210202163541633](./mdImgRoot/日志表.png) ```sql CREATE TABLE sysLog( id VARCHAR2(32) default SYS_GUID() PRIMARY KEY, visitTime timestamp, username VARCHAR2(50), ip VARCHAR2(30), url VARCHAR2(50), executionTime int, method VARCHAR2(200) ) ``` # 接口 ## 1. 产品接口 + 请求路径:product ### 1.1.1 查询所有商品(新增分页查询, 保留) + 请求路径:findAll + 请求方法:get + 请求参数:无 + 响应参数 | 参数名 | 参数说明 | 参数备注 | | :-----------: | :----------------------: | :------: | | products | 查询的所有商品 | | | id | 商品id | | | productNum | 商品编号 | | | productName | 商品名 | | | departureTime | 快递出发时间`毫秒` | | | productDesc | 商品描述 | | | productStatus | 订单状态`1-开启, 2-关闭` | | + 响应结果 ```json { "data": { "products": [ { "id": "676C5BD1D35E429A8C2E114939C5685A", "productNum": "itcast-002", "productName": "北京三日游", "cityName": "北京", "departureTime": 1539137400000, "productPrice": 1200.0, "productDesc": "不错的旅行", "productStatus": 1 }, { "id": "12B7ABF2A4C544568B0A7C69F36BF8B7", "productNum": "itcast-003", "productName": "上海五日游", "cityName": "上海", "departureTime": 1524637800000, "productPrice": 1800.0, "productDesc": "魔都我来了", "productStatus": 0 } ] }, "meta": { "msg": "成功", "status": 200 } } ``` ### 1.1.2 添加商品 + 请求路径:saveProduct + 请求方法:post `text/json;charset=utf-8` + 请求参数: | 参数名 | 参数说明 | | | ------------- | ----------------------- | ---- | | departureTime | 出发时间 | | | productPrice | 产品价格 | | | productDesc | 产品简介 | | | productStatus | 产品状态`1-开启 2-关闭` | | | productNum | 产品编号 | | | productName | 产品名称 | | | cityName | 出发城市 | | + 响应参数 ```json { "data": {}, "meta": { "msg": "添加成功", "status": 200 } } ``` ### 1.1.3 分页查询商品 + 请求路径:findProductsByPage + 请求方法:get + 请求参数: | 参数名 | 参数说明 | | | -------- | -------- | ---- | | query | 参数 | | | pageSize | 每页数 | | | pageNum | 当前页 | | + 响应参数 | 参数名 | 参数说明 | | | -------- | -------------- | ---- | | page | 查询信息 | | | total | 总条数 | | | list | 查询的主要内容 | | | pageNum | 当前页 | | | pageSize | 每页多少条 | | ```json { "data": { "page": { "total": 2, "list": [ { "id": "676C5BD1D35E429A8C2E114939C5685A", "productNum": "itcast-002", "productName": "北京三日游", "cityName": "北京", "departureTime": 1539137400000, "productPrice": 1200.0, "productDesc": "不错的旅行", "productStatus": 1 }, { "id": "9F71F01CB448476DAFB309AA6DF9497F", "productNum": "itcast-001", "productName": "北京三日游", "cityName": "北京", "departureTime": 1539137400000, "productPrice": 1200.0, "productDesc": "不错的旅行", "productStatus": 1 } ], "pageNum": 1, "pageSize": 2, "size": 2, "startRow": 0, "endRow": 1, "pages": 1, "prePage": 0, "nextPage": 0, "isFirstPage": true, "isLastPage": true, "hasPreviousPage": false, "hasNextPage": false, "navigatePages": 8, "navigatepageNums": [ 1 ], "navigateFirstPage": 1, "navigateLastPage": 1, "query": null, "lastPage": 1, "firstPage": 1 } }, "meta": { "msg": "OK", "status": 200 } } ``` ### 1.1.4 删除商品 + 请求路径:/delProduct/{pid} + 请求方法:DELETE + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | pid | 商品id | | + 响应参数 ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 1.1.5 更新产品(待前端渲染) + 请求路径:/product/updateProduct + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | ------------- | ------------------ | ---- | | id | 产品主键 | | | productNum | 产品编号 | | | productName | 产品名 | | | cityName | 城市名 | | | departureTime | 出发时间戳 | | | productPrice | 产品价格 | | | productDesc | 产品描述 | | | productStatus | 状态 0 关闭 1 开启 | | ```json { "id":... ... "productStatus": 1 } ``` + 响应参数: ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 1.1.6 根据产品id查询指定产品(待前端渲染) + 请求路径:/product/findProductByPid + 请求方法: GET + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | pid | 产品id | | ```json { "data": { "product": { "id": "676C5BD1D35E429A8C2E114939C5685A", "productNum": "itcast-002", "productName": "北京三日游", "cityName": "北京", "departureTime": 1539137400000, "productPrice": 1200.0, "productDesc": "不错的旅行", "productStatus": 1 } }, "meta": { "msg": "OK", "status": 200 } } ``` ## 2. 订单接口 + 接口:/order ### 2.1.1 分页查询 + 请求路径:findOrders + 请求方法:get + 请求参数: | 参数名 | 参数说明 | | | -------- | -------- | ---- | | query | 参数 | | | pageSize | 每页数 | | | pageNum | 当前页 | | + 响应参数 | 参数名 | 参数说明 | | | -------- | ---------------- | ---- | | page | 查询信息 | | | total | 总条数 | | | list | 查询的主要内容 | | | pageNum | 当前页 | | | pageSize | 每页多少条 | | | product | 一对一的商品信息 | | ```json { "data": { "page": { "total": 3, "list": [ { "id": "0E7231DC797C486290E8713CA3C6ECCC", "orderNum": "12345", "orderTime": 1519963200000, "orderStatus": 1, "peopleCount": 2, "product": { "id": "676C5BD1D35E429A8C2E114939C5685A", "productNum": "itcast-002", "productName": "北京三日游", "cityName": "北京", "departureTime": 1539137400000, "productPrice": 1200.0, "productDesc": "不错的旅行", "productStatus": 1 }, "travellers": null, "member": null, "payType": 0, "orderDesc": "没什么" }, { "id": "5DC6A48DD4E94592AE904930EA866AFA", "orderNum": "54321", "orderTime": 1519963200000, "orderStatus": 1, "peopleCount": 2, "product": { "id": "676C5BD1D35E429A8C2E114939C5685A", "productNum": "itcast-002", "productName": "北京三日游", "cityName": "北京", "departureTime": 1539137400000, "productPrice": 1200.0, "productDesc": "不错的旅行", "productStatus": 1 }, "travellers": null, "member": null, "payType": 0, "orderDesc": "没什么" }, { "id": "E4DD4C45EED84870ABA83574A801083E", "orderNum": "11111", "orderTime": 1519963200000, "orderStatus": 1, "peopleCount": 2, "product": { "id": "12B7ABF2A4C544568B0A7C69F36BF8B7", "productNum": "itcast-003", "productName": "上海五日游", "cityName": "上海", "departureTime": 1524637800000, "productPrice": 1800.0, "productDesc": "魔都我来了", "productStatus": 0 }, "travellers": null, "member": null, "payType": 0, "orderDesc": "没什么" } ], "pageNum": 1, "pageSize": 3, "size": 3, "startRow": 0, "endRow": 2, "pages": 1, "prePage": 0, "nextPage": 0, "isFirstPage": true, "isLastPage": true, "hasPreviousPage": false, "hasNextPage": false, "navigatePages": 8, "navigatepageNums": [ 1 ], "navigateFirstPage": 1, "navigateLastPage": 1, "query": null, "lastPage": 1, "firstPage": 1 } }, "meta": { "msg": "成功", "status": 200 } } ``` ### 2.1.2 详细订单查询 + 请求路径:findOrderInfo + 请求方法:get + 请求参数: | 参数名 | 参数说明 | | | ------ | ------------ | ---- | | id | 详细订单主键 | | + 响应参数 | 参数名 | 参数说明 | | | --------------- | -------------------------------------- | ---- | | product | 详细商品 | | | travellers | 详细旅客(1:more) | | | member | 详细会员 | | | payType | 支付类型`0-支付宝 1-微信 3-其他` | | | travellerType | 旅客类型`0-承认 1-儿童` | | | credentialsType | 旅客证件类型`0-身份证 1-护照 2-军官证` | | ```json { "data": { "order": { "id": "3081770BC3984EF092D9E99760FDABDE", "orderNum": "55555", "orderTime": 1519963200000, "orderStatus": 1, "peopleCount": 2, "product": { "id": "9F71F01CB448476DAFB309AA6DF9497F", "productNum": "itcast-001", "productName": "北京三日游", "cityName": "北京", "departureTime": 1539137400000, "productPrice": 1200.0, "productDesc": "不错的旅行", "productStatus": 1 }, "travellers": [ { "id": "EE7A71FB6945483FBF91543DBE851960", "name": "张小龙", "sex": "男", "phoneNum": "15555555555", "credentialsType": 0, "credentialsTypeStr": null, "credentialsNum": "987654321123456789", "travellerType": 1, "travellerTypeStr": null } ], "member": { "id": "E61D65F673D54F68B0861025C69773DB", "name": "张三", "nickname": "小三", "phoneNum": "18888888888", "email": "zs@163.com" }, "payType": 0, "orderDesc": "没什么" } }, "meta": { "msg": "ok", "status": 200 } } ``` ### 2.1.3 删除订单 + 请求路径:/delOrder/{oid} + 请求方法:DELETE + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | oid | 订单id | | + 响应参数 ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ## 3. 用户接口 + 接口:/user ### 3.1.1 登陆 + 请求路径:login + 请求方法:post + 请求参数: | 参数名 | 参数说明 | | | -------- | -------- | ---- | | username | 用户名 | | | password | 密码 | | + 响应参数 | 参数名 | 参数说明 | | | ------ | -------------------------------- | ---- | | token | 请求头设置认证,每次访问必须携带 | | ```json { "data": { "token": "Bearer eyJ0eXAiOiJqd3QiLCJhbGciOiJIUzI1NiJ9.eyJ1c2VySW5mbyI6eyJpZCI6IkY3RDdBQzkwNDhENjQ5MDNCNzA2NjQ2QTdDMzQ3Q0Q0IiwidXNlcm5hbWUiOiJiYW4iLCJlbWFpbCI6Inp6QHRlc3QuY24iLCJwYXNzd29yZCI6ImJhbiIsInBob25lTnVtIjoiMTIzOTk5ODg4ODgiLCJzdGF0dXMiOjEsInJvbGVzIjpbeyJpZCI6IkJDQzY2MkVDNjQwMDQwQkI5RDU4OTQyMDc2QUNFNEY1Iiwicm9sZU5hbWUiOiJCQU4iLCJyb2xlRGVzYyI6IuWwj-m7keWxiyIsInBlcm1pc3Npb25zIjpudWxsLCJteVVzZXJzIjpudWxsfV19LCJyb2xlcyI6W3siaWQiOiJCQ0M2NjJFQzY0MDA0MEJCOUQ1ODk0MjA3NkFDRTRGNSIsInJvbGVOYW1lIjoiQkFOIiwicm9sZURlc2MiOiLlsI_pu5HlsYsiLCJwZXJtaXNzaW9ucyI6bnVsbCwibXlVc2VycyI6bnVsbH1dLCJzdGF0dXMiOjEsImlhdCI6MTYxMjc2NzM3OSwiZXhwIjoxNjEyOTgzMzc5fQ.JnQFngK_nRWYh1LdY1MIfALKvBDnDET-1nP77VST6Yk" }, "meta": { "msg": "登陆成功", "status": 200 } } ``` ### 3.1.2 退出 + 请求路径:quite + 请求方法: get/post + 请求参数:无 + 响应参数 | 参数名 | 参数说明 | 备注 | | -------- | ---------- | ---- | | redirect | 重定向路径 | | ```json { "data": { "redirect": "login" }, "meta": { "msg": "token失效请重新登录", "status": 400 } } ``` ### 3.1.3 查询所有用户(不携带角色、权限) + 请求路径:findUsersByPage + 请求方法: 不限制 + 请求参数: | 参数名 | 参数说明 | | | -------- | -------- | ---- | | query | 参数 | | | pageSize | 每页数 | | | pageNum | 当前页 | | + 响应参数 ```json { "data": { "page": { "total": 4, "list": [ { "id": "A2BBE14222024DAE9E6888FFA58307F1", "username": "jybill", "email": "123@sina.cn", "password": "202cb962ac59075b964b07152d234b70", "phoneNum": "13799990000", "status": 1, "roles": null } ], "pageNum": 1, "pageSize": 1, "size": 1, "startRow": 1, "endRow": 1, "pages": 4, "prePage": 0, "nextPage": 2, "isFirstPage": true, "isLastPage": false, "hasPreviousPage": false, "hasNextPage": true, "navigatePages": 8, "navigatepageNums": [ 1, 2, 3, 4 ], "navigateFirstPage": 1, "navigateLastPage": 4, "query": null, "firstPage": 1, "lastPage": 4 } }, "meta": { "msg": "OK", "status": 200 } } ``` ### 3.1.4 添加用户并绑定角色 + 请求路径:addUser + 请求方法: POST + 请求参数:`json` | 参数名 | 参数说明 | | | -------- | ----------------------------- | ---- | | username | 用户名 | | | status | 状态`1:激活, 2:未激活` | | | roles | 绑定的角色id,必须为1个或以上 | | ```json { "username": "JYBill_test01", "password": "123456", "email": "17683860320@m0sina.cn", "phoneNum": "13988822221", "status": 1, "roles": [ { "id": "9BEBC825B6144D75A6B355C7A5EF349E" }, { "id": "103FCB105DD845049B65C80F24EBC095" } ] } ``` + 响应参数 ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 3.1.4 删除用户 + 请求路径:delUser/{uid} + 请求方法: DELETE + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | uid | 用户id | | + 响应参数 ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 3.1.5 更新用户 + 请求路径:user/updateUser + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | -------- | -------------------------- | ---- | | id | 用户id | | | username | 用户名 | | | email | 邮箱 | | | password | 密码 | | | phoneNum | 用户手机号 | | | status | 用户状态`0:未激活, 1:激活` | | | roles | 角色数组 | | ```json { "id": ... ... "status": 1 "roles": [ {"id": ...}, {"id": ...} ... ] } ``` + 响应参数: ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 4.1.6 根据角色id查询用户 + 请求路径:/user/findUserByuid + 请求方法: GET + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | uid | 用户id | | + 响应参数: ```json { "data": { "user": { "id": "85BC860B06AD425E89842CDF9634CF17", "username": "小瘪三", "email": "111@xx.cn", "password": "000000", "phoneNum": "13799920863", "status": 1, "roles": null } }, "meta": { "msg": "OK", "status": 200 } } ``` ## 4. 权限接口 + 接口:permission ### 4.1.1 根据角色id查询权限信息 + 请求路径:findPermissionByRid + 请求方法: 不限制 + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | rid | 角色id | | + 响应参数:`permissions`: 对应角色下所有的权限列表 ```json { "data": { "permissions": [ { "id": "F5B757832597452DB5D127A69AA8D17F", "permissionName": "userLogin", "url": "/user/login", "roles": null }, { "id": "50FF26A6C8A748AF8B3B937E75B161F2", "permissionName": "orderFindOrders", "url": "/order/findOrders", "roles": null }, { "id": "27B3766A9E3D4FE49967260D92492BEE", "permissionName": "orderFindOrderInfo", "url": "/order/findOrderInfo", "roles": null }, { "id": "8984F454401F4F008E0B212E0FE2E9E4", "permissionName": "productFindAll", "url": "/product/findAll", "roles": null }, { "id": "547F49B794DD44ACBB04EC879A4AA5D7", "permissionName": "productSaveProduct", "url": "/product/saveProduct", "roles": null }, { "id": "76520997DB3B4CBE8B8E0B229B75F3EC", "permissionName": "productFindProductsByPage", "url": "/product/findProductsByPage", "roles": null }, { "id": "74687AEEE81946D5A16490817E74BD49", "permissionName": "userQuite", "url": "/user/quite", "roles": null } ] }, "meta": { "msg": "查询成功", "status": 200 } } ``` ### 4.1.2 查询所有权限 + 请求路径:findAllPermissions + 请求方法: 不限制 + 请求参数:无 + 响应参数:返回所有权限集合 ```json { "data": { "permissions": [ { "id": "F5B757832597452DB5D127A69AA8D17F", "permissionName": "userLogin", "url": "/user/login", "roles": null }, { "id": "50FF26A6C8A748AF8B3B937E75B161F2", "permissionName": "orderFindOrders", "url": "/order/findOrders", "roles": null }, { "id": "27B3766A9E3D4FE49967260D92492BEE", "permissionName": "orderFindOrderInfo", "url": "/order/findOrderInfo", "roles": null }, { "id": "8984F454401F4F008E0B212E0FE2E9E4", "permissionName": "productFindAll", "url": "/product/findAll", "roles": null }, { "id": "547F49B794DD44ACBB04EC879A4AA5D7", "permissionName": "productSaveProduct", "url": "/product/saveProduct", "roles": null }, { "id": "76520997DB3B4CBE8B8E0B229B75F3EC", "permissionName": "productFindProductsByPage", "url": "/product/findProductsByPage", "roles": null }, { "id": "74687AEEE81946D5A16490817E74BD49", "permissionName": "userQuite", "url": "/user/quite", "roles": null } ] }, "meta": { "msg": "OK", "status": 200 } } ``` ### 4.1.3 分页查询所有权限 + 请求路径:permission/findPermissionsByPage + 请求方法: GET + 请求参数: | 参数名 | 参数说明 | | | -------- | ------------ | ---- | | query | 模糊查询参数 | | | pageNum | 当前页 | | | pageSize | 每页条数 | | + 响应参数: ```json { "data": { "page": { "total": 7, "list": [ { "id": "F5B757832597452DB5D127A69AA8D17F", "permissionName": "userLogin", "url": "/user/login", "roles": null }, { "id": "50FF26A6C8A748AF8B3B937E75B161F2", "permissionName": "orderFindOrders", "url": "/order/findOrders", "roles": null } ], "pageNum": 1, "pageSize": 2, "size": 2, "startRow": 1, "endRow": 2, "pages": 4, "prePage": 0, "nextPage": 2, "isFirstPage": true, "isLastPage": false, "hasPreviousPage": false, "hasNextPage": true, "navigatePages": 8, "navigatepageNums": [ 1, 2, 3, 4 ], "navigateFirstPage": 1, "navigateLastPage": 4, "query": null, "lastPage": 4, "firstPage": 1 } }, "meta": { "msg": "OK", "status": 200 } } ``` ### 4.1.4 添加权限 + 请求路径:permission/addPermission + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | -------------- | -------- | ---- | | permissionName | 权限名 | | | url | 访问uri | | + 响应参数: ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 4.1.5 更新权限 + 请求路径:permission/updatePermission + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | -------------- | -------- | ---- | | permissionName | 权限名 | | | url | 访问uri | | | id | 权限id | | + 响应参数: ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 4.1.6 删除权限 + 请求路径:permission/delPermission/{pid} + 请求方法: DELETE + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | pid | 权限id | | + 响应参数: ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 4.1.7 根据id获取指定权限 + 请求路径:permission/findPermissionByPid + 请求方法: GET + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | pid | 权限id | | + 响应参数: ```json ``` ## 5. 角色接口 + 接口: role ### 5.1.1 根据用户id查询角色信息(不携带权限) + 请求路径:findRolesById + 请求方法: 不限制 + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | id | 用户id | | + 响应参数 ```json { "data": { "roles": [ { "id": "103FCB105DD845049B65C80F24EBC095", "roleName": "USER", "roleDesc": "用户", "permissions": null, "myUsers": null }, { "id": "9BEBC825B6144D75A6B355C7A5EF349E", "roleName": "ADMIN", "roleDesc": "管理员", "permissions": null, "myUsers": null } ] }, "meta": { "msg": "查询成功", "status": 200 } } ``` ### 5.5.2 根据page信息查询所有roles + 请求路径:findRolesByPage + 请求方法: GET + 请求参数: | 参数名 | 参数说明 | | | -------- | ---------------- | ---- | | query | 角色名(模糊查询) | | | pageNum | 当前页 | | | pageSize | 每页多少条 | | + 响应参数 ```json { "data": { "info": { "total": 1, "list": [ { "id": "9BEBC825B6144D75A6B355C7A5EF349E", "roleName": "ADMIN", "roleDesc": "管理员", "permissions": null, "myUsers": null } ], "pageNum": 1, "pageSize": 10, "size": 1, "startRow": 1, "endRow": 1, "pages": 1, "prePage": 0, "nextPage": 0, "isFirstPage": true, "isLastPage": true, "hasPreviousPage": false, "hasNextPage": false, "navigatePages": 8, "navigatepageNums": [ 1 ], "navigateFirstPage": 1, "navigateLastPage": 1, "query": null, "firstPage": 1, "lastPage": 1 } }, "meta": { "msg": "OK", "status": 200 } } ``` ## ### 5.5.3 添加角色 + 请求路径:addRole + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | ----------- | ---------- | ---- | | roleName | 角色名 | | | roleDesc | 角色描述 | | | permissions | 关联的权限 | | + 响应参数 ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 5.5.4 删除角色 + 请求路径:delRole/{rid} + 请求方法: DELETE + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | rid | 角色id | | + 响应参数 ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 5.1.5 查询所有角色 + 请求路径:findAllRoles + 请求方法: 不限制 + 请求参数:无 + 响应参数:返回所有权限集合 ```json { "data": { "roles": [ { "id": "9BEBC825B6144D75A6B355C7A5EF349E", "roleName": "ADMIN", "roleDesc": "管理员", "permissions": null, "myUsers": null }, { "id": "103FCB105DD845049B65C80F24EBC095", "roleName": "USER", "roleDesc": "用户", "permissions": null, "myUsers": null }, { "id": "BCC662EC640040BB9D58942076ACE4F5", "roleName": "BAN", "roleDesc": "小黑屋", "permissions": null, "myUsers": null } ] }, "meta": { "msg": "OK", "status": 200 } } ``` ### 5.1.6 根据角色id查询当前的角色信息(不包含权限) + 请求路径:findRoleByRid + 请求方法: GET + 请求参数: | 参数名 | 参数说明 | | | ------ | -------- | ---- | | rid | 角色id | | + 响应参数:详细的角色信息(不包含权限) ### 5.1.7 更新角色信息(不包含权限分配) + 请求路径:updateRole + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | -------- | -------- | ---- | | id | 角色id | | | roleName | 角色名 | | | roleDesc | 角色描述 | | + 响应参数:(成功) ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ### 5.1.8 修改角色权限 + 请求路径:updateRolePermissions + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | ----------- | -------- | ---- | | id | 角色id | | | permissions | 权限数组 | | ```json { "id": 角色id "permissions": [ {"id": "权限A id"}, {"id": "权限B id"} ... ] } ``` + 响应参数: ```json { "data": {}, "meta": { "msg": "OK", "status": 200 } } ``` ## 6. 日志接口 ### 6.1.1 分页查询日志 + 请求路径:/log/findLogsByPage + 请求方法: POST + 请求参数: | 参数名 | 参数说明 | | | -------- | ---------- | ---- | | query | 查询参数 | | | pageNum | 当前页 | | | pageSize | 每页总条数 | | + 响应参数: ```json { "data": { "logs": [ { "id": "8E412013515E41FE9027BA4C110BD5A2", "visitTime": 1615297387495, "username": "jybill", "ip": "0:0:0:0:0:0:0:1", "url": "/permission/findAllPermissions", "executionTime": 66, "method": "findAllPermissions" } ] }, "meta": { "msg": "OK", "status": 200 } } ``` # 需求分析 ## 产品模块 1. 根据条件查询 `明天改造查询所有并分页渲染` √ + domian多添加两个属性`departureTimeStr:string是否已出发`、`productStatusStr:订单是否开启` 考虑到是异步操作,将其交给前端处理。 + `IProductDao接口`:findAll方法 + service添加注解事务 + 渲染前端页面 + 增加pagehelper分页 2. 添加产品 √ + 添加产品后再次重新获取查询,渲染页面 + bug: SSM的类型转换问题 `今后前端事件最好用时间戳` + 添加成功跳转到展示产品界面,失败在当前添加页面提示错误 3. 删除产品 √ ## 订单模块 1. 查询所有 `差前端渲染` √ + dao层查询出有所有订单,并`关联产品名称1:多`封装到order对象中 + 前端渲染 + 添加pagehelper分页 2. 订单详情 √ + 前端get请求携带`订单id`后台根据`id`获取产品信息(1:1)、会员信息(1:1)、旅客信息(1:more) + 根据id获取订单、根据外键获取member、根据主键获取traveller(查中间表)、根据外键获取product + JSON序列化返还给前端 + 前端渲染到`el-form`组件上 + 业务流程图 ![image-20210202163541633](./mdImgRoot/订单详细.png) 3. 删除产品流程分析 ![image-20210202163541633](./mdImgRoot/删除产品流程分析.png) 3. 删除订单 √ + check是否有多对多关联traveller + 有:根据oid删除多表关联 + 无:直接根据oid删除 ## 权限控制 1. 用户只可访问指定接口、管理员全部可访问、BAN用户表示被封禁什么都不可访问 `√` ## 用户模块 1. 验证登陆 `√` + 成功执行后台的接口,生成token以JSON形式返回 + 失败返回JSON + 角色、激活确认 + 验证token、验证账号状态、验证是否有权限访问 + 存入数据库的是md5密文 `ing` (还可以用spring-security的BCryptPasswordEncoder进行加密/匹配) + 将前端传过来的明文进行MD5加密,再进行dao查询操作 2. 退出登录`√` + 移除保存在tomcat中的`全局context`的`token信息` + 前端需要重定向到登陆界面 3. 查询所有用户,依旧实现分页,包含实现懒加载`√` + 前端启用懒加载加载`role`、`persimmon` 4. 用户添加操作 √ + 添加完成重新加载所有用户 5. 删除角色 √ + 前端传用户id + 根据用户获取所有角色,并删除 + 最后删除该角色 6. 分配权限 √ + 根据传递过来的角色id删除角色-权限表中的关联 + 添加传递过来的关联 7. 更新用户 √ ![image-20210202163541633](./mdImgRoot/更新用户流程.png) ## 角色管理 1. 当前角色查询 √ 2. 角色添加 √ + `角色名`、`角色的权限(数组)`、`角色描述` + 角色权限:将角色权限和角色id绑定到ROLE_PERMISSION表中 3. 根据角色查询出下面的所有权限 √ 4. 删除角色 √ + 根据`角色id`拿到所有它下面的`权限` √ + 将所有权限-角色全部删除 + 最后尝试拿出角色