Git Product home page Git Product logo

skill6 / skill6-website-backend Goto Github PK

View Code? Open in Web Editor NEW
155.0 155.0 52.0 5.4 MB

java进阶开发,高级版web项目。基于dubbo实现分布式微服务架构,基于spring boot、spring mvc、mybatis、docker、ELK、redis、vue.js、node.js等技术实现的技术分享交流网站。网站名称:技术流,英文名:skill6。主要功能有:登录注册、单点登录、restful设计、文章及评论、代码及资源下载、主题讨论等。持续更新中...

Java 96.55% TSQL 3.45%
docker druid dubbo elk log4j2 mybatis nodejs redis restful shiro slf4j spring springboot vuejs

skill6-website-backend's Introduction

skill6 building status codecov Apache License 2 Average time to resolve an issue Percentage of issues still open

技术流skill6网站的架构设计、需求分析、技术选型等


1、架构设计

image


2、技术选型

2.1 后端

技术 功能点 官网链接
Maven 项目依赖管理 http://maven.apache.org/
Spring 容器 http://projects.spring.io/spring-framework/
Spring Boot spring框架 http://spring.io/projects/spring-boot
SpringMVC restful接口 http://docs.spring.io/spring/docs/current/spring-framework-reference/htmlsingle/#mvc
Shiro 权限控制 http://shiro.apache.org/
MyBatis ORM框架 http://www.mybatis.org/mybatis-3/zh/index.html
MyBatis Generator 实体类和DAO代码生成 http://www.mybatis.org/generator/index.html
Druid 数据库连接池 https://github.com/alibaba/druid
Redis 缓存 https://redis.io/
Log4J 日志 http://logging.apache.org/log4j/1.2/
Sequence 分布式ID生产 http://git.oschina.net/yu120/sequence

2.2 前端

技术 名称 官网
Vue.js 构建用户界面的渐进式框架 https://cn.vuejs.org/
JQuery 轻量级 JavaScript 库 http://jquery.com/
Bootstrap 前端框架 http://getbootstrap.com/
Editor.md Markdown编辑器 https://github.com/pandao/editor.md

2.3 服务器

技术 名称 官网
Docker 容器 https://www.docker.com/
Nginx 负载均衡 http://nginx.org/

3、数据库设计

image

补充说明

  1. 目前已设计上述15个表,其中category_info表数据量较小,所以设计包含文章分类、代码分类等所有分类,通过type字段区别;
  2. type(类型)字段使用枚举一一映射;
  3. valid字段对应的tinyint只有1和0两个值,使用booealn值做映射;
  4. id统一使用分布式id生成器生成,便于后期做分库分表,分布式id默认长度不超过19位,通过传入workedId和datacenterId两个参数即可生成;
  5. 用户表包含管理用户和普通用户两种,通过type字段区分,用户表又分为用户重要信息(user_privacy_info)和其他信息(user_info);
  6. 图片和文件使用同一种方式存储,但是使用不同的表,因为图片数据量明显大于其他文件;
  7. 文章评论和灌水区(类似主题问答)使用不同的表区分;
  8. 文章和代码使用不同的表,文章包含文字+代码等,而代码是纯代码,如序列化工具类;
  9. 用户修改信息、用户登录记录、用户访问网站和文章等的记录都详细记载,用于后期数据存储、分析和做推荐等;
  10. 版本信息表用户更新网站版本说明及特性等;

4、沟通交流

点击加入QQ群

image

skill6-website-backend's People

Contributors

humsen avatar jliu666 avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

skill6-website-backend's Issues

第三方授权登录联调

第三方授权登录后端已经开发完成,
TODO:
1、确认前端第三方授权登录方案
2、联调QQ和Github授权登录

shiro整合第三方登录方案讨论

纪春三方登录现在进展到哪一步了?

与shiro整合,我的计划是:
1、拿到code后,后端post请求获取token和info,然后判断skill6中用户是否存在;
2、存在直接返回登录成功,不存在则创建新用户后返回成功;
3、github返回的字段中,可以作为主键的有好几个,用哪一个,还需商量;
4、三方登录如何通过shiro的认证,目前还在研究哪种方案比较好。

对前台菜单进行权限控制

image
如上图,目前想将菜单做成动态的,初期隐藏部分菜单,仅上线文件共享等功能,所以需要后台的支撑

请勿在没有参数说明的doc中加入参数

如下方法中articleId并未对其进行任何说明性文字,建议删除
/**
   * 根据id删除文章
   *
   * @param articleId 
   * @return
   * @throws Skill6Exception
   */
  public ResponseJson deleteArticleById(Long articleId) throws Skill6Exception {
    articleInfoOper.deleteByPrimaryKey(articleId);

    return new ResponseJson(true, "删除成功");
  }

controller层可以直接使用对象参数

  @PostMapping
  public ResponseJson addArticle(HttpServletRequest request) throws Skill6Exception, IOException {
    Map<String, String> jsonMap = ConvertRequestParams.params2Map(request);

    return articleInfoSvc.addArticle(jsonMap);
  }

修改后

  @PostMapping
  public ResponseJson addArticle(ArticleInfo articleInfo) {
    return articleInfoSvc.addArticle(articleInfo);
  }

一个清爽的controller建议

package cn.skill6.website.controller;

import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import cn.skill6.common.entity.po.ArticleInfo;
import cn.skill6.common.entity.vo.restful.ResponseJson;
import cn.skill6.website.service.ArticleInfoSvc;

/**
 * 文章信息控制器
 *
 * @author 何明胜
 * @version 1.0.1
 * @since 2018年8月16日 下午11:05:32
 */
@RestController
@RequestMapping(value = "/article") //相同的url前缀提升到类上,节省代码量
public class ArticleInfoController {

  @Autowired private ArticleInfoSvc articleInfoSvc;

  @PostMapping
  public ResponseJson addArticle(ArticleInfo articleInfo) {
    return articleInfoSvc.addArticle(articleInfo);
  }

  @DeleteMapping(value = "/{articleId}")
  public ResponseJson deleteArticleById(@PathVariable(name = "articleId") Long articleId) {
    return articleInfoSvc.deleteArticleById(articleId);
  }

  @PutMapping
  public ResponseJson modifyArticleById(ArticleInfo articleInfo) {
    return articleInfoSvc.modifyArticleById(articleInfo);
  }

  @GetMapping(value = "/{articleId}") //这里将请求参数改成path参数,符合rest规范
  public ArticleInfo getArticleById(@PathVariable(name = "articleId") Long articleId) {
    return articleInfoSvc.getArticleById(articleId);
  }

  @GetMapping(value = "/all")
  public List<ArticleInfo> getAllArticles() {
    return articleInfoSvc.getAllArticles();
  }
}

请不要在每个方法都抛出异常

如下方法中捕获了所有异常,为什么抛出异常?

public ResponseJson addArticle(ArticleInfo articleInfo) throws Skill6Exception {
    ResponseJson responseJson;
    try {
      Long articleId = articleInfoOper.addArticleInfo(articleInfo);
      responseJson = new ResponseJson(true, String.valueOf(articleId));
    } catch (Exception e) {
      responseJson = new ResponseJson(false, "注册失败");
    }

    return responseJson;
  }

Spring MVC已经自带完善的异常处理机制

对参数进行校验

是否需要在service类上面加一层校验类,有以下两个功能:

  1. 对controller传过来的参数和以后的微服务调用参数进行校验

  2. 对service返回的结果进行校验

  3. 包装返回结果ResponseJson,不再在service中进行封装,践行“单一职责”设计**

如有必要,有以下三种实现方式:

  1. 在service上面加一层类,通过这些类调用service

  2. 增加校验类,并在service实现每个函数前面先调用参数校验

  3. 建议:通过注解实现,使用spring aop注解或者自定义注解

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.