Android开发一个美食app

系统软件介绍

该软件是一款购买美食的app,名字叫做Cateapp,主要面向于大众群体。

具有用户注册账号和登录功能,没有登录的用户只能查看app上的展示内容,不能对食物商品进行下单

。用户登录之后可以进行对食物商品下单,下单之后可以查看下单记录。如果用户对商品有什么问页在app里边联系客服。

系统实现方案

主要使用Fragment+ViewPager2技术实现主页面的左右滑动屏幕翻页效果;

实现点击底部4个导航选项切换或加载对应的页面;实现点击底部4个选项同时导航颜色做相应变化。

然后通过RecyclerView控件,实现一些列表图片的展示及刷新。通过Intent 启动组件,在组件之间传递信息和页面转换。

通过SQLite数据库存储用户的下单信息,和通过SharedPreferences来保存注册的账号信息

。使用多线程来实现一些图片的异步刷新和启动页的停留。

源码下载:https://download.csdn.net/download/qq_44716544/17860514

或者私聊我拿

 

桌面图标

 

 

 代码目录

 

图片展示:

第二个页面,登录页,注册页

主页面:

        

联系客服

 

 

 

              

 

 

关键代码

启动页:

pActivity.this.runOnUiThread(new Runnable() { //调用主线程
                    @Override
                    public void run() {
                       t.setText(s[n]);        //刷新代码
                        n++;
                    }
                });
                try {
                    Thread.sleep(1000);                         //暂停100毫秒
            if(n==3){
                Intent it=new Intent(StartupActivity.this,LoginActivity.class);
                startActivity(it);
                finish();
            }
                } catch (Exception e) {
                }

        }
    }


}).start();

第二个页面,登录页

if(s.equals("")||s2.equals("")) {
            Toast.makeText(LoginActivity.this,"账号或密码不能为空",Toast.LENGTH_SHORT).show();
        }
if(s.equals(account)&&s2.equals(password)){
//    Toast.makeText(LoginActivity.this,"登录成功",Toast.LENGTH_SHORT).show();
  Intent i=new Intent();
  i.setClass(LoginActivity.this,MainActivity.class);//设置跳转的界面
    i.putExtra("account",s);
    i.putExtra("state","已登录");
    startActivity(i);
    finish();

}
        if(!s.equals(account)||!s2.equals(password)){
            Toast.makeText(LoginActivity.this,"账号或密码不正确",Toast.LENGTH_SHORT).show();
        }

主页面

final List<Fragment> list=new ArrayList<>();
        list.add(new NewFragment());
        list.add(new ProducstFragment());
        list.add(new SettlementFragment());
        list.add(new UserFragment());

        vp=findViewById(R.id.viewPager);               //获得ViewPager2控件
//设置预加载的Fragment页面数量,可防止流式布局StaggeredGrid数组越界错误。
        vp.setOffscreenPageLimit(list.size() - 1);                                                                                                             //设置适配器
        FragmentStateAdapter adapter=new FragmentStateAdapter(MainActivity.this) {
            @NonNull
            @Override
            public Fragment createFragment(int position) {
                return list.get(position);
            }
            @Override
            public int getItemCount() {
                return list.size();
            }
        };

        vp.setAdapter(adapter);                     //把适配器添加给ViewPager2
    }
new Thread(new Runnable() {
    @Override
    public void run() {
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if((image.length!=0)&&(text.length!=0)){
                    holder.iv.setImageResource(image[position]);
                    holder.tv.setText(text[position]);
                }
            }
        });
    }
}).start();
holder.tv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String s=  holder.tv.getText().toString();//获取被点击的文字
        Intent i=new Intent();
        i.setClass(activity, NewActivity.class);//设置跳转的界面
        i.putExtra("name",s);

       // Toast.makeText(activity,s,Toast.LENGTH_SHORT).show();
        activity.startActivity(i);
        //点击左列表选项,加载对应右列表数据。
      //  ProducstFragment.rightrv.setAdapter(new ProductRightAdapter(activity, ProducstFragment.list.get(position)));
    }
});
holder.iv.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        String s=  holder.tv.getText().toString();//获取被点击的文字
        Intent i=new Intent();
        i.setClass(activity, NewActivity.class);//设置跳转的界面
        i.putExtra("name",s);

        // Toast.makeText(activity,s,Toast.LENGTH_SHORT).show();
        activity.startActivity(i);
        //点击左列表选项,加载对应右列表数据。
        //  ProducstFragment.rightrv.setAdapter(new ProductRightAdapter(activity, ProducstFragment.list.get(position)));
    }
});
new Thread(new Runnable() {
    @Override
    public void run() {
        activity.runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if((list.size()!=0)){
                    holder.iv.setImageResource(product.getImage());
                    holder.nametv.setText(product.getName());
                    holder.pricetv.setText(" "+product.getPrice());
                }
            }
        });
    }
}).start();
//点击选项里的添加按钮要执行的操作
holder.bt.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        //如果已选的小吃数据集合里没有该小吃
        if(!app.selectedproduct.contains(list.get(position))){
            product.setNumber(1);            //设置数量
            app.selectedproduct.add(product);  //添加当前选项数据到集合
            //添加当前选项价格到总价
            app.countprice +=Double.parseDouble(product.getPrice());
            Toast.makeText(activity,"添加成功",Toast.LENGTH_SHORT).show();
        }else{                              //如果已选的小吃数据集合里已有该小吃
            Toast.makeText(activity,"已经有了",Toast.LENGTH_SHORT).show();
        }
    }
});

新品页面

 

 Intent intent=getIntent();
    String name=intent.getStringExtra("name");//获取菜名

    for(int i=0;i<text.length;i++){

        if(text[i].equals(name)){
           position=i;
           break;
    }


    }
  // Toast.makeText(NewActivity.this,text.length,Toast.LENGTH_SHORT).show();
    ImageView foodimage=findViewById(R.id.foodimage);
    foodimage.setImageResource(image[position]);//设置食物图片
    TextView  foodid=findViewById(R.id.foodid);
    foodid.setText(text[position]);

   foodname=findViewById(R.id.foodname);
    foodname.setText(text2[position]);
}
Button buttonorder=findViewById(R.id.buttonorder);
buttonorder.setOnClickListener(new View.OnClickListener() {
    @Override
    public void onClick(View view) {
        app = (AppData) NewActivity.this.getApplication();              //获得全局类
        if (app.check.equals("已登录")) {
            if (num >= 1) {
                String pricesum2 = Integer.toString(pricesum);
                //获取菜名,价格,数量,并添加的集合里。
                Product product = new Product();
                product.setImage(image[position]);
                product.setName(text[position]);
                product.setPrice(pricesum2);
                product.setNumber(num);


                app.countprice = pricesum;
                app.selectedproduct.add(product);  //添加当前选项数据到集合
                Toast.makeText(NewActivity.this, "下单成功", Toast.LENGTH_SHORT).show();
               // save();
            } else {
                Toast.makeText(NewActivity.this, "你还没有选择数量", Toast.LENGTH_SHORT).show();
            }
        } else {

            Toast.makeText(NewActivity.this, "你还没有登录,请先登录", Toast.LENGTH_SHORT).show();
        }
    }
});

购买记录页面

app = (AppData) RecordActivity.this.getApplication();              //获得全局类
 //  Toast.makeText(RecordActivity.this, app.account+"message", Toast.LENGTH_SHORT).show();
MyHelper helper=new MyHelper(RecordActivity.this,app.account+".db",null,1);
   SQLiteDatabase  db=helper.getReadableDatabase();
   Cursor cursor=db.query("information",null,null,null,null,null,null);
  if(cursor.getCount()!=0){
       while (cursor.moveToNext()){

             String _id = cursor.getString(cursor.getColumnIndex("_id"));
             String image = cursor.getString(cursor.getColumnIndex("image"));
             String name = cursor.getString(cursor.getColumnIndex("name"));
             String price = cursor.getString(cursor.getColumnIndex("price"));
             String time1 = cursor.getString(cursor.getColumnIndex("time1"));
             name2[num]=name;
             image2[num]=image;
             price2[num]=price;
             time2[num]=time1;
             num++;
        //   Toast.makeText(RecordActivity.this, app.account+"message"+message[0], Toast.LENGTH_SHORT).show();
       }
       cursor.close();
   }

联系客服页面


     * 判断是否有某项权限
     * @param string_permission 权限
     * @param request_code 请求码
     * @return
     */
    public boolean checkReadPermission(String string_permission,int request_code) {
        boolean flag = false;
        if (ContextCompat.checkSelfPermission(getActivity(), string_permission) == PackageManager.PERMISSION_GRANTED) {//已有权限
            flag = true;
        } else {//申请权限
            ActivityCompat.requestPermissions(getActivity(), new String[]{string_permission}, request_code);
        }
        return flag;
    }

    /**
     * 检查权限后的回调
     * @param requestCode 请求码
     * @param permissions  权限
     * @param grantResults 结果
     */
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case REQUEST_CALL_PERMISSION: //拨打电话
                if (permissions.length != 0 && grantResults[0] != PackageManager.PERMISSION_GRANTED) {//失败
                    Toast.makeText(getActivity(),"请允许拨号权限后再试",Toast.LENGTH_SHORT).show();
                } else {//成功
                    call("tel:"+"10086");
                }
                break;
        }
    }

    /**
     * 拨打电话(直接拨打)
     * @param telPhone 电话
     */
    public void call(String telPhone){
        if(checkReadPermission(Manifest.permission.CALL_PHONE,REQUEST_CALL_PERMISSION)){
            Intent intent = new Intent(Intent.ACTION_CALL, Uri.parse(telPhone));
            startActivity(intent);
        }
    }
}

 

目录 第1章 概要 8 1.1. 文档目的 8 1.2. 文档范围 8 1.3. 参考文献 8 第2章 产品介绍 9 2.1. 产品定义 9 2.1.1. 产品描述 9 2.1.2. 起源及发展条件 9 2.1.3. 产品logo设计 10 2.1.4. 产品发展目标 10 2.2. 开发背景及必要性 10 2.3. 主要功能 10 2.4. 特色服务 19 2.4.1. 特色服务-精品化推荐 19 2.4.2. 专家化定位 19 2.4.3. 精细化评分 19 2.4.4. 特色服务-地图 20 2.4.5. 特色服务-在线订餐 20 2.4.6. 特色服务-摇一摇 21 2.4.7. 特色服务-语音识别 21 2.5. 辐射范围 21 2.6. 建设意义 21 第3章 盈利模式与商业价值 22 3.1. 盈利模式 22 3.1.1. 佣金收入 22 3.1.2. 线下服务 22 3.1.3. 无线增值 22 3.1.4. 网络广告 22 3.2. 成本效益分析 23 3.3. 投资与经营预测 24 3.4. 商业价值 25 第4章 竞争对手及产品分析 25 4.1. APP产品市场分析 25 4.1.1. 市场规模 26 4.1.2. 市场结构 27 4.2. 目标市场的设定 28 4.2.1. 影响APP产品市场需求的主要因素 28 4.2.2. APP产品市场发展阶段 28 4.2.3. APP产品市场趋势预测和市场机会 29 4.3. 竞争对手产品分析 30 4.3.1. 豆果美食 30 4.3.2. 特有服务 31 4.3.3. 优点 32 4.3.4. 缺点 32 4.3.5. 盈利点 33 4.4. 大众点评 33 4.4.1. 特有服务 34 4.4.2. 优点 35 4.4.3. 缺点 36 4.4.4. 盈利点 37 4.5. 好豆菜谱 38 4.5.1. 特有服务 38 4.5.2. 优点 39 4.5.3. 缺点 41 4.5.4. 盈利点 41 4.6. 下厨房 41 4.6.1. 特有服务 42 4.6.2. 优点 42 4.6.3. 缺点 44 4.6.4. 盈利点 44 4.7. 食神摇摇 44 4.7.1. 特有服务 45 4.7.2. 优点 45 4.7.3. 缺点 47 4.7.4. 盈利点 47 第5章 建设方案 48 5.1. 总体设计 48 5.1.1. 整体架构 48 5.2. 平台门户建设 49 5.3. 建设原则 49 5.3.1. 前瞻性 49 5.3.2. 人性化 49 5.3.3. 可靠性 49 5.3.4. 开放性 50 5.3.5. 可维护性 50 5.3.6. 拓展性 50 5.4. 整体建设规划 50 5.4.1. 需求概述 50 5.4.2. 建设目标 51 5.4.3. 延展系统 51 5.5. 社交平台运营推广方案 51 5.5.1. 微信公共账号管理平台(详见第六章) 51 5.5.2. 智能客服 51 5.5.3. 增值工具 51 5.5.4. 会员管理 52 第6章 微信平台建设方案 52 6.1. 微信的发展 52 6.2. 微信订阅号和服务号 52 6.2.1. 微信订阅号 52 6.2.2. 微信服务号 53 6.3. 微信公众账号的核心功能 53 6.3.1. 自助问答类 53 6.3.2. 帮助系统 54 6.3.3. 其他引导性关键词 54 6.3.4. 会员服务 54 6.3.5. 自助查询类 54 6.3.6. 活动类服务 55 6.3.7. 其他特色类 55 6.4. 微信公众号设计 56 6.4.1. 会员服务 56 6.4.2. 产品介绍 56 6.4.3. 活动展示 57 6.4.4. 商家推荐 57 6.4.5. 微信支付 57 6.4.6. 便民查询 60 第7章 APP移动互联的建设方案 61 7.1. APP功能与界面设计 61 7.1.1. 客户端启动 61 7.1.2. 首页设计 61 7.1.3. 菜单指南 61 7.1.4. 智能导航 61 7.1.5. 语音解说 61 7.1.6. 活动速览 61 7.1.7. 分享互动 61 7.1.8. 会员和积分管理 61 7.1.9. 系统设置 61 7.1.10. 导览界面 61 7.1.11. 模式设置 61 7.1.12. 查询功能 61 7.2. APP后台管理 61 7.2.1. 后台功能管理 61 7.2.2. 应用内容管理 62 第8章 运营 62 8.1. 市场概述 62 8.2. 运营定位 62 8.2.1. 以企助建,促进平台业务快速发展 62 8.2.2. 整合各类业务的整合营销平台,节省营销成本,提升效益 63 8.2.3. 借助平台培养用户使
评论 22
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值