diff --git a/.gitignore b/.gitignore index 64525bb95..fe8e1a311 100644 --- a/.gitignore +++ b/.gitignore @@ -19,3 +19,8 @@ /template/uni-app/node_modules/ /template/uni-app/unpackage/ /template/uni-app/.hbuilderx/ +/crmeb/.idea/ +/docker-compose/MacArm/mysql/data/ +/docker-compose/MacArm/mysql/log/ +/docker-compose/linux/mysql/data/ +/docker-compose/linux/mysql/log/ \ No newline at end of file diff --git a/README.md b/README.md index 3f7bca2fa..55e85f785 100644 --- a/README.md +++ b/README.md @@ -63,7 +63,7 @@ CRMEB开源商城Java版:https://gitee.com/ZhongBangKeJi/crmeb_java ### 🫧 系统亮点 ~~~ -1.前后端分离:后端TP6,管理端Element UI,移动端Uni-app; +1.前后端分离:后端TP6,管理端Element UI(支持多种风格和布局切换),移动端Uni-app; 2.代码规范:遵循PSR-2命名规范、Restful标准接口、代码严格分层、注释齐全、统一错误码; 3.权限管理:内置强大灵活的权限管理,可以控制到每一个菜单; 4.开发配置:低代码增加配置、系统组合数据模块; @@ -75,23 +75,10 @@ CRMEB开源商城Java版:https://gitee.com/ZhongBangKeJi/crmeb_java 10.二开效率:应用form-builder PHP可以快速生成表单; 11.快速上手:详细帮助文档、后台接口管理、后台数据库字典、系统文件管理备注、代码注释、一键安装; 12.系统安全:系统操作日志、系统生产日志、文件校验、数据备份; -13.高 性 能:支持Redis缓存、队列、长连接、多种云储存、支持集群部署。 - +13.高 性 能:支持Redis缓存、队列、长连接、多种云储存、支持集群部署; +14.多 语 言:支持自动识别浏览器多语言展示; +15.驱动扩展:支持多种支付方式、多种短信、多种云储存等; ~~~ ---- - -### 🖥 运行环境 - -``` -Nignx/Apache/IIS -PHP 7.1 ~ 7.4 -MySQL 5.7 ~ 8.0 -Redis -``` - - -> 温馨提示:虚拟空间不支持,推荐使用bt宝塔面板,服务器推荐京东云服务器:注册即享6.5折专属优惠,点我领取! - ### 📱 系统演示 @@ -111,17 +98,72 @@ APP下载:http://app.crmeb.cn/bzv (苹果手机直接在APP Store里搜索CR --- -### 🔐 安装教程 - -想要快速安装,教程来助攻!查看安装教程! - ---- - - - ### 📲 核心功能 - -![输入图片说明](readme/pic/功能列表.jpg) +系统功能 +~~~ +移动端支持DIY:22种组建; +多种风格和布局切换:8种风格4种布局; +多种语言配置:支持200多个国家语言; +多应用端展示:公众号端、H5端、小程序端、APP端、PC端(需要购买); +多种消息通知:公众号模版、小程序模版、短信、打印机、企业微信; +低代码:生成功能模块、增加系统配置、组合数据; +对外接口:包含用户、商品、订单等接口,方便其它系统对接; +多种云储存:阿里云、腾讯云、华为云、京东云、七牛云、天翼云; +~~~ +商城功能 +~~~ +多种支付方式:微信支付、支付宝支持、通联支付; +多种商品类型:标准商品、虚拟商品、卡密商品、优惠券商品; +多种营销功能:拼团、砍价、秒杀、抽奖、优惠券、积分、经验、分销、充值、签到、渠道码; +多种运费方式:快递、配送、自提、包邮、超强运费模版管理、多自提点; +~~~ +用户管理 +~~~ +用户等级:用户等级 经验升级 经验任务; +SVIP会员:付费会员 试用会员 实体会员卡 会员权益 +用户管理:用户类型 添加用户 用户标签/分组 用户操作 浏览记录 +登录方式:H5登录 微信快速登录 密码登录/注册 +微信端登录:微信授权登录 手机号快速登录 账号密码登录 +支持单点登录:快速接入第三方系统 +~~~ +微信小程序直播 +~~~ +直播间管理 主播管理 直播商品管理 +~~~ +CMS管理 +~~~ +文章内容 文章管理 文章分类 文章列表 +~~~ +客服系统 +~~~ +客服管理:客服添加 客服权限 关键字回复 +客服工作台:客服状态 发送信息 订单处理 商品记录 转接客服 客服常用语 客户信息管理 支持H5端和PC端 +客户端:支持平台用户H5端、PC端,支持广告配置 +~~~ +第三方设置 +~~~ +短信 +商品采集 +小票打印 +电子面单打印 +物流查询 +电子发票 +云存储 +~~~ +开发工具 +~~~ +数据库管理 +文件在线管理 +接口文档管理 +代码功能模块生成 +数据字典管理 +对外接口管理 +低代码事件 +低代码定时任务 +多语言一键配置 +数据维护 +安全维护 +~~~ --- @@ -135,48 +177,35 @@ APP下载:http://app.crmeb.cn/bzv (苹果手机直接在APP Store里搜索CR --- +### 🖥 运行环境 -### 📕 CRMEB公益 -做开源,帮助更多人!CRMEB开源项目,不仅让开发者从中受益,也在公益活动中帮助了很多人,对此,我们很荣幸,也乐此不疲! +``` +Nignx(推荐)/Apache/IIS +PHP 7.1 ~ 7.4 +MySQL 5.7 ~ 8.0 +Redis (可选) +``` -So~~想要用CRMEB开源商城系统做公益项目的朋友,可以来免费申请商业版系统哦!有需要的朋友,快去找官方客服咨询吧! -![输入图片说明](readme/pic/gongyi1.jpg) -![输入图片说明](readme/pic/gongyi2.jpg) +> 温馨提示:虚拟空间不支持,推荐使用bt宝塔面板,服务器推荐京东云服务器:注册即享6.5折专属优惠,点我领取! + +### 🔐 安装教程 + +想要快速安装,教程来助攻!查看安装教程! --- -[![输入图片说明](readme/pic/多商户.jpg)](https://www.crmeb.com/index/merchant) ---- + ### 📞 CRMEB互动 -#### CRMEB开源技术交流群 -#### 扫码进群可领取开源版接口文档、产品功能清单、高清UI设计图、思维脑图! +#### CRMEB开源技术交流群(扫码进群可领取开源版接口文档、产品功能清单、高清UI设计图、思维脑图!) ![输入图片说明](readme/pic/开源群.jpg) #### 技术社区!找方法、提bug、看官方消息、拿活跃大奖!都在 CRMEB 技术社区 应有尽有 --- -### 📻 感谢参与开发者 -#### 感谢大神们提交代码(排名不分先后) -@yizhisamoye,@bys1123,@xaboy,@youngxj0,@jacklincheung,@392256866,@sxsea - 欢迎反馈问题 欢迎提交代码 ---- -### 📸 特别鸣谢 -排名不分先后,感谢这些软件的开发者:thinkphp、iview、vue、mysql、redis、uniapp、echarts、tree-table-vue、swiper、form-create等,如有遗漏请联系我! - ---- -### 🎬 核心开发团队 -产品:木子刀客 - -技术:聆听、等风来、xaboy、吴汐、最后一片叶、旺仔、小小、娜娜、归来仍是少年 - -UI:xy-yyds、LXT - -测试:夏天、绵绵羊、。ws、半山 - --- ### 📺 版权须知 @@ -206,7 +235,11 @@ All rights reserved。 CRMEB® 商标和著作权所有者为西安众邦网络科技有限公司。 +--- +### 📕 CRMEB多商户 + +[![输入图片说明](readme/pic/多商户.jpg)](https://www.crmeb.com/index/merchant) --- diff --git a/crmeb/baota.sh b/crmeb/baota.sh new file mode 100644 index 000000000..ec362cd7c --- /dev/null +++ b/crmeb/baota.sh @@ -0,0 +1,322 @@ +#!/bin/bash +PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin +export PATH + +php_version='74' +mysql_version='5.7' +redis_version='6.2' +action_type='install' +root_path=$(cat /var/bt_setupPath.conf) +setup_path=$root_path/server + +#宝塔是否已安装 +if [ -z "$root_path" ]; then + echo "请先安装宝塔" + exit 1 +fi + +#nginx是否已安装 +if [ ! -f "${setup_path}/nginx/sbin/nginx" ]; then + echo "请先安装nginx并配置网站" + exit 1 +fi + +#安装php +php_install=1 +#php路径变量 +php_path="${setup_path}/php/74/bin/php" +# 获取已安装的php版本 +for phpVer in 71 72 73 74; do + if [ -d "${setup_path}/php/${phpVer}/bin" ]; then + php_version=${phpVer} + php_install=0 + fi +done +if [ $php_install == 1 ]; then +. ${setup_path}/panel/install/install_soft.sh 1 $action_type php $php_version +fi +case "${php_version}" in + '71') + extFile="${setup_path}/php/71/lib/php/extensions/no-debug-non-zts-20160303" + php_path="${setup_path}/php/71/bin/php" + ;; + '72') + extFile="${setup_path}/php/72/lib/php/extensions/no-debug-non-zts-20170718" + php_path="${setup_path}/php/72/bin/php" + ;; + '73') + extFile="${setup_path}/php/73/lib/php/extensions/no-debug-non-zts-20180731" + php_path="${setup_path}/php/73/bin/php" + ;; + '74') + extFile="${setup_path}/php/74/lib/php/extensions/no-debug-non-zts-20190902" + php_path="${setup_path}/php/74/bin/php" + ;; +esac + +echo "PHP $php_version 安装成功" +echo '---------------------------------' + +#安装mysql +if [ ! -d "${setup_path}/mysql" ]; then +. ${setup_path}/panel/install/install_soft.sh 1 $action_type mysql $mysql_version +fi + +echo "mysql $mysql_version 安装成功" +echo '---------------------------------' + +#安装redis +if [ ! -d "${setup_path}/redis" ]; then +. ${setup_path}/panel/install/install_soft.sh 0 $action_type redis $redis_version +fi + +echo "redis $redis_version 安装成功" +echo '---------------------------------' + +#安装php-redis 插件 +if [ ! -e "${extFile}/redis.so" ]; then +. ${setup_path}/panel/install/install_soft.sh 1 $action_type redis $php_version +fi +echo 'php-redis 插件安装成功' +echo '---------------------------------' + +#安装php-fileinfo 插件 +if [ ! -e "${extFile}/fileinfo.so" ]; then +. ${setup_path}/panel/install/install_soft.sh 1 $action_type fileinfo $php_version +fi + +echo 'php-fileinfo 插件安装成功' +echo '---------------------------------' + + +#安装php-swoole 插件 +# if [ ! -e "${extFile}/swoole.so" ]; then +# . ${setup_path}/panel/install/install_soft.sh 1 $action_type swoole4 $php_version +# fi + + + +# 定义函数,用于检查并修改php.ini中的disable_functions配置 +function modify_disable_functions { + local setup_path="$1" + local php_version="$2" + local functions_to_check=("proc_open" "pcntl_signal" "pcntl_signal_dispatch" "pcntl_fork" "pcntl_wait" "pcntl_alarm") + local ini_file="${setup_path}/php/${php_version}/etc/php.ini" + + # 检查文件是否存在 + if [ ! -f "$ini_file" ]; then + echo "Error: PHP configuration file not found at $ini_file" + return 1 + fi + + # 遍历函数列表,检查并修改disable_functions配置 + for func in "${functions_to_check[@]}"; do + # 检查函数是否已经在disable_functions列表中 + if grep -q "disable_functions.*$func" "$ini_file"; then + echo "Info: $func is already disabled in $ini_file, removing..." + + # 使用sed命令精确地删除函数及其周围的逗号和空格 + # 注意:这里假设函数周围总是存在逗号和空格,这可能需要根据实际情况调整 + sed -i "s/, \+$func,/,/g" "$ini_file" + + # 检查命令是否成功执行 + if [ $? -eq 0 ]; then + echo "Info: Successfully removed $func from $ini_file" + else + echo "Error: Failed to remove $func from $ini_file" + return 1 + fi + else + echo "Info: $func is not disabled in $ini_file, skipping..." + fi + done + + return 0 +} + +# 调用函数,传入正确的参数 +modify_disable_functions "${setup_path}" "$php_version" +#pcntl_signal pcntl_signal_dispatch pcntl_fork pcntl_wait pcntl_alarm 禁用函数删除 +#sed -i 's/,proc_open//' ${setup_path}/php/$php_version/etc/php.ini +# 注意:请根据实际的PHP版本和安装路径调整参数 + +echo '修改mysql sql_mode配置' +echo '---------------------------------' +#修改mysql配置 +# MySQL配置文件路径 +CONFIG_FILE="/etc/my.cnf" + +# 检查配置文件是否存在 +if [ ! -f "$CONFIG_FILE" ]; then + echo "MySQL配置文件 $CONFIG_FILE 不存在,请检查路径" + exit 1 +fi +# 首先检查是否存在 [mysqld] 段落 +if ! grep -q "\[mysqld\]" "$CONFIG_FILE"; then + echo "\[mysqld\]" >> "$CONFIG_FILE" +fi + +# 备份原配置文件(可选) +cp "$CONFIG_FILE" "${CONFIG_FILE}.bak" +echo "MySQL配置文件已备份至 ${CONFIG_FILE}.bak" + +# 使用grep检查sql_mode是否存在,如果存在,则替换其值 +if grep -q "^[[:space:]]*sql_mode[[:space:]]*=" "$CONFIG_FILE"; then + # 如果存在,修改 sql_mode 的值 + sed -i 's/^ *sql_mode *=.*$/sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION/' "$CONFIG_FILE" +fi + +# 使用grep检查sql-mode是否存在 +if grep -q "^[[:space:]]*sql-mode[[:space:]]*=" "$CONFIG_FILE"; then + # 如果存在,修改 sql-mode 的值 + sed -i 's/^ *sql-mode *=.*$/sql-mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION/' "$CONFIG_FILE" +fi +# 使用grep -E支持扩展正则表达式,同时匹配sql_mode和sql-mode,如果行不存在,则在[mysqld]段末尾添加新的sql_mode设置 +if ! grep -qE "^[[:space:]]*(sql_mode|sql-mode)[[:space:]]*=" "$CONFIG_FILE"; then + sed -i '/\[mysqld\]/a\sql_mode=NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION' "$CONFIG_FILE" +fi + + +# 检查并显示修改后的配置文件中关于sql_mode的部分 +grep 'sql-mode' "$CONFIG_FILE" +grep 'sql_mode' "$CONFIG_FILE" + +# 重启mysql +echo "MySQL配置文件已更新,正在重载MySQL配置..." +/etc/init.d/mysqld reload +echo "如果没生效请重启MySQL服务。" +echo "--------------------------------------" + +#修改nginx配置 +project_path=$(cd `dirname $0`; pwd) +project_name="${project_path##*/}" +domain="${project_name//_/.}" +if [ -e "${setup_path}/panel/vhost/nginx/${domain}.conf" ]; then +echo -e " +server +{ + listen 80; + server_name ${domain}; + index index.php index.html index.htm default.php default.htm default.html; + root /www/wwwroot/${project_name}/public; + + #SSL-START SSL相关配置,请勿删除或修改下一行带注释的404规则 + #error_page 404/404.html; + #SSL-END + + #ERROR-PAGE-START 错误页配置,可以注释、删除或修改 + #error_page 404 /404.html; + #error_page 502 /502.html; + #ERROR-PAGE-END + + #PHP-INFO-START PHP引用配置,可以注释或修改 + #清理缓存规则 + + location ~ /purge(/.*) { + proxy_cache_purge cache_one \$host\$1\$is_args\$args; + } + #引用反向代理规则,注释后配置的反向代理将无效 + location /notice { + proxy_pass http://127.0.0.1:40001/; + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-real-ip \$remote_addr; + proxy_set_header X-Forwarded-For \$remote_addr; + } + #提示:v4.3.0 以前版本,可不用配置一下代码 + location /msg { + proxy_pass http://127.0.0.1:40002/; + proxy_http_version 1.1; + proxy_set_header Upgrade \$http_upgrade; + proxy_set_header Connection "upgrade"; + proxy_set_header X-real-ip \$remote_addr; + proxy_set_header X-Forwarded-For \$remote_addr; + } + + include enable-php-$php_version.conf; + #PHP-INFO-END + + #REWRITE-START URL重写规则引用,修改后将导致面板设置的伪静态规则失效 + include ${setup_path}/panel/vhost/rewrite/${domain}.conf; + #REWRITE-END + + #禁止访问的文件或目录 + location ~ ^/(\.user.ini|\.htaccess|\.git|\.svn|\.project|LICENSE|README.md) + { + return 404; + } + + #一键申请SSL证书验证目录相关设置 + location ~ \.well-known{ + allow all; + } + + access_log /www/wwwlogs/${domain}.log; + error_log /www/wwwlogs/${domain}.error.log; +} +" > ${setup_path}/panel/vhost/nginx/${domain}.conf +fi +echo 'nginx配置成功' +echo '---------------------------------' + +# 伪静态配置 +if [ -e "${setup_path}/panel/vhost/rewrite/${domain}.conf" ]; then +echo -e " +location / { + if (!-e \$request_filename) { + rewrite ^(.*)$ /index.php?s=/\$1 last; + break; + } +} +" > ${setup_path}/panel/vhost/rewrite/${domain}.conf +fi +echo '伪静态配置成功' +echo '---------------------------------' + +echo '重载nginx配置' +/etc/init.d/nginx reload +echo '---------------------------------' + +#获取域名列表 + +# config_file=${setup_path}/panel/vhost/nginx/${domain}.conf +# #获取域名列表 +# domain_list=$(cat $config_file|grep server_name|head -n 1|sed "s/server_name//"|sed "s/;//"|xargs) +# #获取PHP版本 +# php_version=$(cat $config_file|grep 'enable-php'|grep -Eo "[0-9]+"|head -n 1) +# echo $php_version + + + +echo '系统环境安装成功!' +echo '===============================================' +# 设置目录权限 +echo '---------------------------------' +echo "设置目录权限" +chmod -R 777 runtime +chmod -R 777 .version +chmod -R 777 .env +chmod -R 777 .constant +chmod -R 777 backup +chmod -R 777 public + + +echo '正在启动系统定时任务、长连接、队列' +# 启动定时任务 +echo '---------------------------------' +echo "启动定时任务:$php_path think timer start --d" +$php_path think timer start --d + +# 启动长连接 +echo '---------------------------------' +echo "启动长连接:$php_path think workerman start --d" +$php_path think workerman start --d + +# 启动队列 +echo '---------------------------------' +echo "启动队列:$php_path think queue:listen --queue" +$php_path think queue:listen --queue + + +# 操作说明,进入程序根目录运行 /bin/bash baota.sh diff --git a/crmeb/public/install/index.php b/crmeb/public/install/index.php index 621805cd5..93b5fe3fb 100755 --- a/crmeb/public/install/index.php +++ b/crmeb/public/install/index.php @@ -302,7 +302,7 @@ switch ($step) { $sql = trim($sqlFormat[$i]); if (strstr($sql, 'CREATE TABLE')) { preg_match('/CREATE TABLE (IF NOT EXISTS)? `eb_([^ ]*)`/is', $sql, $matches); - mysqli_query($conn, "DROP TABLE IF EXISTS `$matches[2]"); + mysqli_query($conn, "DROP TABLE IF EXISTS `$matches[2]`"); $sql = str_replace('`eb_', '`' . $dbPrefix, $sql);//替换表前缀 $ret = mysqli_query($conn, $sql); if ($ret) { diff --git a/docker-compose/linux/docker-compose.yml b/docker-compose/linux/docker-compose.yml index 7222015e0..9433b7371 100644 --- a/docker-compose/linux/docker-compose.yml +++ b/docker-compose/linux/docker-compose.yml @@ -4,24 +4,24 @@ services: mysql: container_name: crmeb_mysql #指定容器名 image: mysql:5.7 #一般电脑可以用这个镜像 + platform: linux/x86_64 ports: - 3336:3306 # 环境变量 environment: TZ: Asia/Shanghai - MYSQL_ROOT_PASSWORD: '123456' - MYSQL_USER: 'crmeb' - MYSQL_PASS: '123456' - MYSQL_DATABASE: 'crmeb' + MYSQL_ROOT_PASSWORD: "123456" + MYSQL_USER: "crmeb" + MYSQL_PASS: "123456" + MYSQL_DATABASE: "crmeb" privileged: true - command: - --character-set-server=utf8mb4 - --collation-server=utf8mb4_general_ci - --explicit_defaults_for_timestamp=true - --lower_case_table_names=1 - --max_allowed_packet=128M - --default-authentication-plugin=mysql_native_password - --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" + command: --character-set-server=utf8mb4 + --collation-server=utf8mb4_general_ci + --explicit_defaults_for_timestamp=true + --lower_case_table_names=1 + --max_allowed_packet=128M + --default-authentication-plugin=mysql_native_password + --sql-mode="NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION" working_dir: /var/lib/mysql volumes: - ./mysql/my.cnf:/etc/mysql/my.cnf @@ -34,7 +34,7 @@ services: # redis 容器 redis: container_name: crmeb_redis - image: 'redis:alpine' + image: "redis:alpine" # image: daocloud.io/library/redis:6.0.5-alpine # image: redis:5.0 ports: @@ -71,11 +71,10 @@ services: networks: app_net: ipv4_address: 192.168.10.90 -# command: /bin/bash -c "php -v" # nginx 容器 nginx: container_name: crmeb_nginx - image: 'nginx:alpine' + image: "nginx:alpine" # image: daocloud.io/library/nginx:1.19.1-alpine restart: always ports: diff --git a/readme/pic/gongyi1.jpg b/readme/pic/gongyi1.jpg deleted file mode 100644 index 3d0a73542..000000000 Binary files a/readme/pic/gongyi1.jpg and /dev/null differ diff --git a/readme/pic/gongyi2.jpg b/readme/pic/gongyi2.jpg deleted file mode 100644 index a3196e7ab..000000000 Binary files a/readme/pic/gongyi2.jpg and /dev/null differ diff --git a/template/uni-app/utils/util.js b/template/uni-app/utils/util.js index efd2bc073..bfdb8d32e 100644 --- a/template/uni-app/utils/util.js +++ b/template/uni-app/utils/util.js @@ -613,6 +613,11 @@ export default { } }) + }, + fail: function(res) { + that.Tips({ + title: res.errMsg + }); } })