tags: 耳朵_android
最终效果图:
之前已经登录成功, 并将cookie保存至本地, 今天的内容有点多, 需要完成文章的评论、收藏以及分享功能。
如果你的后台已经能给你提供满足上述功能的所有接口, 那自行跳过这一段. 目前 http://ear.life 采用的是WordPress搭建的网站, 评论的接口是有的, 但收藏并没有提供, 我们可以配合着WP Favorite Posts来使用.
先进后台去添加并配置WP Favorite Posts,
简单配置后可以在web端看到收藏的按钮了:
可是它并没有为我们提供供APP调用的API, 那我们就自己写一个:
先查一下数据库, 看看WP Favorite Posts保存数据的位置在哪:
后面的meta_value里的176、172、178这些其实就是我们文章的post_id了,
OK, 知道了它的位置, 我们自己写一个接口放出来:
下面代码为PHP:
public function get_favorite(){
global $json_api;
//首先对cookie进行验证
if (!$json_api->query->cookie) {
$json_api->error("You must include a 'cookie' var in your request. Use the `generate_auth_cookie` Auth API method.");
}
$user_id = wp_validate_auth_cookie($json_api->query->cookie, 'logged_in');
if (!$user_id) {
$json_api->error("Invalid authentication cookie. Use the `generate_auth_cookie` method.");
}
//接着查找收藏的所有postid
$post_ids = array();
if($result = mysql_query(" SELECT `meta_value` FROM `wp_usermeta` WHERE `meta_key` = 'wpfp_favorites' AND `user_id` = " .$user_id)){
while ($row = mysql_fetch_array($result, MYSQL_BOTH)) {
$str = substr($row[0], 4);
$str = explode(";",$str);
foreach ($str as $key => $value) {
if(strstr($value, "s:3:")){
$temp = strtr($value, array("s:3:" => "", '"' => ""));
$post_ids[count($post_ids)] = $temp;
}
}
}
$str_ids = "";
foreach ($post_ids as $id) {
$str_ids = $str_ids.",".$id;
}
$str_ids = substr($str_ids, 1);
//最后查询所有postid的信息并返回
if($result = mysql_query("SELECT `ID`, `post_date`, `post_title` FROM `wp_posts` WHERE `post_status` = 'publish' AND `post_password` = '' AND `ID` IN (".$str_ids.") ")){
$results = array();
while ($row = mysql_fetch_assoc($result)) {
$results[] = $row;
}
return array(
'status' => 'ok',
'msg' => "",
'list' => $results
);
}
// 关闭连接
mysql_free_result($result);
}else{
echo mysql_error();
}
}
OK, 如果没出意外的话可以看到接口列表处已经多了一个get_favorite,
现在我们请求了看一看, 为了节省资源我这里只返回了id、data和title, 并且没有对分页加载做处理, 后面可以根据需求再来修改.
正常的查询出来了... 呃, 我怎么感觉不像在做APP反而像写接口了... 后面还要加上收藏和取消收藏的接口, 这里直接上图, 步骤略过, 不然观众都没兴趣了.
花了点时间, 为WordPress增加了get_favorite、get_favorite_ids和post_favorite三个接口, 现在我们来尽情的使用它吧.
回到ArticleDetailActivity, 首先是评论, 评论需要判断是否登录, 否则的话跳至登录界面:
tv_comment.onClick {
if (!App.checkCookie(this)) {
return@onClick
}
showComment("", "请输入评论内容")
}
其次是刚刚添加的收藏功能:
iv_collect.onClick {
if (!App.checkCookie(this)) {
return@onClick
}
val params = App.createParams
params.put("json", "user/post_favorite")
params.put("post_id", article!!.id!!)
params.put("doAction", true)
showLoading()
HMRequest.go<FavoriteModel>(params = params, activity = this) {
cancelLoading()
iv_collect.setImageResource(if (it!!.after) R.drawable.icon_collected else R.drawable.icon_collect)
}
}
OK, 最后在onResume事件中记得查一查收藏的状态, 避免跳转登录后没有及时刷新:
override fun onResume() {
super.onResume()
webView?.onResume()
//先查查当前是否已经收藏过
if (App.cookie != null && article != null) {
val params = App.createParams
params.put("json", "user/post_favorite")
params.put("post_id", article!!.id!!)
HMRequest.go<FavoriteModel>(params = params) {
iv_collect.setImageResource(if (it!!.before) R.drawable.icon_collected else R.drawable.icon_collect)
}
}
}
好了, 跑起来看一看,效果已经实现了.
github: https://github.com/bxcx/ear
本节分支: https://github.com/bxcx/ear/tree/comment