mirror of
https://github.com/crmeb/CRMEB.git
synced 2026-01-24 11:48:13 +00:00
update
This commit is contained in:
parent
a01bf0807a
commit
a24a96ab34
54
README.md
54
README.md
@ -5,10 +5,26 @@
|
||||
|
||||
<div align="center" style="font-size: 15px;">
|
||||
|
||||
CRMEB开源商城系统(PHP版)
|
||||
CRMEB高品质开源商城系统(PHP版)
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
<div align="center" >
|
||||
<a href='https://gitee.com/ZhongBangKeJi/CRMEB/stargazers'>
|
||||
<img src='https://gitee.com/ZhongBangKeJi/CRMEB/badge/star.svg?theme=gvp' alt='star'></img>
|
||||
</a>
|
||||
<a href="http://www.crmeb.com/?from=giteephp">
|
||||
<img src="https://img.shields.io/badge/Licence-apache2.0-green.svg?style=flat" />
|
||||
</a>
|
||||
<a href="http://www.crmeb.com">
|
||||
<img src="https://img.shields.io/badge/Edition-5.6.4-blue.svg" />
|
||||
</a>
|
||||
<a href="https://gitee.com/ZhongBangKeJi/CRMEB/repository/archive/master.zip">
|
||||
<img src="https://img.shields.io/badge/Download-240m-red.svg" />
|
||||
</a>
|
||||
|
||||
</div>
|
||||
|
||||
<div align="center" style="font-size: 15px;">
|
||||
用心做开源,我们也很需要你的鼓励!右上角Star🌟,等你点亮
|
||||
</div>
|
||||
@ -16,17 +32,20 @@ CRMEB开源商城系统(PHP版)
|
||||
|
||||
####
|
||||
|
||||
<div align="center">
|
||||
|
||||
[](https://zread.ai/crmeb/CRMEB)
|
||||
|
||||
</div>
|
||||
|
||||
<div align="center">
|
||||
|
||||
|
||||
[官网](https://www.crmeb.com/) |
|
||||
[在线体验](http://v4.crmeb.net/admin/) |
|
||||
[官网](https://www.crmeb.com/?from=giteephp) |
|
||||
[在线体验](http://v5.crmeb.net/admin/) |
|
||||
[帮助文档](https://doc.crmeb.com/single_open) |
|
||||
[应用市场](https://www.crmeb.com/market/) |
|
||||
[技术社区](https://www.crmeb.com/ask/thread/list/147)
|
||||
|
||||
|
||||
[应用市场](https://www.crmeb.com/market?from=giteephp) |
|
||||
[技术社区](https://www.crmeb.com/ask/thread/list/147) |
|
||||
[宽屏预览](https://gitee.com/ZhongBangKeJi/CRMEB/blob/master/README.md)
|
||||
|
||||
|
||||
</div>
|
||||
@ -60,7 +79,7 @@ CRMEB开源商城系统代码100%开源,基于 **Apache-2.0协议** 免费商
|
||||
我们致力于打造开发者友好生态,开放源码、持续更新功能模块,并欢迎开发者提交优化建议或贡献代码。通过共享技术成果,降低行业重复造轮子成本,推动开源电商系统的可持续发展。
|
||||
|
||||
|
||||
🔗 <a href="https://doc.crmeb.com/single_open/open_v54/19855" target="_blank">功能列表</a> | 📩 <a href="https://github.com/crmeb/CRMEB/issues" target="_blank">提交反馈</a> | 📩 <a href="https://github.com/crmeb/CRMEB/pulls" target="_blank">提交代码</a>
|
||||
🔗 <a href="https://doc.crmeb.com/single_open/open_v54/19855" target="_blank">功能列表</a> | 📩 <a href="https://gitee.com/ZhongBangKeJi/CRMEB/issues" target="_blank">提交反馈</a> | 📩 <a href="https://gitee.com/ZhongBangKeJi/CRMEB/pulls" target="_blank">提交代码</a>
|
||||
|
||||
|
||||
|
||||
@ -117,7 +136,7 @@ CRMEB开源商城系统代码100%开源,基于 **Apache-2.0协议** 免费商
|
||||
|
||||
### 📱 系统演示
|
||||
|
||||

|
||||

|
||||
|
||||
管理后台: http://v5.crmeb.net/admin
|
||||
|
||||
@ -254,9 +273,9 @@ docker-compose一键部署:https://doc.crmeb.com/single_open/open_v54/20145
|
||||
---
|
||||
|
||||
### 📞 CRMEB互动
|
||||
#### CRMEB开源技术交流群(扫码进群可领取开源版接口文档、产品功能清单、高清UI设计图、思维脑图!)
|
||||

|
||||
#### 技术社区!找方法、提bug、看官方消息、拿活跃大奖!都在 <a href="https://www.crmeb.com/ask" target="_blank">CRMEB 技术社区</a> 应有尽有
|
||||
#### CRMEB开源技术交流群(扫码进群可领取开源版接口文档、产品功能清单、思维脑图!)
|
||||

|
||||
#### 技术社区!找方法、提bug、看官方消息、拿活跃大奖!都在 <a href="https://www.crmeb.com/ask/?from=giteephp" target="_blank">CRMEB 技术社区</a> 应有尽有
|
||||
|
||||
|
||||
|
||||
@ -265,12 +284,15 @@ docker-compose一键部署:https://doc.crmeb.com/single_open/open_v54/20145
|
||||
|
||||
### 📕 CRMEB PRO版
|
||||
|
||||
[](https://www.crmeb.com/index/pro)
|
||||
[](https://www.crmeb.com/index/pro?from=giteephp)
|
||||
|
||||
|
||||
|
||||
### 📕 CRMEB 多商户版
|
||||
|
||||
[](https://www.crmeb.com/index/merchant)
|
||||
[](https://www.crmeb.com/index/merchant?from=giteephp)
|
||||
|
||||
---
|
||||
|
||||
[返回顶部 :fa-arrow-circle-up: ](https://gitee.com/ZhongBangKeJi/CRMEB#%E9%A1%B9%E7%9B%AE%E4%BB%8B%E7%BB%8D)
|
||||
|
||||
|
||||
@ -1,4 +1,4 @@
|
||||
version=CRMEB-KY v5.6.3
|
||||
version=CRMEB-KY v5.6.3.1
|
||||
version_code=563
|
||||
platform=github
|
||||
app_id=ze7x9rxsv09l6pvsyo
|
||||
|
||||
@ -127,18 +127,51 @@ class PublicController
|
||||
];
|
||||
if (function_exists('exec')) {
|
||||
$workermanOutput = $timerOutput = $queueOutput = [];
|
||||
exec("ps aux | grep 'php think workerman' | grep -v grep", $workermanOutput);
|
||||
exec("ps aux | grep 'php think timer' | grep -v grep", $timerOutput);
|
||||
exec("ps aux | grep 'php think queue' | grep -v grep", $queueOutput);
|
||||
// exec("ps aux | grep 'php think workerman' | grep -v grep", $workermanOutput);
|
||||
$targetPort = config('workerman.chat.port');
|
||||
$thinkPath = root_path(); // think 文件的绝对路径
|
||||
$checkService = function($service) {
|
||||
if($service === 'queue'){
|
||||
$command = 'queue:listen';
|
||||
// 执行 ps 命令查找队列进程
|
||||
exec("ps aux | grep '{$command}' | grep -v grep", $output);
|
||||
|
||||
// 若输出不为空,说明进程存在
|
||||
return !empty($output);
|
||||
} else {
|
||||
$pidFile = root_path('runtime') . $service . '.pid';
|
||||
// 优先检查PID文件
|
||||
if (!file_exists($pidFile)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
// 如果PID文件存在,尝试获取进程状态
|
||||
$pid = trim(file_get_contents($pidFile));
|
||||
if ($pid && is_numeric($pid)) {
|
||||
if (function_exists('posix_kill') && posix_kill($pid, 0)) {
|
||||
return true;
|
||||
}
|
||||
// 备用检查方法
|
||||
if (function_exists('exec')) {
|
||||
$output = [];
|
||||
exec("ps -ef | grep " . escapeshellarg($pid) . " | grep -v grep", $output);
|
||||
// 判断是否有非 grep 进程的输出
|
||||
return !empty($output);
|
||||
}
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
$info['process'] = [
|
||||
['name' => '长链接', 'require' => '开启', 'value' => count($workermanOutput) > 0],
|
||||
['name' => '定时任务', 'require' => '开启', 'value' => count($timerOutput) > 0],
|
||||
['name' => '消息队列', 'require' => '开启', 'value' => count($queueOutput) > 0],
|
||||
['name' => '长链接', 'require' => '开启', 'value' => $checkService('workerman')],
|
||||
['name' => '定时任务', 'require' => '开启', 'value' => $checkService('timer')],
|
||||
['name' => '消息队列', 'require' => '开启', 'value' => $checkService('queue')],
|
||||
];
|
||||
|
||||
} else {
|
||||
$info['process'] = [
|
||||
['name' => '长链接', 'require' => '开启', 'value' => file_exists(root_path('runtime') . 'workerman.pid')],
|
||||
['name' => '定时任务', 'require' => '开启', 'value' => file_exists(root_path('runtime') . '.timer')],
|
||||
['name' => '定时任务', 'require' => '开启', 'value' => file_exists(root_path('runtime') . 'timer.pid')],
|
||||
['name' => '消息队列', 'require' => '开启', 'value' => file_exists(root_path('runtime') . '.queue')],
|
||||
];
|
||||
}
|
||||
|
||||
@ -538,9 +538,9 @@ class SystemCrud extends AuthController
|
||||
if (!$tableName) {
|
||||
return app('json')->fail('缺少表名');
|
||||
}
|
||||
// if (in_array($tableName, SystemCrudServices::NOT_CRUD_TABANAME)) {
|
||||
// return app('json')->fail('不允许查看当前表明细');
|
||||
// }
|
||||
if (in_array($tableName, SystemCrudServices::NOT_CRUD_TABANAME)) {
|
||||
return app('json')->fail('不允许查看当前表明细');
|
||||
}
|
||||
$tableInfo = $this->services->getColumnNamesList($tableName);
|
||||
|
||||
$data = [];
|
||||
|
||||
@ -68,6 +68,12 @@ class FlowStatistic extends AuthController
|
||||
['type', 'day'],
|
||||
['time', '']
|
||||
]);
|
||||
|
||||
// 当$where['time']不为空,且格式不是2025/12/01-2025/12/15时,重置$where['time']为空
|
||||
if ($where['time'] != '' && !preg_match('/^\d{4}\/\d{2}\/\d{2}-\d{4}\/\d{2}\/\d{2}$/', $where['time'])) {
|
||||
$where['time'] = '';
|
||||
}
|
||||
|
||||
$data = $this->services->getFlowRecord($where);
|
||||
return app('json')->success($data);
|
||||
}
|
||||
|
||||
@ -75,7 +75,19 @@ class SystemDatabackup extends AuthController
|
||||
if ($is_field == 0) {
|
||||
$sql = "ALTER TABLE $table COMMENT '$mark'";
|
||||
} else {
|
||||
$sql = "ALTER TABLE $table MODIFY COLUMN $field $type COMMENT '$mark'";
|
||||
$fieldInfo = Db::query("SHOW FULL COLUMNS FROM `{$table}` WHERE Field = '{$field}'");
|
||||
$sql = "ALTER TABLE $table MODIFY COLUMN ";
|
||||
$sql .= $field . ' ' . $type . ' ';
|
||||
if ($fieldInfo[0]['Null'] == 'NO') {
|
||||
$sql .= 'NOT NULL ';
|
||||
if (!is_null($fieldInfo[0]['Default'])) {
|
||||
$sql .= "DEFAULT '" . $fieldInfo[0]['Default'] . "' ";
|
||||
}
|
||||
}
|
||||
if ($fieldInfo[0]['Extra']) {
|
||||
$sql .= $fieldInfo[0]['Extra'] . ' ';
|
||||
}
|
||||
$sql .= "COMMENT '$mark'";
|
||||
}
|
||||
Db::execute($sql);
|
||||
return app('json')->success(100024);
|
||||
|
||||
@ -53,7 +53,7 @@ Route::group(function () {
|
||||
Route::get('download/[:key]', 'PublicController/download')->option(['real_name' => '下载文件']);
|
||||
})->middleware([
|
||||
AllowOriginMiddleware::class,
|
||||
// \app\adminapi\middleware\AdminAuthTokenMiddleware::class
|
||||
\app\adminapi\middleware\AdminAuthTokenMiddleware::class
|
||||
])->option(['mark' => 'system', 'mark_name' => '系统相关']);
|
||||
|
||||
/**
|
||||
|
||||
@ -258,7 +258,7 @@ class StoreOrderController
|
||||
CacheService::set('PAY_LOCK_' . $uni, 'PAY_LOCK', 2);
|
||||
if (!$uni) return app('json')->fail(100100);
|
||||
$orderInfo = $this->services->get(['order_id' => $uni]);
|
||||
if ($orderInfo->is_del == 1 || $orderInfo->is_system_del == 1) return app('json')->fail('订单已经超过系统支付时间,无法支付,请重新下单');
|
||||
if ($orderInfo->is_cancel == 1 || $orderInfo->is_del == 1 || $orderInfo->is_system_del == 1) return app('json')->fail('订单已经超过系统支付时间,无法支付,请重新下单');
|
||||
$uid = $type == 1 ? (int)$request->uid() : $orderInfo->uid;
|
||||
$orderInfo->is_channel = $this->getChennel[$request->getFromType()] ?? ($request->isApp() ? 0 : 1);
|
||||
$orderInfo->order_id = $uid != $orderInfo->pay_uid ? app()->make(StoreOrderCreateServices::class)->getNewOrderId('cp') : $uni;
|
||||
|
||||
@ -204,10 +204,12 @@ class UserWechatUserDao extends BaseDao
|
||||
if (isset($where['label_id']) && $where['label_id']) {
|
||||
$model = $model->whereIn($userAlias . 'uid', function ($query) use ($where) {
|
||||
if (is_array($where['label_id'])) {
|
||||
$query->name('user_label_relation')->whereIn('label_id', $where['label_id'])->field('uid')->select();
|
||||
$label_ids = array_map('intval', $where['label_id']);
|
||||
$query->name('user_label_relation')->whereIn('label_id', $label_ids)->field('uid')->select();
|
||||
} else {
|
||||
if (strpos($where['label_id'], ',') !== false) {
|
||||
$query->name('user_label_relation')->whereIn('label_id', explode(',', $where['label_id']))->field('uid')->select();
|
||||
$label_ids = array_map('intval', explode(',', $where['label_id']));
|
||||
$query->name('user_label_relation')->whereIn('label_id', $label_ids)->field('uid')->select();
|
||||
} else {
|
||||
$query->name('user_label_relation')->where('label_id', (int)$where['label_id'])->field('uid')->select();
|
||||
}
|
||||
|
||||
@ -16,7 +16,7 @@ class OrderShippingListener implements ListenerInterface
|
||||
public function handle($event): void
|
||||
{
|
||||
/** @var StoreOrder $order */
|
||||
[$order_type, $order, $delivery_type, $delivery_id, $delivery_code] = $event;
|
||||
[$order_type, $order, $delivery_type, $delivery_id, $delivery_name] = $event;
|
||||
$order_shipping_open = sys_config('order_shipping_open', 0); // 小程序发货信息管理服务开关
|
||||
$secs = 0;
|
||||
if ($order && $order_shipping_open) {
|
||||
@ -80,14 +80,27 @@ class OrderShippingListener implements ListenerInterface
|
||||
if (!isset($order['shipping_type']) || $order['shipping_type'] == 1) {
|
||||
if ($delivery_type == 1) {
|
||||
//仅实现默认的快递公司
|
||||
$expressData = ['韵达快递' => 'YD','顺丰速运' => 'SF','圆通速递' => 'YTO','中通快递' => 'ZTO',
|
||||
'申通快递' => 'STO','百世快递' => 'HTKY','京东物流' => 'JD','极兔速递' => 'JTSD',
|
||||
'邮政快递包裹' => 'YZPY','EMS' => 'EMS','德邦快递' => 'DBL','宅急送' => 'ZJS',
|
||||
$expressData = [
|
||||
'韵达快递' => 'YD',
|
||||
'顺丰速运' => 'SF',
|
||||
'圆通速递' => 'YTO',
|
||||
'中通快递' => 'ZTO',
|
||||
'申通快递' => 'STO',
|
||||
'百世快递' => 'HTKY',
|
||||
'京东物流' => 'JD',
|
||||
'极兔速递' => 'JTSD',
|
||||
'邮政快递包裹' => 'YZPY',
|
||||
'EMS' => 'EMS',
|
||||
'德邦快递' => 'DBL',
|
||||
'德邦物流' => 'DBLKY',
|
||||
'宅急送' => 'ZJS',
|
||||
'优速快递' => 'UC',
|
||||
'苏宁物流' => 'SNWL',
|
||||
];
|
||||
$shipping_list = [
|
||||
[
|
||||
'tracking_no' => $delivery_id ?? '',
|
||||
'express_company' => $delivery_code,
|
||||
'express_company' => $expressData[$delivery_name] ?? '',
|
||||
'item_desc' => $item_desc,
|
||||
'contact' => [
|
||||
'receiver_contact' => $order['user_phone']
|
||||
|
||||
@ -68,7 +68,7 @@ class ArticleServices extends BaseServices
|
||||
{
|
||||
/** @var ArticleContentServices $articleContentService */
|
||||
$articleContentService = app()->make(ArticleContentServices::class);
|
||||
$content['content'] = $data['content'];
|
||||
$content['content'] = htmlspecialchars($data['content']);
|
||||
$id = $data['id'];
|
||||
unset($data['content'], $data['id']);
|
||||
$info = $this->transaction(function () use ($id, $data, $articleContentService, $content) {
|
||||
@ -105,6 +105,7 @@ class ArticleServices extends BaseServices
|
||||
{
|
||||
$info = $this->dao->read($id);
|
||||
$info['cid'] = (int)$info['cid'];
|
||||
$info['content'] = htmlspecialchars_decode($info['content']);
|
||||
return compact('info');
|
||||
}
|
||||
|
||||
@ -166,6 +167,7 @@ class ArticleServices extends BaseServices
|
||||
$info = $info->toArray();
|
||||
$info['visit'] = (int)$info['visit'];
|
||||
$info['add_time'] = date('Y-m-d', $info['add_time']);
|
||||
$info['content'] = htmlspecialchars_decode($info['content']);
|
||||
}
|
||||
return $info;
|
||||
}
|
||||
|
||||
@ -138,7 +138,7 @@ class RoutineTemplateListService extends NoticeService
|
||||
'thing2' => $storeTitle,
|
||||
'amount3' => $order['pay_price'],
|
||||
'character_string6' => $data['order_id']
|
||||
], '/pages/goods/order_details/index?order_id=' . $data['order_id'] . '&isReturen=1');
|
||||
], '/pages/goods/order_details/index?order_id=' . $data['order_id'] . '&isReturn=1');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -155,7 +155,7 @@ class RoutineTemplateListService extends NoticeService
|
||||
'thing2' => $storeTitle,
|
||||
'amount3' => $order['pay_price'],
|
||||
'character_string6' => $order['order_id']
|
||||
], '/pages/goods/order_details/index?order_id=' . $order['order_id'] . '&isReturen=1');
|
||||
], '/pages/goods/order_details/index?order_id=' . $order['order_id'] . '&isReturn=1');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -151,7 +151,7 @@ class WechatTemplateListService extends NoticeService
|
||||
'time5' => date('Y-m-d H:i:s', time()),
|
||||
'thing2' => $title,
|
||||
'amount3' => $order['refund_price'],
|
||||
], '/pages/goods/order_details/index?order_id=' . $order['refund_no'] . '&isReturen=1');
|
||||
], '/pages/goods/order_details/index?order_id=' . $order['refund_no'] . '&isReturn=1');
|
||||
}
|
||||
|
||||
/**
|
||||
@ -168,7 +168,7 @@ class WechatTemplateListService extends NoticeService
|
||||
'thing2' => $title,
|
||||
'amount3' => $order['refund_price'],
|
||||
'thing4' => $order['refuse_reason'],
|
||||
], '/pages/goods/order_details/index?order_id=' . $order['refund_no'] . '&isReturen=1');
|
||||
], '/pages/goods/order_details/index?order_id=' . $order['refund_no'] . '&isReturn=1');
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@ -502,7 +502,7 @@ if ($type == 'order') {
|
||||
$data['delivery_id'] = uniqid();
|
||||
}
|
||||
// 小程序订单管理
|
||||
event('OrderShippingListener', ['product', $orderInfo, $type, $data['delivery_id'], $data['delivery_code']]);
|
||||
event('OrderShippingListener', ['product', $orderInfo, $type, $data['delivery_id'], $data['delivery_name']]);
|
||||
//到期自动收货
|
||||
event('OrderDeliveryListener', [$orderInfo, $storeName, $data, $type]);
|
||||
|
||||
|
||||
@ -1435,4 +1435,4 @@ class StoreOrderRefundServices extends BaseServices
|
||||
//拒绝退款处理
|
||||
$this->refuseRefund($id, $refundData, $orderRefundInfo);
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -431,9 +431,10 @@ class StoreOrderTakeServices extends BaseServices
|
||||
return $this->backOrderBrokerageTwo($orderInfo, $userInfo, $isSelfBrokerage);
|
||||
}
|
||||
$brokeragePrice = $orderInfo['one_brokerage'] ?? 0;
|
||||
// 返佣金额小于等于0 直接返回不返佣金
|
||||
// 一级返佣金额小于等于0 直接跳转二级返佣逻辑
|
||||
if ($brokeragePrice <= 0) {
|
||||
return true;
|
||||
$frozen_time = time() + intval(sys_config('extract_time')) * 86400;
|
||||
return $this->backOrderBrokerageTwo($orderInfo, $userInfo, $isSelfBrokerage, $frozen_time);
|
||||
}
|
||||
// 获取上级推广员信息
|
||||
$spreadPrice = $userServices->value(['uid' => $one_spread_uid], 'brokerage_price');
|
||||
|
||||
@ -954,7 +954,7 @@ class StoreProductServices extends BaseServices
|
||||
$res = $this->dao->update($id, $data);
|
||||
$storeProductCateServices->update(['product_id' => $id], ['status' => 0]);
|
||||
if (!$res) throw new AdminException(100008);
|
||||
return 100002;
|
||||
return '移动回收站成功';
|
||||
}
|
||||
}
|
||||
|
||||
@ -994,6 +994,7 @@ class StoreProductServices extends BaseServices
|
||||
foreach ($attrs as $items) {
|
||||
$item['attrs'][$key] = $items;
|
||||
$item['attrs'][$key]['suk'] = implode(',', $items['detail']);
|
||||
$item['attrs'][$key]['product_price'] = $items['price'];
|
||||
$key += 1;
|
||||
}
|
||||
}
|
||||
|
||||
@ -126,7 +126,7 @@ class SystemRoleServices extends BaseServices
|
||||
if (isset($auth[$method]) && in_array($rule, $auth[$method])) {
|
||||
return true;
|
||||
} else {
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1192,8 +1192,8 @@ class UserBillServices extends BaseServices
|
||||
$storeOrderServices = app()->make(StoreOrderServices::class);
|
||||
[$page, $limit] = $this->getPageValue();
|
||||
$time = [];
|
||||
$where = ['paid' => 1, 'type' => 6, 'spread_or_uid' => $uid, 'pid' => 0, 'refund_status' => 0];
|
||||
$list = $storeOrderServices->getlist($where, ['id,order_id,uid,add_time,spread_uid,status,spread_two_uid,one_brokerage,two_brokerage,pay_price,pid'], $page, $limit, ['split']);
|
||||
$where = ['paid' => 1, 'type' => 6, 'all_spread' => $uid, 'pid' => 0, 'refund_status' => 0];
|
||||
$list = $storeOrderServices->getlist($where, ['id,order_id,uid,add_time,spread_uid,status,spread_two_uid,one_brokerage,two_brokerage,pay_price,pid,staff_id,agent_id,division_id,staff_brokerage,agent_brokerage,division_brokerage'], $page, $limit, ['split']);
|
||||
$result['count'] = $storeOrderServices->count($where);
|
||||
$time_data = [];
|
||||
if ($list) {
|
||||
@ -1202,7 +1202,15 @@ class UserBillServices extends BaseServices
|
||||
foreach ($list as &$item) {
|
||||
$item['avatar'] = $userInfos[$item['uid']]['avatar'] ?? '';
|
||||
$item['nickname'] = $userInfos[$item['uid']]['nickname'] ?? '';
|
||||
$item['number'] = $item['spread_uid'] == $uid ? $item['one_brokerage'] : $item['two_brokerage'];
|
||||
if ($item['division_id'] == $uid) {
|
||||
$item['number'] = $item['division_brokerage'];
|
||||
} elseif ($item['agent_id'] == $uid) {
|
||||
$item['number'] = $item['agent_brokerage'];
|
||||
} elseif ($item['staff_id'] == $uid) {
|
||||
$item['number'] = $item['staff_brokerage'];
|
||||
} else {
|
||||
$item['number'] = $item['spread_uid'] == $uid ? $item['one_brokerage'] : $item['two_brokerage'];
|
||||
}
|
||||
$item['time'] = $item['add_time'] ? date('Y-m-d H:i', $item['add_time']) : '';
|
||||
$item['time_key'] = $item['add_time'] ? date('Y-m', $item['add_time']) : '';
|
||||
$item['type'] = in_array($item['status'], [2, 3]) ? 'brokerage' : 'number';
|
||||
|
||||
1
crmeb/backup/readme.md
Normal file
1
crmeb/backup/readme.md
Normal file
@ -0,0 +1 @@
|
||||
crmeb/backup 目录在CRMEB项目中的主要作用是用于保存备份文件和数据库文件的。
|
||||
@ -82,7 +82,7 @@ export default {
|
||||
this.dialogTableVisible = true;
|
||||
this.info = res.data;
|
||||
}).catch(res => {
|
||||
this.$Message.error(res.msg);
|
||||
this.$message.error(res.msg);
|
||||
})
|
||||
},
|
||||
//修改状态
|
||||
@ -116,7 +116,7 @@ export default {
|
||||
})
|
||||
.catch((res) => {
|
||||
this.loading = false;
|
||||
this.$Message.error(res.msg);
|
||||
this.$message.error(res.msg);
|
||||
});
|
||||
},
|
||||
//分页
|
||||
@ -139,11 +139,11 @@ export default {
|
||||
};
|
||||
this.$modalSure(delfromData)
|
||||
.then((res) => {
|
||||
this.$Message.success(res.msg);
|
||||
this.$message.success(res.msg);
|
||||
this.getList();
|
||||
})
|
||||
.catch((res) => {
|
||||
this.$Message.error(res.msg);
|
||||
this.$message.error(res.msg);
|
||||
});
|
||||
},
|
||||
},
|
||||
|
||||
File diff suppressed because one or more lines are too long
@ -27,7 +27,17 @@ if (phpversion() >= '8.0.0') {
|
||||
date_default_timezone_set('PRC');
|
||||
error_reporting(E_ALL & ~E_NOTICE);
|
||||
header('Content-Type: text/html; charset=UTF-8');
|
||||
|
||||
//mysql数据库配置容器中获取
|
||||
$MYSQL_HOST_IP = getenv('MYSQL_HOST_IP')?:'127.0.0.1';
|
||||
$MYSQL_PORT = getenv('MYSQL_PORT')?:'3306';
|
||||
$MYSQL_USER = getenv('MYSQL_USER')?:'root';
|
||||
$MYSQL_PASSWORD = getenv('MYSQL_PASSWORD')?:'123456';
|
||||
$MYSQL_DATABASE = getenv('MYSQL_DATABASE')?:'crmeb';
|
||||
//redis配置容器中获取
|
||||
$REDIS_HOST_IP = getenv('REDIS_HOST_IP')?:'127.0.0.1';
|
||||
$REDIS_PORT = getenv('REDIS_PORT')?:'6379';
|
||||
$REDIS_DATABASE = getenv('REDIS_DATABASE')?:0;
|
||||
$REDIS_PASSWORD = getenv('REDIS_PASSWORD')?:'';
|
||||
//数据库
|
||||
$sqlFile = 'crmeb.sql';
|
||||
$configFile = '.env';
|
||||
|
||||
@ -29,21 +29,21 @@
|
||||
|
||||
<tr>
|
||||
<td class="tar">数据库用户名:</td>
|
||||
<td><input type="text" name="dbuser" id="dbuser" value="root" class="input"></td>
|
||||
<td><input type="text" name="dbuser" id="dbuser" value="<?php echo $MYSQL_USER; ?>" class="input"></td>
|
||||
<td>
|
||||
<div id="J_install_tip_dbuser"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tar">数据库密码:</td>
|
||||
<td><input type="password" name="dbpw" id="dbpw" value="" class="input" autoComplete="off"></td>
|
||||
<td><input type="password" name="dbpw" id="dbpw" value="<?php echo $MYSQL_PASSWORD; ?>" class="input" autoComplete="off"></td>
|
||||
<td>
|
||||
<div id="J_install_tip_dbpw"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tar">数据库名:</td>
|
||||
<td><input type="text" name="dbname" id="dbname" value="crmeb" class="input"></td>
|
||||
<td><input type="text" name="dbname" id="dbname" value="<?php echo $MYSQL_DATABASE; ?>" class="input"></td>
|
||||
<td>
|
||||
<div id="J_install_tip_dbname"></div>
|
||||
</td>
|
||||
@ -62,14 +62,14 @@
|
||||
</tr>
|
||||
<tr v-show="value">
|
||||
<td class="tar">数据库服务器:</td>
|
||||
<td><input type="text" name="dbhost" id="dbhost" value="127.0.0.1" class="input"></td>
|
||||
<td><input type="text" name="dbhost" id="dbhost" value="<?php echo $MYSQL_HOST_IP; ?>" class="input"></td>
|
||||
<td>
|
||||
<div id="J_install_tip_dbhost"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-show="value">
|
||||
<td class="tar">数据库端口:</td>
|
||||
<td><input type="text" name="dbport" id="dbport" value="3306" class="input"
|
||||
<td><input type="text" name="dbport" id="dbport" value="<?php echo $MYSQL_PORT; ?>" class="input"
|
||||
onBlur="mysqlDbPwd(0)"></td>
|
||||
<td>
|
||||
<div id="J_install_tip_dbport"></div>
|
||||
@ -81,11 +81,7 @@
|
||||
<td><input type="text" name="dbprefix" id="dbprefix" value="eb_" class="input"></td>
|
||||
<td></td>
|
||||
</tr>
|
||||
<tr v-show="value">
|
||||
<td class="tar">演示数据:</td>
|
||||
<td colspan="2"><input style="width:14px;height:14px;" type="checkbox" id="demo" name="demo"
|
||||
value="demo" checked></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<table width="100%">
|
||||
<tr>
|
||||
@ -104,7 +100,7 @@
|
||||
<tr>
|
||||
<td class="tar">管理员密码:</td>
|
||||
<td><input type="password" name="manager_pwd" id="manager_pwd" class="input" autoComplete="off"
|
||||
placeholder="请输入密码(至少6个字符)" placeholder-class="pl-style" onblur="checkForm()">
|
||||
placeholder="请输入密码(至少6个字符)" placeholder-class="pl-style" onblur="checkForm()">
|
||||
</td>
|
||||
<td>
|
||||
<div id="J_install_tip_manager_pwd"><span class="gray">请输入至少6个字符密码</span></div>
|
||||
@ -118,6 +114,11 @@
|
||||
<div id="J_install_tip_manager_ckpwd"></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td class="tar">演示数据:</td>
|
||||
<td colspan="2"><input style="width:14px;height:14px;" type="checkbox" id="demo" name="demo"
|
||||
value="demo" checked></td>
|
||||
</tr>
|
||||
|
||||
</table>
|
||||
<table>
|
||||
@ -136,14 +137,14 @@
|
||||
</tr>
|
||||
<tr v-show="radio == 1">
|
||||
<td class="tar">服务器地址:</td>
|
||||
<td><input type="text" name="rbhost" id="rbhost" value="127.0.0.1" class="input"></td>
|
||||
<td><input type="text" name="rbhost" id="rbhost" value="<?php echo $REDIS_HOST_IP; ?>" class="input"></td>
|
||||
<td>
|
||||
<div id="J_install_redis_host"><span class="gray">redis服务器地址,一般为127.0.0.1</span></div>
|
||||
</td>
|
||||
</tr>
|
||||
<tr v-show="radio == 1">
|
||||
<td class="tar">端口号:</td>
|
||||
<td><input type="text" name="rbport" id="rbport" value="6379" class="input" autoComplete="off">
|
||||
<td><input type="text" name="rbport" id="rbport" value="<?php echo $REDIS_PORT; ?>" class="input" autoComplete="off">
|
||||
</td>
|
||||
<td>
|
||||
<div id="J_install_redis_port"><span class="gray">redis端口,默认为6379</span></div>
|
||||
@ -151,7 +152,7 @@
|
||||
</tr>
|
||||
<tr v-show="radio == 1">
|
||||
<td class="tar">数据库:</td>
|
||||
<td><input type="text" name="rbselect" id="rbselect" value="0" class="input" autoComplete="off">
|
||||
<td><input type="text" name="rbselect" id="rbselect" value="<?php echo $REDIS_DATABASE; ?>" class="input" autoComplete="off">
|
||||
</td>
|
||||
<td>
|
||||
<div id="J_install_redis_select"><span class="gray">redis数据库,默认为0,一般不做更改</span></div>
|
||||
@ -159,7 +160,7 @@
|
||||
</tr>
|
||||
<tr v-show="radio == 1" id="scrollBtn">
|
||||
<td class="tar">数据库密码:</td>
|
||||
<td><input type="text" name="rbpw" id="rbpw" value="" class="input" autoComplete="off"></td>
|
||||
<td><input type="text" name="rbpw" id="rbpw" value="<?php echo $REDIS_PASSWORD; ?>" class="input" autoComplete="off"></td>
|
||||
<td>
|
||||
<div id="J_install_redis_dbpw"><span class="gray">redis数据库密码</span></div>
|
||||
</td>
|
||||
@ -273,7 +274,7 @@
|
||||
|
||||
|
||||
jumpButton(){
|
||||
this.$refs.mianscroll.scrollTop = this.$refs.mianscroll.clientHeight
|
||||
this.$refs.mianscroll.scrollTop = this.$refs.mianscroll.clientHeight
|
||||
},
|
||||
submitForm() {
|
||||
this.mysqlDbPwd().then(res => {
|
||||
|
||||
@ -1,22 +1,10 @@
|
||||
crmeb/runtime目录在CRMEB项目中的主要作用是用于保存项目运行期间生成的临时文件。
|
||||
# runtime目录说明
|
||||
|
||||
ThinkPHP框架在运行过程中会自动生成一些临时文件,比如缓存、日志文件等。这些文件的位置就被设计在runtime目录下。
|
||||
此目录用于存储CRMEB系统运行期间生成的各种临时文件和运行时数据。包含以下子目录:
|
||||
|
||||
具体来说:
|
||||
- `cache/` - 系统缓存文件
|
||||
- `log/` - 系统日志文件
|
||||
- `session/` - 用户会话数据
|
||||
- `temp/` - 临时文件
|
||||
|
||||
- 放置缓存compile结果,避免每次都重新编译路由等
|
||||
- 缓存模板视图文件,加速模板渲染
|
||||
- 保存日志文件,方便排查问题
|
||||
- Session文件以key-value方式存储
|
||||
- 上传文件临时存放位置
|
||||
|
||||
使用这个目录有以下优点:
|
||||
|
||||
- 实现资源的动态创建与自动清理
|
||||
- 与源代码完全隔离,运行期安全可控
|
||||
- 易于部署式替换整个目录
|
||||
- 一定程度减轻源代码管理优化需要
|
||||
|
||||
总体来说,它承担了项目运行时临时资源的读写工作。
|
||||
|
||||
通过合理利用这个目录,可以改善项目性能和部署运维需求。
|
||||
请勿手动删除此目录下的文件,除非明确知道其用途。
|
||||
BIN
readme/pic/开源群php.jpg
Executable file
BIN
readme/pic/开源群php.jpg
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 214 KiB |
@ -66,10 +66,13 @@ export default {
|
||||
if (nVal != oVal) {
|
||||
if (nVal.length) {
|
||||
this.labelList = [];
|
||||
this.listData.map((item) => {
|
||||
if (nVal.includes(item.id)) {
|
||||
this.labelList.push(item);
|
||||
}
|
||||
// 根据nVal 去listData 中查找 不改变查找出来的顺序
|
||||
nVal.forEach((item) => {
|
||||
this.listData.forEach((item2) => {
|
||||
if (item == item2.id) {
|
||||
this.labelList.push(item2);
|
||||
}
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@ -15,7 +15,7 @@ import Setting from '@/setting';
|
||||
import router from '@/router';
|
||||
const service = axios.create({
|
||||
baseURL: Setting.apiBaseURL,
|
||||
timeout: 10000, // 请求超时时间
|
||||
timeout: 100000, // 请求超时时间
|
||||
});
|
||||
|
||||
axios.defaults.withCredentials = true; // 携带cookie
|
||||
|
||||
@ -190,7 +190,7 @@ Object.keys(filters).forEach((key) => {
|
||||
// 添加统计脚本
|
||||
(function () {
|
||||
var hm = document.createElement('script');
|
||||
hm.src = 'https://cdn.oss.9gt.net/js/es.js?version=bzv5.6.1';
|
||||
hm.src = 'https://cdn.oss.9gt.net/js/es.js?version=kyv5.6.3';
|
||||
var s = document.getElementsByTagName('script')[0];
|
||||
s.parentNode.insertBefore(hm, s);
|
||||
})();
|
||||
|
||||
@ -138,6 +138,11 @@
|
||||
<span>{{ scope.row.agent_brokerage || 0 }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="员工返佣金额" min-width="130" v-if="rowsList.division_type == 3">
|
||||
<template slot-scope="scope">
|
||||
<span>{{ scope.row.staff_brokerage || 0 }}</span>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</template>
|
||||
</el-table>
|
||||
<div class="acea-row row-right page">
|
||||
|
||||
@ -629,7 +629,7 @@ export default {
|
||||
attends_user: 1, //参与用户1:所有 2:部分
|
||||
user_level: [], //参与用户等级
|
||||
user_label: [], //参与用户标签
|
||||
is_svip: '-1', //参与用户是否付费会员
|
||||
is_svip: '', //参与用户是否付费会员
|
||||
prize_num: 0, //奖品数量
|
||||
period: [], //活动时间
|
||||
prize: [], //奖品数组
|
||||
|
||||
@ -710,7 +710,7 @@ export default {
|
||||
is_hot: row.is_hot,
|
||||
status: 0,
|
||||
section_time: [],
|
||||
description: row.description, // 不取商品中的
|
||||
description: '', // 不取商品中的
|
||||
rule: '',
|
||||
id: 0,
|
||||
product_id: row.id,
|
||||
@ -830,9 +830,9 @@ export default {
|
||||
}
|
||||
}
|
||||
this.current += 1;
|
||||
setTimeout((e) => {
|
||||
this.formValidate.description += ' ';
|
||||
}, 0);
|
||||
// setTimeout((e) => {
|
||||
// this.formValidate.description += ' ';
|
||||
// }, 0);
|
||||
} else {
|
||||
return this.$message.warning('请完善您的信息');
|
||||
}
|
||||
|
||||
@ -763,7 +763,7 @@ export default {
|
||||
is_host: row.is_hot,
|
||||
is_show: 0,
|
||||
section_time: [],
|
||||
description: row.description, // 不取商品中的
|
||||
description: '', // 不取商品中的
|
||||
id: 0,
|
||||
people: 2,
|
||||
num: 1,
|
||||
|
||||
@ -507,7 +507,7 @@ export default {
|
||||
is_postage: row.is_postage,
|
||||
is_host: 0,
|
||||
is_show: 1,
|
||||
description: row.description,
|
||||
description: '',
|
||||
id: 0,
|
||||
product_id: row.id,
|
||||
temp_id: row.temp_id,
|
||||
|
||||
@ -590,7 +590,7 @@ export default {
|
||||
// type: 1,
|
||||
num: 1,
|
||||
deposit: 1,
|
||||
description: row.description, // 不取商品中的
|
||||
description: '', // 不取商品中的
|
||||
id: 0,
|
||||
num: 1,
|
||||
status: 1,
|
||||
|
||||
@ -685,7 +685,7 @@ export default {
|
||||
is_postage: row.is_postage,
|
||||
is_hot: row.is_hot,
|
||||
status: 0,
|
||||
description: row.description,
|
||||
description: '',
|
||||
id: 0,
|
||||
product_id: row.id,
|
||||
temp_id: row.temp_id,
|
||||
|
||||
@ -659,7 +659,6 @@ export default {
|
||||
item.attrs.forEach((value) => {
|
||||
value.cate_name = item.cate_name;
|
||||
value.store_label = item.store_label;
|
||||
value.product_price = item.price;
|
||||
value.status = 1;
|
||||
});
|
||||
});
|
||||
|
||||
@ -129,6 +129,31 @@
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section">
|
||||
<div class="title">返佣信息(金额|用户UID)</div>
|
||||
<ul class="list">
|
||||
<li class="item">
|
||||
<div>一级佣金:</div>
|
||||
<div class="value">{{ orderDatalist.orderInfo.one_brokerage }} | {{ orderDatalist.orderInfo.spread_uid }}</div>
|
||||
</li>
|
||||
<li class="item">
|
||||
<div>二级佣金:</div>
|
||||
<div class="value">{{ orderDatalist.orderInfo.two_brokerage }} | {{ orderDatalist.orderInfo.spread_two_uid }}</div>
|
||||
</li>
|
||||
<li class="item">
|
||||
<div>员工返佣:</div>
|
||||
<div class="value">{{ orderDatalist.orderInfo.staff_brokerage }} | {{ orderDatalist.orderInfo.staff_id }}</div>
|
||||
</li>
|
||||
<li class="item">
|
||||
<div>代理商佣金:</div>
|
||||
<div class="value">{{ orderDatalist.orderInfo.agent_brokerage }} | {{ orderDatalist.orderInfo.agent_id }}</div>
|
||||
</li>
|
||||
<li class="item">
|
||||
<div>事业部佣金:</div>
|
||||
<div class="value">{{ orderDatalist.orderInfo.division_brokerage }} | {{ orderDatalist.orderInfo.division_id }}</div>
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
<div class="section" v-if="orderDatalist.orderInfo.delivery_name">
|
||||
<div class="title">
|
||||
{{ orderDatalist.orderInfo.delivery_type == 'express' ? '物流信息' : '送货人信息' }}
|
||||
|
||||
@ -342,7 +342,7 @@
|
||||
.ifam {
|
||||
width: 344px;
|
||||
height: 644px;
|
||||
background: url('~/assets/images/phonebg.png') no-repeat center top;
|
||||
background: url('~@/assets/images/phonebg.png') no-repeat center top;
|
||||
background-size: 344px 644px;
|
||||
padding: 40px 20px;
|
||||
padding-top: 50px;
|
||||
|
||||
@ -447,7 +447,7 @@ export default {
|
||||
confirmButtonClass: 'btn-custom-cancel',
|
||||
})
|
||||
.then(() => {
|
||||
this.$router.push('/admin/setting/pages/devise/0');
|
||||
this.$router.push(this.$routeProStr + '/setting/pages/devise/0');
|
||||
})
|
||||
.catch(() => {});
|
||||
},
|
||||
@ -844,7 +844,7 @@ export default {
|
||||
if (num == 2) {
|
||||
this.relLoading = false;
|
||||
setTimeout(() => {
|
||||
window.location.replace('/admin/setting/pages/devise/0');
|
||||
window.location.replace(this.$routeProStr + '/setting/pages/devise/0');
|
||||
}, 2000);
|
||||
} else {
|
||||
this.loading = false;
|
||||
|
||||
@ -322,15 +322,7 @@ export default {
|
||||
} else {
|
||||
item.props.disabled = false;
|
||||
item.props.min = 1;
|
||||
item.validate = [
|
||||
{
|
||||
type: 'number',
|
||||
max: 1000000,
|
||||
min: 0,
|
||||
message: '最大只能输入1000000,最小为0',
|
||||
requred: true,
|
||||
},
|
||||
];
|
||||
|
||||
}
|
||||
}
|
||||
if (['price'].includes(key)) {
|
||||
|
||||
@ -378,6 +378,11 @@
|
||||
<div>{{ scope.row.user_type }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="上级用户" min-width="100">
|
||||
<template slot-scope="scope">
|
||||
<div>{{ scope.row.spread_uid_nickname }}</div>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column label="余额" prop="now_money" min-width="100" :sortable="true">
|
||||
<template slot-scope="scope">
|
||||
<div>{{ scope.row.now_money }}</div>
|
||||
|
||||
@ -55,7 +55,7 @@
|
||||
</view>
|
||||
<view class='evaluate' v-else-if="item.is_reply==1">{{$t(`已评价`)}}</view>
|
||||
</view>
|
||||
|
||||
|
||||
</view>
|
||||
|
||||
<view class="botton-btn">
|
||||
@ -220,7 +220,7 @@
|
||||
if (item.type == 0) {
|
||||
url = `/pages/goods_details/index?id=${item.product_id}`
|
||||
} else if (item.type == 1) {
|
||||
url = `/pages/activity/goods_seckill_details/index?id=${item.seckill_id}`
|
||||
url = `/pages/activity/goods_seckill_details/index?id=${item.seckill_id}&time_id=${item.productInfo.time_id}`
|
||||
} else if (item.type == 2) {
|
||||
url = `/pages/activity/goods_bargain_details/index?id=${item.bargain_id}&bargain=${this.uid}`
|
||||
} else if (item.type == 3) {
|
||||
@ -350,9 +350,9 @@
|
||||
|
||||
.op {
|
||||
opacity: 0.5;
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
.gray {
|
||||
filter: grayscale(100%);
|
||||
filter: gray;
|
||||
|
||||
@ -166,6 +166,14 @@ export default {
|
||||
} else {
|
||||
toLogin();
|
||||
}
|
||||
},
|
||||
// 分享朋友圈及朋友
|
||||
onShareAppMessage() {
|
||||
return {
|
||||
title: '积分抽奖',
|
||||
path: '/pages/goods/lottery/grids/index?type=' + this.type + '&lottery_id=' + this.lottery_id + '&spread=' + this.$store.state.app.uid,
|
||||
imageUrl: this.image
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
//#ifdef H5
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user