# Ucode-Cms-Vue **Repository Path**: decsa/ucode-cms-vue ## Basic Information - **Project Name**: Ucode-Cms-Vue - **Description**: UCode Cms 开源项目(既然来了,给个🌟吧♥️),提供一个微信交流群供大家交流使用,添加微信【dream4s】即可入群 - **Primary Language**: Unknown - **License**: Apache-2.0 - **Default Branch**: main - **Homepage**: https://space.bilibili.com/1936685014 - **GVP Project**: No ## Statistics - **Stars**: 517 - **Forks**: 198 - **Created**: 2021-11-22 - **Last Updated**: 2025-06-05 ## Categories & Tags **Categories**: Uncategorized **Tags**: Java, Spring, SpringBoot, 代码生成器, JavaEE ## README ### 一、序言 `UCode Cms`是面向企业级应用软件开发的脚手架。希望构造一个合起来是一个系统,拆分出来是独立的组件,供其它项目复用。 本项目与其它项目的显著区别是拒绝摊大饼式功能集成,核心追求是代码和功能复用。 ##### 1、当前版本 Maven仓库访问[地址](https://mvnrepository.com/search?q=xin.altitude.cms) ```xml 1.6.4.1-beta ``` > 学习代码的朋友,记得给[UCode CMS](https://gitee.com/decsa/ucode-cms-vue) 来个star吧 ##### 2、使用说明 新时代的码农需要转变编码习惯,摒弃传统的CV开发依赖。实际上Java生态目前极其完善,从底层的JDK到Spring、SpringBoot,再到Apache Commons,再到Guava等几乎提供了95%实际问题的解决方案。 未来编程有几大趋势 - 框架与框架整合 目前SpringBoot做的便是这件事,而且做的非常优秀。 - 编写框架适配器 对于国外用户编写的框架,代码质量很高,美中不足的是对于国人的编码习惯不太友好。为了进一步提高编码效率,需要一些适配器工作。 - 阅读底层框架API接口 上面已经分析了,现实中遇到的大部分问题不需要编码,已经有成熟的解决方案,那么知道解决方案在哪里变得极其重要,熟悉底层接口API变得很迫切。 - 约定大于配置大于编码 一些朋友喜欢将本项目中封装好、并且发布到Maven中央仓库的代码CV到自己的项目中,起手式便是错误的。正确的做法是,先了解并使用已经开源项目的功能,满足不了功能时提Issue,然后才是自己造轮子。 ![03bdfbf761575480c59a18d28aa41ae0](https://www.altitude.xin/typora/03bdfbf761575480c59a18d28aa41ae0.png) ### 二、项目基本情况 #### (一)项目特点 ##### 1、源码开源 源码开源并且使用MIT开源许可协议,个人或者企业用户免费放心使用,项目源码地址: ```bash git clone https://gitee.com/decsa/ucode-cms-vue.git ``` ##### 2、快速上手 新建空项目,引入相关依赖,初始化数据库,启动项目,一个项目脚手架便搭建完成,更加便捷的操作是克隆[demo项目],修改数据库连接并启动项目。 ```xml xin.altitude.cms ucode-cms-spring-boot-starter 1.6.4.1-beta ``` #### (二)项目的内在逻辑 市面上各种管理系统做的非常好,作者无意重复造轮子,简要本项目的初衷。 大部分管理系统属于大杂烩性质的,说的难听点是堆砌功能,其实很多时候仅仅是想用其做个项目初始环境脚手架而已,并不想用过多的功能,齐全的功能此时却是累赘。 第一个特点:`积木式结构`。积木式结构允许使用者在核心依赖的基础上自由选择功能模块,体现的思想是功能复用,减少无意义的功能开发。 第二个特点:`暴露配置`。隐藏源码,暴露配置意味着使用者既能通过配置文件修改系统行为,又能较少的与不相干源码打交道。 第三个特点:`标准化代码`。鼓励使用者按照项目的框架提炼公共代码,按照类似插件性质予以封装,为本项目添砖加瓦。 ##### 1、标准化 标准化是UCodeCms项目的核心内涵,即将通用性的功能浓缩成不可修改的互相独立的Maven依赖,用户使用时可`按需配置`。 ##### 2、高内聚低耦合 广泛使用高内聚低耦合设计原则,将用户很少修改的源码进行封装,同时对外提供可供修改配置的开关,降低使用成本。 ##### 3、积木式项目结构 核心依赖仅需要引入`ucode-cms-spring-boot-starter`便可初始化项目,starter内置其余核心依赖。 ### 三、项目细节 #### (一)项目结构 UCode Cms源码项目结构如下 ```text ├── sql // 系统数据库SQL脚本 ├── ucode-cms-code // 代码生成器源码 ├── ucode-cms-code-spring-boot-starter // 代码生成器starter ├── ucode-cms-common // 通用代码部分(核心依赖、可跨项目使用) ├── ucode-cms-excel // Excel处理模块源码 ├── ucode-cms-framework // 核心依赖 ├── ucode-cms-job // 任务调度源码 ├── ucode-cms-monitor // 系统监控源码 ├── ucode-cms-spring-boot-starter // 核心starter ├── ucode-cms-system // 系统部分源码 └── ucode-cms-ui // 系统UI部分依赖 ``` #### (二)项目依赖 `UCode Cms`使用的是热门主流框架依赖。 | 依赖 | 版本 | | ---------------- | ---------- | | JDK | 1.8 | | Spring Framework | 5 | | Spring Boot | 2.6.3 | | Mybatis Plus | 3.5.0 | | hutool | 5.7.19 | | Guava | 31.0.1-jre | ### 四、对外复用依赖 本系统基于Spring生态,除了满足自身需求外,还能够以Maven依赖的方式对外提供功能和代码的复用。 #### (一)公共代码 公共代码依赖广泛应用于本项目中,同时也能以工具类的方式对外提供服务。 公共代码模块提供丰富的工具类支持,是整个项目的核心支撑。 ```xml xin.altitude.cms ucode-cms-common 1.6.4.1-beta ``` ##### 1、请求合并 基于MybatisPlus提供一个内置封装的服务类QueueServiceImpl,透明的实现查询详情流量的合并与拆分,使用者可屏蔽内部实现。 对于一定时间区间内的所有请求,合并成一条请求处理。 ```java @Override public BuOrder getOrderById(Long orderId) { return getById(orderId); } ``` 举例说明,如果特定时间区间内汇集了相同的主键请求,那么合并后的请求查询一次数据库便能够响应所有的请求。 子类重写父类方法,可修改合并与拆分的行为。 ```java @Override protected RequstConfig createRequstConfig() { RequstConfig config = new RequstConfig(); /* 单次最大合并请求数量 */ config.setMaxRequestSize(100); /* 核心线程池大小 */ config.setCorePoolSize(1); /* 请求间隔(毫秒) */ config.setRequestInterval(200); return config; } ``` #### (二)代码生成器 作者很懒,对于重复性代码连复制粘贴的欲望也没有,于是跨项目版的代码生成器应运而生。支持单表代码生成、多表连接代码生成。 ```xml xin.altitude.cms ucode-cms-code-spring-boot-starter 1.6.4.1-beta ``` #### (三)分布式BitMap 支持编码和注解两种方式实现分布式BitMap ```java @BitMap(key = OrderServiceImpl.ORDER_BITMAP_KEY, value = "#orderId") public BuOrder getOrder2(Integer orderId) { return getById(orderId); } ``` 添加如下依赖,通过注解的方式即可为项目引入分布式BitMap,无需关心实现细节便可大幅提高接口响应速度。 ```xml xin.altitude.cms ucode-cms-bitmap 1.6.4.1-beta ``` #### (四)分布式限流 使用注解,基于IP或者用户的方式对接口限流,支持分布式系统。比如短信验证码接口,同一用户(IP)60秒内最多发送一次短信,通过分布式限流模块可大幅提高接口安全性。 为项目引入分布式限流模块非常简单,在控制器接口方法添加如下注解,便可实现分布式限流 ```java @RateLimiter(ttl = 60,threshold = 1) ``` 需要引入如下依赖 ```xml xin.altitude.cms ucode-cms-limiter 1.6.4.1-beta ``` #### (五)防重复提交 对于一些增加数据的场合,由于非幂等性的原因,网络不稳定容易产生脏数据,这时可使用防重复提交功能。 ```xml xin.altitude.cms ucode-cms-repeat 1.6.4.1-beta ``` 在一些场合,同一接口、同一参数避免脏数据入库,通常需要防重复提交。比如统计页面浏览量,超过3分钟浏览一次页面增加一次浏览量等。 在控制器方法接口添加如下注解 ```java @RepeatSubmit(interval = 180) ``` #### (六)分布式日志收集 基于Redis pub/sub订阅特性实现的日志收集,用消息队列的方式收集日志,然后从另外系统消费日志(数据落库)。实现了跨系统日志收集复用。 ```xml xin.altitude.cms ucode-cms-log 1.6.4.1-beta ``` 在一些场合需要记录接口的操作日志信息,比如增加数据、修改数据、删除数据,需要用到日志系统 在控制器方法添加如下注解 ```java @OperLog(title = "参数管理", businessType = BusinessType.INSERT) ``` #### (七)统计API接口响应时间 基于AOP的方式封装统计API接口响应时间,按需引入。 ```xml xin.altitude.cms ucode-cms-take-time 1.6.4.1-beta ``` 对于想统计接口的响应时间,添加上述依赖,并在控制器方法添加`@TakeTime`注解。 #### (八)多数据源模块 一些项目有多数据源的需求,比如将系统表与业务表分离等,这时有多数据源解决方案,能够显著提高编码效率,使开发者更加专注于业务开发。 ```xml xin.altitude.cms ucode-cms-db-datasource 1.6.4.1-beta ``` 引入上述依赖,你的项目便有魔法助力,快速拥有多数据源的能力。 使用相当简单: (1)改造数据源配置 ```yaml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/demo-master?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 druid: slave: enabled: true url: jdbc:mysql://localhost:3306/demo-slave?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8 username: root password: 123456 ``` 在业务层使用如下注解 ```java // 对应第一个数据源,可作用于类和方法上 @Ds(value = DataSourceType.MASTER) // 对应第二个数据源,可作用于类和方法上 @Ds(value = DataSourceType.SLAVE) ``` #### (九)定时任务 定时任务模块是对Quartz框架进一步封装,使用更加简洁。 ```xml xin.altitude.cms ucode-cms-quartz 1.6.4.1-beta ``` 编写定时任务 ```java @Component @DisallowConcurrentExecution @CronExp(id = 1, cron = "0/5 * * * * ?") public class DemoJob implements Job { @Override public void execute(JobExecutionContext context) { System.out.println("任务1:"+LocalDateTime.now()); } } ``` 使用上述代码便快速在Quartz生态完成一个定时任务。 ### 五、使用UCode CMS 上述代码是UCode CMS的内部封装的源代码,不能对外直接使用,这里提供两种对外使用的方式。 #### (一)克隆初始化项目 ##### 1、克隆脚手架项目 克隆脚手架项目并导入idea中 ```http https://gitee.com/decsa/demo-cms.git ``` ##### 2、使用SQL脚本初始化数据库 使用项目自带的SQL脚本初始化数据库 ```text sql/ ├── cms(必选).sql // 核心脚本(必选) ``` ##### 3、配置数据库连接 ```yml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver # 主库数据源 url: jdbc:mysql://localhost:3306/ucode-cms2 username: root password: 123456 ``` ##### 4、启动项目 启动项目前检查Mysql数据库服务和Redis服务配置信息是否正常。 ```http http://localhost:8080 ``` > 使用脚手架或者在脚手架上修改比较方便,原因是将细节内容提供在初始化项目中。 #### (二)从零新建项目 ##### 1、添加依赖 ```xml xin.altitude.cms ucode-cms-spring-boot-starter 1.6.4.1-beta ``` ##### 2、添加配置类 此配置类与Spring Security有关,属于权限管理范畴。 ```java @Configuration public class SecurityConfig extends AbstractSecurityConfig { @Override protected void configure(HttpSecurity httpSecurity) throws Exception { super.configure(httpSecurity); } } ``` ##### 3、初始化数据库 初始化数据库与配置连接信息 ```yml spring: datasource: type: com.alibaba.druid.pool.DruidDataSource driverClassName: com.mysql.cj.jdbc.Driver # 主库数据源 url: jdbc:mysql://localhost:3306/ucode-cms2 username: root password: 123456 ``` ##### 4、启动项目 启动项目前检查Mysql数据库服务和Redis服务配置信息是否正常。 ```http http://localhost:8080 ``` > 从零新建项目需要注意的细节部分略微多一些,也能够快速体验使用UCode CMS。 ### 六、互相交流 如果在使用过程中有任何疑问,欢迎与我联系。 请添加VX号`dream4s`联系入群,谢谢。