No description, website, or topics provided.
Branch: master
Clone or download
Fetching latest commit…
Cannot retrieve the latest commit at this time.
Permalink
Type Name Latest commit message Commit time
Failed to load latest commit information.
app
gradle/wrapper
pic
.gitignore
LICENSE
README.md
build.gradle
gradle.properties
gradlew
gradlew.bat
settings.gradle

README.md

DroiBaaSDemo-Android

本项目展示的是 DroiBaaS 相关功能

业务需求

一、用户系统

  1. 建立用户系统
  2. 提供注册/登录功能
  3. 修改密码
  4. 上传头像/显示头像

二、首页banner展示

在首页展示一些banner信息用于活动推广等作用
效果图如下:
mian

三、app信息list展示

在不同的界面展示不同的app list

四、搜索app功能

用关键字对应用进行简单的筛选

五、其他功能

其他功能主要放在我的页面中:登录功能入口、版本更新、用户反馈等。
我的页面效果图如下:
mian

自更新效果图如下:
mian

方案选择

传统方案

传统方案需要服务端与客户端开发人员进行沟通,确定交互数据的协议格式。
服务端负责:搭建业务服务器,进行服务端逻辑代码的编写,提供数据api接口给客户端调用。
客户端负责:编写界面,使用api接口从服务端读取数据进行数据交互。

DroiBaaS方案

一、用户系统

  1. DroiBaaS提供了DroiUser类来帮助开发者建立用户系统 在这里介绍通过继承的方式使用DroiUser,这里我创建了一个类MyUser继承于DroiUser,在这个类中添加一些我们需要的属性,比如:address、headIcon等

    public class MyUser extends DroiUser {
        @DroiExpose
        private String address;
        @DroiExpose
        private DroiFile headIcon;
    
        public String getAddress() {
            return address;
        }
        public void setAddress(String address) {
            this.address = address;
        }
        public DroiFile getHeadIcon() {
            return headIcon;
        }
        public void setHeadIcon(DroiFile headIcon) {
            this.headIcon = headIcon;
        }
    }
  2. 注册用户

    DroiUser user = new DroiUser();
    user.setUserId(email);
    user.setPassword(password);
    user.signUpInBackground(new DroiCallback<Boolean>() {
        @Override
        public void result(Boolean aBoolean, DroiError droiError) {
            showProgress(false);
            if (droiError.isOk()) {
                // 注册成功
            } else {
                // 注册失败,可以通过 droiError.getCode 获取错误码
            }
        }
    });
  3. 登录

    DroiUser.loginInBackground(email, password, MyUser.class, new DroiCallback<DroiUser>() {
        @Override
        public void result(DroiUser droiUser, DroiError droiError) {
            showProgress(false);
            if (droiError.isOk()) {
                // 登录成功
            } else {
                // 登录失败,可以通过 droiError.getCode 获取错误码
            }
        }
    });
  4. 修改密码

    String oldPassword = "oldPassword";
    String newPassword = "newPassword";
    // 一般从EditText获得
    DroiUser myUser = DroiUser.getCurrentUser();
    if (myUser != null && myUser.isAuthorized() && !myUser.isAnonymous()) {
        myUser.changePasswordInBackground(oldPassword, newPassword, new DroiCallback<Boolean>() {
            @Override
            public void result(Boolean aBoolean, DroiError droiError) {
                if (aBoolean) {
                    // 修改成功
                } else {
                    // 修改失败
                }
            }
        });
    }
  5. 上传头像

    DroiFile headIcon = new DroiFile(new File(path)); //path 是图片路径
    MyUser user = DroiUser.getCurrentUser(MyUser.class);
    user.setHeadIcon(headIcon);
    user.saveInBackground(new DroiCallback<Boolean>() {
        @Override
        public void result(Boolean aBoolean, DroiError droiError) {
            if (aBoolean) {
                // 上传成功
            } else {
                // 上传失败
            }
        }
    });
  6. 显示头像

    MyUser user = DroiUser.getCurrentUser(MyUser.class);
    if (user != null && user.isAuthorized() && !user.isAnonymous()) {
        if (user.getHeadIcon() != null) {
            user.getHeadIcon().getUriInBackground(new DroiCallback<Uri>() {
                @Override
                public void result(Uri uri, DroiError droiError) {
                    if (droiError.isOk()){
                        // 加载头像
                    }
                }
            });
        }
    }

二、首页banner展示

通过DroiBaaS的web控制台可以创建Banner类,并且可以通过增加列的方式增加属性。 可以通过增加行的方式来添加一条数据。 然后需要在客户端创建一个类来对应于DroiBaaS云端的数据,如下:

public class Banner extends DroiObject {
    @DroiExpose
    private String appId;
    @DroiExpose
    private String imgUrl;

    public void setAppId(String appId) {
        this.appId = appId;
    }
    public void setImgUrl(String imgUrl) {
        this.imgUrl = imgUrl;
    }
    public String getImgUrl() {
        return imgUrl;
    }
    public String getAppId() {
        return appId;
    }
}

在客户端可以通过DroiQuery来查询保存在云端的数据,并且进行展示:

DroiQuery query = DroiQuery.Builder.newBuilder().limit(4).query(Banner.class).build();
query.runQueryInBackground(new DroiQueryCallback<Banner>() {
    @Override
    public void result(List<Banner> list, DroiError droiError) {
        if (droiError.isOk() && list.size() >0) {
            // 通知 view 更新
        } else {
            // 做请求失败处理
        }
    }
});

三、app信息list展示

Banner一样也需要通过DroiBaaS的web控制台可以创建AppInfo类,并且可以通过增加列的方式增加属性。 可以通过增加行的方式来添加一条数据。 然后需要在客户端创建一个类来对应于DroiBaaS云端的数据,如下:

public class AppInfo extends DroiObject {
    @DroiExpose
    private String appId;
    @DroiExpose
    private String icon;
    @DroiExpose
    private String name;
    @DroiExpose
    private int count;
    @DroiExpose
    private int rating;
    @DroiExpose
    private int size;
    @DroiExpose
    private String intro;
    @DroiExpose
    private String brief;
    @DroiExpose
    private String version;
    @DroiExpose
    private String apkUrl;
    @DroiExpose
    private String type;
    @DroiExpose
    private String mainType;
    @DroiExpose
    private String imageUrl;
    // setter/getter方法不列出
}

接下来在客户端可以通过DroiQuery来查询保存在云端的数据,并且进行展示:

DroiQuery query = DroiQuery.Builder.newBuilder().limit(10).offset(indexNum * 10).query(AppInfo.class).build();
/* 可以给查询设置不同的查询条件,查询不同类别的app等。
DroiCondition cond = DroiCondition.cond("mainType", DroiCondition.Type.EQ, "app");
DroiQuery query = DroiQuery.Builder.newBuilder().limit(10).offset(indexNum * 10).query(AppInfo.class).where(cond).build();
*/
query.runQueryInBackground(new DroiQueryCallback<AppInfo>() {
    @Override
    public void result(List<AppInfo> list, DroiError droiError) {
        refreshing = false;
        if (droiError.isOk() && list.size() >0) {
            // 通知 view 更新
        } else {
            // 做请求失败处理
        }
    }
});

四、搜索app功能

这个功能用来根据关键字进行一些简单的筛选,同样是通过DroiQuery来查询。

// 通过Condition对字段的字符串进行一些筛选
DroiCondition cond = DroiCondition.cond("name", DroiCondition.Type.CONTAINS, appName);
DroiCondition cond1 = DroiCondition.cond("brief", DroiCondition.Type.CONTAINS, appName);
DroiQuery = DroiQuery.Builder.newBuilder().limit(10).offset(indexNum * 10).query(AppInfo.class).where(cond.or(cond1)).build();
query.runQueryInBackground(new DroiQueryCallback<AppInfo>() {
    @Override
    public void result(List<AppInfo> list, DroiError droiError) {
        refreshing = false;
        if (droiError.isOk() && list.size() >0) {
            // 通知 view 更新
        } else {
            // 做请求失败处理
        }
    }
});

五、其他功能

其他一些功能可以通过在我的页面点击按钮来调用,也有一些功能可以在初始化时添加。

  1. 版本更新 在此工程中,总共在两处添加版本更新sdk。 一次是在应用进入时,在入口activity的onCreate中,添加了如下代码:

    DroiUpdate.update(this);

    还有一次是在我的页面中,通过手动点击的方式调用:

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            // 其他case
            case R.id.mine_frag_update:
                //手动更新
                DroiUpdate.manualUpdate(mContext);
                break;
        }
    }
  2. 意见反馈 我们需要通过意见反馈来知道用户对应用的评价,通过点击进入反馈sdk的界面:

    @Override
    public void onClick(View v) {
        switch (v.getId()) {
            // 其他case
            case R.id.mine_frag_update:
                //手动更新
                DroiFeedback.callFeedback(mContext);
                break;
        }
    }
  3. 消息推送 通过消息推送增加应用的日活,方便活动的推广等。只需在Application中添加一行代码即可实现:

    DroiPush.initialize(this);