**

效果图

**.

AndroidManifest.xml
继承了Application,所以一定要配置

<uses-permission android:name="android.permission.INTERNET"/>
<applicationandroid:name="core.DTApplication"..................
/>

依赖

implementation files('libs/gson-2.3.1.jar')
implementation 'com.squareup.okhttp3:okhttp:3.12.0'
implementation 'com.android.support:recyclerview-v7:26.1.0'
compile 'com.github.bumptech.glide:glide:3.8.0'

解决内存泄露
model层和presenter层不是这个工程的,自己看着自己的工程改下就行,大概流程就是这么写的;

在p层判断写,写个这个让M层和V层等于空
public void Death(){
if(myModel !=null){myModel=null;
}
if(viewCallBack!=null){viewCallBack=null;
}
}
然后在Activity或者fragment里调生命周期的onDestroy调用P层那个 方法就行
protected void onDeatory(){super.onDeatory();
myPresenter.Death();
}

先写布局了
对了,里面有需要用到的颜色,自己随机换个哦
activity_main

 <LinearLayoutandroid:layout_width="match_parent"android:layout_height="match_parent"android:layout_weight="1"android:orientation="horizontal"><android.support.v7.widget.RecyclerViewandroid:id="@+id/left_recycler"android:layout_width="100dp"android:layout_height="match_parent"android:background="@color/grayblack"></android.support.v7.widget.RecyclerView><android.support.v7.widget.RecyclerViewandroid:id="@+id/right_recycler"android:layout_width="match_parent"android:layout_height="match_parent"></android.support.v7.widget.RecyclerView>
</LinearLayout><RelativeLayoutandroid:layout_width="match_parent"android:layout_height="80dp"><ImageViewandroid:id="@+id/shop_car_image"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_centerVertical="true"android:layout_marginLeft="10dp"android:src="@drawable/gouwuc_r" /><TextViewandroid:id="@+id/goods_sum_price"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:text="价格:"android:layout_marginLeft="20dp"android:layout_centerVertical="true"/><TextViewandroid:id="@+id/goods_number"android:layout_width="30dp"android:layout_height="30dp"android:textSize="10sp"android:gravity="center"android:textColor="@color/white"android:layout_marginLeft="-10dp"android:background="@drawable/circle_red_bg"android:layout_alignParentTop="true"android:layout_alignLeft="@+id/shop_car_image"android:text="7" />
</RelativeLayout>

自定义加减
car_add_sub_layout.xml

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:orientation="horizontal"><TextViewandroid:id="@+id/btn_add"android:layout_width="30dp"android:layout_height="30dp"android:background="@drawable/car_btn_bg"android:focusable="false"android:textSize="20sp"android:gravity="center"android:text="+" /><TextViewandroid:id="@+id/text_number"android:layout_width="60dp"android:layout_height="30dp"android:gravity="center"android:textSize="14sp"android:text="1000" /><TextViewandroid:id="@+id/btn_sub"android:layout_width="30dp"android:layout_height="30dp"android:textSize="20sp"android:focusable="false"android:gravity="center"android:background="@drawable/car_btn_bg"android:text="-" />
</LinearLayout>

左边布局
recycler_left_item

<TextViewandroid:id="@+id/left_text"android:layout_width="100dp"android:layout_height="50dp"android:textSize="16sp"android:gravity="center"android:textColor="@color/white"android:text="aa" />

右边布局
recycler_right_item

<RelativeLayout
xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:padding="10dp"
android:layout_marginLeft="10dp"
android:layout_marginRight="10dp"
android:background="@drawable/search_edit_bg"
android:orientation="horizontal"><ImageViewandroid:id="@+id/image"android:layout_width="100dp"android:layout_height="wrap_content"android:adjustViewBounds="true"android:minHeight="50dp"android:layout_alignParentLeft="true"android:src="@mipmap/ic_launcher"/><TextViewandroid:id="@+id/text"android:layout_toRightOf="@+id/image"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="aa"android:padding="10dp"/>
<TextViewandroid:id="@+id/text_price"android:layout_toRightOf="@+id/image"android:layout_below="@+id/text"android:layout_width="match_parent"android:layout_height="wrap_content"android:layout_marginTop="10dp"android:text="价格"android:padding="10dp"/><view.AddSubLayoutandroid:id="@+id/add_sub_layout"android:layout_width="wrap_content"android:layout_height="wrap_content"android:layout_alignParentRight="true"android:layout_alignParentBottom="true"android:layout_marginRight="20dp"android:layout_marginBottom="20dp"></view.AddSubLayout></RelativeLayout>

drawable下设置加减边框
car_btn_bg.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"
>
<cornersandroid:radius="5dp"></corners>
<stroke
android:color="@android:color/holo_red_dark"
android:width="2dp"></stroke>
</shape>

圆形
circle_red_bg.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval"><solidandroid:color="#D81B60"></solid></shape>

商品背景
search_edit_bg.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle"><corners android:radius="20dp" />
<solidandroid:color="#d8d8d8"></solid></shape>

开始主代码了
core
DataCall

public interface DataCall<T> {void success(T data);void fail(Result result);}

BasePresenter

public abstract class BasePresenter {DataCall dataCall;public BasePresenter(DataCall dataCall){this.dataCall = dataCall;
}Handler mHandler = new Handler(Looper.getMainLooper()) {@Overridepublic void handleMessage(Message msg) {Result result = (Result) msg.obj;if (result.getCode()==0){dataCall.success(result.getData());}else{dataCall.fail(result);}}
};public void requestData(final Object...args){new Thread(new Runnable() {@Overridepublic void run() {Message message = mHandler.obtainMessage();message.obj = getData(args);mHandler.sendMessage(message);}}).start();
}protected abstract Result getData(Object...args);public void unBindCall(){this.dataCall = null;
}}

DTApplication

public class DTApplication extends Application {private static DTApplication instance;
private SharedPreferences mSharedPreferences;@Override
public void onCreate() {super.onCreate();instance = this;mSharedPreferences = getSharedPreferences("application",Context.MODE_PRIVATE);/* JPushInterface.setDebugMode(true);JPushInterface.init(this);  */          // 初始化 JPush
}public static DTApplication getInstance() {return instance;
}public SharedPreferences getShare() {return mSharedPreferences;
}}

**

model

CartModel
**
当数据接口崩了,可以直接用死数据
String resultString =“ 直接粘数据 ”;
!!!!就不要再用HttpUtils.get调用数据了!!!!!

public static Result goodsList() {String resultString = HttpUtils.get("http://www.zhaoapi.cn/product/getCarts?uid=71");try {Gson gson = new Gson();Type type = new TypeToken<Result<List<Shop>>>() {}.getType();Result result = gson.fromJson(resultString, type);
//        Result<List<Goods>> result = new Result<>();
//        result.setCode(0);
//        List<Goods> list = new ArrayList<>();
//        for (int i = 0; i < 30; i++) {
//            Goods goods = new Goods();
//            goods.setImages("");
//            goods.setTitle("手机"+i);
//            list.add(goods);
//        }
//        result.setData(list);return result;} catch (Exception e) {}Result result = new Result();result.setCode(-1);result.setMsg("数据解析异常");return result;
}}

**

presenter

**
CartPresenter

public class CartPresenter extends BasePresenter {public CartPresenter(DataCall dataCall) {super(dataCall);
}@Override
protected Result getData(Object... args) {Result result = CartModel.goodsList();//调用网络请求获取数据return result;
}}

**

utils

**
HttpUtils

public class HttpUtils {
public static String get(String urlString){OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new LoggingInterceptor())//日志拦截器.connectTimeout(10, TimeUnit.SECONDS)//连接超时.readTimeout(10,TimeUnit.SECONDS)//读取超时.writeTimeout(10,TimeUnit.SECONDS)//写入超时.build();Request request = new Request.Builder().url(urlString).get().build();try {Response response = okHttpClient.newCall(request).execute();String result = response.body().string();Log.i("dt","请求结果:"+result);return result;} catch (IOException e) {e.printStackTrace();}return "";
}public static String postForm(String url,String[] name,String[] value){OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new LoggingInterceptor())//日志拦截器.connectTimeout(10, TimeUnit.SECONDS)//连接超时.readTimeout(10,TimeUnit.SECONDS)//读取超时.writeTimeout(10,TimeUnit.SECONDS)//写入超时.build();FormBody.Builder formBuild = new FormBody.Builder();for (int i = 0; i < name.length; i++) {formBuild.add(name[i],value[i]);}Request request = new Request.Builder().url(url).post(formBuild.build()).build();try {Response response = okHttpClient.newCall(request).execute();String result = response.body().string();Log.i("dt",result);return result;} catch (IOException e) {e.printStackTrace();}return "";
}public static String postFile(String url,String[] name,String[] value,String fileParamName,File file){OkHttpClient okHttpClient = new OkHttpClient.Builder().addInterceptor(new LoggingInterceptor())//日志拦截器.connectTimeout(10, TimeUnit.SECONDS)//连接超时.readTimeout(10,TimeUnit.SECONDS)//读取超时.writeTimeout(10,TimeUnit.SECONDS)//写入超时.build();MultipartBody.Builder requestBody = new MultipartBody.Builder().setType(MultipartBody.FORM);if(file != null){// MediaType.parse() 里面是上传的文件类型。RequestBody body = RequestBody.create(MediaType.parse("image/*"), file);String filename = file.getName();// 参数分别为: 文件参数名 ,文件名称 , RequestBodyrequestBody.addFormDataPart(fileParamName, "jpg", body);}if (name!=null) {for (int i = 0; i < name.length; i++) {requestBody.addFormDataPart(name[i], value[i]);}}Request request = new Request.Builder().url(url).post(requestBody.build()).build();try {Response response = okHttpClient.newCall(request).execute();if (response.code()==200) {return response.body().string();}} catch (IOException e) {e.printStackTrace();}return "";
}public static String postJson(String url,String jsonString){OkHttpClient okHttpClient = new OkHttpClient();RequestBody requestBody = RequestBody.create(MediaType.parse("application/json"),jsonString);Request request = new Request.Builder().url(url).post(requestBody).build();try {Response response = okHttpClient.newCall(request).execute();return response.body().string();} catch (IOException e) {e.printStackTrace();}return "";
}
}

拦截器的类
LoggingInterceptor

public class LoggingInterceptor implements Interceptor {
@Override
public Response intercept(Interceptor.Chain chain) throws IOException {//这个chain里面包含了request和response,所以你要什么都可以从这里拿Request request = chain.request();long t1 = System.nanoTime();//请求发起的时间Log.i("dt",String.format("发送请求 %s on %s%n%s",request.url(), chain.connection(), request.headers()));Response response = chain.proceed(request);long t2 = System.nanoTime();//收到响应的时间//这里不能直接使用response.body().string()的方式输出日志//因为response.body().string()之后,response中的流会被关闭,程序会报错,我们需要创建出一//个新的response给应用层处理ResponseBody responseBody = response.peekBody(1024 * 1024);Log.i("dt",String.format("接收响应: [%s] %n返回json:【%s】 %.1fms%n%s",response.request().url(),responseBody.string(),(t2 - t1) / 1e6d,response.headers()));return response;
}
}

自定义类,在布局中一定要记得改,包名不同!!!!!!
AddSubLayout

public class AddSubLayout extends LinearLayout implements View.OnClickListener {private TextView mAddBtn,mSubBtn;
private TextView mNumText;
private AddSubListener addSubListener;public AddSubLayout(Context context) {super(context);initView();
}public AddSubLayout(Context context, AttributeSet attrs) {super(context, attrs);initView();
}public AddSubLayout(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);initView();
}@RequiresApi(api = Build.VERSION_CODES.LOLLIPOP)
public AddSubLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);initView();
}private void initView(){//加载layout布局,第三个参数ViewGroup一定写成thisView view = View.inflate(getContext(), R.layout.car_add_sub_layout,this);mAddBtn = view.findViewById(R.id.btn_add);mSubBtn = view.findViewById(R.id.btn_sub);mNumText = view.findViewById(R.id.text_number);mAddBtn.setOnClickListener(this);mSubBtn.setOnClickListener(this);}@Override
protected void onLayout(boolean changed, int l, int t, int r, int b) {super.onLayout(changed, l, t, r, b);int width = r-l;//getWidth();int height = b-t;//getHeight();}@Override
public void onClick(View v) {int number = Integer.parseInt(mNumText.getText().toString());switch (v.getId()){case R.id.btn_add:number++;mNumText.setText(number+"");break;case R.id.btn_sub:if (number==0){Toast.makeText(getContext(),"数量不能小于0",Toast.LENGTH_LONG).show();return;}number--;mNumText.setText(number+"");break;}if (addSubListener!=null){addSubListener.addSub(number);}
}public void setCount(int count) {mNumText.setText(count+"");
}public void setAddSubListener(AddSubListener addSubListener) {this.addSubListener = addSubListener;
}public interface AddSubListener{void addSub(int count);
}
}

**

bean

**
Result

public class Result<T> {
int code;
String msg;
T data;public int getCode() {return code;
}public void setCode(int code) {this.code = code;
}public String getMsg() {return msg;
}public void setMsg(String msg) {this.msg = msg;
}public T getData() {return data;
}public void setData(T data) {this.data = data;
}
}

Shop

public class Shop {
List<Goods> list;
String sellerName;
String sellerid;
int textColor = 0xffffffff;
int background = R.color.grayblack;boolean check;public void setTextColor(int textColor) {this.textColor = textColor;
}public int getTextColor() {return textColor;
}public void setBackground(int background) {this.background = background;
}public int getBackground() {return background;
}public void setCheck(boolean check) {this.check = check;
}public boolean isCheck() {return check;
}public List<Goods> getList() {return list;
}public void setList(List<Goods> list) {this.list = list;
}public String getSellerName() {return sellerName;
}public void setSellerName(String sellerName) {this.sellerName = sellerName;
}public String getSellerid() {return sellerid;
}public void setSellerid(String sellerid) {this.sellerid = sellerid;
}
}

Goods

public class Goods implements Serializable {//        "bargainPrice": 111.99,
//            "createtime": "2017-10-14T21:39:05",
//            "detailUrl": "https:\/\/item.m.jd.com\/product\/4719303.html?  utm_source=androidapp&utm_medium=appshare&utm_campaign=t_335139774&  utm_term=QQfriends",
//            "images": "https:\/\/m.360buyimg.com\/n0\/jfs\/t9004\/210\/1160833155\/647627\/ad6be059\/59b4f4e1N9a2b1532.jpg!q70.jpg|https:\/\/m.360buyimg.com\/n0\/jfs\/t7504\/338\/63721388\/491286\/f5957f53\/598e95f1N7f2adb87.jpg!q70.jpg|https:\/\/m.360buyimg.com\/n0\/jfs\/t7441\/10\/64242474\/419246\/adb30a7d\/598e95fbNd989ba0a.jpg!q70.jpg",
//            "itemtype": 1,
//            "pid": 1,
//            "price": 118.0,
//            "pscid": 1,
//            "salenum": 0,
//            "sellerid": 17,
//            "subhead": "每个中秋都不能简单,无论身在何处,你总需要一块饼让生活更圆满,京东月饼让爱更圆满京东自营,闪电配送,更多惊喜,快用手指戳一下",
//            "title": "北京稻香村 稻香村中秋节月饼 老北京月饼礼盒655g"private double bargainPrice;
private String createtime;
private String detailUrl;
private String images;
private int num;
private int pid;
private double price;
private int pscid;
private int selected;
private int sellerid;
private String subhead;
private String title;
private int count=1;public void setCount(int count) {this.count = count;
}public int getCount() {return count;
}public double getBargainPrice() {return bargainPrice;
}public void setBargainPrice(double bargainPrice) {this.bargainPrice = bargainPrice;
}public String getCreatetime() {return createtime;
}public void setCreatetime(String createtime) {this.createtime = createtime;
}public String getDetailUrl() {return detailUrl;
}public void setDetailUrl(String detailUrl) {this.detailUrl = detailUrl;
}public String getImages() {return images;
}public void setImages(String images) {this.images = images;
}public int getNum() {return num;
}public void setNum(int num) {this.num = num;
}public int getPid() {return pid;
}public void setPid(int pid) {this.pid = pid;
}public double getPrice() {return price;
}public void setPrice(double price) {this.price = price;
}public int getPscid() {return pscid;
}public void setPscid(int pscid) {this.pscid = pscid;
}public int getSelected() {return selected;
}public void setSelected(int selected) {this.selected = selected;
}public int getSellerid() {return sellerid;
}public void setSellerid(int sellerid) {this.sellerid = sellerid;
}public String getSubhead() {return subhead;
}public void setSubhead(String subhead) {this.subhead = subhead;
}public String getTitle() {return title;
}public void setTitle(String title) {this.title = title;
}
}

**

adapter

**
LeftAdapter

public class LeftAdapter extends RecyclerView.Adapter<LeftAdapter.MyHolder> {private List<Shop> mList = new ArrayList<>();public void addAll(List<Shop> list){mList.addAll(list);
}@NonNull
@Override
public MyHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int i) {View view = View.inflate(viewGroup.getContext(), R.layout.recycler_left_item,null);MyHolder myHolder = new MyHolder(view);return myHolder;
}@Override
public void onBindViewHolder(@NonNull final MyHolder myHolder, int i) {final Shop shop = mList.get(i);myHolder.text.setText(shop.getSellerName());myHolder.text.setBackgroundResource(shop.getBackground());myHolder.text.setTextColor(shop.getTextColor());myHolder.itemView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {for (int j = 0; j <mList.size() ; j++) {mList.get(j).setTextColor(0xffffffff);mList.get(j).setBackground(R.color.grayblack);}shop.setBackground(R.color.white);shop.setTextColor(0xff000000);notifyDataSetChanged();onItemClickListenter.onItemClick(shop);//切换右边的列表}});
}@Override
public int getItemCount() {return mList.size();
}public List<Shop> getList() {return mList;
}class MyHolder extends RecyclerView.ViewHolder{TextView text;public MyHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.left_text);}
}private OnItemClickListenter onItemClickListenter;public void setOnItemClickListenter(OnItemClickListenter onItemClickListenter) {this.onItemClickListenter = onItemClickListenter;
}public interface OnItemClickListenter{void onItemClick(Shop shop);
}}

RightAdapter

public class RightAdapter extends RecyclerView.Adapter<RightAdapter.ChildHolder> {private List<Goods> mList = new ArrayList<>();public void addAll(List<Goods> list) {mList.addAll(list);
}@NonNull
@Override
public ChildHolder onCreateViewHolder(@NonNull ViewGroup viewGroup, int viewType) {View view = View.inflate(viewGroup.getContext(), R.layout.recycler_right_item, null);ChildHolder myHolder = new ChildHolder(view);return myHolder;
}@Override
public void onBindViewHolder(@NonNull ChildHolder childHolder, int position) {final Goods goods = mList.get(position);childHolder.text.setText(goods.getTitle());childHolder.price.setText("单价:" + goods.getPrice());//单价String imageurl = "https" + goods.getImages().split("https")[1];Log.i("dt", "imageUrl: " + imageurl);imageurl = imageurl.substring(0, imageurl.lastIndexOf(".jpg") + ".jpg".length());Glide.with(DTApplication.getInstance()).load(imageurl).into(childHolder.image);//加载图片childHolder.addSub.setCount(goods.getNum());//设置商品数量childHolder.addSub.setAddSubListener(new AddSubLayout.AddSubListener() {@Overridepublic void addSub(int count) {goods.setNum(count);onNumListener.onNum();//计算价格}});
}@Override
public int getItemCount() {return mList.size();
}public void clearList() {mList.clear();
}class ChildHolder extends RecyclerView.ViewHolder {TextView text;TextView price;ImageView image;AddSubLayout addSub;public ChildHolder(@NonNull View itemView) {super(itemView);text = itemView.findViewById(R.id.text);price = itemView.findViewById(R.id.text_price);image = itemView.findViewById(R.id.image);addSub = itemView.findViewById(R.id.add_sub_layout);}
}private OnNumListener onNumListener;public void setOnNumListener(OnNumListener onNumListener) {this.onNumListener = onNumListener;
}public interface OnNumListener{void onNum();
}
}

**

MainActivity

**

public class MainActivity extends AppCompatActivity implements DataCall<List<Shop>> {
private TextView mSumPrice;
private TextView mCount;
private RecyclerView mLeftRecycler,mRightRecycler;private LeftAdapter mLeftAdapter;
private RightAdapter mRightAdapter;private CartPresenter cartPresenter = new CartPresenter(this);@Override
protected void onCreate(Bundle savedInstanceState) {super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);mSumPrice = findViewById(R.id.goods_sum_price);mCount = findViewById(R.id.goods_number);mLeftRecycler = findViewById(R.id.left_recycler);mRightRecycler = findViewById(R.id.right_recycler);mLeftRecycler.setLayoutManager(new LinearLayoutManager(this));mRightRecycler.setLayoutManager(new LinearLayoutManager(this));mLeftAdapter = new LeftAdapter();mLeftAdapter.setOnItemClickListenter(new LeftAdapter.OnItemClickListenter() {@Overridepublic void onItemClick(Shop shop) {mRightAdapter.clearList();//清空数据mRightAdapter.addAll(shop.getList());mRightAdapter.notifyDataSetChanged();}});mLeftRecycler.setAdapter(mLeftAdapter);mRightAdapter = new RightAdapter();mRightAdapter.setOnNumListener(new RightAdapter.OnNumListener() {@Overridepublic void onNum() {calculatePrice(mLeftAdapter.getList());}});mRightRecycler.setAdapter(mRightAdapter);cartPresenter.requestData();
}@Override
public void success(List<Shop> data) {calculatePrice(data);//计算价格和数量mLeftAdapter.addAll(data);//左边的添加类型//得到默认选中的shop,设置上颜色和背景Shop shop = data.get(1);shop.setTextColor(0xff000000);shop.setBackground(R.color.white);mRightAdapter.addAll(shop.getList());mLeftAdapter.notifyDataSetChanged();mRightAdapter.notifyDataSetChanged();
}@Override
public void fail(Result result) {Toast.makeText(this, result.getCode() + "   " + result.getMsg(), Toast.LENGTH_LONG).show();
}/*** @author dingtao* @date 2018/12/18 7:01 PM* 计算总价格*/
private void calculatePrice(List<Shop> shopList){double totalPrice=0;int totalNum = 0;for (int i = 0; i < shopList.size(); i++) {//循环的商家Shop shop = shopList.get(i);for (int j = 0; j < shop.getList().size(); j++) {Goods goods = shop.getList().get(j);//计算价格totalPrice = totalPrice + goods.getNum() * goods.getPrice();totalNum+=goods.getNum();//计数}}mSumPrice.setText("价格:"+totalPrice);mCount.setText(""+totalNum);
}
}

仿饿了吗点餐系统,mvp+okhttp+网络请求+recycleview相关推荐

  1. vue仿饿了么点餐手机端

    vue仿饿了么点餐手机端模板,包括评论,商品,商家模块,添加商品到购物车,左侧分类计数功能,右侧滑动时分类有上推功能,小球飞入购物车功能.

  2. 2022外卖霸王餐程序、外系统霸王餐H5/APP程序源码|美团/饿了么霸王餐系统 粉丝裂变 自带账单 在线支付提现等

    2022外卖霸王餐程序.外系统霸王餐H5/APP程序源码|美团/饿了么霸王餐系统 粉丝裂变 自带账单 在线支付提现等 外卖霸王餐系统程序/H5/APP源码 2022最新霸王餐程序 霸王餐程序/H5/A ...

  3. 2021最新外卖霸王餐小程序、外系统霸王餐H5/APP程序源码|美团/饿了么霸王餐系统 粉丝裂变分销源码分享

    2021最新外卖霸王餐小程序.外系统霸王餐H5/APP程序源码|美团/饿了么霸王餐系统 粉丝裂变分销源码 外卖霸王餐系统小程序/H5/APP源码 2021最新霸王餐小程序 霸王餐小程序源码地址 成品演 ...

  4. 基于SpringBoot框架仿饿了么外卖平台系统 可二次开发带手机端后台管理

    仿饿了么外卖平台系统,带手机端后台管理. 核心框架:Spring Boot 数据库层:Spring data jpa/Spring data mongodb 数据库连接池:Druid 缓存:Ehcac ...

  5. android 高仿点餐,仿饿了吗点餐界面ListView联动的实现

    主要实现了2个ListView怎样实现互相关联,正好上篇博客review了ListView控件常规使用,因此本篇博客主要对大神的那篇博客的实现进行代码层的剖析. 一方面,方便自己,在以后的代码实现上加 ...

  6. Fragment标签页+OKHttp网络请求数据+MVP模式

    分包方式 需要的第三方依赖 Fragment 新建两个fragment MainActivity 主页面布局 设置Fragment+tablayout的适配器 Fragment标签页结束 OKHttp ...

  7. 最新外卖霸王餐系统程序源码|美团/饿了么霸王餐系统(含数据库)(可对接公众号)

    一款特别好用的霸王餐系统,搭建也特别简单,个人需要自备服务器和域名. 下面是一些系统图片: 下面是有关部分代码展示: 部分代码展示 配置数据库 <?php defined('IN_IA') or ...

  8. 仿饿了么订餐外卖系统

    "饿了么"是中国知名的在线外卖订餐平台,已覆盖中国数百个城市,数千万用户,聚集了数十万家餐饮商户."饿了么"为中国广泛地区的用户提供丰富多样.简单快捷的在线订餐 ...

  9. uni-app仿饿了么点餐界面 左右菜单联动 滚动时商家信息、广告吸顶、弹窗下滑动关闭

    1.代码如下: <template><view class="page"><!-- 顶部导航栏 --><view class=" ...

最新文章

  1. 双系统如何删除Linux
  2. 使用Gson进行json数据转换list to json 和json to list
  3. python爬虫学习第一章
  4. GC垃圾回收的三色标记算法
  5. linux获取主板温度电压_自学修电脑:常见主板报警声解析!
  6. java异常看不懂_报错了 看不懂求解
  7. 如何学习ReactJS:初学者完整指南
  8. 007API网关服务Zuul
  9. 启动Samples-Web-Start Web Server时,提示Could not open port 1080
  10. c语言+游戏破解,c语言获得键盘的按键
  11. 陈赫入场,抖音背后的决心!
  12. MyBatis中的@Mapper注解 @Mappe与@MapperScan关系
  13. 【收藏】十大Webserver漏洞扫描工具
  14. 当心!你的App 可能是山寨的
  15. 服务器ip被封一般是什么情况?
  16. JWT令牌生成与校验
  17. 微型计算机存容量基本单位,在微型计算机中,存储容量的基本单位是什么?
  18. Manifest.json文档说明
  19. IDEA 安装插件后打不开
  20. 与第三方Api接口对接需要注意的点

热门文章

  1. Android 百度地图 错误230 uid: -1 appid -1 msg: APP Scode码校验失败
  2. grpc提供http访问方式
  3. ssh连接mysql命令_ssh 命令行连接mysql数据库
  4. “快应用” VS “微信小程序” ,你挺谁?
  5. linux cat | grep 查找日志常用命令
  6. 2017网行指数报告看全国网站域名注册情况
  7. 基于SpringBoot+Vue心理咨询系统 大学生心理建设网站(附源码+文档)
  8. Minio Prefix过多导致上传文件报错:code = SlowDown, message = Please reduce your request
  9. slow down用法
  10. JS简单粗暴地实现浅克隆