diff --git a/docker-compose.local.yml b/docker-compose.local.yml index fb3bcc556..8f59f557a 100644 --- a/docker-compose.local.yml +++ b/docker-compose.local.yml @@ -27,23 +27,18 @@ services: # 不然,ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效 APP_ENV: ${APP_ENV:-local} APP_DEBUG: ${APP_DEBUG:-true} - XDEBUG_CONFIG: ${XDEBUG_CONFIG:-client_host=host.docker.internal client_port=9003} - PHP_IDE_CONFIG: serverName=docker-php ports: - - "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM - - "${XDEBUG_POST:-9003}:9003" # Xdebug + - "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM volumes: - ./:/var/www/all_source - ./src:/var/www/html # 更新下载源列表以加速apt-get - ./docker/debian/sources.list:/etc/apt/sources.list:ro - ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro - - ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini - - xdebug_logs:/tmp # Xdebug 日志目录 depends_on: - db healthcheck: - test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status && ps aux | grep '[p]hp think cron:schedule'"] + test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status"] interval: 30s timeout: 10s retries: 3 @@ -119,7 +114,6 @@ services: volumes: mysql_db_data: redis_data: - xdebug_logs: networks: sass-platform-net: diff --git a/docker-compose.yml b/docker-compose.yml index c66f65151..cde9ea229 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -25,23 +25,18 @@ services: # 不然,ThinkPHP 6.x 系列,会只加载 .env 文件,而不会加载 .env.local 文件,导致 .env.local 文件中的配置不会生效 APP_ENV: ${APP_ENV:-development} APP_DEBUG: ${APP_DEBUG:-true} - XDEBUG_CONFIG: ${XDEBUG_CONFIG:-client_host=host.docker.internal client_port=9003} - PHP_IDE_CONFIG: serverName=docker-php ports: - - "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM - - "${XDEBUG_POST:-9003}:9003" # Xdebug + - "${PHP_FPM_PORT:-9000}:9000" # PHP-FPM volumes: - ./:/var/www/all_source - ./src:/var/www/html # 更新下载源列表以加速apt-get - ./docker/debian/sources.list:/etc/apt/sources.list:ro - ./docker/php/php.ini:/usr/local/etc/php/php.ini:ro - - ./docker/php/xdebug.ini:/usr/local/etc/php/conf.d/xdebug.ini - - xdebug_logs:/tmp # Xdebug 日志目录 depends_on: - db healthcheck: - test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status && ps aux | grep '[p]hp think cron:schedule'"] + test: ["CMD", "bash", "-c", "curl -f http://localhost:9000/status"] interval: 30s timeout: 10s retries: 3 @@ -129,15 +124,10 @@ volumes: type: none o: bind device: ./docker/redis_data/${APP_ENV} - xdebug_logs: - name: ${PROJECT_NAME}_${APP_ENV}_xdebug_logs - driver: local - driver_opts: - type: none - o: bind - device: ./docker/xdebug_logs/${APP_ENV} + networks: sass-platform-net: name: ${PROJECT_NAME}_${APP_ENV}_net - driver: bridge \ No newline at end of file + driver: bridge + external: true \ No newline at end of file diff --git a/docker/php/CacheDev.Dockerfile b/docker/php/CacheDev.Dockerfile deleted file mode 100644 index 95cdcd7fe..000000000 --- a/docker/php/CacheDev.Dockerfile +++ /dev/null @@ -1,10 +0,0 @@ -# 使用官方PHP镜像 -FROM php:7.4.33-fpm-dev-newshop - -# 设置工作目录 -WORKDIR /var/www/html - -# 暴露端口 -EXPOSE 9000 9003 - -CMD ["php-fpm"] \ No newline at end of file diff --git a/docker/php/Dockerfile b/docker/php/Dockerfile index 84889a4cc..0ca930912 100644 --- a/docker/php/Dockerfile +++ b/docker/php/Dockerfile @@ -46,9 +46,6 @@ RUN docker-php-ext-configure gd --with-freetype --with-jpeg \ # 安装 Redis 扩展 RUN pecl install redis-5.3.7 && docker-php-ext-enable redis -# 安装 Xdebug(兼容 PHP 7.4 的版本) -RUN pecl install xdebug-3.1.6 && docker-php-ext-enable xdebug - # 安装Composer COPY --from=composer:2.2.25 /usr/bin/composer /usr/bin/composer @@ -58,17 +55,14 @@ RUN composer --version # 修改 PHP 配置 RUN echo "memory_limit=256M" > /usr/local/etc/php/conf.d/memory-limit.ini \ && echo "upload_max_filesize=50M" >> /usr/local/etc/php/conf.d/uploads.ini \ - && echo "post_max_size=50M" >> /usr/local/etc/php/conf.d/uploads.ini - -# 创建 Xdebug 配置 -RUN echo "zend_extension=xdebug.so" > /usr/local/etc/php/conf.d/xdebug.ini + && echo "post_max_size=50M" >> /usr/local/etc/php/conf.d/uploads.ini # # 使用Composer安装项目依赖(可选,根据需要启用, 更多的时候,会出错,要在容器中执行操作) # RUN composer config -g repo.packagist composer https://mirrors.aliyun.com/composer/ # RUN composer install --no-dev --optimize-autoloader --working-dir=/var/www/html # 暴露端口 -EXPOSE 9000 9003 +EXPOSE 9000 ############ 查看 cron 进程 ## 查看 cron 进程 diff --git a/src/.env.development b/src/.env.development index f85fa5e10..316e15642 100644 --- a/src/.env.development +++ b/src/.env.development @@ -1,9 +1,12 @@ APP_DEBUG = true APP_TRACE = true + [APP] DEFAULT_TIMEZONE = Asia/Shanghai + [LANG] default_lang = zh-cn + [DATABASE] TYPE = mysql HOSTNAME = db @@ -13,9 +16,8 @@ PASSWORD = shop_mallnew HOSTPORT = 3306 CHARSET = utf8mb4 DEBUG = true -[RRDATABASE] -HOSTNAME = host.docker.internal -[redis] + +[REDIS] HOST = redis PORT = 6379 PASSWORD = 'luckyshop123!@#' diff --git a/src/.env.local b/src/.env.local index 3951db31b..8b11e1008 100644 --- a/src/.env.local +++ b/src/.env.local @@ -1,9 +1,12 @@ APP_DEBUG = true APP_TRACE = true + [APP] DEFAULT_TIMEZONE = Asia/Shanghai + [LANG] default_lang = zh-cn + [DATABASE] TYPE = mysql HOSTNAME = db @@ -13,9 +16,8 @@ PASSWORD = shop_mallnew HOSTPORT = 3306 CHARSET = utf8mb4 DEBUG = true -[RRDATABASE] -HOSTNAME = redis -[redis] + +[REDIS] HOST = redis PORT = 6379 PASSWORD = 'luckyshop123!@#' diff --git a/src/.env.production b/src/.env.production index 15c7f9e0d..fee5f0908 100644 --- a/src/.env.production +++ b/src/.env.production @@ -10,16 +10,16 @@ default_lang = zh-cn [DATABASE] TYPE = mysql -HOSTNAME = production_mysql_host -DATABASE = shop_mallnew_prod -USERNAME = prod_user -PASSWORD = prod_password +HOSTNAME = db +DATABASE = shop_mallnew +USERNAME = shop_mallnew +PASSWORD = shop_mallnew HOSTPORT = 3306 CHARSET = utf8mb4 DEBUG = false -[redis] -HOST = production_redis_host +[REDIS] +HOST = redis PORT = 6379 -PASSWORD = production_redis_password -EXPIRY = 86400 \ No newline at end of file +PASSWORD = 'luckyshop123!@#' +EXPIRY = 604800 \ No newline at end of file diff --git a/src/app/api/controller/Config.php b/src/app/api/controller/Config.php index 837c9a95e..809d1bdf4 100644 --- a/src/app/api/controller/Config.php +++ b/src/app/api/controller/Config.php @@ -120,6 +120,9 @@ class Config extends BaseApi $config_model = new ConfigModel(); $default_img = $config_model->getDefaultImg($this->site_id, 'shop')[ 'data' ][ 'value' ]; + // 企业微信配置 + $wxwork_config = $config_model->getWxworkConfig($this->site_id, 'shop')[ 'data' ][ 'value' ]; + // 版权信息 $copyright = $config_model->getCopyright($this->site_id, 'shop')[ 'data' ][ 'value' ]; $map_config = $config_model->getMapConfig($this->site_id, 'shop')[ 'data' ][ 'value' ]; @@ -151,6 +154,7 @@ class Config extends BaseApi 'store_config' => $this->store_data[ 'config' ], 'map_config' => $map_config, 'aikefu_config' => $aikefu_config, + 'wxwork_config' => $wxwork_config ]; if (!empty($this->store_data[ 'store_info' ])) { $res[ 'store_info' ] = $this->store_data[ 'store_info' ]; diff --git a/src/app/model/web/Config.php b/src/app/model/web/Config.php index a65cbaab9..c5969eb0c 100644 --- a/src/app/model/web/Config.php +++ b/src/app/model/web/Config.php @@ -847,6 +847,63 @@ class Config extends BaseModel // return $data; // } + /** + * 设置企业微信配置 + * @param $data + * @param int $site_id + * @param string $app_module + * @return array + */ + public function setWxworkConfig($data, $site_id = 1, $app_module = 'shop') + { + // 只要提供了Secret,就自动生成时间戳、随机字符串和签名 + if (!empty($data['secret'])) { + $data['timestamp'] = time(); + + // 生成16位随机字符串 + $chars = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; + $nonceStr = ''; + for ($i = 0; $i < 16; $i++) { + $nonceStr .= substr($chars, mt_rand(0, strlen($chars) - 1), 1); + } + $data['nonceStr'] = $nonceStr; + + // 生成SHA1签名 + $string = 'secret=' . $data['secret'] . '×tamp=' . $data['timestamp'] . '&nonceStr=' . $data['nonceStr']; + $data['signature'] = sha1($string); + } + + $config = new ConfigModel(); + $res = $config->setConfig($data, '企业微信配置', 1, [ [ 'site_id', '=', $site_id ], [ 'app_module', '=', $app_module ], [ 'config_key', '=', 'WXWORK_CONFIG' ] ]); + return $res; + } + + /** + * 获取企业微信配置 + * @param int $site_id + * @param string $app_module + * @return array + */ + public function getWxworkConfig($site_id = 1, $app_module = 'shop') + { + $config = new ConfigModel(); + $res = $config->getConfig([ [ 'site_id', '=', $site_id ], [ 'app_module', '=', $app_module ], [ 'config_key', '=', 'WXWORK_CONFIG' ] ]); + if (empty($res[ 'data' ][ 'value' ])) { + $res[ 'data' ][ 'value' ] = [ + 'corp_id' => '', + 'agent_id' => '', + 'secret' => '', + 'contact_id' => '', + 'contact_url' => '', + 'timestamp' => '', + 'nonceStr' => '', + 'signature' => '', + 'enabled' => false + ]; + } + return $res; + } + /** * 设置商品编码设置 * @param $data diff --git a/src/app/shop/controller/Config.php b/src/app/shop/controller/Config.php index af1fa6cb4..764f83a84 100644 --- a/src/app/shop/controller/Config.php +++ b/src/app/shop/controller/Config.php @@ -214,6 +214,33 @@ class Config extends BaseShop } + /** + * 企业微信配置 + */ + public function wxwork() + { + $config_model = new ConfigModel(); + if (request()->isJson()) { + $data = [ + 'corp_id' => input('corp_id', ''), + 'agent_id' => input('agent_id', ''), + 'secret' => input('secret', ''), + 'contact_id' => input('contact_id', ''), + 'contact_url' => input('contact_url', ''), + 'timestamp' => input('timestamp', ''), + 'nonceStr' => input('nonceStr', ''), + 'signature' => input('signature', ''), + 'enabled' => input('enabled', 0) + ]; + $this->addLog('修改企业微信配置'); + return $config_model->setWxworkConfig($data, $this->site_id, $this->app_module); + } else { + $config_result = $config_model->getWxworkConfig($this->site_id, $this->app_module); + $this->assign('wxwork_config', $config_result[ 'data' ][ 'value' ]); + return $this->fetch('config/wxwork'); + } + } + /** * 域名跳转配置 */ diff --git a/src/app/shop/view/config/wxwork.html b/src/app/shop/view/config/wxwork.html new file mode 100644 index 000000000..08eb3dd1c --- /dev/null +++ b/src/app/shop/view/config/wxwork.html @@ -0,0 +1,514 @@ + + +
获取方式:企业微信管理后台 → 我的企业 → 企业信息 → 企业ID
+格式:通常以 "ww" 开头的18位字符串
+获取方式:应用管理 → 选择应用 → 查看应用详情 → AgentId
+格式:数字字符串,如 1000001
+获取方式:企业微信管理后台 → 应用管理 → 选择应用 → 查看Secret
+说明:系统必需:用于自动生成签名,请妥善保管
+安全提示:Secret仅在创建时可见,请立即复制保存
+获取方式:企业微信管理后台 → 应用管理 → 客服 → 联系我
+说明:系统必需功能,用于企业微信客服对接
+格式:通常以 "kfc_" 开头的字符串
+获取方式:企业微信管理后台 → 客服 → 联系我 → 生成活码
+说明:系统必需功能,客服活码的完整链接地址
+格式:完整的HTTPS链接,如 https://work.weixin.qq.com/kf/xxxx
+说明:系统将在保存配置时自动生成时间戳、随机字符串和签名
+生成规则:基于Secret使用SHA1算法生成,用于企业微信API验证
+⚠️ 注意:客服功能为系统必需功能,必须正确配置相关参数
+| 参数名称 | +获取方式 | +说明 | +
|---|---|---|
| 企业ID | +企业微信管理后台 → 我的企业 → 企业信息 → 企业ID | +企业唯一标识 | +
| 应用ID | +企业微信管理后台 → 应用管理 → 选择应用 → 查看应用详情 → AgentId | +应用的AgentId | +
| 应用Secret | +企业微信管理后台 → 应用管理 → 选择应用 → 查看Secret | +必需:用于生成签名的密钥 | +
| 客服ID | +企业微信管理后台 → 应用管理 → 客服 → 联系我 | +必需:客服功能的唯一标识 | +
| 活码链接 | +企业微信管理后台 → 客服 → 联系我 → 生成活码 | +必需:客服活码的完整链接 | +
| 时间戳 | +本系统自动生成 | +Unix时间戳,无需手动填写 | +
| 随机字符串 | +本系统自动生成 | +16位随机字符,无需手动填写 | +
| 签名 | +本系统自动生成 | +SHA1签名,无需手动填写 | +