本节课实现新闻点赞功能。

老规矩先使用php搭建后台接口。我们使用redis代替数据库

window下使用redis,以及phpstudy如何添加redis的扩展,请参考以下教程

注意,是否为NTS版本、x64或x86 都可以在phpinfo()中查到。尤其是后者不是根据你的电脑系统决定的。而是根据php决定的。

安装之后重启apache服务,然后在WWW/i.php中查看模块是否存在,也可以在php.exe -m 查看 是否存在 redis和igbinary 扩展

《phpstudy + redis 搭建教程》: http://blog.csdn.net/tianjingang1/article/details/68491369

《php_redis.dll 资源下载》:http://windows.php.net/downloads/pecl/releases/redis/2.2.7/

《php_igbinary.dll 资源下载》: http://pecl.php.net/package/igbinary

《window版redis下载地址》:https://github.com/ServiceStack/redis-windows/raw/master/downloads/redis-latest.zip

《redis使用教程》:http://www.cnblogs.com/CyLee/p/7193278.html

news.php的代码:

<?php
header("Access-Control-Allow-Origin:*"); 
header('Access-Control-Allow-Headers:x-requested-with,content-type'); 

$redis = new Redis();
$redis->connect("127.0.0.1", 6379);

function agree($newsid) {
    global $redis;
    $get_num = $redis->hget("newsagree", "news".$newsid);

    if ($get_num)
        $get_num++;
    else
        $get_num = 1;

    $redis->hset("newsagree", "news".$newsid, $get_num);
    return $get_num;
}

function getAgree($newsid) {
    global $redis;
    $get_num = $redis->hget("newsagree", "news".$newsid);

    if($get_num)
        return $get_num;
    else
        return 0;
}


// 代表点赞, 要为新闻的点赞数++
if (isset($_POST["newsid"])) {   
    $agreeNum = agree($_POST["newsid"]);
    $arr = array("status" => "success", "agree" => $agreeNum);
    $strjson = json_encode($arr);   
    exit($strjson);
}

// 代表获取新闻点赞数
if (isset($_GET["newsid"])) { 
    $agreeNum = getAgree($_GET["newsid"]);
    $arr = array("agree" => $agreeNum);
    $strjson = json_encode($arr);   
    exit($strjson);
}

exit("");

main.js的代码:

使用了一个小工具qs插件,需要先安装一下: yarn add qs

import React from 'react';
import ReactDOM from 'react-dom'
import axios from "axios"
import qs from 'qs'

class News extends React.Component {
    constructor (props) {
        super(props)
        this.state = {
            agreeNum: 0
        }
    }
    agreeSubmit (obj) {
        axios.post("http://localhost:8080/news.php", qs.stringify({
            newsid: obj.props.newsid  
        })).then(res => {
            this.setState({
                agreeNum: res.data.agree
            })
        })
    }
    componentWillMount () {
        axios.get("http://localhost:8080/news.php", {
            params: {
                newsid: this.props.newsid
            }
        }).then(res => {
            this.setState({
                agreeNum: res.data.agree
            })
        })
    }
    render () {
        return <div>
            <h1>这是一篇新闻,新闻ID是101</h1>
            <h2>{ this.state.agreeNum }</h2>
            <input type = "button" value = "我要点赞" onClick = {() => {
                this.agreeSubmit(this)
            }}/>
        </div>
    }
}

ReactDOM.render(
    <News newsid = '101' />,
    document.getElementById('root')
);

利用 qs.stringify({ newsid: obj.props.newsid }), 将对象转化为a=1&b=2&c=3 这样的字符串数据格式。

这样一来,请求方式自动转换以 application/x-www-form-urlencoded 方式提交。这也是推荐的一种提交方式。

这样做的好处是,php默认是识别 application/x-www-form-urlencoded 方式提交的数据的,可以方便的通过$_POST获取并操作。

另一方面,axios 默认的post提交方式是 application/json ,php默认不识别这种方式提交的数据,所以$_POST是获取不到的,需要先使用必须使用 $GLOBALS['HTTP_RAW_POST_DATA'] 取出来,然后再使用 json_decode() 转换获取才可以。

具体可以参考这篇文章:http://www.cnblogs.com/CyLee/p/7644380.html

所以,为了避免这个麻烦,建议手动配置 axios 的 header 为 application/x-www-form-urlencoded 方式提交:

axios.defaults.headers.post['Content-Type'] = 'application/x-www-form-urlencoded';

results matching ""

    No results matching ""