一、概述
1.1、行业背景
国外的营销触达通道比较单一,主要以EDM为主。国内因为渠道的变化营销场景就复杂很多,当前国内做用户的营销触达主要的场景通道都有哪些。
- 企业微信(私聊、社群、朋友圈)
- 微信运营(公众号、小程序、视频号)
- 电商运营(抖音、快手、淘宝、京东、拼多多)
- 公域运营(短信、邮件、APP弹窗、PUSH推送、banner位)
- 其他
虽然国内已经有非常多的 MarTech 公司做出了非常优秀的 SaaS 产品服务,但是国内的市场需求依然没有得到充分满足。主要体现在以下几点:
- 痛---企业更注重客户的数据安全,私有化部署意愿强烈。
- 痛---经营场景复杂,需要同全域经营场景打通做一体化营销,而不是单纯的买一套系统工具。
- 痛---需要源代码,越来越多的企业开始选择自建,以打造出更适合自己业务的营销系统。其背后的主要原因就是市场上直接采购的 SaaS 标准工具“不业务”。
基于以上的痛点若稍具规模的企业想要解决以上问题,只有自建一条路,但是选择自建碰到最大的问题就是:
0-1 自建周期成本高
一个复杂的营销自动化系统从 0-1 开发出来并没有想象的那么简单,都需要浪费大量的人力和物力,甚至短期内是看不见什么成果的,很容易导致不了了之。那么有什么好的办法能解决呢?
1.2、MarketGo简介
基于以上背景,国内开源的营销自动化项目寥寥无几,MarketGo 在此背景下特意开源出来,以为国内数字化营销贡献绵薄之力
MarketGo 是一个营销引擎,通过提供的标准化功能和基础能力,让开发者能快速搭建适合自己企业的营销系统,快速完成从 0-1 的过程,并且能基于开放的能力和源码,开发深度融合自身业务的营销系统。
MarketGo 作为领域的产品新秀,也需要一步一个脚印逐步向前迈进。对未来的发展主要分以下几个阶段:
- 构建私域SCRM营销平台
此阶段我们结合了当下私域营销的趋势,选择了优先从企业微信SCRM场景切入。 在这个阶段我们会提供个比较基础的企业微信SCRM功能,保留了其灵活的扩展性,便于开发者能够快速基于 MarketGo 开发自己想要的 SCRM 功能。
- 全域营销基础能力搭建
此阶段我们会重点完善平台的全域营销能力,我们会接入更多的营销场景通道、人群圈选能力、任务下发能力、内容导入能力、自动化能力等。
- 自动化场景快速迭代
此阶段我们会快速基于场景构建全域营销自动化方案。
二、产品功能
MarketGo的优势:
- 以私域SCRM为切入点,但不是终于私域SCRM,我们要提供全域的营销解决方案;
- 开发融合能力,基于营销场景,可以整合内容、商城、CDP等上下游系统;
- 微服务架构,基于JAVA的前后端分离,微服务架构,可以便于企业快速敏捷的进行二次开发;
- 专业的技术服务,在toB的企业,产品和售后服务是同等重要的事情,我们有专业的售后团队,可以快速响应客户的技术、产品等问题。
三、项目介绍
3.1、项目结构
前端项目结构如下:
代码语言:javascript复制├── babel.config.js --按需引入配置
├── package-lock.json --结合了逻辑树和物理树的一个快照
├── package.json --安装树
├── public --公共文件
│ ├── favicon.ico --网页标题的左侧小图标
│ └── index.html --入口页面
├── src --源码文件
│ ├── App.vue --根组件
│ ├── api --api配置
│ ├── assets --资源文件
│ ├── components --公共组件
│ ├── main.js --入口文件
│ ├── mixins --js配置 公共变量
│ ├── router --路由
│ ├── store --状态库
│ ├── utils --公共方法
│ └── views --视图界面
└── vue.config.js --配置文件
后端项目结构如下:
代码语言:javascript复制├── marketgo.sql --系统的sql脚本
├── mktgo-api --dubbo的接口定义
├── mktgo-biz --业务module
├── mktgo-common --公共依赖
├── mktgo-core --业务核心公共模块,
├── mktgo-gateway --网关服务,请求企微的接口
├── mktgo-react --接收外部请求的modul,可以根据自己的客户量级,做成服务
├── mktgo-test --测试项目
├── mktgo-web --web服务
└── pom.xml --公共依赖
客户端项目结构如下:
代码语言:javascript复制├── LICENSE
├── index.html --入口页面
├── package-lock.json --结合了逻辑树和物理树的一个快照
├── package.json --安装树
├── public
│ └── env.js
├── src --源码文件
│ ├── App.vue --根组件
│ ├── api --api配置
│ ├── imgs --图片资源
│ ├── main.js --入口文件
│ ├── pinia
│ ├── router.js
│ ├── utils --公共方法
│ └── view --视图界面
└── vite.config.js --配置文件
3.2、技术框架
- 核心框架:SpringBoot 2.7.0
- 日志管理:SLF4J 1.7
- 持久层框架:spring-data-jpa 2.7.0
- RPC框架:dubbo 2.7.13
- 项目管理框架: Maven 3.6.0
- 前端框架:Vue 2.6.11
- UI框架: element-ui 2.15.9
3.3、开发环境
- IDE: IntelliJ IDEA 2019.2
- DB: Mysql 5.7.37
- JDK: JDK 1.8
- Maven: Maven 3.6.1
- Redis:7.0.2
- Nginx: 1.12.2
3.4、部署流程
服务器配置
服务器的最低配置如下:
类型 | 配置 |
---|---|
操作系统 | CentOS 7.6 |
CPU | 4核 |
内存 | 8G |
硬盘 | 80G |
带宽 | 3M |
端口设置
服务 | 端口 |
---|---|
zookeeper | 2181 |
mktgo-gateway | 8521 |
mktgo-web | 8520 |
dubbo | 28090 |
Xxl-job | 8580 |
redis | 6379 |
mysql | 3306 |
环境准备
1、环境配置
组件名称 | 版本号 |
---|---|
JDK | 1.8 |
mysql | 5.7.0 |
redis | 7.0.2 |
rabbitmq | 3.10.0 |
nginx | 1.20.1 |
zookeeper | 3.4.6 |
2、JDK
yum install java-1.8.0-openjdk java-1.8.0-openjdk-devel
#设置环境变量
vi /etc/profile
#添加一下信息
export JAVA_HOME=/usr/lib/jvm/java-1.8.0-openjdkexport CLASSPATH=.:JAVA_HOME/jre/lib/rt.jar:JAVA_HOME/lib/dt.jar:JAVA_HOME/lib/tools.jarexport PATH=PATH:
#保存加载
source /etc/profile
3、mysql
#创建项目目录
mkdir -p /opt/soft/marketgo/mysqlcd /opt/soft/marketgo/mysql
#安装wget下载器
yum install -y wget
#下载mysql
wget https://cdn.mysql.com/archives/mysql-5.7/mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar
#解压
tar xf mysql-5.7.37-1.el7.x86_64.rpm-bundle.tar
#安装rpm
rpm -ivh mysql-community-common-5.7.37-1.el7.x86_64.rpm --nodeps --forcerpm -ivh mysql-community-libs-5.7.37-1.el7.x86_64.rpm --nodeps --forcerpm -ivh mysql-community-client-5.7.37-1.el7.x86_64.rpm --nodeps --forcerpm -ivh mysql-community-server-5.7.37-1.el7.x86_64.rpm --nodeps --force
#启动服务
systemctl start mysqldsystemctl enable mysqldsystemctl status mysql
#查询密码
grep 'temporary password' /var/log/mysqld.log
#登录并修改密码
mysql -u root -p'password'ALTER USER 'root'@'localhost' IDENTIFIED BY 'MarketGo@mysql2022';
4、redis
#创建项目目录
mkdir -p /opt/soft/marketgo/redis
cd /opt/soft/marketgo/redis
wget https://github.com/redis/redis/archive/7.0.2.tar.gz
tar -zxvf 7.0.2.tar.gz
mv redis-7.0.2 /usr/local/redis
cd /usr/local/redis/
make install PREFIX=/usr/local/redis
# 配置redis 密码及参数
vim /usr/local/redis/redis.conf
#修改如下配置
daemonize yesprotected-mode no./bin/redis-server redis.conf
5、rabbitmq
#创建项目目录mkdir -p /opt/soft/marketgo/rabbitmqcd /opt/soft/marketgo/rabbitmqcurl -s https://packagecloud.io/install/repositories/rabbitmq/erlang/script.rpm.sh | sudo bashyum install erlang -yerl -versioncurl -s https://packagecloud.io/install/repositories/rabbitmq/rabbitmq-server/script.rpm.sh | sudo bashyum install rabbitmq-server -ysystemctl enable rabbitmq-server.servicesystemctl start rabbitmq-server.servicerabbitmq-plugins enable rabbitmq_managementrabbitmqctl add_user admin 'admin'rabbitmqctl set_user_tags admin administratorps -ef | grep rabbitmq
6、nginx
yum info nginxyum install nginxservice nginx startnginx -v
7、zookeeper
mkdir -p /opt/soft/marketgo/zookeepercd /opt/soft/marketgo/zookeeperwget https://archive.apache.org/dist/zookeeper/zookeeper-3.4.6/zookeeper-3.4.6.tar.gztar -zxvf zookeeper-3.4.6.tar.gzcd zookeeper-3.4.6/conf/mv zoo_sample.cfg zoo.cfg./bin/zkServer.sh startps -ef | grep zookeeper
前端部署
1、部署安装包
#下载代码,进入根目录下的version目录,上传dist.zipscp dist.zip root@${IP}:/opt/soft/marketgo/
#登录服务器,进入/opt/soft/marketgo/
unzip dist.zip
mv dist html
#修改服务器地址cd /opt/soft/marketgo/html
#修改服务器的地址vim env.js
后端部署
1、环境设置
1.1、设置nginx
修改nginx.conf
vim /etc/nginx/nginx.conf
nginx.conf
代码语言:javascript复制http{
gzip on; gzip_static on; gzip_disable "msie6"; gzip_min_length 100k; gzip_buffers 4 16k; gzip_comp_level 5; log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for"'; access_log /var/log/nginx/access.log main; sendfile on; tcp_nopush on; tcp_nodelay on; keepalive_timeout 65; types_hash_max_size 4096; client_max_body_size 100m; client_body_buffer_size 100m; client_body_temp_path temp/; include /etc/nginx/mime.types; default_type application/octet-stream; # Load modular configuration files from the /etc/nginx/conf.d directory. # See http://nginx.org/en/docs/ngx_core_module.html#include # for more information. include /etc/nginx/conf.d/*.conf; server{ listen 80; listen [::]:80; server_name localhost; #root /usr/share/nginx/html; #root /opt/soft/html; # 指定允许跨域的方法,*代表所有 location /{ proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_buffer_size 128k; proxy_buffers 32 32k; proxy_busy_buffers_size 128k; client_max_body_size 100m; client_body_buffer_size 100m; client_body_temp_path temp/; proxy_connect_timeout 60; proxy_send_timeout 60; proxy_read_timeout 60; send_timeout 60; proxy_http_version 1.1;#开启后端,长连接 proxy_set_header Connection ""; root /opt/soft/marketgo/html; index index.html index.htm; } location /marketgo{ root /opt/soft/marketgo/client; try_files $uri $uri/ /marketgo/index.html; } location /web{ client_max_body_size 100m; client_body_buffer_size 100m; client_body_temp_path temp/; if ($request_method = 'OPTIONS'){ add_header Access-Control-Allow-Origin '$http_origin'; add_header Access-Control-Allow-Headers 'DNT,X-CustomHeader,Keep-Alive,User-Agent,X-Requested-With,If-Modified-Since,Cache-Control,Content-Type,api-token,header-api-token,language,Api-Token,isPlatform'; add_header 'Access-Control-Allow-Methods' 'GET, POST, DELETE, OPTIONS, PUT'; add_header Access-Control-Allow-Credentials 'true'; return 204; } proxy_pass http://127.0.0.1:8520/; } location /mktgo/api{ proxy_pass http://127.0.0.1:8521; } location /mktgo/client{ proxy_pass http://127.0.0.1:8521; } location ~ .*.(txt)${ proxy_pass http://127.0.0.1:8521; proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; add_header Access-Control-Allow-Origin $http_origin; add_header Access-Control-Allow-Credentials true; } # Load configuration files for the default server block. include /etc/nginx/default.d/*.conf; }
重新加载nginx
#重新加载conf/usr/sbin/nginx -s reload#重启systemctl restart nginx
1.2、设置hosts
#配置hostsvim /etc/hosts#添加以下配置127.0.0.1 dev-marketgo.com zk.dev-marketgo.com redis.dev-marketgo.com rabbitmq.dev-marketgo.com mysql.dev-marketgo.com127.0.0.1 xxl-job.dev-marketgo.com#加载source /etc/hosts
1.3、设置数据库
#下载代码,进入根目录下的version目录,上传xxl-job的数据库scp xxl-job.zip root@{IP}:/opt/soft/marketgo#解压unzip xxl-job.zip#导入定时任务的信息 xxl-job 在项目的根目录下source /opt/soft/marketgo/xxl-job/xxl_job.sql#下载代码,进入根目录下的version目录,上传marketgo的数据库scp web.zip root@{IP}:/opt/soft/marketgo#解压unzip web.zip#登录mysql,加载marketgo数据库source /opt/soft/marketgo/web/marketgo.sql
1.4、添加rabbitmq虚拟机
rabbitmqctl add_vhost /wecomrabbitmqctl set_permissions -p /wecom admin '.*' '.*' '.*'systemctl restart rabbitmq-server.service
2、部署安装包
2.1、部署xxl-job
#登录服务器, 创建日志文件mkdir -p /opt/soft/marketgo/logs/xxl-job#进入/opt/soft/marketgo/xxl-jobchmod 777 xxl-job-admin-2.3.1.jar#启动服务java -jar xxl-job-admin-2.3.1.jar & >> /opt/soft/marketgo/logs/xxl-job/xxl-job.log
2.2、部署gateway服务
#下载代码,进入根目录下的version目录,上传gateway.zipscp gateway.zip root@${IP}:/opt/soft/marketgo/#登录服务器,进入/opt/soft/marketgo/unzip gateway.zipcd gatewaychmod 777 *./start_service.sh start
2.3、部署web服务
#下载代码,进入根目录下的version目录,上传web.zipscp web.zip root@${IP}:/opt/soft/marketgo/#登录服务器,进入/opt/soft/marketgo/unzip web.zipcd webchmod 777 *./start_service.sh start