# crm-web **Repository Path**: yagb/crm-web ## Basic Information - **Project Name**: crm-web - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2025-09-11 - **Last Updated**: 2025-09-11 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 会员关系管理系统 http://gitlab.wanhuhealth.com/frontend/crm-web ## 系统需求 ### 开发 nodejs >= 8.9 万户私有 npm 配置:运行 `npm config set @wanhu:registry http://10.1.10.47:5080` ### 部署 docker-ce >= 17(部署环境不需要安装 nodejs,全部依赖在 docker 镜像内部) ## 技术方案概述 本系统由以下几部分组成: 1. 后端服务:基于 nodejs 的 HTTP server,使用 [eggjs](https://eggjs.org/)(基于 [Koa](https://koajs.com/) 的 MVC 框架),为了匹配万户的需求,在 eggjs 基础上开发了扩展框架 [@wanhu/egg-framework-wanhu](http://gitlab.wanhuhealth.com/contrib/egg-framework-wanhu);后端服务在服务器上的部署采用了 docker 容器的方式。 2. PC端前端页面:使用 React 技术为基础的 HTML 页面;主要使用了 [ant design](https://ant.design/) 组件库;此外在页面上嵌入了[阿里云的呼叫中心](https://www.aliyun.com/product/ccc?spm=5176.8142029.digitalization.11.e9396d3eyyyqOP)(开发文档[看这里](https://help.aliyun.com/document_detail/85054.html?spm=a2c4g.11186623.6.593.4b513683J85yA5))。 ## 代码结构 * `/client` PC端前端 * `/server` 后端服务 * `build-docker-base` 用于构建缓存镜像的命令 * `base.dockerfile` 用于构建缓存镜像的配置文件 * `Dockerfile` 用于构建发布镜像的配置文件 ## 开发PC端 开发时的系统架构: ``` localhost dev/test remote server |----------------------------------|---------------------------------------| Browser ^ | (localhost:7001) /server <-----------------------+------ Eureka ^ | ^ | | | /client +--- crm-portal, ... ``` 1. 首先需要 clone 代码后,在各个子目录里运行 `npm install` ,安装依赖项 2. 需要本机能连接到万户开发/测试环境的服务集群和Eureka注册中心:`/server/config/config.local.js` 里有开发/测试环境的连接配置 3. 启动前端 build 服务:`cd client && npm start` 4. 启动服务端:`cd server && npm run dev` 5. 在 client 中编辑代码会自动重新构建,不需要重新运行以上命令 6. 访问 http://localhost:7001/ 即可看到页面 7. 不支持 Hot reload,所以代码自动构建后,需要在浏览器里手动刷新 ## 开发阿里云呼叫中心相关功能 电话条本身的前端功能均由阿里云的SDK提供,我们前端只针对它的样式和页面布局做了控制。核心功能均在后端和接口对接上,主要有这两部分:1. 获取 access_token;2. 转发前端请求到阿里云平台。 ### 获取 access token 本系统并未对万户系统账号与阿里云账号维护绑定关系,而是分别进行登录。因此登录过程本身类似于普通 OAuth 流程,在需要登录的时候,访问 `/_api/call/login`,跳转到阿里云的登录页面,完成之后通过 `/_api/call/redirect`页面返回,并使用 code 获取 access token。 登出时需要清除本地的cookie,销毁 access token,同时也跳转到阿里云的页面进行登出。 ### 转发前端请求到阿里云平台 由于阿里云只提供了 Java SDK,并且文档内没有明确给出接口签名方法,所以实际流程是前端 Node 服务先转到后端 Java 服务中写好的一个接口(`eureka://wanhuhealth-crm-portal/cloudcallcenter/proxy`),再通过 Java 接口去调用阿里云服务器。 Java 接口是通用设计,本身不需要任何的配置,所有配置参数都在接口调用时由前端传过去。详细请查看[电话条API需求](./doc/电话条API需求.md)。 ## 构建与部署服务镜像 > 构建镜像需要本机安装 docker-ce,并且在 linux/mac 命令行环境下运行 由于代码库修改比较频繁,为了加快构建速度,避免比较慢的安装依赖项步骤,本项目采用了两步构建: 1. 构建缓存镜像:在项目根目录,运行 `./build-docker-base`,这一步会将 client/server 两个子目录的依赖项下载到镜像内,但不会进行实际的构建。缓存镜像不需要频繁构建,只有依赖项发生大幅变化时才需要重新构建。(每次构建时,仍会执行安装依赖项的步骤,如果依赖不变或只有小幅变化,这一步是很快的) 2. 构建服务镜像:在项目根目录,运行 `docker build . --build-arg VERSION=$(git rev-parse HEAD)`。可以搭配其他参数,例如 `-t IMAGE_NAME` 指定构建镜像的名字 3. 运行:使用标准 docker 启动命令,可以设置如下映射: * `-p PORT:8080` 该镜像内部监听8080端口,通过 docker 的端口映射对外开放 * `-v /LOGS/DIR:/logs` 该镜像内部将日志写入 `/logs` 文件夹,如果想把日志保存在宿主机上,可以设置此目录向宿主机的映射。镜像内部运行服务使用的用户和组为 `uid 50000:gid 50000`,如果要映射日志文件夹,则需要在宿主机上创建同样 id 的用户和组,为该用户给宿主机上映射的目录赋予写权限,否则日志写入会因为权限问题而失败 * `-v /ENV/FILE:/application/server/.env` 设置环境变量默认值的文件,参考下方“运行参数”的说明 4. 运行参数:关键的运行参数通过环境变量或 `.env` 文件指定,环境变量通过标准的docker命令即可设置,例如构建镜像时的 `ENV` 命令,运行镜像时的 `-e NAME=VALUE` 参数。也可以在镜像的 `/application/server` 目录下映射一个 `.env` 文件,它内容每一行是:`NAME=VALUE` 的形式。这二者中,环境变量的优先级大于 .env 文件。 5. 热更新:通过 `.env` 文件设置的参数可以热更新,通过环境变量设置的无法更新。向容器发送 `SIGHUP` 信号即可启动热更新,热更新会立即创建新的工作进程,读取新的 `.env` 文件内容,然后开始处理新连接。旧的工作进程会保持一段时间,处理已有的连接,但不再接受新连接。 6. 参数列表: * `EUREKA_SERVICE_URL` Eureka服务端地址,可以为逗号分隔的集群地址列表 * `EUREKA_CLIENT_SERVICE_ID` 向Eureka注册服务时的服务名称,可以不设置,默认为 `wanhuhealth-gpmentor-web` * `EUREKA_CLIENT_HOST` 向Eureka注册服务时的本机地址 * `EUREKA_CLIENT_PORT` 向Eureka注册服务时的本机端口 * `DEBUG` 设置为非空的值即开启debug模式,会影响其他第三方组件的debug模式 * `LOGSTASH_HOST` 设置后即开启 filebeat 服务向此主机发送日志 * `OAUTH_WEB_URL` OAuth 登录服务的服务域名 * `CALL_INSTANCE_ID` 阿里云呼叫中心InstanceId * `CALL_CLIENT_ID` 阿里云呼叫中心ClientId * `CALL_CLIENT_SECRET` 阿里云呼叫中心Client Secret * `BAIDU_TONGJI_CODE` 百度统计 appKey ​