From ad8477d3ee82a3fffd5de4cd60a237c9ee6b1fb7 Mon Sep 17 00:00:00 2001
From: quanwei <419654421@qq.com>
Date: Wed, 04 Mar 2026 14:27:05 +0800
Subject: [PATCH] 后台添加供需求发布

---
 shop_vue/src/views/plus/release/supplyproject/index.vue      |   24 
 mobile/pages3/release/chat/chat.vue                          |    8 
 shop_vue/src/views/plus/release/demandproject/dialog/Add.vue |  356 ++++++++++++
 shop_vue/src/views/plus/release/demandproject/index.vue      |   24 
 admin/app/api/model/plus/release/Chat.php                    |   34 
 shop_vue/src/api/plus/release.js                             |   24 
 shop_vue/src/components/release/GetDemandUser.vue            |  158 +++++
 admin/app/api/model/plus/region/Cash.php                     |    2 
 admin/app/common/model/plus/release/ChatRelation.php         |    5 
 admin/app/shop/model/plus/release/SupplyProject.php          |  234 ++++++++
 admin/app/shop/model/plus/release/SupplyUser.php             |    2 
 shop_vue/src/views/plus/release/supplyproject/dialog/Add.vue |  358 ++++++++++++
 shop_vue/src/components/release/GetSupplyUser.vue            |  158 +++++
 admin/app/shop/controller/plus/release/SupplyProject.php     |   56 +
 admin/app/shop/model/plus/release/DemandUser.php             |    4 
 admin/app/common/model/plus/release/Chat.php                 |   10 
 admin/app/shop/controller/plus/release/DemandProject.php     |   54 +
 admin/app/shop/model/plus/release/DemandProject.php          |  208 +++++++
 18 files changed, 1,697 insertions(+), 22 deletions(-)

diff --git a/admin/app/api/model/plus/region/Cash.php b/admin/app/api/model/plus/region/Cash.php
index 2d9c78b..4d4d8f5 100644
--- a/admin/app/api/model/plus/region/Cash.php
+++ b/admin/app/api/model/plus/region/Cash.php
@@ -1 +1 @@
-<?phpnamespace app\api\model\plus\region;use app\common\exception\BaseException;use app\common\model\plus\region\Cash as CashModel;use app\api\model\user\UserAuth;/** * 队长提现明细模型 */class Cash extends CashModel{    /**     * 隐藏字段     */    protected $hidden = [        'update_time',    ];    /**     * 获取队长提现明细     */    public function getList($user_id, $apply_status = -1,$limit=15)    {        $model = $this;        $apply_status > -1 && $model = $model->where('apply_status', '=', $apply_status);        return $model->where('user_id', '=', $user_id)->order(['create_time' => 'desc'])            ->paginate($limit);    }    /**     * 提交申请     */    public function submit($region, $data)    {        // 数据验证        $this->validation($region, $data);        // 新增申请记录        $this->save(array_merge($data, [            'user_id' => $region['user_id'],            'apply_status' => 10,            'app_id' => self::$app_id,        ]));        // 冻结用户资金        $region->freezeMoney($data['money']);        return true;    }    /**     * 数据验证     */    private function validation($region, &$data)    {        // 结算设置        $settlement = Setting::getItem('settlement');        // 最低提现佣金        if ($data['money'] <= 0) {            throw new BaseException(['msg' => '提现金额不正确']);        }        if ($region['money'] <= 0) {            throw new BaseException(['msg' => '当前用户没有可提现佣金']);        }        if ($data['money'] > $region['money']) {            throw new BaseException(['msg' => '提现金额不能大于可提现佣金']);        }        if ($data['money'] < $settlement['min_money']) {            throw new BaseException(['msg' => '最低提现金额为' . $settlement['min_money']]);        }        if (!in_array($data['pay_type'], $settlement['pay_type'])) {            throw new BaseException(['msg' => '提现方式不正确']);        }        if ($data['pay_type'] == '20') {            if (empty($data['alipay_name']) || empty($data['alipay_account'])) {                throw new BaseException(['msg' => '请补全提现信息']);            }        } elseif ($data['pay_type'] == '30') {            if (empty($data['bank_name']) || empty($data['bank_account']) || empty($data['bank_card'])) {                throw new BaseException(['msg' => '请补全提现信息']);            }        } elseif ($data['pay_type'] == '10') {            //微信支付需要实名认证            $auth = UserAuth::detail($region['user_id']);            if(empty($auth)){                throw new BaseException(['msg' => '请先到个人中心->设置->实名认证']);            }elseif(!empty($auth) && $auth["auth_status"] != 1){                throw new BaseException(['msg' => '您的实名认证还未审核通过']);            }        }        // 处理手续费        $data['fee_rate'] = $settlement['fee_rate'];        if ($settlement['fee_rate']) {            $data['fee_money'] = round($data['money'] * $settlement['fee_rate'] / 100, 2);            $data['real_money'] = $data['money'] - $data['fee_money'];        } else {            $data['real_money'] = $data['money'];        }    }}
\ No newline at end of file
+<?php



namespace app\api\model\plus\region;



use app\common\exception\BaseException;

use app\common\model\plus\region\Cash as CashModel;

use app\api\model\user\UserAuth;



/**

 * 队长提现明细模型

 */

class Cash extends CashModel

{

    /**

     * 隐藏字段

     */

    protected $hidden = [

        'update_time',

    ];



    /**

     * 获取队长提现明细

     */

    public function getList($user_id, $apply_status = -1,$limit=15)

    {

        $model = $this;

        $apply_status > -1 && $model = $model->where('apply_status', '=', $apply_status);

        return $model->where('user_id', '=', $user_id)->order(['create_time' => 'desc'])

            ->paginate($limit);

    }



    /**

     * 提交申请

     */

    public function submit($region, $data)

    {

        // 数据验证

        $this->validation($region, $data);

        // 新增申请记录

        $this->save(array_merge($data, [

            'user_id' => $region['user_id'],

            'apply_status' => 10,

            'app_id' => self::$app_id,

        ]));

        // 冻结用户资金

        $region->freezeMoney($data['money']);

        return true;

    }



    /**

     * 数据验证

     */

    private function validation($region, &$data)

    {

        // 结算设置

        $settlement = Setting::getItem('settlement');

        // 最低提现佣金

        if ($data['money'] <= 0) {

            throw new BaseException(['msg' => '提现金额不正确']);

        }

        if ($region['money'] <= 0) {

            throw new BaseException(['msg' => '当前用户没有可提现佣金']);

        }

        if ($data['money'] > $region['money']) {

            throw new BaseException(['msg' => '提现金额不能大于可提现佣金']);

        }

        if ($data['money'] < $settlement['min_money']) {

            throw new BaseException(['msg' => '最低提现金额为' . $settlement['min_money']]);

        }

        if (!in_array($data['pay_type'], $settlement['pay_type'])) {

            throw new BaseException(['msg' => '提现方式不正确']);

        }

        if ($data['pay_type'] == '20') {

            if (empty($data['alipay_name']) || empty($data['alipay_account'])) {

                throw new BaseException(['msg' => '请补全提现信息']);

            }

        } elseif ($data['pay_type'] == '30') {

            if (empty($data['bank_name']) || empty($data['bank_account']) || empty($data['bank_card'])) {

                throw new BaseException(['msg' => '请补全提现信息']);

            }

        } elseif ($data['pay_type'] == '10') {
            //微信支付需要实名认证
            $auth = UserAuth::detail($region['user_id']);
            if(empty($auth)){
                throw new BaseException(['msg' => '请先到个人中心->设置->实名认证']);
            }elseif(!empty($auth) && $auth["auth_status"] != 1){
                throw new BaseException(['msg' => '您的实名认证还未审核通过']);
            }
        }

        // 处理手续费

        $data['fee_rate'] = $settlement['fee_rate'];

        if ($settlement['fee_rate']) {

            $data['fee_money'] = round($data['money'] * $settlement['fee_rate'] / 100, 2);

            $data['real_money'] = $data['money'] - $data['fee_money'];

        } else {

            $data['real_money'] = $data['money'];

        }

    }



}
\ No newline at end of file
diff --git a/admin/app/api/model/plus/release/Chat.php b/admin/app/api/model/plus/release/Chat.php
index 50bbca1..ea799fa 100644
--- a/admin/app/api/model/plus/release/Chat.php
+++ b/admin/app/api/model/plus/release/Chat.php
@@ -24,25 +24,43 @@
     public function myList($user)
     {
         $ChatRelation = new ChatRelation();
-        $list = $ChatRelation->with(['user'])
+        $list = $ChatRelation
             ->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'];
+
+        // 过滤掉无效的关系记录(即user_id和other_user_id相同的记录)
+        $validList = [];
+        foreach ($list as $value) {
+            if ($value['user_id'] != $value['other_user_id']) {
+                $validList[] = $value;
             }
+        }
+
+        foreach ($validList as $key => &$value) {
+            $where['relation_id'] = $value['relation_id'];
+            // 确定显示的用户ID:应该是与自己不同的另一个用户
+            if($value['user_id'] == $user['user_id']){
+                // 当前记录是从当前用户角度创建的
+                $where['user_id'] = $other_user_id = $value['other_user_id'];
+            } else {
+                // 当前记录是从对方角度创建的,对方是user_id
+                $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;
+        return $validList;
     }
 
     //获取聊天信息
diff --git a/admin/app/common/model/plus/release/Chat.php b/admin/app/common/model/plus/release/Chat.php
index bebf8c5..1912d2e 100644
--- a/admin/app/common/model/plus/release/Chat.php
+++ b/admin/app/common/model/plus/release/Chat.php
@@ -25,12 +25,18 @@
     //添加信息
     public function add($postdata,$user)
     {
+        // 验证:不能给自己发消息
+        if (!isset($postdata['you_user_id']) || $postdata['you_user_id'] == $user['user_id']) {
+            $this->error = '不能给自己发消息';
+            return false;
+        }
+
         // 开启事务
         $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();
diff --git a/admin/app/common/model/plus/release/ChatRelation.php b/admin/app/common/model/plus/release/ChatRelation.php
index bbaa6f8..dfdd789 100644
--- a/admin/app/common/model/plus/release/ChatRelation.php
+++ b/admin/app/common/model/plus/release/ChatRelation.php
@@ -34,6 +34,11 @@
      */
     public static function getRelationId($user_id,$other_user_id)
     {
+        // 防止自己与自己创建关系
+        if ($user_id == $other_user_id) {
+            return 0;
+        }
+
         $model = new static;
         $data = $model->where("user_id",'=',$user_id)->where("other_user_id",'=',$other_user_id)->find();
         if(empty($data)){
diff --git a/admin/app/shop/controller/plus/release/DemandProject.php b/admin/app/shop/controller/plus/release/DemandProject.php
index 788f96e..7d387d4 100644
--- a/admin/app/shop/controller/plus/release/DemandProject.php
+++ b/admin/app/shop/controller/plus/release/DemandProject.php
@@ -21,6 +21,39 @@
     }
 
     /**
+     * 获取默认数据(分类)
+     */
+    public function defaultData()
+    {
+        $model = new ProjectModel;
+        $data = $model->getDefaultData();
+        return $this->renderSuccess('', compact('data'));
+    }
+
+    /**
+     * 后台发布需求
+     */
+    public function add()
+    {
+        $model = new ProjectModel;
+        $data = $this->postData();
+        // 获取表单数据
+        $formData = json_decode($data['formData'], true);
+        // 获取用户ID
+        $user_id = isset($data['user_id']) ? intval($data['user_id']) : 0;
+        if ($user_id <= 0) {
+            return $this->renderError('请选择发布用户');
+        }
+        // 是否支付连盟币(可选)
+        $pay_points = isset($data['pay_points']) ? intval($data['pay_points']) : 0;
+        
+        if ($model->addByAdmin($formData, $user_id, $pay_points)) {
+            return $this->renderSuccess('发布成功');
+        }
+        return $this->renderError($model->getError() ?: '发布失败');
+    }
+
+    /**
      * 审核
      */
     public function submit($project_id)
@@ -34,6 +67,27 @@
 
 
     /**
+     * 编辑
+     */
+    public function edit()
+    {
+        $model = new ProjectModel;
+        $data = $this->postData();
+        // 获取表单数据
+        $formData = json_decode($data['formData'], true);
+        // 获取项目ID
+        $project_id = isset($data['project_id']) ? intval($data['project_id']) : 0;
+        if ($project_id <= 0) {
+            return $this->renderError('项目ID不能为空');
+        }
+
+        if ($model->editByAdmin($project_id, $formData)) {
+            return $this->renderSuccess('编辑成功');
+        }
+        return $this->renderError($model->getError() ?: '编辑失败');
+    }
+
+    /**
      * 删除
      */
     public function delete($project_id)
diff --git a/admin/app/shop/controller/plus/release/SupplyProject.php b/admin/app/shop/controller/plus/release/SupplyProject.php
index 9aa0732..bdef644 100644
--- a/admin/app/shop/controller/plus/release/SupplyProject.php
+++ b/admin/app/shop/controller/plus/release/SupplyProject.php
@@ -20,7 +20,40 @@
         return $this->renderSuccess('', compact('list'));
     }
 
-/**
+    /**
+     * 获取默认数据(分类、标签)
+     */
+    public function defaultData()
+    {
+        $model = new ProjectModel;
+        $data = $model->getDefaultData();
+        return $this->renderSuccess('', compact('data'));
+    }
+
+    /**
+     * 后台发布供应
+     */
+    public function add()
+    {
+        $model = new ProjectModel;
+        $data = $this->postData();
+        // 获取表单数据
+        $formData = json_decode($data['formData'], true);
+        // 获取用户ID
+        $user_id = isset($data['user_id']) ? intval($data['user_id']) : 0;
+        if ($user_id <= 0) {
+            return $this->renderError('请选择发布用户');
+        }
+        // 是否支付连盟币(可选)
+        $pay_points = isset($data['pay_points']) ? intval($data['pay_points']) : 0;
+        
+        if ($model->addByAdmin($formData, $user_id, $pay_points)) {
+            return $this->renderSuccess('发布成功');
+        }
+        return $this->renderError($model->getError() ?: '发布失败');
+    }
+
+    /**
      * 审核
      */
     public function submit($project_id)
@@ -33,6 +66,27 @@
     }
 
     /**
+     * 编辑
+     */
+    public function edit()
+    {
+        $model = new ProjectModel;
+        $data = $this->postData();
+        // 获取表单数据
+        $formData = json_decode($data['formData'], true);
+        // 获取项目ID
+        $project_id = isset($data['project_id']) ? intval($data['project_id']) : 0;
+        if ($project_id <= 0) {
+            return $this->renderError('项目ID不能为空');
+        }
+
+        if ($model->editByAdmin($project_id, $formData)) {
+            return $this->renderSuccess('编辑成功');
+        }
+        return $this->renderError($model->getError() ?: '编辑失败');
+    }
+
+    /**
      * 删除
      */
     public function delete($project_id)
diff --git a/admin/app/shop/model/plus/release/DemandProject.php b/admin/app/shop/model/plus/release/DemandProject.php
index 255164b..c9cb30d 100644
--- a/admin/app/shop/model/plus/release/DemandProject.php
+++ b/admin/app/shop/model/plus/release/DemandProject.php
@@ -4,6 +4,10 @@
 
 use app\common\model\plus\release\Project as ProjectModel;
 use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
+use app\common\model\plus\release\ReleaseCategory as ReleaseCategoryModel;
+use app\common\model\plus\release\DemandUser as DemandUserModel;
+use app\common\model\plus\release\Setting as SettingModel;
+use app\common\model\user\PointsLog as PointsLogModel;
 
 /**
  * 模型
@@ -31,7 +35,209 @@
         return $list;
     }
 
-     /**
+    /**
+     * 获取默认数据(分类、设置)
+     */
+    public function getDefaultData()
+    {
+        $setting = SettingModel::getAll();
+        $settlement = $setting['settlement']['values'] ?? [];
+        return [
+            'category_list' => ReleaseCategoryModel::getALL(),
+            'demand_price' => $settlement['demand_price'] ?? 0,
+        ];
+    }
+
+    /**
+     * 后台发布需求
+     * @param array $data 表单数据
+     * @param int $user_id 发布用户ID
+     * @param int $pay_points 是否支付连盟币(0不支付,1支付)
+     * @return bool
+     */
+    public function addByAdmin($data, $user_id, $pay_points = 0)
+    {
+        // 验证必填项
+        if (empty($data['name'])) {
+            $this->error = '请输入标题';
+            return false;
+        }
+        if (empty($data['category_id'])) {
+            $this->error = '请选择分类';
+            return false;
+        }
+        if (empty($data['price'])) {
+            $this->error = '请输入您的预算';
+            return false;
+        }
+        if (empty($data['content'])) {
+            $this->error = '请输入详细要求';
+            return false;
+        }
+
+        // 验证需求方用户是否存在
+        $demand_user = DemandUserModel::detail($user_id);
+        if (!$demand_user || $demand_user['is_delete'] == 1) {
+            $this->error = '需求方用户不存在';
+            return false;
+        }
+
+        // 如果需要支付连盟币,从设置中获取金额并检查余额
+        $pay_price = 0;
+        if ($pay_points > 0) {
+            $setting = SettingModel::getAll();
+            $settlement = $setting['settlement']['values'] ?? [];
+            $pay_price = $settlement['demand_price'] ?? 0;
+
+            $main_user = \app\common\model\user\User::detail($user_id);
+            if ($main_user['points'] < $pay_price) {
+                $this->error = '用户连盟币不足';
+                return false;
+            }
+        }
+
+        $save_data = [
+            'user_id' => $user_id,
+            'name' => $data['name'],
+            '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' => 0, // 需求类型
+            'show_phone' => $data['show_phone'] ?? 1,
+            'is_show' => $data['is_show'] ?? 1,
+            'status' => 1, // 后台发布自动通过审核
+            'app_id' => self::$app_id,
+        ];
+
+        if (!empty($data['finish_time']) && $data['finish_time'] != '请选择日期') {
+            $save_data['finish_time'] = strtotime($data['finish_time']);
+        } else {
+            $save_data['finish_time'] = 0;
+        }
+
+        return $this->transaction(function () use ($data, $save_data, $pay_points, $user_id) {
+            // 记录内容
+            $this->save($save_data);
+            // 记录图片
+            $this->saveAllImages($this['project_id'], $data);
+
+            // 如果需要支付连盟币
+            if ($pay_points > 0) {
+                // 从设置中获取支付金额
+                $setting = SettingModel::getAll();
+                $settlement = $setting['settlement']['values'] ?? [];
+                $pay_price = $settlement['demand_price'] ?? 0;
+
+                // 减少主用户表的连盟币
+                \app\common\model\user\User::where('user_id', '=', $user_id)->dec('points', $pay_price)->update();
+                PointsLogModel::add([
+                    'user_id' => $user_id,
+                    'value' => -$pay_price,
+                    'describe' => "后台发布需求消耗连盟币",
+                    'app_id' => self::$app_id,
+                ]);
+            }
+
+            return $this['project_id'];
+        });
+    }
+
+    /**
+     * 后台编辑需求
+     * @param int $project_id 项目ID
+     * @param array $data 表单数据
+     * @return bool
+     */
+    public function editByAdmin($project_id, $data)
+    {
+        // 验证必填项
+        if (empty($data['name'])) {
+            $this->error = '请输入标题';
+            return false;
+        }
+        if (empty($data['category_id'])) {
+            $this->error = '请选择分类';
+            return false;
+        }
+        if (empty($data['price'])) {
+            $this->error = '请输入您的预算';
+            return false;
+        }
+        if (empty($data['content'])) {
+            $this->error = '请输入详细要求';
+            return false;
+        }
+
+        $model = self::detail($project_id);
+        if (!$model) {
+            $this->error = '项目不存在';
+            return false;
+        }
+        $save_data = [
+            'name' => $data['name'],
+            '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'] ?? 1,
+            'is_show' => $data['is_show'] ?? 1,
+        ];
+
+        if (!empty($data['finish_time']) && $data['finish_time'] != '请选择日期') {
+            $save_data['finish_time'] = strtotime($data['finish_time']);
+        } else {
+            $save_data['finish_time'] = 0;
+        }
+
+        return $model->transaction(function () use ($model, $project_id, $data, $save_data) {
+            // 更新内容
+            $model->save($save_data);
+            // 更新图片
+            $model->saveAllImages($project_id, $data);
+
+            return true;
+        });
+    }
+
+    /**
+     * 记录图片
+     */
+    private function saveAllImages($id, $formData)
+    {
+        (new ReleaseProjectImageModel())->where("project_id", "=", $id)->delete();
+        // 生成图片数据
+        if (!empty($formData['image_list']) && is_array($formData['image_list'])) {
+            $imageData = [];
+            foreach ($formData['image_list'] as $imageItem) {
+                // 处理图片ID:可能是对象数组或纯ID
+                $image_id = 0;
+                if (is_array($imageItem)) {
+                    $image_id = !empty($imageItem['image_id']) ? $imageItem['image_id'] : ($imageItem['file_id'] ?? 0);
+                } elseif (is_numeric($imageItem)) {
+                    $image_id = $imageItem;
+                }
+                if ($image_id > 0) {
+                    $imageData[] = [
+                        'project_id' => $id,
+                        'image_id' => $image_id,
+                        'app_id' => self::$app_id
+                    ];
+                }
+            }
+            if (!empty($imageData)) {
+                $model = new ReleaseProjectImageModel;
+                return $model->saveAll($imageData);
+            }
+        }
+        return true;
+    }
+
+    /**
      * 审核
      */
     public function submit($param)
diff --git a/admin/app/shop/model/plus/release/DemandUser.php b/admin/app/shop/model/plus/release/DemandUser.php
index f0f0cba..c6b94c5 100644
--- a/admin/app/shop/model/plus/release/DemandUser.php
+++ b/admin/app/shop/model/plus/release/DemandUser.php
@@ -19,8 +19,8 @@
     public function getList($data)
     {
         // 构建查询规则
-        $model = $this->alias('du')->with('grade')
-            ->field('du.*, user.nickName, user.avatarUrl')
+        $model = $this->alias('du')->with(['grade'])
+            ->field('du.*, user.nickName, user.avatarUrl, user.points')
             ->join('user', 'user.user_id = du.user_id')
             ->where('du.is_delete', '=', 0)
             ->order(['du.create_time' => 'desc']);
diff --git a/admin/app/shop/model/plus/release/SupplyProject.php b/admin/app/shop/model/plus/release/SupplyProject.php
index 2bab6d1..3f5c7f5 100644
--- a/admin/app/shop/model/plus/release/SupplyProject.php
+++ b/admin/app/shop/model/plus/release/SupplyProject.php
@@ -5,6 +5,11 @@
 use app\common\model\plus\release\Project as ProjectModel;
 use app\common\model\plus\release\ReleaseProjectImage as ReleaseProjectImageModel;
 use app\common\model\plus\release\ReleaseProjectTag as ReleaseProjectTagModel;
+use app\common\model\plus\release\ReleaseCategory as ReleaseCategoryModel;
+use app\common\model\plus\release\Tag as TagModel;
+use app\common\model\plus\release\SupplyUser as SupplyUserModel;
+use app\common\model\plus\release\Setting as SettingModel;
+use app\common\model\user\PointsLog as PointsLogModel;
 
 /**
  * 模型
@@ -36,6 +41,235 @@
     }
 
     /**
+     * 获取默认数据(分类、标签、设置)
+     */
+    public function getDefaultData()
+    {
+        $setting = SettingModel::getAll();
+        $settlement = $setting['settlement']['values'] ?? [];
+        return [
+            'category_list' => ReleaseCategoryModel::getALL(),
+            'tag_list' => TagModel::getALL(),
+            'supply_price' => $settlement['supply_price'] ?? 0,
+        ];
+    }
+
+    /**
+     * 后台发布供应
+     * @param array $data 表单数据
+     * @param int $user_id 发布用户ID
+     * @param int $pay_points 是否支付连盟币(0不支付,1支付)
+     * @return bool
+     */
+    public function addByAdmin($data, $user_id, $pay_points = 0)
+    {
+        // 验证必填项
+        if (empty($data['name'])) {
+            $this->error = '请输入标题';
+            return false;
+        }
+        if (empty($data['category_id'])) {
+            $this->error = '请选择分类';
+            return false;
+        }
+        if (empty($data['price'])) {
+            $this->error = '请输入您的价格';
+            return false;
+        }
+        if (empty($data['content'])) {
+            $this->error = '请输入详细描述';
+            return false;
+        }
+
+        // 验证供应方用户是否存在
+        $supply_user = SupplyUserModel::detail($user_id);
+        if (!$supply_user || $supply_user['is_delete'] == 1) {
+            $this->error = '供应方用户不存在';
+            return false;
+        }
+
+        // 如果需要支付连盟币,从设置中获取金额并检查余额
+        $pay_price = 0;
+        if ($pay_points > 0) {
+            $setting = SettingModel::getAll();
+            $settlement = $setting['settlement']['values'] ?? [];
+            $pay_price = $settlement['supply_price'] ?? 0;
+
+            $main_user = \app\common\model\user\User::detail($user_id);
+            if ($main_user['points'] < $pay_price) {
+                $this->error = '用户连盟币不足';
+                return false;
+            }
+        }
+
+        $save_data = [
+            'user_id' => $user_id,
+            'name' => $data['name'],
+            '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'] ?? 1,
+            'status' => 1, // 后台发布自动通过审核
+            'app_id' => self::$app_id,
+        ];
+
+        if (!empty($data['finish_time']) && $data['finish_time'] != '请选择日期') {
+            $save_data['finish_time'] = strtotime($data['finish_time']);
+        } else {
+            $save_data['finish_time'] = 0;
+        }
+
+        return $this->transaction(function () use ($data, $save_data, $pay_points, $user_id) {
+            // 记录内容
+            $this->save($save_data);
+            // 记录图片
+            $this->saveAllImages($this['project_id'], $data);
+            // 记录标签
+            $this->saveTag($this['project_id'], $data);
+
+            // 如果需要支付连盟币
+            if ($pay_points > 0) {
+                // 从设置中获取支付金额
+                $setting = SettingModel::getAll();
+                $settlement = $setting['settlement']['values'] ?? [];
+                $pay_price = $settlement['supply_price'] ?? 0;
+
+                // 减少主用户表的连盟币
+                \app\common\model\user\User::where('user_id', '=', $user_id)->dec('points', $pay_price)->update();
+                PointsLogModel::add([
+                    'user_id' => $user_id,
+                    'value' => -$pay_price,
+                    'describe' => "后台发布供应消耗连盟币",
+                    'app_id' => self::$app_id,
+                ]);
+            }
+
+            return $this['project_id'];
+        });
+    }
+
+    /**
+     * 后台编辑供应
+     * @param int $project_id 项目ID
+     * @param array $data 表单数据
+     * @return bool
+     */
+    public function editByAdmin($project_id, $data)
+    {
+        // 验证必填项
+        if (empty($data['name'])) {
+            $this->error = '请输入标题';
+            return false;
+        }
+        if (empty($data['category_id'])) {
+            $this->error = '请选择分类';
+            return false;
+        }
+        if (empty($data['price'])) {
+            $this->error = '请输入您的价格';
+            return false;
+        }
+        if (empty($data['content'])) {
+            $this->error = '请输入详细描述';
+            return false;
+        }
+
+        $model = self::detail($project_id);
+        if (!$model) {
+            $this->error = '项目不存在';
+            return false;
+        }
+
+        $save_data = [
+            'name' => $data['name'],
+            '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'] ?? 1,
+        ];
+
+        if (!empty($data['finish_time']) && $data['finish_time'] != '请选择日期') {
+            $save_data['finish_time'] = strtotime($data['finish_time']);
+        } else {
+            $save_data['finish_time'] = 0;
+        }
+
+        return $model->transaction(function () use ($model, $project_id, $data, $save_data) {
+            // 更新内容
+            $model->save($save_data);
+            // 更新图片
+            $model->saveAllImages($project_id, $data);
+            // 更新标签
+            $model->saveTag($project_id, $data);
+
+            return true;
+        });
+    }
+
+    /**
+     * 记录图片
+     */
+    private function saveAllImages($id, $formData)
+    {
+        (new ReleaseProjectImageModel())->where("project_id", "=", $id)->delete();
+        // 生成图片数据
+        if (!empty($formData['image_list']) && is_array($formData['image_list'])) {
+            $imageData = [];
+            foreach ($formData['image_list'] as $imageItem) {
+                // 处理图片ID:可能是对象数组或纯ID
+                $image_id = 0;
+                if (is_array($imageItem)) {
+                    $image_id = !empty($imageItem['image_id']) ? $imageItem['image_id'] : ($imageItem['file_id'] ?? 0);
+                } elseif (is_numeric($imageItem)) {
+                    $image_id = $imageItem;
+                }
+                if ($image_id > 0) {
+                    $imageData[] = [
+                        'project_id' => $id,
+                        'image_id' => $image_id,
+                        'app_id' => self::$app_id
+                    ];
+                }
+            }
+            if (!empty($imageData)) {
+                $model = new ReleaseProjectImageModel;
+                return $model->saveAll($imageData);
+            }
+        }
+        return true;
+    }
+
+    /**
+     * 记录标签
+     */
+    private function saveTag($id, $formData)
+    {
+        (new ReleaseProjectTagModel())->where("project_id", "=", $id)->delete();
+
+        // 生成数据
+        if (!empty($formData['tag_list'])) {
+            $tagData = [];
+            foreach ($formData['tag_list'] as $val) {
+                $tagData[] = [
+                    'project_id' => $id,
+                    'tag_id' => $val,
+                    'app_id' => self::$app_id
+                ];
+            }
+            $model = new ReleaseProjectTagModel;
+            return !empty($tagData) && $model->saveAll($tagData);
+        }
+        return true;
+    }
+
+    /**
      * 审核
      */
     public function submit($param)
diff --git a/admin/app/shop/model/plus/release/SupplyUser.php b/admin/app/shop/model/plus/release/SupplyUser.php
index 43136a2..a296c0f 100644
--- a/admin/app/shop/model/plus/release/SupplyUser.php
+++ b/admin/app/shop/model/plus/release/SupplyUser.php
@@ -20,7 +20,7 @@
     {
         // 构建查询规则
         $model = $this->alias('su')->with('grade')
-            ->field('su.*, user.nickName, user.avatarUrl')
+            ->field('su.*, user.nickName, user.avatarUrl, user.points')
             ->join('user', 'user.user_id = su.user_id')
             ->where('su.is_delete', '=', 0)
             ->order(['su.create_time' => 'desc']);
diff --git a/mobile/pages3/release/chat/chat.vue b/mobile/pages3/release/chat/chat.vue
index 23f5f6c..d7e9dca 100644
--- a/mobile/pages3/release/chat/chat.vue
+++ b/mobile/pages3/release/chat/chat.vue
@@ -5,7 +5,7 @@
 
 			<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"
+					<image class="avatar" :src="item.user_id == user_id?myavatarUrl:(item.user&&item.user.avatarUrl?item.user.avatarUrl:otherAvatarUrl)"
 					 mode=""></image>
 					<view>
 						<view class="my_date">{{item.create_time}}</view>
@@ -38,8 +38,8 @@
 			return {
 				user_id: '', //我的user_id
 				you_user_id: '', //对方的suser_id
-				myavatarUrl: '',
-				avatarUrl: '',
+				myavatarUrl: '', //我的头像
+				otherAvatarUrl: '', //对方的头像
 				phoneHeight: 0,
 				/*可滚动视图区域高度*/
 				scrollviewHigh: 0,
@@ -76,7 +76,7 @@
 			let self = this;
 			self.you_user_id = option.you_user_id;
 			self.nickName = option.nickname;
-			self.avatarUrl = option.avatarurl;
+			self.otherAvatarUrl = option.avatarurl; // 对方的头像
 			uni.setNavigationBarTitle({
 				title: self.nickName
 			})
diff --git a/shop_vue/src/api/plus/release.js b/shop_vue/src/api/plus/release.js
index 7809d89..544c7de 100644
--- a/shop_vue/src/api/plus/release.js
+++ b/shop_vue/src/api/plus/release.js
@@ -90,6 +90,18 @@
     demandEdit(data, errorback) {
         return request._post('/shop/plus.release.DemandProject/edit', data, errorback);
     },
+    /*需求发布默认数据*/
+    demandProjectDefaultData(data, errorback) {
+        return request._post('/shop/plus.release.DemandProject/defaultData', data, errorback);
+    },
+    /*后台发布需求*/
+    demandProjectAdd(data, errorback) {
+        return request._post('/shop/plus.release.DemandProject/add', data, errorback);
+    },
+    /*后台编辑需求*/
+    demandProjectEdit(data, errorback) {
+        return request._post('/shop/plus.release.DemandProject/edit', data, errorback);
+    },
     /*供应发布列表*/
     supplyProject(data, errorback) {
         return request._post('/shop/plus.release.supplyProject/index', data, errorback);
@@ -106,6 +118,18 @@
     supplyEdit(data, errorback) {
         return request._post('/shop/plus.release.supplyProject/edit', data, errorback);
     },
+    /*供应发布默认数据*/
+    supplyProjectDefaultData(data, errorback) {
+        return request._post('/shop/plus.release.supplyProject/defaultData', data, errorback);
+    },
+    /*后台发布供应*/
+    supplyProjectAdd(data, errorback) {
+        return request._post('/shop/plus.release.supplyProject/add', data, errorback);
+    },
+    /*后台编辑供应*/
+    supplyProjectEdit(data, errorback) {
+        return request._post('/shop/plus.release.supplyProject/edit', data, errorback);
+    },
     /*订单列表*/
     releaseOrder(data, errorback) {
         return request._post('/shop/plus.release.order/index', data, errorback);
diff --git a/shop_vue/src/components/release/GetDemandUser.vue b/shop_vue/src/components/release/GetDemandUser.vue
new file mode 100644
index 0000000..f81fb11
--- /dev/null
+++ b/shop_vue/src/components/release/GetDemandUser.vue
@@ -0,0 +1,158 @@
+<template>
+  <el-dialog title="选择需求方用户" :visible.sync="dialogVisible" @close="cancelFunc" :close-on-click-modal="false" :close-on-press-escape="false" width="800px" append-to-body>
+    <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.grade_id" placeholder="请选择等级" style="width: 120px;">
+            <el-option label="全部" value="0"></el-option>
+            <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-item label="用户"><el-input placeholder="请输入昵称|姓名|手机号" v-model="formInline.nick_name"></el-input></el-form-item>
+        <el-form-item>
+          <el-button icon="el-icon-search" @click="search">查询</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="" label="头像" width="70">
+            <template slot-scope="scope">
+              <img :src="scope.row.avatarUrl" class="radius" width="30" height="30" />
+            </template>
+          </el-table-column>
+          <el-table-column prop="nickName" label="昵称"></el-table-column>
+          <el-table-column prop="real_name" label="姓名"></el-table-column>
+          <el-table-column prop="mobile" label="手机号"></el-table-column>
+          <el-table-column prop="grade.name" label="等级"></el-table-column>
+          <el-table-column label="操作" width="80">
+            <template slot-scope="scope">
+              <span class="green" v-if="selectedUser && selectedUser.user_id==scope.row.user_id" size="mini">已选择</span>
+              <el-button v-else type="text" size="mini" @click="selectUser(scope.row)">选择</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-sizes="[10, 20, 50, 100]"
+          :page-size="pageSize"
+          layout="total, prev, pager, next, jumper"
+          :total="totalDataNumber"
+        ></el-pagination>
+      </div>
+    </div>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="dialogVisible = false">取 消</el-button>
+      <el-button size="small" type="primary" @click="confirmFunc">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import PlusApi from '@/api/plus/release.js';
+export default {
+  data() {
+    return {
+      loading: true,
+      curPage: 1,
+      pageSize: 15,
+      totalDataNumber: 0,
+      formInline: {
+        grade_id: '',
+        nick_name: ''
+      },
+      gradeList: [],
+      tableData: [],
+      selectedUser: null,
+      dialogVisible: false
+    };
+  },
+  props: {
+    is_open: Boolean
+  },
+  watch: {
+    is_open: function(n, o) {
+      if (n != o) {
+        this.dialogVisible = n;
+        if (n) {
+          this.getTableList();
+        }
+      }
+    }
+  },
+  created() {},
+  methods: {
+    handleCurrentChange(val) {
+      this.curPage = val;
+      this.getTableList();
+    },
+
+    handleSizeChange(val) {
+      this.curPage = 1;
+      this.pageSize = val;
+      this.getTableList();
+    },
+
+    getTableList() {
+      let self = this;
+      self.loading = true;
+      let params = self.formInline;
+      params.page = self.curPage;
+      params.list_rows = self.pageSize;
+      PlusApi.demandUserList(params, true).then(data => {
+          self.loading = false;
+          self.tableData = data.data.list.data;
+          self.totalDataNumber = data.data.list.total;
+        })
+        .catch(error => {
+          self.loading = false;
+        });
+    },
+
+    search() {
+      this.curPage = 1;
+      this.getTableList();
+    },
+
+    confirmFunc() {
+      if (!this.selectedUser) {
+        this.$message.warning('请选择用户');
+        return;
+      }
+      this.emitFunc(this.selectedUser);
+    },
+
+    cancelFunc() {
+      this.emitFunc();
+    },
+
+    emitFunc(user) {
+      this.dialogVisible = false;
+      if (user) {
+        this.$emit('close', {
+          type: 'success',
+          params: user
+        });
+      } else {
+        this.$emit('close', {
+          type: 'error'
+        });
+      }
+    },
+
+    selectUser(user) {
+      this.selectedUser = user;
+      this.confirmFunc();
+    }
+  }
+};
+</script>
diff --git a/shop_vue/src/components/release/GetSupplyUser.vue b/shop_vue/src/components/release/GetSupplyUser.vue
new file mode 100644
index 0000000..3f57dc0
--- /dev/null
+++ b/shop_vue/src/components/release/GetSupplyUser.vue
@@ -0,0 +1,158 @@
+<template>
+  <el-dialog title="选择供应方用户" :visible.sync="dialogVisible" @close="cancelFunc" :close-on-click-modal="false" :close-on-press-escape="false" width="800px" append-to-body>
+    <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.grade_id" placeholder="请选择等级" style="width: 120px;">
+            <el-option label="全部" value="0"></el-option>
+            <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-item label="用户"><el-input placeholder="请输入昵称|姓名|手机号" v-model="formInline.nick_name"></el-input></el-form-item>
+        <el-form-item>
+          <el-button icon="el-icon-search" @click="search">查询</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="" label="头像" width="70">
+            <template slot-scope="scope">
+              <img :src="scope.row.avatarUrl" class="radius" width="30" height="30" />
+            </template>
+          </el-table-column>
+          <el-table-column prop="nickName" label="昵称"></el-table-column>
+          <el-table-column prop="real_name" label="姓名"></el-table-column>
+          <el-table-column prop="mobile" label="手机号"></el-table-column>
+          <el-table-column prop="grade.name" label="等级"></el-table-column>
+          <el-table-column label="操作" width="80">
+            <template slot-scope="scope">
+              <span class="green" v-if="selectedUser && selectedUser.user_id==scope.row.user_id" size="mini">已选择</span>
+              <el-button v-else type="text" size="mini" @click="selectUser(scope.row)">选择</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-sizes="[10, 20, 50, 100]"
+          :page-size="pageSize"
+          layout="total, prev, pager, next, jumper"
+          :total="totalDataNumber"
+        ></el-pagination>
+      </div>
+    </div>
+
+    <div slot="footer" class="dialog-footer">
+      <el-button size="small" @click="dialogVisible = false">取 消</el-button>
+      <el-button size="small" type="primary" @click="confirmFunc">确 定</el-button>
+    </div>
+  </el-dialog>
+</template>
+
+<script>
+import PlusApi from '@/api/plus/release.js';
+export default {
+  data() {
+    return {
+      loading: true,
+      curPage: 1,
+      pageSize: 15,
+      totalDataNumber: 0,
+      formInline: {
+        grade_id: '',
+        nick_name: ''
+      },
+      gradeList: [],
+      tableData: [],
+      selectedUser: null,
+      dialogVisible: false
+    };
+  },
+  props: {
+    is_open: Boolean
+  },
+  watch: {
+    is_open: function(n, o) {
+      if (n != o) {
+        this.dialogVisible = n;
+        if (n) {
+          this.getTableList();
+        }
+      }
+    }
+  },
+  created() {},
+  methods: {
+    handleCurrentChange(val) {
+      this.curPage = val;
+      this.getTableList();
+    },
+
+    handleSizeChange(val) {
+      this.curPage = 1;
+      this.pageSize = val;
+      this.getTableList();
+    },
+
+    getTableList() {
+      let self = this;
+      self.loading = true;
+      let params = self.formInline;
+      params.page = self.curPage;
+      params.list_rows = self.pageSize;
+      PlusApi.supplyUserList(params, true).then(data => {
+          self.loading = false;
+          self.tableData = data.data.list.data;
+          self.totalDataNumber = data.data.list.total;
+        })
+        .catch(error => {
+          self.loading = false;
+        });
+    },
+
+    search() {
+      this.curPage = 1;
+      this.getTableList();
+    },
+
+    confirmFunc() {
+      if (!this.selectedUser) {
+        this.$message.warning('请选择用户');
+        return;
+      }
+      this.emitFunc(this.selectedUser);
+    },
+
+    cancelFunc() {
+      this.emitFunc();
+    },
+
+    emitFunc(user) {
+      this.dialogVisible = false;
+      if (user) {
+        this.$emit('close', {
+          type: 'success',
+          params: user
+        });
+      } else {
+        this.$emit('close', {
+          type: 'error'
+        });
+      }
+    },
+
+    selectUser(user) {
+      this.selectedUser = user;
+      this.confirmFunc();
+    }
+  }
+};
+</script>
diff --git a/shop_vue/src/views/plus/release/demandproject/dialog/Add.vue b/shop_vue/src/views/plus/release/demandproject/dialog/Add.vue
new file mode 100644
index 0000000..9f020bd
--- /dev/null
+++ b/shop_vue/src/views/plus/release/demandproject/dialog/Add.vue
@@ -0,0 +1,356 @@
+<template>
+  <!--
+      作者:yj
+      后台发布需求
+    -->
+  <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false" width="800px">
+    <el-form size="small" :model="form" ref="form" :rules="rules" label-width="120px">
+      <el-form-item label="发布用户" prop="user_id">
+        <el-input v-model="selectedUserName" placeholder="请选择用户" disabled style="width: 200px;"></el-input>
+        <el-button type="primary" @click="openUserSelect">选择用户</el-button>
+        <span v-if="selectedUser" class="ml10 gray9">连盟币: {{ selectedUser.points }}</span>
+      </el-form-item>
+      
+      <el-form-item label="标题" prop="name">
+        <el-input v-model="form.name" placeholder="请输入标题" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="分类" prop="category_id">
+        <el-select v-model="form.category_id" placeholder="请选择分类" style="width: 200px;">
+          <el-option v-for="item in categoryList" :key="item.category_id" :label="item.name" :value="item.category_id"></el-option>
+        </el-select>
+      </el-form-item>
+      
+      <el-form-item label="预算(元)" prop="price">
+        <el-input v-model="form.price" placeholder="请输入预算" style="width: 200px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="详细要求" prop="content">
+        <el-input type="textarea" :rows="3" v-model="form.content" placeholder="请输入详细要求" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="图片">
+        <div class="upload-list d-s-c">
+          <div class="item" v-for="(imgs, img_num) in form.image_list" :key="img_num">
+            <img :src="imgs.file_path" style="width: 60px; height: 60px; margin-right: 10px;" />
+            <el-button type="text" size="mini" @click="deleteImg(img_num)">删除</el-button>
+          </div>
+          <div class="item img-select" @click="openUpload"><i class="el-icon-plus"></i></div>
+        </div>
+      </el-form-item>
+      
+      <el-form-item label="期望完成时间">
+        <el-date-picker v-model="form.finish_time" type="date" placeholder="选择日期" value-format="yyyy-MM-dd" style="width: 200px;"></el-date-picker>
+      </el-form-item>
+      
+      <el-form-item label="期望地点">
+        <el-input v-model="form.detail" placeholder="请输入期望地点" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="产品介绍">
+        <el-input type="textarea" :rows="3" v-model="form.product_content" placeholder="请输入产品介绍" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="产品应用案例">
+        <el-input type="textarea" :rows="3" v-model="form.product_case" placeholder="请输入产品应用案例" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="公开联系方式">
+        <el-radio-group v-model="form.show_phone">
+          <el-radio :label="1">是</el-radio>
+          <el-radio :label="0">否</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      
+      <el-form-item label="是否展示">
+        <el-radio-group v-model="form.is_show">
+          <el-radio :label="1">是</el-radio>
+          <el-radio :label="0">否</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      
+      <el-form-item label="支付连盟币" v-if="!isEdit">
+        <el-radio-group v-model="payPoints">
+          <el-radio :label="0">不支付</el-radio>
+          <el-radio :label="1">支付 ({{ demandPrice }} 连盟币)</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="dialogFormVisible">取 消</el-button>
+      <el-button type="primary" @click="submitForm" :loading="loading">确 定</el-button>
+    </div>
+    
+    <!-- 需求方用户选择器 -->
+    <GetDemandUser :is_open="showUserSelector" @close="handleUserSelect"></GetDemandUser>
+    <!-- 图片上传组件 -->
+    <Upload v-if="isUpload" :config="uploadConfig" :isupload="isUpload" @returnImgs="returnImgsFunc">上传图片</Upload>
+  </el-dialog>
+</template>
+
+<script>
+import PlusApi from '@/api/plus/release.js';
+import GetDemandUser from '@/components/release/GetDemandUser.vue';
+import Upload from '@/components/file/Upload';
+import { deepClone } from '@/utils/base.js';
+
+export default {
+  components: {
+    GetDemandUser,
+    Upload
+  },
+  data() {
+    return {
+      /*是否显示*/
+      dialogVisible: false,
+      loading: false,
+      formLabelWidth: '120px',
+      /*是否编辑模式*/
+      isEdit: false,
+      /*编辑的项目ID*/
+      editProjectId: null,
+      /*表单数据*/
+      form: {
+        user_id: '',
+        name: '',
+        category_id: '',
+        price: '',
+        content: '',
+        image_list: [],
+        finish_time: '',
+        detail: '',
+        product_content: '',
+        product_case: '',
+        show_phone: 1,
+        is_show: 1
+      },
+      /*验证规则*/
+      rules: {
+        user_id: [{ required: true, message: '请选择发布用户', trigger: 'change' }],
+        name: [{ required: true, message: '请输入标题', trigger: 'blur' }],
+        category_id: [{ required: true, message: '请选择分类', trigger: 'change' }],
+        price: [{ required: true, message: '请输入预算', trigger: 'blur' }],
+        content: [{ required: true, message: '请输入详细要求', trigger: 'blur' }]
+      },
+      /*分类列表*/
+      categoryList: [],
+      /*选中的用户*/
+      selectedUser: null,
+      selectedUserName: '',
+      /*是否显示用户选择器*/
+      showUserSelector: false,
+      /*是否支付连盟币*/
+      payPoints: 0,
+      /*支付连盟币金额(从设置获取)*/
+      demandPrice: 0,
+      /*是否显示上传组件*/
+      isUpload: false,
+      /*上传配置*/
+      uploadConfig: {
+        total: 9,
+        file_type: 'image'
+      }
+    };
+  },
+  props: ['open_add', 'edit_data'],
+  created() {
+    this.dialogVisible = this.open_add;
+    this.getDefaultData();
+    // 判断是否为编辑模式
+    if (this.edit_data && this.edit_data.project_id) {
+      this.isEdit = true;
+      this.editProjectId = this.edit_data.project_id;
+      this.initEditData();
+    }
+  },
+  methods: {
+    /*获取默认数据*/
+    getDefaultData() {
+      let self = this;
+      PlusApi.demandProjectDefaultData({}, true).then(data => {
+        self.categoryList = data.data.data.category_list || [];
+        self.demandPrice = data.data.data.demand_price || 0;
+      }).catch(error => {});
+    },
+
+    /*初始化编辑数据*/
+    initEditData() {
+      const data = this.edit_data;
+      this.selectedUser = {
+        user_id: data.user_id,
+        nickName: data.nickName || (data.user && data.user.nickName),
+        balance: data.balance || (data.user && data.user.balance),
+        points: data.points || (data.user && data.user.points)
+      };
+      this.selectedUserName = this.selectedUser.nickName || ('用户ID:' + data.user_id);
+      this.form.user_id = data.user_id;
+      this.form.name = data.name;
+      this.form.category_id = data.category_id;
+      this.form.price = data.price;
+      this.form.content = data.content;
+      this.form.image_list = data.image_list || [];
+      this.form.finish_time = data.finish_time || '';
+      this.form.detail = data.detail || '';
+      this.form.product_content = data.product_content || '';
+      this.form.product_case = data.product_case || '';
+      this.form.show_phone = data.show_phone;
+      this.form.is_show = data.is_show;
+    },
+    
+    /*打开用户选择器*/
+    openUserSelect() {
+      this.showUserSelector = true;
+    },
+
+    /*打开上传组件*/
+    openUpload() {
+      this.isUpload = true;
+    },
+
+    /*处理用户选择*/
+    handleUserSelect(result) {
+      this.showUserSelector = false;
+      if (result && result.type === 'success' && result.params) {
+        const user = result.params;
+        this.selectedUser = user;
+        this.selectedUserName = user.nickName || user.real_name || ('用户ID:' + user.user_id);
+        this.form.user_id = user.user_id;
+      }
+    },
+
+    /*处理上传图片返回*/
+    returnImgsFunc(e) {
+      if (e != null) {
+        this.form.image_list = this.form.image_list.concat(e);
+      }
+      this.isUpload = false;
+    },
+    
+    /*删除图片*/
+    deleteImg(index) {
+      this.form.image_list.splice(index, 1);
+    },
+    
+    /*提交表单*/
+    submitForm() {
+      let self = this;
+      self.$refs.form.validate(valid => {
+        if (valid) {
+          if (!self.selectedUser || !self.selectedUser.user_id) {
+            self.$message.error('请选择发布用户');
+            return;
+          }
+
+          self.loading = true;
+          let params = {
+            user_id: self.selectedUser.user_id,
+            formData: JSON.stringify(self.form)
+          };
+
+          if (self.isEdit) {
+            // 编辑模式
+            params.project_id = self.editProjectId;
+            PlusApi.demandProjectEdit(params, true).then(data => {
+              self.loading = false;
+              self.$message.success('编辑成功');
+              self.$emit('closeDialog', {
+                type: 'success',
+                openDialog: false
+              });
+            }).catch(error => {
+              self.loading = false;
+            });
+          } else {
+            // 新增模式
+            params.pay_points = self.payPoints;
+            PlusApi.demandProjectAdd(params, true).then(data => {
+              self.loading = false;
+              self.$message.success('发布成功');
+              self.$emit('closeDialog', {
+                type: 'success',
+                openDialog: false
+              });
+            }).catch(error => {
+              self.loading = false;
+            });
+          }
+        }
+      });
+    },
+    
+    /*关闭弹窗*/
+    dialogFormVisible() {
+      this.$emit('closeDialog', {
+        type: 'error',
+        openDialog: false
+      });
+    }
+  },
+  computed: {
+    dialogTitle() {
+      return this.isEdit ? '编辑需求' : '发布需求';
+    }
+  }
+};
+</script>
+
+<style>
+.ml10 { margin-left: 10px; }
+.gray9 { color: #999; }
+
+.upload-list {
+  border: 1px solid #e5e5e5;
+  border-radius: 2px;
+  padding: 10px;
+  min-height: 80px;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+
+.upload-list .item {
+  width: 60px;
+  height: 60px;
+  border: 1px solid #e5e5e5;
+  border-radius: 2px;
+  overflow: hidden;
+  position: relative;
+}
+
+.upload-list .item img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+
+.upload-list .item .el-button {
+  position: absolute;
+  top: 2px;
+  right: 2px;
+  padding: 2px 6px;
+  background: rgba(0, 0, 0, 0.6);
+  border: none;
+  color: #fff;
+  border-radius: 2px;
+}
+
+.upload-list .img-select {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: 1px dashed #d9d9d9;
+  background: #fafafa;
+  cursor: pointer;
+}
+
+.upload-list .img-select i {
+  font-size: 24px;
+  color: #c0c4cc;
+}
+
+.upload-list .img-select:hover {
+  border-color: #c0c4cc;
+  background: #ecf5ff;
+}
+</style>
diff --git a/shop_vue/src/views/plus/release/demandproject/index.vue b/shop_vue/src/views/plus/release/demandproject/index.vue
index e2b6559..4824758 100644
--- a/shop_vue/src/views/plus/release/demandproject/index.vue
+++ b/shop_vue/src/views/plus/release/demandproject/index.vue
@@ -18,6 +18,7 @@
         </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="success" icon="el-icon-plus" @click="addClick">发布需求</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -45,7 +46,8 @@
           <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="editProjectClick(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>
@@ -65,6 +67,9 @@
     <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>
+
+    <!--发布需求/编辑需求-->
+    <Add v-if="open_add" :open_add="open_add" :edit_data="editData" @closeDialog="closeDialogFunc($event, 'add')"></Add>
   </div>
 </template>
 
@@ -72,12 +77,14 @@
   import PlusApi from '@/api/plus/release.js';
   import Edit from './Edit.vue';
   import Editsh from './dialog/Edit.vue';
+  import Add from './dialog/Add.vue';
   import {deepClone} from '@/utils/base.js';
   export default {
     components: {
       /*编辑组件*/
       Edit,
       Editsh,
+      Add,
     },
     data() {
       return {
@@ -102,6 +109,9 @@
         /*当前编辑的对象*/
         userModel: {},
         open_sh:false,
+        open_add: false,
+        /*编辑数据*/
+        editData: null,
       };
     },
     created() {
@@ -164,6 +174,18 @@
         this.open_edit = true;
       },
 
+      /*打开发布弹窗*/
+      addClick() {
+        this.editData = null;
+        this.open_add = true;
+      },
+
+      /*打开编辑弹窗*/
+      editProjectClick(item) {
+        this.editData = deepClone(item);
+        this.open_add = true;
+      },
+
       /*打开弹出层审核*/
       shClick(item) {
         this.userModel = item;
diff --git a/shop_vue/src/views/plus/release/supplyproject/dialog/Add.vue b/shop_vue/src/views/plus/release/supplyproject/dialog/Add.vue
new file mode 100644
index 0000000..6396573
--- /dev/null
+++ b/shop_vue/src/views/plus/release/supplyproject/dialog/Add.vue
@@ -0,0 +1,358 @@
+<template>
+  <!--
+      作者:yj
+      后台发布供应
+    -->
+  <el-dialog :title="dialogTitle" :visible.sync="dialogVisible" @close="dialogFormVisible" :close-on-click-modal="false" :close-on-press-escape="false" width="800px">
+    <el-form size="small" :model="form" ref="form" :rules="rules" label-width="120px">
+      <el-form-item label="发布用户" prop="user_id">
+        <el-input v-model="selectedUserName" placeholder="请选择用户" disabled style="width: 200px;"></el-input>
+        <el-button type="primary" @click="openUserSelect">选择用户</el-button>
+        <span v-if="selectedUser" class="ml10 gray9">连盟币: {{ selectedUser.points }}</span>
+      </el-form-item>
+      
+      <el-form-item label="标题" prop="name">
+        <el-input v-model="form.name" placeholder="请输入标题" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="分类" prop="category_id">
+        <el-select v-model="form.category_id" placeholder="请选择分类" style="width: 200px;">
+          <el-option v-for="item in categoryList" :key="item.category_id" :label="item.name" :value="item.category_id"></el-option>
+        </el-select>
+      </el-form-item>
+      
+      <el-form-item label="价格(元)" prop="price">
+        <el-input v-model="form.price" placeholder="请输入价格" style="width: 200px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="详细描述" prop="content">
+        <el-input type="textarea" :rows="3" v-model="form.content" placeholder="请输入详细描述" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="图片">
+        <div class="upload-list d-s-c">
+          <div class="item" v-for="(imgs, img_num) in form.image_list" :key="img_num">
+            <img :src="imgs.file_path" style="width: 60px; height: 60px; margin-right: 10px;" />
+            <el-button type="text" size="mini" @click="deleteImg(img_num)">删除</el-button>
+          </div>
+          <div class="item img-select" @click="openUpload"><i class="el-icon-plus"></i></div>
+        </div>
+      </el-form-item>
+      
+      <el-form-item label="标签">
+        <el-checkbox-group v-model="form.tag_list">
+          <el-checkbox v-for="item in tagList" :key="item.tag_id" :label="item.tag_id">{{ item.name }}</el-checkbox>
+        </el-checkbox-group>
+      </el-form-item>
+      
+      <el-form-item label="交付时间">
+        <el-date-picker v-model="form.finish_time" type="date" placeholder="选择日期" value-format="yyyy-MM-dd" style="width: 200px;"></el-date-picker>
+      </el-form-item>
+      
+      <el-form-item label="服务地区">
+        <el-input v-model="form.detail" placeholder="请输入服务地区" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="产品介绍">
+        <el-input type="textarea" :rows="3" v-model="form.product_content" placeholder="请输入产品介绍" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="产品应用案例">
+        <el-input type="textarea" :rows="3" v-model="form.product_case" placeholder="请输入产品应用案例" style="width: 400px;"></el-input>
+      </el-form-item>
+      
+      <el-form-item label="是否展示">
+        <el-radio-group v-model="form.is_show">
+          <el-radio :label="1">是</el-radio>
+          <el-radio :label="0">否</el-radio>
+        </el-radio-group>
+      </el-form-item>
+      
+      <el-form-item label="支付连盟币" v-if="!isEdit">
+        <el-radio-group v-model="payPoints">
+          <el-radio :label="0">不支付</el-radio>
+          <el-radio :label="1">支付 ({{ supplyPrice }} 连盟币)</el-radio>
+        </el-radio-group>
+      </el-form-item>
+    </el-form>
+    
+    <div slot="footer" class="dialog-footer">
+      <el-button @click="dialogFormVisible">取 消</el-button>
+      <el-button type="primary" @click="submitForm" :loading="loading">确 定</el-button>
+    </div>
+    
+    <!-- 供应方用户选择器 -->
+    <GetSupplyUser :is_open="showUserSelector" @close="handleUserSelect"></GetSupplyUser>
+    <!-- 图片上传组件 -->
+    <Upload v-if="isUpload" :config="uploadConfig" :isupload="isUpload" @returnImgs="returnImgsFunc">上传图片</Upload>
+  </el-dialog>
+</template>
+
+<script>
+import PlusApi from '@/api/plus/release.js';
+import GetSupplyUser from '@/components/release/GetSupplyUser.vue';
+import Upload from '@/components/file/Upload';
+import { deepClone } from '@/utils/base.js';
+
+export default {
+  components: {
+    GetSupplyUser,
+    Upload
+  },
+  data() {
+    return {
+      /*是否显示*/
+      dialogVisible: false,
+      loading: false,
+      formLabelWidth: '120px',
+      /*是否编辑模式*/
+      isEdit: false,
+      /*编辑的项目ID*/
+      editProjectId: null,
+      /*表单数据*/
+      form: {
+        user_id: '',
+        name: '',
+        category_id: '',
+        price: '',
+        content: '',
+        image_list: [],
+        tag_list: [],
+        finish_time: '',
+        detail: '',
+        product_content: '',
+        product_case: '',
+        is_show: 1
+      },
+      /*验证规则*/
+      rules: {
+        user_id: [{ required: true, message: '请选择发布用户', trigger: 'change' }],
+        name: [{ required: true, message: '请输入标题', trigger: 'blur' }],
+        category_id: [{ required: true, message: '请选择分类', trigger: 'change' }],
+        price: [{ required: true, message: '请输入价格', trigger: 'blur' }],
+        content: [{ required: true, message: '请输入详细描述', trigger: 'blur' }]
+      },
+      /*分类列表*/
+      categoryList: [],
+      /*标签列表*/
+      tagList: [],
+      /*选中的用户*/
+      selectedUser: null,
+      selectedUserName: '',
+      /*是否显示用户选择器*/
+      showUserSelector: false,
+      /*是否支付连盟币*/
+      payPoints: 0,
+      /*支付连盟币金额(从设置获取)*/
+      supplyPrice: 0,
+      /*是否显示上传组件*/
+      isUpload: false,
+      /*上传配置*/
+      uploadConfig: {
+        total: 9,
+        file_type: 'image'
+      }
+    };
+  },
+  props: ['open_add', 'edit_data'],
+  created() {
+    this.dialogVisible = this.open_add;
+    this.getDefaultData();
+    // 判断是否为编辑模式
+    if (this.edit_data && this.edit_data.project_id) {
+      this.isEdit = true;
+      this.editProjectId = this.edit_data.project_id;
+      this.initEditData();
+    }
+  },
+  methods: {
+    /*获取默认数据*/
+    getDefaultData() {
+      let self = this;
+      PlusApi.supplyProjectDefaultData({}, true).then(data => {
+        self.categoryList = data.data.data.category_list || [];
+        self.tagList = data.data.data.tag_list || [];
+        self.supplyPrice = data.data.data.supply_price || 0;
+      }).catch(error => {});
+    },
+
+    /*初始化编辑数据*/
+    initEditData() {
+      const data = this.edit_data;
+      this.selectedUser = {
+        user_id: data.user_id,
+        nickName: data.nickName || (data.user && data.user.nickName),
+        points: data.points || (data.user && data.user.points)
+      };
+      this.selectedUserName = this.selectedUser.nickName || ('用户ID:' + data.user_id);
+      this.form.user_id = data.user_id;
+      this.form.name = data.name;
+      this.form.category_id = data.category_id;
+      this.form.price = data.price;
+      this.form.content = data.content;
+      this.form.image_list = data.image_list || [];
+      // 提取tag_id数组
+      this.form.tag_list = (data.tag_list && data.tag_list.map) ? data.tag_list.map(item => item.tag_id) : [];
+      this.form.finish_time = data.finish_time || '';
+      this.form.detail = data.detail || '';
+      this.form.product_content = data.product_content || '';
+      this.form.product_case = data.product_case || '';
+      this.form.is_show = data.is_show;
+    },
+    
+    /*打开用户选择器*/
+    openUserSelect() {
+      this.showUserSelector = true;
+    },
+
+    /*打开上传组件*/
+    openUpload() {
+      this.isUpload = true;
+    },
+
+    /*处理用户选择*/
+    handleUserSelect(result) {
+      this.showUserSelector = false;
+      if (result && result.type === 'success' && result.params) {
+        const user = result.params;
+        this.selectedUser = user;
+        this.selectedUserName = user.nickName || user.real_name || ('用户ID:' + user.user_id);
+        this.form.user_id = user.user_id;
+      }
+    },
+
+    /*处理上传图片返回*/
+    returnImgsFunc(e) {
+      if (e != null) {
+        this.form.image_list = this.form.image_list.concat(e);
+      }
+      this.isUpload = false;
+    },
+    
+    /*删除图片*/
+    deleteImg(index) {
+      this.form.image_list.splice(index, 1);
+    },
+    
+    /*提交表单*/
+    submitForm() {
+      let self = this;
+      self.$refs.form.validate(valid => {
+        if (valid) {
+          if (!self.selectedUser || !self.selectedUser.user_id) {
+            self.$message.error('请选择发布用户');
+            return;
+          }
+
+          self.loading = true;
+          let params = {
+            user_id: self.selectedUser.user_id,
+            formData: JSON.stringify(self.form)
+          };
+
+          if (self.isEdit) {
+            // 编辑模式
+            params.project_id = self.editProjectId;
+            PlusApi.supplyProjectEdit(params, true).then(data => {
+              self.loading = false;
+              self.$message.success('编辑成功');
+              self.$emit('closeDialog', {
+                type: 'success',
+                openDialog: false
+              });
+            }).catch(error => {
+              self.loading = false;
+            });
+          } else {
+            // 新增模式
+            params.pay_points = self.payPoints;
+            PlusApi.supplyProjectAdd(params, true).then(data => {
+              self.loading = false;
+              self.$message.success('发布成功');
+              self.$emit('closeDialog', {
+                type: 'success',
+                openDialog: false
+              });
+            }).catch(error => {
+              self.loading = false;
+            });
+          }
+        }
+      });
+    },
+    
+    /*关闭弹窗*/
+    dialogFormVisible() {
+      this.$emit('closeDialog', {
+        type: 'error',
+        openDialog: false
+      });
+    }
+  },
+  computed: {
+    dialogTitle() {
+      return this.isEdit ? '编辑供应' : '发布供应';
+    }
+  }
+};
+</script>
+
+<style>
+.ml10 { margin-left: 10px; }
+.gray9 { color: #999; }
+
+.upload-list {
+  border: 1px solid #e5e5e5;
+  border-radius: 2px;
+  padding: 10px;
+  min-height: 80px;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 10px;
+}
+
+.upload-list .item {
+  width: 60px;
+  height: 60px;
+  border: 1px solid #e5e5e5;
+  border-radius: 2px;
+  overflow: hidden;
+  position: relative;
+}
+
+.upload-list .item img {
+  width: 100%;
+  height: 100%;
+  object-fit: cover;
+}
+
+.upload-list .item .el-button {
+  position: absolute;
+  top: 2px;
+  right: 2px;
+  padding: 2px 6px;
+  background: rgba(0, 0, 0, 0.6);
+  border: none;
+  color: #fff;
+  border-radius: 2px;
+}
+
+.upload-list .img-select {
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  border: 1px dashed #d9d9d9;
+  background: #fafafa;
+  cursor: pointer;
+}
+
+.upload-list .img-select i {
+  font-size: 24px;
+  color: #c0c4cc;
+}
+
+.upload-list .img-select:hover {
+  border-color: #c0c4cc;
+  background: #ecf5ff;
+}
+</style>
diff --git a/shop_vue/src/views/plus/release/supplyproject/index.vue b/shop_vue/src/views/plus/release/supplyproject/index.vue
index 859c674..678dc7b 100644
--- a/shop_vue/src/views/plus/release/supplyproject/index.vue
+++ b/shop_vue/src/views/plus/release/supplyproject/index.vue
@@ -18,6 +18,7 @@
         </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="success" icon="el-icon-plus" @click="addClick">发布供应</el-button>
         </el-form-item>
       </el-form>
     </div>
@@ -39,7 +40,8 @@
           <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="editProjectClick(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>
@@ -59,6 +61,9 @@
     <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>
+
+    <!--发布供应/编辑供应-->
+    <Add v-if="open_add" :open_add="open_add" :edit_data="editData" @closeDialog="closeDialogFunc($event, 'add')"></Add>
   </div>
 </template>
 
@@ -66,6 +71,7 @@
   import PlusApi from '@/api/plus/release.js';
   import Edit from './Edit.vue';
   import Editsh from './dialog/Edit.vue';
+  import Add from './dialog/Add.vue';
 
   import {deepClone} from '@/utils/base.js';
   export default {
@@ -73,6 +79,7 @@
       /*编辑组件*/
       Edit,
       Editsh,
+      Add,
     },
     data() {
       return {
@@ -97,6 +104,9 @@
         /*当前编辑的对象*/
         userModel: {},
         open_sh:false,
+        open_add: false,
+        /*编辑数据*/
+        editData: null,
       };
     },
     created() {
@@ -159,6 +169,18 @@
         this.open_edit = true;
       },
 
+      /*打开发布弹窗*/
+      addClick() {
+        this.editData = null;
+        this.open_add = true;
+      },
+
+      /*打开编辑弹窗*/
+      editProjectClick(item) {
+        this.editData = deepClone(item);
+        this.open_add = true;
+      },
+
       /*打开弹出层审核*/
       shClick(item) {
         this.userModel = item;

--
Gitblit v1.9.2