浅谈前后端分离项目结构的探索

直接进入主题

整体项目结构图如下:

前台:主要为html页面,目前主流的前端框架有react、vue、angular等;

中台:接口层、路由层,比如微服务的路由、mvn的controller;

后台:主要为service层以及以下的层次。

项目主要分为三个工程模块,APP与WEB为war类型工程模块,SERVICE为jar类型模块,主要提供底层服务实现。APP与WEB都依赖SERVICE模块。项目代码模块分类如下:

这里主要是考虑到APP项目与WEB项目分别部署到不同的两个容器中,通过nginx进行代理,从而将APP与WEB进行解耦,避免一处出现异常(内存溢出、洪峰等),导致另外一处也不能正常访问的情况出现。

这些只是目前的设想,公司项目组正在探索中,如有趟过雷的,或者有更好的建议的,谢谢批评指正

项目中涉及到的一些设想:

为了减少coding量,从而封装了controller、service、dao的公共操作;例如page、list、insert、update、delete、get等常用操作。同时利用代码生成器也可以生成相应代码,包括页面;

:需要所有的表都包含:id、create_by、create_dt、update_by、update_dt、status、remark、sort等统一字段(其实也未尝不可)。

controller(接口层):继承【CrudController】

@Api(description = "用户管理")
@RestController
@RequestMapping(value = "/users",name = "用户管理")
public class UserController extends CrudController<UserService,UserDao, User> {
}

CrudController:

/**
 * 基础controller
 * @author GMarshal
 */
public abstract class CrudController<S extends CrudService<D,T>, 
            D extends ICrudDao<T>, T extends BaseEntity<T>> extends BaseController{
    @Autowired
    protected S service;

    @ApiOperation(value = "分页列出")
    @RequestMapping(value = "page",method = RequestMethod.POST)
    @IgnoreSecurity
    public Response page(Page<T> page,T t) {
        page.setEntity(t);
        return new Response().success(service.findPage(page));
    }

    @ApiOperation(value = "新建对象")
    @RequestMapping(value = "insert",method = RequestMethod.POST)
    @IgnoreSecurity
    public Response insert(T t) {
        return new Response().success(service.save(t));
    }

    @ApiOperation(value = "获取详情")
    @RequestMapping(value = "get",method = RequestMethod.GET)
    @IgnoreSecurity
    public Response get(String id) {
        return new Response().success(service.get(id));
    }

    @ApiOperation(value = "更新全部")
    @RequestMapping(value = "update",method = RequestMethod.POST)
    @IgnoreSecurity
    public Response update(T t) {
        return new Response().success(service.save(t));
    }

    @ApiOperation(value = "更新部分")
    @RequestMapping(value = "updateS",method = RequestMethod.POST)
    @IgnoreSecurity
    public Response updatePatch(T t) {
        return new Response().success(service.save(t));
    }

    @ApiOperation(value = "删除对象")
    @RequestMapping(value = "delete",method = RequestMethod.POST)
    @IgnoreSecurity
    public Response delete(String id) {
        return new Response().success(service.delete(id));
    }
}

service:继承【CrudService】

@Service
@Transactional(readOnly = true)
public class UserService extends CrudService<UserDao, User> {}

CrudService:

/**
 * Service基类
 * @author GMarshal
 */
@Transactional(readOnly = true)
public abstract class CrudService<D extends ICrudDao<T>, T extends BaseEntity<T>>
        extends BaseService {

    /**
     * 持久层对象
     */
    @Autowired
    protected D dao;

    /**
     * 获取单条数据
     * @param id
     * @return
     */
    public T get(String id) {
        return dao.get(id);
    }

    /**
     * 获取单条数据
     * @param entity
     * @return
     */
    public T get(T entity) {
        return dao.get(entity);
    }

    /**
     * 查询列表数据
     * @param entity
     * @return
     */
    public List<T> findList(T entity) {
        return dao.findList(entity);
    }

    /**
     * 查询总数
     * @return
     */
    public int count(Page<T> page) {
        return dao.count(page);
    }

    /**
     * 查询分页数据
     * @param page
     * @return
     */
    public Page findPage(Page<T> page) {
        page.setTotal(dao.count(page));
        page.setList(dao.findPage(page));
        return page;
    }

    /**
     * 保存数据(插入或更新)
     * @param entity
     */
    @Transactional(readOnly = false)
    public int save(T entity) {
        if (entity.getIsNewId()) {
            entity.preInsert(entity.getCreateBy());
            return dao.insert(entity);
        } else {
            entity.preUpdate(entity.getUpdateBy());
            return dao.update(entity);
        }
    }

    /**
     * 删除数据
     * @param id
     */
    @Transactional(readOnly = false)
    public int delete(String id) {
        return dao.delete(id);
    }
}

dao:继承【CrudDao】

@MyBatisDao
public interface UserDao extends ICrudDao<User> {}

CrudDao:

/**
 * DAO支持类实现
 * @author GMarshal
 * @param <T>
 */
public interface ICrudDao<T> extends IBaseDao {

   /**
    * 获取单条数据
    * @param id
    * @return
    */
   public T get(String id);

   /**
    * 获取单条数据
    * @param entity
    * @return
    */
   public T get(T entity);

   /**
    * 查询数据列表
    * @param entity
    * @return
    */
   public List<T> findList(T entity);

   /**
    * 查询总数
    * @return
    */
   public int count(@Param("page") Page<T> page);

   /**
    * 查询分页数据
    * @param page
    * @return
    */
   public List<T> findPage(@Param("page") Page<T> page);

   /**
    * 插入数据
    * @param entity
    * @return
    */
   public int insert(T entity);

   /**
    * 更新数据
    * @param entity
    * @return
    */
   public int update(T entity);

   /**
    * 删除数据
    * @param id
    * @return
    */
   public int delete(String id);

谢谢各位,这么忙,还能看完。

 

素花漫楼,

演舞寄愁,

零落成伤,

伴水长流。

 

各位,再见!

转载于:https://my.oschina.net/gmarshal/blog/1572960

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值