zory 2 月之前
父节点
当前提交
9092cbbd4f

+ 111 - 0
app/controller/admin/Banner.php

@@ -0,0 +1,111 @@
+<?php
+
+namespace app\controller\admin;
+
+use app\extra\basic\Base;
+use app\extra\service\blue\BannerService;
+use app\middleware\AuthMiddleware;
+use app\model\blue\BlueBanner;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Middleware;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+
+
+#[Controller(prefix: "/api/banner"),Middleware(AuthMiddleware::class)]
+class Banner extends Base
+{
+
+    #[Inject]
+    protected BannerService $service;
+
+    #[Inject]
+    protected BlueBanner $model;
+
+
+    #[Route(path: "list",methods: "get")]
+    public function getDataList(Request $request): Response
+    {
+        try {
+            $param = $request->all();
+            $list = $this->service->getList($param);
+            return successTrans("success.data",pageFormat($list),200);
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 编辑信息
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "save",methods: "post")]
+    public function setListData(Request $request): Response
+    {
+        try {
+            $param = $request->post();
+            $state = $this->model->setAutoData($param);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+    /**
+     * 批量操作
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "batch",methods: "post")]
+    public function setGoodsBatch(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => "参数错误",
+                "value.require"     => "参数错误",
+                "field.require"     => "参数错误",
+                "type.require"      => "参数错误"
+            ],"post");
+            if (!is_array($param)) return error($param);
+            if ($param['type'] == "batch") {
+                $state = $this->model->where("id","in",$param['id'])->save([$param['field'] => $param['value']]);
+            } else {
+                $state = $this->model->where("id",$param['id'])->save([$param['field'] => $param['value']]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    /**
+     * 删除
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "del",methods: "post")]
+    public function delData(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "id.require"        => "参数错误",
+            ],"post");
+            if (!is_array($param)) return error($param);
+            $data = $this->model->where("id",$param['id'])->findOrEmpty();
+            if ($data->isEmpty()) return errorTrans("empty.data");
+            $state = $data->delete();
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+}

+ 110 - 0
app/controller/api/Account.php

@@ -0,0 +1,110 @@
+<?php
+
+namespace app\controller\api;
+
+use app\extra\basic\Base;
+use app\middleware\WxMiddleware;
+use app\model\blue\BlueCategory;
+use app\model\blue\BlueExpertPlatform;
+use DI\Attribute\Inject;
+use LinFly\Annotation\Route\Controller;
+use LinFly\Annotation\Route\Middleware;
+use LinFly\Annotation\Route\Route;
+use support\Request;
+use support\Response;
+
+
+#[Controller(prefix: "/wx_api/platform"),Middleware(WxMiddleware::class)]
+class Account extends Base
+{
+
+    protected array $noNeedLogin = ['getAccountDetail'];
+
+    #[Inject]
+    protected BlueExpertPlatform $model;
+
+    /**
+     * 绑定账号列表
+     * @return Response
+     */
+    #[Route(path: "list",methods: "get")]
+    public function getAccountList(Request $request): Response
+    {
+        try {
+            $category = (new BlueCategory)->where("status",1)->where("type",1)->field("sign,name,icon")->select();
+            if ($category->isEmpty()) return success("success.data");
+            $platform = [];
+            foreach ($category as $key=>$val)
+            {
+                $platform[$key] = $val;
+                $bind = $this->model->where("source",$val['sign'])->where("openid",$request->user['openid'])->findOrEmpty();
+                if ($bind->isEmpty()) {
+                    $bindState = 0;
+                } else {
+                    $bindState = $bind['status'] + 1;
+                }
+                $platform[$key]['is_bind'] = $bindState;
+            }
+            return successTrans("success.data",$platform);
+        } catch (\Throwable $th) {
+            return error($th->getMessage());
+        }
+    }
+
+    /**
+     * 查看绑定详情
+     * @return Response
+     */
+    #[Route(path: "detail",methods: "get")]
+    public function getAccountDetail(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "source.require"    => trans("empty.require")
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $platform = $this->model->where(['openid' => $request->user['openid'],'source' => $param['source']])->field("id,nickname,home_page,status,url,source")->findOrEmpty();
+            if ($platform->isEmpty()) return successTrans("success.data");
+            return successTrans("success.data",$platform->toArray());
+        } catch (\Throwable $th) {
+            return error($th->getMessage());
+        }
+    }
+
+
+    #[Route(path: "bind",methods: "post")]
+    public function bindAccount(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "nickname.require"  => trans("empty.require"),
+                "url.require"       => trans("empty.require"),
+                "home.require"      => trans("empty.require"),
+                "source.require"    => trans("empty.require")
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $platform = $this->model->where(['openid' => $request->user['openid'],'source' => $param['source']])->findOrEmpty();
+            if (!$platform->isEmpty()) {
+                if ($platform['status'] <= 2) return error("请勿重复提交");
+                $platform->nickname = $param['nickname'];
+                $platform->url = $param['url'];
+                $platform->home_page = $param['home'];
+                $platform->status = 0; // 重置状态
+                $state = $platform->save();
+            } else {
+                $state = $platform->insertGetId([
+                    "nickname"  => $param['nickname'],
+                    "url"       => $param['url'],
+                    "home_page" => $param['home'],
+                    "source"    => $param['source'],
+                    "openid"    => $request->user['openid']
+                ]);
+            }
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $th) {
+            return error($th->getMessage());
+        }
+    }
+
+}

+ 2 - 1
app/controller/api/Auth.php

@@ -3,6 +3,7 @@
 namespace app\controller\api;
 
 use app\extra\basic\Base;
+use app\extra\tools\CodeExtend;
 use app\extra\weMini\Crypt;
 use app\middleware\WxMiddleware;
 use app\model\blue\BlueUserOpen;
@@ -45,7 +46,7 @@ class Auth extends Base
             $map = ['openid' => $userinfo['openid']];
             $userOpen = $this->model->where($map)->findOrEmpty();
             if ($userOpen->isEmpty()) {
-                $userOpen->insertGetId(['openid' => $userinfo['openid'],"create_ip" => $request->getRealIp(),"nickname" => "wx_微信用户","headimg" => "https://blue-data.oss-cn-guangzhou.aliyuncs.com/logo.png"]);
+                $userOpen->insertGetId(['openid' => $userinfo['openid'],"create_ip" => $request->getRealIp(),"nickname" => "wx_".strtoupper(CodeExtend::random(5,3)),"headimg" => "https://blue-data.oss-cn-guangzhou.aliyuncs.com/logo.png"]);
                 $userOpen = $this->model->where($map)->findOrEmpty();
             }
             $userAuth = get_object_vars(AuthMode::guard("member")->login($userOpen->toArray()));

+ 25 - 1
app/controller/api/Portal.php

@@ -3,7 +3,12 @@
 namespace app\controller\api;
 
 use app\extra\basic\Base;
+use app\extra\service\blue\TaskService;
 use app\middleware\WxMiddleware;
+use app\model\blue\BlueBanner;
+use app\model\blue\BlueCategory;
+use app\model\blue\BlueTask;
+use DI\Attribute\Inject;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Middleware;
 use LinFly\Annotation\Route\Route;
@@ -15,6 +20,10 @@ use support\Response;
 class Portal extends Base
 {
 
+    protected array $noNeedLogin = ['getPortal'];
+
+    #[Inject]
+    protected TaskService $service;
 
     /**
      * 小程序首页信息
@@ -25,7 +34,22 @@ class Portal extends Base
     public function getPortal(Request $request): Response
     {
         try {
-
+            $param = $this->_valid([
+                "tid.default"       => 0,
+                "category.default"  => "",
+                "size.default"      => 10,
+                "page.default"      => 1,
+            ],$request->method());
+            $banner = (new BlueBanner)->where("status",1)->field("title,img,path")->select()->toArray();
+            $category = (new BlueCategory)->where("type",1)->field("name,icon,small_icon,sign")->append(['id'])->withAttr(['id' => function($data,$resp){
+                return $resp['sign'];
+            }])->select()->toArray();
+            if (empty($param['category'])) {
+                $param['category'] = $category[0]['id'];
+            }
+            $list = $this->service->getHomeList(['category' => $param['category'],'pageSize' => $param['size'],'page' => $param['page']]);
+            $task = pageFormat($list);
+            return success("ok",compact("banner","category",'task'));
         } catch (\Throwable $throwable) {
             return error($throwable->getMessage());
         }

+ 71 - 0
app/controller/api/Task.php

@@ -3,7 +3,12 @@
 namespace app\controller\api;
 
 use app\extra\basic\Base;
+use app\extra\service\blue\TaskService;
 use app\middleware\WxMiddleware;
+use app\model\blue\BlueExpertPlatform;
+use app\model\blue\BlueTask;
+use app\model\blue\BlueTaskUser;
+use DI\Attribute\Inject;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Middleware;
 use LinFly\Annotation\Route\Route;
@@ -16,6 +21,15 @@ class Task extends Base
 {
 
 
+    protected array $noNeedLogin = [];
+
+
+    #[Inject]
+    protected TaskService $service;
+
+    #[Inject]
+    protected BlueTask $model;
+
     /**
      * 任务列表
      * @param Request $request
@@ -31,4 +45,61 @@ class Task extends Base
         }
     }
 
+
+    /**
+     * 任务详情
+     * @param Request $request
+     * @return Response
+     */
+    #[Route(path: "detail",methods: "get")]
+    public function getTaskDetail(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "task_sn.require"   => trans("empty.require"),
+                "id.require"        => trans("empty.require"),
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $data = $this->service->getTaskDetail($param);
+            if (empty($data)) return errorTrans("empty.data");
+            return success("ok",$data->toArray());
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
+
+    #[Route(path: "sign",methods: "post")]
+    public function taskUserReg(Request $request): Response
+    {
+        try {
+            $param = $this->_valid([
+                "task_sn.require"   => trans("empty.require"),
+                "task_id.require"   => trans("empty.require"),
+                "url.require"       => trans("empty.require"),
+                "image.require"     => trans("empty.require"),
+            ],$request->method());
+            if (!is_array($param)) return error($param);
+            $task = $this->model->where(['task_sn' => $param['task_sn'],'id' => $param['task_id']])->findOrEmpty();
+            if ($task->isEmpty()) return errorTrans("empty.data");
+            $platformUser = (new BlueExpertPlatform)->where(['openid' => $request->user['openid'],"source" => $task['category'],"status" => 1])->findOrEmpty();
+            if ($platformUser->isEmpty()) return error("请先完成平台绑定");
+            $taskUser = (new BlueTaskUser)->where(['openid' => $request->user['openid'],'task_sn' => $param['task_sn'],'id' => $param['task_id']])->findOrEmpty();
+            if (!$taskUser->isEmpty()) return error("请勿重复提交");
+            $state = $taskUser->insertGetId([
+                "openid"    => $request->user['openid'],
+                "task_id"   => $param['task_id'],
+                "task_sn"   => $param['task_sn'],
+                "source"    => $task['category'],
+                "platform"  => json_encode($platformUser->toArray()),
+                "url"       => $task['category'],
+                "image"     => $task['image'],
+            ]);
+            if (!$state) return errorTrans("error.data");
+            return successTrans("success.data");
+        } catch (\Throwable $throwable) {
+            return error($throwable->getMessage());
+        }
+    }
+
 }

+ 2 - 20
app/controller/api/Uploads.php

@@ -5,7 +5,6 @@ namespace app\controller\api;
 use app\extra\basic\Base;
 use app\extra\tools\UploadExtend;
 use app\middleware\WxMiddleware;
-use app\model\saas\SaasUpload;
 use LinFly\Annotation\Route\Controller;
 use LinFly\Annotation\Route\Route;
 use support\Request;
@@ -17,16 +16,6 @@ class Uploads extends Base
 {
 
 
-    #[Route(path: "temp",methods: "post")]
-    public function getCosTemp()
-    {
-        try {
-
-        } catch (\Throwable $throwable) {
-            return error($throwable->getMessage());
-        }
-    }
-
     /**
      * 上传文件
      * @param Request $request
@@ -36,15 +25,8 @@ class Uploads extends Base
     public function uploadData(Request $request): Response
     {
         try {
-            $param = $request->post();
-            $resp = UploadExtend::disk(UploadExtend::MODE_LOCAL)->uploadFile();
-            events("clear-upload",['key' => $param['key']]);
-            (new SaasUpload())->insertGetId([
-                "key"       => $param['key'],
-                "path"      => $resp[0]['url'],
-                "agent_id"  => $param['shop']
-            ]);
-            if (!isset($resp[0]['url'])) return errorTrans(40010);
+            $resp = UploadExtend::uploadFile();
+            if (!isset($resp[0]['url'])) return errorTrans("error.upload");
             return successTrans("success.data",[
                 "fileName"  => $resp[0]['origin_name'],
                 "src"       => $resp[0]['url'],

+ 0 - 30
app/controller/api/User.php

@@ -53,34 +53,4 @@ class User extends Base
         }
     }
 
-
-    /**
-     * 价目表
-     */
-    #[Route(path: "price",methods: "get")]
-    public function getPriceData(): Response
-    {
-        try {
-            $param = $this->_valid([
-                "shop.require"  => "参数错误"
-            ]);
-            if (!is_array($param)) return error($param);
-            $data = (new SaasPrice)->where("shop_id",$param['shop'])->field("paper_size,source,duplex,price,color,type")->select();
-            if ($data->isEmpty()) return error("尚未配置价目表");
-            $resp = [];
-            foreach ($data as $key=>$val)
-            {
-                $color = $this->color[$val['color']];
-                $type = $this->type[$val['type']];
-                $duplex = $this->duplex[$val['duplex']];
-                $resp[$val['paper_size']]['id'] = $val['paper_size'];
-                $resp[$val['paper_size']]['child'][$key]['name'] = $type.$color.$duplex;
-                $resp[$val['paper_size']]['child'][$key]['price'] = $val['price'];
-            }
-            return success("ok",$resp);
-        } catch (\Throwable $exception) {
-            return error($exception->getMessage());
-        }
-    }
-
 }

+ 39 - 0
app/extra/service/blue/BannerService.php

@@ -0,0 +1,39 @@
+<?php
+
+namespace app\extra\service\blue;
+
+use app\extra\basic\Service;
+use app\model\blue\BlueBanner;
+
+class BannerService extends Service
+{
+
+
+    /**
+     * 列表
+     * @param array $param
+     */
+    public function getList(array $param = [])
+    {
+        $this->mode = new BlueBanner();
+        return $this->searchVal($param,$this->searchFilter($param))->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+    /**
+     *
+     * @param array $param
+     * @return array
+     */
+    public function searchFilter(array $param = []): array
+    {
+        $filter = [];
+        !empty($param['type']) && $filter[] = ["type", '=', $param['type']];
+        !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
+        !empty($param['name']) && $filter[] = ["title", 'like', "%{$param['name']}%"];
+        return $filter;
+    }
+
+}

+ 43 - 0
app/extra/service/blue/TaskService.php

@@ -26,6 +26,46 @@ class TaskService extends Service
         ]);
     }
 
+
+    public function getHomeList(array $param = [])
+    {
+        $this->mode = new BlueTask();
+        return $this->searchVal($param,$this->searchFilter($param))->append(['progress','total_budget_format'])->withAttr(['progress' => function ($data,$resp) {
+            if ($resp['sign_number'] == 0) return $resp['sign_number'];
+            return ceil($resp['sign_number']/$resp['need_number'] * 100);
+        },'total_budget_format' => function($data,$resp) {
+            return formatMoneyKw($resp['total_budget']/100);
+        }])->with(['categoryJoin' => function ($query) {
+            $query->field("sign,name,icon,small_icon");
+        },'levelJoin' => function($query){
+            $query->field("id,name,level");
+        }])->field("id,title,task_sn,product_cover_url,total_budget,sign_number,need_number,category,level,sys_level,product_price")->paginate([
+            "list_rows" => $param['pageSize'],
+            "page"      => $param['page']
+        ]);
+    }
+
+    /**
+     * 任务详情
+     * @param array $param
+     */
+    public function getTaskDetail(array $param = [])
+    {
+        $this->mode = new BlueTask();
+        return $this->searchVal($param,$this->searchFilter($param))->append(['progress','total_budget_format','price_format'])->withAttr(['progress' => function ($data,$resp) {
+            if ($resp['sign_number'] == 0) return $resp['sign_number'];
+            return ceil($resp['sign_number']/$resp['need_number'] * 100);
+        },'total_budget_format' => function($data,$resp) {
+            return formatMoneyKw($resp['total_budget']/100);
+        },'price_format' => function($data,$resp){
+            return formatMoneyKw($resp['product_price']/100);
+        }])->with(['categoryJoin' => function ($query) {
+            $query->field("sign,name,icon,small_icon");
+        },'levelJoin' => function($query){
+            $query->field("id,name,level");
+        }])->find();
+    }
+
     /**
      *
      * @param array $param
@@ -34,7 +74,10 @@ class TaskService extends Service
     public function searchFilter(array $param = []): array
     {
         $filter = [];
+        !empty($param['id']) && $filter[] = ["id", '=', $param['id']];
+        !empty($param['task_sn']) && $filter[] = ["task_sn", '=', $param['task_sn']];
         !empty($param['type']) && $filter[] = ["type", '=', $param['type']];
+        !empty($param['category']) && $filter[] = ["category", '=', $param['category']];
         !empty($param['status']) && $filter[] = ["status", '=', $param['status']];
         !empty($param['name']) && $filter[] = ["name", 'like', "%{$param['name']}%"];
         return $filter;

+ 51 - 1
app/extra/tools/XcJob.php

@@ -26,6 +26,56 @@ class XcJob
     }
 
     /**
+     * 获取达人投稿视频消耗数据
+     * https://www.xingtu.cn/gw/api/task/provider_get_star_task_item_list
+     * POST
+     * {"page":1,"limit":10,"query":{"provider_confirmed":false,"task_search_key":"7628487095040311348","qc_metrics_time_range_param":{"start_time":"1762963200000","end_time":"1778687999000"}}}
+     * @return array
+     */
+    public function getAuthorVideo(string $jobId = "",int $page = 1,int $size = 10): array
+    {
+        $param = [
+            "page"  => $page,
+            "limit" => $size,
+            "query" => [
+                "provider_confirmed"    => false,
+                "task_search_key"       => $jobId,
+                "qc_metrics_time_range_param"   => [
+                    "start_time"    => strtotime(date("Y-m-d 00:00:00",strtotime("-180 day"))) * 1000,
+                    "end_time"      => strtotime(date("Y-m-d 23:59:59")) * 1000,
+                ]
+            ]
+        ];
+        $resp = Http::withHeaders($this->header)->post("https://www.xingtu.cn/gw/api/task/provider_get_star_task_item_list",$param)->array();
+        if ($resp['base_resp']['status_code'] <> 0) return [0,'获取数据失败'];
+        return [1,['total' => $resp['pagination']['total_count'],'has_more' => $resp['pagination']['has_more'],'list' => $resp['item_list']]];
+    }
+
+    /**
+     * 生成邀约达人参与任务二维码
+     * @param string $jobId
+     * @return array
+     */
+    public function createJobQrcode(string $jobId = ""): array
+    {
+        $param = [
+            "template_id"   => "7550880075256709158",
+            "placeholder_params"    => [
+                "challenge_id"  => $jobId,
+                "provider_id"   => "1829709687645195",
+                "utm_medium"    => "xingtu_provider_star_qc_unite_invite"
+            ],
+            "expired_time"  => strtotime("+1 year"), // 有效期1年
+            "event_id"      => $jobId,
+            "share_type"    => 4
+        ];
+        $resp = Http::withHeaders($this->header)->post("https://www.xingtu.cn/gw/api/fe_common_service/share/info",$param)->array();
+        if ($resp['base_resp']['status_code'] <> 0) return [0,'生成失败'];
+        return [1,"https://www.xingtu.cn/share/{$resp['share_id']}?hide_nav_bar=1&hide_status_bar=1&should_full_screen=1&utm_source=share_4&session_track_id={$resp['share_id']}"];
+    }
+
+    /**
+     * 星川任务详情
      * @param string $jobId
      * @return array
      */
@@ -37,6 +87,6 @@ class XcJob
 
     protected function getCookie(): string
     {
-        return "passport_csrf_token=dc2c5075e29c15785b2433afb8d9dd10; passport_csrf_token_default=dc2c5075e29c15785b2433afb8d9dd10; is_staff_user=false; has_biz_token=false; x-web-secsdk-uid=f676fb7e-81a3-42e2-b9e1-73c0ea919aea; csrf_session_id=5499e75e3f1f76a628c1efa81b7c89b3; tt_webid=7637860647254296090; Hm_lvt_5d77c979053345c4bd8db63329f818ec=1778328034; HMACCOUNT=DE9169EBCCD81810; Hm_lpvt_5d77c979053345c4bd8db63329f818ec=1778328167; passport_auth_status=93b289d15b8bb4866b32877a48a3b4b6%2C3a1cc997a270fa7b4f4fb3c3a79939fd; passport_auth_status_ss=93b289d15b8bb4866b32877a48a3b4b6%2C3a1cc997a270fa7b4f4fb3c3a79939fd; sid_guard=2cf53e24db19ce7e1d9094d82a7e0a15%7C1778328219%7C5184002%7CWed%2C+08-Jul-2026+12%3A03%3A41+GMT; uid_tt=b918d45f40210fd4799129be8d1e7ae1; uid_tt_ss=b918d45f40210fd4799129be8d1e7ae1; sid_tt=2cf53e24db19ce7e1d9094d82a7e0a15; sessionid=2cf53e24db19ce7e1d9094d82a7e0a15; sessionid_ss=2cf53e24db19ce7e1d9094d82a7e0a15; session_tlb_tag=sttt%7C15%7CLPU-JNsZzn4dkJTYKn4KFf_________SootvJEGr4tH2rLd7KSvG3gY4xtecQgysyxyTbEgz9BA%3D; sid_ucp_v1=1.0.0-KDlkNjI4ZDI4NTI2OTEyMzJiYWNjYTQwYzIyNmZlOWM5OTA0MjU3MjkKFwiUv5Cvv8yyBxCbxfzPBhj6EzgCQPEHGgJscSIgMmNmNTNlMjRkYjE5Y2U3ZTFkOTA5NGQ4MmE3ZTBhMTU; ssid_ucp_v1=1.0.0-KDlkNjI4ZDI4NTI2OTEyMzJiYWNjYTQwYzIyNmZlOWM5OTA0MjU3MjkKFwiUv5Cvv8yyBxCbxfzPBhj6EzgCQPEHGgJscSIgMmNmNTNlMjRkYjE5Y2U3ZTFkOTA5NGQ4MmE3ZTBhMTU; star_sessionid=d56971486bfb11538b9640768581fe1a";
+        return "passport_csrf_token=dc2c5075e29c15785b2433afb8d9dd10; passport_csrf_token_default=dc2c5075e29c15785b2433afb8d9dd10; is_staff_user=false; has_biz_token=false; x-web-secsdk-uid=f676fb7e-81a3-42e2-b9e1-73c0ea919aea; csrf_session_id=5499e75e3f1f76a628c1efa81b7c89b3; tt_webid=7637860647254296090; Hm_lvt_5d77c979053345c4bd8db63329f818ec=1778328034; HMACCOUNT=DE9169EBCCD81810; passport_auth_status=93b289d15b8bb4866b32877a48a3b4b6%2C3a1cc997a270fa7b4f4fb3c3a79939fd; passport_auth_status_ss=93b289d15b8bb4866b32877a48a3b4b6%2C3a1cc997a270fa7b4f4fb3c3a79939fd; uid_tt=b918d45f40210fd4799129be8d1e7ae1; uid_tt_ss=b918d45f40210fd4799129be8d1e7ae1; sid_tt=2cf53e24db19ce7e1d9094d82a7e0a15; sessionid=2cf53e24db19ce7e1d9094d82a7e0a15; sessionid_ss=2cf53e24db19ce7e1d9094d82a7e0a15; Hm_lpvt_5d77c979053345c4bd8db63329f818ec=1778501158; sid_guard=2cf53e24db19ce7e1d9094d82a7e0a15%7C1778501177%7C5184000%7CFri%2C+10-Jul-2026+12%3A06%3A17+GMT; session_tlb_tag=sttt%7C14%7CLPU-JNsZzn4dkJTYKn4KFf_________UDv5aLsuhDiFj6DTslfpmqljmlqIjrEWo6QWJ6REal5U%3D; sid_ucp_v1=1.0.0-KDMyOTUxMzAzNDFkZjFjMzBmYzYyNWJjNGU3YTFiYTcwODYyOGJjZjAKFwiUv5Cvv8yyBxC5jIfQBhj6EzgCQPEHGgJscSIgMmNmNTNlMjRkYjE5Y2U3ZTFkOTA5NGQ4MmE3ZTBhMTU; ssid_ucp_v1=1.0.0-KDMyOTUxMzAzNDFkZjFjMzBmYzYyNWJjNGU3YTFiYTcwODYyOGJjZjAKFwiUv5Cvv8yyBxC5jIfQBhj6EzgCQPEHGgJscSIgMmNmNTNlMjRkYjE5Y2U3ZTFkOTA5NGQ4MmE3ZTBhMTU; star_sessionid=485fed1891a1b504a23ee3ce76ccd568";
     }
 }

+ 47 - 0
app/model/blue/BlueBanner.php

@@ -0,0 +1,47 @@
+<?php
+
+namespace app\model\blue;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property string $title 
+ * @property string $img 
+ * @property string $path 
+ * @property integer $status 
+ * @property mixed $create_at 创建时间
+ */
+class BlueBanner extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "blue_banner";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

+ 6 - 0
app/model/blue/BlueTask.php

@@ -57,4 +57,10 @@ class BlueTask extends Model
         return $this->hasOne(BlueCategory::class,'sign','category');
     }
 
+
+    public function levelJoin(): HasOne
+    {
+        return $this->hasOne(BlueExpertLevel::class,'id','level');
+    }
+
 }

+ 50 - 0
app/model/blue/BlueTaskUser.php

@@ -0,0 +1,50 @@
+<?php
+
+namespace app\model\blue;
+
+use app\extra\basic\Model;
+
+
+/**
+ * @property integer $id (主键)
+ * @property mixed $openid 
+ * @property integer $task_id 
+ * @property mixed $task_sn 
+ * @property mixed $platform 
+ * @property string $image 
+ * @property string $url 
+ * @property integer $status 
+ * @property mixed $create_at 创建时间
+ */
+class BlueTaskUser extends Model
+{
+    /**
+     * The connection name for the model.
+     *
+     * @var string|null
+     */
+    protected $connection = 'mysql';
+    
+    /**
+     * The table associated with the model.
+     *
+     * @var string
+     */
+    protected string $table = "blue_task_user";
+    
+    /**
+     * The primary key associated with the table.
+     *
+     * @var string
+     */
+    protected string $primaryKey = "id";
+    
+    /**
+     * Indicates if the model should be timestamped.
+     *
+     * @var bool
+     */
+    public bool $timestamps = false;
+
+
+}

二进制
public/uploads/storage/20260513/cbc983c7a3b7d428f6f7f2b53af39eb9afe4f065.png


+ 1 - 0
resource/translations/zh_CN/messages.php

@@ -33,6 +33,7 @@ return [
         "agent-out"     => "权限已到期,请联系管理员",
         "agent-no-exist"   => "代理不存在",
         "store-no-exist"   => "门店不存在",
+        "upload"         => "上传失败",
     ],
     "success"   => [
         "data"  => "操作成功",