Explorar el Código

优惠券列表、上线、修改、删除优惠券

詹子聪 hace 6 años
padre
commit
1326661e8d

+ 5 - 0
app/src/main/AndroidManifest.xml

@@ -57,6 +57,11 @@
             android:name=".ui.mine.goods.AddGoodsActivity"
             android:screenOrientation="portrait"
             android:theme="@style/TextInputStyle" />
+
+        <activity
+            android:name=".ui.mine.coupon.AddCouponActivity"
+            android:screenOrientation="portrait"
+            android:theme="@style/TextInputStyle" />
     </application>
 
 </manifest>

+ 18 - 0
app/src/main/java/com/itant/shibei/base/ApiService.java

@@ -1,6 +1,7 @@
 package com.itant.shibei.base;
 
 import com.itant.shibei.bean.BeiUser;
+import com.itant.shibei.bean.CouponBean;
 import com.itant.shibei.bean.GoodsBean;
 import com.miekir.network.core.base.BaseResponse;
 
@@ -39,6 +40,7 @@ public interface ApiService {
     @POST("/shibei/api/password")
     Observable<BaseResponse<BeiUser>> resetPassword(@Body Map<String, Object> body);
 
+    /*----------------------------------------京东商品开始----------------------------------------*/
     /**新增京东商品*/
     @POST("/shibei/api/addGoods")
     Observable<BaseResponse<String>> addGoods(@Body GoodsBean body);
@@ -50,4 +52,20 @@ public interface ApiService {
     /**分页查询京东商品*/
     @GET("/shibei/api/getGoodsList")
     Observable<BaseResponse<List<GoodsBean>>> getGoodsList(@Query("pageNum") int pageNum, @Query("pageSize") int pageSize);
+
+    /*----------------------------------------优惠券开始----------------------------------------*/
+    /**新增优惠券*/
+    @POST("/shibei/api/addCoupon")
+    Observable<BaseResponse<String>> addCoupon(@Body CouponBean body);
+
+    /**删除优惠券*/
+    @GET("/shibei/api/deleteCouponById")
+    Observable<BaseResponse<String>> deleteCouponById(@Query("couponId") long goodsId);
+
+    /**分页查询优惠券*/
+    @GET("/shibei/api/getCouponList")
+    Observable<BaseResponse<List<CouponBean>>> getCouponList(@Query("pageNum") int pageNum, @Query("pageSize") int pageSize);
+
+
+
 }

+ 5 - 0
app/src/main/java/com/itant/shibei/base/ItemLongClickListener.java

@@ -0,0 +1,5 @@
+package com.itant.shibei.base;
+
+public interface ItemLongClickListener {
+    void onItemLongClick(int position);
+}

+ 4 - 2
app/src/main/java/com/itant/shibei/bean/CouponBean.java

@@ -2,6 +2,8 @@ package com.itant.shibei.bean;
 
 import com.itant.shibei.common.ConstantUrl;
 
+import java.io.Serializable;
+
 /**
  *
  *
@@ -9,11 +11,11 @@ import com.itant.shibei.common.ConstantUrl;
  * @date 2020/7/7 19:37
  * Description: 优惠券实体
  */
-public class CouponBean {
+public class CouponBean implements Serializable {
     /**
      * 模板Id
      */
-    public long couponId;
+    public long id;
     /**
      * 模板类型
      */

+ 2 - 1
app/src/main/java/com/itant/shibei/ui/function/template/ITemplateView.java

@@ -13,5 +13,6 @@ import java.util.List;
  * Description: Template的View
  */
 public interface ITemplateView extends IView {
-    void onTemplateDataCome(List<CouponBean> couponBeanList);
+    void onTemplateDataCome(boolean success, String message, List<CouponBean> couponBeanList);
+    void onDeleteCouponResult(boolean success, String message, int position);
 }

+ 27 - 3
app/src/main/java/com/itant/shibei/ui/function/template/TemplateAdapter.java

@@ -3,6 +3,7 @@ package com.itant.shibei.ui.function.template;
 import android.app.Activity;
 import android.content.Context;
 import android.graphics.drawable.Drawable;
+import android.text.TextUtils;
 import android.view.View;
 import android.widget.ImageView;
 
@@ -17,7 +18,9 @@ import com.bumptech.glide.request.transition.Transition;
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.BaseViewHolder;
 import com.itant.shibei.R;
+import com.itant.shibei.base.ItemLongClickListener;
 import com.itant.shibei.bean.CouponBean;
+import com.itant.shibei.manager.UserInfoManager;
 import com.miekir.common.utils.ActivityTool;
 import com.miekir.common.utils.ToastTool;
 
@@ -60,12 +63,33 @@ public class TemplateAdapter extends BaseQuickAdapter<CouponBean, BaseViewHolder
         holder.setOnClickListener(R.id.rl_template, new View.OnClickListener() {
             @Override
             public void onClick(View v) {
-                if (couponBean.actionEnable) {
-                    ActivityTool.openUrl((Activity) mContext, couponBean.jumpUrl);
-                } else {
+                if (!couponBean.actionEnable) {
                     ToastTool.showShort("敬请期待");
+                    return;
                 }
+
+                ActivityTool.openUrl((Activity) mContext, couponBean.jumpUrl);
             }
         });
+
+        if (UserInfoManager.getInstance().isLogin() &&
+                TextUtils.equals("[email protected]", UserInfoManager.getInstance().getBeiUser().email)) {
+            View view = holder.getView(R.id.rl_template);
+            view.setOnLongClickListener(v -> {
+                if (couponLongClickListener != null) {
+                    couponLongClickListener.onItemLongClick(holder.getLayoutPosition());
+                }
+                return false;
+            });
+        }
+    }
+
+    private ItemLongClickListener couponLongClickListener;
+    public ItemLongClickListener getCouponLongClickListener() {
+        return couponLongClickListener;
+    }
+
+    public void setCouponLongClickListener(ItemLongClickListener couponListener) {
+        this.couponLongClickListener = couponListener;
     }
 }

+ 167 - 9
app/src/main/java/com/itant/shibei/ui/function/template/TemplateFragment.java

@@ -1,34 +1,59 @@
 package com.itant.shibei.ui.function.template;
 
+import android.content.DialogInterface;
+import android.content.Intent;
 import android.os.Bundle;
+import android.view.View;
+import android.widget.ImageView;
 
 import androidx.annotation.Nullable;
+import androidx.appcompat.app.AlertDialog;
 import androidx.recyclerview.widget.LinearLayoutManager;
 import androidx.recyclerview.widget.RecyclerView;
+import androidx.swiperefreshlayout.widget.SwipeRefreshLayout;
 
 import com.itant.shibei.R;
 import com.itant.shibei.base.ITopActionListener;
 import com.itant.shibei.bean.CouponBean;
+import com.itant.shibei.tool.DataTool;
 import com.itant.shibei.ui.function.FunctionFragment;
+import com.itant.shibei.ui.mine.goods.AddGoodsActivity;
 import com.itant.shibei.widget.DividerItemDecoration;
+import com.itant.shibei.widget.bottomlistener.OnRcvScrollListener;
+import com.miekir.common.utils.ToastTool;
 import com.miekir.mvp.presenter.InjectPresenter;
 import com.miekir.mvp.view.BaseMVPFragment;
 
 import java.util.ArrayList;
 import java.util.List;
 
+import rx_activity_result2.RxActivityResult;
+
+import static android.app.Activity.RESULT_OK;
+
 /**
  * 模板Fragment
  */
 public class TemplateFragment extends BaseMVPFragment implements ITemplateView, ITopActionListener {
+    private static final int PAGE_START = 0;
+    private static final int PAGE_SIZE = 20;
+    
     private int mTemplateType = FunctionFragment.TEMPLATE_TYPE_BONUS;
-    private List<CouponBean> mCouponBeanList = new ArrayList<>();
-    private TemplateAdapter mAdapter;
-    private RecyclerView rv_template;
 
     @InjectPresenter
     TemplatePresenter mPresenter;
+    
+    private SwipeRefreshLayout srl_template;
+    private List<CouponBean> mCouponBeanList = new ArrayList<>();
+    private TemplateAdapter mAdapter;
+    private RecyclerView rv_template;
 
+    /**当前页*/
+    private int mCurrentPage = PAGE_START;
+    /**是否下拉获取数据*/
+    private boolean mIsRefresh = true;
+    private ImageView iv_empty;
+    
     public TemplateFragment(int templateType) {
         mTemplateType = templateType;
     }
@@ -42,25 +67,158 @@ public class TemplateFragment extends BaseMVPFragment implements ITemplateView,
     public void onCreateViewFinished(@Nullable Bundle savedInstanceState) {
         super.onCreateViewFinished(savedInstanceState);
 
+        iv_empty = rootView.findViewById(R.id.iv_empty);
         rv_template = rootView.findViewById(R.id.rv_template);
         // 必须要设置LayoutManager,否则RecyclerView不知道要使用什么布局,从而在界面上不显示
         LinearLayoutManager layoutManager = new LinearLayoutManager(getActivity(), LinearLayoutManager.VERTICAL, false);
         rv_template.setLayoutManager(layoutManager);
+
         int dividerWidth = (int) getResources().getDimension(R.dimen.margin_s);
         DividerItemDecoration decoration = new DividerItemDecoration(dividerWidth);
         rv_template.addItemDecoration(decoration);
+        // 本地写死的数据
+        mCouponBeanList.addAll(DataTool.getTemplateList(mTemplateType));
         mAdapter = new TemplateAdapter(getActivity(), mCouponBeanList);
+        mAdapter.setCouponLongClickListener(this::showAdminDialog);
         rv_template.setAdapter(mAdapter);
+        // 不要滑动一段距离
+        rv_template.smoothScrollToPosition(0);
+        srl_template = rootView.findViewById(R.id.srl_template);
+        srl_template.setColorSchemeResources(
+                R.color.black_theme,
+                R.color.blue_droid,
+                R.color.yellow_droid,
+                R.color.red_droid);
+
+        // 下拉刷新
+        srl_template.setOnRefreshListener(new SwipeRefreshLayout.OnRefreshListener() {
+            @Override
+            public void onRefresh() {
+                mIsRefresh = true;
+                mCurrentPage = PAGE_START;
+                mPresenter.getTemplateData(mCurrentPage, PAGE_SIZE);
+            }
+        });
+
+        // 加载更多
+        rv_template.addOnScrollListener(new OnRcvScrollListener(){
+            @Override
+            public void onBottom() {
+                super.onBottom();
+                // 如果到底部了,而且不是正在加载状态,就变为正在加载状态,并及时去加载数据
+                if (!srl_template.isRefreshing()) {
+                    mIsRefresh = false;
+                    srl_template.setRefreshing(true);
+                    mPresenter.getTemplateData(mCurrentPage, PAGE_SIZE);
+                }
+            }
+        });
+
+        // 获取数据
+        srl_template.setRefreshing(true);
+        mPresenter.getTemplateData(mCurrentPage, PAGE_SIZE);
+    }
+
+    /**
+     * 修改商品或者删除商品
+     */
+    private void showAdminDialog(int position) {
+        CouponBean couponBean = mCouponBeanList.get(position);
+        if (couponBean.isLocal) {
+            // 本地写死的不能删除
+            return;
+        }
+        AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
+                .setMessage("选择操作")
+                .setPositiveButton("修改", (dialog, which) -> {
+                    dialog.dismiss();
+                    Intent modifyIntent = new Intent(getActivity(), AddGoodsActivity.class);
+                    modifyIntent.putExtra(AddGoodsActivity.KEY_MODIFY_GOODS, couponBean);
+                    RxActivityResult.on(getActivity()).startIntent(modifyIntent)
+                            .filter(result -> result.resultCode() == RESULT_OK)
+                            .subscribe(result -> {
+                                // 修改商品成功之后刷新item
+                                mAdapter.notifyItemChanged(position);
+                            });
+                })
+                .setNeutralButton("取消", (dialog, which) -> {
+                    dialog.dismiss();
+                })
+                .setNegativeButton("删除", (DialogInterface dialog, int which) -> {
+                    dialog.dismiss();
+                    showDeleteDialog(position);
+                }).create();
+        alertDialog.setCanceledOnTouchOutside(false);
+        alertDialog.setCancelable(false);
+        alertDialog.show();
+    }
+
+    /**
+     * 是否删除商品
+     */
+    private void showDeleteDialog(int position) {
+        CouponBean couponBean = mCouponBeanList.get(position);
+        AlertDialog alertDialog = new AlertDialog.Builder(getActivity())
+                .setMessage("确定删除优惠券:" + couponBean.couponName)
+                .setNegativeButton("取消", (dialog, which) -> dialog.dismiss())
+                .setPositiveButton("确定", (DialogInterface dialog, int which) -> {
+                    dialog.dismiss();
+                    // 删除商品
+                    mPresenter.deleteCouponById(position, couponBean.id);
+                }).create();
+        alertDialog.show();
+    }
+
+    @Override
+    public void onTemplateDataCome(boolean success, String message, List<CouponBean> couponBeanList) {
+        srl_template.setRefreshing(false);
+        if (!success) {
+            ToastTool.showShort(message);
+            return;
+        }
+
+        if (mCurrentPage == PAGE_START) {
+            mCouponBeanList.clear();
+            // 本地写死的数据
+            mCouponBeanList.addAll(DataTool.getTemplateList(mTemplateType));
+            mCouponBeanList.addAll(couponBeanList);
+            mAdapter.notifyDataSetChanged();
+            // 如果是下拉刷新获取的第0页数据,item不要自动滚动一段距离
+            // 或者用这个mLayoutManager.scrollToPositionWithOffset(0, 0);
+            if (mIsRefresh) {
+                rv_template.smoothScrollToPosition(0);
+            }
+        } else {
+            mCouponBeanList.addAll(couponBeanList);
+            mAdapter.notifyDataSetChanged();
+        }
+
+        // 请求到数据了,页数自增
+        if (couponBeanList != null && couponBeanList.size() > 0) {
+            mCurrentPage++;
+        }
 
-        // 从服务器获取数据
-        mPresenter.getTemplateData(mTemplateType);
+        if (mCouponBeanList.size() == 0) {
+            iv_empty.setVisibility(View.VISIBLE);
+        } else {
+            iv_empty.setVisibility(View.GONE);
+        }
     }
 
+    /**
+     * 删除商品结果
+     * @param success
+     * @param message
+     * @param position
+     */
     @Override
-    public void onTemplateDataCome(List<CouponBean> couponBeanList) {
-        // todo 分页,判断是否第0页(下拉刷新)
-        mCouponBeanList.addAll(couponBeanList);
-        mAdapter.notifyDataSetChanged();
+    public void onDeleteCouponResult(boolean success, String message, int position) {
+        if (success) {
+            mAdapter.notifyItemRemoved(position);
+            ToastTool.showShort("删除成功");
+        } else {
+            ToastTool.showShort(message);
+        }
     }
 
     @Override

+ 54 - 10
app/src/main/java/com/itant/shibei/ui/function/template/TemplatePresenter.java

@@ -1,11 +1,18 @@
 package com.itant.shibei.ui.function.template;
 
+import android.text.TextUtils;
+
+import com.itant.shibei.base.ApiService;
 import com.itant.shibei.bean.CouponBean;
-import com.itant.shibei.tool.DataTool;
+import com.itant.shibei.net.RetrofitHelper;
 import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.network.core.base.BaseObserver;
 
 import java.util.List;
 
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
 /**
  *
  *
@@ -15,14 +22,51 @@ import java.util.List;
  */
 public class TemplatePresenter extends BasePresenter<ITemplateView> {
 
-    /**
-     * todo 从服务器获取数据,切换线程
-     * @param functionType
-     */
-    public void getTemplateData(int functionType) {
-        if (getView() != null) {
-            List<CouponBean> couponBeanList = DataTool.getTemplateList(functionType);
-            getView().onTemplateDataCome(couponBeanList);
-        }
+
+    public void getTemplateData(int pageNum, int pageSize) {
+        RetrofitHelper.getInstance()
+                .getRequestApi(ApiService.class)
+                .getCouponList(pageNum, pageSize)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new BaseObserver<List<CouponBean>>() {
+                    @Override
+                    public void onSuccess(List<CouponBean> result) {
+                        if (getView() != null) {
+                            getView().onTemplateDataCome(true, "", result);
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(Throwable e, String errMsg) {
+                        if (getView() != null) {
+                            getView().onTemplateDataCome(false, TextUtils.isEmpty(errMsg) ? "获取失败:"+e.getMessage() : errMsg, null);
+                        }
+                    }
+                });
+    }
+
+
+    public void deleteCouponById(int position, long couponId) {
+        RetrofitHelper.getInstance()
+                .getRequestApi(ApiService.class)
+                .deleteCouponById(couponId)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new BaseObserver<String>() {
+                    @Override
+                    public void onSuccess(String result) {
+                        if (getView() != null) {
+                            getView().onDeleteCouponResult(true, result, position);
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(Throwable e, String errMsg) {
+                        if (getView() != null) {
+                            getView().onDeleteCouponResult(false, TextUtils.isEmpty(errMsg) ? "删除失败:"+e.getMessage() : errMsg, position);
+                        }
+                    }
+                });
     }
 }

+ 12 - 9
app/src/main/java/com/itant/shibei/ui/home/GoodsAdapter.java

@@ -22,11 +22,13 @@ import com.bumptech.glide.request.transition.Transition;
 import com.chad.library.adapter.base.BaseQuickAdapter;
 import com.chad.library.adapter.base.BaseViewHolder;
 import com.itant.shibei.R;
+import com.itant.shibei.base.ItemLongClickListener;
 import com.itant.shibei.bean.GoodsBean;
 import com.itant.shibei.common.ConstantString;
 import com.itant.shibei.manager.UserInfoManager;
 import com.itant.shibei.tool.StringTool;
 import com.miekir.common.utils.ActivityTool;
+import com.miekir.common.utils.ToastTool;
 
 import java.util.List;
 
@@ -93,8 +95,11 @@ public class GoodsAdapter extends BaseQuickAdapter<GoodsBean, BaseViewHolder> {
         }
 
         holder.setOnClickListener(R.id.cv_goods, v -> {
-            String goodsUrl = goodsBean.goodsUrl;
-            ActivityTool.openUrl((Activity) mContext, goodsUrl);
+            if (!goodsBean.enable) {
+                ToastTool.showShort("敬请期待");
+                return;
+            }
+            ActivityTool.openUrl((Activity) mContext, goodsBean.goodsUrl);
         });
 
         AppCompatImageView aciv_goods = holder.getView(R.id.aciv_goods);
@@ -118,22 +123,20 @@ public class GoodsAdapter extends BaseQuickAdapter<GoodsBean, BaseViewHolder> {
             View view = holder.getView(R.id.cv_goods);
             view.setOnLongClickListener(v -> {
                 if (goodsLongClickListener != null) {
-                    goodsLongClickListener.onGoodsLongClick(holder.getLayoutPosition());
+                    goodsLongClickListener.onItemLongClick(holder.getLayoutPosition());
                 }
                 return false;
             });
         }
     }
 
-    private GoodsLongClickListener goodsLongClickListener;
-    public GoodsLongClickListener getGoodsLongClickListener() {
+    private ItemLongClickListener goodsLongClickListener;
+    public ItemLongClickListener getGoodsLongClickListener() {
         return goodsLongClickListener;
     }
 
-    public void setGoodsLongClickListener(GoodsLongClickListener goodsLongClickListener) {
+    public void setGoodsLongClickListener(ItemLongClickListener goodsLongClickListener) {
         this.goodsLongClickListener = goodsLongClickListener;
     }
-    public interface GoodsLongClickListener {
-        void onGoodsLongClick(int position);
-    }
+
 }

+ 16 - 1
app/src/main/java/com/itant/shibei/ui/mine/MineActivity.java

@@ -17,6 +17,7 @@ import com.itant.shibei.common.ConstantString;
 import com.itant.shibei.manager.UserInfoManager;
 import com.itant.shibei.tool.StringTool;
 import com.itant.shibei.tool.TimeTool;
+import com.itant.shibei.ui.mine.coupon.AddCouponActivity;
 import com.itant.shibei.ui.mine.goods.AddGoodsActivity;
 import com.miekir.common.utils.ViewTool;
 
@@ -39,7 +40,8 @@ public class MineActivity extends BaseBeiActivity implements View.OnClickListene
         mUser = UserInfoManager.getInstance().getBeiUser();
         setTitle(String.format(ConstantString.WELCOME_HELLO, TimeTool.getCurrentTimePeriod(), mUser.nickName));
         ViewTool.setOnClickListener(this, this,
-                new int[]{R.id.ll_user, R.id.tv_add_goods, R.id.btn_exit_login});
+                new int[]{R.id.ll_user, R.id.tv_add_goods, R.id.btn_exit_login, R.id.tv_add_coupon,
+                R.id.tv_add_goods_from_url, R.id.tv_deal_cash});
 
         // 只有我才能管理后台
         View ll_admin = findViewById(R.id.ll_admin);
@@ -63,11 +65,24 @@ public class MineActivity extends BaseBeiActivity implements View.OnClickListene
                 // todo 查看账户明细
                 break;
 
+            case R.id.tv_deal_cash:
+                // todo 处理提现工单
+                break;
+
+            case R.id.tv_add_goods_from_url:
+                // todo 解析链接添加商品
+                break;
+
             case R.id.tv_add_goods:
                 // 上架新商品
                 startActivity(new Intent(this, AddGoodsActivity.class));
                 break;
 
+            case R.id.tv_add_coupon:
+                // 上架优惠券
+                startActivity(new Intent(this, AddCouponActivity.class));
+                break;
+
             case R.id.btn_exit_login:
                 sureToExit();
                 break;

+ 95 - 0
app/src/main/java/com/itant/shibei/ui/mine/coupon/AddCouponActivity.java

@@ -0,0 +1,95 @@
+package com.itant.shibei.ui.mine.coupon;
+
+import android.os.Bundle;
+import android.view.View;
+import android.widget.CheckBox;
+
+import com.google.android.material.textfield.TextInputEditText;
+import com.itant.shibei.R;
+import com.itant.shibei.base.BaseBeiActivity;
+import com.itant.shibei.bean.CouponBean;
+import com.miekir.common.utils.ToastTool;
+import com.miekir.common.utils.ViewTool;
+import com.miekir.mvp.presenter.InjectPresenter;
+
+/**
+ * @author Miekir
+ * @date 2020/6/18 16:48
+ * Description: 添加优惠券界面
+ */
+public class AddCouponActivity extends BaseBeiActivity implements View.OnClickListener, IAddCouponView {
+    public static final String KEY_MODIFY_COUPON = "key_modify_coupon";
+
+    private TextInputEditText et_coupon_title;
+    private TextInputEditText et_cover_url;
+    private TextInputEditText et_jump_url;
+
+    private CheckBox cb_enable;
+
+    private CouponBean couponBean;
+
+    @InjectPresenter
+    AddCouponPresenter presenter;
+
+    @Override
+    public int getLayoutID() {
+        return R.layout.activity_coupon_add;
+    }
+
+    @Override
+    public void initViews(Bundle savedInstanceState) {
+        setTitle("上架新的优惠券");
+        et_coupon_title = findViewById(R.id.et_goods_title);
+        et_cover_url = findViewById(R.id.et_cover_url);
+        et_jump_url = findViewById(R.id.et_desc);
+        cb_enable = findViewById(R.id.cb_enable);
+        ViewTool.setOnClickListener(this, this, new int[]{R.id.btn_add_goods});
+
+        couponBean = (CouponBean) getIntent().getSerializableExtra(KEY_MODIFY_COUPON);
+        if (couponBean != null) {
+            initCoupon();
+        }
+    }
+
+    private void initCoupon() {
+        et_coupon_title.setText(couponBean.couponName);
+        et_cover_url.setText(couponBean.coverUrl);
+        et_jump_url.setText(couponBean.jumpUrl);
+        cb_enable.setChecked(couponBean.actionEnable);
+    }
+
+    @Override
+    public void onClick(View v) {
+        switch (v.getId()) {
+            case R.id.btn_add_goods:
+                String title = et_coupon_title.getEditableText().toString();
+                String coverUrl = et_cover_url.getEditableText().toString();
+                String jumpUrl = et_jump_url.getEditableText().toString();
+                boolean isEnable = cb_enable.isChecked();
+
+                if (couponBean == null) {
+                    couponBean = new CouponBean();
+                }
+                couponBean.couponName = title;
+                couponBean.coverUrl = coverUrl;
+                couponBean.jumpUrl = jumpUrl;
+                couponBean.actionEnable = isEnable;
+
+                showLoading();
+                presenter.addCoupon(couponBean);
+                break;
+            default:
+                break;
+        }
+    }
+
+    @Override
+    public void onAddCouponResult(boolean success, String message) {
+        dismissLoading();
+        ToastTool.showShort(message);
+        if (success) {
+            setResult(RESULT_OK);
+            finish();
+        }
+    }
+}

+ 43 - 0
app/src/main/java/com/itant/shibei/ui/mine/coupon/AddCouponPresenter.java

@@ -0,0 +1,43 @@
+package com.itant.shibei.ui.mine.coupon;
+
+import android.text.TextUtils;
+
+import com.itant.shibei.base.ApiService;
+import com.itant.shibei.bean.CouponBean;
+import com.itant.shibei.net.RetrofitHelper;
+import com.miekir.mvp.presenter.BasePresenter;
+import com.miekir.network.core.base.BaseObserver;
+
+import io.reactivex.android.schedulers.AndroidSchedulers;
+import io.reactivex.schedulers.Schedulers;
+
+/**
+ * @author Miekir
+ * @date 2020/7/9 20:54
+ * Description: 商品的相关数据接口处理
+ */
+public class AddCouponPresenter extends BasePresenter<IAddCouponView> {
+
+    public void addCoupon(CouponBean couponBean) {
+        RetrofitHelper.getInstance()
+                .getRequestApi(ApiService.class)
+                .addCoupon(couponBean)
+                .subscribeOn(Schedulers.io())
+                .observeOn(AndroidSchedulers.mainThread())
+                .subscribe(new BaseObserver<String>() {
+                    @Override
+                    public void onSuccess(String result) {
+                        if (getView() != null) {
+                            getView().onAddCouponResult(true, result);
+                        }
+                    }
+
+                    @Override
+                    public void onFailure(Throwable e, String errMsg) {
+                        if (getView() != null) {
+                            getView().onAddCouponResult(false, TextUtils.isEmpty(errMsg) ? "操作失败"+e.getMessage() : errMsg);
+                        }
+                    }
+                });
+    }
+}

+ 18 - 0
app/src/main/java/com/itant/shibei/ui/mine/coupon/IAddCouponView.java

@@ -0,0 +1,18 @@
+package com.itant.shibei.ui.mine.coupon;
+
+import com.miekir.mvp.view.IView;
+
+/**
+ * Copyright (C), 2019-2020, Miekir
+ *
+ * @author Miekir
+ * @date 2020/8/2 10:29
+ */
+public interface IAddCouponView extends IView {
+    /**
+     * 增加优惠券的结果
+     * @param success
+     * @param message
+     */
+    void onAddCouponResult(boolean success, String message);
+}

+ 1 - 1
app/src/main/java/com/itant/shibei/ui/mine/goods/AddGoodsActivity.java

@@ -16,7 +16,7 @@ import com.miekir.mvp.presenter.InjectPresenter;
 /**
  * @author Miekir
  * @date 2020/6/18 16:48
- * Description: 登录界面
+ * Description: 添加京东商品界面
  */
 public class AddGoodsActivity extends BaseBeiActivity implements View.OnClickListener, IAddGoodsView {
     public static final String KEY_MODIFY_GOODS = "key_modify_goods";

+ 118 - 0
app/src/main/res/layout/activity_coupon_add.xml

@@ -0,0 +1,118 @@
+<?xml version="1.0" encoding="utf-8"?>
+<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
+    xmlns:app="http://schemas.android.com/apk/res-auto"
+    android:layout_width="match_parent"
+    android:layout_height="match_parent"
+    android:background="@color/colorPrimary"
+    android:fitsSystemWindows="true"
+    android:focusable="true"
+    android:focusableInTouchMode="true"
+    android:orientation="vertical">
+    <!--启用深色模式之后,需要使用fitsSystemWindows来不让布局上滑-->
+
+    <include layout="@layout/view_toolbar" />
+    <!--阴影效果android:background="?android:attr/listDivider"-->
+
+    <ScrollView
+        android:layout_width="match_parent"
+        android:layout_height="wrap_content">
+
+        <LinearLayout
+            android:layout_width="match_parent"
+            android:layout_height="wrap_content"
+            android:orientation="vertical">
+
+            <com.google.android.material.textfield.TextInputLayout
+                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/margin_default"
+                android:layout_marginTop="@dimen/margin_default"
+                android:layout_marginEnd="@dimen/margin_default"
+                android:hint="优惠券标题"
+                app:boxBackgroundMode="outline"
+                app:boxCornerRadiusBottomEnd="4dp"
+                app:boxCornerRadiusBottomStart="4dp"
+                app:boxCornerRadiusTopEnd="4dp"
+                app:boxCornerRadiusTopStart="4dp"
+                app:boxStrokeWidth="@dimen/width_stroke"
+                app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    android:id="@+id/et_coupon_title"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textSize="@dimen/text_normal_s" />
+            </com.google.android.material.textfield.TextInputLayout>
+
+
+            <com.google.android.material.textfield.TextInputLayout
+                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/margin_default"
+                android:layout_marginTop="@dimen/margin_default"
+                android:layout_marginEnd="@dimen/margin_default"
+                android:hint="封面URL"
+                app:boxBackgroundMode="outline"
+                app:boxCornerRadiusBottomEnd="4dp"
+                app:boxCornerRadiusBottomStart="4dp"
+                app:boxCornerRadiusTopEnd="4dp"
+                app:boxCornerRadiusTopStart="4dp"
+                app:boxStrokeWidth="@dimen/width_stroke"
+                app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    android:id="@+id/et_cover_url"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textSize="@dimen/text_normal_s" />
+            </com.google.android.material.textfield.TextInputLayout>
+
+            <com.google.android.material.textfield.TextInputLayout
+                style="@style/Widget.MaterialComponents.TextInputLayout.OutlinedBox"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/margin_default"
+                android:layout_marginTop="@dimen/margin_default"
+                android:layout_marginEnd="@dimen/margin_default"
+                android:hint="跳转URL"
+                app:boxBackgroundMode="outline"
+                app:boxCornerRadiusBottomEnd="4dp"
+                app:boxCornerRadiusBottomStart="4dp"
+                app:boxCornerRadiusTopEnd="4dp"
+                app:boxCornerRadiusTopStart="4dp"
+                app:boxStrokeWidth="@dimen/width_stroke"
+                app:boxStrokeWidthFocused="@dimen/width_stroke">
+
+                <com.google.android.material.textfield.TextInputEditText
+                    android:id="@+id/et_jump_url"
+                    android:layout_width="match_parent"
+                    android:layout_height="wrap_content"
+                    android:textSize="@dimen/text_normal_s" />
+            </com.google.android.material.textfield.TextInputLayout>
+
+
+            <CheckBox
+                android:id="@+id/cb_enable"
+                android:layout_width="wrap_content"
+                android:layout_height="wrap_content"
+                android:layout_marginStart="@dimen/margin_default"
+                android:text="是否生效" />
+
+            <android.widget.Button
+                android:id="@+id/btn_add_goods"
+                style="?android:attr/borderlessButtonStyle"
+                android:layout_width="match_parent"
+                android:layout_height="wrap_content"
+                android:layout_margin="@dimen/margin_default"
+                android:background="@drawable/selector_btn"
+                android:minHeight="0dp"
+                android:paddingTop="@dimen/padding_full_width"
+                android:paddingBottom="@dimen/padding_full_width"
+                android:text="立即添加"
+                android:textColor="@color/white"
+                android:textStyle="bold" />
+        </LinearLayout>
+    </ScrollView>
+</LinearLayout>

+ 3 - 1
app/src/main/res/layout/activity_mine.xml

@@ -67,6 +67,7 @@
 
         <!--处理提现-->
         <TextView
+            android:id="@+id/tv_deal_cash"
             android:layout_width="match_parent"
             android:layout_height="@dimen/height_tab_bar"
             android:background="?attr/selectableItemBackground"
@@ -102,12 +103,13 @@
             android:orientation="horizontal"
             android:paddingStart="@dimen/activity_horizontal_margin"
             android:paddingEnd="@dimen/activity_horizontal_margin"
-            android:text="解析添加推荐"
+            android:text="解析商品链接"
             android:textColor="@color/black_text" />
 
         <include layout="@layout/view_divider_common" />
 
         <TextView
+            android:id="@+id/tv_add_coupon"
             android:layout_width="match_parent"
             android:layout_height="@dimen/height_tab_bar"
             android:background="?attr/selectableItemBackground"

+ 20 - 4
app/src/main/res/layout/fragment_function_template.xml

@@ -5,9 +5,25 @@
     android:background="@color/colorPrimary"
     android:orientation="vertical">
 
-    <androidx.recyclerview.widget.RecyclerView
-        android:overScrollMode="never"
-        android:id="@+id/rv_template"
+    <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
+        android:id="@+id/srl_template"
         android:layout_width="match_parent"
-        android:layout_height="match_parent"/>
+        android:layout_height="match_parent">
+        <!--去掉下拉阴影android:overScrollMode="never"-->
+        <androidx.recyclerview.widget.RecyclerView
+            android:overScrollMode="never"
+            android:id="@+id/rv_template"
+            android:layout_width="match_parent"
+            android:layout_height="match_parent"/>
+    </androidx.swiperefreshlayout.widget.SwipeRefreshLayout>
+
+    <ImageView
+        android:id="@+id/iv_empty"
+        android:layout_width="@dimen/size_image_big"
+        android:layout_height="@dimen/size_image_big"
+        android:scaleType="fitXY"
+        android:src="@mipmap/logo_gray"
+        android:layout_gravity="center"
+        android:tint="@color/gray_text_hint"
+        android:visibility="gone"/>
 </LinearLayout>

+ 1 - 3
app/src/main/res/layout/fragment_home_goods.xml

@@ -4,9 +4,7 @@
     android:layout_height="match_parent"
     xmlns:app="http://schemas.android.com/apk/res-auto"
     android:focusable="true"
-    android:focusableInTouchMode="true"
-    android:descendantFocusability="blocksDescendants">
-    <!--todo RecyclerView还是会自动获取焦点-->
+    android:focusableInTouchMode="true">
 
     <androidx.swiperefreshlayout.widget.SwipeRefreshLayout
         android:id="@+id/srl_goods"