1.	发布供需消耗连盟币,连盟币数量在后台独立设置
2. 小程序供需个人中心可自由切换身份
3. 增加私信系统
4. 增加评论系统,用户可在发布者详情页进行评论操作,评论获得的连盟币可在后台设置
5. 增加发布者的等级,以好评个数为条件进行升级,小程序端会显示该等级的图标,如没有等级则不会显示图标
6. 增加设置消耗连盟币可以解锁、查看发布的信息,费用可在后台设置
7. 小程序供需大厅界面优化,以及增加了推荐栏目,该栏目按发布的分类相似进行匹配,比如A用户发布了 互联网 分类的需求,则会优先推荐匹配互联网分类的供应需求给他。
16 files deleted
71 files added
57 files modified
11545 ■■■■ changed files
admin/app/api/controller/plus/release/Chat.php 60 ●●●●● patch | view | raw | blame | history
admin/app/api/controller/plus/release/DemandIndex.php 28 ●●●●● patch | view | raw | blame | history
admin/app/api/controller/plus/release/DemandProject.php 18 ●●●● patch | view | raw | blame | history
admin/app/api/controller/plus/release/Evaluate.php 55 ●●●●● patch | view | raw | blame | history
admin/app/api/controller/plus/release/Project.php 12 ●●●●● patch | view | raw | blame | history
admin/app/api/controller/plus/release/SupplyIndex.php 29 ●●●●● patch | view | raw | blame | history
admin/app/api/controller/plus/release/SupplyProject.php 16 ●●●●● patch | view | raw | blame | history
admin/app/api/model/branch/ActivityUser.php 3 ●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/Chat.php 86 ●●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/ChatRelation.php 23 ●●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/DemandProject.php 22 ●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/DemandUser.php 32 ●●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/Evaluate.php 98 ●●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/Project.php 31 ●●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/SupplyProject.php 21 ●●●●● patch | view | raw | blame | history
admin/app/api/model/plus/release/SupplyUser.php 32 ●●●●● patch | view | raw | blame | history
admin/app/api/service/order/settled/OrderSettledService.php 2 ●●● patch | view | raw | blame | history
admin/app/common/model/branch/ActivityUser.php 4 ●●●● patch | view | raw | blame | history
admin/app/common/model/plus/agent/Referee.php 2 ●●● patch | view | raw | blame | history
admin/app/common/model/plus/bonus/Order.php 20 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/bonus/Setting.php 2 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/release/Chat.php 68 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/release/ChatRelation.php 44 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/release/DemandUser.php 9 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/release/Evaluate.php 59 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/release/Grade.php 112 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/release/Project.php 10 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/release/SupplyUser.php 9 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/vip/Order.php 35 ●●●●● patch | view | raw | blame | history
admin/app/common/model/plus/vip/Setting.php 4 ●●● patch | view | raw | blame | history
admin/app/common/model/plus/vip/User.php 4 ●●● patch | view | raw | blame | history
admin/app/common/model/release/Capital.php 26 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/Cart.php 231 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/Cash.php 64 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/DemandApply.php 82 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/DemandProject.php 157 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/DemandUser.php 67 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/Order.php 109 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/Project.php 70 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/ReleaseCategory.php 41 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/ReleaseProjectImage.php 33 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/ReleaseProjectTag.php 47 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/Setting.php 398 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/SupplyApply.php 82 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/SupplyProject.php 186 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/SupplyUser.php 67 ●●●●● patch | view | raw | blame | history
admin/app/common/model/release/Tag.php 35 ●●●●● patch | view | raw | blame | history
admin/app/common/model/user/User.php 9 ●●●●● patch | view | raw | blame | history
admin/app/shop/controller/plus/release/DemandUser.php 5 ●●●● patch | view | raw | blame | history
admin/app/shop/controller/plus/release/Evaluate.php 35 ●●●●● patch | view | raw | blame | history
admin/app/shop/controller/plus/release/Grade.php 61 ●●●●● patch | view | raw | blame | history
admin/app/shop/controller/plus/release/SupplyUser.php 5 ●●●● patch | view | raw | blame | history
admin/app/shop/model/plus/release/DemandProject.php 4 ●●●● patch | view | raw | blame | history
admin/app/shop/model/plus/release/DemandUser.php 2 ●●● patch | view | raw | blame | history
admin/app/shop/model/plus/release/Evaluate.php 45 ●●●●● patch | view | raw | blame | history
admin/app/shop/model/plus/release/Grade.php 52 ●●●●● patch | view | raw | blame | history
admin/app/shop/model/plus/release/SupplyProject.php 4 ●●●● patch | view | raw | blame | history
admin/app/shop/model/plus/release/SupplyUser.php 2 ●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/Cash.php 85 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/DemandApply.php 43 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/DemandProject.php 54 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/DemandUser.php 59 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/Evaluate.php 40 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/Grade.php 66 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/Order.php 91 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/ReleaseCategory.php 68 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/Setting.php 144 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/SupplyApply.php 43 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/SupplyProject.php 53 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/SupplyUser.php 59 ●●●●● patch | view | raw | blame | history
admin/app/supplier/controller/plus/release/Tag.php 71 ●●●●● patch | view | raw | blame | history
mobile/pages.json 21 ●●●●● patch | view | raw | blame | history
mobile/pages/branch/admin/activity/user.vue 1 ●●●● patch | view | raw | blame | history
mobile/pages3/release/chat/chat.vue 585 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/chat/chat_list.vue 155 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/demandindex/index.vue 88 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/demandproject/edit.vue 10 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/demandproject/release.vue 23 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/project/detail.vue 117 ●●●● patch | view | raw | blame | history
mobile/pages3/release/project/list.vue 95 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/project/look-evaluate/look-evaluate.vue 295 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/project/popup/evaluate.vue 232 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/supplyindex/index.vue 91 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/supplyproject/edit.vue 11 ●●●●● patch | view | raw | blame | history
mobile/pages3/release/supplyproject/release.vue 21 ●●●●● patch | view | raw | blame | history
shop_vue/src/api/plus/release.js 24 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/bonus/setting/part/Basic.vue 37 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/demand/user/User.vue 13 ●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/demand/user/dialog/Edit.vue 12 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/demandproject/index.vue 20 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/evaluate/list.vue 174 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/grade/index.vue 32 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/grade/part/Add.vue 136 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/grade/part/Edit.vue 131 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/grade/part/list.vue 189 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/index.vue 24 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/setting/Setting.vue 2 ●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/setting/part/Settlement.vue 30 ●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/setting/part/Settlement备份可删.vue 104 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/supply/user/User.vue 13 ●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/supply/user/dialog/Edit.vue 13 ●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/release/supplyproject/index.vue 14 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/vip/setting/part/Basic.vue 37 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/vip/user/User.vue 16 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/plus/vip/user/dialog/SubUser.vue 136 ●●●●● patch | view | raw | blame | history
shop_vue/src/views/supplier/supplier/add.vue 11 ●●●● patch | view | raw | blame | history
shop_vue/src/views/supplier/supplier/edit.vue 9 ●●●● patch | view | raw | blame | history
supplier_vue/src/api/plus/release.js 178 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/bonus/index.vue 5 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/bonus/setting/part/Basic.vue 37 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/cash/Cash.vue 333 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/cash/dialog/Edit.vue 94 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/demand/apply/Apply.vue 169 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/demand/apply/dialog/Edit.vue 88 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/demand/user/User.vue 214 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/demand/user/dialog/Edit.vue 93 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/demandproject/Edit.vue 78 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/demandproject/dialog/Edit.vue 92 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/demandproject/index.vue 232 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/evaluate/list.vue 174 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/grade/index.vue 32 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/grade/part/Add.vue 136 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/grade/part/Edit.vue 131 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/grade/part/list.vue 189 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/index.vue 192 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/order/Order.vue 281 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/order/dialog/Edit.vue 182 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/releasecategory/Add.vue 103 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/releasecategory/Edit.vue 106 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/releasecategory/index.vue 130 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/setting/Setting.vue 58 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/setting/part/Settlement.vue 102 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/setting/part/Settlement备份可删.vue 104 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/supply/apply/Apply.vue 168 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/supply/apply/dialog/Edit.vue 88 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/supply/user/User.vue 214 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/supply/user/dialog/Edit.vue 93 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/supplyproject/Edit.vue 77 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/supplyproject/dialog/Edit.vue 92 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/supplyproject/index.vue 227 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/tag/Add.vue 86 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/tag/Edit.vue 85 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/release/tag/index.vue 147 ●●●●● patch | view | raw | blame | history
supplier_vue/src/views/plus/vip/setting/part/Basic.vue 68 ●●●●● patch | view | raw | blame | history
admin/app/api/controller/plus/release/Chat.php
New file
@@ -0,0 +1,60 @@
<?php
namespace app\api\controller\plus\release;
use app\api\model\plus\release\Chat as ChatModel;
use app\api\controller\Controller;
/**
 * 客服消息
 */
class Chat extends Controller
{
    protected $user;
    /**
     * 构造方法
     */
    public function initialize()
    {
        $this->user = $this->getUser();
    }
    //我的聊天列表
    public function index()
    {
        $Chat = new ChatModel;
        $list = $Chat->myList($this->user);
        return $this->renderSuccess('', compact('list'));
    }
    //添加消息
    public function add()
    {
        $Chat = new ChatModel;
        if ($Chat->add($this->postData(), $this->user)) {
            return $this->renderSuccess('发送成功');
        } else {
            return $this->renderError($Chat->getError() ?: '发送失败');
        }
    }
    //获取聊天信息
    public function message()
    {
        $postData = $this->postData();
       // $postData['you_user_id'] = 796;
        $Chat = new ChatModel;
        $list = $Chat->getMessage($postData, $this->user);
        return $this->renderSuccess('', compact('list'));
    }
    //获取聊天用户信息
    public function getInfo()
    {
        $Chat = new ChatModel;
        $info = $Chat->getInfo($this->user['user_id']);
        return $this->renderSuccess('', compact('info'));
    }
}
admin/app/api/controller/plus/release/DemandIndex.php
@@ -7,6 +7,7 @@
use app\api\model\plus\release\DemandUser as DemandUserModel;
use app\api\model\settings\Message as MessageModel;
use app\common\exception\BaseException;
use app\api\model\plus\release\Setting;
/**
 * 首页
@@ -32,6 +33,9 @@
    public function index()
    {
        $is_release = $this->isReleaseUser();
        //获取开通权限连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
        return $this->renderSuccess('', [
            'is_release' => $is_release,
@@ -41,6 +45,7 @@
            'user' => $this->user,
            // 信息
            'release' => $this->release,
            'setting' => $setting,
            // 背景图
            'background' => '',
        ]);
@@ -95,4 +100,27 @@
        }
        return $this->renderError($model->getError() ?: '提交失败');
    }
     public function topay()
    {
        $data = $this->postData();
        //获取支付连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
         $user = $this->user;
         $pay_price = empty($setting['check_price']) ? 0 : $setting['check_price'];
         $point = $user['points'];
         if($pay_price > $point){
             return $this->renderError('连盟币不足');
         }
         $release= $this->release;
         if($release['is_check'] == 1){
             return $this->renderError('权限已开通,请勿重复开通');
         }
        $model = new DemandUserModel;
        if ($model->topay($user, $pay_price)) {
            return $this->renderSuccess('开通成功');
        }
        return $this->renderError($model->getError() ?: '提交失败');
    }
}
admin/app/api/controller/plus/release/DemandProject.php
@@ -7,6 +7,7 @@
use app\api\model\plus\release\DemandUser as DemandUserModel;
use app\api\model\plus\release\ReleaseCategory as ReleaseCategoryModel;
use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
use app\api\model\plus\release\Setting;
/**
@@ -53,8 +54,12 @@
     */
    public function defaultData()
    {
        return $this->renderSuccess('', [
        //获取支付连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
         return $this->renderSuccess('', [
            'category_list' => ReleaseCategoryModel::getALL(),
            'setting' => $setting,
        ]);
    }
@@ -81,8 +86,17 @@
    public function add()
    {
        $postData = $this->postData();
        //获取支付连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
         $user = $this->user;
         $pay_price = empty($setting['demand_price']) ? 0 : $setting['demand_price'];
         $point = $user['points'];
         if($pay_price > $point){
             return $this->renderError('连盟币不足');
         }
        $model = new ProjectModel;
        if ($model->add($postData,$this->demand)) {
        if ($model->add($postData,$this->demand, $pay_price)) {
            return $this->renderSuccess('提交成功');
        }
        return $this->renderError($model->getError() ?: '提交失败');
admin/app/api/controller/plus/release/Evaluate.php
New file
@@ -0,0 +1,55 @@
<?php
namespace app\api\controller\plus\release;
use app\api\controller\Controller;
use app\api\model\plus\release\Evaluate as EvaluateModel;
/**
 * 模型
 */
class Evaluate extends Controller
{
    // 当前用户
    private $user;
    /**
     * 构造方法
     */
    public function initialize()
    {
        // 用户信息
        $this->user = $this->getUser();;
    }
    /**
     * 列表
     */
    public function lists($project_id, $scoreType = -1)
    {
        $model = new EvaluateModel;
        $list = $model->getEvaluateList($project_id, $scoreType, $this->postData());
        $total = $model->getTotal($project_id);
        return $this->renderSuccess('', compact('list', 'total'));
    }
    /**
     *评论
     */
    public function evaluate()
    {
        $params = $this->request->param();
        $model = new EvaluateModel;
        $params['user_id'] = $this->user['user_id'];
        $params['image_list'] = json_decode($params['image_list'],true);
        $result = $model->evaluate($params);
        if(!$result){
            return $this->renderError($model->getError() ?: '评论失败');
        }
        return $this->renderSuccess('评论成功');
    }
}
admin/app/api/controller/plus/release/Project.php
@@ -38,10 +38,22 @@
        $model = new ProjectModel;
        $user_id = $this->user['user_id'];
        $is_check = 0;
        $demanduser = DemandUserModel::detail($user_id);
        if(empty($demanduser)){
           $supplyuser = SupplyUserModel::detail($user_id);
           if(!empty($supplyuser)){
             $is_check = $supplyuser['is_check'];
           }
        }else{
            $is_check = $demanduser['is_check'];
        }
        return $this->renderSuccess('', [
            // 列表
            'list' => $model->getList($user_id,$postData),
            'category_list' => ReleaseCategoryModel::getALL(),
            'is_check' => $is_check,
        ]);
    }
admin/app/api/controller/plus/release/SupplyIndex.php
@@ -7,6 +7,7 @@
use app\api\model\plus\release\SupplyUser as SupplyUserModel;
use app\api\model\settings\Message as MessageModel;
use app\common\exception\BaseException;
use app\api\model\plus\release\Setting;
/**
 * 首页
@@ -33,6 +34,10 @@
    {
        $is_release = $this->isReleaseUser();
        //获取开通权限连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
        return $this->renderSuccess('', [
            // 当前是否
            'is_release' => $is_release,
@@ -42,6 +47,7 @@
            'user' => $this->user,
            // 信息
            'release' => $this->release,
            'setting' => $setting,
            // 背景图
            'background' => '',
        ]);
@@ -96,4 +102,27 @@
        }
        return $this->renderError($model->getError() ?: '提交失败');
    }
     public function topay()
    {
        $data = $this->postData();
        //获取支付连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
         $user = $this->user;
         $pay_price = empty($setting['check_price']) ? 0 : $setting['check_price'];
         $point = $user['points'];
         if($pay_price > $point){
             return $this->renderError('连盟币不足');
         }
         $release= $this->release;
         if($release['is_check'] == 1){
             return $this->renderError('权限已开通,请勿重复开通');
         }
        $model = new SupplyUserModel;
        if ($model->topay($user, $pay_price)) {
            return $this->renderSuccess('开通成功');
        }
        return $this->renderError($model->getError() ?: '提交失败');
    }
}
admin/app/api/controller/plus/release/SupplyProject.php
@@ -9,6 +9,7 @@
use app\api\model\plus\release\Tag as TagModel;
use app\common\model\plus\release\ReleaseProjectTag as ReleaseProjectTagModel;
use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
use app\api\model\plus\release\Setting;
/**
@@ -55,9 +56,13 @@
     */
    public function defaultData()
    {
        //获取支付连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
        return $this->renderSuccess('', [
            'category_list' => ReleaseCategoryModel::getALL(),
            'tag_list' => TagModel::getALL(),
            'setting' => $setting,
        ]);
    }
@@ -94,8 +99,17 @@
    public function add()
    {
        $postData = $this->postData();
        //获取支付连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
         $user = $this->user;
         $pay_price = empty($setting['supply_price']) ? 0 : $setting['supply_price'];
         $point = $user['points'];
         if($pay_price > $point){
             return $this->renderError('连盟币不足');
         }
        $model = new ProjectModel;
        if ($model->add($postData,$this->supply)) {
        if ($model->add($postData,$this->supply, $pay_price)) {
            return $this->renderSuccess('提交成功');
        }
        return $this->renderError($model->getError() ?: '提交失败');
admin/app/api/model/branch/ActivityUser.php
@@ -39,7 +39,7 @@
    public function getListForUser($user_id, $params = [])
    {
        // 构建查询规则
        $model = $this->alias('A')->with(['activity' => ['branch', 'image']])
        $model = $this->alias('A')->with(['activity' => ['branch', 'image'],'branch'])
            ->join('branch_activity B', 'B.activity_id = A.activity_id')
            ->field('A.*')
            ->visible(['activity' => ['name', 'image' => ['file_path'], 'branch' => ['name']]])
@@ -65,6 +65,7 @@
    {
        // 构建查询规则
        $model = $this->alias('auser')
            ->with('branch')
            ->field('auser.*,user.nickName,auser.real_name,user.avatarUrl')
            ->join('user', 'user.user_id = auser.user_id')
            ->where('auser.is_delete', '=', 0)
admin/app/api/model/plus/release/Chat.php
New file
@@ -0,0 +1,86 @@
<?php
namespace app\api\model\plus\release;
use app\common\model\plus\release\Chat as ChatModel;
use app\common\model\plus\release\ChatRelation as ChatRelationModel;
use app\api\model\user\User as UserModel;
/**
 * 消息模型类
 */
class Chat extends ChatModel
{
    /**
     * 隐藏字段
     */
    protected $hidden = [
        'app_id',
        'update_time'
    ];
    //消息列表
    public function myList($user)
    {
        $ChatRelation = new ChatRelation();
        $list = $ChatRelation->with(['user'])
            ->where(['user_id' => $user['user_id']])
            ->whereOr(['other_user_id' => $user['user_id']])
            ->order('update_time desc')
            ->select();
        foreach ($list as $key => &$value) {
            $where['relation_id'] = $value['relation_id'];
            if($value['user_id'] == $user['user_id']){
                $where['user_id']= $other_user_id = $value['other_user_id'];
            }else{
                $where['user_id']= $other_user_id  = $value['user_id'];
            }
            $where['status'] = 0;
            $value['num'] = $this->where($where)->count();
            unset($where['status']);
            $value['newMessage'] = $this->where($where)->order('chat_id desc')->field('content,create_time')->find();
            $value['user'] = UserModel::detail($other_user_id);
        }
        return $list;
    }
    //获取聊天信息
    public function getMessage($data, $user)
    {
        $relation_id = ChatRelationModel::getRelationId($user['user_id'],$data['you_user_id']);
        $list = $this->where("relation_id","=",$relation_id)
            ->with(['user'])
            ->order('chat_id desc')
            ->paginate($data);
        $where['relation_id'] = $relation_id;
        $where['user_id'] = $data['you_user_id'];
        $this->where($where)->update(['status' => 1]);
        return $list;
    }
    //获取消息条数
    public function mCount($user)
    {
        $num = 0;
        if ($user) {
            $num = $this->where('user_id', '=', $user['user_id'])->whereOr('user_id', '=', $user['user_id'])->count();
        }
        return $num;
    }
    //获取用户信息
    public function getInfo($user_id)
    {
        $userInfo = UserModel::detail($user_id);
        $data['avatarUrl'] = $userInfo['avatarUrl'];
        return $data;
    }
    public static function getNoReadCount($user_id){
        return self::where('user_id', '=', $user_id)->whereOr('user_id', '=', $user_id)
            //->where('status', '=', 0)
            ->count();
    }
}
admin/app/api/model/plus/release/ChatRelation.php
New file
@@ -0,0 +1,23 @@
<?php
namespace app\api\model\plus\release;
use app\common\model\plus\release\ChatRelation as ChatRelationModel;
/**
 * 消息关系模型类
 */
class ChatRelation extends ChatRelationModel
{
    /**
     * 隐藏字段
     */
    protected $hidden = [
        'app_id',
        'create_time',
        'update_time'
    ];
}
admin/app/api/model/plus/release/DemandProject.php
@@ -4,7 +4,8 @@
use app\common\model\plus\release\Project as ProjectModel;
use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
use app\common\model\user\User as UserModel;
use app\common\model\user\PointsLog as PointsLogModel;
/**
 * 模型
@@ -29,7 +30,7 @@
    /**
     * 新增记录
     */
    public function add($postdata,$demand)
    public function add($postdata,$demand,$pay_price)
    {
        $data = json_decode($postdata["formData"],true);
        if (empty($data['name'])) {
@@ -55,6 +56,8 @@
            'category_id'=>$data["category_id"],
            'price'=>$data["price"],
            'content'=>$data["content"],
            'product_content'=>$data["product_content"],
            'product_case'=>$data["product_case"],
            'detail'=>$data["detail"],
            'show_phone'=>$data["show_phone"],
            'is_show'=>$data["is_show"],
@@ -66,11 +69,22 @@
            $save_data["finish_time"] = '';
        }
          return $this->transaction(function () use ($data, $save_data) {
          return $this->transaction(function () use ($data, $save_data,$pay_price) {
            // 记录内容
            $this->save($save_data);
            // 记录图片
            $this->saveAllImages($this['project_id'],$data);
            //减少连盟币
            if($pay_price>0){
                (new UserModel())->where('user_id', '=', $save_data['user_id'])->dec('points',$pay_price)->update();
                PointsLogModel::add([
                    'user_id' => $save_data['user_id'],
                    'value' => -$pay_price,
                    'describe' => "发布需求消耗连盟币",
                    'app_id' => $save_data['app_id'],
                ]);
            }
            
            return $this['project_id'];
        });
@@ -103,6 +117,8 @@
            'category_id'=>$data["category_id"],
            'price'=>$data["price"],
            'content'=>$data["content"],
            'product_content'=>$data["product_content"],
            'product_case'=>$data["product_case"],
            'detail'=>$data["detail"],
            'show_phone'=>$data["show_phone"],
            'is_show'=>$data["is_show"],
admin/app/api/model/plus/release/DemandUser.php
@@ -3,6 +3,9 @@
namespace app\api\model\plus\release;
use app\common\model\plus\release\DemandUser as UserModel;
use app\common\model\plus\release\SupplyUser as SupplyUserModel;
use app\common\model\user\User as RealUserModel;
use app\common\model\user\PointsLog as PointsLogModel;
/**
 * 用户模型
@@ -28,4 +31,33 @@
        ]);
    }
     /**
     * 开通权限
     */
    public function topay($user,$pay_price)
    {
        $save_data =[
            'is_check'=>1,
        ];
          return $this->transaction(function () use ($user, $save_data,$pay_price) {
            // 改变权限状态
            $this->where(['user_id'=>$user['user_id']])->save($save_data);
            (new SupplyUserModel())->where(['user_id'=>$user['user_id']])->save($save_data);
             //减少连盟币
            if($pay_price>0){
                (new RealUserModel())->where('user_id', '=', $user['user_id'])->dec('points',$pay_price)->update();
                PointsLogModel::add([
                    'user_id' => $user['user_id'],
                    'value' => -$pay_price,
                    'describe' => "开通查看信息权限消耗连盟币",
                    'app_id' => self::$app_id,
                ]);
            }
            return true;
        });
    }
}
admin/app/api/model/plus/release/Evaluate.php
New file
@@ -0,0 +1,98 @@
<?php
namespace app\api\model\plus\release;
use app\common\model\plus\release\Evaluate as EvaluateModel;
use app\common\model\user\User as UserModel;
use app\common\model\user\PointsLog as PointsLogModel;
use app\api\model\plus\release\Setting;
use app\common\model\plus\release\Project as ProjectModel;
use app\common\model\plus\release\Grade as GradeModel;
/**
 * 模型
 */
class Evaluate extends EvaluateModel
{
    /**
     * 获取指定评论列表
     */
    public function getEvaluateList($project_id, $scoreType = -1, $limit = 15)
    {
        // 筛选条件
        $filter = [
            'project_id' => $project_id,
        ];
        // 评分
        $scoreType > 0 && $filter['score'] = $scoreType;
        return $this->with(['user'])
            ->where($filter)
            ->order(['create_time' => 'desc'])
            ->paginate($limit);
    }
    /**
     * 获取指定评分总数
     */
    public function getTotal($project_id)
    {
        return $this->field([
            'count(id) AS `all`',
            'count(score = 10 OR NULL) AS `praise`',
            'count(score = 20 OR NULL) AS `review`',
            'count(score = 30 OR NULL) AS `negative`',
        ])->where([
            'project_id' => $project_id,
        ])->find();
    }
   /**
     * 添加评论
     */
    public function evaluate($params)
    {
      //判断重复评论
      $result = $this->where('user_id','=',$params["user_id"])->where('project_id','=',$params["project_id"])->find();
      if(!empty($result)){
            $this->error = '请勿重复评论';
            return false;
      }
        //获取奖励的连盟币
         $setting = Setting::getAll();
         $setting = $setting['settlement']['values'];
         $money = empty($setting['eve_money']) ? 0 : $setting['eve_money'];
        return $this->transaction(function () use ($params,$money) {
             //奖励连盟币
            if($money>0){
                (new UserModel())->where('user_id', '=', $params['user_id'])->inc('points',$money)->update();
                PointsLogModel::add([
                    'user_id' => $params['user_id'],
                    'value' => $money,
                    'describe' => "评论奖励连盟币",
                    'app_id' => self::$app_id,
                ]);
            }
           $project = ProjectModel::detail($params["project_id"]);
            $data["user_id"] = $params["user_id"];
            $data["project_user_id"] = $project["user_id"];
            $data["project_id"] = $params["project_id"];
            $data["evaluate_content"] = $params["evaluate_content"];
            //$data["server_score"] = $params["server_score"];
            $data["score"] = empty($params["score"]) ? 10 : $params["score"];
            $data["image_list"] = json_encode($params["image_list"]);
            $data["app_id"] = self::$app_id;
            $this->save($data);
             //好评判断升级等级
            if($params["score"] == 10){
                (new GradeModel())->setUserGrade($project["user_id"],$project["project_type"]);
            }
            return true;
        });
    }
}
admin/app/api/model/plus/release/Project.php
@@ -3,7 +3,9 @@
namespace app\api\model\plus\release;
use app\common\model\plus\release\Project as ProjectModel;
use app\common\model\plus\release\DemandUser as DemandUserModel;
use app\common\model\plus\release\SupplyUser as SupplyUserModel;
use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
/**
 * 模型
@@ -20,15 +22,38 @@
            $model = $model->where('name', 'like', '%'.$postdata["keyword"].'%');
        }
        if(!empty($postdata["category_id"])){
            $model = $model->where('category_id', '=', $postdata["category_id"]);
            if($postdata["category_id"] == '-1'){
                //根据分类匹配
                $category_ids = (new ProjectModel())->where('user_id','=',$user_id)
                ->where('project_type','=',$postdata["product_type"])
                ->column('category_id');
                if(!empty($category_ids)){
                    $model = $model->where('category_id', 'in', $category_ids);
                }
            }else{
               $model = $model->where('category_id', '=', $postdata["category_id"]);
            }
        }
        return $model->with(['category','user'])->where('is_delete', '=', 0)
        $list = $model->with(['category','user'])->where('is_delete', '=', 0)
            ->where('project_type', '=', $postdata["product_type"])
            ->where('status', '=', 1)
            ->where('is_show', '=', 1)
            ->where('user_id', '<>', $user_id)
            ->order(['create_time' => 'desc'])
            ->paginate($postdata);
         foreach($list as &$val){
            if($postdata["product_type"] == 0){
                $release_user = DemandUserModel::detail($val['user_id'],['grade']);
            }else{
                $release_user = SupplyUserModel::detail($val['user_id'],['grade']);
            }
            $val['grade'] = empty($release_user['grade']) ? '' : $release_user['grade'];
            $image_list = ReleaseProjectImageModel::getImage($val["project_id"]);
            $val['image'] = empty($image_list[0]) ? '/static/default.png' : $image_list[0]['file_path'];
         }
         return $list;
    }  
}
admin/app/api/model/plus/release/SupplyProject.php
@@ -6,6 +6,8 @@
use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
use app\common\model\plus\release\Tag as TagModel;
use app\common\model\plus\release\ReleaseProjectTag as ReleaseProjectTagModel;
use app\common\model\user\User as UserModel;
use app\common\model\user\PointsLog as PointsLogModel;
/**
@@ -31,7 +33,7 @@
    /**
     * 新增记录
     */
    public function add($postdata,$supply)
    public function add($postdata,$supply,$pay_price)
    {
        $data = json_decode($postdata["formData"],true);
        if (empty($data['name'])) {
@@ -57,6 +59,8 @@
            'category_id'=>$data["category_id"],
            'price'=>$data["price"],
            'content'=>$data["content"],
            'product_content'=>$data["product_content"],
            'product_case'=>$data["product_case"],
            'detail'=>$data["detail"],
            'project_type'=>1,
            'is_show'=>$data["is_show"],
@@ -69,13 +73,24 @@
            $save_data["finish_time"] = '';
        }
          return $this->transaction(function () use ($data, $save_data) {
          return $this->transaction(function () use ($data, $save_data,$pay_price) {
            // 记录内容
            $this->save($save_data);
            // 记录图片
            $this->saveAllImages($this['project_id'],$data);
            // 记录标签
            $this->saveTag($this['project_id'],$data);
             //减少连盟币
            if($pay_price>0){
                (new UserModel())->where('user_id', '=', $save_data['user_id'])->dec('points',$pay_price)->update();
                PointsLogModel::add([
                    'user_id' => $save_data['user_id'],
                    'value' => -$pay_price,
                    'describe' => "发布供应消耗连盟币",
                    'app_id' => $save_data['app_id'],
                ]);
            }
            
            return $this['project_id'];
        });
@@ -108,6 +123,8 @@
            'category_id'=>$data["category_id"],
            'price'=>$data["price"],
            'content'=>$data["content"],
            'product_content'=>$data["product_content"],
            'product_case'=>$data["product_case"],
            'detail'=>$data["detail"],
            'is_show'=>$data["is_show"],
            'status'=>0,
admin/app/api/model/plus/release/SupplyUser.php
@@ -3,6 +3,9 @@
namespace app\api\model\plus\release;
use app\common\model\plus\release\SupplyUser as UserModel;
use app\common\model\plus\release\DemandUser as DemandUserModel;
use app\common\model\user\User as RealUserModel;
use app\common\model\user\PointsLog as PointsLogModel;
/**
 * 用户模型
@@ -28,4 +31,33 @@
        ]);
    }
     /**
     * 开通权限
     */
    public function topay($user,$pay_price)
    {
        $save_data =[
            'is_check'=>1,
        ];
          return $this->transaction(function () use ($user, $save_data,$pay_price) {
            // 改变权限状态
            $this->where(['user_id'=>$user['user_id']])->save($save_data);
            (new DemandUserModel())->where(['user_id'=>$user['user_id']])->save($save_data);
             //减少连盟币
            if($pay_price>0){
                (new RealUserModel())->where('user_id', '=', $user['user_id'])->dec('points',$pay_price)->update();
                PointsLogModel::add([
                    'user_id' => $user['user_id'],
                    'value' => -$pay_price,
                    'describe' => "开通查看信息权限消耗连盟币",
                    'app_id' => self::$app_id,
                ]);
            }
            return true;
        });
    }
}
admin/app/api/service/order/settled/OrderSettledService.php
@@ -342,7 +342,7 @@
    private function setOrderSettlementPrice($productList)
    {
        // 订单商品的总金额(不含优惠券折扣)
        $this->orderData['settlement_price'] = helper::number2(helper::getArrayColumnSum($productList, 'settlement_price'));
        $this->orderData['settlement_price'] = helper::number2(helper::getArrayColumnSum($productList, 'total_settlement_price'));
    }
    /**
admin/app/common/model/branch/ActivityUser.php
@@ -43,6 +43,10 @@
    {
        return $this->belongsTo('app\\common\\model\\branch\\Activity', 'activity_id', 'activity_id');
    }
    public function branch()
    {
        return $this->belongsTo('app\\common\\model\\branch\\Branch', 'branch_id', 'branch_id');
    }
    /**
     * 支付状态
admin/app/common/model/plus/agent/Referee.php
@@ -59,7 +59,7 @@
        if($level > -1){
            $model = $model->where('referee.level', '=', $level);
        }
        return $model->with(['agent', 'user'])
        return $model->with(['agent', 'user'=>['grade']])
            ->alias('referee')
            ->field('referee.*')
            ->join('user', 'user.user_id = referee.user_id','left')
admin/app/common/model/plus/bonus/Order.php
@@ -4,7 +4,8 @@
use app\common\model\BaseModel;
use app\common\enum\order\OrderTypeEnum;
use app\common\model\plus\bonus\User as UserModel;
use app\common\model\plus\bonus\User as BonusUserModel;
use app\common\model\user\User as UserModel;
/**
 * 队长订单模型
 */
@@ -208,7 +209,7 @@
            return false;
        }
        // 获取当前买家的直推奖用户id和业绩奖用户id
        $agentUser = $model->getAgentUserId($order, $setting['begin_num']);
        $agentUser = $model->getAgentUserId($order, $setting['begin_num'], $setting);
        // 无分红用户
        if (!$agentUser['first_user_id'] && !$agentUser['second_user_id']) {
            return false;
@@ -251,21 +252,26 @@
    /**
     * 获取当前买家的所有上级分销商用户id
     */
    private function getAgentUserId($order, $begin_num)
    private function getAgentUserId($order, $begin_num, $setting)
    {
        $user = UserModel::detail($order['user_id']);
        $user = BonusUserModel::detail($order['user_id']);
        if (empty($user['parent_id'])) {
            $second_user_id = 0;
        } else {
            $second_user_id = UserModel::getSecondUserId($user['user_id'], $begin_num, $order);
            $second_user_id = BonusUserModel::getSecondUserId($user['user_id'], $begin_num, $order);
        }
        if ($second_user_id==0){
            $subsidy_user_id = 0;
        }else{
            $subsidy_user_id = UserModel::getSubsidyUserId($second_user_id); //补贴用户
            $subsidy_user_id = BonusUserModel::getSubsidyUserId($second_user_id); //补贴用户
            if ($subsidy_user_id!=0){
                if (!UserModel::getOperatingSubsidy($subsidy_user_id,$setting)){
                    $subsidy_user_id = 0;
                }
            }
        }
        $agentUser = [
            'first_user_id' => UserModel::getFirstUserId($order['user_id']), //直推用户
            'first_user_id' => BonusUserModel::getFirstUserId($order['user_id']), //直推用户
            'second_user_id' => $second_user_id, //业绩奖用户
            'subsidy_user_id'=>$subsidy_user_id, //补贴用户
        ];
admin/app/common/model/plus/bonus/Setting.php
@@ -125,6 +125,8 @@
                    'keep_assets' => '0', // 更换排位用户是否保留资产 1保留 0不保留
                    // 收益补贴
                    'operating_subsidy' => '0',
                    'referee_grade_ids'=>[],
                    'referee_grade_count'=>0,
                ],
            ],
            'condition' => [
admin/app/common/model/plus/release/Chat.php
New file
@@ -0,0 +1,68 @@
<?php
namespace app\common\model\plus\release;
use app\common\model\BaseModel;
/**
 * 消息模型
 */
class Chat extends BaseModel
{
    protected $pk = 'chat_id';
    protected $name = 'release_chat';
    /**
     * 关联会员表
     */
    public function user()
    {
        return $this->belongsTo("app\\common\\model\\user\\User", 'user_id', 'user_id');
    }
    //添加信息
    public function add($postdata,$user)
    {
        // 开启事务
        $this->startTrans();
        try {
            $ChatRelation = new ChatRelation();
            $info = $ChatRelation->where('user_id', '=', $user['user_id'])->where('other_user_id', '=', $postdata['you_user_id'])->find();
            if(empty($info)){
                $info = $ChatRelation->where('user_id', '=', $postdata['you_user_id'])->where('other_user_id', '=', $user['user_id'])->find();
            }
            if (!$info) {
                $save_data=[
                  'user_id'=>$user['user_id'],
                  'other_user_id'=>$postdata['you_user_id'],
                  'app_id'=>self::$app_id,
                ];
                $ChatRelation->save($save_data);
                $relation_id = $ChatRelation['relation_id'];
            } else {
                $relation_id = $info['relation_id'];
                $info->save(['update_time' => time()]);
            }
            $data=[
               'user_id'=>$user['user_id'],
               'content'=>$postdata['content'],
               'relation_id'=>$relation_id,
               'app_id'=>self::$app_id,
            ];
            $this->save($data);
            $this->commit();
            return true;
        } catch (\Exception $e) {
            log_write($e->getMessage());
            $this->rollback();
            return false;
        }
    }
}
admin/app/common/model/plus/release/ChatRelation.php
New file
@@ -0,0 +1,44 @@
<?php
namespace app\common\model\plus\release;
use app\common\model\BaseModel;
/**
 * 客服消息关系模型
 */
class ChatRelation extends BaseModel
{
    protected $pk = 'relation_id';
    protected $name = 'release_chat_relation';
    /**
     * 关联会员表
     */
    public function user()
    {
        return $this->belongsTo('app\\common\\model\\user\\User', 'user_id', 'user_id');
    }
    /**
     * 关联会员表
     */
    public function otherUser()
    {
        return $this->belongsTo("app\\common\\model\\user\\User", 'user_id', 'other_user_id');
    }
    /**
     * 获取关联id
     */
    public static function getRelationId($user_id,$other_user_id)
    {
        $model = new static;
        $data = $model->where("user_id",'=',$user_id)->where("other_user_id",'=',$other_user_id)->find();
        if(empty($data)){
            $data = $model->where("other_user_id",'=',$user_id)->where("user_id",'=',$other_user_id)->find();
        }
        return empty($data) ? 0 : $data['relation_id'];
    }
}
admin/app/common/model/plus/release/DemandUser.php
@@ -22,6 +22,15 @@
        return $this->belongsTo('app\\common\\model\\user\\User');
    }
    /**
     * 关联等级
     * @return \think\model\relation\BelongsTo
     */
    public function grade()
    {
        return $this->belongsTo('app\\common\\model\\plus\\release\\Grade','grade_id','grade_id');
    }
    /**
     * 详情
admin/app/common/model/plus/release/Evaluate.php
New file
@@ -0,0 +1,59 @@
<?php
namespace app\common\model\plus\release;
use app\common\model\BaseModel;
/**
 * 模型
 */
class Evaluate extends BaseModel
{
    protected $name = 'release_project_evaluate';
    protected $pk = 'id';
    /**
     * 关联会员记录表
     * @return \think\model\relation\BelongsTo
     */
    public function user()
    {
        return $this->belongsTo('app\\common\\model\\user\\User');
    }
    /**
     * 预售结束时间
     */
    public function getImageListAttr($value, $data)
    {
        return (isset($data['image_list']) && $data['image_list']) ? json_decode($data['image_list'],true) : '';
    }
    /**
     * 获取详情
     */
    public static function detail($id)
    {
        return (new static())->find($id);
    }
    /**
     * 获取列表记录
     */
    public static function getAll($prject_id)
    {
        return (new static())->with('user')->where('project_id', '=', $prject_id)
            ->order(['create_time' => 'asc'])
            ->select();
    }
     /**
     * 获取好评条数
     */
    public static function getGoodsEvaluateNum($project_user_id)
    {
        return (new static())->where('project_user_id', '=', $project_user_id)
            ->where('score', '=', 10)
            ->count();
    }
}
admin/app/common/model/plus/release/Grade.php
New file
@@ -0,0 +1,112 @@
<?php
namespace app\common\model\plus\release;
use app\common\model\BaseModel;
use app\common\model\plus\release\DemandUser as DemandUserModel;
use app\common\model\plus\release\SupplyUser as SupplyUserModel;
use app\common\model\plus\release\Evaluate as EvaluateModel;
/**
 * 等级模型
 */
class Grade extends BaseModel
{
    protected $pk = 'grade_id';
    protected $name = 'release_grade';
    /**
     * 用户等级模型初始化
     */
    public static function init()
    {
        parent::init();
    }
    /**
     * 获取详情
     */
    public static function detail($grade_id)
    {
        return (new static())->find($grade_id);
    }
    /**
     * 获取列表记录
     */
    public function getLists()
    {
        return $this->where('is_delete', '=', 0)
            ->field('grade_id,name')
            ->order(['weight' => 'asc', 'create_time' => 'asc'])
            ->select();
    }
    /**
     * 获取可用的等级列表
     */
    public static function getUsableList($appId = null)
    {
        $model = new static;
        $appId = $appId ? $appId : $model::$app_id;
        return $model->where('is_delete', '=', '0')
            ->where('app_id', '=', $appId)
            ->order(['weight' => 'asc', 'create_time' => 'asc'])
            ->select();
    }
    /**
     * 获取默认等级id
     */
    public static function getDefaultGradeId(){
        $grade = (new static())->where('is_default', '=', 1)->find();
        return $grade['grade_id'];
    }
    /**
     * 设置用户的评论等级
     */
    public function setUserGrade($userId,$prodect_type=0)
    {
        // 用户模型
        if($prodect_type == 0){
            $user = DemandUserModel::detail($userId);
        }else{
            $user = SupplyUserModel::detail($userId);
        }
        if(empty($user)){
            return true;
        }
        // 获取所有等级
        $list = self::getUsableList($user['app_id']);
        if ($list->isEmpty()) {
            return false;
        }
        //获取用户的好评条数
        $num = EvaluateModel::getGoodsEvaluateNum($userId);
        // 遍历等级
        $upgradeGrade = null;
        foreach ($list as $grade) {
            if($grade['upgrade_num'] > 0 && $num >=$grade['upgrade_num']){
                $upgradeGrade = $grade;
                //满足条件,继续判断更高等级是否满足
                continue;
            }else{
                //第一个等级不满足,则更高的等级不需要再看了
                break;
            }
        }
        //获取当前的等级权重
        $cur_grade = self::detail($user['grade_id']);
        //两个等级权重对比
        if(!empty($upgradeGrade) && $upgradeGrade['weight'] > $cur_grade['weight']){
            // 修改等级
            if($prodect_type == 0){
              $user = (new DemandUserModel())->where('user_id','=',$user['user_id'])->update(['grade_id'=>$upgradeGrade['grade_id']]);
           }else{
              $user = (new SupplyUserModel())->where('user_id','=',$user['user_id'])->update(['grade_id'=>$upgradeGrade['grade_id']]);;
           }
        }
    }
}
admin/app/common/model/plus/release/Project.php
@@ -48,13 +48,21 @@
    {
        return $this->hasMany('app\\common\\model\\plus\\release\\Tag', 'tag_id', 'tag_id');
    }
    /**
     * 关联评论表
     */
    public function evaluate()
    {
        return $this->hasMany('app\\common\\model\\plus\\release\\Evaluate', 'project_id', 'project_id')->order(['id' => 'desc']);
    }
    /**
     * 获取详情
     */
    public static function detail($project_id)
    {
        return (new static())->with(['image'])->find($project_id);
        return (new static())->with(['image','evaluate','evaluate.user','category'])->find($project_id);
    }
    /**
admin/app/common/model/plus/release/SupplyUser.php
@@ -22,6 +22,15 @@
        return $this->belongsTo('app\\common\\model\\user\\User');
    }
    /**
     * 关联等级
     * @return \think\model\relation\BelongsTo
     */
    public function grade()
    {
        return $this->belongsTo('app\\common\\model\\plus\\release\\Grade','grade_id','grade_id');
    }
    /**
     * 详情
admin/app/common/model/plus/vip/Order.php
@@ -149,16 +149,22 @@
                // 获取下级用户的推荐人(即上级用户)
                $superiorUser = UserModel::detail($model['vip_area_user_id']);
                if ($superiorUser && $superiorUser['referee_id']) {
                    $vipUser = VipUserModel::detail($superiorUser['vip_area_user_id']);
                    if ($vipUser['grade']['operating_subsidy'] > 0) {
                        // 获取补贴比例设置
                        $subsidyRate = $vipUser['grade']['operating_subsidy'];
                        // 计算下级收益补贴
                        $subsidyAmount = bcmul($model['vip_area_money'], bcdiv((string)$subsidyRate, '100', 4), 2);
                        User::grantMoney($superiorUser['referee_id'], $subsidyAmount, '下级收益补贴');
                        // 记录分销订单
                        self::createDistributionOrder($order, $superiorUser['referee_id'], $subsidyAmount, 'vip_subsidy', $model['vip_area_money']);
                    if (UserModel::getOperatingSubsidy($superiorUser['referee_id'],Setting::getItem('basic', $order['app_id']))){
                        $vipUser = VipUserModel::detail($superiorUser['referee_id']);
                        if (!empty($vipUser)){
                            if ($vipUser['grade']['operating_subsidy'] > 0) {
                                // 获取补贴比例设置
                                $subsidyRate = $vipUser['grade']['operating_subsidy'];
                                // 计算下级收益补贴
                                $subsidyAmount = bcmul($model['vip_area_money'], bcdiv((string)$subsidyRate, '100', 4), 2);
                                User::grantMoney($superiorUser['referee_id'], $subsidyAmount, '下级收益补贴');
                                // 记录分销订单
                                self::createDistributionOrder($order, $superiorUser['referee_id'], $subsidyAmount, 'vip_subsidy', $model['vip_area_money']);
                            }
                        }
                    }
                }
            }
@@ -302,7 +308,7 @@
                                $viewpoint_money = bcadd($viewpoint_money, ($product['is_viewpoint_money'] ? $product['viewpoint_money'] : $vipGrade['viewpoint_money']), 2);
                            }*/
                            if (in_array($product['product_id'], $config['become__buy_product_ids']) || $product['is_vip']) {
                                // 获取商品数量
                                // 获取VIP专区商品数量
                                $vip_quantity = bcadd($vip_quantity, $product['total_num'], 2);
                                // 为每个商品生成分红订单
                                /*for ($i = 0; $i < $quantity; $i++) {
@@ -337,14 +343,19 @@
                            if ($setting['jcaward']){
                                $refereeJc=User::getAllJcUser($userModel['user_id']);
                                foreach ($refereeJc as $v){
                                    $list[] = array_merge($data, ['vip_area_type' => 70, 'vip_area_money' =>bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2),'vip_area_user_id'=>$v['user_id']]);
                                    if ( (new User())->getViewpointMoneyQualification($v['user_id'], $setting)){
                                        $list[] = array_merge($data, ['vip_area_type' => 70, 'vip_area_money' =>bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2),'vip_area_user_id'=>$v['user_id']]);
                                    }
                                }
                            }
                            //复购专区平级奖
                            if ($setting['pjaward']){
                                $refereeJc=User::getAllPjUser($userModel['user_id'],$setting['pjaward_level']);
                                foreach ($refereeJc as $v){
                                    $list[] = array_merge($data, ['vip_area_type' => 80, 'vip_area_money' => bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2),'vip_area_user_id'=>$v['user_id']]);
                                    if ((new User())->getViewpointMoneyQualification($v['user_id'], $setting)) {
                                        $list[] = array_merge($data, ['vip_area_type' => 80, 'vip_area_money' => bcmul($product_price_repurchase, bcdiv($v['bonus_percent'], 100, 4), 2), 'vip_area_user_id' => $v['user_id']]);
                                    }
                                }
                            }
                        }
admin/app/common/model/plus/vip/Setting.php
@@ -150,7 +150,9 @@
                    'platform_commission_rate' => '5',
                    'jcaward'=>'0',
                    'pjaward'=>'0',
                    'pjaward_level'=>1
                    'pjaward_level'=>1,
                    'referee_grade_ids'=>[],
                    'referee_grade_count'=>0
                ],
            ],
            'settlement' => [
admin/app/common/model/plus/vip/User.php
@@ -166,7 +166,9 @@
        ]);
    }
    /**
     * 获取用户是否符合复购专区佣金条件
     */
    public function getViewpointMoneyQualification($user_id,$setting)
    {
        $userNum=$this->where('referee_id','=',$user_id)->count();
admin/app/common/model/release/Capital.php
File was deleted
admin/app/common/model/release/Cart.php
File was deleted
admin/app/common/model/release/Cash.php
File was deleted
admin/app/common/model/release/DemandApply.php
File was deleted
admin/app/common/model/release/DemandProject.php
File was deleted
admin/app/common/model/release/DemandUser.php
File was deleted
admin/app/common/model/release/Order.php
File was deleted
admin/app/common/model/release/Project.php
File was deleted
admin/app/common/model/release/ReleaseCategory.php
File was deleted
admin/app/common/model/release/ReleaseProjectImage.php
File was deleted
admin/app/common/model/release/ReleaseProjectTag.php
File was deleted
admin/app/common/model/release/Setting.php
File was deleted
admin/app/common/model/release/SupplyApply.php
File was deleted
admin/app/common/model/release/SupplyProject.php
File was deleted
admin/app/common/model/release/SupplyUser.php
File was deleted
admin/app/common/model/release/Tag.php
File was deleted
admin/app/common/model/user/User.php
@@ -23,6 +23,15 @@
    protected $pk = 'user_id';
    protected $name = 'user';
    public static function getOperatingSubsidy($referee_id, $setting)
    {
        $count=self::where('referee_id',$referee_id)->where('grade_id','in',$setting['referee_grade_ids'])->count();
        if ($count>=$setting['referee_grade_count']){
            return true;
        }
        return false;
    }
    /**
     * 修改器
     */
admin/app/shop/controller/plus/release/DemandUser.php
@@ -4,6 +4,7 @@
use app\shop\controller\Controller;
use app\shop\model\plus\release\DemandUser as UserModel;
use app\shop\model\plus\release\Grade;
/**
 * 控制器
@@ -17,7 +18,9 @@
    {
        $model = new UserModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
        $GradeModel = new Grade();
        $grade = $GradeModel->getLists();
        return $this->renderSuccess('', compact('list', 'grade'));
    }
    /**
admin/app/shop/controller/plus/release/Evaluate.php
New file
@@ -0,0 +1,35 @@
<?php
namespace app\shop\controller\plus\release;
use app\shop\controller\Controller;
use app\shop\model\plus\release\Evaluate as EvaluateModel;
/**
 * 项目
 */
class Evaluate extends Controller
{
    /**
     * 列表
     */
    public function list()
    {
        $model = new EvaluateModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 删除
     */
    public function delete($id)
    {
        // 详情
        $model = EvaluateModel::detail($id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/shop/controller/plus/release/Grade.php
New file
@@ -0,0 +1,61 @@
<?php
namespace app\shop\controller\plus\release;
use app\shop\controller\Controller;
use app\shop\model\plus\release\Grade as GradeModel;
/**
 * 等级
 */
class Grade extends Controller
{
    /**
     * 等级列表
     */
    public function index()
    {
        $model = new GradeModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 添加等级
     */
    public function add()
    {
        $model = new GradeModel;
        // 新增记录
        if ($model->add($this->postData())) {
            return $this->renderSuccess('添加成功');
        }
        return $this->renderError('添加失败');
    }
    /**
     * 编辑等级
     */
    public function edit($grade_id)
    {
        $model = GradeModel::detail($grade_id);
        // 修改记录
        if ($model->edit($this->postData())) {
            return $this->renderSuccess();
        }
        return $this->renderError();
    }
    /**
     * 删除等级
     */
    public function delete($grade_id)
    {
        // 等级详情
        $model = GradeModel::detail($grade_id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/shop/controller/plus/release/SupplyUser.php
@@ -4,6 +4,7 @@
use app\shop\controller\Controller;
use app\shop\model\plus\release\SupplyUser as UserModel;
use app\shop\model\plus\release\Grade;
/**
 * 控制器
@@ -17,7 +18,9 @@
    {
        $model = new UserModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
        $GradeModel = new Grade();
        $grade = $GradeModel->getLists();
        return $this->renderSuccess('', compact('list', 'grade'));
    }
    /**
admin/app/shop/model/plus/release/DemandProject.php
@@ -20,9 +20,9 @@
        if (!empty($data['name'])) {
            $model = $model->where('name', 'like', '%' . $data['name'] . '%');
        }
        $list = $model->with('category')->where('project_type', '=', 0)
        $list = $model->with(['category','user'])->where('project_type', '=', 0)
            ->where('is_delete', '=', 0)
            ->order(['sort' => 'asc', 'create_time' => 'asc'])
            ->order(['sort' => 'asc', 'create_time' => 'desc'])
            ->paginate($data);
        foreach($list as &$val){
            $val['finish_time'] = empty($val["finish_time"]) ? '' : date('Y-m-d',$val["finish_time"]);
admin/app/shop/model/plus/release/DemandUser.php
@@ -19,7 +19,7 @@
    public function getList($data)
    {
        // 构建查询规则
        $model = $this->alias('du')
        $model = $this->alias('du')->with('grade')
            ->field('du.*, user.nickName, user.avatarUrl')
            ->join('user', 'user.user_id = du.user_id')
            ->where('du.is_delete', '=', 0)
admin/app/shop/model/plus/release/Evaluate.php
New file
@@ -0,0 +1,45 @@
<?php
namespace app\shop\model\plus\release;
use app\common\model\plus\release\Evaluate as EvaluateModel;
/**
 * 模型
 */
class Evaluate extends EvaluateModel
{
    /**
     * 获取列表记录
     */
    public function getList($data)
    {
        $model = $this;
        // 查询条件
        if (!empty($data['uid'])) {
            $model = $model->where('uid', '=', $data['uid']);
        }
        $list = $model->with(['user'])
            ->where('project_id','=',$data['project_id'])
            ->order(['create_time' => 'desc'])
            ->paginate($data);
        foreach($list as &$val){
            $score = "好评";
            if($val['score']==20){
                $score = "重评";
            }elseif($val['score']==30){
                $score = "差评";
            }
            $val['score_txt'] = $score;
        }
        return $list;
    }
     /**
     * 删除
     */
    public function setDelete()
    {
        return $this->where('id','=',$this['id'])->delete();
    }
}
admin/app/shop/model/plus/release/Grade.php
New file
@@ -0,0 +1,52 @@
<?php
namespace app\shop\model\plus\release;
use app\common\model\plus\release\Grade as GradeModel;
/**
 * 用户会员等级模型
 */
class Grade extends GradeModel
{
    /**
     * 获取列表记录
     */
    public function getList($data)
    {
        return $this->where('is_delete', '=', 0)
            ->order(['weight' => 'asc', 'create_time' => 'asc'])
            ->paginate($data);
    }
    /**
     * 新增记录
     */
    public function add($data)
    {
        $data['app_id'] = self::$app_id;
        return $this->save($data);
    }
    /**
     * 编辑记录
     */
    public function edit($data)
    {
        return $this->save($data);
    }
    /**
     * 软删除
     */
    public function setDelete()
    {
        return $this->save(['is_delete' => 1]);
    }
}
admin/app/shop/model/plus/release/SupplyProject.php
@@ -21,9 +21,9 @@
        if (!empty($data['name'])) {
            $model = $model->where('name', 'like', '%' . $data['name'] . '%');
        }
        $list= $model->with('category')->where('project_type', '=', 1)
        $list= $model->with(['category','user'])->where('project_type', '=', 1)
            ->where('is_delete', '=', 0)
            ->order(['sort' => 'asc', 'create_time' => 'asc'])
            ->order(['sort' => 'asc', 'create_time' => 'desc'])
            ->paginate($data);
        foreach($list as &$val){
admin/app/shop/model/plus/release/SupplyUser.php
@@ -19,7 +19,7 @@
    public function getList($data)
    {
        // 构建查询规则
        $model = $this->alias('su')
        $model = $this->alias('su')->with('grade')
            ->field('su.*, user.nickName, user.avatarUrl')
            ->join('user', 'user.user_id = su.user_id')
            ->where('su.is_delete', '=', 0)
admin/app/supplier/controller/plus/release/Cash.php
New file
@@ -0,0 +1,85 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\Cash as CashModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 提现申请制器
 */
class Cash extends Controller
{
    /**
     * 提现记录列表
     */
    public function index($user_id = null, $apply_status = -1, $pay_type = -1, $search = '')
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new CashModel;
        $list = $model->getList($user_id, $apply_status, $pay_type, $search);
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 提现审核
     */
    public function submit($id)
    {
        $model = CashModel::detail($id);
        if ($model->submit($this->postData())) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 确认打款
     */
    public function money($id)
    {
        $model = CashModel::detail($id);
        if ($model->money()) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 分销商提现:微信支付企业付款
     */
    public function wechat_pay($id)
    {
        $model = CashModel::detail($id);
        if ($model->wechatPay()) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 分销商提现:分账功能 by yj
     */
    public function fb_pay($id)
    {
        $model = CashModel::detail($id);
        if ($model->fbPay()) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 订单导出
     */
    public function export($user_id = null, $apply_status = -1, $pay_type = -1, $search = '')
    {
        $model = new CashModel();
        return $model->exportList($user_id, $apply_status, $pay_type, $search);
    }
}
admin/app/supplier/controller/plus/release/DemandApply.php
New file
@@ -0,0 +1,43 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\DemandApply as ApplyModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 控制器
 */
class DemandApply extends Controller
{
    /**
     * 申请列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new ApplyModel;
        $apply_list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('apply_list'));
    }
    /**
     * 审核分销商
     */
    public function editApplyStatus($apply_id)
    {
        $model = ApplyModel::detail($apply_id);
        if ($model->submit($this->postData())) {
            return $this->renderSuccess('修改成功');
        }
        return $this->renderError('修改失败');
    }
}
admin/app/supplier/controller/plus/release/DemandProject.php
New file
@@ -0,0 +1,54 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\DemandProject as ProjectModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 项目
 */
class DemandProject extends Controller
{
    /**
     * 列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new ProjectModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 审核
     */
    public function submit($project_id)
    {
        $model = ProjectModel::detail($project_id);
        if ($model->submit($this->postData())) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 删除
     */
    public function delete($project_id)
    {
        // 详情
        $model = ProjectModel::detail($project_id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/supplier/controller/plus/release/DemandUser.php
New file
@@ -0,0 +1,59 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\DemandUser as UserModel;
use app\shop\model\plus\release\Grade;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 控制器
 */
class DemandUser extends Controller
{
    /**
     * 列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new UserModel;
        $list = $model->getList($this->postData());
        $GradeModel = new Grade();
        $grade = $GradeModel->getLists();
        return $this->renderSuccess('', compact('list', 'grade'));
    }
    /**
     * 编辑
     */
    public function edit()
    {
        $user_id = $this->postData('user_id');
        $model = UserModel::detail($user_id);
        if ($this->request->isGet()) {
            return $this->renderSuccess('', compact('model'));
        }
        if ($model->edit($this->postData())) {
            return $this->renderSuccess('更新成功');
        }
        return $this->renderError($model->getError() ?: '更新失败');
    }
    /**
     * 软删除
     */
    public function delete($user_id)
    {
        $model = UserModel::detail($user_id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/supplier/controller/plus/release/Evaluate.php
New file
@@ -0,0 +1,40 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\Evaluate as EvaluateModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 项目
 */
class Evaluate extends Controller
{
    /**
     * 列表
     */
    public function list()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new EvaluateModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 删除
     */
    public function delete($id)
    {
        // 详情
        $model = EvaluateModel::detail($id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/supplier/controller/plus/release/Grade.php
New file
@@ -0,0 +1,66 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\Grade as GradeModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 等级
 */
class Grade extends Controller
{
    /**
     * 等级列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new GradeModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 添加等级
     */
    public function add()
    {
        $model = new GradeModel;
        // 新增记录
        if ($model->add($this->postData())) {
            return $this->renderSuccess('添加成功');
        }
        return $this->renderError('添加失败');
    }
    /**
     * 编辑等级
     */
    public function edit($grade_id)
    {
        $model = GradeModel::detail($grade_id);
        // 修改记录
        if ($model->edit($this->postData())) {
            return $this->renderSuccess();
        }
        return $this->renderError();
    }
    /**
     * 删除等级
     */
    public function delete($grade_id)
    {
        // 等级详情
        $model = GradeModel::detail($grade_id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/supplier/controller/plus/release/Order.php
New file
@@ -0,0 +1,91 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\Order as OrderModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 订单
 */
class Order extends Controller
{
    /**
     * 订单列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new OrderModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 编辑
     */
    public function edit()
    {
        $id = $this->postData('id');
        $model = OrderModel::detail($id);
        // 修改记录
        if ($model->edit($this->postData())) {
            return $this->renderSuccess();
        }
        return $this->renderError();
    }
    /**
     * 线下支付
     */
    public function onCash($id)
    {
        // 订单信息
        $model = OrderModel::detail($id);
        if ($model->onCash($this->postData())) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 完成订单
     */
    public function onFinish($id)
    {
        // 订单信息
        $model = OrderModel::detail($id);
        if ($model->onFinish($this->postData())) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 审核:用户取消订单
     */
    public function onCancel($id)
    {
        $model = OrderModel::detail($id);
        if ($model->confirmCancel($this->postData())) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError('操作失败');
    }
    /**
     * 订单导出
     */
    public function export()
    {
        $model = new OrderModel();
        return $model->exportList($this->postData());
    }
}
admin/app/supplier/controller/plus/release/ReleaseCategory.php
New file
@@ -0,0 +1,68 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\ReleaseCategory as ReleaseCategoryModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 商品分类
 */
class ReleaseCategory extends Controller
{
    /**
     * 分类列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new ReleaseCategoryModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 删除商品分类
     */
    public function delete($category_id)
    {
        $model = (new ReleaseCategoryModel())->find($category_id);
        if ($model->setDelete()) {
            return $this->renderSuccess('删除成功');
        }
        return $this->renderError($model->getError() ?:'删除失败');
    }
    /**
     * 添加商品分类
     */
    public function add()
    {
        $model = new ReleaseCategoryModel;
        // 新增记录
        $postData = $this->request->post();
        if ($model->add($postData)) {
            return $this->renderSuccess('添加成功');
        }
        return $this->renderError($model->getError() ?:'添加失败');
    }
    /**
     * 编辑商品分类
     */
    public function edit($category_id)
    {
        // 模板详情
        $model = ReleaseCategoryModel::detail($category_id);
        // 更新记录
        if ($model->edit($this->request->post())) {
            return $this->renderSuccess('更新成功');
        }
        return $this->renderError($model->getError() ?: '更新失败');
    }
}
admin/app/supplier/controller/plus/release/Setting.php
New file
@@ -0,0 +1,144 @@
<?php
namespace app\supplier\controller\plus\release;
use app\common\model\settings\Setting as SettingModel;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\Setting as ReleaseSettingModel;
use app\shop\model\product\Product as ProductModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 设置控制器
 */
class Setting extends Controller
{
    public $pay_type = [
        ['id' => '10', 'name' => '微信支付'],
        ['id' => '20', 'name' => '支付宝'],
        ['id' => '30', 'name' => '银行卡']
    ];
    public $pay_type1 = [
        10 => '微信支付',
        20 => '支付宝',
        30 => '银行卡'
    ];
    /**
     * 设置
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $pay_type = $this->pay_type;
        $data = ReleaseSettingModel::getAll();
        return $this->renderSuccess('', compact('data','pay_type'));
    }
    /**
     * 基础信息设置
     */
    public function basic()
    {
        $param = $this->postData();
        $data['basic'] = $param;
        return $this->edit($data);
    }
    /**
     * 条件设置
     */
    public function condition()
    {
        $param = $this->postData();
        $data['condition'] = $param;
        return $this->edit($data);
    }
    /**
     * 佣金设置
     */
    public function commission()
    {
        $param = $this->postData();
        $data['commission'] = $param;
        return $this->edit($data);
    }
    /**
     * 结算设置
     */
    public function settlement()
    {
        $param = $this->postData('form');
        $data['settlement'] = $param;
        return $this->edit($data);
    }
    /**
     * 自定义文字设置
     */
    public function words()
    {
        $param = $this->postData();
        $data['words'] = $param;
        return $this->edit($data);
    }
    /**
     * 申请协议设置
     */
    public function license()
    {
        $param = $this->postData();
        $data['license'] = $param;
        return $this->edit($data);
    }
    /**
     * 页面背景设置
     */
    public function background()
    {
        $param = $this->postData();
        $data['background'] = $param;
        return $this->edit($data);
    }
    /**
     * 修改
     */
    public function edit($data)
    {
        $model = new ReleaseSettingModel;
        if ($model->edit($data)) {
            return $this->renderSuccess('更新成功');
        }
        return $this->renderError($model->getError() ?: '更新失败');
    }
    /**
     * 分销海报
     */
    public function qrcode()
    {
        if (!$this->request->post()) {
            $data = RepairSettingModel::getItem('qrcode');
            return $this->renderSuccess('', ['data' => $data]);
        }
        $model = new RepairSettingModel;
        if ($model->edit(['qrcode' => $this->postData('form')])) {
            return $this->renderSuccess('更新成功');
        }
        return $this->renderError($model->getError() ?: '更新失败');
    }
}
admin/app/supplier/controller/plus/release/SupplyApply.php
New file
@@ -0,0 +1,43 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\SupplyApply as ApplyModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 控制器
 */
class SupplyApply extends Controller
{
    /**
     * 分销商申请列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new ApplyModel;
        $apply_list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('apply_list'));
    }
    /**
     * 审核分销商
     */
    public function editApplyStatus($apply_id)
    {
        $model = ApplyModel::detail($apply_id);
        if ($model->submit($this->postData())) {
            return $this->renderSuccess('修改成功');
        }
        return $this->renderError('修改失败');
    }
}
admin/app/supplier/controller/plus/release/SupplyProject.php
New file
@@ -0,0 +1,53 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\SupplyProject as ProjectModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 项目
 */
class SupplyProject extends Controller
{
    /**
     * 列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new ProjectModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
/**
     * 审核
     */
    public function submit($project_id)
    {
        $model = ProjectModel::detail($project_id);
        if ($model->submit($this->postData())) {
            return $this->renderSuccess('操作成功');
        }
        return $this->renderError($model->getError() ?: '操作失败');
    }
    /**
     * 删除
     */
    public function delete($project_id)
    {
        // 详情
        $model = ProjectModel::detail($project_id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/supplier/controller/plus/release/SupplyUser.php
New file
@@ -0,0 +1,59 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\SupplyUser as UserModel;
use app\shop\model\plus\release\Grade;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 控制器
 */
class SupplyUser extends Controller
{
    /**
     * 列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new UserModel;
        $list = $model->getList($this->postData());
        $GradeModel = new Grade();
        $grade = $GradeModel->getLists();
        return $this->renderSuccess('', compact('list', 'grade'));
    }
    /**
     * 编辑
     */
    public function edit()
    {
        $user_id = $this->postData('user_id');
        $model = UserModel::detail($user_id);
        if ($this->request->isGet()) {
            return $this->renderSuccess('', compact('model'));
        }
        if ($model->edit($this->postData())) {
            return $this->renderSuccess('更新成功');
        }
        return $this->renderError($model->getError() ?: '更新失败');
    }
    /**
     * 软删除
     */
    public function delete($user_id)
    {
        $model = UserModel::detail($user_id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
admin/app/supplier/controller/plus/release/Tag.php
New file
@@ -0,0 +1,71 @@
<?php
namespace app\supplier\controller\plus\release;
use app\supplier\controller\Controller;
use app\shop\model\plus\release\Tag as TagModel;
use app\supplier\model\supplier\Supplier as SupplierModel;
/**
 * 标签
 */
class Tag extends Controller
{
    /**
     * 列表
     */
    public function index()
    {
        $supplier = SupplierModel::detail($this->getSupplierId());
        if(empty($supplier["is_release"])){
            return $this->renderError('没有权限');
        }
        $model = new TagModel;
        $list = $model->getList($this->postData());
        return $this->renderSuccess('', compact('list'));
    }
    /**
     * 添加
     */
    public function add()
    {
        $model = new TagModel;
        // 新增记录
        if ($model->add($this->postData())) {
            return $this->renderSuccess('添加成功');
        }
        return $this->renderError('添加失败');
    }
    /**
     * 编辑
     */
    public function edit()
    {
        $tag_id = $this->postData('tag_id');
        $model = TagModel::detail($tag_id);
        if($this->request->isGet()){
            return $this->renderSuccess('', compact( 'model'));
        }
        // 修改记录
        if ($model->edit($this->postData())) {
            return $this->renderSuccess();
        }
        return $this->renderError();
    }
    /**
     * 删除
     */
    public function delete($tag_id)
    {
        // 详情
        $model = TagModel::detail($tag_id);
        if (!$model->setDelete()) {
            return $this->renderError('删除失败');
        }
        return $this->renderSuccess('删除成功');
    }
}
mobile/pages.json
@@ -2311,6 +2311,27 @@
                        "navigationBarTitleText": "提现明细",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "release/chat/chat",
                    "style": {
                        "navigationBarTitleText": "聊天信息",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "release/chat/chat_list",
                    "style": {
                        "navigationBarTitleText": "聊天列表",
                        "enablePullDownRefresh": false
                    }
                },
                {
                    "path": "release/project/look-evaluate/look-evaluate",
                    "style": {
                        "navigationBarTitleText": "评论列表",
                        "enablePullDownRefresh": false
                    }
                }
            ]
        }
mobile/pages/branch/admin/activity/user.vue
@@ -34,6 +34,7 @@
                            <view class="d-b-c mb16 f28 gray3">姓名:{{ item.real_name }}</view>
                            <view class="d-b-c mb16 f28 gray3">手机号:{{ item.mobile }}</view>
                            <view class="d-b-c mb16 f28 gray3">邀请人:{{ item.recommend_name }}</view>
                            <view class="d-b-c mb16 f28 gray3">所属分会:{{ item.branch.name }}</view>
                            <view class="gray9">报名时间:{{ item.create_time }}</view>
                        </view>
                        <view class="f26">
mobile/pages3/release/chat/chat.vue
New file
@@ -0,0 +1,585 @@
<template>
    <view class="im_interface">
        <scroll-view id="scrollview" scroll-y="true" :style="'height: '+scrollviewHigh + 'px'" :scroll-with-animation="true"
         :scroll-top="scrollTop" @scrolltoupper='newdata'>
            <view class="im_interface_content" ref='container'>
                <view :class="item.user_id == user_id?'im_text':'im_text2'" class="m-item" v-for="(item,index) in content_list" :key="index">
                    <image class="avatar" :src="item.user_id != user_id?item.user.avatarUrl:avatarUrl"
                     mode=""></image>
                    <view>
                        <view class="my_date">{{item.create_time}}</view>
                        <view :class="item.user_id == user_id?'my_content my_text_content':'you_content you_text_content'">
                            {{item.content}}
                        </view>
                    </view>
                </view>
            </view>
            <view style="width: 100%;height: 130rpx;"></view>
        </scroll-view>
        <view class="buttom" :style="'bottom:' +inputBottom+'px;'">
            <input type="text" v-model="content" @confirm="send_content()" confirm-type="send" @focus="inputFocus" @blur="inputBlur"
             :adjust-position="false" placeholder="请输入....." />
            <view class="upload_box">
                <button @click="send_content()">发送</button>
            </view>
        </view>
        <Upload v-if="isupload" :isupload="isupload" :type="type" @getImgs="getImgsFunc">上传图片</Upload>
    </view>
</template>
<script>
    import Upload from '@/components/upload/upload';
    export default {
        data() {
            return {
                user_id: '', //我的user_id
                you_user_id: '', //对方的suser_id
                myavatarUrl: '',
                avatarUrl: '',
                phoneHeight: 0,
                /*可滚动视图区域高度*/
                scrollviewHigh: 0,
                content: '', //用户输入的内容
                content_list: [], //聊天信息数据
                style: {
                    pageHeight: 0,
                    contentViewHeight: 0,
                    footViewHeight: 90,
                    mitemHeight: 0
                },
                scrollTop: 0,
                page: 1,
                nomore: false,
                scrollHeight: 0,
                nickName: '',
                inputBottom: 0,
                is_Ios: true,
            }
        },
        components: {},
        created() {
            let self = this;
            const res = uni.getSystemInfoSync(); //获取手机可使用窗口高度     api为获取系统信息同步接口
            this.style.pageHeight = res.windowHeight;
            this.style.contentViewHeight = res.windowHeight - uni.getSystemInfoSync().screenWidth / 750 * (100) - 70; //像素
        },
        onShow() {
            this.getAvatarUrl();
            this.init();
            this.isuserAgent();
        },
        onLoad(option) {
            let self = this;
            self.you_user_id = option.you_user_id;
            self.nickName = option.nickname;
            self.avatarUrl = option.avatarurl;
            uni.setNavigationBarTitle({
                title: self.nickName
            })
            this.get_content_list();
        },
        methods: {
            /*初始化*/
            init() {
                let self = this;
                uni.getSystemInfo({
                    success(res) {
                        self.phoneHeight = res.windowHeight;
                        // 计算组件的高度
                        self.scrollviewHigh = self.phoneHeight;
                    }
                });
            },
            initData() {
                this.page++;
                this.get_content_list();
            },
            // 发送消息
            send_content() {
                if (this.content == '') {
                    uni.showToast({
                        title: '发送内容不能为空!',
                        icon: 'none'
                    })
                    return false
                }
                let self = this;
                let item = {
                    content: this.content,
                    user_id: this.user_id,
                    create_time: self.formatDate(),
                    user: {
                        avatarUrl: self.myavatarUrl
                    }
                }
                this.content_list = [...this.content_list, item];
                this.$nextTick(function() {
                    this.scrollToBottom()
                })
                uni.showLoading({
                    title: '加载中'
                })
                self._post('plus.release.chat/add', {
                    content: self.content,
                    you_user_id: self.you_user_id,
                }, (res) => {
                    self.content = '';
                    uni.hideLoading()
                })
            },
            getAvatarUrl() {
                let self = this;
                self.user_id = uni.getStorageSync('user_id')
                self._get(
                    'plus.release.chat/getInfo', {},
                    function(res) {
                        self.myavatarUrl = res.data.info.avatarUrl;
                    }
                );
            },
            //获取聊天记录
            get_content_list() {
                let self = this;
                uni.showLoading({
                    title: '加载中'
                })
                self._post('plus.release.chat/message', {
                    //被聊天人的user_id
                    page: self.page,
                    you_user_id: self.you_user_id,
                }, (res) => {
                    console.log(self.content_list)
                    let list = res.data.list.data.reverse();
                    self.content_list = [...list, ...self.content_list];
                    console.log(self.content_list)
                    if (res.data.list.last_page <= self.page) {
                        self.nomore = true;
                    }
                    if (self.page == 1) {
                        self.$nextTick(() => {
                            self.scrollToBottom();
                        });
                    } else {
                        self.$nextTick(() => {
                            const newquery = uni.createSelectorQuery().in(self);
                            newquery.select('.im_interface_content').boundingClientRect(data => {
                                console.log(data)
                                self.scrollTop = data.height - self.scrollHeight;
                            }).exec();
                        });
                    }
                    uni.hideLoading()
                })
            },
            scrollToBottom: function() {
                let self = this;
                let query = uni.createSelectorQuery();
                query.selectAll('.m-item').boundingClientRect();
                query.select('#scrollview').boundingClientRect();
                query.exec((res) => {
                    self.style.mitemHeight = 0;
                    res[0].forEach((rect) => self.style.mitemHeight = self.style.mitemHeight + rect.height +
                        40)
                    setTimeout(() => {
                        if (self.style.mitemHeight > (self.style.contentViewHeight - 100)) {
                            self.scrollTop = self.style.mitemHeight - self.style.contentViewHeight +
                                150
                        }
                    }, 300)
                })
            },
            getJSON(str) {
                return JSON.parse(str)
            },
            newdata() {
                let self = this;
                this.page++;
                const query = uni.createSelectorQuery().in(this);
                query.select('.im_interface_content').boundingClientRect(data => {
                    this.scrollHeight = data.height;
                }).exec();
                this.get_content_list();
            },
            inputFocus(e) {
                this.inputBottom = e.detail.height;
            },
            inputBlur() {
                this.inputBottom = 0;
            },
            isuserAgent() {
                let self = this;
                switch (uni.getSystemInfoSync().platform) {
                    case 'android':
                        self.is_Ios = false;
                        console.log('运行Android上')
                        break;
                    case 'ios':
                        console.log('运行iOS上')
                        break;
                    default:
                        console.log('运行在开发者工具上')
                        break;
                }
            },
            formatDate() {
                let date = new Date();
                let year = date.getFullYear(); // 年
                let month = date.getMonth() + 1; // 月
                let day = date.getDate(); // 日
                let week = date.getDay(); // 星期
                let weekArr = ["星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六"];
                let hour = date.getHours(); // 时
                hour = hour < 10 ? "0" + hour : hour; // 如果只有一位,则前面补零
                let minute = date.getMinutes(); // 分
                minute = minute < 10 ? "0" + minute : minute; // 如果只有一位,则前面补零
                let second = date.getSeconds(); // 秒
                second = second < 10 ? "0" + second : second; // 如果只有一位,则前面补零
                return `${year}-${month}-${day} ${hour}:${minute}:${second}`;
            },
        }
    }
</script>
<style>
    page {
        background-color: #EDEDED;
    }
    .im_interface {
        width: 750rpx;
    }
    .im_interface_content {
        padding: 20rpx 50rpx;
    }
    .buttom {
        width: 750rpx;
        height: 130rpx;
        background-color: #F7F7F7;
        border-top: 1px #D2D2D2 solid;
        display: flex;
        justify-content: flex-start;
        align-items: flex-start;
        position: fixed;
        bottom: 0;
        padding-top: 20rpx;
        box-sizing: border-box;
    }
    .buttom input {
        width: 605rpx;
        height: 75rpx;
        line-height: 75rpx;
        background-color: white;
        display: block;
        padding: 5rpx;
        box-sizing: border-box;
        margin-left: 30rpx;
        border-radius: 10rpx;
        vertical-align: middle;
        position: relative;
        border: 1rpx solid #CCCCCC;
    }
    .buttom button {
        width: 125rpx;
        height: 50rpx;
        line-height: 200%;
        display: block;
        margin: 0 15rpx;
        vertical-align: middle;
        position: relative;
        background-color: #05C160;
        color: white;
    }
    .im_text {
        /* width: 100%; */
        display: flex;
        margin-top: 75rpx;
        flex-direction: row-reverse;
        position: relative;
    }
    .im_text2 {
        /* width: 100%; */
        display: flex;
        margin-top: 75rpx;
        position: relative;
    }
    .im_text .avatar {
        width: 84rpx;
        height: 84rpx;
        margin-left: 3%;
        border-radius: 10rpx;
        background-color: #000000;
        align-items: flex-start;
    }
    .im_text2 .avatar {
        width: 84rpx;
        height: 84rpx;
        margin-right: 3%;
        border-radius: 10rpx;
        background-color: #000000;
        align-items: flex-start;
    }
    .im_text .my_content {
        max-width: 550rpx;
        align-items: flex-start;
        border-radius: 10rpx;
        padding: 17rpx 20rpx;
        box-sizing: border-box;
        word-break: break-all;
    }
    .im_text2 .my_content {
        max-width: 450rpx;
        align-items: flex-start;
        border-radius: 10rpx;
        padding: 10rpx;
        box-sizing: border-box;
        word-break: break-all;
    }
    .im_text .you_content {
        max-width: 450rpx;
        align-items: flex-start;
        border-radius: 10rpx;
        padding: 17rpx 20rpx;
        box-sizing: border-box;
    }
    .im_text2 .you_content {
        max-width: 450rpx;
        align-items: flex-start;
        border-radius: 10rpx;
        padding: 10rpx;
        box-sizing: border-box;
    }
    .my_content {
        background-color: #9EEA6A;
        margin-top: 25rpx;
    }
    .you_content {
        background-color: white;
        margin-top: 25rpx;
    }
    .im_icon {
        position: absolute;
        bottom: -2rpx;
        right: 41px;
        transform: rotate(270deg);
    }
    .im_icon2 {
        position: absolute;
        bottom: 0;
    }
    .im_icon .icon-sanjiao1 {
        color: #9EEA6A;
    }
    .im_icon2 .icon-sanjiao1 {
        position: absolute;
        bottom: 0;
    }
    .upload {
        width: 50rpx;
        height: 50rpx;
        background-color: #007AFF;
        border-radius: 50%;
        line-height: 50rpx;
        text-align: center;
    }
    .cont_img {
        width: 200rpx;
        height: 200rpx;
        border-radius: 10rpx;
    }
    .top_pro {
        /* margin-left: 85rpx; */
    }
    .top_product {
        width: 610rpx;
        height: 200rpx;
        border-radius: 10rpx;
        margin: 0 auto;
        display: flex;
        align-items: flex-start;
        justify-content: flex-start;
        background-color: #FFFFFF;
        padding: 10rpx 20rpx;
        position: relative;
    }
    .top_order {
        width: 610rpx;
        /* height: 200rpx; */
        border-radius: 10rpx;
        margin: 0 auto;
        display: flex;
        align-items: flex-start;
        justify-content: flex-start;
        background-color: #FFFFFF;
        padding: 10rpx 20rpx;
        position: relative;
    }
    .pro_img {
        height: 150rpx;
        width: 150rpx;
        border-radius: 10rpx;
        margin-right: 20rpx;
        background-color: #FFFFFF;
    }
    .pro_name {
        font-size: 28rpx;
        text-overflow: -o-ellipsis-lastline;
        overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 3;
        line-clamp: 3;
        -webkit-box-orient: vertical;
        margin-bottom: 50rpx;
        width: 400rpx;
    }
    .pro_price {
        font-size: 24rpx;
        color: #E2231A;
    }
    .pro_btn {
        position: absolute;
        bottom: 12rpx;
        right: 15rpx;
        width: 180rpx;
        height: 50rpx;
        line-height: 50rpx;
        border-radius: 25rpx;
        text-align: center;
        font-size: 24rpx;
        color: #FFFFFF;
        background-color: #FF6633;
    }
    .orderdetail_btn {
        width: 180rpx;
        height: 50rpx;
        line-height: 50rpx;
        border-radius: 25rpx;
        text-align: center;
        font-size: 24rpx;
        color: #FFFFFF;
        background-color: #FF6633;
        margin-left: 270rpx;
        margin-top: 20rpx;
    }
    .ord_btn {
        position: absolute;
        bottom: 20rpx;
        right: 15rpx;
        width: 180rpx;
        height: 50rpx;
        line-height: 50rpx;
        border-radius: 25rpx;
        text-align: center;
        font-size: 24rpx;
        color: #FFFFFF;
        background-color: #FF6633;
    }
    .close_pro {
        position: absolute;
        top: 12rpx;
        right: 15rpx;
    }
    .product_item {
        width: 400rpx;
        height: 200rpx;
    }
    .product_txtitem {
        display: flex;
        width: 550rpx;
        /* height: 150rpx; */
    }
    .pro_txtname {
        font-size: 28rpx;
        text-overflow: -o-ellipsis-lastline;
        overflow: hidden;
        text-overflow: ellipsis;
        display: -webkit-box;
        -webkit-line-clamp: 1;
        line-clamp: 1;
        -webkit-box-orient: vertical;
        margin-bottom: 50rpx;
    }
    .my_text_content {
        /* height: 100%; */
        max-width: 430rpx;
    }
    .you_text_content {
        /* height: 100%; */
        max-width: 430rpx;
    }
    .my_date {
        color: #cccccc;
        font-size: 24rpx;
        position: absolute;
        top: -10rpx;
    }
    .im_text .my_date {
        right: 100rpx;
    }
    .sendpro_price {
        position: absolute;
        bottom: 25px;
    }
    .sendord_price {
        position: absolute;
        bottom: 40px;
    }
    .upload_box {
        /* width: 50rpx; */
        height: 75rpx;
        display: flex;
        align-items: center;
        margin-left: 20rpx;
        justify-content: space-around;
        flex: 1;
    }
</style>
mobile/pages3/release/chat/chat_list.vue
New file
@@ -0,0 +1,155 @@
<template>
    <view class="im_index">
        <view class="im_item" v-for="(item,index) in imList" :key="index"
            @click="jumpPage(item.user)">
            <view class="im_item_left">
                <image :src="item.user.avatarUrl" mode=""></image>
            </view>
            <view class="im_item_right">
                <view class="im_item_right_item">
                    <view class="title text-ellipsis">{{item.user.nickName}}</view>
                    <view class="time">{{item.newMessage.create_time}}</view>
                </view>
                <view class="im_item_right_item">
                    <view class="content">{{item.newMessage.content}}</view>
                    <view v-if="item.num>0" class="message">{{item.num}}</view>
                </view>
            </view>
        </view>
        <view class="hint" v-if="imList.length==0">
            您当前并没有与任何人聊天哦!
        </view>
    </view>
</template>
<script>
    export default {
        data() {
            return {
                imList: [],
            }
        },
        onShow() {
            this.get_im_list();
        },
        onLoad() {
        },
        methods: {
            //获取聊天列表
            get_im_list() {
                let self = this;
                self._post('plus.release.chat/index', {
                }, (res) => {
                    self.imList = res.data.list;
                })
            },
            jumpPage(user) {
                console.log(user)
                this.gotoPage('/pages3/release/chat/chat?you_user_id=' + user.user_id + '&avatarurl=' + user.avatarUrl +
                    '&nickname=' + user.nickName);
            },
        }
    }
</script>
<style>
    .im_index {
        width: 100%;
    }
    .im_item {
        width: 90%;
        height: 120rpx;
        margin: 0 auto;
        display: flex;
        align-items: center;
    }
    .im_item_left {
        box-sizing: border-box;
        display: flex;
        justify-content: center;
        align-items: center;
    }
    .im_item_left image {
        width: 80rpx;
        height: 80rpx;
        margin: 0 auto;
        margin-top: 5%;
        border-radius: 50%;
        background-color: rgba(0, 0, 0, 0.1);
    }
    .im_item_right {
        width: 555rpx;
        padding: 10rpx;
        border-bottom: 1px #dcdcdc solid;
        box-sizing: border-box;
        display: flex;
        flex-direction: column;
    }
    .message {
        width: 30rpx;
        height: 30rpx;
        border-radius: 50%;
        color: white;
        background-color: red;
        display: flex;
        justify-content: center;
        align-items: center;
        font-size: 15rpx;
    }
    .im_item_right_item {
        display: flex;
        align-items: center;
        justify-content: space-between;
        margin-bottom: 10rpx;
    }
    .title {
        font-size: 32rpx;
    }
    .guangfang {
        font-size: 16rpx;
        color: #F36A24;
        border: 1rpx #F36A24 solid;
        border-radius: 10rpx;
        padding: 5rpx 10rpx;
        box-sizing: border-box;
        position: relative;
        left: -65rpx;
    }
    .time {
        font-size: 26rpx;
        color: #999999;
        flex-shrink: 0;
    }
    .content {
        font-size: 26rpx;
        color: #999999;
        overflow: hidden;
        text-overflow: ellipsis;
        white-space: nowrap;
        overflow: hidden;
        word-break: break-all;
    }
    .hint {
        width: 750rpx;
        text-align: center;
        font-size: 32rpx;
        color: #585858;
        margin-top: 20rpx;
    }
</style>
mobile/pages3/release/demandindex/index.vue
@@ -20,12 +20,21 @@
                        <view class="photo">
                            <image :src="user.avatarUrl" mode="aspectFill"></image>
                        </view>
                        <view>
                        <view class="user-name">
                            <view class="gray3 f32">{{ user.nickName }}</view>
                        </view>
                        <view class="gray3 d-s-c mt10">
                            <text class="f28 flex-1 mr20">连盟币:{{user.points}}</text>
                            <view @click="jump">
                                <text>[切换到供应方]</text>
                                <text class="iconfont icon-jiantou"></text>
                            </view>
                        </view>
                        </view>
                    </view>
                </view>
                <!-- <view class="d-s-c p-30-0 top_dash">
                    <view class="flex-1 d-c-c d-c">
                        <view class="redF6">
@@ -54,6 +63,14 @@
                    <button type="primary" class="btn-gcred theme-btn flex-1" @click="gotoPage('/pages3/release/demandproject/index')">发布需求</button>
                </view>-->
            </view>
            <view class="bind_phone" v-if="release.is_check == 0">
                <view class="bind_content">
                    <view class="bind_txt">您还没有查看信息权限,需{{pay_price}}连盟币开通</view>
                    <button class="bind_btn" @click="topay">去开通</button>
                </view>
            </view>
            <!--图标入口-->
            <view class="agent-wrap m-0-20 p30 d-s-c f-w mt20 bg-white">
                <view class="d-c-c d-c flex-1" @click="gotoPage('/pages3/release/project/list?product_type=1')">
@@ -68,12 +85,12 @@
                    </view>
                    <text class="pt10 f26 mt20">发布需求</text>
                </view>
                <view class="d-c-c d-c flex-1" @click="gotoPage('/pages3/release/demandorder/index')">
                <view class="d-c-c d-c flex-1" @click="gotoPage('/pages3/release/chat/chat_list')">
                    <view>
                        <image class="agent_index_img" src="../../../static/icon/icon-zijinmingxi.png" mode=""></image>
                    </view>
                    <text class="pt10 f26 mt20">需求订单</text>
                </view>
                    <text class="pt10 f26 mt20">私信列表</text>
                </view>
                
    
                 <!--<view class="d-c-c d-c flex-1" @click="gotoPage('/pages2/salesman/qrcode/qrcode')">
@@ -118,6 +135,8 @@
                /*顶部背景*/
                top_background: '',
                user:[],
                setting:[],
                pay_price:0,
            };
        },
        onLoad(e) {
@@ -138,10 +157,39 @@
                    self.top_background = data.data.background;
                    self.release = data.data.release;
                    self.user = data.data.user;
                    self.setting = data.data.setting;
                    if(self.setting.check_price && self.setting.check_price!= null){
                        self.pay_price = self.setting.check_price;
                    }
                    self.isData = true;
                    self.loadding = false;
                    uni.hideLoading();
                });
            },
            topay() {
                let self = this;
                let formData=self.form;
                uni.showLoading({
                    title: '加载中'
                });
                self._post(
                    'plus.release.demandIndex/topay', {
                        pay_source: self.getPlatform(),
                        formData: JSON.stringify(formData),
                    },
                     function(res) {
                        uni.hideLoading();
                        self.showSuccess(res.msg,function(){
                            self.getData();
                        });
                    }
                );
            },
            /*切换身份*/
            jump() {
                this.gotoPage('/pages3/release/supplyindex/index');
            },
            /*申请入驻*/
@@ -365,4 +413,36 @@
    .user-info .photo {
        padding-right: 20rpx;
    }
    .bind_phone {
        width: 100%;
        height: 80rpx;
        padding: 0 30rpx;
        box-sizing: border-box;
        margin-bottom: 30rpx;
    }
    .bind_content {
        display: flex;
        justify-content: space-between;
        align-items: center;
        background: #ffffff;
        /* box-shadow: 0 0 6rpx 0 rgba(0, 0, 0, 0.1); */
        border-radius: 16rpx;
        height: 100%;
        padding: 0 20rpx;
    }
    .bind_txt {}
    .bind_btn {
        width: 134rpx;
        height: 50rpx;
        line-height: 50rpx;
        font-size: 22rpx;
        border-radius: 25rpx;
        text-align: center;
        color: #FFFFFF;
        background-color: #e2231a;
    }
</style>
mobile/pages3/release/demandproject/edit.vue
@@ -47,6 +47,14 @@
                    <input class="flex-1" v-model="form.detail" type="text" placeholder-class="grary" placeholder="请输入您的期望地点" />
                </view>
                
                <view class="textarea-box d-s-c f28">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_content" placeholder="请输入产品介绍" />
                </view>
                <view class="textarea-box d-s-c f28 mt10">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_case" placeholder="请输入产品应用案例" />
                </view>
                <!-- <view class="form-item border-b">
                    <text class="field-name">需求所在地:</text>
                    <input class="flex-1" name="location_address" type="text"  placeholder-class="grary9" placeholder="请选择地址" v-model="short_address"
@@ -112,6 +120,8 @@
                project_id:'',
                image_list:[],
                content:'',
                product_content:'',
                product_case:'',
                name:'',
                category_id:'',
                finish_time:'请选择日期',
mobile/pages3/release/demandproject/release.vue
@@ -47,6 +47,14 @@
                    <input class="flex-1" v-model="form.detail" type="text" placeholder-class="grary" placeholder="请输入您的期望地点" />
                </view>
                
                <view class="textarea-box d-s-c f28">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_content" placeholder="请输入产品介绍" />
                </view>
                <view class="textarea-box d-s-c f28 mt10">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_case" placeholder="请输入产品应用案例" />
                </view>
                <!-- <view class="form-item border-b">
                    <text class="field-name">需求所在地:</text>
                    <input class="flex-1" name="location_address" type="text"  placeholder-class="grary9" placeholder="请选择地址" v-model="short_address"
@@ -67,6 +75,8 @@
                    </radio-group>
                </view>
                
                <view class="form-item border-b">
                    <view class="field-name">是否展示:</view>
                    <radio-group class="d-s-c" @change="changeShow($event,index)">
@@ -79,6 +89,11 @@
                            <view class="f26 color-57">否</view>
                        </label>
                    </radio-group>
                </view>
                <view class="form-item border-b">
                    <view class="field-name">支付金额:</view>
                    <view>{{pay_price}}连盟币</view>
                </view>
                
            </view>
@@ -111,6 +126,8 @@
            form: {
                image_list:[],
                content:'',
                product_content:'',
                product_case:'',
                name:'',
                category_id:'',
                finish_time:'请选择日期',
@@ -136,6 +153,8 @@
            short_address:'',
            show_phone:1,
            Address:[],
            setting:[],
            pay_price:0,
        };
    },
    onLoad(e){
@@ -189,6 +208,10 @@
                uni.hideLoading();
                self.loadding=false;
                self.categoryList = res.data.category_list;
                self.setting = res.data.setting;
                if(self.setting.demand_price && self.setting.demand_price!= null){
                    self.pay_price = self.setting.demand_price;
                }
                var list = [];
                list.push("请选择分类");
                self.categoryList.forEach(item => {
mobile/pages3/release/project/detail.vue
@@ -19,14 +19,14 @@
            <!--基本信息-->
            <view class="bg-white p30 mb22">
                <view class="product-name text-ellipsis-2">
                    标题:{{ detail.name }}
                    <span class="category">{{  detail.category.name }}</span>{{ detail.name }}
                </view>
                <view class="product-describe"><text v-if="detail.product_type == 0">预算</text><text v-else>价格</text>:¥{{ detail.price }}</view>
                <view class="product-describe"><text v-if="detail.product_type == 0">期望完成时间</text><text v-else>交付时间</text>:{{ detail.finish_time }}</view>
                <view class="product-describe"><text v-if="detail.product_type == 0">期望地点</text><text v-else>服务地区</text>:{{ detail.detail }}</view>
                <view class="product-describe" v-if="detail.product_type == 0 && detail.show_phone == 1">电话:{{ user.mobile }}</view>
                <view class="product-describe"><text v-if="detail.product_type == 0">预算</text><text v-else>价格</text>一 ¥{{ detail.price }}</view>
                <view class="product-describe"><text v-if="detail.product_type == 0">期望完成时间</text><text v-else>交付时间</text>一 {{ detail.finish_time }}</view>
                <view class="product-describe"><text v-if="detail.product_type == 0">期望地点</text><text v-else>服务地区</text>一 {{ detail.detail }}</view>
                <view class="product-describe" v-if="detail.product_type == 0 && detail.show_phone == 1"><text>电话</text>一 {{ user.mobile }}</view>
                <view class="product-describe" v-if="detail.tag_list.length > 0">
                       标签:<text v-for="(item, index) in detail.tag_list" :key="index">{{ item.name}};</text>
                       <text>标签</text>一 <span class="tag" v-for="(item, index) in detail.tag_list" :key="index">{{ item.name}}</span>
                </view>
            </view>
@@ -38,7 +38,52 @@
                </view>
                <view class="content-box" v-html="detail.content"></view>
            </view>
            <!--产品介绍-->
            <view class="product-content">
                <view class="p-0-30  border-b-e">
                    <view class="group-hd d-s-c"><text class="min-name f28">产品介绍</text></view>
                </view>
                <view class="content-box" v-html="detail.product_content"></view>
            </view>
            <!--产品案例-->
            <view class="product-content">
                <view class="p-0-30  border-b-e">
                    <view class="group-hd d-s-c"><text class="min-name f28">产品应用案例</text></view>
                </view>
                <view class="content-box" v-html="detail.product_case"></view>
            </view>
            <!--评论-->
            <view class="product-comment">
                <view class="p-0-30 d-b-c">
                    <view class="group-hd left">
                        <text class="min-name f28">评论</text>
                    </view>
                    <view class="right" @click="lookEvaluate(detail.project_id)">
                        <text class="more">查看全部</text>
                        <text class="icon iconfont icon-jiantou" style="font-size: 22rpx;color: #9A9A9A;"></text>
                    </view>
                </view>
                <view class="comment-list" v-if="detail.evaluate.length > 0">
                    <view class="item" v-if="index<=2" v-for="(item, index) in detail.evaluate" :key="index">
                        <view class="cmt-user">
                            <view class="left">
                                <image class="photo" :src="item.user.avatarUrl" mode="aspectFill"></image>
                                <text class="name">{{ item.user.nickName }}</text>
                            </view>
                            <text class="datetime">{{ item.create_time }}</text>
                        </view>
                        <view class="mt20 lh150 f24">{{ item.evaluate_content }}</view>
                    </view>
                </view>
            </view>
            <view class="sage-bottom"></view>
        </scroll-view>
        <!--底部按钮-->
@@ -49,18 +94,22 @@
                    <text class="f22 gray3" style="height: 50rpx;line-height: 40rpx;">首页</text>
                </button>
            </view>
            <!-- <view class="icon-box d-c-c">
                <button class="d-c-c d-c bg-white">
             <view class="icon-box d-c-c">
                <button class="d-c-c d-c bg-white" @click="jump()">
                    <text class="icon iconfont icon-kefu2 gray3" style="height: 50rpx;line-height: 60rpx;"></text>
                    <text class="f22 gray3" style="height: 50rpx;line-height: 40rpx;">联系他</text>
                    <text class="f22 gray3" style="height: 50rpx;line-height: 40rpx;">咨询</text>
                </button>
            </view> -->
            </view>
            <template>
                <template>
                    <button class="buy" @click="onPayOrder()">创建订单</button>
                    <button class="buy" @click="onEva()">我要评论</button>
                </template>
            </template>
        </view>
        <!-- 评论 -->
        <Evaluate :isEva="isEva" :project_id="detail.project_id" @close="closeEva"></Evaluate>
        
        <!--支付选择-->
        <Popup :show="isPayPopup" msg="支付方式" @hidePopup="hidePopupFunc">
@@ -97,12 +146,14 @@
<script>
    import utils from '@/common/utils.js';
    import Popup from '@/components/uni-popup.vue';
    import Evaluate from './popup/evaluate';
    import {
            pay
        } from '@/common/pay.js';
    export default {
        components: {
            Popup,
            Evaluate,
        },
        data() {
            return {
@@ -135,6 +186,7 @@
                pay_type: 20,
                payData:[],
                topay:false,
                isEva:false,
        };
    },
    onLoad(e) {
@@ -227,6 +279,24 @@
                    uni.hideLoading();
                });
            },
            /*评论*/
            onEva: function(e) {
                let self = this;
                self.isEva = true;
            },
            /*关闭评论*/
            closeEva: function(e) {
                let self = this;
                self.getData();
                self.isEva = false;
            },
            /*查看更多评论*/
            lookEvaluate(project_id) {
                this.gotoPage('/pages3/release/project/look-evaluate/look-evaluate?project_id=' + project_id);
            },
    
        /*隐藏支付方式*/
@@ -304,6 +374,14 @@
                
            }
            
        },
        jump() {
            let self = this;
            let you_user_id = self.user.user_id;
            let nickname = self.user.user.nickName;
            let avatarurl = self.user.user.avatarUrl;
            this.gotoPage('/pages3/release/chat/chat?you_user_id='+you_user_id+'&nickname='+nickname+'&avatarurl='+avatarurl);
        },
            
@@ -417,8 +495,8 @@
    }
    .product-content .content-box {
        padding:5rpx 10rpx;
        font-size: 36rpx;
        padding:5rpx 40rpx;
        font-size: 30rpx;
    }
    .sage-bottom {
@@ -1020,4 +1098,17 @@
        width: 108rpx;
        height: 108rpx;
    }
    .tag{
        padding:2rpx 5rpx;
        margin-right: 5rpx;
        border:1px solid red;
        color:red;
    }
    .category{ padding:4rpx 5rpx; margin-right: 5rpx; background: red; color: #fff;}
    .product-describe text{
        font-size: 25rpx;
        display: block;
        font-weight: bold;
        margin-bottom: 5rpx;
    }
</style>
mobile/pages3/release/project/list.vue
@@ -19,18 +19,23 @@
                    <view class="scroll_box">
                        <scroll-view class="scroll" scroll-x="true" upper-threshode="50">
                                <view :class="category_id == 0?'scroll-view-item_H active':'scroll-view-item_H'"  @click="changeCategory(0)">全部</view>
                                <view :class="category_id == '-1'?'scroll-view-item_H active':'scroll-view-item_H'"  @click="changeCategory('-1')">推荐</view>
                                <view v-for="(item,index) in category_list" :key="index" :class="category_id==item.category_id?'scroll-view-item_H active':'scroll-view-item_H'"  @click="changeCategory(item.category_id)">{{item.name}}</view>
                         </scroll-view>
                    </view>
                </view>
                
                <!--列表-->
                <view class="list d-s-c f-w">
                <!-- <view class="list d-s-c f-w">
                    <view class="item d-stretch" v-for="(item, index) in listData" :key="index" >
                        <view class="product-info d-b-c d-c" @click="gotoDetail(item)">
                            <view style="border-bottom: 1px solid #ccc; width: 100%; display: flex; justify-content: flex-start; align-items: center; padding-bottom: 5rpx;">
                                <image style="width:100rpx;height: 100rpx; border-radius: 50%; margin-right: 10rpx;" :src="item.user.avatarUrl" mode="widthFix"></image>
                                {{ item.user.nickName }}
                                <view>
                                    {{ item.user.nickName }}
                                    <view v-if="item.grade" style="width:50rpx;height: 50rpx;"><image style="width:50rpx;height: 50rpx;" :src="item.grade.img"></image></view>
                                </view>
                            </view>
                            <view class="product-title f26 gray3">
                               {{ item.name }}
@@ -42,6 +47,24 @@
                            <view class="people-num price d-b-c">
                                <text class="gray9 f26">{{ item.create_time }}</text>    
                            </view>    
                        </view>
                    </view>
                </view> -->
                <view class="list d-s-c f-w">
                    <view class="item d-stretch" v-for="(item, index) in listData" :key="index" >
                        <view class="product-info d-s-c">
                            <view class="img" @click="gotoDetail(item)"><image :src="item.image" mode="widthFix"></image></view>
                            <view class="content">
                                <view class="product-title f26 gray3">
                                    <view @click="gotoDetail(item)"><text class="category">{{ item.category.name }}</text>{{ item.name }}</view>
                                    <view class="chat"  @click="jump(item)">咨询</view>
                                 </view>
                                 <view class="product_content" @click="gotoDetail(item)">
                                     {{ item.product_content }}
                                 </view>
                            </view>
                        </view>
                    </view>
                </view>
@@ -86,6 +109,7 @@
                category_id:'',
                product_type:0,
                category_list:[],
                is_check:0,
            };
        },
        computed: {
@@ -156,6 +180,14 @@
                self.getlist();
            },    
            
            jump(item) {
                let self = this;
                let you_user_id = item.user_id;
                let nickname = item.user.nickName;
                let avatarurl =item.user.avatarUrl;
                this.gotoPage('/pages3/release/chat/chat?you_user_id='+you_user_id+'&nickname='+nickname+'&avatarurl='+avatarurl);
            },
            
            /*搜索*/
            gotoSearch() {
@@ -183,6 +215,7 @@
                    function(res) {
                        self.loading = false;
                        self.category_list = res.data.category_list;
                        self.is_check = res.data.is_check;
                        self.listData = res.data.list.data;
                        self.last_page = res.data.list.last_page;
                        if (res.data.list.last_page <= 1) {
@@ -198,8 +231,15 @@
            
            /*跳转详情*/
            gotoDetail(e) {
                let url = 'pages3/release/project/detail?project_id=' + e.project_id
                this.gotoPage(url);
                if(this.is_check == 1){
                    let url = 'pages3/release/project/detail?project_id=' + e.project_id
                    this.gotoPage(url);
                }else{
                    uni.showToast({
                        title: '请开通查看权限'
                    });
                }
            },
        }
    };
@@ -303,7 +343,7 @@
    .bargain-list .list .item {
        width: 100%;
        padding: 30rpx;
        padding: 20rpx;
        margin-bottom: 20rpx;
        box-sizing: border-box;
        border-radius: 16rpx;
@@ -324,6 +364,7 @@
        flex: 1;
        //padding-left: 20rpx;
        overflow: hidden;
        align-items: normal;
    }
    .bargain-list .product-cover .people-num {
@@ -348,7 +389,7 @@
    .bargain-list .product-title {
        width: 100%;
        min-height: 40rpx;
        height: 40rpx;
        line-height: 40rpx;
        font-size: 32rpx;
        color: #333333;
@@ -436,4 +477,46 @@
    .scroll-view-item_H.active{
        color: red;
    }
    .img{
        width:160rpx;
        height:160rpx;
        display: flex;
        justify-content: center;
        align-items: center;
    }
    .img img{ max-width: 100%;}
    .product-title{
        width: 100%;
        display: flex;
        justify-content: space-between;
        overflow: hidden;
    }
    .content{
        width:100%;
        padding:5px;
    }
    .product-title .category{
        margin-right: 10rpx;
        padding: 2rpx 18rpx;
        background: red;
        color: #fff;
        font-size: 24rpx;
    }
    .product-title .chat{
        width:70rpx;
        border: 1rpx solid red;
        color: red;
        font-size: 24rpx;
        margin-left: 10rpx;
        text-align: center;
    }
    .product_content{
        margin-top:10px;
        height:80rpx;
        line-height: 40rpx;
        font-size: 26rpx;
        color:#ccc;
        overflow: hidden;
    }
</style>
mobile/pages3/release/project/look-evaluate/look-evaluate.vue
New file
@@ -0,0 +1,295 @@
<template>
    <view class="look-evaluate">
        <view class="top-tabbar">
            <view :class="state_active == -1 ? 'tab-item active' : 'tab-item'" @click="stateFunc(0)">全部({{ Total.all }})
            </view>
            <view :class="state_active == 10 ? 'tab-item active' : 'tab-item'" @click="stateFunc(10)">
                <view class="d-c-c">
                    <text class="icon iconfont icon-pingjiahaoping"></text>
                    <text class="ml10 gray9">好评({{ Total.praise }})</text>
                </view>
            </view>
            <view :class="state_active == 20 ? 'tab-item active' : 'tab-item'" @click="stateFunc(20)">
                <view class="d-c-c">
                    <text class="icon iconfont icon-pingjiazhongping"></text>
                    <text class="ml10 gray9">中评({{ Total.review }})</text>
                </view>
            </view>
            <view :class="state_active == 30 ? 'tab-item active' : 'tab-item'" @click="stateFunc(30)">
                <view class="d-c-c">
                    <text class="icon iconfont icon-pingjiachaping"></text>
                    <text class="ml10 gray9">差评({{ Total.negative }})</text>
                </view>
            </view>
        </view>
        <!--评论列表-->
        <scroll-view scroll-y="true" class="scroll-Y" :style="'height:' + scrollviewHigh + 'px;'" lower-threshold="50"
            @scrolltolower="scrolltolowerFunc">
            <view class="comment-list">
                <view class="item" v-for="(item, index) in tableData" :key="index">
                    <view class="cmt-user">
                        <view class="left">
                            <image class="photo" :src="item.user.avatarUrl" mode="aspectFill"></image>
                            <text class="name">{{ item.user.nickName }}</text>
                        </view>
                    </view>
                    <view class="d-b-c p20">
                        <view class="d-s-c">
                            <view v-if="item.score == 10" class="d-c-c mr20">
                                <text class="icon iconfont icon-pingjiahaoping"></text>
                                <text class="ml10 gray9">好评</text>
                            </view>
                            <view v-if="item.score == 20" class="d-c-c mr20">
                                <text class="icon iconfont icon-pingjiazhongping"></text>
                                <text class="ml10 gray9">中评</text>
                            </view>
                            <view v-if="item.score == 30" class="d-c-c mr20">
                                <text class="icon iconfont icon-pingjiachaping"></text>
                                <text class="ml10 gray9">差评</text>
                            </view>
                        </view>
                        <text class="datetime gray9">{{ item.create_time }}</text>
                    </view>
                    <view class="p-0-20 f24 gray3">{{ item.evaluate_content }}</view>
                    <view class="imgs d-s-c p-0-20">
                        <view class="box" v-for="(imgs, img_num) in item.image_list" :key="img_num">
                            <image @click="preview(item.image_list,imgs.file_path)" :src="imgs.file_path" mode="aspectFill"
                                width=""></image>
                        </view>
                    </view>
                </view>
                <!-- 没有记录 -->
                <view class="d-c-c p30" v-if="tableData.length==0 && !loading">
                    <view class="none-data-box">
                        <image src="/static/none.png" mode="widthFix"></image>
                        <text>亲,暂无相关记录哦</text>
                    </view>
                </view>
                <uni-load-more v-else :loadingType="loadingType"></uni-load-more>
            </view>
        </scroll-view>
        <view v-if="isopenimg" class="popimg" @click="isopenimg=false">
            <image :src="popImg" mode="aspectFit"></image>
        </view>
    </view>
</template>
<script>
    import uniLoadMore from "@/components/uni-load-more.vue";
    export default {
        components: {
            uniLoadMore
        },
        data() {
            return {
                /*手机高度*/
                phoneHeight: 0,
                /*可滚动视图区域高度*/
                scrollviewHigh: 0,
                /*选中状态*/
                state_active: -1,
                /*id*/
                project_id: 0,
                /*列表*/
                tableData: [],
                /*统计*/
                Total: {
                    /*总数*/
                    all: 0,
                    /*score = 30*/
                    negative: 0,
                    /*score = 10*/
                    praise: 0,
                    /*score = 20*/
                    negative: 0,
                    review: 0
                },
                /*页码*/
                page: 1,
                list_rows: 15,
                no_more: false,
                loading: true,
                /*最后一页码数*/
                last_page: 0,
                popImg: '',
                isopenimg: false
            };
        },
        computed: {
            /*加载中状态*/
            loadingType() {
                if (this.loading) {
                    return 1;
                } else {
                    if (this.tableData.length != 0 && this.no_more) {
                        return 2;
                    } else {
                        return 0;
                    }
                }
            }
        },
        onLoad(e) {
            this.project_id = e.project_id;
        },
        mounted() {
            this.init();
            /*获取数据*/
            this.getData();
        },
        methods: {
            preview(list, img) {
                // #ifdef H5
                if (!this.isWeixin()) {
                    this.isopenimg = true;
                    this.popImg = img;
                }else{
                    this.openImg(list, img);
                }
                return
                // #endif
                this.openImg(list, img);
            },
            openImg(list, img) {
                let arr = [];
                list.forEach((item, index) => {
                    arr.push(item.file_path)
                })
                uni.previewImage({
                    urls: arr,
                    current: img,
                    fail(err) {
                        this.showError(err)
                        console.log(err)
                    }
                });
            },
            /*初始化*/
            init() {
                let self = this;
                uni.getSystemInfo({
                    success(res) {
                        self.phoneHeight = res.windowHeight;
                        // 计算组件的高度
                        let view = uni.createSelectorQuery().select('.top-tabbar');
                        view.boundingClientRect(data => {
                            let h = self.phoneHeight - data.height;
                            self.scrollviewHigh = h;
                        }).exec();
                    }
                });
            },
            /*获取数据*/
            getData() {
                let _this = this;
                let project_id = _this.project_id;
                _this._get(
                    'plus.release.evaluate/lists', {
                        project_id: project_id,
                        scoreType: _this.state_active,
                        page: _this.page,
                        list_rows: _this.list_rows
                    },
                    function(res) {
                        _this.loading = false;
                        _this.Total = res.data.total;
                        _this.tableData = _this.tableData.concat(res.data.list.data);
                        _this.last_page = res.data.list.last_page;
                        if (res.data.list.last_page <= 1) {
                            _this.no_more = true;
                        }
                    }
                );
            },
            /*可滚动视图区域到底触发*/
            scrolltolowerFunc() {
                let self = this;
                self.bottomRefresh = true;
                self.page++;
                self.loading = true;
                if (self.page > self.last_page) {
                    self.loading = false;
                    self.no_more = true;
                    return;
                }
                self.getData();
            },
            /*类别切换*/
            stateFunc(e) {
                let self = this;
                if (self.state_active != e) {
                    self.tableData = [];
                    self.no_more = false;
                    self.loading = true;
                    self.state_active = e;
                    self.page = 1;
                    self.getData();
                }
            }
        }
    };
</script>
<style>
    .look-evaluate .comment-list {
        background: #ffffff;
    }
    .look-evaluate .comment-list .item {
        padding-top: 30rpx;
        padding-bottom: 30rpx;
        border-top: none;
        border-bottom: 1px solid #dddddd;
    }
    .look-evaluate .iconfont {
        border-radius: 50%;
        font-size: 40rpx;
        text-align: center;
    }
    .look-evaluate .icon-pingjiahaoping {
        color: #f42222;
    }
    .look-evaluate .icon-pingjiazhongping {
        color: #f2b509;
    }
    .look-evaluate .icon-pingjiachaping {
        color: #999999;
    }
    .look-evaluate .imgs {
        flex-wrap: wrap;
    }
    .look-evaluate .imgs .box {
        margin-top: 10rpx;
        margin-right: 10rpx;
    }
    .look-evaluate .imgs .box:nth-child(3n) {
        margin-right: 0;
    }
    .look-evaluate .imgs .box,
    .look-evaluate .imgs .box image {
        width: 210rpx;
        height: 210rpx;
    }
    .popimg {
        position: fixed;
        width: 750rpx;
        height: 100vh;
        background-color: #000000;
        top: 0;
        left: 0;
        z-index: 2000;
    }
</style>
mobile/pages3/release/project/popup/evaluate.vue
New file
@@ -0,0 +1,232 @@
<template>
    <view style="flex: 1;">
        <uniPopup :show="isEva" type="middle" @hidePopup="hidePopupFunc">
            <view class="ww100">
                <view class="t-c f36 pb20">评论</view>
                <!-- <view class="p-30-0 border-b-d9 border-t-d9 f32">
                    <view>111</view>
                </view> -->
                <!-- <view class="d-s-c p-30-0 border-b-d9 border-t-d9 f32">
                    <view class="eval">
                        服务星级:
                        <i v-for="(itemEv,indexEv) in service" :key="indexEv" :class="itemEv?'icon iconfont icon-start':'icon iconfont icon-start1'"
                         @click="chooseServ(indexEv,index)"></i>
                    </view>
                </view> -->
                <view class="d-s-c p-30-0 border-b-d9 border-t-d9 f32">
                    <view class="upload-list d-s-c">
                        <view class="item" v-for="(imgs, img_num) in image_list" :key="img_num"  @click="deleteImg(img_num)">
                            <image :src="imgs.file_path" mode="aspectFit"></image>
                        </view>
                        <view class="item upload-btn d-c-c d-c" @click="openUpload()" v-if="image_list.length < 9" >
                            <text class="icon iconfont icon-xiangji"></text>
                            <text class="gray9">上传图片</text>
                        </view>
                    </view>
                </view>
                <view class="d-s-c p-30-0 border-b-d9 border-t-d9 f32">
                    <radio-group class="d-s-c" @change="changeRadio($event,index)">
                        <label class="d-s-c make-item mr10">
                            <view><radio style="transform:scale(0.7)" color="#EE1413" :checked="score == 10" value="10" /></view>
                            <view class="f26 color-57">好评</view>
                        </label>
                        <label class="d-s-c make-item mr10">
                            <view><radio style="transform:scale(0.7)" color="#EE1413" :checked="score == 20" value="20" /></view>
                            <view class="f26 color-57">中评</view>
                        </label>
                        <label class="d-s-c make-item mr10">
                            <view><radio style="transform:scale(0.7)" color="#EE1413" :checked="score == 30" value="30" /></view>
                            <view class="f26 color-57">差评</view>
                        </label>
                    </radio-group>
                </view>
                <view class="d-s-c p-30-0 border-b-d9 border-t-d9 f32">
                    <textarea class="border-box" placeholder="请输入你的评语" v-model="evaluate_content"></textarea>
                </view>
                <button class="revise_btn" @click="revise">确定提交</button>
            </view>
        </uniPopup>
        <!--上传图片-->
        <Upload v-if="isUpload" @getImgs="getImgsFunc"></Upload>
    </view>
</template>
<script>
    import uniPopup from '@/components/uni-popup.vue';
    import Upload from '@/components/upload/upload.vue';
    export default {
        data() {
            return {
                score:10,
                server_score:0,
                service:[false,false,false,false,false],
                evaluate_content:'',
                /*是否打开上传图片*/
                isUpload: false,
                image_list:[],
            };
        },
        components: {
            uniPopup,
            Upload,
        },
        props: ['isEva', 'project_id'],
        watch:{
            isEva(val){
            }
        },
        methods: {
            /* 服务评分 */
            chooseServ(n,m){
                let self=this;
                self.server_score =0;
                this.service.forEach((item,index)=>{
                    if(index<=n){
                        this.service.splice(index,1,true);
                        self.server_score++;
                    }else{
                        this.service.splice(index,1,false);
                    }
                })
            },
            /* 单选框 */
            changeRadio(e, index) {
                this.score = e.detail.value;
            },
            revise(){
                let self = this;
                if(self.evaluate_content == ''){
                    uni.showToast({
                        title: '请输入评语',
                    });
                    return false;
                }
                if(self.image_list.length == 0){
                    uni.showToast({
                        title: '请上传图片',
                    });
                    return false;
                }
                uni.showModal({
                    title: '提示',
                    content: '您确定提交吗?',
                    success: function(o) {
                        if (o.confirm) {
                            uni.showLoading({
                                title: '加载中',
                                mask: true
                            });
                            uni.showLoading({
                                    title: '正在提交',
                                    mask: true
                                })
                                self._post('plus.release.Evaluate/evaluate', {
                                    project_id: self.project_id,
                                    server_score:self.server_score,
                                    score:self.score,
                                    evaluate_content:self.evaluate_content,
                                    image_list:JSON.stringify(self.image_list),
                                }, function(data) {
                                    uni.hideLoading();
                                    uni.showToast({
                                        title: '操作成功',
                                        duration: 2000,
                                        icon: 'success'
                                    });
                                    setTimeout(function(){
                                        self.hidePopupFunc();
                                    },2000);
                                });
                        }
                    },
                });
            },
            hidePopupFunc(){
                this.$emit('close', {
                  type: 'success',
                })
            },
            /*打开上传图片*/
            openUpload() {
                this.isUpload = true;
            },
            /*获取上传的图片*/
            getImgsFunc(e) {
                let self = this;
                if(e&&typeof(e)!='undefined'){
                    self.image_list = self.image_list.concat(e);
                }
                self.isUpload = false;
            },
            /*点击图片删除*/
            deleteImg(i,n){
                this.loadding=true;
                this.image_list.splice(n,1);
                this.loadding=false;
            },
        }
    };
</script>
<style scoped lang="scss">
    .buy-checkout.vender .item .key {
        width: 200rpx;
    }
    .pr20 {
        padding-right: 20rpx;
        /* padding-bottom: 40rpx; */
    }
    .icon-box.linkmen_add{
        background-color: $dominant-color;
        width: 38rpx;
        height: 38rpx;
        border-radius: 8rpx;
        display: flex;
        justify-content: center;
        align-items: center;
    }
    .icon-box.linkmen_add .icon-jia{
        color: #FFFFFF;
        font-size: 22rpx;
    }
    .revise_btn{
        background-color: #E2231A;
        border: none;
        margin-top: 30rpx;
        color: #FFFFFF;
    }
    .t-c{
        text-align: center;
    }
    .m-30-0{
        margin: 30rpx 0;
    }
    .icon.icon-jiantou{
        color: #999999;
        font-size: 26rpx;
    }
    .icon.icon-zhanghumingcheng, .icon.icon-dizhi, .icon.icon-icon_xianshi-xian, .icon.icon-bangzhu {
        color: #333;
        font-size: 28rpx;
    }
    .address-defalut-wrap {
        padding: 0;
    }
    .icon-start{
        color: #f5a623;
    }
    .eval{
        display: flex;
        justify-content: space-around;
        align-items: center;
    }
</style>
mobile/pages3/release/supplyindex/index.vue
@@ -20,13 +20,22 @@
                        <view class="photo">
                            <image :src="user.avatarUrl" mode="aspectFill"></image>
                        </view>
                        <view>
                        <view class="user-name">
                            <view class="gray3 f32">{{ user.nickName }}</view>
                        </view>
                        
                        <view class="gray3 d-s-c mt10">
                            <text class="f28 flex-1 mr20">连盟币:{{user.points}}</text>
                            <view @click="jump">
                                <text>[切换到需求方]</text>
                                <text class="iconfont icon-jiantou"></text>
                            </view>
                        </view>
                        </view>
                    </view>
                </view>
                <view class="d-s-c p-30-0 top_dash">
                <!-- <view class="d-s-c p-30-0 top_dash">
                    <view class="flex-1 d-c-c d-c">
                        <view class="redF6">
                            <text class="f24">¥</text>
@@ -51,8 +60,16 @@
                </view>
                <view class="d-c-c pt30">
                    <button type="primary" class="btn-gcred theme-btn flex-1" @click="gotoCash">我要提现</button>
                </view> -->
            </view>
            <view class="bind_phone" v-if="release.is_check == 0">
                <view class="bind_content">
                    <view class="bind_txt">您还没有查看信息权限,需{{pay_price}}连盟币开通</view>
                    <button class="bind_btn" @click="topay">去开通</button>
                </view>
            </view>
            <!--图标入口-->
            <view class="agent-wrap m-0-20 p30 d-s-c f-w mt20 bg-white">
                <view class="d-c-c d-c flex-1" @click="gotoPage('/pages3/release/project/list?product_type=0')">
@@ -67,7 +84,13 @@
                    </view>
                    <text class="pt10 f26 mt20">发布服务</text>
                </view>
                <view class="d-c-c d-c flex-1" @click="gotoPage('/pages3/release/supplyorder/index')">
                <view class="d-c-c d-c flex-1" @click="gotoPage('/pages3/release/chat/chat_list')">
                    <view>
                        <image class="agent_index_img" src="../../../static/icon/icon-zijinmingxi.png" mode=""></image>
                    </view>
                    <text class="pt10 f26 mt20">私信列表</text>
                </view>
                <!-- <view class="d-c-c d-c flex-1" @click="gotoPage('/pages3/release/supplyorder/index')">
                    <view>
                        <image class="agent_index_img" src="../../../static/icon/icon-zijinmingxi.png" mode=""></image>
                    </view>
@@ -78,7 +101,7 @@
                        <image class="agent_index_img" src="../../../static/icon/icon-zijinmingxi.png" mode=""></image>
                    </view>
                    <text class="pt10 f26 mt20">提现明细</text>
                </view>
                </view> -->
                
    
                <!-- <view class="d-c-c d-c flex-1" @click="gotoPage('/pages2/salesman/qrcode/qrcode')">
@@ -123,6 +146,8 @@
                /*顶部背景*/
                top_background: '',
                user:[],
                setting:[],
                pay_price:0,
            };
        },
        onLoad(e) {
@@ -143,10 +168,39 @@
                    self.top_background = data.data.background;
                    self.release = data.data.release;
                    self.user = data.data.user;
                    self.setting = data.data.setting;
                    if(self.setting.check_price && self.setting.check_price!= null){
                        self.pay_price = self.setting.check_price;
                    }
                    self.isData = true;
                    self.loadding = false;
                    uni.hideLoading();
                });
            },
            topay() {
                let self = this;
                let formData=self.form;
                uni.showLoading({
                    title: '加载中'
                });
                self._post(
                    'plus.release.demandIndex/topay', {
                        pay_source: self.getPlatform(),
                        formData: JSON.stringify(formData),
                    },
                     function(res) {
                        uni.hideLoading();
                        self.showSuccess(res.msg,function(){
                            self.getData();
                        });
                    }
                );
            },
            /*切换身份*/
            jump() {
                this.gotoPage('/pages3/release/demandindex/index');
            },
            /*申请入驻*/
@@ -370,4 +424,35 @@
    .user-info .photo {
        padding-right: 20rpx;
    }
    .bind_phone {
        width: 100%;
        height: 80rpx;
        padding: 0 30rpx;
        box-sizing: border-box;
        margin-bottom: 30rpx;
    }
    .bind_content {
        display: flex;
        justify-content: space-between;
        align-items: center;
        background: #ffffff;
        /* box-shadow: 0 0 6rpx 0 rgba(0, 0, 0, 0.1); */
        border-radius: 16rpx;
        height: 100%;
        padding: 0 20rpx;
    }
    .bind_txt {}
    .bind_btn {
        width: 134rpx;
        height: 50rpx;
        line-height: 50rpx;
        font-size: 22rpx;
        border-radius: 25rpx;
        text-align: center;
        color: #FFFFFF;
        background-color: #e2231a;
    }
</style>
mobile/pages3/release/supplyproject/edit.vue
@@ -61,6 +61,14 @@
                    <input class="flex-1" v-model="form.detail" type="text" placeholder-class="grary" placeholder="请输入您的期望地点" />
                </view>
                
                <view class="textarea-box d-s-c f28">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_content" placeholder="请输入产品介绍" />
                </view>
                <view class="textarea-box d-s-c f28 mt10">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_case" placeholder="请输入产品应用案例" />
                </view>
                <view class="form-item border-b">
                    <view class="field-name">是否展示:</view>
                    <radio-group class="d-s-c" @change="changeShow($event,index)">
@@ -74,6 +82,7 @@
                        </label>
                    </radio-group>
                </view>
                
                <!-- <view class="form-item border-b">
                    <text class="field-name">需求所在地:</text>
@@ -113,6 +122,8 @@
                image_list:[],
                tag_list:[],
                content:'',
                product_content:'',
                product_case:'',
                name:'',
                category_id:'',
                finish_time:'请选择日期',
mobile/pages3/release/supplyproject/release.vue
@@ -60,6 +60,14 @@
                    <view class="field-name">服务地区:</view>
                    <input class="flex-1" v-model="form.detail" type="text" placeholder-class="grary" placeholder="请输入您的服务地区" />
                </view>
                <view class="textarea-box d-s-c f28">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_content" placeholder="请输入产品介绍" />
                </view>
                <view class="textarea-box d-s-c f28 mt10">
                    <textarea class="p10 box-s-b border flex-1" v-model="form.product_case" placeholder="请输入产品应用案例" />
                </view>
                <view class="form-item border-b">
                    <view class="field-name">是否展示:</view>
                    <radio-group class="d-s-c" @change="changeShow($event,index)">
@@ -72,6 +80,11 @@
                            <view class="f26 color-57">否</view>
                        </label>
                    </radio-group>
                </view>
                <view class="form-item border-b">
                    <view class="field-name">支付金额:</view>
                    <view>{{pay_price}}连盟币</view>
                </view>
                
                <!-- <view class="form-item border-b">
@@ -112,6 +125,8 @@
                image_list:[],
                tag_list:[],
                content:'',
                product_content:'',
                product_case:'',
                name:'',
                category_id:'',
                finish_time:'请选择日期',
@@ -136,6 +151,8 @@
            location_address: '',
            short_address:'',
            Address:[],
            setting:[],
            pay_price:0,
        };
    },
    onLoad(e){
@@ -190,6 +207,10 @@
                self.loadding=false;
                self.tagList = res.data.tag_list;
                self.categoryList = res.data.category_list;
                self.setting = res.data.setting;
                if(self.setting.supply_price && self.setting.supply_price!= null){
                    self.pay_price = self.setting.supply_price;
                }
                var list = [];
                list.push("请选择分类");
                self.categoryList.forEach(item => {
shop_vue/src/api/plus/release.js
@@ -148,6 +148,30 @@
    settlement(data, errorback) {
        return request._post('/shop/plus.release.setting/settlement', data, errorback);
    },
    /*等级列表*/
    gradelist(data, errorback) {
        return request._post('/shop/plus.release.grade/index', data, errorback);
    },
    /*添加等级*/
    addgrade(data, errorback) {
        return request._post('/shop/plus.release.grade/add', data, errorback);
    },
    /*修改等级*/
    editGrade(data, errorback) {
        return request._post('/shop/plus.release.grade/edit', data, errorback);
    },
    /*删除等级*/
    deletegrade(data, errorback) {
        return request._post('/shop/plus.release.grade/delete', data, errorback);
    },
    /*评论列表*/
    evaluate(data, errorback) {
        return request._post('/shop/plus.release.evaluate/list', data, errorback);
    },
    /*删除*/
    evaluateDel(data, errorback) {
        return request._post('/shop/plus.release.evaluate/delete', data, errorback);
    },
}
shop_vue/src/views/plus/bonus/setting/part/Basic.vue
@@ -74,6 +74,21 @@
          <div class="tips">如开启,用户成为分红用户后同时成为分销商,不受分销插件条件影响</div>
        </div>
      </el-form-item>
      <el-form-item label="下级收益补贴条件" name="second">
        <label>直推指定等级</label>
        <el-select v-model="form.referee_grade_ids" multiple style="width: 160px; margin-left: 10px;">
          <el-option
            v-for="item in userGradeList"
            :key="item.grade_id"
            :label="item.name"
            :value="item.grade_id">
          </el-option>
        </el-select>
        <label>直推人数</label>
        <el-input v-model="form.referee_grade_count" type="number"  style="width: 160px; margin-left: 10px;" ></el-input>
        <span class="ml10">人</span>
        <div class="tips">直推多少用户指定会员等级后,即可享受享受下级收益补贴</div>
      </el-form-item>
      <!--提交-->
      <div class="common-button-wrapper">
        <el-button size="small" type="primary" @click="onSubmit" :loading="loading">提交</el-button>
@@ -87,6 +102,7 @@
<script>
import PlusApi from '@/api/plus/bonus.js';
import Product from '@/components/product/Product';
import UserApi from '@/api/user.js';
export default {
  components: {
@@ -99,12 +115,15 @@
      form: {
        is_open: '',
        limit_buy: '',
        become_agent: ''
        become_agent: '',
        referee_grade_ids: [],
        referee_grade_count: ''
      },
      /*是否打开产品弹出层*/
      isproduct: false,
      /*是否正在加载*/
      loading: false
      loading: false,
      userGradeList:[]
    };
  },
  props:{
@@ -116,8 +135,22 @@
    if (!this.form.product_image) {
      this.form.product_image = [];
    }
    // 等级id转换成数组
    for (let i = 0; i < this.form.referee_grade_ids.length; i++) {
      this.form.referee_grade_ids[i] = parseInt(this.form.referee_grade_ids[i]);
    }
    this.getUserGradeList();
  },
  methods: {
    /*获取用户管理模块的等级列表*/
    getUserGradeList() {
      let self = this;
      UserApi.gradelist({}, true)
        .then(res => {
          self.userGradeList = res.data.list.data || res.data.list;
        })
        .catch(error => {});
    },
    /*提交表单*/
    onSubmit() {
shop_vue/src/views/plus/release/demand/user/User.vue
@@ -25,11 +25,17 @@
          <el-table-column prop="real_name" label="姓名" width="100"></el-table-column>
          <el-table-column prop="mobile" label="手机号"></el-table-column>
         <!-- <el-table-column prop="detail" label="地址"></el-table-column> -->
         <el-table-column prop="" label="会员等级">
           <template slot-scope="scope">
             <span v-if="scope.row.grade_id == 0">无等级</span>
             <span v-else>{{ scope.row.grade.name }}</span>
           </template>
         </el-table-column>
          <el-table-column prop="create_time" label="成为时间" width="140"></el-table-column>
          <el-table-column fixed="right" label="操作" width="160">
            <template slot-scope="scope">
              <div>
                <el-button @click="saleClick(scope.row)" type="text" size="small">需求订单</el-button>
                <!-- <el-button @click="saleClick(scope.row)" type="text" size="small">需求订单</el-button> -->
                <el-button @click="EditClick(scope.row)" type="text" size="small">修改</el-button>
                <el-button @click="delClick(scope.row)" type="text" size="small">删除</el-button>
              </div>
@@ -53,7 +59,7 @@
    </div>
    <!--编辑-->
    <Edit :open_edit="open_edit" :userModel="userModel" @close="closeEditFunc"></Edit>
    <Edit :open_edit="open_edit" :userModel="userModel"  :gradeList="gradeList" @close="closeEditFunc"></Edit>
  </div>
</template>
@@ -88,6 +94,8 @@
      userModel:{},
      /*是否打开修改*/
      open_edit:false,
      /*等级*/
      gradeList: [],
    };
  },
  created() {
@@ -117,6 +125,7 @@
          self.loading = false;
          self.tableData = data.data.list.data;
          self.totalDataNumber = data.data.list.total;
          self.gradeList = data.data.grade;
        })
        .catch(error => {
          self.loading = false;
shop_vue/src/views/plus/release/demand/user/dialog/Edit.vue
@@ -1,7 +1,6 @@
<template>
  <!--
          作者:yj
          时间:2025-11-9
      -->
  <el-dialog title="编辑" :visible.sync="dialogVisible" @close="cancelFunc" :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
    <el-form :model="formData">
@@ -16,6 +15,11 @@
      </el-form-item>
      <el-form-item label="手机号" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.mobile" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="等级" :label-width="formLabelWidth">
        <el-select v-model="formData.grade_id" placeholder="-请选择等级-">
          <el-option v-for="(item,index) in gradeList" :key="index" :label="item.name" :value="item.grade_id"></el-option>
        </el-select>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
@@ -39,10 +43,7 @@
      formData: {},
    };
  },
  props: {
    open_edit: Boolean,
    userModel: Object
  },
  props: ['open_edit','userModel','gradeList'],
  watch: {
    open_edit: function(n, o) {
      if (n != o) {
@@ -64,6 +65,7 @@
      params.user_id= this.formData.user_id;
      params.real_name=this.formData.real_name;
      params.mobile=this.formData.mobile;
      params.grade_id=this.formData.grade_id;
      PlusApi.demandUserEdit(params, true)
        .then(data => {
          self.$message({
shop_vue/src/views/plus/release/demandproject/index.vue
@@ -26,6 +26,12 @@
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="project_id" label="ID" width="100"></el-table-column>
          <el-table-column prop="nickName" label="发布用户"></el-table-column>
          <el-table-column prop="nickName" label="微信头像">
            <template slot-scope="scope">
              <img :src="scope.row.user.avatarUrl" width="30px" height="30px" />
            </template>
          </el-table-column>
          <el-table-column prop="name" label="标题"></el-table-column>
          <el-table-column prop="category.name" label="分类" width="200"></el-table-column>
          <el-table-column prop="price" label="预算" width="200"></el-table-column>
@@ -36,10 +42,11 @@
              <span v-if="scope.row.status == 2" class="green">已驳回</span>
            </template>
          </el-table-column>
          <el-table-column fixed="right" label="操作" width="150">
          <el-table-column fixed="right" label="操作" width="200">
            <template slot-scope="scope">
              <el-button v-if="scope.row.status == 0" @click="shClick(scope.row)" type="text" size="small">审核</el-button>
              <el-button @click="editClick(scope.row)" type="text" size="small" >详情</el-button>
              <el-button @click="evaluateClick(scope.row)" type="text" size="small" >评论列表</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small">删除</el-button>
            </template>
          </el-table-column>
@@ -140,6 +147,17 @@
        this.getTableList();
      },
      evaluateClick(item) {
        let self = this;
        let params = item.project_id;
        this.$router.push({
          path: '/plus/release/evaluate/list',
          query: {
            project_id: params
          }
        });
      },
      /*打开编辑*/
      editClick(item) {
        this.userModel = deepClone(item);
shop_vue/src/views/plus/release/evaluate/list.vue
New file
@@ -0,0 +1,174 @@
<template>
  <!--
          作者:yj
      -->
  <div class="user">
    <!--搜索表单-->
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="searchForm" class="demo-form-inline">
        <!-- <el-form-item label="类目">
          <el-select size="small" v-model="searchForm.category_id" placeholder="所有分类">
            <el-option label="全部" value="0"></el-option>
            <el-option v-for="(item, index) in categoryList" :key="index" :label="item.name" :value="item.category_id">
            </el-option>
          </el-select>
        </el-form-item> -->
        <el-form-item label="用户id">
          <el-input size="small" v-model="searchForm.user_id" placeholder="请输入用户id"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button size="small" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
          <el-button size="small" type="info" @click="cancelFunc">返回上一页</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="id" label="ID" width="100"></el-table-column>
          <el-table-column prop="user.nickName" label="评论用户" width="200"></el-table-column>
          <el-table-column prop="nickName" label="微信头像" width="100">
            <template slot-scope="scope">
              <img :src="scope.row.user.avatarUrl" width="30px" height="30px" />
            </template>
          </el-table-column>
          <el-table-column prop="score_txt" label="评分" width="100"></el-table-column>
          <el-table-column prop="status" label="图片" width="200">
            <template slot-scope="scope">
              <a style="margin-right:5px;" v-for="(item, index) in scope.row.image_list" target="_blank" :href="item.file_path"><img :src="item.file_path" width="30px" height="30px" /></a>
            </template>
          </el-table-column>
          <el-table-column prop="evaluate_content" label="评语"></el-table-column>
          <el-table-column fixed="right" label="操作" width="200">
            <template slot-scope="scope">
              <el-button @click="deleteClick(scope.row)" type="text" size="small">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
          :current-page="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"></el-pagination>
      </div>
    </div>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import {deepClone} from '@/utils/base.js';
  export default {
    components: {
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*一页多少条*/
        pageSize: 10,
        /*一共多少条数据*/
        totalDataNumber: 0,
        /*当前是第几页*/
        curPage: 1,
        /*列表数据*/
        tableData: [],
        /*横向表单数据模型*/
        /*搜索参数*/
        searchForm: {
          user_id: '',
          category_id: ''
        },
        project_id:''
      };
    },
    created() {
      /*获取列表*/
      this.getTableList();
    },
    methods: {
      /*选择第几页*/
      handleCurrentChange(val) {
        let self = this;
        self.loading = true;
        self.curPage = val;
        self.getTableList();
      },
      /*每页多少条*/
      handleSizeChange(val) {
        this.pageSize = val;
        this.getTableList();
      },
      /*获取列表*/
      getTableList() {
        let self = this;
        let Params = self.searchForm;
        Params.page = self.curPage;
        Params.list_rows = self.pageSize;
        Params.project_id = self.$route.query.project_id;;
        PlusApi.evaluate(Params, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list.data;
            self.totalDataNumber = data.data.list.total;
          })
          .catch(error => {
          });
      },
      /*搜索查询*/
      onSubmit() {
        this.curPage = 1;
        this.getTableList();
      },
      cancelFunc() {
        this.$router.back(-1);
      },
      /*删除*/
      deleteClick(row) {
        let self = this;
        self.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          self.loading = true;
          PlusApi.evaluateDel({
              id: row.id
            }, true)
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.getTableList();
              } else {
                self.$message.error('错了哦,这是一条错误消息');
              }
            })
            .catch(error => {
              self.loading = false;
            });
        }).catch(() => {
        });
      }
    }
  };
</script>
<style></style>
shop_vue/src/views/plus/release/grade/index.vue
New file
@@ -0,0 +1,32 @@
<template>
  <!--
      作者 yj
  -->
  <div class="common-seach-wrap">
    <el-tabs v-model="activeName">
      <el-tab-pane label="等级列表" name="list"></el-tab-pane>
    </el-tabs>
    <!--设置-->
    <List v-if="activeName == 'list'"></List>
  </div>
</template>
<script>
import List from './part/list';
export default {
  components: {
    List,
  },
  data() {
    return {
      activeName: 'list'
    };
  },
  methods: {}
};
</script>
<style>
</style>
shop_vue/src/views/plus/release/grade/part/Add.vue
New file
@@ -0,0 +1,136 @@
<template>
  <!--
      作者 yj
  -->
  <el-dialog title="添加等级" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="等级名称" :label-width="formLabelWidth" prop="name" :rules="[{required: true,message: '请输入等级名称'}]">
        <el-input v-model="form.name" placeholder="请输入等级名称"></el-input>
      </el-form-item>
      <el-form-item label="等级图标" :label-width="formLabelWidth" prop="img" :rules="[{required: true,message: ' '}]">
        <el-row>
          <el-button icon="el-icon-picture-outline" @click="openUpload('img')">选择图片</el-button>
          <div v-if="form.img!=''" class="img">
            <img :src="form.img" width="100" height="100" />
          </div>
        </el-row>
      </el-form-item>
      <el-form-item label="等级权重" :label-width="formLabelWidth" prop="weight" :rules="[{required: true,message: '请输入等级权重'}]">
        <el-input v-model="form.weight" type="number" placeholder="请输入等级权重"></el-input>
        <div class="gray9">权重越大,等级越高</div>
      </el-form-item>
      <el-form-item label="升级条件" :label-width="formLabelWidth">
        <div class="gray9">0或不填均无法升级到该等级</div>
        <div class="d-s-c mt16">
          <span>累计好评达</span>
          <el-input v-model="form.upgrade_num" type="number" style="width: 160px; margin-left: 10px;" ></el-input>
          <span class="ml10">条</span>
        </div>
      </el-form-item>
    </el-form>
    <!--上传图片组件-->
    <Upload v-if="isupload" :isupload="isupload" :type="type" @returnImgs="returnImgsFunc">上传图片</Upload>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="addGrade()" :disabled="submit_loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Upload from '@/components/file/Upload';
  export default {
    components: {
      /*上传组件*/
      Upload,
    },
    data() {
      return {
        form: {
          /*昵称*/
          name: '',
          /*累计满*/
          upgrade_num:0,
          /*等级权重*/
          weight: 100,
          img:'',
        },
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        /*是否正在提交*/
        submit_loading: false,
        /*是否上传图片*/
        isupload: false,
      };
    },
    props: ['open_add'],
    created() {
      this.dialogVisible = this.open_add;
    },
    methods: {
      /*添加等级*/
      addGrade() {
        let self = this;
        let params = this.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.submit_loading = true;
            PlusApi.addgrade(params, true).then(data => {
                self.submit_loading = false;
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.dialogFormVisible(true);
              })
              .catch(error => {
                self.submit_loading = false;
              });
          }
        });
      },
      /*上传*/
      openUpload(e) {
        this.type = e;
        this.isupload = true;
      },
      /*获取图片*/
      returnImgsFunc(e) {
        if (e != null && e.length > 0) {
          if (this.type == 'img') {
            this.form.img = e[0].file_path;
          }
        }
        this.isupload = false;
      },
      /*取消*/
      cancelFunc() {
        this.$router.back(-1);
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
shop_vue/src/views/plus/release/grade/part/Edit.vue
New file
@@ -0,0 +1,131 @@
<template>
  <!--
      作者 yj
  -->
  <el-dialog title="编辑等级" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="等级名称" :label-width="formLabelWidth" prop="name" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="等级图标" :label-width="formLabelWidth" prop="img" :rules="[{required: true,message: ' '}]">
        <el-row>
          <el-button icon="el-icon-picture-outline" @click="openUpload('img')">选择图片</el-button>
          <div v-if="form.img!='' && form.img!=null" class="img">
            <img :src="form.img" width="100" height="100" />
          </div>
        </el-row>
      </el-form-item>
      <el-form-item label="等级权重" :label-width="formLabelWidth" prop="weight" :rules="[{required: true,message: '请输入等级权重'}]">
        <el-input v-model="form.weight" type="number" placeholder="请输入等级权重"></el-input>
        <div class="gray9">权重越大,等级越高</div>
      </el-form-item>
      <el-form-item label="升级条件" :label-width="formLabelWidth">
        <div class="gray9">0或不填均无法升级到该等级</div>
        <div class="d-s-c mt16">
          <span>累计好评达</span>
          <el-input v-model="form.upgrade_num" type="number" style="width: 160px; margin-left: 10px;" ></el-input>
          <span class="ml10">条</span>
        </div>
      </el-form-item>
    </el-form>
    <!--上传图片组件-->
    <Upload v-if="isupload" :isupload="isupload" :type="type" @returnImgs="returnImgsFunc">上传图片</Upload>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="editGrade" :disabled="submit_loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Upload from '@/components/file/Upload';
  export default {
    components: {
      /*上传组件*/
      Upload,
    },
    data() {
      return {
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        /*是否正在提交*/
        submit_loading: false,
        /*是否上传图片*/
        isupload: false,
      };
    },
    props: ['open_edit', 'form'],
    created() {
      this.dialogVisible = this.open_edit;
    },
    methods: {
      /*修改用户*/
      editGrade() {
        let self = this;
        let params = this.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.submit_loading = true;
            PlusApi.editGrade(params, true)
              .then(data => {
                self.submit_loading = false;
                self.$message({
                  message: '恭喜你,等级修改成功',
                  type: 'success'
                });
                self.dialogFormVisible(true);
              })
              .catch(error => {
                self.submit_loading = false;
              });
          }
        });
      },
      /*上传*/
      openUpload(e) {
        this.type = e;
        this.isupload = true;
      },
      /*获取图片*/
      returnImgsFunc(e) {
        if (e != null && e.length > 0) {
          if (this.type == 'img') {
            this.form.img = e[0].file_path;
          }
        }
        this.isupload = false;
      },
      /*取消*/
      cancelFunc() {
        this.$router.back(-1);
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
shop_vue/src/views/plus/release/grade/part/list.vue
New file
@@ -0,0 +1,189 @@
<template>
  <!--
          作者 yj
      -->
  <div class="user">
    <!--添加等级-->
    <div class="common-level-rail">
      <el-button size="small" type="primary" @click="addClick" icon="el-icon-plus" v-auth="'/plus/release/grade/add'">添加等级</el-button>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="name" label="等级名称" width="300"></el-table-column>
          <el-table-column prop="weight" label="权重"></el-table-column>
          <el-table-column prop="upgrade_num" label="好评数量"></el-table-column>
          <el-table-column fixed="right" label="操作" width="90">
            <template slot-scope="scope">
              <el-button @click="editClick(scope.row)" type="text" size="small" v-auth="'/plus/release/grade/edit'" >编辑</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small"  v-auth="'/plus/release/grade/delete'">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background :current-page="curPage"
          :page-size="pageSize" layout="total, prev, pager, next, jumper"
          :total="totalDataNumber">
        </el-pagination>
      </div>
    </div>
    <!--添加-->
    <Add v-if="open_add" :open_add="open_add" @closeDialog="closeDialogFunc($event, 'add')"></Add>
    <!--编辑-->
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Edit from './Edit.vue';
  import Add from './Add.vue';
  import {deepClone} from '@/utils/base.js';
  export default {
    components: {
      /*编辑组件*/
      Edit,
      Add
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*列表数据*/
        tableData: [],
        /*一页多少条*/
        pageSize: 15,
        /*一共多少条数据*/
        totalDataNumber: 0,
        /*当前是第几页*/
        curPage: 1,
        /*横向表单数据模型*/
        formInline: {
          user: '',
        },
        /*是否打开添加弹窗*/
        open_add: false,
        /*是否打开编辑弹窗*/
        open_edit: false,
        /*当前编辑的对象*/
        userModel: {}
      };
    },
    created() {
      /*获取列表*/
      this.getTableList();
    },
    methods: {
      /*换行*/
      keepTextStyle(val){
        let str=val.replace(/(\\r\\n)/g,'<br/>');
        return str;
      },
      /*选择第几页*/
      handleCurrentChange(val) {
        let self = this;
        self.curPage = val;
        self.loading = true;
        self.getTableList();
      },
      /*每页多少条*/
      handleSizeChange(val) {
        this.curPage = 1;
        this.pageSize = val;
        this.getTableList();
      },
      /*获取列表*/
      getTableList() {
        let self = this;
        let Params = {};
        Params.page = self.curPage;
        Params.list_rows = self.pageSize;
        PlusApi.gradelist(Params, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list.data;
            self.totalDataNumber = data.data.list.total
          })
          .catch(error => {
          });
      },
      /*打开添加*/
      addClick() {
        this.open_add = true;
      },
      /*打开编辑*/
      editClick(item) {
        this.userModel = deepClone(item);
        this.open_edit = true;
      },
      /*关闭弹窗*/
      closeDialogFunc(e, f) {
        if (f == 'add') {
          this.open_add = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
        if (f == 'edit') {
          this.open_edit = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
      },
      /*删除用户*/
      deleteClick(row) {
        let self = this;
        self.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          self.loading = true;
          PlusApi.deletegrade({
              grade_id: row.grade_id
            }, true)
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.getTableList();
              } else {
                self.$message.error('错了哦,这是一条错误消息');
              }
            })
            .catch(error => {
              self.loading = false;
            });
        }).catch(() => {
        });
      }
    }
  };
</script>
<style></style>
shop_vue/src/views/plus/release/index.vue
@@ -14,6 +14,7 @@
    <Tag v-if="activeName == 'tag'"></Tag>
    <Cash v-if="activeName == 'cash'"></Cash>
    <Setting v-if="activeName == 'setting'"></Setting>
    <Grade v-if="activeName == 'grade'"></Grade>
  </div>
</template>
<script>
@@ -30,6 +31,7 @@
import Tag from './tag/index';
import Cash from './cash/Cash';
import Setting from './setting/Setting';
import Grade from './grade/index';
export default {
@@ -45,6 +47,7 @@
    Tag,
    Cash,
    Setting,
    Grade,
  },
  data() {
    return {
@@ -86,10 +89,15 @@
          value: '供应发布',
          path:'/plus/release/supplyproject/index'
        },
        // {
        //   key: 'order',
        //   value: '用户订单',
        //   path:'/plus/release/order/Order'
        // },
        {
          key: 'order',
          value: '用户订单',
          path:'/plus/release/order/Order'
          key: 'grade',
          value: '信誉等级',
          path:'/plus/release/grade/index'
        },
        {
          key: 'category',
@@ -101,11 +109,11 @@
          value: '标签列表',
          path:'/plus/release/tag/index'
        },
        {
          key: 'cash',
          value: '提现列表',
          path:'/plus/release/cash/Cash'
        },
        // {
        //   key: 'cash',
        //   value: '提现列表',
        //   path:'/plus/release/cash/Cash'
        // },
        {
          key: 'setting',
          value: '发布设置',
shop_vue/src/views/plus/release/setting/Setting.vue
@@ -1,7 +1,7 @@
<template>
  <div v-loading="loading">
    <el-tabs size="small" v-model="activeName" type="card" @tab-click="handleClick">
      <el-tab-pane label="结算" name="settlement"></el-tab-pane>
      <el-tab-pane label="设置" name="settlement"></el-tab-pane>
    </el-tabs>
    <!--结算-->
shop_vue/src/views/plus/release/setting/part/Settlement.vue
@@ -7,27 +7,25 @@
    <!--form表单-->
    <el-form size="small" ref="form" :model="form" label-width="200px">
      <el-form-item label="提现方式">
        <el-checkbox-group v-model="form.pay_type">
          <el-checkbox v-for="(item,index) in list" :label="item.id" :key="index">{{item.name}}</el-checkbox>
        </el-checkbox-group>
        <div class="tips">注:如使用微信支付,则需申请微信支付企业付款到零钱功能</div>
      </el-form-item>
      <el-form-item label="订单抽成" prop="order_rate" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.order_rate" type="number" class="max-w460">
           <template slot="append">%</template>
      <el-form-item label="供应方发布消耗" prop="supply_price" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.supply_price" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
      <el-form-item label="佣金提现手续费" prop="fee_rate" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.fee_rate" type="number" class="max-w460">
           <template slot="append">%</template>
      <el-form-item label="需求方发布消耗" prop="demand_price" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.demand_price" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
      <el-form-item label="最低提现额度" prop="min_money" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.min_money" type="number" class="max-w460"></el-input>
      <el-form-item label="开通查看信息权限" prop="check_price" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.check_price" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
      <el-form-item label="提现说明">
        <el-input v-model="form.explain" type="textarea" rows="5" class="max-w460"></el-input>
      <el-form-item label="评论奖励" prop="eve_money" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.eve_money" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
shop_vue/src/views/plus/release/setting/part/Settlement备份可删.vue
New file
@@ -0,0 +1,104 @@
<template>
  <!--
          作者:yj
      -->
  <div class="mt30">
    <!--form表单-->
    <el-form size="small" ref="form" :model="form" label-width="200px">
      <el-form-item label="提现方式">
        <el-checkbox-group v-model="form.pay_type">
          <el-checkbox v-for="(item,index) in list" :label="item.id" :key="index">{{item.name}}</el-checkbox>
        </el-checkbox-group>
        <div class="tips">注:如使用微信支付,则需申请微信支付企业付款到零钱功能</div>
      </el-form-item>
      <el-form-item label="订单抽成" prop="order_rate" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.order_rate" type="number" class="max-w460">
           <template slot="append">%</template>
        </el-input>
      </el-form-item>
      <el-form-item label="佣金提现手续费" prop="fee_rate" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.fee_rate" type="number" class="max-w460">
           <template slot="append">%</template>
        </el-input>
      </el-form-item>
      <el-form-item label="最低提现额度" prop="min_money" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.min_money" type="number" class="max-w460"></el-input>
      </el-form-item>
      <el-form-item label="提现说明">
        <el-input v-model="form.explain" type="textarea" rows="5" class="max-w460"></el-input>
      </el-form-item>
      <!--提交-->
      <div class="common-button-wrapper">
        <el-button size="small" type="primary" @click="onSubmit" :loading="loading">提交</el-button>
      </div>
    </el-form>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  export default {
    data() {
      return {
        /*form表单数据*/
        form: {
          pay_type: [
            10
          ],
          explain:'',
        },
        list: [],
        selectlist: [
          10
        ],
        loading: false,
      };
    },
    props: {
      settingData: Object
    },
    created() {
      this.form=this.settingData.data.settlement.values;
      this.list = this.settingData.pay_type;
    },
    methods: {
      /*提交表单*/
      onSubmit() {
        let self = this;
        let params = self.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.loading = true;
            PlusApi.settlement({
                form: params
              }, true)
              .then(data => {
                self.loading = false;
                self.$message({
                  message: '恭喜你,设置成功',
                  type: 'success'
                });
              })
              .catch(error => {
                self.loading = false;
              });
          }
        });
      },
    }
  };
</script>
<style>
</style>
shop_vue/src/views/plus/release/supply/user/User.vue
@@ -25,11 +25,17 @@
          <el-table-column prop="real_name" label="姓名" width="100"></el-table-column>
          <el-table-column prop="mobile" label="手机号"></el-table-column>
         <!-- <el-table-column prop="detail" label="地址"></el-table-column> -->
         <el-table-column prop="" label="会员等级">
           <template slot-scope="scope">
             <span v-if="scope.row.grade_id == 0">无等级</span>
             <span v-else>{{ scope.row.grade.name }}</span>
           </template>
         </el-table-column>
          <el-table-column prop="create_time" label="成为时间" width="140"></el-table-column>
          <el-table-column fixed="right" label="操作" width="160">
            <template slot-scope="scope">
              <div>
                <el-button @click="saleClick(scope.row)" type="text" size="small">供应订单</el-button>
                <!-- <el-button @click="saleClick(scope.row)" type="text" size="small">供应订单</el-button> -->
                <el-button @click="EditClick(scope.row)" type="text" size="small">修改</el-button>
                <el-button @click="delClick(scope.row)" type="text" size="small">删除</el-button>
              </div>
@@ -53,7 +59,7 @@
    </div>
    <!--编辑-->
    <Edit :open_edit="open_edit" :userModel="userModel" @close="closeEditFunc"></Edit>
    <Edit :open_edit="open_edit" :userModel="userModel"  :gradeList="gradeList" @close="closeEditFunc"></Edit>
  </div>
</template>
@@ -88,6 +94,8 @@
      userModel:{},
      /*是否打开修改*/
      open_edit:false,
      /*等级*/
      gradeList: [],
    };
  },
  created() {
@@ -117,6 +125,7 @@
          self.loading = false;
          self.tableData = data.data.list.data;
          self.totalDataNumber = data.data.list.total;
          self.gradeList = data.data.grade;
        })
        .catch(error => {
          self.loading = false;
shop_vue/src/views/plus/release/supply/user/dialog/Edit.vue
@@ -1,8 +1,6 @@
<template>
  <!--
          作者:yj
          时间:2023-04-11
          描述:售后维修-维修师傅-编辑
      -->
  <el-dialog title="编辑" :visible.sync="dialogVisible" @close="cancelFunc" :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
    <el-form :model="formData">
@@ -17,6 +15,11 @@
      </el-form-item>
      <el-form-item label="手机号" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.mobile" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="等级" :label-width="formLabelWidth">
        <el-select v-model="formData.grade_id" placeholder="-请选择等级-">
          <el-option v-for="(item,index) in gradeList" :key="index" :label="item.name" :value="item.grade_id"></el-option>
        </el-select>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
@@ -40,10 +43,7 @@
      formData: {},
    };
  },
  props: {
    open_edit: Boolean,
    userModel: Object
  },
  props: ['open_edit','userModel','gradeList'],
  watch: {
    open_edit: function(n, o) {
      if (n != o) {
@@ -65,6 +65,7 @@
      params.user_id= this.formData.user_id;
      params.real_name=this.formData.real_name;
      params.mobile=this.formData.mobile;
      params.grade_id=this.formData.grade_id;
      PlusApi.supplyUserEdit(params, true)
        .then(data => {
          self.$message({
shop_vue/src/views/plus/release/supplyproject/index.vue
@@ -36,10 +36,11 @@
              <span v-if="scope.row.status == 2" class="green">已驳回</span>
            </template>
          </el-table-column>
          <el-table-column fixed="right" label="操作" width="150">
          <el-table-column fixed="right" label="操作" width="200">
            <template slot-scope="scope">
              <el-button v-if="scope.row.status == 0" @click="shClick(scope.row)" type="text" size="small">审核</el-button>
              <el-button @click="editClick(scope.row)" type="text" size="small" >详情</el-button>
              <el-button @click="evaluateClick(scope.row)" type="text" size="small" >评论列表</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small">删除</el-button>
            </template>
          </el-table-column>
@@ -118,6 +119,17 @@
        this.getTableList();
      },
      evaluateClick(item) {
        let self = this;
        let params = item.project_id;
        this.$router.push({
          path: '/plus/release/evaluate/list',
          query: {
            project_id: params
          }
        });
      },
      /*获取列表*/
      getTableList() {
shop_vue/src/views/plus/vip/setting/part/Basic.vue
@@ -53,7 +53,7 @@
        <div class="tips">用户直推指定数量的用户后,即可享受平台佣金</div>
      </el-form-item>
      <el-form-item label="见点奖条件" name="second">
      <el-form-item label="复购专区奖条件" name="second">
        <label>推荐VIP会员人数</label>
        <el-input v-model="form.viewpoint_buy_count" type="number" class="max-w460">
          <template slot="append">人</template>
@@ -62,7 +62,22 @@
        <el-input v-model="form.repurchase_consumption" type="number" class="max-w460">
          <template slot="append">元</template>
        </el-input>
        <div class="tips">用户满足条件后,即可享受见点奖</div>
        <div class="tips">用户满足条件后,即可享复购专区奖</div>
      </el-form-item>
      <el-form-item label="下级收益补贴条件" name="second">
        <label>直推指定等级</label>
        <el-select v-model="form.referee_grade_ids" multiple style="width: 160px; margin-left: 10px;">
          <el-option
            v-for="item in userGradeList"
            :key="item.grade_id"
            :label="item.name"
            :value="item.grade_id">
          </el-option>
        </el-select>
        <label>直推人数</label>
        <el-input v-model="form.referee_grade_count" type="number"  style="width: 160px; margin-left: 10px;" ></el-input>
        <span class="ml10">人</span>
        <div class="tips">直推多少用户指定会员等级后,即可享受享受下级收益补贴</div>
      </el-form-item>
      <!--提交-->
      <div class="common-button-wrapper">
@@ -77,6 +92,7 @@
<script>
import PlusApi from '@/api/plus/vip.js';
import Product from '@/components/product/Product';
import UserApi from '@/api/user.js';
export default {
  components: {
@@ -95,6 +111,7 @@
        pjaward: '0',
        pjaward_level: '1'
      },
      userGradeList:[],
      /*是否打开产品弹出层*/
      isproduct: false,
      /*是否正在加载*/
@@ -106,9 +123,23 @@
  },
  created() {
    this.form = this.settingData.data.basic.values;
    console.log(this.form)
    console.log(this.form.referee_grade_ids);
    // 等级id转换成数组
    for (let i = 0; i < this.form.referee_grade_ids.length; i++) {
      this.form.referee_grade_ids[i] = parseInt(this.form.referee_grade_ids[i]);
    }
    this.getUserGradeList();
  },
  methods: {
    /*获取用户管理模块的等级列表*/
    getUserGradeList() {
      let self = this;
      UserApi.gradelist({}, true)
        .then(res => {
          self.userGradeList = res.data.list.data || res.data.list;
        })
        .catch(error => {});
    },
    /*提交表单*/
    onSubmit() {
      let self = this;
shop_vue/src/views/plus/vip/user/User.vue
@@ -50,6 +50,7 @@
        <el-table-column prop="create_time" label="成为时间" width="140"> </el-table-column>
        <el-table-column fixed="right" label="操作" width="120">
          <template slot-scope="scope">
            <el-button @click="openSubUser(scope.row)" type="text" size="small" >下级用户</el-button>
            <el-button @click="detailedClick(scope.row)" type="text" size="small">提现明细</el-button>
            <el-button @click="editClick(scope.row)" type="text" size="small">修改</el-button>
          </template>
@@ -72,12 +73,15 @@
    <!--编辑用户-->
    <Edit :open_edit="open_edit" :userModel="userModel" @close="closeEditFunc"></Edit>
    <!--查看下级用户-->
    <SubUser :open_dialog="open_dialog" :userModel="userModel" @close="closeFunc"></SubUser>
  </div>
</template>
<script>
import vipApi from '@/api/plus/vip.js';
import Edit from './dialog/Edit';
import SubUser from './dialog/SubUser.vue';
export default {
  data() {
@@ -92,11 +96,13 @@
      pageSize: 10,
      /*是否打开编辑*/
      open_edit: false,
      open_dialog: false,
      /*当前编辑的用户模型*/
      userModel: {}
    };
  },
  components: {
    SubUser,
    Edit
  },
  created() {
@@ -143,6 +149,16 @@
        }
      });
    },
    /*打开下级用户弹窗*/
    openSubUser(e){
      this.userModel=e;
      this.open_dialog=true;
    },
    /*关闭下级用户弹窗*/
    closeFunc(){
      this.open_dialog=false;
    },
    /*修改点击*/
    editClick(item) {
shop_vue/src/views/plus/vip/user/dialog/SubUser.vue
New file
@@ -0,0 +1,136 @@
<template>
  <!--
          作者:luoyiming
          时间:2020-06-01
          描述:插件中心-分销-分销商用户-查看下级用户
      -->
  <div>
    <el-dialog title="下级用户" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="true" :close-on-press-escape="false">
      <el-radio-group v-model="level" size="small" @change="changFunc">
        <el-radio-button label="1">一级</el-radio-button>
        <el-radio-button label="2">二级</el-radio-button>
        <el-radio-button label="3">三级</el-radio-button>
      </el-radio-group>
      <!--table-->
      <div class="mt16">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="user_id" label="用户ID"></el-table-column>
          <el-table-column prop="nickName" label="微信头像">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.user.avatarUrl" width="30" height="30" />
            </template>
          </el-table-column>
          <el-table-column prop="user.nickName" label="    微信昵称"></el-table-column>
          <el-table-column prop="user.grade.name" label="    用户等级"></el-table-column>
          <el-table-column prop="user.mobile" label="手机号"></el-table-column>
          <el-table-column prop="create_time" label="加入时间"></el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          background
          :current-page="curPage"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"
        ></el-pagination>
      </div>
    </el-dialog>
  </div>
</template>
<script>
import PlusApi from '@/api/plus.js';
export default {
  data() {
    return {
      /*是否显示*/
      dialogVisible: false,
      /*是否正在加载*/
      loading:true,
      /*当前第几级*/
      level: '1',
      /*列表数据*/
      tableData: [],
      /*一页多少条*/
      pageSize: 20,
      /*一共多少条数据*/
      totalDataNumber: 0,
      /*当前是第几页*/
      curPage: 1
    };
  },
  props: {
    open_dialog: Boolean,
    userModel:Object
  },
  watch: {
    open_dialog: function(n, o) {
      if (n != o) {
        this.dialogVisible = this.open_dialog;
        if(n){
          this.getData();
        }
      }
    }
  },
  created() {
  },
  methods: {
    /*切换等级*/
    changFunc(e){
      this.getData();
    },
    /*选择第几页*/
    handleCurrentChange(val) {
      let self = this;
      self.curPage = val;
      self.loading = true;
      self.getData();
    },
    /*获取数据*/
    getData() {
      let self = this;
      let Params = {};
      Params.page = self.curPage;
      Params.list_rows = self.pageSize;
      Params.user_id=self.userModel.user_id;
      Params.level=self.level;
      PlusApi.agentUserFans(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.list.data;
        })
        .catch(error => {});
    },
    /*每页多少条*/
    handleSizeChange(val) {
      this.curPage = 1;
      this.pageSize = val;
      this.getData();
    },
    /*关闭弹窗*/
    dialogFormVisible(e) {
      this.$emit('close', {});
    }
  }
};
</script>
<style scoped>
.el-dialog__body {
  padding: 10px 20px;
}
</style>
shop_vue/src/views/supplier/supplier/add.vue
@@ -67,6 +67,12 @@
        </div>
        <div class="tips">如设置了是,则该商户的订单按该商户后台设置的支付信息来收款</div>
      </el-form-item>
      <el-form-item label="供需权限">
        <el-radio-group v-model="form.supplier.is_release">
          <el-radio :label="0">否</el-radio>
          <el-radio :label="1">是</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="是否是新人专区" :label-width="formLabelWidth">
        <el-radio-group v-model="form.supplier.is_newcomer">
          <el-radio :label="1">是</el-radio>
@@ -193,8 +199,9 @@
            commission_rate:0,
            area_id:'',
            is_independent:0,
            is_newcomer:0
            ,is_repurchase:0
            is_release:0,
            is_newcomer:0,
            is_repurchase:0
          },
        },
        logo_file_path: '',
shop_vue/src/views/supplier/supplier/edit.vue
@@ -73,6 +73,12 @@
        </div>
        <div class="tips">如设置了是,则该商户的订单按该商户后台设置的支付信息来收款</div>
      </el-form-item>
      <el-form-item label="供需权限">
        <el-radio-group v-model="form.supplier.is_release">
          <el-radio :label="0">否</el-radio>
          <el-radio :label="1">是</el-radio>
        </el-radio-group>
      </el-form-item>
      <el-form-item label="是否是新人专区" :label-width="formLabelWidth">
        <el-radio-group v-model="form.supplier.is_newcomer">
          <el-radio :label="1">是</el-radio>
@@ -173,7 +179,8 @@
            area_id:'',
            is_independent:0,
            is_newcomer:0,
            is_repurchase:0
            is_repurchase:0,
            is_release:0
          },
        },
        logo_file_path: '',
supplier_vue/src/api/plus/release.js
New file
@@ -0,0 +1,178 @@
import request from '@/utils/request'
let PlusApi = {
    /*需求方申请列表*/
    demandApplyList(data, errorback) {
        return request._post('/supplier/plus.release.demandApply/index', data, errorback);
    },
    /*审核*/
    editDemandApplyStatus(data, errorback) {
        return request._post('/supplier/plus.release.demandApply/editApplyStatus', data, errorback);
    },
    /*列表*/
    demandUserList(data, errorback) {
        return request._post('/supplier/plus.release.demandUser/index', data, errorback);
    },
    /*修改*/
    demandUserEdit(data, errorback) {
        return request._post('/supplier/plus.release.demandUser/edit', data, errorback);
    },
    /*删除*/
    deleteDemandUser(data, errorback) {
        return request._post('/supplier/plus.release.demandUser/delete', data, errorback);
    },
    /*供应方申请列表*/
    supplyApplyList(data, errorback) {
        return request._post('/supplier/plus.release.supplyApply/index', data, errorback);
    },
    /*审核*/
    editSupplyApplyStatus(data, errorback) {
        return request._post('/supplier/plus.release.supplyApply/editApplyStatus', data, errorback);
    },
    /*列表*/
    supplyUserList(data, errorback) {
        return request._post('/supplier/plus.release.supplyUser/index', data, errorback);
    },
    /*修改*/
    supplyUserEdit(data, errorback) {
        return request._post('/supplier/plus.release.supplyUser/edit', data, errorback);
    },
    /*删除*/
    deleteSupplyUser(data, errorback) {
        return request._post('/supplier/plus.release.supplyUser/delete', data, errorback);
    },
    /*分类管理*/
    catList(data, errorback) {
        return request._post('/supplier/plus.release.ReleaseCategory/index', data, errorback);
    },
    /*分类添加*/
    catAdd(data, errorback) {
        return request._post('/supplier/plus.release.ReleaseCategory/add', data, errorback);
    },
    /*分类删除*/
    catDel(data, errorback) {
        return request._post('/supplier/plus.release.ReleaseCategory/delete', data, errorback);
    },
    /*分类修改*/
    catEdit(data, errorback) {
        return request._post('/supplier/plus.release.ReleaseCategory/edit', data, errorback);
    },
    /*获取标签*/
    Tag(data, errorback) {
      return request._post('/supplier/plus.release.Tag/index', data, errorback);
    },
    /*添加标签*/
      addTag(data, errorback) {
      return request._post('/supplier/plus.release.Tag/add', data, errorback);
    },
      /*编辑标签*/
      editTag(data, errorback) {
      return request._post('/supplier/plus.release.Tag/edit', data, errorback);
    },
      /*删除标签*/
      deleteTag(data, errorback) {
      return request._post('/supplier/plus.release.Tag/delete', data, errorback);
    },
    /*需求发布列表*/
    demandProject(data, errorback) {
        return request._post('/supplier/plus.release.DemandProject/index', data, errorback);
    },
    demandProjectSubmit(data, errorback) {
        return request._post('/supplier/plus.release.demandProject/submit', data, errorback);
    },
    /*删除*/
    demandDel(data, errorback) {
        return request._post('/supplier/plus.release.DemandProject/delete', data, errorback);
    },
    /*详情*/
    demandEdit(data, errorback) {
        return request._post('/supplier/plus.release.DemandProject/edit', data, errorback);
    },
    /*供应发布列表*/
    supplyProject(data, errorback) {
        return request._post('/supplier/plus.release.supplyProject/index', data, errorback);
    },
    /*审核*/
    supplyProjectSubmit(data, errorback) {
        return request._post('/supplier/plus.release.supplyProject/submit', data, errorback);
    },
    /*删除*/
    supplyDel(data, errorback) {
        return request._post('/supplier/plus.release.supplyProject/delete', data, errorback);
    },
    /*详情*/
    supplyEdit(data, errorback) {
        return request._post('/supplier/plus.release.supplyProject/edit', data, errorback);
    },
    /*订单列表*/
    releaseOrder(data, errorback) {
        return request._post('/supplier/plus.release.order/index', data, errorback);
    },
    onCash(data, errorback) {
        return request._post('/supplier/plus.release.order/onCash', data, errorback);
    },
    onFinish(data, errorback) {
        return request._post('/supplier/plus.release.order/onFinish', data, errorback);
    },
    onCancel(data, errorback) {
        return request._post('/supplier/plus.release.order/onCancel', data, errorback);
    },
    /*提现申请*/
    cash(data, errorback) {
        return request._post('/supplier/plus.release.cash/index', data, errorback);
    },
    /*提现审核*/
    cashSubmit(data, errorback) {
        return request._post('/supplier/plus.release.cash/submit', data, errorback);
    },
    /*微信打款*/
    WxPay(data, errorback) {
        return request._post('/supplier/plus.release.cash/wechat_pay', data, errorback);
    },
    /*付呗分账打款*/
    FbPay(data, errorback) {
        return request._post('/supplier/plus.release.cash/fb_pay', data, errorback);
    },
    /*确认打款*/
    money(data, errorback) {
        return request._post('/supplier/plus.release.cash/money', data, errorback);
    },
    /*设置*/
    releaseSet(data, errorback) {
        return request._post('/supplier/plus.release.setting/index', data, errorback);
    },
    /*佣金设置*/
    settlement(data, errorback) {
        return request._post('/supplier/plus.release.setting/settlement', data, errorback);
    },
    /*等级列表*/
    gradelist(data, errorback) {
        return request._post('/supplier/plus.release.grade/index', data, errorback);
    },
    /*添加等级*/
    addgrade(data, errorback) {
        return request._post('/supplier/plus.release.grade/add', data, errorback);
    },
    /*修改等级*/
    editGrade(data, errorback) {
        return request._post('/supplier/plus.release.grade/edit', data, errorback);
    },
    /*删除等级*/
    deletegrade(data, errorback) {
        return request._post('/supplier/plus.release.grade/delete', data, errorback);
    },
    /*评论列表*/
    evaluate(data, errorback) {
        return request._post('/supplier/plus.release.evaluate/list', data, errorback);
    },
    /*删除*/
    evaluateDel(data, errorback) {
        return request._post('/supplier/plus.release.evaluate/delete', data, errorback);
    },
}
export default PlusApi;
supplier_vue/src/views/plus/bonus/index.vue
@@ -95,9 +95,8 @@
    }
  },
  created() {
    setTimeout(()=>{
      this.init();
    },100)
    this.init();
  },
  beforeDestroy() {
supplier_vue/src/views/plus/bonus/setting/part/Basic.vue
@@ -74,6 +74,21 @@
          <div class="tips">如开启,用户成为分红用户后同时成为分销商,不受分销插件条件影响</div>
        </div>
      </el-form-item>
      <el-form-item label="下级收益补贴条件" name="second">
        <label>直推指定等级</label>
        <el-select v-model="form.referee_grade_ids" multiple style="width: 160px; margin-left: 10px;">
          <el-option
            v-for="item in userGradeList"
            :key="item.grade_id"
            :label="item.name"
            :value="item.grade_id">
          </el-option>
        </el-select>
        <label>直推人数</label>
        <el-input v-model="form.referee_grade_count" type="number"  style="width: 160px; margin-left: 10px;" ></el-input>
        <span class="ml10">人</span>
        <div class="tips">直推多少用户指定会员等级后,即可享受享受下级收益补贴</div>
      </el-form-item>
      <!--提交-->
      <div class="common-button-wrapper">
        <el-button size="small" type="primary" @click="onSubmit" :loading="loading">提交</el-button>
@@ -87,6 +102,7 @@
<script>
import PlusApi from '@/api/plus/bonus.js';
import Product from '@/components/product/Product';
import UserApi from '@/api/user.js';
export default {
  components: {
@@ -99,12 +115,15 @@
      form: {
        is_open: '',
        limit_buy: '',
        become_agent: ''
        become_agent: '',
        referee_grade_ids: [],
        referee_grade_count: ''
      },
      /*是否打开产品弹出层*/
      isproduct: false,
      /*是否正在加载*/
      loading: false
      loading: false,
      userGradeList:[]
    };
  },
  props:{
@@ -116,8 +135,22 @@
    if (!this.form.product_image) {
      this.form.product_image = [];
    }
    // 等级id转换成数组
    for (let i = 0; i < this.form.referee_grade_ids.length; i++) {
      this.form.referee_grade_ids[i] = parseInt(this.form.referee_grade_ids[i]);
    }
    this.getUserGradeList();
  },
  methods: {
    /*获取用户管理模块的等级列表*/
    getUserGradeList() {
      let self = this;
      UserApi.gradelist({}, true)
        .then(res => {
          self.userGradeList = res.data.list.data || res.data.list;
        })
        .catch(error => {});
    },
    /*提交表单*/
    onSubmit() {
supplier_vue/src/views/plus/release/cash/Cash.vue
New file
@@ -0,0 +1,333 @@
<template>
  <!--
          作者:yj
      -->
  <div class="user">
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="formInline" class="demo-form-inline">
        <el-form-item label="审核状态">
          <el-select v-model="formInline.apply_status" placeholder="请选择状态">
            <el-option label="全部" value="-1"></el-option>
            <el-option label="待审核" value="10"></el-option>
            <el-option label="审核通过" value="20"></el-option>
            <el-option label="已打款" value="40"></el-option>
            <el-option label="驳回" value="30"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="提现方式">
          <el-select v-model="formInline.pay_type" placeholder="请选择提现方式">
            <el-option label="全部" value="-1"></el-option>
            <el-option label="微信" value="10"></el-option>
            <el-option label="支付宝" value="20"></el-option>
            <el-option label="银行卡" value="30"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="用户id">
          <el-input v-model="formInline.user_id" placeholder="请输入用户ID"></el-input>
        </el-form-item>
        <el-form-item label="">
          <el-input v-model="formInline.search" placeholder="请输入昵称/姓名/手机号"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button type="primary" @click="onSubmit">查询</el-button>
        </el-form-item>
        <!-- <el-form-item>
          <el-button size="small" type="success" @click="onExport" v-auth="'/plus/agent/cash/export'">导出</el-button>
        </el-form-item> -->
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="user_id" label="用户ID" width="60"></el-table-column>
          <el-table-column prop="nickName" label="微信头像" width="70">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.avatarUrl" width="30" height="30" />
            </template>
          </el-table-column>
          <el-table-column prop="nickName" label="微信昵称" width="100"></el-table-column>
          <el-table-column prop="real_name" label="姓名"></el-table-column>
          <el-table-column prop="mobile" label="手机号">
            <template slot-scope="scope">
              <p class="text-ellipsis" :title="scope.row.mobile">{{ scope.row.mobile }}</p>
            </template>
          </el-table-column>
          <el-table-column prop="money" label="提现金额">
            <template slot-scope="scope">
              <span class="orange">{{ scope.row.money }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="fee_money" label="手续费">
            <template slot-scope="scope">
              <span class="black">{{ scope.row.fee_money || 0 }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="real_money" label="实际到账">
            <template slot-scope="scope">
              <span class="green">{{ scope.row.real_money || scope.row.money }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="pay_type.text" label="提现方式"></el-table-column>
          <el-table-column prop="pay_type" label="提现信息    ">
            <template slot-scope="scope">
              <div v-if="scope.row.pay_type.value == 20">
                <p>
                  <span>{{ scope.row.alipay_name }}</span>
                </p>
                <p>
                  <span>{{ scope.row.alipay_account }}</span>
                </p>
              </div>
              <div v-else-if="scope.row.pay_type.value == 30">
                <p>
                  <span>{{ scope.row.bank_name }}</span>
                </p>
                <p>
                  <span>{{ scope.row.bank_account }}</span>
                </p>
                <p>
                  <span>{{ scope.row.bank_card }}</span>
                </p>
              </div>
              <div v-else>
                <p><span>--</span></p>
              </div>
            </template>
          </el-table-column>
          <el-table-column prop="apply_status.text" label="审核状态"></el-table-column>
          <el-table-column prop="create_time" label="申请时间" width="135"></el-table-column>
          <el-table-column prop="audit_time" label="审核时间" width="135"></el-table-column>
          <el-table-column fixed="right" label="操作" width="180">
            <template slot-scope="scope">
              <div v-if="scope.row.apply_status.value == 10 || scope.row.apply_status.value == 20">
                <el-button @click="editClick(scope.row)" type="text" size="small" v-auth="'/plus/release/cash/submit'">审核</el-button>
                <template v-if="scope.row.apply_status.value == 20">
                  <el-button @click="makeMoney(scope.row)" type="text" size="small" v-auth="'/plus/release/cash/money'">确认打款</el-button>
                </template>
                <template v-if="scope.row.apply_status.value == 20 && scope.row.pay_type.value == 10">
                  <el-button @click="WxPay(scope.row.id)" type="text" size="small" v-auth="'/plus/release/cash/money'">微信付款</el-button>
                </template>
              </div>
              <div v-if="scope.row.apply_status.value == 30">
                <el-button @click="editClick(scope.row)" type="text" size="small">查看详情</el-button>
               </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
          :current-page="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"></el-pagination>
      </div>
    </div>
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')">
    </Edit>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Edit from './dialog/Edit.vue';
  import qs from 'qs';
  export default {
    components: {
      /*编辑组件*/
      Edit
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*列表数据*/
        tableData: [],
        /*一页多少条*/
        pageSize: 20,
        /*一共多少条数据*/
        totalDataNumber: 0,
        /*当前是第几页*/
        curPage: 1,
        formInline: {
          apply_status: '-1',
          pay_type: '-1',
          search: '',
          /*用户ID*/
          user_id: ''
        },
        /*是否打开编辑弹窗*/
        open_edit: false,
        /*当前编辑的对象*/
        userModel: {}
      };
    },
    props: {},
    watch: {
    $route(to, from) {
      if (to.query.user_id != null) {
        this.formInline.user_id = to.query.user_id;
      }else{
        this.formInline.user_id ='';
      }
      this.curPage = 1;
      this.getData();
    }
  },
  created() {
    if (this.$route.query.user_id != null) {
      this.formInline.user_id = this.$route.query.user_id;
    }
    /*获取列表*/
    this.getData();
  },
  methods: {
    /*获取数据*/
    getData() {
      let self = this;
      let Params = self.formInline;
      Params.page = self.curPage;
      Params.list_rows = self.pageSize;
      PlusApi.cash(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.list.data;
          self.totalDataNumber = data.data.list.total;
        })
        .catch(error => {});
    },
    /*搜索*/
    onSubmit() {
      let self = this;
      self.loading = true;
      let Params = self.formInline;
      PlusApi.cash(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.list.data;
          self.totalDataNumber = data.data.list.total;
        })
        .catch(error => {
          self.loading = false;
        });
    },
      onExport: function() {
        let baseUrl = window.location.protocol + '//' + window.location.host;
        window.location.href = baseUrl + '/index.php/shop/plus.release.cash/export?' + qs.stringify(this.formInline);
      },
    /*每页多少条*/
    handleSizeChange(val) {
      this.curPage = 1;
      this.pageSize = val;
      this.getData();
    },
    /*选择第几页*/
    handleCurrentChange(val) {
      let self = this;
      self.curPage = val;
      self.getData();
    },
    /*打开弹出层编辑*/
    editClick(item) {
      this.userModel = item;
      this.open_edit = true;
    },
    /*关闭弹窗*/
    closeDialogFunc(e, f) {
      if (f == 'add') {
        this.open_add = e.openDialog;
        if (e.type == 'success') {
          this.getData();
        }
      }
      if (f == 'edit') {
        this.open_edit = e.openDialog;
        if (e.type == 'success') {
          this.getData();
        }
      }
    },
    /*确认打款*/
    makeMoney(e) {
      let self = this;
      self
        .$confirm('确认要打款吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        })
        .then(() => {
          self.loading = true;
            PlusApi.money({
              id: e.id
            },
            true
          )
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: '恭喜你,操作成功',
                  type: 'success'
                });
                this.getData();
              } else {
                self.loading = false;
              }
            })
            .catch(error => {
              self.loading = false;
            });
        })
        .catch(() => {});
    },
    /*微信打款*/
    WxPay(e) {
      let self = this;
      self
        .$confirm('该操作 将使用分账功能,确定打款吗?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        })
        .then(() => {
          self.loading = true;
            PlusApi.FbPay({
              id: e
            },
            true
          )
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: '恭喜你,操作成功',
                  type: 'success'
                });
                this.getData();
              } else {
                self.loading = false;
              }
            })
            .catch(error => {
              self.loading = false;
            });
        })
        .catch(() => {});
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/cash/dialog/Edit.vue
New file
@@ -0,0 +1,94 @@
<template>
  <!--
          作者:luoyiming
          时间:2020-06-01
          描述:插件中心-分销-提现申请-弹窗
      -->
  <div v-if="status != 30">
    <el-dialog title="提现审核" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <el-form :model="form">
        <el-form-item label="审核状态" :label-width="formLabelWidth">
          <div>
            <el-radio v-model="form.apply_status" label="20">审核通过</el-radio>
            <el-radio v-model="form.apply_status" label="30">驳回</el-radio>
          </div>
        </el-form-item>
        <div v-if="form.apply_status == 30">
          <el-form-item label="驳回原因" :label-width="formLabelWidth"><el-input v-model="form.reject_reason" autocomplete="off"></el-input></el-form-item>
        </div>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="editApplyStatus">确 定</el-button>
      </div>
    </el-dialog>
  </div>
  <div v-else>
    <el-dialog title="驳回原因" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <p>{{ reject_reason }}</p>
      <!-- <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="dialogFormVisible">确 定</el-button>
      </div> -->
    </el-dialog>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
export default {
  data() {
    return {
      status: '',
      reject_reason: '',
      /*左边长度*/
      formLabelWidth: '120px',
      /*是否显示*/
      dialogVisible: false
    };
  },
  props: ['open_edit', 'form'],
  created() {
    this.dialogVisible = this.open_edit;
    this.status = this.form.apply_status.value;
    if (this.status == 30) {
      this.reject_reason = this.form.reject_reason;
    }
  },
  methods: {
    /*修改*/
    editApplyStatus() {
      let self = this;
      let params = this.form;
      PlusApi.cashSubmit(params, true)
        .then(data => {
          self.$message({
            message: '恭喜你,修改成功',
            type: 'success'
          });
          self.dialogFormVisible(true);
        })
        .catch(error => {});
    },
    /*关闭弹窗*/
    dialogFormVisible(e) {
      if (e) {
        this.$emit('closeDialog', {
          type: 'success',
          openDialog: false
        });
      } else {
        this.$emit('closeDialog', {
          type: 'error',
          openDialog: false
        });
      }
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/demand/apply/Apply.vue
New file
@@ -0,0 +1,169 @@
<template>
  <!--
          作者:yj
          时间:2025-11-9
          描述:申请
      -->
  <div class="user">
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="formInline" class="demo-form-inline">
        <el-form-item label=""><el-input v-model="formInline.nick_name" placeholder="请输入昵称/姓名/手机号"></el-input></el-form-item>
        <el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table :data="tableData" size="small" border style="width: 100%" v-loading="loading">
          <el-table-column prop="user_id" label="用户ID" width="60"></el-table-column>
          <el-table-column prop="nickName" label="微信头像" width="70">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.avatarUrl" width="30" height="30" />
            </template>
          </el-table-column>
          <el-table-column prop="nickName" label="    微信昵称" width="250"></el-table-column>
          <el-table-column prop="real_name" label="姓名" width="100"></el-table-column>
          <el-table-column prop="mobile" label="手机号">
            <template slot-scope="scope">
              <p class="text-ellipsis">{{ scope.row.mobile }}</p>
            </template>
          </el-table-column>
          <!-- <el-table-column prop="detail" label="地址"></el-table-column> -->
          <el-table-column prop="apply_status" label="审核状态" width="100">
            <template slot-scope="scope">
              <span :class="{
                red: scope.row.apply_status.value == 10,
                green: scope.row.apply_status.value == 20,
                gray: scope.row.apply_status.value == 30 }">
                {{ scope.row.apply_status.text }}
              </span>
            </template>
          </el-table-column>
          <el-table-column prop="apply_time" label="申请时间" width="135"></el-table-column>
          <el-table-column fixed="right" label="操作" width="50">
            <template slot-scope="scope">
              <div>
                <el-button v-if="scope.row.apply_status.value == 10" @click="editClick(scope.row)" type="text" size="small">
                  审核
                </el-button>
                <el-button v-if="scope.row.apply_status.value == 30" @click="editClick(scope.row)" type="text" size="small">查看</el-button>
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          background
          :current-page="curPage"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"
        ></el-pagination>
      </div>
    </div>
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
import Edit from './dialog/Edit.vue';
export default {
  components: {
    /*编辑组件*/
    Edit
  },
  data() {
    return {
      /*是否加载完成*/
      loading: true,
      /*列表数据*/
      tableData: [],
      /*一页多少条*/
      pageSize: 20,
      /*一共多少条数据*/
      totalDataNumber: 0,
      /*当前是第几页*/
      curPage: 1,
      formInline: {
        nick_name: ''
      },
      /*是否打开编辑弹窗*/
      open_edit: false,
      /*当前编辑的对象*/
      userModel: {}
    };
  },
  created() {
    /*获取列表*/
    this.getData();
  },
  methods: {
    /*选择第几页*/
    handleCurrentChange(val) {
      let self = this;
      self.curPage = val;
      self.loading = true;
      self.getData();
    },
    /*获取数据*/
    getData() {
      let self = this;
      let Params = {};
      Params.page = self.curPage;
      Params.list_rows = self.pageSize;
      Params.nick_name = this.formInline.nick_name;
      PlusApi.demandApplyList(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.apply_list.data;
          self.totalDataNumber = data.data.apply_list.total;
        })
        .catch(error => {});
    },
    //搜索
    onSubmit() {
      this.curPage = 1;
      this.getData();
    },
    /*每页多少条*/
    handleSizeChange(val) {
      this.curPage = 1;
      this.getData();
    },
    /*打开弹出层编辑*/
    editClick(item) {
      this.userModel = item;
      this.open_edit = true;
    },
    /*关闭弹窗*/
    closeDialogFunc(e, f) {
      if (f == 'add') {
        this.open_add = e.openDialog;
        if (e.type == 'success') {
          this.getData();
        }
      }
      if (f == 'edit') {
        this.open_edit = e.openDialog;
        if (e.type == 'success') {
          this.getData();
        }
      }
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/demand/apply/dialog/Edit.vue
New file
@@ -0,0 +1,88 @@
<template>
  <!--
          作者:yj
          时间:2025-11-9
      -->
  <div v-if="status != 30">
    <el-dialog title="申请审核" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <el-form :model="form">
        <el-form-item label="审核状态" :label-width="formLabelWidth">
          <div>
            <el-radio v-model="form.apply_status" label="20">审核通过</el-radio>
            <el-radio v-model="form.apply_status" label="30">驳回</el-radio>
          </div>
        </el-form-item>
        <div v-if="form.apply_status == 30">
          <el-form-item label="驳回原因" :label-width="formLabelWidth"><el-input v-model="form.reject_reason" autocomplete="off"></el-input></el-form-item>
        </div>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="editApplyStatus">确 定</el-button>
      </div>
    </el-dialog>
  </div>
  <div v-else>
    <el-dialog title="驳回原因" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <p>{{ reject_reason }}</p>
    </el-dialog>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
export default {
  data() {
    return {
      status: '',
      reject_reason: '',
      /*左边长度*/
      formLabelWidth: '120px',
      /*是否显示*/
      dialogVisible: false
    };
  },
  props: ['open_edit', 'form'],
  created() {
    this.dialogVisible = this.open_edit;
    this.status = this.form.apply_status.value;
    if (this.status == 30) {
      this.reject_reason = this.form.reject_reason;
    }
  },
  methods: {
    /*修改用户*/
    editApplyStatus() {
      let self = this;
      let params = this.form;
      PlusApi.editDemandApplyStatus(params, true)
        .then(data => {
          self.$message({
            message: '恭喜你,修改成功',
            type: 'success'
          });
          self.dialogFormVisible(true);
        })
        .catch(error => {});
    },
    /*关闭弹窗*/
    dialogFormVisible(e) {
      if (e) {
        this.$emit('closeDialog', {
          type: 'success',
          openDialog: false
        });
      } else {
        this.$emit('closeDialog', {
          type: 'error',
          openDialog: false
        });
      }
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/demand/user/User.vue
New file
@@ -0,0 +1,214 @@
<template>
  <!--
          作者:yj
          时间:2025-11-9
      -->
  <div class="user">
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="formInline" class="demo-form-inline">
        <el-form-item label=""><el-input v-model="formInline.nick_name" placeholder="请输入昵称/姓名/手机号"></el-input></el-form-item>
        <el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="user_id" label="用户ID" width="70"></el-table-column>
          <el-table-column prop="nickName" label="微信头像" width="70">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.avatarUrl" width="30" height="30" />
            </template>
          </el-table-column>
          <el-table-column prop="nickName" label="微信昵称" width="250"></el-table-column>
          <el-table-column prop="real_name" label="姓名" width="100"></el-table-column>
          <el-table-column prop="mobile" label="手机号"></el-table-column>
         <!-- <el-table-column prop="detail" label="地址"></el-table-column> -->
         <el-table-column prop="" label="会员等级">
           <template slot-scope="scope">
             <span v-if="scope.row.grade_id == 0">无等级</span>
             <span v-else>{{ scope.row.grade.name }}</span>
           </template>
         </el-table-column>
          <el-table-column prop="create_time" label="成为时间" width="140"></el-table-column>
          <el-table-column fixed="right" label="操作" width="160">
            <template slot-scope="scope">
              <div>
                <!-- <el-button @click="saleClick(scope.row)" type="text" size="small">需求订单</el-button> -->
                <el-button @click="EditClick(scope.row)" type="text" size="small">修改</el-button>
                <el-button @click="delClick(scope.row)" type="text" size="small">删除</el-button>
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          background
          :current-page="curPage"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"
        ></el-pagination>
      </div>
    </div>
    <!--编辑-->
    <Edit :open_edit="open_edit" :userModel="userModel"  :gradeList="gradeList" @close="closeEditFunc"></Edit>
  </div>
</template>
<script>
import { deepClone } from '@/utils/base.js'
import PlusApi from '@/api/plus/release.js';
import Edit from './dialog/Edit.vue';
export default {
  components: {
    Edit,
  },
  data() {
    return {
      /*是否加载完成*/
      loading: true,
      /*列表数据*/
      tableData: [],
      /*一页多少条*/
      pageSize: 20,
      /*一共多少条数据*/
      totalDataNumber: 0,
      /*当前是第几页*/
      curPage: 1,
      /*搜索对象*/
      formInline: {
        nick_name: ''
      },
      /*是否打开弹窗*/
      open_dialog: false,
      /*选中的用户*/
      userModel:{},
      /*是否打开修改*/
      open_edit:false,
      /*等级*/
      gradeList: [],
    };
  },
  created() {
    /*获取列表*/
    this.getData();
  },
  methods: {
    /*选择第几页*/
    handleCurrentChange(val) {
      let self = this;
      self.curPage = val;
      self.loading = true;
      self.getData();
    },
    /*获取数据*/
    getData() {
      let self = this;
      let Params = {};
      Params.page = self.curPage;
      Params.list_rows = self.pageSize;
      if(self.formInline.nick_name!=''){
        Params.nick_name=self.formInline.nick_name;
      }
      PlusApi.demandUserList(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.list.data;
          self.totalDataNumber = data.data.list.total;
          self.gradeList = data.data.grade;
        })
        .catch(error => {
          self.loading = false;
        });
    },
    //搜索
    onSubmit() {
      this.curPage = 1;
      this.getData();
    },
    /*每页多少条*/
    handleSizeChange(val) {
      this.curPage = 1;
      this.pageSize = val;
      this.getData();
    },
    /*订单*/
    saleClick(item) {
      this.$router.push({
        path:'/plus/release/index',
        query:{
          type:'demandorder',
          repair_user_id:item.user_id
        }
      })
    },
    /*删除*/
    delClick(row) {
      let self = this;
      self
        .$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        })
        .then(() => {
          self.loading = true;
          PlusApi.deleteDemandUser(
            {
              user_id: row.user_id
            },
            true
          )
            .then(data => {
              self.loading = false;
              self.$message({
                message: data.msg,
                type: 'success'
              });
              self.getData();
            })
            .catch(error => {
              self.loading = false;
            });
        })
        .catch(() => {
          self.loading = false;
        });
    },
     /*打开编辑用户弹窗*/
    EditClick(e){
      this.userModel=deepClone(e);
      this.open_edit=true;
    },
    /*关闭编辑用户弹窗*/
    closeEditFunc(e){
      this.open_edit=false;
      if(e.type=='success'){
        this.getData();
      }
    }
  }
};
</script>
<style scoped="scoped">
  .el-button{margin-left: 0; margin-right: 10px;}
</style>
supplier_vue/src/views/plus/release/demand/user/dialog/Edit.vue
New file
@@ -0,0 +1,93 @@
<template>
  <!--
          作者:yj
      -->
  <el-dialog title="编辑" :visible.sync="dialogVisible" @close="cancelFunc" :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
    <el-form :model="formData">
      <el-form-item label="微信昵称" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.nickName" autocomplete="off" :disabled="true"></el-input>
      </el-form-item>
      <el-form-item label="微信头像" :label-width="formLabelWidth">
        <img v-img-url="formData.avatarUrl" width="50" height="50" />
      </el-form-item>
      <el-form-item label="姓名" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.real_name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="手机号" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.mobile" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="等级" :label-width="formLabelWidth">
        <el-select v-model="formData.grade_id" placeholder="-请选择等级-">
          <el-option v-for="(item,index) in gradeList" :key="index" :label="item.name" :value="item.grade_id"></el-option>
        </el-select>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="cancelFunc">取 消</el-button>
      <el-button type="primary" @click="confirmFunc">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
import UserApi from '@/api/user.js';
export default {
  data() {
    return {
      /*左边长度*/
      formLabelWidth: '100px',
      /*是否显示*/
      dialogVisible: false,
      /*表单数据模型*/
      formData: {},
    };
  },
  props: ['open_edit','userModel','gradeList'],
  watch: {
    open_edit: function(n, o) {
      if (n != o) {
        this.dialogVisible = this.open_edit;
        if (n) {
          this.formData = this.userModel;
        }
      }
    }
  },
  created() {
  },
  methods: {
    /*修改用户*/
    confirmFunc() {
      let self = this;
      let params ={};
      params.user_id= this.formData.user_id;
      params.real_name=this.formData.real_name;
      params.mobile=this.formData.mobile;
      params.grade_id=this.formData.grade_id;
      PlusApi.demandUserEdit(params, true)
        .then(data => {
          self.$message({
            message: '恭喜你,修改成功',
            type: 'success'
          });
          self.cancelFunc(true);
        })
        .catch(error => {});
    },
    /*关闭弹窗*/
    cancelFunc(e) {
      let type='cancel';
      if(e){
        type='success';
      }
      this.$emit('close', {
        type:type
      });
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/demandproject/Edit.vue
New file
@@ -0,0 +1,78 @@
<template>
  <!--
      作者:yj
  -->
  <el-dialog title="详情" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="标题:" :label-width="formLabelWidth">
        {{form.name}}
      </el-form-item>
      <el-form-item label="分类:" :label-width="formLabelWidth">
        {{form.category.name}}
      </el-form-item>
      <el-form-item label="预算:" :label-width="formLabelWidth">
        ¥{{form.price}}
      </el-form-item>
      <el-form-item label="详细需求:" :label-width="formLabelWidth" >
        {{form.content}}
      </el-form-item>
      <el-form-item label="图片:" :label-width="formLabelWidth">
         <div v-if="form.image_list" v-for="(item,index) in form.image_list">
          <a target="_blank" :href="item.file_path"><img style="max-width: 50px; height: 50px;" v-img-url="item.file_path" />
          </a>
        </div>
      </el-form-item>
      <el-form-item label="期望完成时间:" :label-width="formLabelWidth" >
        {{form.finish_time}}
      </el-form-item>
      <el-form-item label="期望地点:" :label-width="formLabelWidth">
        {{form.detail}}
      </el-form-item>
      <el-form-item label="联系方式:" :label-width="formLabelWidth">
        <span v-if="form.show_phone == 0">不公开</span>
        <span v-if="form.show_phone == 1">公开</span>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">返回</el-button>
    </div>
  </el-dialog>
</template>
<script>
  export default {
    data() {
      return {
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
      };
    },
    props: ['open_edit', 'form'],
    created() {
      this.dialogVisible = this.open_edit;
    },
    methods: {
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/demandproject/dialog/Edit.vue
New file
@@ -0,0 +1,92 @@
<template>
  <!--
          作者:yj
      -->
  <div v-if="status != 2">
    <el-dialog title="审核" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <el-form :model="form">
        <el-form-item label="审核状态" :label-width="formLabelWidth">
          <div>
            <el-radio v-model="form.status" label="1">审核通过</el-radio>
            <el-radio v-model="form.status" label="2">驳回</el-radio>
          </div>
        </el-form-item>
        <div v-if="form.status == 2">
          <el-form-item label="驳回原因" :label-width="formLabelWidth"><el-input v-model="form.reject_reason" autocomplete="off"></el-input></el-form-item>
        </div>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="editApplyStatus">确 定</el-button>
      </div>
    </el-dialog>
  </div>
  <div v-else>
    <el-dialog title="驳回原因" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <p>{{ reject_reason }}</p>
      <!-- <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="dialogFormVisible">确 定</el-button>
      </div> -->
    </el-dialog>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
export default {
  data() {
    return {
      status: '',
      reject_reason: '',
      /*左边长度*/
      formLabelWidth: '120px',
      /*是否显示*/
      dialogVisible: false
    };
  },
  props: ['open_edit', 'form'],
  created() {
    this.dialogVisible = this.open_edit;
    this.status = this.form.status.value;
    if (this.status == 30) {
      this.reject_reason = this.form.reject_reason;
    }
  },
  methods: {
    /*修改*/
    editApplyStatus() {
      let self = this;
      let params = this.form;
      PlusApi.demandProjectSubmit(params, true)
        .then(data => {
          self.$message({
            message: '恭喜你,修改成功',
            type: 'success'
          });
          self.dialogFormVisible(true);
        })
        .catch(error => {});
    },
    /*关闭弹窗*/
    dialogFormVisible(e) {
      if (e) {
        this.$emit('closeDialog', {
          type: 'success',
          openDialog: false
        });
      } else {
        this.$emit('closeDialog', {
          type: 'error',
          openDialog: false
        });
      }
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/demandproject/index.vue
New file
@@ -0,0 +1,232 @@
<template>
  <!--
          作者:yj
      -->
  <div class="user">
    <!--搜索表单-->
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="searchForm" class="demo-form-inline">
        <!-- <el-form-item label="类目">
          <el-select size="small" v-model="searchForm.category_id" placeholder="所有分类">
            <el-option label="全部" value="0"></el-option>
            <el-option v-for="(item, index) in categoryList" :key="index" :label="item.name" :value="item.category_id">
            </el-option>
          </el-select>
        </el-form-item> -->
        <el-form-item label="标题">
          <el-input size="small" v-model="searchForm.name" placeholder="请输入标题"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button size="small" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="project_id" label="ID" width="100"></el-table-column>
          <el-table-column prop="nickName" label="发布用户"></el-table-column>
          <el-table-column prop="nickName" label="微信头像">
            <template slot-scope="scope">
              <img :src="scope.row.user.avatarUrl" width="30px" height="30px" />
            </template>
          </el-table-column>
          <el-table-column prop="name" label="标题"></el-table-column>
          <el-table-column prop="category.name" label="分类" width="200"></el-table-column>
          <el-table-column prop="price" label="预算" width="200"></el-table-column>
          <el-table-column prop="status" label="状态"  width="200">
            <template slot-scope="scope">
              <span v-if="scope.row.status == 0">未审核</span>
              <span v-if="scope.row.status == 1" class="green">已通过</span>
              <span v-if="scope.row.status == 2" class="green">已驳回</span>
            </template>
          </el-table-column>
          <el-table-column fixed="right" label="操作" width="200">
            <template slot-scope="scope">
              <el-button v-if="scope.row.status == 0" @click="shClick(scope.row)" type="text" size="small">审核</el-button>
              <el-button @click="editClick(scope.row)" type="text" size="small" >详情</el-button>
              <el-button @click="evaluateClick(scope.row)" type="text" size="small" >评论列表</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
          :current-page="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"></el-pagination>
      </div>
    </div>
    <!--编辑-->
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
    <Editsh v-if="open_sh" :open_edit="open_sh" :form="userModel" @closeDialog="closeDialogFunc($event, 'editsh')"></Editsh>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Edit from './Edit.vue';
  import Editsh from './dialog/Edit.vue';
  import {deepClone} from '@/utils/base.js';
  export default {
    components: {
      /*编辑组件*/
      Edit,
      Editsh,
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*一页多少条*/
        pageSize: 10,
        /*一共多少条数据*/
        totalDataNumber: 0,
        /*当前是第几页*/
        curPage: 1,
        /*列表数据*/
        tableData: [],
        /*横向表单数据模型*/
        /*搜索参数*/
        searchForm: {
          name: '',
          category_id: ''
        },
        /*是否打开编辑弹窗*/
        open_edit: false,
        /*当前编辑的对象*/
        userModel: {},
        open_sh:false,
      };
    },
    created() {
      /*获取列表*/
      this.getTableList();
    },
    methods: {
      /*选择第几页*/
      handleCurrentChange(val) {
        let self = this;
        self.loading = true;
        self.curPage = val;
        self.getTableList();
      },
      /*每页多少条*/
      handleSizeChange(val) {
        this.pageSize = val;
        this.getTableList();
      },
      /*获取列表*/
      getTableList() {
        let self = this;
        let Params = self.searchForm;
        Params.page = self.curPage;
        Params.list_rows = self.pageSize;
        PlusApi.demandProject(Params, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list.data;
            self.totalDataNumber = data.data.list.total;
          })
          .catch(error => {
          });
      },
      /*搜索查询*/
      onSubmit() {
        this.curPage = 1;
        this.getTableList();
      },
      evaluateClick(item) {
        let self = this;
        let params = item.project_id;
        this.$router.push({
          path: '/plus/release/evaluate/list',
          query: {
            project_id: params
          }
        });
      },
      /*打开编辑*/
      editClick(item) {
        this.userModel = deepClone(item);
        this.open_edit = true;
      },
      /*打开弹出层审核*/
      shClick(item) {
        this.userModel = item;
        this.open_sh = true;
      },
      /*关闭弹窗*/
      closeDialogFunc(e, f) {
        if (f == 'add') {
          this.open_add = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
        if (f == 'edit') {
          this.open_edit = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
        if (f == 'editsh') {
          this.open_sh = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
      },
      /*删除*/
      deleteClick(row) {
        let self = this;
        self.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          self.loading = true;
          PlusApi.demandDel({
              project_id: row.project_id
            }, true)
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.getTableList();
              } else {
                self.$message.error('错了哦,这是一条错误消息');
              }
            })
            .catch(error => {
              self.loading = false;
            });
        }).catch(() => {
        });
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/evaluate/list.vue
New file
@@ -0,0 +1,174 @@
<template>
  <!--
          作者:yj
      -->
  <div class="user">
    <!--搜索表单-->
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="searchForm" class="demo-form-inline">
        <!-- <el-form-item label="类目">
          <el-select size="small" v-model="searchForm.category_id" placeholder="所有分类">
            <el-option label="全部" value="0"></el-option>
            <el-option v-for="(item, index) in categoryList" :key="index" :label="item.name" :value="item.category_id">
            </el-option>
          </el-select>
        </el-form-item> -->
        <el-form-item label="用户id">
          <el-input size="small" v-model="searchForm.user_id" placeholder="请输入用户id"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button size="small" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
          <el-button size="small" type="info" @click="cancelFunc">返回上一页</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="id" label="ID" width="100"></el-table-column>
          <el-table-column prop="user.nickName" label="评论用户" width="200"></el-table-column>
          <el-table-column prop="nickName" label="微信头像" width="100">
            <template slot-scope="scope">
              <img :src="scope.row.user.avatarUrl" width="30px" height="30px" />
            </template>
          </el-table-column>
          <el-table-column prop="score_txt" label="评分" width="100"></el-table-column>
          <el-table-column prop="status" label="图片" width="200">
            <template slot-scope="scope">
              <a style="margin-right:5px;" v-for="(item, index) in scope.row.image_list" target="_blank" :href="item.file_path"><img :src="item.file_path" width="30px" height="30px" /></a>
            </template>
          </el-table-column>
          <el-table-column prop="evaluate_content" label="评语"></el-table-column>
          <el-table-column fixed="right" label="操作" width="200">
            <template slot-scope="scope">
              <el-button @click="deleteClick(scope.row)" type="text" size="small">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
          :current-page="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"></el-pagination>
      </div>
    </div>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import {deepClone} from '@/utils/base.js';
  export default {
    components: {
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*一页多少条*/
        pageSize: 10,
        /*一共多少条数据*/
        totalDataNumber: 0,
        /*当前是第几页*/
        curPage: 1,
        /*列表数据*/
        tableData: [],
        /*横向表单数据模型*/
        /*搜索参数*/
        searchForm: {
          user_id: '',
          category_id: ''
        },
        project_id:''
      };
    },
    created() {
      /*获取列表*/
      this.getTableList();
    },
    methods: {
      /*选择第几页*/
      handleCurrentChange(val) {
        let self = this;
        self.loading = true;
        self.curPage = val;
        self.getTableList();
      },
      /*每页多少条*/
      handleSizeChange(val) {
        this.pageSize = val;
        this.getTableList();
      },
      /*获取列表*/
      getTableList() {
        let self = this;
        let Params = self.searchForm;
        Params.page = self.curPage;
        Params.list_rows = self.pageSize;
        Params.project_id = self.$route.query.project_id;;
        PlusApi.evaluate(Params, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list.data;
            self.totalDataNumber = data.data.list.total;
          })
          .catch(error => {
          });
      },
      /*搜索查询*/
      onSubmit() {
        this.curPage = 1;
        this.getTableList();
      },
      cancelFunc() {
        this.$router.back(-1);
      },
      /*删除*/
      deleteClick(row) {
        let self = this;
        self.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          self.loading = true;
          PlusApi.evaluateDel({
              id: row.id
            }, true)
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.getTableList();
              } else {
                self.$message.error('错了哦,这是一条错误消息');
              }
            })
            .catch(error => {
              self.loading = false;
            });
        }).catch(() => {
        });
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/grade/index.vue
New file
@@ -0,0 +1,32 @@
<template>
  <!--
      作者 yj
  -->
  <div class="common-seach-wrap">
    <el-tabs v-model="activeName">
      <el-tab-pane label="等级列表" name="list"></el-tab-pane>
    </el-tabs>
    <!--设置-->
    <List v-if="activeName == 'list'"></List>
  </div>
</template>
<script>
import List from './part/list';
export default {
  components: {
    List,
  },
  data() {
    return {
      activeName: 'list'
    };
  },
  methods: {}
};
</script>
<style>
</style>
supplier_vue/src/views/plus/release/grade/part/Add.vue
New file
@@ -0,0 +1,136 @@
<template>
  <!--
      作者 yj
  -->
  <el-dialog title="添加等级" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="等级名称" :label-width="formLabelWidth" prop="name" :rules="[{required: true,message: '请输入等级名称'}]">
        <el-input v-model="form.name" placeholder="请输入等级名称"></el-input>
      </el-form-item>
      <el-form-item label="等级图标" :label-width="formLabelWidth" prop="img" :rules="[{required: true,message: ' '}]">
        <el-row>
          <el-button icon="el-icon-picture-outline" @click="openUpload('img')">选择图片</el-button>
          <div v-if="form.img!=''" class="img">
            <img :src="form.img" width="100" height="100" />
          </div>
        </el-row>
      </el-form-item>
      <el-form-item label="等级权重" :label-width="formLabelWidth" prop="weight" :rules="[{required: true,message: '请输入等级权重'}]">
        <el-input v-model="form.weight" type="number" placeholder="请输入等级权重"></el-input>
        <div class="gray9">权重越大,等级越高</div>
      </el-form-item>
      <el-form-item label="升级条件" :label-width="formLabelWidth">
        <div class="gray9">0或不填均无法升级到该等级</div>
        <div class="d-s-c mt16">
          <span>累计好评达</span>
          <el-input v-model="form.upgrade_num" type="number" style="width: 160px; margin-left: 10px;" ></el-input>
          <span class="ml10">条</span>
        </div>
      </el-form-item>
    </el-form>
    <!--上传图片组件-->
    <Upload v-if="isupload" :isupload="isupload" :type="type" @returnImgs="returnImgsFunc">上传图片</Upload>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="addGrade()" :disabled="submit_loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Upload from '@/components/file/Upload';
  export default {
    components: {
      /*上传组件*/
      Upload,
    },
    data() {
      return {
        form: {
          /*昵称*/
          name: '',
          /*累计满*/
          upgrade_num:0,
          /*等级权重*/
          weight: 100,
          img:'',
        },
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        /*是否正在提交*/
        submit_loading: false,
        /*是否上传图片*/
        isupload: false,
      };
    },
    props: ['open_add'],
    created() {
      this.dialogVisible = this.open_add;
    },
    methods: {
      /*添加等级*/
      addGrade() {
        let self = this;
        let params = this.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.submit_loading = true;
            PlusApi.addgrade(params, true).then(data => {
                self.submit_loading = false;
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.dialogFormVisible(true);
              })
              .catch(error => {
                self.submit_loading = false;
              });
          }
        });
      },
      /*上传*/
      openUpload(e) {
        this.type = e;
        this.isupload = true;
      },
      /*获取图片*/
      returnImgsFunc(e) {
        if (e != null && e.length > 0) {
          if (this.type == 'img') {
            this.form.img = e[0].file_path;
          }
        }
        this.isupload = false;
      },
      /*取消*/
      cancelFunc() {
        this.$router.back(-1);
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/grade/part/Edit.vue
New file
@@ -0,0 +1,131 @@
<template>
  <!--
      作者 yj
  -->
  <el-dialog title="编辑等级" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="等级名称" :label-width="formLabelWidth" prop="name" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="等级图标" :label-width="formLabelWidth" prop="img" :rules="[{required: true,message: ' '}]">
        <el-row>
          <el-button icon="el-icon-picture-outline" @click="openUpload('img')">选择图片</el-button>
          <div v-if="form.img!='' && form.img!=null" class="img">
            <img :src="form.img" width="100" height="100" />
          </div>
        </el-row>
      </el-form-item>
      <el-form-item label="等级权重" :label-width="formLabelWidth" prop="weight" :rules="[{required: true,message: '请输入等级权重'}]">
        <el-input v-model="form.weight" type="number" placeholder="请输入等级权重"></el-input>
        <div class="gray9">权重越大,等级越高</div>
      </el-form-item>
      <el-form-item label="升级条件" :label-width="formLabelWidth">
        <div class="gray9">0或不填均无法升级到该等级</div>
        <div class="d-s-c mt16">
          <span>累计好评达</span>
          <el-input v-model="form.upgrade_num" type="number" style="width: 160px; margin-left: 10px;" ></el-input>
          <span class="ml10">条</span>
        </div>
      </el-form-item>
    </el-form>
    <!--上传图片组件-->
    <Upload v-if="isupload" :isupload="isupload" :type="type" @returnImgs="returnImgsFunc">上传图片</Upload>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="editGrade" :disabled="submit_loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Upload from '@/components/file/Upload';
  export default {
    components: {
      /*上传组件*/
      Upload,
    },
    data() {
      return {
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        /*是否正在提交*/
        submit_loading: false,
        /*是否上传图片*/
        isupload: false,
      };
    },
    props: ['open_edit', 'form'],
    created() {
      this.dialogVisible = this.open_edit;
    },
    methods: {
      /*修改用户*/
      editGrade() {
        let self = this;
        let params = this.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.submit_loading = true;
            PlusApi.editGrade(params, true)
              .then(data => {
                self.submit_loading = false;
                self.$message({
                  message: '恭喜你,等级修改成功',
                  type: 'success'
                });
                self.dialogFormVisible(true);
              })
              .catch(error => {
                self.submit_loading = false;
              });
          }
        });
      },
      /*上传*/
      openUpload(e) {
        this.type = e;
        this.isupload = true;
      },
      /*获取图片*/
      returnImgsFunc(e) {
        if (e != null && e.length > 0) {
          if (this.type == 'img') {
            this.form.img = e[0].file_path;
          }
        }
        this.isupload = false;
      },
      /*取消*/
      cancelFunc() {
        this.$router.back(-1);
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/grade/part/list.vue
New file
@@ -0,0 +1,189 @@
<template>
  <!--
          作者 yj
      -->
  <div class="user">
    <!--添加等级-->
    <div class="common-level-rail">
      <el-button size="small" type="primary" @click="addClick" icon="el-icon-plus" v-auth="'/plus/release/grade/add'">添加等级</el-button>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="name" label="等级名称" width="300"></el-table-column>
          <el-table-column prop="weight" label="权重"></el-table-column>
          <el-table-column prop="upgrade_num" label="好评数量"></el-table-column>
          <el-table-column fixed="right" label="操作" width="90">
            <template slot-scope="scope">
              <el-button @click="editClick(scope.row)" type="text" size="small" v-auth="'/plus/release/grade/edit'" >编辑</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small"  v-auth="'/plus/release/grade/delete'">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background :current-page="curPage"
          :page-size="pageSize" layout="total, prev, pager, next, jumper"
          :total="totalDataNumber">
        </el-pagination>
      </div>
    </div>
    <!--添加-->
    <Add v-if="open_add" :open_add="open_add" @closeDialog="closeDialogFunc($event, 'add')"></Add>
    <!--编辑-->
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Edit from './Edit.vue';
  import Add from './Add.vue';
  import {deepClone} from '@/utils/base.js';
  export default {
    components: {
      /*编辑组件*/
      Edit,
      Add
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*列表数据*/
        tableData: [],
        /*一页多少条*/
        pageSize: 15,
        /*一共多少条数据*/
        totalDataNumber: 0,
        /*当前是第几页*/
        curPage: 1,
        /*横向表单数据模型*/
        formInline: {
          user: '',
        },
        /*是否打开添加弹窗*/
        open_add: false,
        /*是否打开编辑弹窗*/
        open_edit: false,
        /*当前编辑的对象*/
        userModel: {}
      };
    },
    created() {
      /*获取列表*/
      this.getTableList();
    },
    methods: {
      /*换行*/
      keepTextStyle(val){
        let str=val.replace(/(\\r\\n)/g,'<br/>');
        return str;
      },
      /*选择第几页*/
      handleCurrentChange(val) {
        let self = this;
        self.curPage = val;
        self.loading = true;
        self.getTableList();
      },
      /*每页多少条*/
      handleSizeChange(val) {
        this.curPage = 1;
        this.pageSize = val;
        this.getTableList();
      },
      /*获取列表*/
      getTableList() {
        let self = this;
        let Params = {};
        Params.page = self.curPage;
        Params.list_rows = self.pageSize;
        PlusApi.gradelist(Params, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list.data;
            self.totalDataNumber = data.data.list.total
          })
          .catch(error => {
          });
      },
      /*打开添加*/
      addClick() {
        this.open_add = true;
      },
      /*打开编辑*/
      editClick(item) {
        this.userModel = deepClone(item);
        this.open_edit = true;
      },
      /*关闭弹窗*/
      closeDialogFunc(e, f) {
        if (f == 'add') {
          this.open_add = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
        if (f == 'edit') {
          this.open_edit = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
      },
      /*删除用户*/
      deleteClick(row) {
        let self = this;
        self.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          self.loading = true;
          PlusApi.deletegrade({
              grade_id: row.grade_id
            }, true)
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.getTableList();
              } else {
                self.$message.error('错了哦,这是一条错误消息');
              }
            })
            .catch(error => {
              self.loading = false;
            });
        }).catch(() => {
        });
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/index.vue
New file
@@ -0,0 +1,192 @@
<template>
  <!--
          作者:yj
      -->
  <div>
    <DemandApply v-if="activeName == 'demandapply'"></DemandApply>
    <DemandUser v-if="activeName == 'demanduser'"></DemandUser>
    <SupplyApply v-if="activeName == 'supplyapply'"></SupplyApply>
    <SupplyUser v-if="activeName == 'supplyuser'"></SupplyUser>
    <DemandProject v-if="activeName == 'demandproject'"></DemandProject>
    <SupplyProject v-if="activeName == 'supplyproject'"></SupplyProject>
    <Order v-if="activeName == 'order'"></Order>
    <Category v-if="activeName == 'category'"></Category>
    <Tag v-if="activeName == 'tag'"></Tag>
    <Cash v-if="activeName == 'cash'"></Cash>
    <Setting v-if="activeName == 'setting'"></Setting>
    <Grade v-if="activeName == 'grade'"></Grade>
  </div>
</template>
<script>
import bus from '@/utils/eventBus.js';
import DemandApply from './demand/apply/Apply';
import DemandUser from './demand/user/User';
import SupplyApply from './supply/apply/Apply';
import SupplyUser from './supply/user/User';
import DemandProject from './demandproject/index';
import SupplyProject from './supplyproject/index';
import Order from './order/Order';
import Category from './releasecategory/index';
import Tag from './tag/index';
import Cash from './cash/Cash';
import Setting from './setting/Setting';
import Grade from './grade/index';
export default {
  components: {
    DemandApply,
    DemandUser,
    SupplyApply,
    SupplyUser,
    DemandProject,
    SupplyProject,
    Order,
    Category,
    Tag,
    Cash,
    Setting,
    Grade,
  },
  data() {
    return {
      formInline: {
        nick_name: ''
      },
      /*参数*/
      param: {},
      /*当前选中*/
      activeName: 'demandapply',
      /*切换数组*/
      sourceList: [
        {
          key: 'demandapply',
          value: '需求方申请',
          path:'/plus/release/demand/apply/index'
        },
        {
          key: 'demanduser',
          value: '需求方用户',
          path:'/plus/release/demand/user/index'
        },{
          key: 'supplyapply',
          value: '供应方申请',
          path:'/plus/release/supply/apply/index'
        },
        {
          key: 'supplyuser',
          value: '供应方用户',
          path:'/plus/release/supply/user/index'
        },
        {
          key: 'demandproject',
          value: '需求发布',
          path:'/plus/release/demandproject/index'
        },
        {
          key: 'supplyproject',
          value: '供应发布',
          path:'/plus/release/supplyproject/index'
        },
        // {
        //   key: 'order',
        //   value: '用户订单',
        //   path:'/plus/release/order/Order'
        // },
        {
          key: 'grade',
          value: '信誉等级',
          path:'/plus/release/grade/index'
        },
        {
          key: 'category',
          value: '分类列表',
          path:'/plus/release/releasecategory/index'
        },
        {
          key: 'tag',
          value: '标签列表',
          path:'/plus/release/tag/index'
        },
        // {
        //   key: 'cash',
        //   value: '提现列表',
        //   path:'/plus/release/cash/Cash'
        // },
        {
          key: 'setting',
          value: '发布设置',
          path:'/plus/release/setting/Setting'
        }
      ],
      /*权限筛选后的数据*/
      tabList:[],
      /*判断third是否有参数*/
      is_third_param: false
    };
  },
  watch:{
    //监听路由
    $route(to, from) {
      this.init();
    }
  },
  created() {
    this.init();
  },
  beforeDestroy() {
    //发送类别切换
    bus.$emit('tabData', { active: null, tab_type:'release',list: [] });
    bus.$off('activeValue');
  },
  methods: {
    /*初始化方法*/
    init(){
      this.tabList=this.authFilter();
      if(this.tabList.length>0){
        this.activeName=this.tabList[0].key;
      }
      if (this.$route.query.type != null) {
        this.activeName = this.$route.query.type;
      }
      /*监听传插件的值*/
      bus.$on('activeValue', res => {
        if (this.is_third_param) {
          this.param.user_id = '';
          this.is_third_param = false;
        }
        this.activeName = res;
      });
      //发送类别切换
      let params = {
        active: this.activeName,
        list: this.tabList,
        tab_type:'release'
      };
      bus.$emit('tabData', params);
    },
    /*权限过滤*/
    authFilter(){
      let list=[];
      for(let i=0;i<this.sourceList.length;i++){
        let item=this.sourceList[i];
        if(this.$filter.isAuth(item.path)){
          list.push(item);
        }
      }
      return list;
    }
  }
};
</script>
supplier_vue/src/views/plus/release/order/Order.vue
New file
@@ -0,0 +1,281 @@
<template>
  <!--
          作者:yj
      -->
  <div class="user">
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="formInline" class="demo-form-inline">
        <el-form-item label="创建时间">
          <div class="block">
            <span class="demonstration"></span>
            <el-date-picker size="small" v-model="formInline.create_time" type="daterange" value-format="yyyy-MM-dd"
              range-separator="至" start-placeholder="开始日期" end-placeholder="结束日期"></el-date-picker>
          </div>
        </el-form-item>
        <el-form-item label="支付方式">
          <el-select v-model="formInline.pay_type" placeholder="选择支付方式">
            <el-option label="全部" value="0"></el-option>
            <el-option label="余额支付" value="10"></el-option>
            <el-option label="微信支付" value="20"></el-option>
            <el-option label="线下支付" value="40"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="支付状态">
          <el-select v-model="formInline.pay_status" placeholder="选择支付状态">
            <el-option label="全部" value="-1"></el-option>
            <el-option label="已支付" value="20"></el-option>
            <el-option label="未支付" value="10"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="订单状态">
          <el-select v-model="formInline.order_status" placeholder="选择订单状态">
            <el-option label="全部" value="-1"></el-option>
            <el-option label="进行中" value="10"></el-option>
            <el-option label="已完成" value="30"></el-option>
            <el-option label="已取消" value="20"></el-option>
          </el-select>
        </el-form-item>
        <el-form-item label="需求用户id"><el-input v-model="formInline.demand_user_id" placeholder="请输入需求用户ID"></el-input></el-form-item>
        <el-form-item label="供应用户id"><el-input v-model="formInline.supply_user_id" placeholder="请输入供应用户ID"></el-input></el-form-item>
        <el-form-item>
          <el-button type="primary" @click="onSubmit">查询</el-button>
        </el-form-item>
        <!-- <el-form-item>
          <el-button size="small" type="success" @click="onExport">导出</el-button>
        </el-form-item> -->
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <!-- <el-tabs v-model="activeName" @tab-click="handleClick">
          <el-tab-pane label="全部订单" name="status0"></el-tab-pane>
          <el-tab-pane :label="'待确认支付'" name="status1">
            <span slot="label">待确认支付 <el-tag size="mini">{{order_count.status1}}</el-tag></span>
          </el-tab-pane>
          <el-tab-pane label="服务中" name="status6">
            <span slot="label">服务中 <el-tag size="mini">{{order_count.status6}}</el-tag></span>
          </el-tab-pane>
          <el-tab-pane label="待评价" name="status8">
             <span slot="label">待评价 <el-tag size="mini">{{order_count.status8}}</el-tag></span>
          </el-tab-pane>
          <el-tab-pane label="已完成" name="status9">
             <span slot="label">已完成 <el-tag size="mini">{{order_count.status9}}</el-tag></span>
          </el-tab-pane>
          <el-tab-pane label="已取消" name="status10">
             <span slot="label">已取消 <el-tag size="mini">{{order_count.status10}}</el-tag></span>
          </el-tab-pane>
        </el-tabs> -->
        <el-table :data="tableData" size="small" border style="width: 100%" v-loading="loading">
          <el-table-column prop="nickName" label="供应会员" width="200">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.supplyuser.avatarUrl" width="30" height="30" />
              <div>ID:{{scope.row.supplyuser.user_id}}</div>
              <div>{{scope.row.supplyuser.nickName}}</div>
            </template>
          </el-table-column>
          <el-table-column prop="nickName" label="需求会员" width="200">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.demanduser.avatarUrl" width="30" height="30" />
              <div>ID:{{scope.row.demanduser.user_id}}</div>
              <div>{{scope.row.demanduser.nickName}}</div>
            </template>
          </el-table-column>
          <el-table-column prop="project_name" label="标题"></el-table-column>
          <el-table-column prop="pay_price" label="支付金额" width="100"></el-table-column>
          <el-table-column prop="money" label="项目佣金" width="80"></el-table-column>
          <el-table-column prop="pay_type.text" label="支付方式" width="80">
            <template slot-scope="scope">
              <span class="gray9" v-if="scope.row.pay_status == 20">已支付<br />{{ scope.row.pay_type.text }}</span>
              <span v-else>未支付</span>
            </template>
          </el-table-column>
          <el-table-column prop="create_time" label="下单时间" width="140">
            <template slot-scope="scope">
              <div>{{ scope.row.create_time }}</div>
            </template>
          </el-table-column>
          <!-- <el-table-column prop="evaluate_content" label="需求方评价">
            <template slot-scope="scope" v-if="scope.row.is_settled == 2">
              <div v-if="scope.row.server_score > 0">{{scope.row.server_score}}星</div>
              <div>
                <span v-if="scope.row.score == 10">好评</span>
                <span v-else-if="scope.row.score == 20">中评</span>
                <span v-else-if="scope.row.score == 30">差评</span>
                <span v-else>好评</span>
              </div>
              <div>{{ scope.row.evaluate_content }}</div>
            </template>
          </el-table-column> -->
          <el-table-column prop="is_settled" label="订单状态" width="120">
            <template slot-scope="scope">
              <div class="red" v-if="scope.row.order_status == 20">{{scope.row.state_text}}</div>
              <div class="green" v-else>{{scope.row.state_text}}</div>
            </template>
          </el-table-column>
          <el-table-column fixed="right" label="操作" width="100">
            <template slot-scope="scope">
              <div>
                <el-button v-if="scope.row.order_status ==10 && scope.row.pay_status == 20" @click="editClick(scope.row)" type="text" size="small" v-auth="'/plus/release/order/edit'">查看详情</el-button>
                <el-button v-if="scope.row.order_status ==10 && scope.row.pay_status == 10" @click="editClick(scope.row)" type="text" size="small"
                     >确认支付</el-button>
                <!-- <el-button v-if="scope.row.order_status ==21 && scope.row.pay_status == 20" @click="editClick(scope.row)" type="text" size="small"
                     >审核取消订单</el-button> -->
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          background
          :current-page="curPage"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"
        ></el-pagination>
      </div>
    </div>
    <!--编辑-->
    <Edit :open_edit="open_edit" :userModel="userModel" @close="closeEditFunc"></Edit>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
import Edit from './dialog/Edit.vue';
import qs from 'qs';
export default {
  components: {
    /*编辑组件*/
    Edit,
  },
  data() {
    return {
      /*是否加载完成*/
      loading: true,
      /*列表数据*/
      tableData: [],
      /*一页多少条*/
      pageSize: 20,
      /*一共多少条数据*/
      totalDataNumber: 0,
      /*当前是第几页*/
      curPage: 1,
      formInline: {
        /*ID*/
        demand_user_id: 0,
        supply_user_id: 0,
        pay_type:'0',
        pay_status:'-1',
        order_status:'-1',
        create_time: '',
      },
      /*是否打开编辑弹窗*/
      open_edit: false,
      /*当前编辑的对象*/
      userModel: {},
    };
  },
  props: {},
  watch: {
    $route(to, from) {
      if (to.query.supply_user_id != null) {
        this.formInline.supply_user_id = to.query.supply_user_id;
      }
      this.curPage = 1;
      this.getData();
    }
  },
  created() {
    if (this.$route.query.supply_user_id != null) {
      this.formInline.supply_user_id = this.$route.query.supply_user_id;
    }
    /*获取列表*/
    this.getData();
  },
  methods: {
    /*选择第几页*/
    handleCurrentChange(val) {
      let self = this;
      self.curPage = val;
      self.loading = true;
      self.getData();
    },
    /*获取数据*/
    getData() {
      let self = this;
      let Params = {
        demand_user_id: self.formInline.demand_user_id,
        supply_user_id: self.formInline.supply_user_id,
        pay_status:self.formInline.pay_status,
        pay_type:self.formInline.pay_type,
        order_status:self.formInline.order_status,
        create_time:self.formInline.create_time,
        page: self.curPage,
        list_rows: self.pageSize,
      };
      PlusApi.releaseOrder(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.list.data;
          self.totalDataNumber = data.data.list.total;
        })
        .catch(error => {
          self.loading = false;
        });
    },
    //搜索
    onSubmit() {
      let self = this;
      self.loading = true;
      self.curPage = 1;
      self.getData();
    },
    /*每页多少条*/
    handleSizeChange(val) {
      this.curPage = 1;
      this.pageSize = val;
      this.getData();
    },
    onExport: function() {
      let baseUrl = window.location.protocol + '//' + window.location.host;
      this.formInline.dataType = self.dataType;
      window.location.href = baseUrl + '/index.php/shop/plus.release.Order/export?' + qs.stringify(this.formInline);
    },
    /*打开弹出层编辑*/
    editClick(item) {
      this.userModel = item;
      this.open_edit = true;
    },
    /*关闭弹窗*/
    closeEditFunc(e){
      this.open_edit=false;
      if(e.type=='success'){
        this.getData();
      }
    }
  }
};
</script>
<style scoped="">
  .referee-name {
    width: 33.333333%;
  }
</style>
supplier_vue/src/views/plus/release/order/dialog/Edit.vue
New file
@@ -0,0 +1,182 @@
<template>
  <!--
          作者:yj
      -->
  <el-dialog title="详情" :visible.sync="dialogVisible" @close="cancelFunc" :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
    <el-form class="repair-form" :model="formData">
      <el-form-item label="供应用户:" :label-width="formLabelWidth">
        <div class="d-s-c" style="margin-bottom: 10px;">
           <span><img v-img-url="formData.supplyuser.avatarUrl" width="40" height="40" /></span>
           <span>{{formData.supplyuser.nickName}}</span>
        </div>
      </el-form-item>
      <el-form-item label="需求用户:" :label-width="formLabelWidth">
        <div class="d-s-c">
           <span><img v-img-url="formData.demanduser.avatarUrl" width="40" height="40" /></span>
           <span>{{formData.demanduser.nickName}}</span>
        </div>
      </el-form-item>
      <el-form-item label="标题:" :label-width="formLabelWidth">
        <span class="mr10">{{formData.project_name}}</span> <span class="ml20">支付金额:¥{{formData.pay_price}}</span> <span class="ml20">佣金:¥{{formData.money}}</span>
      </el-form-item>
      <!-- <el-form-item label="图片" :label-width="formLabelWidth">
        <div>
          <div v-for="(item, index) in formData.image" :key="index"><a target="_blank" :href="item.file_path"><img style="max-width: 50px; height: 50px;" v-img-url="item.file_path" /></a></div>
        </div>
      </el-form-item>
      <el-form-item label="备注" :label-width="formLabelWidth" prop="message">
        <el-input v-model="formData.message" autocomplete="off"></el-input>
      </el-form-item>-->
      <el-form-item label="服务星级" :label-width="formLabelWidth" v-if="formData.server_score">
        {{formData.server_score}}星
      </el-form-item>
      <el-form-item label="评分" :label-width="formLabelWidth" v-if="formData.score">
        <div v-if="formData.score == 10">好评</div>
        <div v-if="formData.score == 20">中评</div>
        <div v-if="formData.score == 30">差评</div>
      </el-form-item>
      <el-form-item label="评语" :label-width="formLabelWidth" v-if="formData.evaluate_content">
        {{formData.evaluate_content}}
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button type="warning" @click="onCancel(20)" v-if="formData.pay_status == 10 && formData.order_status == 10">取消订单</el-button>
      <el-button @click="cancelFunc">返 回</el-button>
      <el-button type="primary" @click="onCash" v-if="formData.order_status == 10 && formData.pay_status == 10">确定已付款</el-button>
      <el-button type="primary" @click="onFinish" v-if="formData.order_status == 10 && formData.pay_status == 20">确定已完成</el-button>
      <!-- <el-button type="warning" @click="onCancel(20)" v-if="formData.order_status == 21">确定取消订单</el-button>
      <el-button type="danger" @click="onCancel(10)" v-if="formData.order_status == 21">撤销申请</el-button> -->
    </div>
  </el-dialog>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
import UserApi from '@/api/user.js';
export default {
  data() {
    return {
      /*左边长度*/
      formLabelWidth: '100px',
      /*是否显示*/
      dialogVisible: false,
      /*表单数据模型*/
      formData: {},
    };
  },
  props: {
    open_edit: Boolean,
    userModel: Object,
  },
  watch: {
    open_edit: function(n, o) {
      if (n != o) {
        this.dialogVisible = this.open_edit;
        if (n) {
          this.formData = this.userModel;
        }
      }
    }
  },
  created() {
    /*获取列表*/
   // this.getData();
  },
  methods: {
    /*获取数据*/
    // getData() {
    //   let self = this;
    //   PlusApi.toOrderEdit()
    //     .then(data => {
    //       self.loading = false;
    //       self.user = data.data.user;
    //     })
    //     .catch(error => {
    //       self.loading = false;
    //     });
    // },
    /*关闭弹窗*/
    cancelFunc(e) {
      let type='cancel';
      if(e){
        type='success';
      }
      this.$emit('close', {
        type:type
      });
    },
    /*线下支付*/
    onCash(row) {
      let self = this;
      let id = this.formData.id;
      self
        .$confirm('确认后不可恢复,确认已收到款了吗?', '提示', {
          type: 'warning'
        })
        .then(() => {
          PlusApi.onCash({
            id: id
          }).then(data => {
            self.$message({
              message: '操作成功',
              type: 'success'
            });
            self.cancelFunc(true);
          });
        });
    },
    onFinish(row) {
      let self = this;
      let id = this.formData.id;
      self
        .$confirm('确认后马上发放佣金,确认已完成了吗?', '提示', {
          type: 'warning'
        })
        .then(() => {
          PlusApi.onFinish({
            id: id
          }).then(data => {
            self.$message({
              message: '操作成功',
              type: 'success'
            });
            self.cancelFunc(true);
          });
        });
    },
    onCancel(order_status) {
      let self = this;
      let id = this.formData.id;
      self
        .$confirm('此操作不可恢复,确定吗?', '提示', {
          type: 'warning'
        })
        .then(() => {
          PlusApi.onCancel({
            id: id,
            order_status: order_status
          }).then(data => {
            self.$message({
              message: '操作成功',
              type: 'success'
            });
            self.cancelFunc(true);
          });
        });
    },
  }
};
</script>
<style scoped>
  .repair-img image{
    height: 100px;
  }
  .repair-form .el-form-item {
     margin-bottom: 0px;
  }
</style>
supplier_vue/src/views/plus/release/releasecategory/Add.vue
New file
@@ -0,0 +1,103 @@
<template>
  <!--
        作者:wangxw
    -->
  <el-dialog title="添加分类" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false"
    :close-on-press-escape="false">
    <el-form size="small" :model="form" :rules="formRules" ref="form">
      <el-form-item label="分类名称" prop="name" :label-width="formLabelWidth">
        <el-input v-model="form.name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="分类排序" prop="sort" :label-width="formLabelWidth">
        <el-input v-model.number="form.sort" autocomplete="off"></el-input>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="addUser" :loading="loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  export default {
    components: {
    },
    data() {
      return {
        form: {
          name: '',
          sort: 100,
        },
        formRules: {
          name: [{
            required: true,
            message: '请输入分类名称',
            trigger: 'blur'
          }],
          sort: [{
            required: true,
            message: '分类排序不能为空'
          }, {
            type: 'number',
            message: '分类排序必须为数字'
          }]
        },
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        loading: false,
      };
    },
    props: ['open_add', 'addform'],
    created() {
      this.dialogVisible = this.open_add;
    },
    methods: {
      /*添加*/
      addUser() {
        let self = this;
        let params = self.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.loading = true;
            PlusApi.catAdd(params).then(data => {
              self.loading = false;
              self.$message({
                message: '添加成功',
                type: 'success'
              });
              self.dialogFormVisible(true);
            }).catch(error => {
              self.loading = false;
            });
          }
        });
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      },
    }
  };
</script>
<style>
 .img {
    margin-top: 10px;
  }
</style>
supplier_vue/src/views/plus/release/releasecategory/Edit.vue
New file
@@ -0,0 +1,106 @@
<template>
  <!--
        作者:wangxw
    -->
  <el-dialog title="修改分类" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false"
    :close-on-press-escape="false">
    <el-form size="small" :model="form" :rules="formRules" ref="form">
      <el-form-item label="分类名称" prop="name" :label-width="formLabelWidth">
        <el-input v-model="form.name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="分类排序" prop="sort" :label-width="formLabelWidth">
        <el-input v-model.number="form.sort" autocomplete="off"></el-input>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="addUser" :loading="loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  export default {
    components: {
    },
    data() {
      return {
        form: {
          category_id: 0,
          name: '',
          sort: '',
        },
        formRules: {
          name: [{
            required: true,
            message: '请输入分类名称',
            trigger: 'blur'
          }],
          sort: [{
            required: true,
            message: '分类排序不能为空'
          }, {
            type: 'number',
            message: '分类排序必须为数字'
          }]
        },
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        loading: false,
      };
    },
    props: ['open_edit', 'editform'],
    created() {
      this.dialogVisible = this.open_edit;
      this.form.category_id = this.editform.model.category_id;
      this.form.name = this.editform.model.name;
      this.form.sort = this.editform.model.sort;
    },
    methods: {
      /*修改用户*/
      addUser() {
        let self = this;
        let params = self.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.loading = true;
            PlusApi.catEdit(params, true).then(data => {
              self.loading = false;
              self.$message({
                message: '修改成功',
                type: 'success'
              });
              self.dialogFormVisible(true);
            }).catch(error => {
              self.loading = false;
            });
          }
        });
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      },
    }
  };
</script>
<style>
  .img {
    margin-top: 10px;
  }
</style>
supplier_vue/src/views/plus/release/releasecategory/index.vue
New file
@@ -0,0 +1,130 @@
<template>
  <!--
        作者:wangxw
        时间:2019-10-26
        描述:产品分类管理
    -->
  <div class="product">
    <!--添加产品分类-->
    <div class="common-level-rail">
      <el-button size="small" type="primary" @click="addClick" icon="el-icon-plus" v-auth="'/plus/release/releasecategory/add'">添加分类</el-button>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData"  border style="width: 100%" v-loading="loading">
          <el-table-column prop="name" label="分类名称" width="180"></el-table-column>
          <el-table-column prop="sort" label="分类排序"></el-table-column>
          <el-table-column prop="create_time" label="添加时间"></el-table-column>
          <el-table-column fixed="right" label="操作" width="100">
            <template slot-scope="scope">
              <el-button @click="editClick(scope.row)" type="text" size="small" v-auth="'/plus/release/releasecategory/edit'">编辑</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small" v-auth="'/plus/release/releasecategory/delete'">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </div>
    <!--添加-->
    <Add v-if="open_add" :open_add="open_add" :addform="categoryModel" @closeDialog="closeDialogFunc($event, 'add')"></Add>
    <!--修改-->
    <Edit v-if="open_edit" :open_edit="open_edit" :editform="categoryModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Add from './Add.vue';
  import Edit from './Edit.vue';
  export default {
    components: {
      Add,
      Edit
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*列表数据*/
        tableData: [],
        /*是否打开添加弹窗*/
        open_add: false,
        /*是否打开编辑弹窗*/
        open_edit: false,
        /*当前编辑的对象*/
        categoryModel: {
          catList: [],
          model: {}
        }
      };
    },
    created() {
      /*获取列表*/
      this.getData();
    },
    methods: {
      /*获取列表*/
      getData() {
        let self = this;
        PlusApi.catList({}, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list;
            self.categoryModel.catList = self.tableData;
          })
          .catch(error => {
            self.loading = false;
          });
      },
      /*打开添加*/
      addClick() {
        this.open_add = true;
      },
      /*打开编辑*/
      editClick(item) {
        this.categoryModel.model = item;
        this.open_edit = true;
      },
      /*关闭弹窗*/
      closeDialogFunc(e, f) {
        if (f == 'add') {
          this.open_add = e.openDialog;
          if (e.type == 'success') {
            this.getData();
          }
        }
        if (f == 'edit') {
          this.open_edit = e.openDialog;
          if (e.type == 'success') {
            this.getData();
          }
        }
      },
      /*删除分类*/
      deleteClick(row) {
        let self = this;
        self.$confirm('删除后不可恢复,确认删除该记录吗?', '提示', {
          type: 'warning'
        }).then(() => {
          PlusApi.catDel({
            category_id: row.category_id
          }).then(data => {
            self.$message({
              message: '删除成功',
              type: 'success'
            });
            self.getData();
          });
        });
      },
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/setting/Setting.vue
New file
@@ -0,0 +1,58 @@
<template>
  <div v-loading="loading">
    <el-tabs size="small" v-model="activeName" type="card" @tab-click="handleClick">
      <el-tab-pane label="设置" name="settlement"></el-tab-pane>
    </el-tabs>
    <!--结算-->
    <Settlement v-if="activeName == 'settlement'" :settingData="settingData"></Settlement>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
import Settlement from './part/Settlement';
export default {
  components: {
    /*编辑组件*/
    Settlement,
  },
  data() {
    return {
      /*是否正在加载*/
      loading:true,
      /*当前选中*/
      activeName: '',
      /*数据对象*/
      settingData:{}
    };
  },
  created() {
    if (this.$route.query.type != null) {
      this.activeName = this.$route.query.type;
    }
    this.getData();
  },
  methods: {
    /*获取数据*/
    getData() {
      let self = this;
      PlusApi.releaseSet({}, true)
        .then(res => {
          self.settingData = res.data;
          self.loading=false;
          self.activeName='settlement';
        })
        .catch(error => {});
    },
    handleClick(e) {
      this.activeName = e.name;
    }
  }
};
</script>
supplier_vue/src/views/plus/release/setting/part/Settlement.vue
New file
@@ -0,0 +1,102 @@
<template>
  <!--
          作者:yj
      -->
  <div class="mt30">
    <!--form表单-->
    <el-form size="small" ref="form" :model="form" label-width="200px">
      <el-form-item label="供应方发布消耗" prop="supply_price" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.supply_price" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
      <el-form-item label="需求方发布消耗" prop="demand_price" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.demand_price" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
      <el-form-item label="开通查看信息权限" prop="check_price" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.check_price" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
      <el-form-item label="评论奖励" prop="eve_money" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.eve_money" type="number" class="max-w460">
           <template slot="append">连盟币</template>
        </el-input>
      </el-form-item>
      <!--提交-->
      <div class="common-button-wrapper">
        <el-button size="small" type="primary" @click="onSubmit" :loading="loading">提交</el-button>
      </div>
    </el-form>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  export default {
    data() {
      return {
        /*form表单数据*/
        form: {
          pay_type: [
            10
          ],
          explain:'',
        },
        list: [],
        selectlist: [
          10
        ],
        loading: false,
      };
    },
    props: {
      settingData: Object
    },
    created() {
      this.form=this.settingData.data.settlement.values;
      this.list = this.settingData.pay_type;
    },
    methods: {
      /*提交表单*/
      onSubmit() {
        let self = this;
        let params = self.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.loading = true;
            PlusApi.settlement({
                form: params
              }, true)
              .then(data => {
                self.loading = false;
                self.$message({
                  message: '恭喜你,设置成功',
                  type: 'success'
                });
              })
              .catch(error => {
                self.loading = false;
              });
          }
        });
      },
    }
  };
</script>
<style>
</style>
supplier_vue/src/views/plus/release/setting/part/Settlement备份可删.vue
New file
@@ -0,0 +1,104 @@
<template>
  <!--
          作者:yj
      -->
  <div class="mt30">
    <!--form表单-->
    <el-form size="small" ref="form" :model="form" label-width="200px">
      <el-form-item label="提现方式">
        <el-checkbox-group v-model="form.pay_type">
          <el-checkbox v-for="(item,index) in list" :label="item.id" :key="index">{{item.name}}</el-checkbox>
        </el-checkbox-group>
        <div class="tips">注:如使用微信支付,则需申请微信支付企业付款到零钱功能</div>
      </el-form-item>
      <el-form-item label="订单抽成" prop="order_rate" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.order_rate" type="number" class="max-w460">
           <template slot="append">%</template>
        </el-input>
      </el-form-item>
      <el-form-item label="佣金提现手续费" prop="fee_rate" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.fee_rate" type="number" class="max-w460">
           <template slot="append">%</template>
        </el-input>
      </el-form-item>
      <el-form-item label="最低提现额度" prop="min_money" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.min_money" type="number" class="max-w460"></el-input>
      </el-form-item>
      <el-form-item label="提现说明">
        <el-input v-model="form.explain" type="textarea" rows="5" class="max-w460"></el-input>
      </el-form-item>
      <!--提交-->
      <div class="common-button-wrapper">
        <el-button size="small" type="primary" @click="onSubmit" :loading="loading">提交</el-button>
      </div>
    </el-form>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  export default {
    data() {
      return {
        /*form表单数据*/
        form: {
          pay_type: [
            10
          ],
          explain:'',
        },
        list: [],
        selectlist: [
          10
        ],
        loading: false,
      };
    },
    props: {
      settingData: Object
    },
    created() {
      this.form=this.settingData.data.settlement.values;
      this.list = this.settingData.pay_type;
    },
    methods: {
      /*提交表单*/
      onSubmit() {
        let self = this;
        let params = self.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.loading = true;
            PlusApi.settlement({
                form: params
              }, true)
              .then(data => {
                self.loading = false;
                self.$message({
                  message: '恭喜你,设置成功',
                  type: 'success'
                });
              })
              .catch(error => {
                self.loading = false;
              });
          }
        });
      },
    }
  };
</script>
<style>
</style>
supplier_vue/src/views/plus/release/supply/apply/Apply.vue
New file
@@ -0,0 +1,168 @@
<template>
  <!--
          作者:yj
          时间:2025-11-9
      -->
  <div class="user">
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="formInline" class="demo-form-inline">
        <el-form-item label=""><el-input v-model="formInline.nick_name" placeholder="请输入昵称/姓名/手机号"></el-input></el-form-item>
        <el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table :data="tableData" size="small" border style="width: 100%" v-loading="loading">
          <el-table-column prop="user_id" label="用户ID" width="60"></el-table-column>
          <el-table-column prop="nickName" label="微信头像" width="70">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.avatarUrl" width="30" height="30" />
            </template>
          </el-table-column>
          <el-table-column prop="nickName" label="    微信昵称" width="250"></el-table-column>
          <el-table-column prop="real_name" label="姓名" width="100"></el-table-column>
          <el-table-column prop="mobile" label="手机号">
            <template slot-scope="scope">
              <p class="text-ellipsis">{{ scope.row.mobile }}</p>
            </template>
          </el-table-column>
          <!-- <el-table-column prop="detail" label="地址"></el-table-column> -->
          <el-table-column prop="apply_status" label="审核状态" width="100">
            <template slot-scope="scope">
              <span :class="{
                red: scope.row.apply_status.value == 10,
                green: scope.row.apply_status.value == 20,
                gray: scope.row.apply_status.value == 30 }">
                {{ scope.row.apply_status.text }}
              </span>
            </template>
          </el-table-column>
          <el-table-column prop="apply_time" label="申请时间" width="135"></el-table-column>
          <el-table-column fixed="right" label="操作" width="50">
            <template slot-scope="scope">
              <div>
                <el-button v-if="scope.row.apply_status.value == 10" @click="editClick(scope.row)" type="text" size="small">
                  审核
                </el-button>
                <el-button v-if="scope.row.apply_status.value == 30" @click="editClick(scope.row)" type="text" size="small">查看</el-button>
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          background
          :current-page="curPage"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"
        ></el-pagination>
      </div>
    </div>
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
import Edit from './dialog/Edit.vue';
export default {
  components: {
    /*编辑组件*/
    Edit
  },
  data() {
    return {
      /*是否加载完成*/
      loading: true,
      /*列表数据*/
      tableData: [],
      /*一页多少条*/
      pageSize: 20,
      /*一共多少条数据*/
      totalDataNumber: 0,
      /*当前是第几页*/
      curPage: 1,
      formInline: {
        nick_name: ''
      },
      /*是否打开编辑弹窗*/
      open_edit: false,
      /*当前编辑的对象*/
      userModel: {}
    };
  },
  created() {
    /*获取列表*/
    this.getData();
  },
  methods: {
    /*选择第几页*/
    handleCurrentChange(val) {
      let self = this;
      self.curPage = val;
      self.loading = true;
      self.getData();
    },
    /*获取数据*/
    getData() {
      let self = this;
      let Params = {};
      Params.page = self.curPage;
      Params.list_rows = self.pageSize;
      Params.nick_name = this.formInline.nick_name;
      PlusApi.supplyApplyList(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.apply_list.data;
          self.totalDataNumber = data.data.apply_list.total;
        })
        .catch(error => {});
    },
    //搜索
    onSubmit() {
      this.curPage = 1;
      this.getData();
    },
    /*每页多少条*/
    handleSizeChange(val) {
      this.curPage = 1;
      this.getData();
    },
    /*打开弹出层编辑*/
    editClick(item) {
      this.userModel = item;
      this.open_edit = true;
    },
    /*关闭弹窗*/
    closeDialogFunc(e, f) {
      if (f == 'add') {
        this.open_add = e.openDialog;
        if (e.type == 'success') {
          this.getData();
        }
      }
      if (f == 'edit') {
        this.open_edit = e.openDialog;
        if (e.type == 'success') {
          this.getData();
        }
      }
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/supply/apply/dialog/Edit.vue
New file
@@ -0,0 +1,88 @@
<template>
  <!--
          作者:yj
          时间:2025-11-9
      -->
  <div v-if="status != 30">
    <el-dialog title="入驻审核" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <el-form :model="form">
        <el-form-item label="审核状态" :label-width="formLabelWidth">
          <div>
            <el-radio v-model="form.apply_status" label="20">审核通过</el-radio>
            <el-radio v-model="form.apply_status" label="30">驳回</el-radio>
          </div>
        </el-form-item>
        <div v-if="form.apply_status == 30">
          <el-form-item label="驳回原因" :label-width="formLabelWidth"><el-input v-model="form.reject_reason" autocomplete="off"></el-input></el-form-item>
        </div>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="editApplyStatus">确 定</el-button>
      </div>
    </el-dialog>
  </div>
  <div v-else>
    <el-dialog title="驳回原因" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <p>{{ reject_reason }}</p>
    </el-dialog>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
export default {
  data() {
    return {
      status: '',
      reject_reason: '',
      /*左边长度*/
      formLabelWidth: '120px',
      /*是否显示*/
      dialogVisible: false
    };
  },
  props: ['open_edit', 'form'],
  created() {
    this.dialogVisible = this.open_edit;
    this.status = this.form.apply_status.value;
    if (this.status == 30) {
      this.reject_reason = this.form.reject_reason;
    }
  },
  methods: {
    /*修改用户*/
    editApplyStatus() {
      let self = this;
      let params = this.form;
      PlusApi.editSupplyApplyStatus(params, true)
        .then(data => {
          self.$message({
            message: '恭喜你,修改成功',
            type: 'success'
          });
          self.dialogFormVisible(true);
        })
        .catch(error => {});
    },
    /*关闭弹窗*/
    dialogFormVisible(e) {
      if (e) {
        this.$emit('closeDialog', {
          type: 'success',
          openDialog: false
        });
      } else {
        this.$emit('closeDialog', {
          type: 'error',
          openDialog: false
        });
      }
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/supply/user/User.vue
New file
@@ -0,0 +1,214 @@
<template>
  <!--
          作者:yj
          时间:2025-11-9
      -->
  <div class="user">
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="formInline" class="demo-form-inline">
        <el-form-item label=""><el-input v-model="formInline.nick_name" placeholder="请输入昵称/姓名/手机号"></el-input></el-form-item>
        <el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="user_id" label="用户ID" width="70"></el-table-column>
          <el-table-column prop="nickName" label="微信头像" width="70">
            <template slot-scope="scope">
              <img class="radius" v-img-url="scope.row.avatarUrl" width="30" height="30" />
            </template>
          </el-table-column>
          <el-table-column prop="nickName" label="微信昵称" width="250"></el-table-column>
          <el-table-column prop="real_name" label="姓名" width="100"></el-table-column>
          <el-table-column prop="mobile" label="手机号"></el-table-column>
         <!-- <el-table-column prop="detail" label="地址"></el-table-column> -->
         <el-table-column prop="" label="会员等级">
           <template slot-scope="scope">
             <span v-if="scope.row.grade_id == 0">无等级</span>
             <span v-else>{{ scope.row.grade.name }}</span>
           </template>
         </el-table-column>
          <el-table-column prop="create_time" label="成为时间" width="140"></el-table-column>
          <el-table-column fixed="right" label="操作" width="160">
            <template slot-scope="scope">
              <div>
                <!-- <el-button @click="saleClick(scope.row)" type="text" size="small">供应订单</el-button> -->
                <el-button @click="EditClick(scope.row)" type="text" size="small">修改</el-button>
                <el-button @click="delClick(scope.row)" type="text" size="small">删除</el-button>
              </div>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          background
          :current-page="curPage"
          :page-size="pageSize"
          layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"
        ></el-pagination>
      </div>
    </div>
    <!--编辑-->
    <Edit :open_edit="open_edit" :userModel="userModel"  :gradeList="gradeList" @close="closeEditFunc"></Edit>
  </div>
</template>
<script>
import { deepClone } from '@/utils/base.js'
import PlusApi from '@/api/plus/release.js';
import Edit from './dialog/Edit.vue';
export default {
  components: {
    Edit,
  },
  data() {
    return {
      /*是否加载完成*/
      loading: true,
      /*列表数据*/
      tableData: [],
      /*一页多少条*/
      pageSize: 20,
      /*一共多少条数据*/
      totalDataNumber: 0,
      /*当前是第几页*/
      curPage: 1,
      /*搜索对象*/
      formInline: {
        nick_name: ''
      },
      /*是否打开弹窗*/
      open_dialog: false,
      /*选中的用户*/
      userModel:{},
      /*是否打开修改*/
      open_edit:false,
      /*等级*/
      gradeList: [],
    };
  },
  created() {
    /*获取列表*/
    this.getData();
  },
  methods: {
    /*选择第几页*/
    handleCurrentChange(val) {
      let self = this;
      self.curPage = val;
      self.loading = true;
      self.getData();
    },
    /*获取数据*/
    getData() {
      let self = this;
      let Params = {};
      Params.page = self.curPage;
      Params.list_rows = self.pageSize;
      if(self.formInline.nick_name!=''){
        Params.nick_name=self.formInline.nick_name;
      }
      PlusApi.supplyUserList(Params, true)
        .then(data => {
          self.loading = false;
          self.tableData = data.data.list.data;
          self.totalDataNumber = data.data.list.total;
          self.gradeList = data.data.grade;
        })
        .catch(error => {
          self.loading = false;
        });
    },
    //搜索
    onSubmit() {
      this.curPage = 1;
      this.getData();
    },
    /*每页多少条*/
    handleSizeChange(val) {
      this.curPage = 1;
      this.pageSize = val;
      this.getData();
    },
    /*维修订单*/
    saleClick(item) {
      this.$router.push({
        path:'/plus/release/index',
        query:{
          type:'supplyorder',
          repair_user_id:item.user_id
        }
      })
    },
    /*删除*/
    delClick(row) {
      let self = this;
      self
        .$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        })
        .then(() => {
          self.loading = true;
          PlusApi.deleteSupplyUser(
            {
              user_id: row.user_id
            },
            true
          )
            .then(data => {
              self.loading = false;
              self.$message({
                message: data.msg,
                type: 'success'
              });
              self.getData();
            })
            .catch(error => {
              self.loading = false;
            });
        })
        .catch(() => {
          self.loading = false;
        });
    },
     /*打开编辑用户弹窗*/
    EditClick(e){
      this.userModel=deepClone(e);
      this.open_edit=true;
    },
    /*关闭编辑用户弹窗*/
    closeEditFunc(e){
      this.open_edit=false;
      if(e.type=='success'){
        this.getData();
      }
    }
  }
};
</script>
<style scoped="scoped">
  .el-button{margin-left: 0; margin-right: 10px;}
</style>
supplier_vue/src/views/plus/release/supply/user/dialog/Edit.vue
New file
@@ -0,0 +1,93 @@
<template>
  <!--
          作者:yj
      -->
  <el-dialog title="编辑" :visible.sync="dialogVisible" @close="cancelFunc" :close-on-click-modal="false" :close-on-press-escape="false" width="60%">
    <el-form :model="formData">
      <el-form-item label="微信昵称" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.nickName" autocomplete="off" :disabled="true"></el-input>
      </el-form-item>
      <el-form-item label="微信头像" :label-width="formLabelWidth">
        <img v-img-url="formData.avatarUrl" width="50" height="50" />
      </el-form-item>
      <el-form-item label="姓名" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.real_name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="手机号" :label-width="formLabelWidth">
        <el-input type="text" v-model="formData.mobile" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="等级" :label-width="formLabelWidth">
        <el-select v-model="formData.grade_id" placeholder="-请选择等级-">
          <el-option v-for="(item,index) in gradeList" :key="index" :label="item.name" :value="item.grade_id"></el-option>
        </el-select>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="cancelFunc">取 消</el-button>
      <el-button type="primary" @click="confirmFunc">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
import UserApi from '@/api/user.js';
export default {
  data() {
    return {
      /*左边长度*/
      formLabelWidth: '100px',
      /*是否显示*/
      dialogVisible: false,
      /*表单数据模型*/
      formData: {},
    };
  },
  props: ['open_edit','userModel','gradeList'],
  watch: {
    open_edit: function(n, o) {
      if (n != o) {
        this.dialogVisible = this.open_edit;
        if (n) {
          this.formData = this.userModel;
        }
      }
    }
  },
  created() {
  },
  methods: {
    /*修改用户*/
    confirmFunc() {
      let self = this;
      let params ={};
      params.user_id= this.formData.user_id;
      params.real_name=this.formData.real_name;
      params.mobile=this.formData.mobile;
      params.grade_id=this.formData.grade_id;
      PlusApi.supplyUserEdit(params, true)
        .then(data => {
          self.$message({
            message: '恭喜你,修改成功',
            type: 'success'
          });
          self.cancelFunc(true);
        })
        .catch(error => {});
    },
    /*关闭弹窗*/
    cancelFunc(e) {
      let type='cancel';
      if(e){
        type='success';
      }
      this.$emit('close', {
        type:type
      });
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/supplyproject/Edit.vue
New file
@@ -0,0 +1,77 @@
<template>
  <!--
      作者:yj
  -->
  <el-dialog title="详情" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="标题:" :label-width="formLabelWidth">
        {{form.name}}
      </el-form-item>
      <el-form-item label="分类:" :label-width="formLabelWidth">
        {{form.category.name}}
      </el-form-item>
      <el-form-item label="价格:" :label-width="formLabelWidth">
        ¥{{form.price}}
      </el-form-item>
      <el-form-item label="详细描述:" :label-width="formLabelWidth" >
        {{form.content}}
      </el-form-item>
      <el-form-item label="图片:" :label-width="formLabelWidth">
         <div v-if="form.image_list" v-for="(item,index) in form.image_list">
          <a target="_blank" :href="item.file_path"><img style="max-width: 50px; height: 50px;" v-img-url="item.file_path" />
          </a>
        </div>
      </el-form-item>
      <el-form-item label="交付时间:" :label-width="formLabelWidth" >
        {{form.finish_time}}
      </el-form-item>
      <el-form-item label="服务地点:" :label-width="formLabelWidth">
        {{form.detail}}
      </el-form-item>
      <el-form-item label="标签:" :label-width="formLabelWidth">
        <span v-if="form.tag_list" v-for="(item,index) in form.tag_list">{{item.name}};</span>
      </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">返回</el-button>
    </div>
  </el-dialog>
</template>
<script>
  export default {
    data() {
      return {
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
      };
    },
    props: ['open_edit', 'form'],
    created() {
      this.dialogVisible = this.open_edit;
    },
    methods: {
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/supplyproject/dialog/Edit.vue
New file
@@ -0,0 +1,92 @@
<template>
  <!--
          作者:yj
      -->
  <div v-if="status != 2">
    <el-dialog title="审核" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <el-form :model="form">
        <el-form-item label="审核状态" :label-width="formLabelWidth">
          <div>
            <el-radio v-model="form.status" label="1">审核通过</el-radio>
            <el-radio v-model="form.status" label="2">驳回</el-radio>
          </div>
        </el-form-item>
        <div v-if="form.apply_status == 2">
          <el-form-item label="驳回原因" :label-width="formLabelWidth"><el-input v-model="form.reject_reason" autocomplete="off"></el-input></el-form-item>
        </div>
      </el-form>
      <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="editApplyStatus">确 定</el-button>
      </div>
    </el-dialog>
  </div>
  <div v-else>
    <el-dialog title="驳回原因" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false">
      <p>{{ reject_reason }}</p>
      <!-- <div slot="footer" class="dialog-footer">
        <el-button @click="dialogFormVisible">取 消</el-button>
        <el-button type="primary" @click="dialogFormVisible">确 定</el-button>
      </div> -->
    </el-dialog>
  </div>
</template>
<script>
import PlusApi from '@/api/plus/release.js';
export default {
  data() {
    return {
      status: '',
      reject_reason: '',
      /*左边长度*/
      formLabelWidth: '120px',
      /*是否显示*/
      dialogVisible: false
    };
  },
  props: ['open_edit', 'form'],
  created() {
    this.dialogVisible = this.open_edit;
    this.status = this.form.status.value;
    if (this.status == 30) {
      this.reject_reason = this.form.reject_reason;
    }
  },
  methods: {
    /*修改*/
    editApplyStatus() {
      let self = this;
      let params = this.form;
      PlusApi.supplyProjectSubmit(params, true)
        .then(data => {
          self.$message({
            message: '恭喜你,修改成功',
            type: 'success'
          });
          self.dialogFormVisible(true);
        })
        .catch(error => {});
    },
    /*关闭弹窗*/
    dialogFormVisible(e) {
      if (e) {
        this.$emit('closeDialog', {
          type: 'success',
          openDialog: false
        });
      } else {
        this.$emit('closeDialog', {
          type: 'error',
          openDialog: false
        });
      }
    }
  }
};
</script>
<style></style>
supplier_vue/src/views/plus/release/supplyproject/index.vue
New file
@@ -0,0 +1,227 @@
<template>
  <!--
          作者:yj
      -->
  <div class="user">
    <!--搜索表单-->
    <div class="common-seach-wrap">
      <el-form size="small" :inline="true" :model="searchForm" class="demo-form-inline">
        <!-- <el-form-item label="类目">
          <el-select size="small" v-model="searchForm.category_id" placeholder="所有分类">
            <el-option label="全部" value="0"></el-option>
            <el-option v-for="(item, index) in categoryList" :key="index" :label="item.name" :value="item.category_id">
            </el-option>
          </el-select>
        </el-form-item> -->
        <el-form-item label="标题">
          <el-input size="small" v-model="searchForm.name" placeholder="请输入标题"></el-input>
        </el-form-item>
        <el-form-item>
          <el-button size="small" type="primary" icon="el-icon-search" @click="onSubmit">查询</el-button>
        </el-form-item>
      </el-form>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="project_id" label="ID" width="100"></el-table-column>
          <el-table-column prop="name" label="标题"></el-table-column>
          <el-table-column prop="category.name" label="分类" width="200"></el-table-column>
          <el-table-column prop="price" label="价格" width="200"></el-table-column>
          <el-table-column prop="status" label="状态"  width="200">
            <template slot-scope="scope">
              <span v-if="scope.row.status == 0">未审核</span>
              <span v-if="scope.row.status == 1" class="green">已通过</span>
              <span v-if="scope.row.status == 2" class="green">已驳回</span>
            </template>
          </el-table-column>
          <el-table-column fixed="right" label="操作" width="200">
            <template slot-scope="scope">
              <el-button v-if="scope.row.status == 0" @click="shClick(scope.row)" type="text" size="small">审核</el-button>
              <el-button @click="editClick(scope.row)" type="text" size="small" >详情</el-button>
              <el-button @click="evaluateClick(scope.row)" type="text" size="small" >评论列表</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <!--分页-->
      <div class="pagination">
        <el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange" background
          :current-page="curPage" :page-size="pageSize" layout="total, prev, pager, next, jumper"
          :total="totalDataNumber"></el-pagination>
      </div>
    </div>
    <!--编辑-->
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
    <Editsh v-if="open_sh" :open_edit="open_sh" :form="userModel" @closeDialog="closeDialogFunc($event, 'editsh')"></Editsh>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Edit from './Edit.vue';
  import Editsh from './dialog/Edit.vue';
  import {deepClone} from '@/utils/base.js';
  export default {
    components: {
      /*编辑组件*/
      Edit,
      Editsh,
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*一页多少条*/
        pageSize: 10,
        /*一共多少条数据*/
        totalDataNumber: 0,
        /*当前是第几页*/
        curPage: 1,
        /*列表数据*/
        tableData: [],
        /*横向表单数据模型*/
        /*搜索参数*/
        searchForm: {
          name: '',
          category_id: ''
        },
        /*是否打开编辑弹窗*/
        open_edit: false,
        /*当前编辑的对象*/
        userModel: {},
        open_sh:false,
      };
    },
    created() {
      /*获取列表*/
      this.getTableList();
    },
    methods: {
      /*选择第几页*/
      handleCurrentChange(val) {
        let self = this;
        self.loading = true;
        self.curPage = val;
        self.getTableList();
      },
      /*每页多少条*/
      handleSizeChange(val) {
        this.pageSize = val;
        this.getTableList();
      },
      evaluateClick(item) {
        let self = this;
        let params = item.project_id;
        this.$router.push({
          path: '/plus/release/evaluate/list',
          query: {
            project_id: params
          }
        });
      },
      /*获取列表*/
      getTableList() {
        let self = this;
        let Params = self.searchForm;
        Params.page = self.curPage;
        Params.list_rows = self.pageSize;
        PlusApi.supplyProject(Params, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list.data;
            self.totalDataNumber = data.data.list.total;
          })
          .catch(error => {
          });
      },
      /*搜索查询*/
      onSubmit() {
        this.curPage = 1;
        this.getTableList();
      },
      /*打开编辑*/
      editClick(item) {
        this.userModel = deepClone(item);
        this.open_edit = true;
      },
      /*打开弹出层审核*/
      shClick(item) {
        this.userModel = item;
        this.open_sh = true;
      },
      /*关闭弹窗*/
      closeDialogFunc(e, f) {
        if (f == 'add') {
          this.open_add = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
        if (f == 'edit') {
          this.open_edit = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
        if (f == 'editsh') {
          this.open_sh = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
      },
      /*删除*/
      deleteClick(row) {
        let self = this;
        self.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          self.loading = true;
          PlusApi.supplyDel({
              project_id: row.project_id
            }, true)
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.getTableList();
              } else {
                self.$message.error('错了哦,这是一条错误消息');
              }
            })
            .catch(error => {
              self.loading = false;
            });
        }).catch(() => {
        });
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/tag/Add.vue
New file
@@ -0,0 +1,86 @@
<template>
  <!--
      作者:yj
  -->
  <el-dialog title="添加" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="名称" :label-width="formLabelWidth" prop="name" :rules="[{required: true,message: '请输入名称'}]">
        <el-input v-model="form.name" placeholder="请输入名称"></el-input>
      </el-form-item>
      <el-form-item label="排序" :label-width="formLabelWidth" prop="sort" :rules="[{required: true,message: '请输入排序'}]">
        <el-input v-model="form.sort" type="number" placeholder="请输入排序"></el-input>
        <div class="gray9">数字越大,越排前</div>
      </el-form-item>
   </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="add()" :disabled="submit_loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  export default {
    data() {
      return {
        form: {
          name: '',
          sort: 100,
        },
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        /*是否正在提交*/
        submit_loading: false,
      };
    },
    props: ['open_add'],
    created() {
      this.dialogVisible = this.open_add;
    },
    methods: {
      /*添加*/
      add() {
        let self = this;
        let params = this.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.submit_loading = true;
            PlusApi.addTag(params, true).then(data => {
                self.submit_loading = false;
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.dialogFormVisible(true);
              })
              .catch(error => {
                self.submit_loading = false;
              });
          }
        });
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/tag/Edit.vue
New file
@@ -0,0 +1,85 @@
<template>
  <!--
      作者:yj
  -->
  <el-dialog title="编辑" :visible.sync="dialogVisible" @close='dialogFormVisible' :close-on-click-modal="false"
    :close-on-press-escape="false" width="600px">
    <el-form size="small" :model="form" ref="form">
      <el-form-item label="名称" :label-width="formLabelWidth" prop="name" :rules="[{required: true,message: ' '}]">
        <el-input v-model="form.name" autocomplete="off"></el-input>
      </el-form-item>
      <el-form-item label="排序" :label-width="formLabelWidth" prop="sort" :rules="[{required: true,message: '请输入排序'}]">
          <el-input v-model="form.sort" type="number" placeholder="请输入排序"></el-input>
          <div class="gray9">数字越大,越排前</div>
        </el-form-item>
    </el-form>
    <div slot="footer" class="dialog-footer">
      <el-button @click="dialogFormVisible">取 消</el-button>
      <el-button type="primary" @click="edit" :disabled="submit_loading">确 定</el-button>
    </div>
  </el-dialog>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  export default {
    data() {
      return {
        /*左边长度*/
        formLabelWidth: '120px',
        /*是否显示*/
        dialogVisible: false,
        /*是否正在提交*/
        submit_loading: false,
      };
    },
    props: ['open_edit', 'form'],
    created() {
      this.dialogVisible = this.open_edit;
    },
    methods: {
      /*修改*/
      edit() {
        let self = this;
        let params = this.form;
        self.$refs.form.validate((valid) => {
          if (valid) {
            self.submit_loading = true;
            PlusApi.editTag(params, true)
              .then(data => {
                self.submit_loading = false;
                self.$message({
                  message: '恭喜你,修改成功',
                  type: 'success'
                });
                self.dialogFormVisible(true);
              })
              .catch(error => {
                self.submit_loading = false;
              });
          }
        });
      },
      /*关闭弹窗*/
      dialogFormVisible(e) {
        if (e) {
          this.$emit('closeDialog', {
            type: 'success',
            openDialog: false
          })
        } else {
          this.$emit('closeDialog', {
            type: 'error',
            openDialog: false
          })
        }
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/release/tag/index.vue
New file
@@ -0,0 +1,147 @@
<template>
  <!--
          作者:yj
      -->
  <div class="user">
    <!--添加-->
    <div class="common-level-rail">
      <el-button size="small" type="primary" @click="addClick" icon="el-icon-plus" v-auth="'/plus/release/tag/add'">添加标签</el-button>
    </div>
    <!--内容-->
    <div class="product-content">
      <div class="table-wrap">
        <el-table size="small" :data="tableData" border style="width: 100%" v-loading="loading">
          <el-table-column prop="tag_id" label="标签ID" width="100"></el-table-column>
          <el-table-column prop="name" label="名称"></el-table-column>
          <el-table-column prop="sort" label="排序" width="200"></el-table-column>
          <el-table-column fixed="right" label="操作" width="90">
            <template slot-scope="scope">
              <el-button @click="editClick(scope.row)" type="text" size="small" v-auth="'/plus/release/tag/edit'" >编辑</el-button>
              <el-button @click="deleteClick(scope.row)" type="text" size="small" v-auth="'/plus/release/tag/delete'">删除</el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
    </div>
    <!--添加-->
    <Add v-if="open_add" :open_add="open_add" @closeDialog="closeDialogFunc($event, 'add')"></Add>
    <!--编辑-->
    <Edit v-if="open_edit" :open_edit="open_edit" :form="userModel" @closeDialog="closeDialogFunc($event, 'edit')"></Edit>
  </div>
</template>
<script>
  import PlusApi from '@/api/plus/release.js';
  import Edit from './Edit.vue';
  import Add from './Add.vue';
  import {deepClone} from '@/utils/base.js';
  export default {
    components: {
      /*编辑组件*/
      Edit,
      Add
    },
    data() {
      return {
        /*是否加载完成*/
        loading: true,
        /*列表数据*/
        tableData: [],
        /*横向表单数据模型*/
        form: {
          become: '0'
        },
        /*是否打开添加弹窗*/
        open_add: false,
        /*是否打开编辑弹窗*/
        open_edit: false,
        /*当前编辑的对象*/
        userModel: {}
      };
    },
    created() {
      /*获取列表*/
      this.getTableList();
    },
    methods: {
      /*获取列表*/
      getTableList() {
        let self = this;
        let Params = {};
        PlusApi.Tag(Params, true)
          .then(data => {
            self.loading = false;
            self.tableData = data.data.list;
          })
          .catch(error => {
          });
      },
      /*打开添加*/
      addClick() {
        this.open_add = true;
      },
      /*打开编辑*/
      editClick(item) {
        this.userModel = deepClone(item);
        this.open_edit = true;
      },
      /*关闭弹窗*/
      closeDialogFunc(e, f) {
        if (f == 'add') {
          this.open_add = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
        if (f == 'edit') {
          this.open_edit = e.openDialog;
          if (e.type == 'success') {
            this.getTableList();
          }
        }
      },
      /*删除*/
      deleteClick(row) {
        let self = this;
        self.$confirm('此操作将永久删除该记录, 是否继续?', '提示', {
          confirmButtonText: '确定',
          cancelButtonText: '取消',
          type: 'warning'
        }).then(() => {
          self.loading = true;
          PlusApi.deleteTag({
              tag_id: row.tag_id
            }, true)
            .then(data => {
              self.loading = false;
              if (data.code == 1) {
                self.$message({
                  message: data.msg,
                  type: 'success'
                });
                self.getTableList();
              } else {
                self.$message.error('错了哦,这是一条错误消息');
              }
            })
            .catch(error => {
              self.loading = false;
            });
        }).catch(() => {
        });
      }
    }
  };
</script>
<style></style>
supplier_vue/src/views/plus/vip/setting/part/Basic.vue
@@ -13,6 +13,24 @@
          <el-radio v-model="form.is_open" label="0">关闭</el-radio>
        </div>
      </el-form-item>
      <el-form-item label="是否开启级差奖">
        <div>
          <el-radio v-model="form.jcaward" label="1">开启</el-radio>
          <el-radio v-model="form.jcaward" label="0">关闭</el-radio>
        </div>
      </el-form-item>
      <el-form-item label="是否开启平级奖">
        <div>
          <el-radio v-model="form.pjaward" label="1">开启</el-radio>
          <el-radio v-model="form.pjaward" label="0">关闭</el-radio>
        </div>
      </el-form-item>
      <el-form-item label="平级奖励层级" v-if="form.pjaward==1">
        <div>
          <el-input v-model="form.pjaward_level" type="number" class="max-w460"></el-input>
          <div class="tips">默认1级,即只往上找一个平级</div>
        </div>
      </el-form-item>
      <el-form-item label="成为VIP需要购买的商品">
        <div>
          <el-row>
@@ -34,6 +52,33 @@
        </el-input>
        <div class="tips">用户直推指定数量的用户后,即可享受平台佣金</div>
      </el-form-item>
      <el-form-item label="复购专区奖条件" name="second">
        <label>推荐VIP会员人数</label>
        <el-input v-model="form.viewpoint_buy_count" type="number" class="max-w460">
          <template slot="append">人</template>
        </el-input>
        <label>每月复购专区消费</label>
        <el-input v-model="form.repurchase_consumption" type="number" class="max-w460">
          <template slot="append">元</template>
        </el-input>
        <div class="tips">用户满足条件后,即可享复购专区奖</div>
      </el-form-item>
      <el-form-item label="下级收益补贴条件" name="second">
        <label>直推指定等级</label>
        <el-select v-model="form.referee_grade_ids" multiple style="width: 160px; margin-left: 10px;">
          <el-option
            v-for="item in userGradeList"
            :key="item.grade_id"
            :label="item.name"
            :value="item.grade_id">
          </el-option>
        </el-select>
        <label>直推人数</label>
        <el-input v-model="form.referee_grade_count" type="number"  style="width: 160px; margin-left: 10px;" ></el-input>
        <span class="ml10">人</span>
        <div class="tips">直推多少用户指定会员等级后,即可享受享受下级收益补贴</div>
      </el-form-item>
      <!--提交-->
      <div class="common-button-wrapper">
        <el-button size="small" type="primary" @click="onSubmit" :loading="loading">提交</el-button>
@@ -47,6 +92,7 @@
<script>
import PlusApi from '@/api/plus/vip.js';
import Product from '@/components/product/Product';
import UserApi from '@/api/user.js';
export default {
  components: {
@@ -60,8 +106,12 @@
        is_open: '0',
        become__buy_product_ids: [],
        referee_buy_count: '0',
        product_image: []
        product_image: [],
        jcaward: '0',
        pjaward: '0',
        pjaward_level: '1'
      },
      userGradeList:[],
      /*是否打开产品弹出层*/
      isproduct: false,
      /*是否正在加载*/
@@ -73,9 +123,23 @@
  },
  created() {
    this.form = this.settingData.data.basic.values;
    console.log(this.form)
    console.log(this.form.referee_grade_ids);
    // 等级id转换成数组
    for (let i = 0; i < this.form.referee_grade_ids.length; i++) {
      this.form.referee_grade_ids[i] = parseInt(this.form.referee_grade_ids[i]);
    }
    this.getUserGradeList();
  },
  methods: {
    /*获取用户管理模块的等级列表*/
    getUserGradeList() {
      let self = this;
      UserApi.gradelist({}, true)
        .then(res => {
          self.userGradeList = res.data.list.data || res.data.list;
        })
        .catch(error => {});
    },
    /*提交表单*/
    onSubmit() {
      let self = this;