# daxiong-system **Repository Path**: Eachone/daxiong-system ## Basic Information - **Project Name**: daxiong-system - **Description**: 大熊座中后台管理系统,基于PHP框架EasySwoole,前端使用ElementUI plus 、移动端使用uniapp vue3 进行开发。预期想打造一款极易上手的基础后台管理系统,提供必要的基础后台管理功能和良好可扩展性。理论上支持所有的web 应用程序。 - **Primary Language**: PHP - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 3 - **Created**: 2025-06-20 - **Last Updated**: 2025-06-20 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README ## 目录结构 ├── App │   ├── Config 项目配置文件 ├   │── Crontab 定时任务 │   │ └── Job 定时业务集合 │   ├── Exception 自定义异常处理 │   ├── HttpController │   ├── Lib Lib │   ├── Logic 逻辑层 │   ├── Robot 机器人 │   ├── Model 模型层 │   ├── Process 自定义进程 │   ├── Queue 消息队列 │   │ └── Job 消息队列业务集合 │   ├── Service 服务层 │   ├── Task 异步任务 │   ├── Utility 工具集 │   └── Validate 验证类 ├── EasySwooleEvent.php ├── Readme.md ├── Sql ├── bootstrap.php ├── composer.json ├── composer.lock ├── dev.php ├── easyswoole ├── index.html ├── produce.php └── vendor ## 代码相关说明 ### 1.签名认证说明 > 前端按照请求的参数拼接字符串 每个接口都必须通过签名认证才能正常使用 请按照下边的流程进行签名加密 #### 1 签名串格式说明 > 签名字符串传格式如下 请按照以下格式进行拼装 ```http request "app_secret="+app_secret+"&"+query+"&"+body+"×tamp="+timestamp ``` | 参数名称 | 参数说明 | | -------- | :---- | | app_secret | 应用密钥 由后端提供 例子:dfgAiNQJdjnLimUzVXEtnDJrtFSkKCZx | | query | get请求参数 例子:page=1&pageSize=1 请按照'&'进行变量的拼装 | | body | post请求参数 例子:page=1&pageSize=1 请按照'&'进行变量的拼装 如果是json模式用json的加密串代替 | | timestamp | 当前请求的时间戳 请获取当前的 过期的时间戳 请求不会通过 从1970年1月1日(UTC/GMT的午夜)开始所经过的秒数 例子:1642837463 | #### 2 签名串加密说明 > 签名加密的规则 js代码如下: ```javascript // md5加密并且加密串大写 var sign = CryptoJS.MD5(string).toString().toUpperCase() // 对md5字符串进行hash256的加密 sign = CryptoJS.HmacSHA256(sign, app_secret).toString(); ``` #### 3 json字符串加密 > json字符串加密的规则 将json对象转化为字符串后 对字符串进行des-ecb加密 同时进行base64编码 js代码如下: > ```javascript // 转化为json字符串 var bodyString = JSON.stringify({ "page": 1, "pageSize": 9, "id2": 'sdasdasdasd1111', "id": 1 }); // des加密json var keyHex = CryptoJS.enc.Utf8.parse(app_secret); var encrypted = CryptoJS.DES.encrypt(bodyString, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); var body_encrypt = encrypted.ciphertext.toString(CryptoJS.enc.Base64); ``` #### 4 测试例子代码(postman中可以使用) #### 1 GET测试代码 ```javascript // GET测试 var timestamp = Math.round(new Date().getTime() / 1000); var app_secret = "dfgAiNQJdjnLimUzVXEtnDJrtFSkKCZx"; // 和postman query顺序参数对应 var query = "page=1&pageSize=1"; // 和postman form-data参数对应 var body = ""; var string = "app_secret=" + app_secret + "&" + query + "&" + body + "×tamp=" + timestamp var sign = CryptoJS.MD5(string).toString().toUpperCase() sign = CryptoJS.HmacSHA256(sign, app_secret).toString(); // 写入postman定义参数 pm.variables.set('sign', sign); ``` #### 2 POST测试代码 ```javascript // POST测试 var timestamp = Math.round(new Date().getTime() / 1000); var app_secret = "dfgAiNQJdjnLimUzVXEtnDJrtFSkKCZx"; // 和postman query顺序参数对应 var query = "page=1&pageSize=1"; // 和postman form-data参数对应 var body = "p=1&a=1"; var string = "app_secret=" + app_secret + "&" + query + "&" + body + "×tamp=" + timestamp var sign = CryptoJS.MD5(string).toString().toUpperCase() sign = CryptoJS.HmacSHA256(sign, app_secret).toString(); // 写入postman定义参数 pm.variables.set('sign', sign); ``` #### 3 Json测试代码 ```javascript // JSON测试 请将{{body_encrypt}}变量放入到postman中的body的raw选项中的json中 var timestamp = Math.round(new Date().getTime() / 1000); var app_secret = "dfgAiNQJdjnLimUzVXEtnDJrtFSkKCZx"; // 和postman query顺序参数对应 var query = "page=1&data=1"; // 转化为json字符串 var bodyString = JSON.stringify({ "page": 1, "pageSize": 9, "id2": 'sdasdasdasd1111', "id": 1 }); // des加密json var keyHex = CryptoJS.enc.Utf8.parse(app_secret); var encrypted = CryptoJS.DES.encrypt(bodyString, keyHex, { mode: CryptoJS.mode.ECB, padding: CryptoJS.pad.Pkcs7 }); var body_encrypt = encrypted.ciphertext.toString(CryptoJS.enc.Base64); pm.variables.set('body_encrypt', body_encrypt); // 签名加密 var string = "app_secret=" + app_secret + "&" + query + "&" + body_encrypt + "×tamp=" + timestamp var sign = CryptoJS.MD5(string).toString().toUpperCase() sign = CryptoJS.HmacSHA256(sign, app_secret).toString(); pm.variables.set('sign', sign); ``` ``` CREATE TABLE `sys_platform_account` ( `id` int(11) NOT NULL COMMENT 'ID', `platform` char(50) NOT NULL COMMENT '所属平台,参考字典platform_type', `account` char(100) NOT NULL COMMENT '账号或APPID,第三方平台唯一标识', `config` text NOT NULL COMMENT '平台配置', `store_id` int(11) NOT NULL COMMENT '租户ID', `create_time` datetime NOT NULL COMMENT '创建时间', `update_time` datetime NOT NULL COMMENT '更新时间', `create_by` int(11) NOT NULL COMMENT '创建者', `update_by` int(11) NOT NULL COMMENT '更新者', `status` tinyint(1) NOT NULL COMMENT '状态', `del_flag` tinyint(1) NOT NULL COMMENT '是有启用' ) ENGINE=InnoDB DEFAULT CHARSET=utf8 COMMENT='平台配置表'; -- -- 转储表的索引 -- -- -- 表的索引 `sys_platform_account` -- ALTER TABLE `sys_platform_account` ADD PRIMARY KEY (`id`), ADD KEY `store_id` (`store_id`), ADD KEY `platform` (`platform`); -- -- 在导出的表使用AUTO_INCREMENT -- -- -- 使用表AUTO_INCREMENT `sys_platform_account` -- ALTER TABLE `sys_platform_account` MODIFY `id` int(11) NOT NULL AUTO_INCREMENT COMMENT 'ID'; COMMIT; ``` ##Nginx配置 ```text location / { proxy_http_version 1.1; proxy_set_header Connection "keep-alive"; proxy_set_header X-Real-IP $remote_addr; //开启websocket proxy_set_header Upgrade $http_upgrade; proxy_set_header Connection "upgrade"; if (!-f $request_filename) { proxy_pass http://127.0.0.1:9502; } } ``` ##参考项目 微信、钉钉通知 https://github.com/wonder-game/es-notify 全局 https://github.com/wonder-game/es-utility ###手动安装xlswriter ```text wget https://pecl.php.net/get/xlswriter-1.5.5.tgz tar -zxvf xlswriter-1.5.5.tgz cd xlswriter-1.5.5/ /www/server/php/74/bin/phpize ./configure --with-php-config=/www/server/php/74/bin/php-config make && make install echo "extension = xlswriter.so" >> /www/server/php/74/etc/php.ini /etc/init.d/php-fpm-74 reload /www/server/php/74/bin/php -m|grep -i xlswriter ``` ### 安装ImageMagick ```text 图片压缩依赖扩展 ``` ##建设银行聚合支付 ```text 启用验证签名服务 nohup java -jar ccbnetpaysign.jar SERVLET:55533 >Ccbnetpaysign.log 2>&1 & ``` ##建行支付退款服务 ```text ssh root@125.124.34.33 ``` ### 推广码参数顺序约定 约定加密位数为 16 位 ```text 1、推广关联场景值 默认位 0 2、推广人员 ID 默认为 0 3、推广商户 ID 默认为 0 4、推广活动 ID 默认为 0 5、推荐加入会员组 ID 默认为 0 ``` ### 线下优惠码、核销码生成约定 ```text 1、优惠券ID coupon_id 2、会员ID member_id 3、关联商户 link_store 4 、码类型 1 优惠券 2 核销码 ``` ### 价格策略用户链解析规则 ```text 价格策略用户链用户确定用户适用产品价格策略 1、对于后端管理平台,策略用户链为:当前人员归属店铺; 2、对于api接口: - 当前人员是店铺管理员时策略用户链为:人员归属店铺->当前人员 - 当前人员非管理员,用户24小时内扫过分销员二维码,策略用户链为:分销员->当前人员 ``` ### 价格策略确认规则 ```text 便利策略用户链,按如下顺序查找产品价格,找到为止: 1、当前策略用户专属价格 2、当前策略用户分组专属价格 3、产品默认价格 ``` ### 分佣用户判断规则 ```text 1、二级分佣用户: - 当前用户是分销员时为当前用户 - 当前用户非分销员时,如24小时内扫过分销员二维码,24小时内最新被扫码分销员为二级分佣用户 2、一级分佣用户: 二级分佣用户的推广分销员; 3、二级分销时如上,一级分销时只进行步骤1; ``` ### 分佣佣金预生成规则 ```text 1、交易已支付待使用时,按价格策略中佣金规则及分佣用户进行佣金预生成 2、用户佣金金额大于订单实收金额时,用户佣金修正为0 3、总佣金大于订单实收金额时,分佣用户佣金修正为0 ``` ### 微信佣金提现规则 ```text 1、提现流程: 首先尝试提现,提现成功则剩余转余额,提现失败则全部转余额 2、规则: 当前人员尝试微信提现金额=人员佣金金额/总佣金金额*微信可提现金额 微信提现额度按30%计算 3、例如: 订单金额100,一级佣金金额8,二级佣金金额42,总佣金50,微信可提现30; 一级提现8/50*30 剩余转余额 二级提现 42/50*30 剩余转余额 ```