导读

jeecg-boot项目是最近在程序员圈子中非常火的一个开源进销存系统项目,研究这个开源项目可以让我们学到很多目前市场非常受高级程序员和架构师偏爱的开发技术,并极大的提高我们的开发效率,做到低代码开发。对于这个项目,我们不能仅仅停留从gitee仓库克隆到本地,然后看别的大佬演示一遍效果就行了,而是要在自己本地跑起来,既方便自己研究项目源码和验证效果,也有利于自己在项目的基础上做二次开发。

要在本地开发环境把jeecg-boot项目的前后端跑起来还是有一点麻烦的,不仅要安装项目中集成的第三方服务,并修改好配置信息,还要解决项目启动过程中可能遇到的各种报错的bug。那么本文的目的就带领读者依次从后端到前端把整个项目跑起来!

1 启动jeecg-boot项目准备工作

首先我们使用IntelliJ IDEAjeecg-boot项目打开,打开后开发工具会自动下载项目依赖的Jar包

1.1 Mysql数据库导入数据库脚本

这里需要你有自己的Mysql5.6以上版本的数据库,如何安装Mysql数据库网上的博文一大堆,笔者就不赘述了。

注意:安装并启动成功mysql服务后一定要备份好root账户的登录密码

客户端连接工具可以选择Navicat也可以使用Intellij IDEA中集成的DataSource插件

(1)使用root账户连接到mysql服务后在控制台中执行创建jeecg_boot数据库和jeecg 用户的脚本

-- 创建mysql库
create database `jeecg_boot` default character set utf8mb4 collate utf8mb4_general_ci;
--若使用的是远端主机上安装的mysql服务则使用下面这条sql创建用户
create user 'jeecg'@'%' IDENTIFIED by 'jeecg1234';
--若使用的是本机上安装的mysql服务则使用下面这条sql语句创建用户
create user 'jeecg'@'localhost' IDENTIFIED by 'jeecg1234';

(2)授权给jeecg用户jeecg_boot数据库权限

GRANT CREATE,DROP,ALTER,INSERT,UPDATE,SELECT,DELETE on jeecg_boot.* to 'jeecg'@'%' with grant OPTION;

GRANT CREATE,DROP,ALTER,INSERT,UPDATE,SELECT,DELETE on jeecg_boot.* to 'jeecg'@'localhost' with grant OPTION;

flush privileges ;

(3)使用jeecg用户连接Mysql服务后执行psi\jeecg-boot\db目录下的jeecgboot&psi_mysql5.7.sql脚本创建表并插入相应的数据

需要注意的是在执行创建存储过程脚本时需要使用root账户连接Mysql服务的客户端,并将存储过程中的连接用户改为jeecg用户

-- Procedure structure for sp_fin_payable_bal_month_carry_forward
--创建存储过程sql需要使用root账户执行
-- ----------------------------
DROP PROCEDURE IF EXISTS `sp_fin_payable_bal_month_carry_forward`;
delimiter ;;
CREATE DEFINER=`jeecg`@`localhost` PROCEDURE `sp_fin_payable_bal_month_carry_forward`(IN `p_year` smallint,IN `p_month` tinyint)
BEGIN
	DECLARE n_year SMALLINT;
	DECLARE n_month TINYINT;

	DROP TABLE IF EXISTS `tmp`;
	CREATE TEMPORARY TABLE tmp(
		supplier_id VARCHAR(36),
		amt DECIMAL(18,2) DEFAULT 0
	);
	......
DROP PROCEDURE IF EXISTS `sp_fin_receivable_bal_month_carry_forward`;
delimiter ;;
CREATE DEFINER=`jeecg`@`localhost` PROCEDURE `sp_fin_receivable_bal_month_carry_forward`(IN `p_year` smallint,IN `p_month` tinyint)
BEGIN
	DECLARE n_year SMALLINT;
	DECLARE n_month TINYINT;

	DROP TABLE IF EXISTS `tmp`;
	CREATE TEMPORARY TABLE tmp(
		customer_id VARCHAR(36),
		amt DECIMAL(18,2) DEFAULT 0
	);
1.2 开通腾讯云短信服务

由于阿里云的短信服务起购费用较高(170以上),而腾讯云短信服务的起购费用较低,新手还有免费试用机会,因而在改造本项目中,我使用腾讯云短信服务代替了阿里云短信服务。

(1)登录腾讯云控制台进入产品界面后找到下面的短信,点击进入购买短信套餐界面,选择自定义套餐包,在自定义条数中输入1(最少购买量,单位为千),然后鼠标移出输入框就会计算出价格为50元,然后勾选服务协议就可以点击立即购买完成购买了。
购买腾讯云短信服务
新用户可以享受免费领取短信服务的福利

(2)创建短信签名
进入腾讯云控制台,在我的资源一栏点击短信进入短信管理菜单,点击下面的国内短信菜单下的签名管理
短信资源
短信前面管理
然后点击创建签名填写签名资料后点击确定按钮提交审批。签名类型可选网站、App、公众号和小程序其中任意一种,这里笔者选的是公众号,上传好公众号设置页面截图并填写好申请说明后点击确定按钮提交审核,一般两小时之内可审核通过。
创建短信签名
然后点击创建签名填写签名资料后点击确定按钮提交审批。签名类型可选网站、App、公众号和小程序其中任意一种,这里笔者选的是公众号,上传好公众号设置页面截图并填写好申请说明后点击确定按钮提交审核,一般两小时之内可审核通过。

(3)创建短信模板

点击左侧国内短信菜单下的正文模板管理
短信模板管理
点击创建正文模板按钮,进入创建正文模板界面后根据提示信息填写短信模板信息,申请用户可以使用标准模板,也可以自定义短信模板。为方便起见笔者使用了短信验证码标准模板
创建短信模板
填写好正文模板信息后点击底部的确定按钮提交审核,一般2小时之内可审核通过。

(4)创建短信应用

点击短信菜单下的应用管理子菜单下的应用列表,进入应用列表界面后点击创建应用按钮创建应用,其中sdkAppID在完成项目后台短信服务编码时需要用到。
创建短信应用
(5)进入API密钥管理页面

新建密钥
SecretIdSecretKey的值复制到application-dev.ymljeecg.sms对应字段属性值

jeecg :
  #短信秘钥
  sms:
     secretId: <SecretId>
     secretKey: <SecretKey>
     appid: <sdkAppID>
     signName: <你短信的签名>

(6)使用腾讯云短信服务依赖代替阿里云短信服务依赖

<properties>
        <!--在此之前的版本变量不变-->
		<tencentcloud-sdk-java.version>3.1.222</tencentcloud-sdk-java.version>
</properties>
<!-- 阿里云短信 -->
		<!--
		<dependency>
			<groupId>com.aliyun</groupId>
			<artifactId>aliyun-java-sdk-dysmsapi</artifactId>
			<version>${aliyun-java-sdk-dysmsapi.version}</version>
		</dependency> -->
		<!-- 使用腾讯云短信代替阿里云短信-->
		<dependency>
			<groupId>com.tencentcloudapi</groupId>
			<artifactId>tencentcloud-sdk-java</artifactId>
			<version>${tencentcloud-sdk-java.version}</version>
            <!--解决jar包依赖冲突-->
			<exclusions>
				<exclusion>
					<groupId>com.squareup.okio</groupId>
					<artifactId>okio</artifactId>
				</exclusion>
				<exclusion>
					<groupId>com.squareup.okhttp</groupId>
					<artifactId>okhttp</artifactId>
				</exclusion>
				<exclusion>
					<groupId>javax.activation</groupId>
					<artifactId>javax.activation-api</artifactId>
				</exclusion>
			</exclusions>
		</dependency>

(7) 修改org.jeecg.common.util包下与短信服务相关的DySmsEnum枚举类和DySmsHelper

DySmsEnum.java

public enum DySmsEnum {

	LOGIN_TEMPLATE_CODE("891481","phoneNumbers,code,minutes"),
	FORGET_PASSWORD_TEMPLATE_CODE("891748","phoneNumbers,code"),
	REGISTER_TEMPLATE_CODE("891746","phoneNumbers,code,minutes");
    //...其他不变
	
}

DySmsHelper.java

package org.jeecg.common.util;

import com.alibaba.fastjson.JSONObject;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.sms.v20190711.SmsClient;
import com.tencentcloudapi.sms.v20190711.models.SendSmsRequest;
import com.tencentcloudapi.sms.v20190711.models.SendSmsResponse;
import com.tencentcloudapi.sms.v20190711.models.SendStatus;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.aliyuncs.exceptions.ClientException;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;


/**
 * Created on 17/6/7.
 * 短信API产品的DEMO程序,工程中包含了一个SmsDemo类,直接通过
 * 执行main函数即可体验短信产品API功能(只需要将AK替换成开通了云通信-短信产品功能的AK即可)
 * 工程依赖了1个腾讯云短信服务的sdk jar包
 * 1:tencentcloud-sdk-java.jar
 * 备注:Demo工程编码采用UTF-8
 * 国际短信发送请勿参照此DEMO
 */

@Component
public class DySmsHelper {

	private final static Logger logger=LoggerFactory.getLogger(DySmsHelper.class);


    //此处需要替换成开发者自己的AK(在腾讯云访问控制台寻找),在application.yml配置文件中配置好
    @Value("${jeecg.sms.secretId}")
    private String secretId;
    @Value("${jeecg.sms.secretKey}")
    private String secretKey;
    @Value("${jeecg.sms.appid}")
    private String appid;
    @Value("${jeecg.sms.signName}")
    private String signName;

     /**
     * @param phoneNumbers
     * @param templateParamJson
     * @param dySmsEnum
     * @return result 返回SendStatus[]有利于将来在群发场景下获取群发对象数组中所有发送对象的发送结果
     * @throws ClientException
     */
    public  SendStatus[] sendSms(String[] phoneNumbers,JSONObject templateParamJson, DySmsEnum dySmsEnum) throws ClientException {
        SendStatus[] result = null;
        validateParam(templateParamJson,dySmsEnum);
        /* 必要步骤:
         * 实例化一个认证对象,入参需要传入腾讯云账户密钥对 secretId 和 secretKey
         * 本示例采用从环境变量读取的方式,需要预先在环境变量中设置这两个值
         * 您也可以直接在代码中写入密钥对,但需谨防泄露,不要将代码复制、上传或者分享给他人
         * CAM 密钥查询:https://console.cloud.tencent.com/cam/capi
         */
        Credential cred = new Credential(secretId, secretKey);
        // 实例化一个 http 选项,可选,无特殊需求时可以跳过
        HttpProfile httpProfile = new HttpProfile();
        // 设置代理
//        httpProfile.setProxyHost("http://134.175.187.61");
//        httpProfile.setProxyPort(8088);
        /* SDK 默认使用 POST 方法。
         * 如需使用 GET 方法,可以在此处设置,但 GET 方法无法处理较大的请求 */
        httpProfile.setReqMethod("POST");
        httpProfile.setConnTimeout(60);
        httpProfile.setEndpoint("sms.tencentcloudapi.com");
        /* 非必要步骤:
         * 实例化一个客户端配置对象,可以指定超时时间等配置 */
        ClientProfile clientProfile = new ClientProfile();
        /* SDK 默认用 TC3-HMAC-SHA256 进行签名
         * 非必要请不要修改该字段 */
        clientProfile.setSignMethod("HmacSHA256");
        clientProfile.setHttpProfile(httpProfile);
        /* 实例化 SMS 的 client 对象
         * 第二个参数是地域信息,可以直接填写字符串 ap-guangzhou,或者引用预设的常量 
         */
        SmsClient client = new SmsClient(cred, "ap-guangzhou",clientProfile);
        /* 实例化一个请求对象,根据调用的接口和实际情况,可以进一步设置请求参数
         * 您可以直接查询 SDK 源码确定接口有哪些属性可以设置
         * 属性可能是基本类型,也可能引用了另一个数据结构
         * 推荐使用 IDE 进行开发,可以方便地跳转查阅各个接口和数据结构的文档说明 
         */
        SendSmsRequest req = new SendSmsRequest();
        req.setSmsSdkAppid(appid);
        req.setSign(signName);
        req.setSessionContext("xxx");
        req.setSenderId(null);
        req.setPhoneNumberSet(phoneNumbers);
        String templateId = dySmsEnum.getTemplateCode();
        req.setTemplateID(templateId);
        String[] templateParams;
        String code = templateParamJson.getString("code");
        Integer minutes = templateParamJson.getInteger("minutes");
        if(minutes==null){
            templateParams = new String[]{code};
        }else{
            templateParams = new String[]{code,String.valueOf(minutes)};
        }
        req.setTemplateParamSet(templateParams);
        /* 通过 client 对象调用 SendSms 方法发起请求。注意请求方法名与请求对象是对应的
         * 返回的 res 是一个 SendSmsResponse 类的实例,与请求对象对应 */
        try {
            SendSmsResponse res = client.SendSms(req);
            // 输出 JSON 格式的字符串回包
            System.out.println(SendSmsResponse.toJsonString(res));
            // 可以取出单个值,您可以通过官网接口文档或跳转到 response 对象的定义处查看返回字段的定义
            System.out.println(res.getRequestId());
            result = res.getSendStatusSet();
        } catch (TencentCloudSDKException e) {
            e.printStackTrace();
        }
        return result;

    }

    private void validateParam(JSONObject templateParamJson,DySmsEnum dySmsEnum) {
    	String keys = dySmsEnum.getKeys();
    	String [] keyArr = keys.split(",");
    	for(String item :keyArr) {
    		if(!templateParamJson.containsKey(item)) {
    			throw new RuntimeException("模板缺少参数:"+item);
    		}
    	}
    }

}

以上将短信工具类改为一个组件类,使其成为Spring IOC容器中的一个bean,方便自动注入配置文件中的短信服务的常用参数,同时有利于在Spring容器的生命周期类各服务类调用短信服务组件类。

(8)修改因DySmsHelper类变动而引起的LoginController类编译错误

@RestController
@RequestMapping("/sys")
@Api(tags="用户登录")
@Slf4j
public class LoginController {
    //在此之前的依赖注入不变
    @Autowired
	private DySmsHelper smsHelper;
    
    //修改短信登录接口
    @PostMapping(value = "/sms")
	public Result<String> sms(@RequestBody JSONObject jsonObject) {
		Result<String> result = new Result<String>();
		String mobile = jsonObject.get("mobile").toString();
		//手机号模式 登录模式: "2"  注册模式: "1"
		String smsmode=jsonObject.get("smsmode").toString();
		log.info(mobile);
		if(oConvertUtils.isEmpty(mobile)){
			result.setMessage("手机号不允许为空!");
			result.setSuccess(false);
			return result;
		}
		Object object = redisUtil.get(mobile);
		if (object != null) {
			result.setMessage("验证码10分钟内,仍然有效!");
			result.setSuccess(false);
			return result;
		}

		//随机数
		String captcha = RandomUtil.randomNumbers(4);
		JSONObject obj = new JSONObject();
    	obj.put("code", captcha);
    	String[] phoneNumbers = new String[]{mobile};
		try {
			SendStatus b = null;
			//注册模板
			if (CommonConstant.SMS_TPL_TYPE_1.equals(smsmode)) {
				SysUser sysUser = sysUserService.getUserByPhone(mobile);
				if(sysUser!=null) {
					result.error500("手机号已经注册,请直接登录!");
					sysBaseAPI.addLog("手机号已经注册,请直接登录!", CommonConstant.LOG_TYPE_1, null);
					return result;
				}
				obj.put("minutes",10);
				b = smsHelper.sendSms(phoneNumbers, obj, DySmsEnum.REGISTER_TEMPLATE_CODE)[0];
			}else {
				//登录模式,校验用户有效性
				SysUser sysUser = sysUserService.getUserByPhone(mobile);
				result = sysUserService.checkUserIsEffective(sysUser);
				if(!result.isSuccess()) {
					return result;
				}

				/**
				 * smsmode 短信模板方式  0 .登录模板、1.注册模板、2.忘记密码模板
				 */
				if (CommonConstant.SMS_TPL_TYPE_0.equals(smsmode)) {
					//登录模板
					obj.put("minutes",10);
					b = smsHelper.sendSms(phoneNumbers, obj, DySmsEnum.LOGIN_TEMPLATE_CODE)[0];
				} else if(CommonConstant.SMS_TPL_TYPE_2.equals(smsmode)) {
					//忘记密码模板
					b = smsHelper.sendSms(phoneNumbers, obj, DySmsEnum.FORGET_PASSWORD_TEMPLATE_CODE)[0];
				}
			}

			if (b!=null && !"OK".equals(b.getCode())) {
				result.setMessage("短信验证码发送失败,"+b.getMessage());
				result.setSuccess(false);
				return result;
			}
			//验证码10分钟内有效
			redisUtil.set(mobile, captcha, 600);
			//update-begin--Author:scott  Date:20190812 for:issues#391
			//result.setResult(captcha);
			//update-end--Author:scott  Date:20190812 for:issues#391
			result.setSuccess(true);

		} catch (ClientException e) {
			e.printStackTrace();
			result.error500("短信接口未配置,请联系管理员!");
			return result;
		}
		return result;
	}
    
}
1.4 安装分布式对象存储服务minio

因为首先还要跑通本地开发环境,所以笔者暂时选择了windows系统下的安装,将来需要部署到linux服务器上时还是需要安装linux系统下的minio

本地启动minio服务后修改application-dev.yml文件中对应的minio客户端连接配置:

jeecg:    
    minio:
       minio_url: http://localhost:9000  #连接url
       minio_name: minioadmin #登录用户名(默认为minioadmin)
       minio_pass: minioadmin #登录用户密码(默认为minioadmin)
       bucketName: jeecg  #存储桶名(没有的话上传文件时会自动创建)
1.5 安装redis服务

redis`服务的安装和启动可参考菜鸟教程网Redis 安装

windows和Linux系统下redis服务的安装和启动详细教程都有

1.6 开通阿里云对象存储服务(OOS)

(1)登录阿里云官网

(2)将鼠标移至产品,单击对象存储 OSS,打开 OSS 产品详情页面。

(3)在 OSS 产品详情页,单击立即开通

(4)开通服务后,在 OSS 产品详情页单击管理控制台直接进入 OSS 管理控制台界面。

(5)创建Bucket

您也可以单击位于官网首页右上方菜单栏的控制台,进入阿里云管理控制台首页,然后单击左侧的对象存储 OSS 菜单进入 OSS 管理控制台界面。

点击产品服务页面的对象存储OSS按钮,进入对象存储界面,然后点击Bucket列表菜单,在右边的Bucket列表区点击创建bucket按钮。按要求填写好bucket名称、选择地域后点击确定按钮即可

create_oss_bucket01
create_oss_bucket02
具体可参考阿里云创建存储空间

(5)静态网站托管和绑定自定义域名

静态网站托管和绑定自定义域名请参考:https://oss.console.aliyun.com/bucket/oss-cn-guangzhou//settings#static

(6)创建用户获取accessKey

进入ram用户界面
oss_create_user
若还没有用户,需要点击创建用户按钮创建用户
oss_create_user02
oss_create_user03
创建用户成功后点击右侧的复制按钮或者上方的下载CSV文件保存好登录密码、AccessKey IDAccessKey Secret等信息
oss_create_accesskey
将新建存储桶的Endpoint及复制或者下载CSV文件获得的AccessKey ID及AccessKey Secret等信息拷贝到application-dev.yml文件中的jeecg.oss属性变量对应的值

#阿里云oss存储配置
jeecg:
     oss:
       endpoint: oss-cn-guangzhou.aliyuncs.com 
       accessKey: LT******6f
       secretKey: JR******Fv3M
       bucketName: jeecgboot2021
       staticDomain: http://javahsf.club #阿里云控制台配置好的域名解析
       username: jeecg@1543974010856129.onaliyun.com
1.7 开通邮件服务

(1)登陆⽹易邮箱163,在设置中打开并勾选POP3/SMTP/IMAP服务,然后会得到⼀个授权码,这个邮箱和授权码将⽤作登陆认证。
javaMailServiceApply
(2)修改配置文件中关于mail部分的配置内容

spring:
  mail:
    host: smtp.163.com
    username: <username>
    password: <password> #申请邮箱服务时拿到的授权码
    properties:
      mail:
        smtp:
          auth: true
          starttls:
            enable: true
            required: true
1.8 配置第三方登录认证

(1)申请第三方认证应用可参考我的上一篇文章SpringBoot项目中集成第三方登录功能

(2)修改application.yml配置文件中关于第三方登录的配置内容

justauth:
  enabled: true
  type:
    GITHUB:
      client-id: <clientId>
      client-secret: <clientSecret>
      redirect-uri: http://<domain>/jeecg-boot/thirdLogin/github/callback
    GITEE:
      client-id: <clientId>
      client-secret: <clientSecret>
      redirect-uri: http://<domain>/jeecg-boot/thirdLogin/gitee/callback
    WECHAT_ENTERPRISE:
      client-id: <clientId>
      client-secret: <clientSecret>
      redirect-uri: http://<domain>:8080/jeecg-boot/thirdLogin/wechat_enterprise/callback
      agent-id: <agentId>
    DINGTALK:
      client-id: <clientId>
      client-secret: <clientSecret>
      redirect-uri: http://<domain>:8080/jeecg-boot/thirdLogin/dingtalk/callback
1.9 解决下载jar包失败和Maven Dependencies显示的依赖冲突问题

(1) jeecg-boot-parent项目的pom.xml文件中新增Maven中央仓库配置

  <repository>
             <id>central</id>
             <name>maven central repository</name>
             <url>https://repo1.maven.org/maven2/</url>
             <snapshots>
                   <enabled>false</enabled>
             </snapshots>
    </repository>

(2)排除 jeecg-boot-parent项目的pom.xml文件中的冲突依赖项

具体修改了啥可查看本人上传到个人gitee仓库中的 jeecg-boot-parent项目的pom.xml文件内容

(3)排除jeecg-boot-module-erp项目的pom.xml文件中中因为引入jeecg-boot-base-common项目依赖而引进的依赖冲突

具体修改了啥可查看本人上传到个人gitee仓库中的jeecg-boot-module-erp项目的pom.xml文件内容

(4)排除jeecg-boot-module-system项目中的pom.xml文件中因为引入jeecg-boot-base-common项目依赖和jeecg-boot-module-system项目依赖产生的依赖冲突

具体修改了啥可查看本人上传到个人gitee仓库中的 jeecg-boot-module-system项目的pom.xml文件内容

2 启动jeecg-boot后端服务

IDEA中找到``jeecg-boot-module-system项目中的JeecgApplication ,选中main方法->右键->run 'JeecgApplication' ,或者通过点击IntellJ IDEA`开发工具窗口右上方绿色的三角符号启动项目后端服务

当后台项启动成功时会显示部分重要标识日志:

 (_)                          | |               | |
    _  ___  ___  ___ __ _ ______| |__   ___   ___ | |_ 
   | |/ _ \/ _ \/ __/ _` |______| '_ \ / _ \ / _ \| __|
   | |  __/  __/ (_| (_| |      | |_) | (_) | (_) | |_ 
   | |\___|\___|\___\__, |      |_.__/ \___/ \___/ \__|
  _/ |               __/ |                             
 |__/               |___/



Jeecg  Boot Version: 2.2.0
Spring Boot Version: 2.1.3.RELEASE (v2.1.3.RELEASE)

2021-03-28 00:16:40.304 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer:204 - Tomcat started on port(s): 8080 (http) with context path '/jeecg-boot'
2021-03-28 00:16:40.306 [main] INFO  org.jeecg.JeecgApplication:59 - Started JeecgApplication in 17.938 seconds (JVM running for 24.926)
2021-03-28 00:16:40.321 [main] INFO  org.jeecg.JeecgApplication:33 - 
----------------------------------------------------------
	Application Jeecg-Boot is running! Access URLs:
	Local: 		http://localhost:8080/jeecg-boot/
	External: 	http://192.168.1.101:8080/jeecg-boot/
	Swagger-UI: 		http://192.168.1.101:8080/jeecg-boot/doc.html
----------------------------------------------------------
2021-03-28 00:16:40.807 [RMI TCP Connection(5)-127.0.0.1] INFO  o.a.c.c.C.[Tomcat].[localhost].[/jeecg-boot]:173 - Initializing Spring DispatcherServlet 'dispatcherServlet'
2021-03-28 00:16:40.807 [RMI TCP Connection(5)-127.0.0.1] INFO  org.springframework.web.servlet.DispatcherServlet:524 - Initializing Servlet 'dispatcherServlet'
2021-03-28 00:16:40.828 [RMI TCP Connection(5)-127.0.0.1] INFO  org.springframework.web.servlet.DispatcherServlet:546 - Completed initialization in 20 ms
2021-03-28 00:16:40.955 [RMI TCP Connection(4)-127.0.0.1] INFO  io.lettuce.core.EpollProvider:68 - Starting without optional epoll library
2021-03-28 00:16:40.957 [RMI TCP Connection(4)-127.0.0.1] INFO  io.lettuce.core.KqueueProvider:70 - Starting without optional kqueue library

控制台打印出以上标识的日志标识代表jeecg-boot后台项目在本地开发环境启动成功了!

3 启动ant-design-vue-jeecg前端项目

前端项目使用的 vue-cli3, 如果你使用的还是vue-cli2,请更新你的 cli

运行前端项目前需要移除 package.jsoneslintConfig 整个节点代码

"eslintConfig": {
    "root": true,
    "env": {
      "node": true
    },
    "extends": [
      "plugin:vue/strongly-recommended",
      "@vue/standard"
    ],
    "parserOptions": {
      "parser": "babel-eslint"
    },
    "rules": {
      "generator-star-spacing": "off",
      "no-mixed-operators": 0,
      "vue/max-attributes-per-line": [
        2,
        {
          "singleline": 5,
          "multiline": {
            "max": 1,
            "allowFirstLine": false
          }
        }
      ],
      "vue/attribute-hyphenation": 0,
      "vue/html-self-closing": 0,
      "vue/component-name-in-template-casing": 0,
      "vue/html-closing-bracket-spacing": 0,
      "vue/singleline-html-element-content-newline": 0,
      "vue/no-unused-components": 0,
      "vue/multiline-html-element-content-newline": 0,
      "vue/no-use-v-if-with-v-for": 0,
      "vue/html-closing-bracket-newline": 0,
      "vue/no-parsing-error": 0,
	  "no-console": 0,
      "no-tabs": 0,
      "indent": [1, 4]
    }
  }

备注

@vue/cli 升级后,eslint 规则更新了。由于影响到全部 .vue 文件,需要逐个验证。既暂时关闭部分原本不验证的规则,后期维护时,在逐步修正这些 rules

3.1 解决安装依赖失败问题

切换到ant-design-vue-jeecg项目的目录后,在windows开发环境下解决执行yarn install命令报错,报错信息如下(若本地没有安装yarn的化,需要执行命令cnpm install yarn --save -dev在本地安装yarn):

info fsevents@1.2.11: The platform "win32" is incompatible with this module.
info "fsevents@1.2.11" is an optional dependency and failed compatibility check. Excluding it from installation.
error default-gateway@5.0.5: The engine "node" is incompatible with this module. Expected version "^8.12.0 || >=9.7.0". Got "8.11.3"
error Found incompatible module.
info Visit https://yarnpkg.com/en/docs/cli/install for documentation about this command.

解决方法:

在控制台执修改配置行命令:yarn config set ignore-engines true

3.2 解决本地启动时报错问题

windows 系统下解决运行yarn run serve命令时报错,报错信息如下:

<--- Last few GCs --->

[22704:0231AB08]   199404 ms: Mark-sweep 562.5 (718.2) -> 562.4 (719.7) MB, 521.7 / 0.0 ms  allocation failure GC in old space requested
[22704:0231AB08]   199981 ms: Mark-sweep 562.4 (719.7) -> 562.4 (679.2) MB, 577.0 / 0.0 ms  last resort GC in old space requested
[22704:0231AB08]   200422 ms: Mark-sweep 562.4 (679.2) -> 562.4 (659.7) MB, 441.5 / 0.0 ms  last resort GC in old space requested

FATAL ERROR: CALL_AND_RETRY_LAST Allocation failed - JavaScript heap out of memory
 1: node_module_register
 2: v8::internal::Factory::NewRawTwoByteString
 3: v8::internal::Smi::SmiPrint
error Command failed with exit code 3.
info Visit https://yarnpkg.com/en/docs/cli/run for documentation about this command.

表明项目运行过程中JavaScript堆内存溢出

解决方法

打开node_modules/.bin/webpack.cmd文件,在node命令后面加上–max-old-space-size=4096就好了。

@IF EXIST "%~dp0\node.exe" (
  "%~dp0\node.exe"  "%~dp0\..\webpack\bin\webpack.js" %*
) ELSE (
  @SETLOCAL
  @SET PATHEXT=%PATHEXT:;.JS;=;%
  node  "--max-old-space-size=4096 %~dp0\..\webpack\bin\webpack.js" %*
)

重新运行yarn run serve 控制台出现如下日志信息表示前端项目启动成功:

DONE  Compiled successfully in 39561ms                                                                                                 23:30:52

  App running at:
  - Local:   http://localhost:3000/
  - Network: http://192.168.1.101:3000/

  Note that the development build is not optimized.
  To create a production build, run yarn build.

在浏览器中输入http://localhost:3000/后回车即可进入Finer进销存系统登录页面
erplogin
输入用户名admin,密码123456和验证码点击确定按钮登录成功后即可进入Finer进销存系统首页
erpHomePage
到这一步,整个项目就算是在本地开发环境完全跑起来了。我们也就可以愉快的研究里面的功能和源码了,也可以项目的基础上做二次开发和调试功能了!

4 结束语

如果读者追求的时尽快在开发环境跑起来这个项目,其实只需在本地启动Mysql服务和Redis服务即可,其他比较繁琐的第三方登录认证服务配置、阿里OSS对象云存储及短信服务可以暂时先放一边,后面再逐一修改项目中集成的第三方配置信息。本项目修改后的代码我已提交到自己的个人gitee仓库,欢迎感兴趣的读者fork到你自己的仓库后再克隆到你本地参考。本人的Finer项目地址:https://gitee.com/heshengfu1211/psi

5 参考文章

[1] 腾讯云短信SDK文档

[2] JeecgBoot2.2版 10分钟快速入门

[3] JeecgBoot常见问题大全

[4] JeecgBoot开发文档

6 推荐阅读

[1] Jeecg-Boot 快速开发平台项目介绍,附源码下载地址

[2] SpringBoot项目中集成第三方登录功能

7 腾讯云优惠服务推荐

以下是为提高开发人员效率,避免项目中集成的所有服务都安装和部署在本机导致本机卡顿的问题,笔者推荐一些开发人员在搭建和部署第三方服务可能会用的到的云服务产品。如果只是用于个人学习,建议购买腾讯云的服务产品即可,如果是公司的大项目用,为服务可靠性计则可以考虑使用阿里云的服务产品。读者如果刚好用的到,可以通过点击下面的链接跳转到腾讯云官网页面购买。

云服务器
【腾讯云】云产品限时秒杀,爆款1核2G云服务器,首年99元

SA2云服务器

【腾讯云】星星海SA2云服务器,1核2G首年99元起,高性价比首选

Mysql数据库服务

【腾讯云】云数据库MySQL基础版1元体验,为中小企业量身打造,单节点架构,保证数据可靠性

Redis服务

腾讯云】Redis单机版特惠2.1折起,为缓存业务量身定制,新用户8元起购

特别说明

本文首发个人微信公众号“阿福谈Java技术栈”,觉得笔者的文章对你有用的新读者欢迎使用微信扫描下面的二维码添加关注,不定时推送优质原创文章,与你携手一同成长!
关注微信公众号

Logo

前往低代码交流专区

更多推荐