手机版
扫描查看手机站
首页 > 文章 > 站长收藏 > 正文

第三课,以博客为例配置strapi后端与next.js对接

时间:2025-11-10 08:59:29来源:525游



Strapi 后端:
已安装并运行 Strapi(http://localhost:1337)。

已创建 articles 内容类型,包含字段:title(Text)、content(Rich Text)、slug(Text,唯一,选填,用于 SEO 优化)。

已配置好权限:Articles 的 find 和 findOne 权限设置为公开,create 权限需要认证。

示例数据:id: 4, documentId: "nbedxv11g6sdbxvnsdjxs48n", title: "hello world,test2", content: [...]。

Next.js 前端:
已创建 Next.js 项目(位于 C:\Node\test-example\packages\website)。

已安装必要的依赖:axios。


下面我们来操作具体的执行步骤

1. 安装 axios

cd C:\Node\test-example\packages\website

安装 axios  npm install axios  

安装后,检查 node_modules/axios 是否存在。

确认 package.json 中的 dependencies 包含:


"dependencies": {
  "axios": "^1.8.3",
  "next": "15.2.1",
  "react": "^19.0.0",
  "react-dom": "^19.0.0"
}


2、在website 目录下创建以下文件夹和文件:


win10创建文件夹命令符:



# 创建目录
mkdir app\articles app\articles\[id] app\login app\register app\create-article components context utils

# 创建文件
echo. > app\articles\[id]\page.js
echo. > app\login\page.js
echo. > app\register\page.js
echo. > app\create-article\page.js
echo. > components\AuthWrapper.js
echo. > components\Navbar.js
echo. > context\AuthContext.js
echo. > utils\api.js
echo. > next.config.mjs

运行上述命令后,目录结构应与第 1 步描述一致。app/layout.js 和 app/page.js 由 Next.js 自动生成,其他文件已手动创建。

现在整个目录,应该是下面这样的


test-example/packages/website/
├── app/
│   ├── articles/
│   │   ├── [id]/
│   │   │   └── page.js        # 文章详情页面,动态路由,显示具体文章内容
│   ├── login/
│   │   └── page.js            # 登录页面,处理用户登录
│   ├── register/
│   │   └── page.js            # 注册页面,处理用户注册
│   ├── create-article/
│   │   └── page.js            # 创建文章页面,处理文章发布
│   ├── layout.js              # 根布局文件,包含全局导航
│   └── page.js                # 首页,显示文章列表
├── components/                # 组件目录
│   ├── AuthWrapper.js         # 认证包装组件,提供 AuthContext
│   └── Navbar.js              # 导航组件,动态显示导航链接
├── context/                   # 上下文目录(新建)
│   └── AuthContext.js         # 认证上下文,管理用户状态
├── utils/                     # 工具函数目录
│   └── api.js                 # API 请求工具,封装与 Strapi 的交互
├── public/                    # 静态资源目录(Next.js 默认生成)
│   ├── favicon.ico
│   └── ...
├── styles/                    # 样式目录(Next.js 默认生成)
│   ├── globals.css            # 全局样式
│   └── Home.module.css        # 模块化样式(可选)
├── package.json               # 项目依赖和脚本
├── next.config.mjs            # Next.js 配置文件(新建)
└── README.md                  # 项目说明

文件说明


app/page.js:首页,显示文章列表,调用 getArticles 获取数据。

app/articles/[id]/page.js:文章详情页,动态路由,根据 documentId 获取具体文章。

app/login/page.js:登录页面,处理用户登录。

app/register/page.js:注册页面,处理用户注册。

app/create-article/page.js:创建文章页面,允许登录用户发布文章。

app/layout.js:根布局文件,包含全局导航,使用 AuthWrapper 和 Navbar 组件。

components/AuthWrapper.js:认证包装组件,提供 AuthContext。

components/Navbar.js(新建):导航组件,动态渲染导航链接。

context/AuthContext.js(新建):认证上下文,管理用户登录状态和 token。

utils/api.js:封装 API 请求,与 Strapi 后端交互。

styles/globals.css:全局样式,简单美化页面。

next.config.mjs(新建):Next.js 配置文件,调整配置以支持项目运行。






3. 具体新建文件内容、作用和功能说明

3.1 app/layout.js

作用:根布局文件,定义全局布局,包含导航。


import AuthWrapper from '../components/AuthWrapper';
import Navbar from '../components/Navbar';
import '../styles/globals.css';

export default function RootLayout({ children }) {
  return (
    <html lang="en">
      <body>
        <AuthWrapper>
          <Navbar />
          {children}
        </AuthWrapper>
      </body>
    </html>
  );
}

功能说明:
使用 AuthWrapper 组件提供认证上下文。使用 Navbar 组件渲染导航栏。引入全局样式 globals.css。




3.2 app/page.js
作用:首页,显示文章列表


'use client';
import { useEffect, useState } from 'react';
import Link from 'next/link';
import { getArticles } from '../utils/api';

export default function Home() {
  const [articles, setArticles] = useState([]);
  const [isLoading, setIsLoading] = useState(true);
  const [error, setError] = useState(null);

  useEffect(() => {
    const fetchArticles = async () => {
      try {
        const response = await getArticles();
        console.log('Full API Response:', response);
        console.log('Response Data:', response.data);
        const articlesData = response.data?.data || response.data; // 处理嵌套
        if (Array.isArray(articlesData)) {
          setArticles(articlesData);
        } else {
          setArticles([]);
          setError('No articles data found in API response');
        }
      } catch (err) {
        console.error('Fetch Articles Error:', err);
        setError('Failed to fetch articles');
        setArticles([]);
      } finally {
        setIsLoading(false);
      }
    };
    fetchArticles();
  }, []);

  if (isLoading) {
    return <div className="container">Loading...</div>;
  }

  if (error) {
    return <div className="container">Error: {error}</div>;
  }

  return (
    <div className="container">
      <h1>Articles</h1>
      <div className="article-list">
        {articles.length === 0 ? (
          <p>No articles found.</p>
        ) : (
          articles.map((article) => {
            console.log('Article Object:', article);
            return (
              <div key={article.id} className="article-card">
                <Link href={`/articles/${article.documentId}`}>
                  <h2>{article.title || 'Untitled'}</h2>
                </Link>
                <p>
                  {article.content && article.content[0]?.children && article.content[0].children[0]?.text
                    ? article.content[0].children[0].text.slice(0, 100) + '...'
                    : 'No content available'}
                </p>
              </div>
            );
          })
        )}
      </div>
    </div>
  );
}


功能说明:
调用 getArticles 获取文章列表。使用 useEffect 和 useState 管理数据加载状态。
渲染文章列表,支持点击跳转到文章详情页(使用 documentId 作为参数)。




3.3 app/articles/[id]/page.js
作用:文章详情页,动态路由,显示具体文章内容。
'use client';
import { useEffect, useState } from 'react';
import { useParams } from 'next/navigation';
import { getArticle } from '../../../utils/api';

export default function ArticleDetail() {
  const params = useParams();
  const documentId = params?.id;
  const [article, setArticle] = useState(null);
  const [isLoading, setIsLoading] = useState(true);

  useEffect(() => {
    const fetchArticle = async () => {
      try {
        const response = await getArticle(documentId);
        console.log('Full Article Response:', response);
        console.log('Response Data:', response.data);
        const articleData = response.data?.data || response.data; // 处理嵌套
        if (articleData) {
          setArticle(articleData);
        } else {
          setArticle(null);
        }
      } catch (err) {
        console.error('Fetch Article Error:', err);
      } finally {
        setIsLoading(false);
      }
    };
    if (documentId) fetchArticle();
  }, [documentId]);

  if (isLoading) {
    return <div className="container">Loading...</div>;
  }

  if (!article) {
    return <div className="container">Article not found.</div>;
  }

  return (
    <div className="container">
      <h1>{article.title || 'Untitled'}</h1>
      <div className="article-content">
        {article.content && Array.isArray(article.content) ? (
          article.content.map((block, index) => (
            <p key={index}>
              {block.children.map((child, childIndex) => (
                <span key={childIndex}>{child.text}</span>
              ))}
            </p>
          ))
        ) : (
          <p>No content available.</p>
        )}
      </div>
    </div>
  );
}


功能说明:
使用 useParams 获取动态路由参数 id(documentId)。调用 getArticle 获取文章详情。渲染文章标题和内容。


3.4 app/login/page.js(新建)
作用:登录页面,处理用户登录。


'use client';
import { useState } from 'react';
import { useRouter } from 'next/navigation';
import { login } from '../../utils/api';
import { useAuth } from '../../context/AuthContext';

export default function Login() {
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [error, setError] = useState('');
  const router = useRouter();
  const { login: authLogin } = useAuth();

  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      const { data } = await login(email, password);
      authLogin(data.user, data.jwt);
      router.push('/');
    } catch (err) {
      setError('Login failed');
    }
  };

  return (
    <div className="container">
      <h1>Login</h1>
      <form onSubmit={handleSubmit} className="form">
        <div className="form-group">
          <label>Email</label>
          <input
            type="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            required
          />
        </div>
        <div className="form-group">
          <label>Password</label>
          <input
            type="password"
            value={password}
            onChange={(e) => setPassword(e.target.value)}
            required
          />
        </div>
        <button type="submit" className="btn">Login</button>
      </form>
      {error && <p className="error">{error}</p>}
    </div>
  );
}


功能说明:
提供登录表单,输入邮箱和密码。调用 login API,向 Strapi 发送登录请求。
成功后将 JWT 和用户信息存储到 localStorage,并跳转到首页。



3.5 app/register/page.js(新建)
作用:注册页面,处理用户注册。


'use client';
import { useState } from 'react';
import { useRouter } from 'next/navigation';
import { register } from '../../utils/api';

export default function Register() {
  const [username, setUsername] = useState('');
  const [email, setEmail] = useState('');
  const [password, setPassword] = useState('');
  const [error, setError] = useState('');
  const router = useRouter();

  const handleSubmit = async (e) => {
    e.preventDefault();
    try {
      const { data } = await register(username, email, password);
      router.push('/login');
    } catch (err) {
      setError('Registration failed');
    }
  };

  return (
    <div className="container">
      <h1>Register</h1>
      <form onSubmit={handleSubmit} className="form">
        <div className="form-group">
          <label>Username</label>
          <input
            type="text"
            value={username}
            onChange={(e) => setUsername(e.target.value)}
            required
          />
        </div>
        <div className="form-group">
          <label>Email</label>
          <input
            type="email"
            value={email}
            onChange={(e) => setEmail(e.target.value)}
            required
          />
        </div>
        <div className="form-group">
          <label>Password</label>
          <input
            type="password"
            value={password}
            onChange={(e) => setPassword(e.target.value)}
            required
          />
        </div>
        <button type="submit" className="btn">Register</button>
      </form>
      {error && <p className="error">{error}</p>}
    </div>
  );
}

功能说明:
提供注册表单,输入用户名、邮箱和密码。调用 register API,向 Strapi 发送注册请求。
成功后存储 JWT 和用户信息,跳转到首页。


3.6 app/create-article/page.js(新建)
作用:创建文章页面,允许登录用户发布文章。


'use client';
import { useState } from 'react';
import { useRouter } from 'next/navigation';
import { createArticle } from '../../utils/api';
import { useAuth } from '../../context/AuthContext';

export default function CreateArticle() {
  const [title, setTitle] = useState('');
  const [content, setContent] = useState('');
  const [error, setError] = useState('');
  const { token } = useAuth();
  const router = useRouter();

  const handleSubmit = async (e) => {
    e.preventDefault();
    if (!token) {
      setError('Please login to create an article');
      return;
    }
    try {
      const articleData = {
        title,
        content: [
          {
            type: 'paragraph',
            children: [
              {
                type: 'text',
                text: content || 'Default content',
              },
            ],
          },
        ],
        publishedAt: new Date().toISOString(),
      };
      await createArticle(token, articleData);
      router.push('/');
    } catch (err) {
      setError('Failed to create article');
    }
  };

  return (
    <div className="container">
      <h1>Create Article</h1>
      <form onSubmit={handleSubmit} className="form">
        <div className="form-group">
          <label>Title</label>
          <input
            type="text"
            value={title}
            onChange={(e) => setTitle(e.target.value)}
            required
          />
        </div>
        <div className="form-group">
          <label>Content</label>
          <textarea
            value={content}
            onChange={(e) => setContent(e.target.value)}
            required
            rows="5"
          />
        </div>
        <button type="submit" className="btn">Publish</button>
      </form>
      {error && <p className="error">{error}</p>}
    </div>
  );
}


功能说明:
提供文章发布表单,输入标题和内容。检查用户是否登录(通过 token)。
调用 createArticle API,向 Strapi 发送文章创建请求。成功后跳转到首页。




3.7 components/AuthWrapper.js(新建)
作用:认证包装组件,提供 AuthContext。

'use client';
import { AuthProvider } from '../context/AuthContext';

export default function AuthWrapper({ children }) {
  return <AuthProvider>{children}</AuthProvider>;
}

功能说明:
使用 AuthProvider 提供认证上下文,包装所有页面内容。
确保子组件可以通过 useAuth 访问用户状态和 token。


3.8 components/Navbar.js(新建)
作用:导航组件,动态渲染导航链接。




'use client';
import Link from 'next/link';
import { useAuth } from '../context/AuthContext';

export default function Navbar() {
  const { user, logout } = useAuth();

  return (
    <nav className="navbar">
      <Link href="/">Home</Link>
      {user ? (
        <>
          <Link href="/create-article">Create Article</Link>
          <button onClick={logout} className="btn">Logout</button>
          <span>Welcome, {user.username}</span>
        </>
      ) : (
        <>
          <Link href="/login">Login</Link>
          <Link href="/register">Register</Link>
        </>
      )}
    </nav>
  );
}


功能说明:
使用 useAuth 获取用户状态和 logout 方法。
动态渲染导航:未登录显示“登录”和“注册”,已登录显示“创建文章”、“登出”和欢迎信息。



3.9 context/AuthContext.js(新建)
作用:认证上下文,管理用户登录状态和 token。


'use client';
import { createContext, useContext, useState, useEffect } from 'react';

const AuthContext = createContext();

export function AuthProvider({ children }) {
  const [user, setUser] = useState(null);
  const [token, setToken] = useState(null);

  useEffect(() => {
    if (typeof window !== 'undefined') {
      const storedToken = localStorage.getItem('token');
      const storedUser = localStorage.getItem('user');
      if (storedToken && storedUser) {
        setToken(storedToken);
        setUser(JSON.parse(storedUser));
      }
    }
  }, []);

  const login = (userData, jwt) => {
    setUser(userData);
    setToken(jwt);
    if (typeof window !== 'undefined') {
      localStorage.setItem('token', jwt);
      localStorage.setItem('user', JSON.stringify(userData));
    }
  };

  const logout = () => {
    setUser(null);
    setToken(null);
    if (typeof window !== 'undefined') {
      localStorage.removeItem('token');
      localStorage.removeItem('user');
    }
  };

  return (
    <AuthContext.Provider value={{ user, token, login, logout }}>
      {children}
    </AuthContext.Provider>
  );
}

export const useAuth = () => useContext(AuthContext);




功能说明:
创建 AuthContext,管理用户状态(user 和 token)。

useEffect:在客户端加载时检查 localStorage,恢复用户状态。

login:保存用户数据和 token 到状态和 localStorage。

logout:清除用户状态和 localStorage。

useAuth:提供钩子,供其他组件访问上下文。



3.10 utils/api.js
作用:封装 API 请求,与 Strapi 后端交互。


import axios from 'axios';

const API_URL = 'http://localhost:1337/api';

export const register = async (username, email, password) => {
  return axios.post(`${API_URL}/auth/local/register`, {
    username,
    email,
    password,
  });
};

export const login = async (email, password) => {
  return axios.post(`${API_URL}/auth/local`, {
    identifier: email,
    password,
  });
};

export const getArticles = async () => {
  return axios.get(`${API_URL}/articles?populate=*`);
};

export const getArticle = async (documentId) => {
  return axios.get(`${API_URL}/articles/${documentId}?populate=*`);
};

export const createArticle = async (token, articleData) => {
  return axios.post(
    `${API_URL}/articles`,
    { data: articleData },
    { headers: { Authorization: `Bearer ${token}` } }
  );
};


功能说明:
register:向 Strapi 发送注册请求。login:向 Strapi 发送登录请求。

getArticles:获取文章列表。getArticle:获取单篇文章(使用 documentId)。

createArticle:创建新文章(需要认证)。




3.11 styles/globals.css
作用:全局样式,简单美化页面。




body {
  font-family: Arial, sans-serif;
  margin: 0;
  padding: 0;
  background-color: #f5f5f5;
}

.container {
  max-width: 800px;
  margin: 0 auto;
  padding: 20px;
}

.navbar {
  display: flex;
  gap: 20px;
  padding: 10px 20px;
  background-color: #0070f3;
  color: white;
}

.navbar a {
  color: white;
  text-decoration: none;
}

.navbar button {
  background: none;
  border: none;
  color: white;
  cursor: pointer;
}

.form {
  display: flex;
  flex-direction: column;
  gap: 15px;
  max-width: 400px;
  margin: 0 auto;
}

.form-group {
  display: flex;
  flex-direction: column;
}

.form-group label {
  margin-bottom: 5px;
  font-weight: bold;
}

.form-group input,
.form-group textarea {
  padding: 8px;
  font-size: 16px;
  border: 1px solid #ccc;
  border-radius: 4px;
}

.btn {
  padding: 10px;
  background-color: #0070f3;
  color: white;
  border: none;
  border-radius: 4px;
  cursor: pointer;
  font-size: 16px;
}

.btn:hover {
  background-color: #005bb5;
}

.error {
  color: red;
  margin-top: 10px;
}

.article-list {
  display: flex;
  flex-direction: column;
  gap: 20px;
}

.article-card {
  padding: 15px;
  background-color: white;
  border-radius: 8px;
  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}

.article-card h2 {
  margin: 0 0 10px;
  color: #0070f3;
}

.article-content p {
  margin: 10px 0;
}


功能说明:
提供全局样式,美化页面布局、导航、表单和文章展示。






3.12 next.config.mjs(新建)
作用:Next.js 配置文件,调整项目配置。


/** @type {import('next').NextConfig} */
const nextConfig = {
  reactStrictMode: true,
};

export default nextConfig;




功能说明:
启用 reactStrictMode,确保 React 严格模式运行,帮助发现潜在问题。

可根据需要添加其他配置(如图像优化、环境变量等)。




4.配置完毕以后,npm run dev 启动strapi 与next.js 然后测试下面的!


注册:访问 http://localhost:3000/register,输入用户名、邮箱和密码,注册用户。

登录:访问 http://localhost:3000/login,输入邮箱和密码,登录。

文章列表:访问 http://localhost:3000/,查看文章列表。

文章详情:点击文章标题,访问 http://localhost:3000/articles/nbedxv11g6sdbxvnsdjxs48n,查看文章详情。

发布文章:登录后访问 http://localhost:3000/create-article,创建新文章。


好的。下面已经打包备份了。strapi cms 和next.js website 文件中修改的资料;可以查找对比。

 

下地地址   https://www.525you.com/d/file/2025/202503/f588af66fa52f6c2e80446d0fdfbreb1.rar

 

 


光遇呼吸药剂可以恢复多少氧气(光遇心肺复苏) Wallstreet是什么交易所?Wallstreet华尔街交易所全面介绍 7XEX交易所如何币换人民币?7XEX交易所提现人民币教程 欧易okex比特币如何提现到支付宝 光遇禁阁赏花任务怎么做(光遇禁阁花园在哪里) 王者荣耀加载界面金色皮肤名字是为什么(王者荣耀加载白色) 苹果手机怎么设置铃声?设置自定义铃声完整教程分享 普通电脑怎么挖比特币?什么配置的电脑能挖比特币 比特币做空是什么意思?比特币合约怎么交易? 消逝的光芒2杂项可以卖吗(消逝的光芒2rh) 科普:什么是差价合约? dnf手游韩服改名卡怎么获得(地下城手游韩服叫什么名字) Bitstamp交易所怎么交易?Bitstamp交易所交易教程 王者荣耀高渐离2022怎么出装(高渐离出装最新) 三国杀卢植强度怎么样(三国杀卢植明任技能) 比特币挖矿设备有哪些?盘点常用的比特币矿机 Chia(奇亚)plot文件规格大小详解 三国志幻想大陆女团养谁(三国志幻想大陆女团队) 区块链入门知识整理 coinbase是正规平台吗?coinbase官网地址入口 mxc交易所中国认可度高吗?抹茶mexc交易所中国官网入口 数字货币交易平台有哪些?2022最新区块链数字货币交易平台排名前十名 冰原守卫者采集任务都有哪些(冰原守卫者手游攻略) ETH永续合约如何收费?以太坊永续合约手续费介绍 深空之眼新手刷初始职业怎么选(深空之眼阵容推荐) 宝可梦阿尔宙斯传说怎么换小精灵(阿尔宙斯怎么弄) 江南百景图金玉花首簪怎么打造(江南百景图玉如意) 比特币在中国可以交易吗?全球前十比特币交易所排行榜 宝可梦阿尔宙斯小卡比兽在哪抓(阿尔宙斯和小智) PDEX币在哪些交易所可以购买?PDEX币上线交易所大盘点 永劫无间升龙怎么放(永劫无间升龙释放技巧) ipv4无Internet访问权限?你可能没有权限访问使用网络资源 电脑内存不足怎么办?一键清垃圾清理内存最好的软件 火币永续合约每天扣多少钱?火币永续合约怎么玩? 创造与魔法弹涂鱼饲料包要几条(创造与魔法弹涂鱼饲料包怎么弄) 在昆明租房用什么软件找房会比较好?(网上租房app推荐) 加密货币交易所充值提币操作教程(加密货币钱包转账攻略) 和平精英段位保护可以保护几次(和平精英段位保护会触发几次) cf截图在哪个文件(cf截图在哪个文件夹win7) gta5被游泳池包围的豪宅在哪(gta5带游泳池的别墅) 宝可梦传说阿尔宙斯泥丸怎么获得(宝可梦阿尔宙斯攻略) 十大公链币有哪些?2021全球十大公链排行榜? 有没有不坑不烧钱的传奇手游(求一款耐玩不烧钱的传奇手游) 李晨晒自己拥有9000比特币是真的吗?非你莫属李晨比特币持有现状 如何创建一个完美的DAO 黑色沙漠手游公会任务怎么领取(黑色沙漠公会商店在哪) 火币网APP苹果IOS最新版下载安装教程详解 比特币价值是什么?比特币存在的意义及价值 魔兽世界9.2法师三系选择哪个好(魔兽9.0法师堆什么属性) SPND币是什么币?SPND币总量和上架交易所介绍 创造与魔法如何融合冰鸟饲料(创造与魔法冰鸟饲料配方) BitGet目前中国用户可以接受USDT吗?BitGet中国用户注册教程 trx币是什么币?trx币前景和价值分析 金铲铲之战爆爆可以肝出来吗(金铲铲爆率) imToken钱包内如何买卖EOS的CPU、NET资源教程 okex期权交易实例,okex期权合约怎么玩 和平精英有没有人机模式(和平精英有人机模式嘛) 数字货币怎么挖矿赚钱?区块链挖矿的几种方式介绍 比特币矿场是什么意思?揭秘全球最大的比特币矿场 第五人格靓仔怎么玩(第五人格 混子) SUMO是什么币种?SUMO币前景和未来价值分析 科普:以太坊交易的生命周期? 区块链STRONG币是什么币种?STRONG币前景怎么样? 艾达币/ADA币2021年趋势怎么样?ADA币购买交易操作教程 okex永续合约交割时间是什么时候? 宝可梦阿尔宙斯传说奋斗沙怎么获得(阿尔宙斯gf) 无限元宝挂机手游有哪些(无限元宝手机网游游戏) MLK是什么币种?MLK币前景怎么样? 算力是什么意思?算力的单位是什么? 云顶之弈S7双人模式有恶魔契约吗(英雄联盟云顶之弈7恶魔) 2023有哪些好玩的国产仙侠手游(竖屏仙侠手游排行榜) OK交易所排名第几?OK交易所全球排名多少一览 英雄杀疾行令怎样用(英雄杀疾行令) Exrates交易所怎么样?Exrates交易所正规吗? 诛仙手游抗性有用吗(诛仙手游伤害减免和爆伤加成) 比特币做多好还是做空好?比特币如何做多做空? Ledger钱包怎么使用?Ledger钱包收发比特币教程 天猫直播间入口在哪里?新版界面有所改变。 ERC20协议是什么意思?一文读懂ERC20协议 CSPR是什么币?CSPR币购买方法? 第五人格最新活动攻略(第五人格,最新活动) 什么仙侠游戏的人物建模好看(角色好看的仙侠手游有哪些) okcoin交易平台倒闭了还能用吗?比特币交易网 okcoin注册登录教程详解 创造与魔法鹦鹉必刷点(创造与魔法鹦鹉位置图更新后) Robinhood是什么公司?Robinhood未来前景怎么样? 宝可梦传说阿尔宙斯勇士雄鹰怎么进化(阿尔宙斯战斗视频) 币安交易所买币要多久到账?币安交易所买币教程 哪些数字货币可以挖矿?支持挖矿币种推荐 火币网卖币后怎么提现人民币 图文教程 魔兽世界怀旧服沙塔尔声望怎么刷(tbc怀旧服沙塔尔声望怎么刷) 宝可梦阿尔宙斯巨钳螳螂怎么进化(阿尔宙斯 极巨化) FTX怎么出金?FTX交易所提现人民币教程 中国大陆可用的正规交易所有哪些?正规的数字货币交易平台排行 虚拟货币交易平台APP有哪些?数字货币交易所App排行榜 宝可梦传说阿尔宙斯奋斗石怎么获得(阿尔宙斯努力值刷什么) ARG币总量多少?ARG币总量流通量和前景分析 冰原守卫者佣兵实力怎么升(冰原守卫者攻略) dnf卡片升级放几张卡片好(dnf卡片升级是不是要两张一样的卡片) 即时战略类游戏有哪些好玩(即时战略游戏都有哪些) 第五人格雕刻家的技能是什么(第五人格雕刻家实战强度)

热门文章

推荐专题

更多>>

游戏推荐

更多>>