Skip to content

Commit 9087254

Browse files
committed
update v5.3.0
1 parent 6e17529 commit 9087254

File tree

1,132 files changed

+46335
-41877
lines changed

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

1,132 files changed

+46335
-41877
lines changed

README.md

Lines changed: 7 additions & 28 deletions
Original file line numberDiff line numberDiff line change
@@ -43,30 +43,10 @@ CRMEB开源商城系统PHP版
4343

4444
### 📋 更新说明
4545

46-
```
47-
v5.2.0 更新说明【更新时间2023年09月13日】
48-
1、后台ui 从iview更新成element-ui
49-
2、数据统计查询计算优化,统计放在对应的模块中
50-
3、优化站点配置,分类对应的配置项
51-
4、客服关键字自动回复,添加自动回复,用户在出发关键字时,系统自动回复聊天
52-
5、批量发货功能,导出发货单,填写对应的物流数据,点击批量发货然后导入,即可批量写入发货状态
53-
6、商品起购数量,后台可设置起购件数,移动端默认显示最低的购买件数
54-
7、提现手续费设置,填写提现手续费百分比,范围0-100,0为无提现手续费,例:设置10%提现,提现100元,到账90元,10元手续费
55-
8、签到功能,增加提醒,增加连续签到奖励,累计签到奖励
56-
9、支持微信服务商支付
57-
10、优化小程序和公众号登录流程
58-
11、代码生成二期
59-
60-
v5.1.0 更新说明【更新时间2023年07月10日】
61-
1、增加一号通商家寄件功能
62-
2、增加京东云,华为云,天翼云云存储
63-
3、增加虚拟评价可选规格
64-
4、增加自定义跳转小程序
65-
5、增加移动端订单管理查看物流信息
66-
6、增加一定端退款订单详情显示退款理由以及图片
67-
7、增加后台订单详情展示用户的发票申请记录信息,及开票信息/状态
68-
8、增加使用的优惠券是否退回开关,商品成功退款后,退回/不退回使用的优惠券
69-
```
46+
47+
点击查看<a href="https://doc.crmeb.com/single/v53/12202" target="_blank">更新记录</a>
48+
49+
7050
### 用心做开源,我们也很需要你的鼓励!右上角Star🌟,等你点亮!
7151

7252
---
@@ -163,11 +143,10 @@ So~~想要用CRMEB开源商城系统做公益项目的朋友,可以来免费
163143

164144
---
165145
### 📞 CRMEB互动
166-
#### 技术娱乐!代码写累了?那就歇会吧!扫码让你开心一刻!
167-
![输入图片说明](readme/pic/小剧场.jpg)
146+
#### CRMEB开源技术交流群
147+
#### 扫码进群可领取开源版接口文档、产品功能清单、高清UI设计图、思维脑图!
148+
![输入图片说明](readme/pic/开源群.jpg)
168149
#### 技术社区!找方法、提bug、看官方消息、拿活跃大奖!都在 <a href="https://www.crmeb.com/ask" target="_blank">CRMEB 技术社区</a> 应有尽有
169-
#### 技术交流!<a href="https://pd.qq.com/s/1v2yb4e0p" target="_blank">CRMEB开源商城系统开发QQ频道已开启,点击加入一起交流学习</a>
170-
![输入图片说明](readme/pic/联系我们.jpg)
171150

172151
---
173152

crmeb/.version

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
1-
version=CRMEB-KY v5.2.1
2-
version_code=521
1+
version=CRMEB-KY v5.3.0
2+
version_code=530
33
platform=github
44
app_id=ze7x9rxsv09l6pvsyo
55
app_key=fuF7U9zaybLa5gageVQzxtxQMFnvU2OI

crmeb/README.md

Lines changed: 159 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -103,6 +103,165 @@ php think workerman start --d
103103
- restart: 重启
104104
- --d : 后台执行
105105

106+
## 开发规范
107+
#### 命名规范
108+
ThinkPHP6.0遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:
109+
110+
1. 目录和文件
111+
2. 目录使用小写+下划线;
112+
3. 类库、函数文件统一以.php为后缀;
113+
4. 类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;
114+
5. 类(包含接口和Trait)文件采用驼峰法命名(首字母大写),其它文件采用小写+下划线命名;
115+
6. 类名(包括接口和Trait)和文件名保持一致,统一采用驼峰法命名(首字母大写);
116+
117+
#### 函数和类、属性命名
118+
119+
1. 类的命名采用驼峰法(首字母大写),例如 User、UserType;
120+
2. common函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;
121+
3. 控制器里面的方法使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip
122+
4. 方法的命名使用驼峰法(首字母小写),例如 getUserName;
123+
5. 属性的命名使用驼峰法(首字母小写),例如 tableName、instance;
124+
6. 特例:以双下划线__打头的函数或方法作为魔术方法,例如 __call 和 __autoload;
125+
126+
#### 常量和配置
127+
1. 常量以大写字母和下划线命名,例如 APP_PATH;
128+
2. 配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert;
129+
3. 环境变量定义使用大写字母和下划线命名,例如APP_DEBUG;
130+
131+
#### 数据表和字段
132+
1. 数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表及字段命名
133+
134+
注意:请理解并尽量遵循以上命名规范,可以减少在开发过程中出现不必要的错误
135+
136+
#### 语法规范
137+
1. 尽量使用php7新语法
138+
2. 每个 namespace 命名空间声明语句和 use 声明语句块后面,必须 插入一个空白行
139+
3. 类的开始花括号({) 必须 写在类声明后自成一行,结束花括号(})也 必须 写在类主体后自成一行
140+
4. 方法的开始花括号({) 必须 写在函数声明后自成一行,结束花括号(})也 必须 写在函数主体后自成一行。
141+
5. 类的属性和方法 必须 添加访问修饰符(private、protected 以及 public),abstract 以及 final 必须 声明在访问修饰符之前,而 static 必须 声明在访问修饰符之后
142+
6. 控制结构的关键字后 必须 要有一个空格符,而调用方法或函数时则 一定不可 有
143+
7. 控制结构的开始花括号({) 必须 写在声明的同一行,而结束花括号(}) 必须 写在主体后自成一行
144+
8. 纯 PHP 代码文件 必须 省略最后的 ?> 结束标签
145+
9. 所有方法,类,控制器类,都 必须 添加访问修饰符
146+
~~~
147+
148+
/**
149+
* 中文注释
150+
* @param string $str 声明类型
151+
* @param array $arr
152+
* @return bool
153+
*/
154+
public function action(string $str, array $arr)
155+
{
156+
return true;
157+
}
158+
~~~
159+
10. 参数列表中,每个逗号后面 必须 要有一个空格,而逗号前面 一定不可 有空格
160+
~~~
161+
function foo($arg1, &$arg2, $arg3 = [])
162+
{
163+
// method body
164+
}
165+
~~~
166+
11. 参数 可以 分列成多行,此时包括第一个参数在内的每个参数都 尽量 单独成行。
167+
~~~
168+
<?php
169+
$foo->bar(
170+
$longArgument,
171+
$longerArgument,
172+
$muchLongerArgument
173+
);
174+
~~~
175+
12. 标准的 if 结构如下代码所示,请留意「括号」、「空格」以及「花括号」的位置,
176+
注意 else 和 elseif 都与前面的结束花括号在同一行
177+
~~~
178+
<?php
179+
if ($expr1) {
180+
// if body
181+
} elseif ($expr2) {
182+
// elseif body
183+
} else {
184+
// else body;
185+
}
186+
~~~
187+
13. 赋值等号前后必须加空格符
188+
~~~
189+
<?php
190+
$arr = [];
191+
~~~
192+
193+
194+
#### PHP 7.1+ 常用新语法
195+
196+
1. 三元运算符
197+
~~~
198+
<?php
199+
200+
$arr = ['crmeb'=>true];
201+
之前
202+
echo isset($arr['crmeb']) ? $arr['crmeb'] : '';
203+
之后
204+
echo $arr['crmeb'] ?? '';
205+
~~~
206+
2. define() 定义常量数组
207+
~~~
208+
<?php
209+
define('ARR',['a','b']);
210+
~~~
211+
3. 命名空间优化
212+
~~~
213+
<?php
214+
//PHP7之前语法
215+
use FooLibrary\Bar\Baz\ClassA;
216+
use FooLibrary\Bar\Baz\ClassB;
217+
// PHP7新语法写法
218+
use FooLibrary\Bar\Baz\{ ClassA, ClassB};
219+
220+
~~~
221+
#### CRMEB PRO规范
222+
1. 所有数据验证放在模块下的 validates 目录下
223+
2. JSON返回使用父级 AuthController类中的success 和 fail
224+
3. 错误判断抛出异常,由一个错误类统一控制输出
225+
~~~
226+
<?php
227+
228+
throw new AuthException('错误信息',400);
229+
~~~
230+
4. 错误码和错误提示语应该统一管理,方便切换多语言
231+
5. 数据库操作使用模型类,不能使用Db::table()
232+
6. 获取表单数据使用 app\Request
233+
~~~
234+
<?php
235+
use app\Request;
236+
237+
238+
public function index(Request $request) {
239+
240+
//获取提交的数据,并以二维数组形式返回
241+
$arr = $request->getMore([
242+
'name',
243+
'nickname'
244+
]);
245+
//获取提交的数据,并以二维数组形式返回并附加默认值
246+
$arr = $request->getMore([
247+
['name','123'],
248+
['nickname','0']
249+
]);
250+
//获取提交的数据,并以一维数组形式返回并附加默认值
251+
[$name, $nickname] = $request->getMore([
252+
['name','123'],
253+
['nickname','0']
254+
],true);
255+
256+
}
257+
~~~
258+
7. 所有控制器类命令和表名对应,按照大驼峰命名规范
259+
8. 所有文件夹命名按照小写字母加下划线定义
260+
9. 所有属性名,变量名尽量遵守小驼峰命名规范
261+
10. 复杂逻辑,多状态应适当添加行内注释
262+
11. 模型里只能写关于搜索条件语句,查出数据得组合书写在services层进行处理,services创建命令:php make:services api@user/User
263+
264+
106265
## 文档
107266

108267
[使用手册](https://doc.crmeb.com)

crmeb/app/README.md

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,29 @@
1+
在ThinkPHP框架中,"app"目录是用于存放应用程序的核心代码和资源的目录。它是整个应用程序的主要工作目录,包含了应用的业务逻辑、控制器、模型、视图以及其他相关组件。
2+
3+
具体来说,"app"目录通常包含以下几个子目录和文件:
4+
5+
app/adminapi:该目录包含管理端应用的控制器文件,用于处理用户请求、业务逻辑和数据交互等操作。
6+
7+
app/api:该目录包含用户端应用的控制器文件,用于处理用户请求、业务逻辑和数据交互等操作。
8+
9+
app/dao: 该目录包含数据访问对象(DAO)的类文件,用于封装数据访问操作,提供统一的数据访问接口。
10+
11+
app/http:该目录包含HTTP请求和响应跨域中间键。
12+
13+
app/jobs:该目录包含所有的消息队列任务。
14+
15+
app/kefuapi:该目录包含客服端应用的控制器文件,用于处理用户请求、业务逻辑和数据交互等操作。
16+
17+
app/lang:该目录包含语言包文件,用于支持多语言功能。
18+
19+
app/listener:该目录包含事件监听器的类文件,用于处理系统事件和事件通知。
20+
21+
app/model:该目录包含模型类文件,用于封装数据访问操作,提供统一的数据访问接口。
22+
23+
app/outapi:该目录包含对外接口应用的控制器文件,用于处理用户请求、业务逻辑和数据交互等操作。
24+
25+
app/service:该目录包含服务类文件,用于封装业务逻辑和数据交互操作,提供统一的服务接口。
26+
27+
除了上述目录外,"app"目录还可能包含其他自定义的子目录,用于组织应用的不同模块或功能。
28+
29+
总之,"app"目录是ThinkPHP应用程序的核心目录,其中的文件和目录结构定义了应用的业务逻辑、数据交互和用户界面等方面。开发者可以在该目录下编写和组织代码,实现具体的应用功能。

crmeb/app/Request.php

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -34,7 +34,7 @@ class Request extends \think\Request
3434
* @var array
3535
*/
3636
protected $except = ['menu_path', 'api_url', 'unique_auth',
37-
'description', 'custom_form', 'content', 'tableField'];
37+
'description', 'custom_form', 'content', 'tableField', 'url'];
3838

3939
/**
4040
* 获取请求的数据
@@ -118,6 +118,7 @@ public function replaceWord($farr, $str)
118118
{
119119
if (filter_var($str, FILTER_VALIDATE_URL)) {
120120
$url = parse_url($str);
121+
if (!isset($url['scheme'])) return $str;
121122
$host = $url['scheme'] . '://' . $url['host'];
122123
$str = $host . preg_replace($farr, '', str_replace($host, '', $str));
123124
} else {

crmeb/app/adminapi/README.md

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
crmeb/app/adminapi这个目录主要是后台管理系统的API接口文件。
2+
3+
具体来说:
4+
5+
- adminapi目录下的文件都是后台管理系统的控制器(Controller)文件,这些控制器被用来处理后台系统的各种请求。
6+
7+
- 每一个控制器文件对应后台管理系统某个功能模块,比如AuthController处理认证模块请求,StoreProduct处理商品模块请求等。
8+
9+
- 控制器内有各种方法,这些方法就相当于API接口,可以处理GET、POST请求,返回JSON数据。
10+
11+
- 浏览器或APP在调用这些API接口时,会发送请求到相应的控制器方法,例如登录接口请求到Login文件的login方法。
12+
13+
- 控制器处理完请求后,通过返回Response对象返回处理结果给浏览器或APP。
14+
15+
所以简单来说,adminapi目录负责后台管理系统的所有API接口,这些接口被APP或前端调用来完成各种管理操作,如查询数据、添加修改删除等。开发者在新增后台功能时,也需要在此目录增加对应的控制器和接口。
16+
17+
它实际上负责后台系统的通信交互层,解耦了后端逻辑和前端展示,采用 RESTful规范设计。

crmeb/app/adminapi/controller/Common.php

Lines changed: 58 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
namespace app\adminapi\controller;
1212

1313
use app\services\system\config\SystemConfigServices;
14+
use app\services\system\config\SystemConfigTabServices;
1415
use app\services\system\SystemAuthServices;
1516
use app\services\order\StoreOrderServices;
1617
use app\services\product\product\StoreProductServices;
@@ -22,6 +23,7 @@
2223
use app\services\user\UserServices;
2324
use crmeb\services\CacheService;
2425
use crmeb\services\HttpService;
26+
use think\facade\Config;
2527

2628
/**
2729
* 公共接口基类 主要存放公共接口
@@ -236,28 +238,28 @@ public function jnotice()
236238
$value[] = [
237239
'title' => "您有$data[ordernum]个待发货的订单",
238240
'type' => 1,
239-
'url' => '/admin/order/list?status=1'
241+
'url' => '/' . Config::get('app.admin_prefix', 'admin') . '/order/list?status=1'
240242
];
241243
}
242244
if ($data['inventory'] != 0) {
243245
$value[] = [
244246
'title' => "您有$data[inventory]个商品库存预警",
245247
'type' => 2,
246-
'url' => '/admin/product/product_list?type=5',
248+
'url' => '/' . Config::get('app.admin_prefix', 'admin') . '/product/product_list?type=5',
247249
];
248250
}
249251
if ($data['commentnum'] != 0) {
250252
$value[] = [
251253
'title' => "您有$data[commentnum]条评论待回复",
252254
'type' => 3,
253-
'url' => '/admin/product/product_reply?is_reply=0'
255+
'url' => '/' . Config::get('app.admin_prefix', 'admin') . '/product/product_reply?is_reply=0'
254256
];
255257
}
256258
if ($data['reflectnum'] != 0) {
257259
$value[] = [
258260
'title' => "您有$data[reflectnum]个提现申请待审核",
259261
'type' => 4,
260-
'url' => '/admin/finance/user_extract/index?status=0',
262+
'url' => '/' . Config::get('app.admin_prefix', 'admin') . '/finance/user_extract/index?status=0',
261263
];
262264
}
263265
return app('json')->success($this->noticeData($value));
@@ -406,5 +408,56 @@ public function saveCopyright()
406408
return app('json')->success(100000);
407409
}
408410

409-
411+
/**
412+
* 系统搜索菜单
413+
* @return \think\Response
414+
* @author 吴汐
415+
* @email 442384644@qq.com
416+
* @date 2024/2/1
417+
*/
418+
public function menusSearch()
419+
{
420+
// 从请求中获取关键字
421+
[$keyword] = $this->request->postMore([
422+
['keyword', ''],
423+
], true);
424+
// 获取系统菜单服务实例
425+
$menusServices = app()->make(SystemMenusServices::class);
426+
// 查询菜单列表
427+
$menusList = $menusServices->selectList([['menu_name', 'like', '%' . $keyword . '%'], ['auth_type', '=', 1]], 'menu_name as title,menu_path as path,id')->toArray();
428+
// 获取系统配置服务实例
429+
$configServices = app()->make(SystemConfigServices::class);
430+
// 获取系统配置标签服务实例
431+
$configTabServices = app()->make(SystemConfigTabServices::class);
432+
// 查询配置项列表
433+
$configList = $configServices->selectList([['info', 'like', '%' . $keyword . '%']], 'info as title,config_tab_id')->toArray();
434+
$configTabList = $configTabServices->selectList([['title', 'like', '%' . $keyword . '%']], 'title,id as config_tab_id')->toArray();
435+
$configAllList = array_merge($configList, $configTabList);
436+
// 获取配置项对应的标签ID
437+
$tabIds = array_unique(array_column($configAllList, 'config_tab_id'));
438+
// 查询配置项标签列表
439+
$tabList = $configTabServices->getColumn([['id', 'in', $tabIds]], 'menus_id', 'id');
440+
// 将配置项标签列表中的菜单ID与配置项列表中的菜单ID对应起来
441+
foreach ($configAllList as &$item1) {
442+
$item1['menus_id'] = $tabList[$item1['config_tab_id']] ?? 0;
443+
}
444+
// 获取配置项标签对应的菜单ID
445+
$configTabIds = array_values($tabList);
446+
// 查询配置项标签对应的菜单列表
447+
$configMenusList = $menusServices->getColumn([['id', 'in', $configTabIds]], 'menu_name as title,menu_path as path,id', 'id');
448+
// 将配置项列表中的菜单ID与配置项标签对应的菜单ID对应起来
449+
foreach ($configAllList as $item2) {
450+
$menusList[] = [
451+
'title' => $configMenusList[$item2['menus_id']]['title'] . '-' . $item2['title'],
452+
'path' => $configMenusList[$item2['menus_id']]['path'] . '?tab_id=' . $item2['config_tab_id'],
453+
'id' => $configMenusList[$item2['menus_id']]['id']
454+
];
455+
}
456+
// 将菜单列表中的路径前缀添加到每个菜单项的 path 属性上
457+
foreach ($menusList as &$item) {
458+
$item['path'] = '/' . Config::get('app.admin_prefix', 'admin') . $item['path'];
459+
}
460+
// 返回 JSON 格式的菜单列表
461+
return app('json')->success($menusList);
462+
}
410463
}

0 commit comments

Comments
 (0)