DefaultController.php 20 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470
  1. <?php
  2. namespace addons\Material\api\modules\v1\controllers;
  3. use addons\Material\common\enums\MaterialEnum;
  4. use addons\Material\common\models\MaterialCate;
  5. use addons\Material\common\models\Material;
  6. use addons\Material\common\models\MaterialDownload;
  7. use api\modules\v1\forms\user\AlipayMiniForm;
  8. use common\components\export\CsvTool;
  9. use common\components\sensitivewords\SensitiveWords;
  10. use common\enums\RabbitMqEnum;
  11. use common\enums\StatusEnum;
  12. use common\models\common\Attachment;
  13. use common\models\common\PosterCode;
  14. use common\models\user\User;
  15. use common\models\user\UserFollow;
  16. use Yii;
  17. use api\controllers\OnAuthController;
  18. use yii\db\Exception;
  19. /**
  20. * 默认控制器
  21. *
  22. * Class DefaultController
  23. * @package addons\Material\api\modules\v1\controllers
  24. */
  25. class DefaultController extends OnAuthController
  26. {
  27. public $modelClass = '';
  28. /**
  29. * 不用进行登录验证的方法
  30. *
  31. * 例如: ['index', 'update', 'create', 'view', 'delete']
  32. * 默认全部需要验证
  33. *
  34. * @var array
  35. */
  36. protected $authOptional = ['index','get-cate-list','get-material-list','download','get-config'];
  37. /**
  38. * 首页
  39. *
  40. * @return string
  41. */
  42. public function actionIndex()
  43. {
  44. return 'Hello world';
  45. }
  46. /**
  47. * ltm
  48. * 2021/12/14 14:39
  49. * 获取分类数据
  50. * @return string
  51. */
  52. public function actionGetCateList()
  53. {
  54. if (\Yii::$app->request->isGet) {
  55. $getData = \Yii::$app->request->get(); //var_dump($getData['page']);
  56. $res = Yii::$app->services->validate->validate($getData, [
  57. [['page', 'page_size', 'parent_id'], 'safe'],
  58. [['page_size'], 'default', 'value' => '15'],
  59. ]);
  60. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  61. $params['where'][] = ['mall_id' => $this->mall_id];
  62. $params['where'][] = ['>', 'status', StatusEnum::DISABLED];
  63. $params['page'] = empty($getData['page']) ? 1 : $getData['page'];
  64. $params['select'] = "id,sort,name,parent_id";
  65. $params['order'] = "sort asc";
  66. $params['limit'] = $getData['page_size'] ?? $this->pageSize;
  67. $params['where'][] = ['=', 'parent_id', $getData['parent_id'] ?? 0];
  68. $materil_cate_list = MaterialCate::listPage($params);
  69. //获取配置
  70. $data = Yii::$app->services->setting->addons->get($this->mall_id, MaterialEnum::ADDONS_NAME, 'basic');
  71. $result_array = explode(',', $data['user_level_limit']);
  72. if (in_array($this->user['level'], $result_array) || empty($data['user_level_limit'])) $config['is_audit'] = '1';
  73. else $config['is_audit'] = '0';
  74. $config['is_show_download'] = empty($data['is_show_download']) ? 0 : 1;
  75. $config['download_type'] = empty($data['download_type']) ? 0 : 1;
  76. $config['is_show_mall_bottom_nav'] = empty($data['is_show_mall_bottom_nav']) ? 0 : 1; //是否显示商城底部导航栏
  77. return $this->success('操作成功', compact('materil_cate_list', 'config'));
  78. }
  79. }
  80. /**
  81. * ltm
  82. * 2021/12/14 14:39
  83. * 获取素材列表
  84. * @return string
  85. */
  86. public function actionGetMaterialList()
  87. {
  88. if (\Yii::$app->request->isGet) {
  89. $getData = \Yii::$app->request->get();
  90. $res = Yii::$app->services->validate->validate($getData, [
  91. [['page','user_name','keyword','user_id','cate_id', 'second_cate_id', 'page_size','material_id'], 'safe'],
  92. ]);
  93. if ($res === false) return $this->error(\Yii::$app->services->validate->getErrorMessage());
  94. $params['page'] = empty($getData['page']) ? 1 : $getData['page'];
  95. $params['limit'] = empty($getData['page_size']) ? 1 : $getData['page_size'];
  96. if ($getData['user_name']) $params['where'][] = ['like', 'describe', $getData['user_name']];
  97. if ($getData['user_id']) $params['where'][] = ['=', 'user_id', $getData['user_id']];
  98. if ($getData['cate_id']) $params['where'][] = ['=', 'cate_id', $getData['cate_id']];
  99. if ($getData['second_cate_id']) $params['where'][] = ['=', 'second_cate_id', $getData['second_cate_id']];
  100. $params['where'][] = ['mall_id' => $this->mall_id];
  101. $params['where'][] = ['>','status',StatusEnum::DISABLED];
  102. $params['with'] = ['cate','goods','user'];
  103. if (!empty($this->user_id) && $getData['user_id'] == $this->user_id) {
  104. $params['order'] = 'check_status asc,id desc';
  105. } else {
  106. $params['where'][] = ['=', 'check_status', StatusEnum::ENABLED];
  107. $params['order'] = 'id desc';
  108. }
  109. $config = Yii::$app->services->setting->addons->get($this->mall_id, MaterialEnum::ADDONS_NAME, 'basic');
  110. $materil_list = Material::listPage($params);
  111. $material_id = $getData['material_id']??0;
  112. $materil_list['share_style'] = 0;
  113. if($material_id > 0 && !empty($config['share_style'])){ // 首页
  114. $materil_list['share_style'] = 1;
  115. }
  116. if($materil_list['list']){
  117. foreach ($materil_list['list'] as $k => $v) {
  118. if($v['pic_url']) {
  119. $materil_list['list'][$k]['pic_url'] = json_decode($v['pic_url']);
  120. } else {
  121. $materil_list['list'][$k]['pic_url'] = [];
  122. }
  123. $materil_list['list'][$k]['user_avatar_url'] = $v['user_avatar_url']?$v['user_avatar_url']:$v['user']['avatar_url'];
  124. $materil_list['list'][$k]['user_name'] = $v['user_name']?$v['user_name']:$v['user']['nickname'];
  125. if($v['id']==$material_id){
  126. $v['pic_url'] = json_decode($v['pic_url']);
  127. $temp_v = $v;
  128. unset( $materil_list['list'][$k]);
  129. array_unshift($materil_list['list'],$temp_v);
  130. }
  131. }
  132. if($material_id>0&&!isset($temp_v)){
  133. $where = [['id'=>$material_id],['>','status',StatusEnum::DISABLED]];
  134. if (empty($this->user_id) && $getData['user_id'] != $this->user_id) {
  135. $where[] = ['=', 'check_status', StatusEnum::ENABLED];
  136. }
  137. $material = Material::getOne($where,true,['cate','goods','user']);
  138. if(!empty($material)){
  139. if($material['pic_url']) {
  140. $material['pic_url'] = json_decode($material['pic_url']);
  141. } else {
  142. $material['pic_url'] = [];
  143. }
  144. $material['user_avatar_url'] = $material['user_avatar_url']?$material['user_avatar_url']:$material['user']['avatar_url'];
  145. $material['user_name'] = $material['user_name']?$material['user_name']:$material['user']['nickname'];
  146. array_unshift($materil_list['list'],$material);
  147. }
  148. }
  149. }
  150. return $this->success('操作成功',$materil_list);
  151. }
  152. }
  153. /**
  154. * ltm
  155. * 2021/12/14 14:39
  156. * 获取素材列表
  157. * @return string
  158. */
  159. public function actionGetConfig()
  160. {
  161. if (\Yii::$app->request->isGet) {
  162. $data = Yii::$app->services->setting->addons->get($this->mall_id, MaterialEnum::ADDONS_NAME, 'basic');
  163. $config['user_level_limit'] = $data['user_level_limit'];
  164. $config['is_audit'] = $data['is_audit'];
  165. $this->success('获取成功', compact('config'));
  166. }
  167. }
  168. /**
  169. * ltm
  170. * 2021/12/14 14:39
  171. * 提交素材
  172. * @return string
  173. */
  174. public function actionEdit()
  175. {
  176. if (\Yii::$app->request->isPost) {
  177. $params = Yii::$app->request->post();
  178. if($params['type'] == 1){ //禁用操作和删除操作和审核操作
  179. $res = Yii::$app->services->validate->validate($params, [
  180. [['id','status'],'safe']
  181. ]);
  182. }else{
  183. $res = Yii::$app->services->validate->validate($params, [
  184. [['cate_id','describe','download_type'], 'required'],
  185. [['second_cate_id', 'pic_url','id','pic_url','virtual_download_num','goods_id','thumb_url','video_url'],'safe']
  186. ]);
  187. }
  188. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  189. $params['second_cate_id'] = empty($params['second_cate_id']) ? 0 : $params['second_cate_id'];
  190. $params = Material::exceptNullVal($params);
  191. $config = Yii::$app->services->setting->addons->get($this->mall_id, MaterialEnum::ADDONS_NAME, 'basic');
  192. if($config['is_audit']=='0'){ //开启不需要审核
  193. $params['check_status'] = StatusEnum::ENABLED;
  194. }else{
  195. $params['check_status'] = StatusEnum::DISABLED;
  196. }
  197. $params['status'] = StatusEnum::ENABLED;
  198. //判断后台是否开启会员等级限制
  199. if(empty($config['user_level_limit']) && $config['user_level_limit'] === '')return $this->error('暂无发布权限');
  200. $result_array = explode(',',$config['user_level_limit']);
  201. if(!in_array($this->user['level'],$result_array)) return $this->error('暂无发布权限');
  202. $params['mall_id'] = $this->mall_id;
  203. if($params['id']) $params['updated_at'] = time(); else $params['create_at'] = time();//更新时间
  204. $params['user_id'] = $this->user_id?$this->user_id:0;
  205. //验证标题内容是否有敏感词汇
  206. if ($config['is_filter'] == '1') {
  207. $common = new SensitiveWords();
  208. $textStatus = $common->getTextStatus($params['describe'],$this->mall_id);
  209. if ($textStatus['status'] != 0) {
  210. return $this->error('敏感词过滤报错:'.$textStatus['msg']);
  211. }
  212. };
  213. if($params['pic_url']) $params['pic_url'] = json_encode($params['pic_url']);
  214. if (!empty($params['video_url']) && empty($params['thumb_url'])) return $this->error('请上传视频封面');
  215. $res = Material::setData($params);
  216. if ($res === false) throw new Exception(MaterialCate::getStaticError());
  217. return $this->success('操作成功');
  218. }
  219. }
  220. /**
  221. * @Author: ltm
  222. * @DateTime: 2022/1/18 0018 10:52
  223. * @Copyright: copyright (c) 2021 广东七件事集团
  224. * @param $data
  225. * @return string
  226. */
  227. public function actionDetail(){
  228. if (\Yii::$app->request->isGet) {
  229. $get = Yii::$app->request->get();
  230. // 检查提交的参数
  231. $res = Yii::$app->services->validate->validate($get,[
  232. [['id'], 'required'],
  233. ]);
  234. if($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  235. $where[] = ['=', 'mall_id', $this->mall_id];
  236. $where[] = ['>=', 'status', StatusEnum::DISABLED];
  237. $where[] = ['=', 'id', $get['id']];
  238. $detail = Material::getOne($where, true,['goods','user']);
  239. $detail['pic_url'] = json_decode($detail['pic_url']);
  240. return $this->success('操作成功',compact('detail'));
  241. }
  242. }
  243. /**
  244. * ltm
  245. * 2021/12/20 14:39
  246. * 提交素材
  247. * @return string
  248. */
  249. public function actionDel()
  250. {
  251. if (\Yii::$app->request->isPost) {
  252. $params = Yii::$app->request->post();
  253. $res = Yii::$app->services->validate->validate($params, [
  254. [['id'],'safe']
  255. ]);
  256. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  257. $params['status'] = StatusEnum::DELETE;
  258. $params['updated_at'] = time();
  259. $params['user_id'] = $this->user_id;
  260. $params['mall_id'] = $this->mall_id;
  261. //var_dump($params);die;
  262. $find = Material::getOne([['id'=>$params['id']]],true);
  263. if($find['user_id'] != $this->user_id) return $this->error('操作失败,你无权限操作');
  264. $res = Material::setData($params); //var_dump($res);
  265. if ($res === false) return $this->error('操作失败');//throw new Exception(MaterialCate::getStaticCodeError()['error']);
  266. return $this->success('操作成功');
  267. }
  268. }
  269. /**
  270. * ltm
  271. * 2021/12/14 14:39
  272. * 提交素材
  273. * @return string
  274. */
  275. public function actionDownload()
  276. {
  277. if (\Yii::$app->request->isPost) {
  278. $params = Yii::$app->request->post();
  279. $res = Yii::$app->services->validate->validate($params, [
  280. [['material_id'], 'required'],
  281. ]);
  282. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  283. $params['mall_id'] = $this->mall_id;
  284. $params['created_at'] = time();
  285. $params['user_id'] = $this->user_id?$this->user_id:0;
  286. $res = MaterialDownload::setData($params);
  287. if($res){
  288. $model = Material::findOne([['id'=>$params['material_id']]]);
  289. if ($model) {
  290. $model->download_num += 1;
  291. $model->save();
  292. }
  293. }
  294. if ($res === false) throw new Exception(MaterialDownload::getStaticError());
  295. return $this->success('操作成功');
  296. }
  297. }
  298. public function actionDownloadData(){
  299. try {
  300. if (!\Yii::$app->request->isPost) {
  301. return $this->error('请求错误');
  302. }
  303. $params = Yii::$app->request->post();
  304. $res = Yii::$app->services->validate->validate($params, [
  305. [['material_id'], 'required'],
  306. ]);
  307. if ($res === false) return $this->error(Yii::$app->services->validate->getErrorMessage());
  308. $material_model = Material::findOne(['id'=>$params['material_id'],'status'=>[StatusEnum::ENABLED,StatusEnum::DISABLED]]);
  309. if(empty($material_model)) return $this->error('素材不存在');
  310. $config = Yii::$app->services->setting->addons->get($this->mall_id, MaterialEnum::ADDONS_NAME, 'basic');
  311. $data = [
  312. 'download_slogans' =>'',
  313. ];
  314. if(isset($config['download_slogans'])) $data['download_slogans'] = $config['download_slogans'];
  315. $sign = $this->mall['mall_sign'];
  316. $page = '/plugins/material/index';
  317. // 之前功能设置首页或者素材都是跳转素材。这里添加跳转首页
  318. $share_style = $config['share_style'] ?? 0;
  319. if ($share_style == 1) { // 跳转首页
  320. $page = '/pages/index/index';
  321. }
  322. // 判断平台是否需要后端生成分享海报
  323. $data['avatar_url'] =$data['nickname'] = '';
  324. if(isset($this->user)){
  325. $data['avatar_url']=$this->user->avatar_url;
  326. $data['nickname']=$this->user->nickname;
  327. }
  328. $save_content = [
  329. 'pid' => $this->user_id,
  330. 'avatar_url'=>$data['avatar_url'],
  331. 'nickname'=>$data['nickname'],
  332. 'invite_mobile'=>$this->user->mobile,
  333. 'mall_id' => $this->mall_id,
  334. 'source' => User::SOURCE_MATERIAL,
  335. 'item_id' => $params['material_id'],
  336. 'cate_id' => $material_model['cate_id'],
  337. ];// 分享码保存的基本信息
  338. $poster = PosterCode::setData($this->mall_id, $this->user->id,User::SOURCE_MATERIAL, $save_content);
  339. if ($poster === false) throw new \Exception(PosterCode::getStaticError());
  340. $data['qrcode_url'] = $page . "?sign={$sign}&scene=" . $poster['code'];
  341. if (in_array($this->platform, [User::PLATFORM_WECHAT,User::PLATFORM_MP_WX,User::PLATFORM_H5,User::PLATFORM_APP,User::PLATFORM_MP_ALI])) {
  342. // 小程序生成二维码
  343. if ($this->platform == User::PLATFORM_MP_WX) {
  344. $applet_url = $this->getAppletQrCode($page, $poster['code']);// 获取小程序二维码
  345. if ($applet_url == false) return $this->error('获取小程序二维码失败');
  346. $data['applet_url'] = $applet_url;
  347. }
  348. if($this->platform == User::PLATFORM_MP_ALI){
  349. // 获取支付宝小程序二维码
  350. $applet_url = $this->getMpAliAppletQrCode($page, "sign={$sign}&scene=" . $poster['code'],$data['share_title'] ?? '');
  351. if ($applet_url == false) return $this->error('获取支付宝小程序二维码失败');
  352. $data['applet_url'] = $applet_url;
  353. }
  354. // TODO 其他平台海报由后台生成
  355. }
  356. return $this->success('操作成功',$data);
  357. }catch (\Exception $e){
  358. \Yii::error('addons\Material\api\modules\v1\controllers->actionDownloadData'.$e->getMessage());
  359. return $this->error('系统错误');
  360. }
  361. }
  362. /**
  363. * 获取小程序二维码
  364. * @Author: lun
  365. * @DateTime: 2021/12/27 0027 17:25
  366. * @Copyright: copyright (c) 2021 广东七件事集团
  367. * @param $page
  368. * @param $scene
  369. * @return mixed|void
  370. */
  371. public function getAppletQrCode($page, $scene)
  372. {
  373. $page = ltrim($page, '/');
  374. $url = '';
  375. /** @var Wechat $wechat */
  376. Yii::$app->params['wechatMiniProgramConfig'] = Yii::$app->services->setting->mall->get($this->mall_id, 'mini_program');
  377. $miniProgram = Yii::$app->wechat->miniProgram;
  378. $response = $miniProgram->app_code->getUnlimit($scene, ['width' => 200, 'page' => $page]);
  379. if ($response instanceof \EasyWeChat\Kernel\Http\StreamResponse) {
  380. if (in_array('image/jpeg', $response->getHeader('Content-Type'))) {
  381. //返回base64图片
  382. $content = 'data:image/jpg;base64,'. base64_encode($response->getBody()->getContents());
  383. $path = Yii::getAlias('@attachment') . '/download/qrcode';
  384. if (!file_exists($path)) {// 异步生成小程序图片文件夹
  385. Yii::$app->services->rabbitMq->push(RabbitMqEnum::EXCHANGE_TASK, RabbitMqEnum::TASK_QUEUE, ['path' => $path], PosterCode::class, 'mkdirQrcode');
  386. }
  387. $fileName = $this->base64_image_content($content, $path);
  388. if ($fileName == false) return false;
  389. // 图片上传到云存储
  390. $csv = new CsvTool();
  391. $url = $csv->upload($this->mall_id, 'download/qrcode/' . $fileName);
  392. $config = Yii::$app->services->attachment->getStorageConfig($this->mall_id);
  393. if ($config['drive'] != Attachment::DRIVE_LOCAL) unlink($path .'/'. $fileName);// 删除临时存储的文件
  394. } else {
  395. //返回文字
  396. return $this->error('获取失败:' . $response->getBody()->getContents());
  397. }
  398. }else{
  399. return $this->error($response['errmsg']);
  400. }
  401. return $url;
  402. }
  403. public function getMpAliAppletQrCode($page, $params,$desc = '')
  404. {
  405. $page = ltrim($page, '/');
  406. $form = new AlipayMiniForm($this->mall_id);
  407. $res = $form->qrcode($page,$params,$desc);
  408. if(!$res){
  409. return $this->error($form->getError());
  410. }
  411. return $res;
  412. }
  413. function base64_image_content($base64_image_content,$path, $fileName = ''){
  414. try {
  415. //匹配出图片的格式
  416. if (preg_match('/^(data:\s*image\/(\w+);base64,)/', $base64_image_content, $result)){
  417. $type = $result[2];
  418. if(!file_exists($path)){
  419. //检查是否有该文件夹,如果没有就创建,并给予最高权限
  420. mkdir($path, 0777, true);
  421. }
  422. $fileName = !empty($fileName) ? $fileName : md5(microtime(true));
  423. if (file_put_contents($path . '/' . $fileName. ".{$type}", base64_decode(str_replace($result[1],'', $base64_image_content)))){
  424. return $fileName . ".{$type}";
  425. }else{
  426. return false;
  427. }
  428. }else{
  429. return false;
  430. }
  431. } catch (\Exception $e) {
  432. // echo $e->getMessage();
  433. return false;
  434. }
  435. }
  436. }