Portal.php 9.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227
  1. <?php
  2. namespace app\controller\v2;
  3. use app\extra\basic\Base;
  4. use app\extra\service\blue\ExpertPlatformService;
  5. use app\extra\service\blue\TaskService;
  6. use app\extra\tools\IpRegion;
  7. use app\middleware\WxMiddleware;
  8. use app\model\blue\BlueBanner;
  9. use app\model\blue\BlueCategory;
  10. use app\model\blue\BlueExpertGroup;
  11. use app\model\blue\BlueExpertPlatform;
  12. use app\model\blue\BlueIncomeMon;
  13. use app\model\blue\BlueTaskRevenue;
  14. use app\model\blue\BlueTaskUser;
  15. use app\model\blue\BlueUserOpen;
  16. use DI\Attribute\Inject;
  17. use LinFly\Annotation\Route\Controller;
  18. use LinFly\Annotation\Route\Middleware;
  19. use LinFly\Annotation\Route\Route;
  20. use support\Request;
  21. use support\Response;
  22. #[Controller(prefix: "/wx_v2/portal"),Middleware(WxMiddleware::class)]
  23. class Portal extends Base
  24. {
  25. protected array $noNeedLogin = ['getPortal','getStarList'];
  26. #[Inject]
  27. protected TaskService $service;
  28. /**
  29. * 小程序首页信息
  30. * @param Request $request
  31. * @return Response
  32. */
  33. #[Route(path: "home",methods: "get")]
  34. public function getPortal(Request $request): Response
  35. {
  36. try {
  37. $param = $this->_valid([
  38. "category.default" => 0,
  39. "size.default" => 10,
  40. "page.default" => 1,
  41. ],$request->method());
  42. $banner = (new BlueBanner)->where("status",1)->field("title,img,path")->select()->toArray();
  43. $category = (new BlueCategory)->where("type",1)->field("name,icon,small_icon,sign")->append(['id'])->withAttr(['id' => function($data,$resp){
  44. return $resp['sign'];
  45. }])->select()->toArray();
  46. if (empty($param['category']) || $param['category'] == 0) {
  47. $param['category'] = $category[0]['id'];
  48. }
  49. $share = [
  50. "image" => sConf("wechat.share"),
  51. "title" => sConf("wechat.share_title")
  52. ];
  53. $rank = [];
  54. $star = (new BlueExpertPlatform)->order("create_at","desc")->field("source,nickname,avatar,follower_count,uid,create_at")->limit(10)->select()->toArray();
  55. $list = $this->service->getHomeList(['category' => $param['category'],'pageSize' => $param['size'],'page' => $param['page']]);
  56. $task = pageFormat($list);
  57. return success("ok",compact("banner","category",'task','share','rank','star'));
  58. } catch (\Throwable $throwable) {
  59. return error($throwable->getMessage());
  60. }
  61. }
  62. /**
  63. * 达人之家
  64. * @param Request $request
  65. * @return Response
  66. */
  67. #[Route(path: "star",methods: "get")]
  68. public function getStarList(Request $request): Response
  69. {
  70. try {
  71. $param = $this->_valid([
  72. "nick.default" => "",
  73. "source.default" => ""
  74. ],$request->method());
  75. if (!is_array($param)) return error($param);
  76. $data = (new ExpertPlatformService)->getListStar($param,"uid,nickname,avatar,follower_count,unique_id,openid,source");
  77. if (empty($data)) return successTrans("success.data",$data);
  78. $list = [];
  79. foreach ($data as $key=>$val) {
  80. $list[$key] = [
  81. "uid" => $val['uid'],
  82. "nickname" => $val['nickname'],
  83. "avatar" => $val['avatar'],
  84. "source" => $val['source'],
  85. "follower" => formatMoneyKw($val['follower_count']),
  86. "income" => 0,
  87. "job" => count($val['job']),
  88. "level" => [
  89. "name" => $val['user']['level']['name']??'-',
  90. "num" => $val['user']['level']['level']??0
  91. ],
  92. ];
  93. }
  94. $monIncome = (new BlueIncomeMon)->where("mon")->sum("money");
  95. $lastMonIncome = (new BlueIncomeMon)->where("mon",date("Ym",strtotime("-1 mon")))->sum("money");
  96. $total = [
  97. "join" => (new BlueExpertPlatform)->count(),
  98. "join_mon" => (new BlueExpertPlatform)->whereMonth("create_at")->count(),
  99. "auth" => (new BlueExpertPlatform)->where("status",1)->count(),
  100. "income" => $monIncome,
  101. "income_rate" => $lastMonIncome > 0 ? (($monIncome - $lastMonIncome) / $lastMonIncome * 100) : 100
  102. ];
  103. return successTrans("success.data",compact("list","total"));
  104. } catch (\Throwable $throwable) {
  105. return error($throwable->getMessage());
  106. }
  107. }
  108. /**
  109. * 个人主页
  110. * @param Request $request
  111. * @return Response
  112. */
  113. #[Route(path: "person",methods: "get")]
  114. public function getHomePage(Request $request): Response
  115. {
  116. try {
  117. $param = $this->_valid([
  118. "uid.require" => trans("empty.require"),
  119. ],$request->method());
  120. if (!is_array($param)) return error($param);
  121. $data = (new BlueExpertPlatform)->where("uid",$param["uid"])->findOrEmpty();
  122. if ($data->isEmpty()) return error("达人不存在");
  123. $platform = (new BlueCategory)->where(["type" =>1,"status" => 1])->with(['platform' => function($query) use($data){
  124. $query->where("openid",$data['openid'])->field("source,nickname,avatar,follower_count,unique_id");
  125. }])->field("name,icon,sign")->select();
  126. $userData = (new BlueUserOpen)->where("openid",$data['openid'])->field("nickname,headimg,openid,create_ip")->with(['star' => function($query) {
  127. $query->field("openid,group_id,level_exp")->with(['level' => function($query) {
  128. $query->field("id,level,name,exp");
  129. }]);
  130. }])->append(['level',"tags"])->withAttr([
  131. "tags" => function ($query,$resp) {
  132. $fans = (new BlueExpertPlatform)->where("openid",$resp['openid'])->sum("follower_count");
  133. $income = (new BlueTaskRevenue)->where("openid",$resp['openid'])->sum("indicator_agg_data_20022");
  134. return [
  135. [
  136. "name" => "任务",
  137. "value" => (new BlueTaskUser)->where("openid",$resp['openid'])->where("status",'in',[1,3])->count(),
  138. ],
  139. [
  140. "name" => "收益(元)",
  141. "value" => formatMoneyKw($income/1000)
  142. ],
  143. [
  144. "name" => "粉丝",
  145. "value" => formatMoneyKw($fans),
  146. ],
  147. [
  148. "name" => "消耗",
  149. "value" => "0.00",
  150. ]
  151. ];
  152. },
  153. "level" => function($query,$resp) {
  154. if ($resp['star']) {
  155. return [
  156. "level_num" => $resp['star']['level']['level']??'0',
  157. "level_name" => $resp['star']['level']['name']??'0'
  158. ];
  159. } else {
  160. return [];
  161. }
  162. }
  163. ])->findOrEmpty();
  164. if ($userData->isEmpty()) return errorTrans("error.data");
  165. $user = $userData->toArray();
  166. $ip = new IpRegion();
  167. $user['ip_address'] = $ip->setIp($user['create_ip'])->getProvince();
  168. unset($user['star'],$user['openid'],$user['create_ip']);
  169. return successTrans("success.data",compact("platform","user"));
  170. } catch (\Throwable $throwable) {
  171. return error($throwable->getMessage());
  172. }
  173. }
  174. /**
  175. * 排行榜
  176. * @param Request $request
  177. * @return Response
  178. */
  179. #[Route(path: "rank",methods: "get")]
  180. public function getRankData(Request $request): Response
  181. {
  182. try {
  183. $param = $this->_valid([
  184. "type.default" => 'income'
  185. ],$request->method());
  186. if (!is_array($param)) return error($param);
  187. $data = [
  188. [
  189. "name" => "迅猛龙",
  190. "avatar" => "https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-i-0813_owAAafIQICAgfidek5L06cAeEp0mmDA1GIc2AF.jpeg?from=2956013662",
  191. "val" => "29.3w",
  192. "index" => 1
  193. ],
  194. [
  195. "name" => "迅猛龙2",
  196. "avatar" => "https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-i-0813_owAAafIQICAgfidek5L06cAeEp0mmDA1GIc2AF.jpeg?from=2956013662",
  197. "val" => "29.1w",
  198. "index" => 2
  199. ]
  200. ];
  201. $self = [
  202. [
  203. "name" => "迅猛龙2",
  204. "avatar" => "https://p3-pc.douyinpic.com/aweme/1080x1080/aweme-avatar/tos-cn-i-0813_owAAafIQICAgfidek5L06cAeEp0mmDA1GIc2AF.jpeg?from=2956013662",
  205. "val" => "29.1w",
  206. "index" => 0
  207. ]
  208. ];
  209. return successTrans("success.data",compact("data","self"));
  210. } catch (\Throwable $throwable) {
  211. return error($throwable->getMessage());
  212. }
  213. }
  214. }