快速开始
购买 SoloAdmin 拿到源码后,需要进入如下步骤:
- 创建数据库
- 将源码导入 idea 或者 eclipse 等开发工具
- 编译 SoloAdmin
- 运行 SoloAdmin
- 通过代码生成器,生成自己的业务模块
- 定义后台菜单组
- 编写 Controller 代码,并生成菜单
创建数据库
SoloAdmin 源码内置了一个叫SoloAdmin.sql 的脚本,创建好数据库后,将该脚本导入即可。但需要注意的是,数据库一定要选择编码 utf8mb4 。
将源码导入开发工具
代码目录结构如下
├── pom.xml
├── core-codegen (代码生成器)
│ ├── pom.xml
│ ├── src
│
├── core-commons
│ ├── pom.xml
│ ├── readme.md
│ ├── src
│
├── core-devops (DevOps相关)
│ ├── core-devops-model
│ ├── core-devops-provider
│ ├── core-devops-service
│ ├── core-devops-web-admin
│ ├── core-devops-web-api
│ ├── pom.xml
│ └── readme.md
│
├── core-framework (SoloAdmin Framework 核心代码)
│ ├── core-framework-model
│ ├── core-framework-provider
│ ├── core-framework-service
│ ├── core-framework-web
│ ├── pom.xml
│ └── readme.md
│
├── core-web (SoloAdmin Web Controller 相关代码)
│ ├── pom.xml
│ ├── readme.md
│ ├── src
│
├── module-cms ( CMS 模块示例)
│ ├── module-cms-commons
│ ├── module-cms-model
│ ├── module-cms-provider
│ ├── module-cms-service
│ ├── module-cms-web
│ └── pom.xml
│
├── starter-cms (CMS 启动模块)
│ ├── soloadmin.bat
│ ├── soloadmin.sh
│ ├── package.xml
│ ├── pom.xml
│ ├── src
│
├── starter-tomcat (Tomcat War 包的打包示例)
│ ├── pom.xml
│ ├── src
│
编译 SoloAdmin
编译 SoloAdmin 的主要目的,是为了把 Framework 模块的资源文件,包括 html、js 等全部复制打包到"自己" 的模块里来,我们假设 module-cms
是自己的模块,那么打包的目的就是为了在 starter-cms
里生成可以执行的程序。
我们需要在 SoloAdmin 的根目录执行如下的 Maven 命令进行编译:
mvn clean package
命令执行的过程中,Maven 可能需要去下载相关依赖的 jar 包,命令执行完毕后,会在 starter-cms
的 target
目录下生成 starter-cms-1.0.0.zip
文件,复制该文件到任何地方解压缩,通过其内置的 soloadmin.sh 脚本,执行 ./soloadmin.sh start
即可启动项目。
运行 SoloAdmin
编译完成 SoloAdmin 后,我们以下的 Java 类,然后执行其 main()
方法即可。
starter-cms/src/main/cn.soloadmin.cms.admin.CmsStarter
控制台输入如下内容,我们通过浏览器访问 http://0.0.0.0:8003
既可以显示系统登录信息,账号密码admin/123456。(注意:Windows 系统可能需要访问 http://127.0.0.1:8003
)
创建自己的业务模块
在 core-codegen
模块下,创建自己的代码生成器,代码生成器带有可以执行的 main()
方法
例如:CMS 代码生成器的 代码如下:
public class CMSModuleGenerator {
private static String dbUrl = "jdbc:mysql://127.0.0.1:3306/soloadmin_db?useUnicode=true&useSSL=false&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useInformationSchema=true&remarks=true";
private static String dbUser = "root";
private static String dbPassword = "123456";
private static String moduleName = "cms";
private static String dbTables = "cms_article,cms_article_category,cms_article_comment";
private static String modelPackage = "cn.soloadmin.module.cms.model";
private static String servicePackage = "cn.soloadmin.module.cms.service";
private static String[] removedTableNamePrefixes = new String[]{"cms"};
public static void main(String[] args) {
ModuleGenerator moduleGenerator = new ModuleGenerator(moduleName, dbUrl, dbUser, dbPassword, dbTables, modelPackage, servicePackage, removedTableNamePrefixes);
moduleGenerator.setGenUI(true).gen();
}
}
其他 Module 需要复制一份这个代码,然后修改掉 表明、包名、模块名称即可。
定义后台菜单组
我们通过 CmsModuleCodeGenerator 只是生成了 Model/Service/Provider 的代码,并不会生成 Controller 和 html,以及后台菜单,因此,我们需要来定义一个菜单组,我们登录的时候,才能看到 CMS 模块的菜单,其他模块通用需要定义一个模块自己的菜单组。
如果定义后台菜单呢?代码如下:
public class CmsMenus implements MenuBuilder {
public static final String ARTICLES = "articles";
public static final String ARTICLE_CATEGORY = "article-category";
static List<MenuBean> cmsMenus = new ArrayList<>();
static {
cmsMenus.add(new MenuBean(ARTICLES, "文章管理", "fa-cart-plus", MenuTypes.MODULE, 11));
cmsMenus.add(new MenuBean(ARTICLE_CATEGORY, "文章分类", "fa-crown", MenuTypes.MODULE, 22));
}
@Override
public List<MenuBean> buildMenus() {
return cmsMenus;
}
}
- 1、编写一个类,实现 MenuBuilder 接口
- 2、重写 buildMenus 方法,并返回一个
List<MenuBean>
需要注意的是,如果 MenuBean 有配置了 pid 属性,那说明其是一个 “菜单”,如果没有 pid,说明其实一个 “菜单组”。
编写 Controller 代码,并生成菜单
Controller 代码如下
@RequestMapping("/cms/article")
public class ArticleController extends BaseAdminController {
private CmsArticleService articleService;
@MenuDef(text = "文章列表", pid = CmsMenus.ARTICLES, sortNo = 1)
public void list(){
render("");
}
}
- 1)通过
@RequestMapping("/cms/article")
来配置 Controller 的映射路径 - 2)通过
@MenuDef(text = "文章列表", pid = CmsMenus.ARTICLES, sortNo = 1)
来定义菜单名称,及其归属在哪个 “菜单组” 下。
完成 Controller 代码后,我们需要进入后台,并点击 “开发管理” > “菜单构建”
就可以显示出我们在 ArticleController.list()
里定义的菜单了。