From 9af5fb8deb8d59500445fc4e5a78445703841a77 Mon Sep 17 00:00:00 2001 From: Heeexy Date: Sat, 18 Nov 2017 13:49:06 +0800 Subject: [PATCH] =?UTF-8?q?=E6=96=87=E7=AB=A0=E6=A8=A1=E5=9D=97,=E6=96=B9?= =?UTF-8?q?=E4=BE=BF=E4=B8=BE=E4=BE=8B=E8=AF=B4=E6=98=8E?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 20 +++++ .../example/controller/ArticleController.java | 61 +++++++++++++ .../example/controller/WriterController.java | 72 ---------------- .../com/heeexy/example/dao/ArticleDao.java | 44 ++++++++++ .../com/heeexy/example/dao/WriterDao.java | 52 ----------- .../example/service/ArticleService.java | 33 +++++++ .../heeexy/example/service/WriterService.java | 41 --------- .../service/impl/ArticleServiceImpl.java | 63 ++++++++++++++ .../service/impl/WriterServiceImpl.java | 86 ------------------- .../example/util/constants/ErrorEnum.java | 2 - back/src/main/resources/logback.xml | 2 +- .../main/resources/mapper/ArticleMapper.xml | 36 ++++++++ .../src/main/resources/mapper/LoginMapper.xml | 1 - .../resources/mapper/PermissionMapper.xml | 19 ++-- .../main/resources/mapper/WriterMapper.xml | 44 ---------- vue/.gitignore | 6 -- vue/src/router/index.js | 2 +- vue/src/store/modules/permission.js | 2 +- .../writer.vue => article/article.vue} | 67 ++++++--------- 19 files changed, 297 insertions(+), 356 deletions(-) create mode 100644 back/src/main/java/com/heeexy/example/controller/ArticleController.java delete mode 100644 back/src/main/java/com/heeexy/example/controller/WriterController.java create mode 100644 back/src/main/java/com/heeexy/example/dao/ArticleDao.java delete mode 100644 back/src/main/java/com/heeexy/example/dao/WriterDao.java create mode 100644 back/src/main/java/com/heeexy/example/service/ArticleService.java delete mode 100644 back/src/main/java/com/heeexy/example/service/WriterService.java create mode 100644 back/src/main/java/com/heeexy/example/service/impl/ArticleServiceImpl.java delete mode 100644 back/src/main/java/com/heeexy/example/service/impl/WriterServiceImpl.java create mode 100644 back/src/main/resources/mapper/ArticleMapper.xml delete mode 100644 back/src/main/resources/mapper/WriterMapper.xml delete mode 100644 vue/.gitignore rename vue/src/views/{writer/writer.vue => article/article.vue} (71%) diff --git a/README.md b/README.md index 9a65f69..e332418 100644 --- a/README.md +++ b/README.md @@ -1,3 +1,23 @@ # SpringBoot-shiro-vue 提供一套基于SpringBoot-shiro-vue的权限管理思路.前后端都加以控制,做到按钮/接口级别的权限 +# 设计思路 + +### 核心 + + 每个登录用户拥有各自的N条**权限**,比如文章:查看/编辑/发布/删除 + +### 后端 + +基于 [RABC新解](http://globeeip.iteye.com/blog/1236167) . + +用户--角色--权限 + +后台接口只验证**权限**,不看角色. + +角色的作用其实只是用来管理分配权限的,真正的验证只验证**权限** ,而不去管你是否是那种角色.体现在代码上就是接口上注解为```@RequiresPermissions("writer:list")``` ```@RequiresPermissions("writer:update")``` + +而不是验证```@RequiresRoles(...)``` + +### 前端 + diff --git a/back/src/main/java/com/heeexy/example/controller/ArticleController.java b/back/src/main/java/com/heeexy/example/controller/ArticleController.java new file mode 100644 index 0000000..e97e1d1 --- /dev/null +++ b/back/src/main/java/com/heeexy/example/controller/ArticleController.java @@ -0,0 +1,61 @@ +package com.heeexy.example.controller; + +import com.alibaba.fastjson.JSONObject; +import com.heeexy.example.service.ArticleService; +import com.heeexy.example.util.CommonUtil; +import org.apache.shiro.authz.annotation.RequiresPermissions; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.web.bind.annotation.*; + +import javax.servlet.http.HttpServletRequest; + +/** + * @author: hxy + * @description: 文章相关Controller + * @date: 2017/10/24 16:04 + */ +@RestController +@RequestMapping("/article") +public class ArticleController { + + @Autowired + private ArticleService articleService; + + /** + * 查询文章列表 + * + * @param request + * @return + */ + @RequiresPermissions("article:list") + @GetMapping("/listArticle") + public JSONObject listArticle(HttpServletRequest request) { + return articleService.listArticle(CommonUtil.request2Json(request)); + } + + /** + * 新增文章 + * + * @param requestJson + * @return + */ + @RequiresPermissions("article:add") + @PostMapping("/addArticle") + public JSONObject addArticle(@RequestBody JSONObject requestJson) { + CommonUtil.hasAllRequired(requestJson, "content"); + return articleService.addArticle(requestJson); + } + + /** + * 修改文章 + * + * @param requestJson + * @return + */ + @RequiresPermissions("article:update") + @PostMapping("/updateArticle") + public JSONObject updateArticle(@RequestBody JSONObject requestJson) { + CommonUtil.hasAllRequired(requestJson, "id,content"); + return articleService.updateArticle(requestJson); + } +} diff --git a/back/src/main/java/com/heeexy/example/controller/WriterController.java b/back/src/main/java/com/heeexy/example/controller/WriterController.java deleted file mode 100644 index 26f583f..0000000 --- a/back/src/main/java/com/heeexy/example/controller/WriterController.java +++ /dev/null @@ -1,72 +0,0 @@ -package com.heeexy.example.controller; - -import com.alibaba.fastjson.JSONObject; -import com.heeexy.example.service.WriterService; -import com.heeexy.example.util.CommonUtil; -import org.apache.shiro.authz.annotation.RequiresPermissions; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.web.bind.annotation.*; - -import javax.servlet.http.HttpServletRequest; - -/** - * @author: hxy - * @description: 作者相关Controller - * @date: 2017/10/24 16:04 - */ -@RestController -@RequestMapping("/writer") -public class WriterController { - - @Autowired - private WriterService writerService; - - /** - * 查询作者列表 - * - * @param request - * @return - */ - @RequiresPermissions("writer:list") - @GetMapping("/listWriter") - public JSONObject listWriter(HttpServletRequest request) { - return writerService.listWriter(CommonUtil.request2Json(request)); - } - - /** - * 新增作者 - * - * @param requestJson - * @return - */ - @RequiresPermissions("writer:add") - @PostMapping("/addWriter") - public JSONObject addWriter(@RequestBody JSONObject requestJson) { - CommonUtil.hasAllRequired(requestJson, "writerName"); - return writerService.addWriter(requestJson); - } - - /** - * 修改作者 - * - * @param requestJson - * @return - */ - @RequiresPermissions("writer:update") - @PostMapping("/updateWriter") - public JSONObject updateWriter(@RequestBody JSONObject requestJson) { - CommonUtil.hasAllRequired(requestJson, "writerId,writerName"); - return writerService.updateWriter(requestJson); - } - - /** - * 根据发布ID查询信息 - * - * @param writerId - * @return JSONObject - */ - @GetMapping("/getWriterById") - public JSONObject getWriterById(String writerId) { - return writerService.getWriterById(writerId); - } -} diff --git a/back/src/main/java/com/heeexy/example/dao/ArticleDao.java b/back/src/main/java/com/heeexy/example/dao/ArticleDao.java new file mode 100644 index 0000000..232a162 --- /dev/null +++ b/back/src/main/java/com/heeexy/example/dao/ArticleDao.java @@ -0,0 +1,44 @@ +package com.heeexy.example.dao; + +import com.alibaba.fastjson.JSONObject; + +import java.util.List; + +/** + * @author: hxy + * @description: 文章Dao层 + * @date: 2017/10/24 16:06 + */ +public interface ArticleDao { + /** + * 新增文章 + * + * @param jsonObject + * @return + */ + int addArticle(JSONObject jsonObject); + + /** + * 统计文章总数 + * + * @param jsonObject + * @return + */ + int countArticle(JSONObject jsonObject); + + /** + * 文章列表 + * + * @param jsonObject + * @return + */ + List listArticle(JSONObject jsonObject); + + /** + * 更新文章 + * + * @param jsonObject + * @return + */ + int updateArticle(JSONObject jsonObject); +} diff --git a/back/src/main/java/com/heeexy/example/dao/WriterDao.java b/back/src/main/java/com/heeexy/example/dao/WriterDao.java deleted file mode 100644 index a82ec9f..0000000 --- a/back/src/main/java/com/heeexy/example/dao/WriterDao.java +++ /dev/null @@ -1,52 +0,0 @@ -package com.heeexy.example.dao; - -import com.alibaba.fastjson.JSONObject; - -import java.util.List; - -/** - * @author: hxy - * @description: 作者Dao层 - * @date: 2017/10/24 16:06 - */ -public interface WriterDao { - /** - * 新增作者 - * - * @param jsonObject - * @return - */ - int addWriter(JSONObject jsonObject); - - /** - * 统计作者总数 - * - * @param jsonObject - * @return - */ - int countWriter(JSONObject jsonObject); - - /** - * 作者列表 - * - * @param jsonObject - * @return - */ - List listWriter(JSONObject jsonObject); - - /** - * 更新作者 - * - * @param jsonObject - * @return - */ - int updateWriter(JSONObject jsonObject); - - /** - * 根据发布ID查询信息 - * - * @param writerId - * @return JSONObject - */ - JSONObject getWriterById(String writerId); -} diff --git a/back/src/main/java/com/heeexy/example/service/ArticleService.java b/back/src/main/java/com/heeexy/example/service/ArticleService.java new file mode 100644 index 0000000..25baf60 --- /dev/null +++ b/back/src/main/java/com/heeexy/example/service/ArticleService.java @@ -0,0 +1,33 @@ +package com.heeexy.example.service; + +import com.alibaba.fastjson.JSONObject; + +/** + * @author: hxy + * @date: 2017/10/24 16:06 + */ +public interface ArticleService { + /** + * 新增文章 + * + * @param jsonObject + * @return + */ + JSONObject addArticle(JSONObject jsonObject); + + /** + * 文章列表 + * + * @param jsonObject + * @return + */ + JSONObject listArticle(JSONObject jsonObject); + + /** + * 更新文章 + * + * @param jsonObject + * @return + */ + JSONObject updateArticle(JSONObject jsonObject); +} diff --git a/back/src/main/java/com/heeexy/example/service/WriterService.java b/back/src/main/java/com/heeexy/example/service/WriterService.java deleted file mode 100644 index 9e3c363..0000000 --- a/back/src/main/java/com/heeexy/example/service/WriterService.java +++ /dev/null @@ -1,41 +0,0 @@ -package com.heeexy.example.service; - -import com.alibaba.fastjson.JSONObject; - -/** - * @author: hxy - * @date: 2017/10/24 16:06 - */ -public interface WriterService { - /** - * 新增作者 - * - * @param jsonObject - * @return - */ - JSONObject addWriter(JSONObject jsonObject); - - /** - * 作者列表 - * - * @param jsonObject - * @return - */ - JSONObject listWriter(JSONObject jsonObject); - - /** - * 更新作者 - * - * @param jsonObject - * @return - */ - JSONObject updateWriter(JSONObject jsonObject); - - /** - * 根据发布ID查询信息 - * - * @param writerId - * @return JSONObject - */ - JSONObject getWriterById(String writerId); -} diff --git a/back/src/main/java/com/heeexy/example/service/impl/ArticleServiceImpl.java b/back/src/main/java/com/heeexy/example/service/impl/ArticleServiceImpl.java new file mode 100644 index 0000000..cf8c42f --- /dev/null +++ b/back/src/main/java/com/heeexy/example/service/impl/ArticleServiceImpl.java @@ -0,0 +1,63 @@ +package com.heeexy.example.service.impl; + +import com.alibaba.fastjson.JSONObject; +import com.heeexy.example.dao.ArticleDao; +import com.heeexy.example.service.ArticleService; +import com.heeexy.example.util.CommonUtil; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.stereotype.Service; +import org.springframework.transaction.annotation.Transactional; + +import java.util.List; + +/** + * @author: hxy + * @description: + * @date: 2017/10/24 16:07 + */ +@Service +public class ArticleServiceImpl implements ArticleService { + + @Autowired + private ArticleDao articleDao; + + /** + * 新增文章 + * + * @param jsonObject + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject addArticle(JSONObject jsonObject) { + articleDao.addArticle(jsonObject); + return CommonUtil.successJson(); + } + + /** + * 文章列表 + * + * @param jsonObject + * @return + */ + @Override + public JSONObject listArticle(JSONObject jsonObject) { + CommonUtil.fillPageParam(jsonObject); + int count = articleDao.countArticle(jsonObject); + List list = articleDao.listArticle(jsonObject); + return CommonUtil.successPage(jsonObject, list, count); + } + + /** + * 更新文章 + * + * @param jsonObject + * @return + */ + @Override + @Transactional(rollbackFor = Exception.class) + public JSONObject updateArticle(JSONObject jsonObject) { + articleDao.updateArticle(jsonObject); + return CommonUtil.successJson(); + } +} diff --git a/back/src/main/java/com/heeexy/example/service/impl/WriterServiceImpl.java b/back/src/main/java/com/heeexy/example/service/impl/WriterServiceImpl.java deleted file mode 100644 index 58a8319..0000000 --- a/back/src/main/java/com/heeexy/example/service/impl/WriterServiceImpl.java +++ /dev/null @@ -1,86 +0,0 @@ -package com.heeexy.example.service.impl; - -import com.alibaba.fastjson.JSONObject; -import com.heeexy.example.config.exception.CommonJsonException; -import com.heeexy.example.dao.WriterDao; -import com.heeexy.example.service.WriterService; -import com.heeexy.example.util.CommonUtil; -import com.heeexy.example.util.RandomUtil; -import com.heeexy.example.util.constants.ErrorEnum; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.stereotype.Service; -import org.springframework.transaction.annotation.Transactional; -import org.springframework.transaction.interceptor.TransactionAspectSupport; - -import java.util.List; - -/** - * @author: hxy - * @description: - * @date: 2017/10/24 16:07 - */ -@Service -public class WriterServiceImpl implements WriterService { - - @Autowired - private WriterDao writerDao; - - /** - * 新增作者 - * - * @param jsonObject - * @return - */ - @Override - @Transactional(rollbackFor = Exception.class) - public JSONObject addWriter(JSONObject jsonObject) { - String writerId = RandomUtil.genarateId(""); - jsonObject.put("writerId", writerId); - writerDao.addWriter(jsonObject); - return CommonUtil.successJson(); - } - - /** - * 作者列表 - * - * @param jsonObject - * @return - */ - @Override - public JSONObject listWriter(JSONObject jsonObject) { - CommonUtil.fillPageParam(jsonObject); - int count = writerDao.countWriter(jsonObject); - List list = writerDao.listWriter(jsonObject); - return CommonUtil.successPage(jsonObject, list, count); - } - - /** - * 更新作者 - * - * @param jsonObject - * @return - */ - @Override - @Transactional(rollbackFor = Exception.class) - public JSONObject updateWriter(JSONObject jsonObject) { - int i = writerDao.updateWriter(jsonObject); - if (i == 1) { - return CommonUtil.successJson(); - } else { - TransactionAspectSupport.currentTransactionStatus().setRollbackOnly(); - throw new CommonJsonException(ErrorEnum.E_602); - } - } - - /** - * 根据发布ID查询信息 - * - * @param writerId - * @return JSONObject - */ - @Override - public JSONObject getWriterById(String writerId) { - JSONObject jsonObject = writerDao.getWriterById(writerId); - return CommonUtil.successJson(jsonObject); - } -} diff --git a/back/src/main/java/com/heeexy/example/util/constants/ErrorEnum.java b/back/src/main/java/com/heeexy/example/util/constants/ErrorEnum.java index f8bc838..67dc6b0 100644 --- a/back/src/main/java/com/heeexy/example/util/constants/ErrorEnum.java +++ b/back/src/main/java/com/heeexy/example/util/constants/ErrorEnum.java @@ -13,8 +13,6 @@ public enum ErrorEnum { E_501("501", "请求路径不存在"), E_502("502", "权限不足"), - E_602("602", "数据更新失败"), - E_20011("20011", "登陆已过期,请重新登陆"), E_90003("90003", "缺少必填参数"); diff --git a/back/src/main/resources/logback.xml b/back/src/main/resources/logback.xml index 59faada..8b8a4df 100644 --- a/back/src/main/resources/logback.xml +++ b/back/src/main/resources/logback.xml @@ -64,6 +64,6 @@ - + \ No newline at end of file diff --git a/back/src/main/resources/mapper/ArticleMapper.xml b/back/src/main/resources/mapper/ArticleMapper.xml new file mode 100644 index 0000000..45465a7 --- /dev/null +++ b/back/src/main/resources/mapper/ArticleMapper.xml @@ -0,0 +1,36 @@ + + + + + + INSERT INTO article + (content) VALUES + ( #{content}) + + + + + + + + UPDATE article + SET + content = #{content} + WHERE id = #{id} + + + \ No newline at end of file diff --git a/back/src/main/resources/mapper/LoginMapper.xml b/back/src/main/resources/mapper/LoginMapper.xml index f40dabf..4f1c83b 100644 --- a/back/src/main/resources/mapper/LoginMapper.xml +++ b/back/src/main/resources/mapper/LoginMapper.xml @@ -15,5 +15,4 @@ AND u.password = #{password} - \ No newline at end of file diff --git a/back/src/main/resources/mapper/PermissionMapper.xml b/back/src/main/resources/mapper/PermissionMapper.xml index 46e1eaf..3bdb373 100644 --- a/back/src/main/resources/mapper/PermissionMapper.xml +++ b/back/src/main/resources/mapper/PermissionMapper.xml @@ -17,20 +17,19 @@ - - SELECT count(0) - FROM writer w - WHERE w.delete_status = '1' - - - - - - UPDATE writer - SET - writer_name = #{writerName} - WHERE writer.writer_id = #{writerId} - - - - \ No newline at end of file diff --git a/vue/.gitignore b/vue/.gitignore deleted file mode 100644 index 09552ad..0000000 --- a/vue/.gitignore +++ /dev/null @@ -1,6 +0,0 @@ -.DS_Store -node_modules/ -dist/ -npm-debug.log* -yarn-debug.log* -yarn-error.log* diff --git a/vue/src/router/index.js b/vue/src/router/index.js index cb75a26..a421764 100644 --- a/vue/src/router/index.js +++ b/vue/src/router/index.js @@ -39,7 +39,7 @@ export const asyncRouterMap = [ name: '功能模块', icon: 'system', children: [ - {path: 'writer', component: _import('writer/writer'), name: '作家', menu: 'writer'}, + {path: 'article', component: _import('article/article'), name: '文章', menu: 'article'}, ] }, { diff --git a/vue/src/store/modules/permission.js b/vue/src/store/modules/permission.js index 9292109..84a34fb 100644 --- a/vue/src/store/modules/permission.js +++ b/vue/src/store/modules/permission.js @@ -53,7 +53,7 @@ const permission = { GenerateRoutes({commit}, userPermission) { //生成路由 return new Promise(resolve => { - //roles是后台传过来的角色数组,比如['管理员','作家'] + //roles是后台传过来的角色数组,比如['管理员','文章'] const role = userPermission.roleName; const menus = userPermission.menuList; //声明 该角色可用的路由 diff --git a/vue/src/views/writer/writer.vue b/vue/src/views/article/article.vue similarity index 71% rename from vue/src/views/writer/writer.vue rename to vue/src/views/article/article.vue index 9c092d1..cb2a2f8 100644 --- a/vue/src/views/writer/writer.vue +++ b/vue/src/views/article/article.vue @@ -3,11 +3,7 @@
- - - 搜索 - 添加 + 添加 @@ -19,13 +15,13 @@ - + - + @@ -41,17 +37,17 @@ layout="total, sizes, prev, pager, next, jumper"> - - - + +
@@ -72,11 +68,11 @@ dialogFormVisible: false, textMap: { update: '编辑', - create: '创建作家' + create: '创建文章' }, - tempWriter: { - writerName: "", - writerId: "" + tempArticle: { + id: "", + content: "" } } }, @@ -86,12 +82,12 @@ methods: { getList() { //查询列表 - if (!this.hasPerm('writer:list')) { + if (!this.hasPerm('article:list')) { return } this.listLoading = true; this.api({ - url: "/writer/listWriter", + url: "/article/listArticle", method: "get", params: this.listQuery }).then(data => { @@ -110,52 +106,45 @@ this.listQuery.pageNum = val this.getList(); }, - handleFilter() { - //查询事件 - this.listQuery.pageNum = 1 - this.getList() - }, getIndex($index) { //表格序号 return (this.listQuery.pageNum - 1) * this.listQuery.pageRow + $index + 1 }, showCreate() { //显示新增对话框 - this.tempWriter.writerId = ""; - this.tempWriter.writerName = ""; + this.tempArticle.content = ""; this.dialogStatus = "create" this.dialogFormVisible = true }, showUpdate($index) { - //显示新增对话框 - this.tempWriter.writerId = this.list[$index].writerId; - this.tempWriter.writerName = this.list[$index].writerName; + //显示修改对话框 + this.tempArticle.id = this.list[$index].id; + this.tempArticle.content = this.list[$index].content; this.dialogStatus = "update" this.dialogFormVisible = true }, - createWriter() { - //保存新作家 + createArticle() { + //保存新文章 this.api({ - url: "/writer/addWriter", + url: "/article/addArticle", method: "post", - data: this.tempWriter - }).then(data => { + data: this.tempArticle + }).then(() => { this.getList(); this.dialogFormVisible = false }) }, - updateWriter() { - //修改作家 + updateArticle() { + //修改文章 this.api({ - url: "/writer/updateWriter", + url: "/article/updateArticle", method: "post", - data: this.tempWriter - }).then(data => { + data: this.tempArticle + }).then(() => { this.getList(); this.dialogFormVisible = false }) }, - } }