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

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

时间:2025-07-01 09:15:51来源: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

 

 


比特币期货ETF是什么意思?一文读懂比特币期货ETF 蜀门手游法宝融合的规则(蜀门手游各个职业法宝搭配) usdt/泰达币怎么获得?泰达币获取方式汇总 和平精英的捏脸代码在哪里输入(和平精英捏脸代码在哪里用) cf巅峰卡牌怎么获得(cf巅峰期) 币印矿池怎么设置狗狗币DOGE钱包地址 2022年年度必玩单机游戏清单(2022年单机游戏大作) 欧易活期挖矿可以一直挖吗?欧易挖矿怎么样? kraken交易平台正规吗_四大数字货币交易所排名榜 有什么值得上手的卡牌网游(值得推荐的卡牌游戏) csgo打字按哪个键(csgo怎么打字) 宝可梦阿尔宙斯传说鬼龙怎么抓(阿尔宙斯抓捕几率) cfvip在哪里看(如何查看cfvip剩余天数) 梦幻西游问题科举殿试是谁主持进行的(梦幻西游科举会试) CZ在币圈是什么意思?CZ在币圈代表的哪个人,CZ详细资料 梦幻西游手游69升70怎么突破(梦幻手游69到70需要多少经验) 我的世界熔炉的燃料是什么(我的世界熔炼炉的燃料是什么) 三国志幻想大陆女队全新阵容(三国志幻想大陆女队阵容培养顺序) 幻世录1隐藏物品完美攻略,幻世录1秘籍模式开启方法教程详解 怎么买MINA币?MINA币购买交易操作教程 有什么好玩不费钱的武侠手游(不用氪金的武侠手游) 第五人格宿伞如何操作飞伞(第五人格宿伞怎么斜甩伞) 什么是元宇宙?怎么赚钱?揭秘元宇宙最厉害的三个平台 币圈是什么意思?详解币圈和链圈的区别 第五人格宿伞之魂反向操作怎么玩(第五人格宿伞之魂怎么飞得更准) 香港Crypto交易所有哪些?合规的香港加密货币交易所官网入口 DEFX是什么币?DEFX币投资价值分析 魔兽世界火焰微粒哪里刷(tbc火焰微粒) 币安理财能提前赎回吗?提前赎回有费用吗? 魔兽世界银色北伐军声望怎么刷(银色北伐军声望军需官在哪) Liquid交易所怎么样?Liquid交易所属于哪个国家的 DNF无尽的祭坛在哪里(dnf无尽的祭坛怎么过) DNF裂缝注视者怎么开启(dnf裂缝注视者怎么开启的) fgo书页哪里刷出率最高2023(fgo2021书页) 国内AICoin电脑版打不开?AICoin官网网页版电脑版入口 有哪些新开服的网游值得玩(新开服的游戏) OM是什么币种?OM币前景和价值深度分析 假如有一天steam无法再连接(steam无法连接怎么办) 去中心化交易所是如何工作的?去中心化交易所有法币交易吗? 比特币挖矿设备有哪些?盘点常用的比特币矿机 区块链分类有哪些?一文带您了解区块链五大分类 币安Launchpad是什么意思?币安launchpad规则 电脑唱歌软件哪个好? 5款电脑ktv唱歌软件推荐 数字货币(加密货币)入门指南 数字货币入门基础知识 什么是区块链ICO、IFO? 第五人格魔术师天赋怎么点(第五人格魔术师人格天赋搭配怎么配) 消逝的光芒2第一只生体标记器密码是什么(消逝的光芒2rh) 08年买1万元比特币现在值多少钱?08年买1万元比特币历史行情回顾 英雄联盟大虫子最大能变多大(lol大虫子能有多大) 一文读懂区块链去「中心化钱包」还是「去中心化钱包」? 矿池算力是什么意思?本地算力与矿池算力的关系 宝可梦传说阿尔宙斯樱花儿在哪(阿尔宙斯pv) 柴犬币SHIB是什么? 柴犬币SHIB详细介绍 第五人格遗失的记忆怎么出现(第五人格遗失的记忆回流活动) 阴阳师妖狐值得培养吗2022(阴阳师妖狐值得培养吗?) 以太坊Gas费什么时候最低?以太坊gas调最低需要多久 FIS是什么币种?FIS币前景和未来价值分析 奇迹暖暖最美套装服饰介绍 奇迹暖暖最美服装属性详解 英雄联盟小丑S12怎么出装(lol小丑出装s11) BTC比特币交易网比特币中国平台有哪些?中国三大比特币交易所评测 达世币未来能上涨多少?达世币2025年官网消息价格预测 BORA是什么币种?BORA币全面介绍 消逝的光芒2运行没反应怎么办(消逝的光芒2pc) 奥比岛手游烟花盛会怎么玩(奥比岛舞会) 英雄联盟手游段位有哪些(英雄联盟手游段位一览) 消逝的光芒2给不给钥匙(消逝的光芒2cv) 冰原守卫者空水壶哪能弄来(你知道的冰原守卫者相关要素) 门罗币(MONERO)钱包生成超详细教程 我的世界备份存档在哪(我的世界备份存档在哪网易) 消逝的光芒怎么设置按键说话(消逝的光芒按什么键说话) DeFi挖矿-CRT:使用比特派钱包bitpie参与胡萝卜Carrot挖矿(波场系) HitBTC交易所怎么用?HitBTC交易所注册及交易流程 Uniswap交易所官网APP下载优点特色,Uniswap交易所官网版app下载 去中心化身份DID:Web3通行证 家庭记账软件手机版哪个好?家庭记账软件排行前十 BOND是什么币种?BOND币前景和价值全面介绍 币安交易所购买比特币BTC操作步骤教程 STN是什么币?STN币官网总量和上线交易所介绍 USDT合约怎么玩?USDT合约操作教程 怎么复制王者荣耀别人的名字(王者荣耀如何复制别人的名字改自己想要的名字) 消逝的光芒怎么加入别人的游戏(消逝的光芒如何加入别人的游戏) 2023传奇手游人气榜单,快来看看有没有你喜欢的那一款 王者荣耀紫星币能赠送吗(王者荣耀紫星币能否赠送) 黑色沙漠手游怎么跳跃(黑色沙漠手游跳跃键出不来) 大算力ASIC矿机芯动A11量产后以太坊会改变其算法吗? 什么游戏不花钱又好玩2023(2021年什么游戏好玩不花钱的) DeversiFi交易所靠谱吗?DeversiFi究竟怎么样? dnf105传说装备有什么用(dnf100传说装备有什么用) 消逝的光芒2欢迎上船选胡安还是丹尼尔(消逝的光芒2任务攻略) BITGET是正规靠谱平台吗?bitGet交易所排名第几 我的世界海绵怎么合成(我的世界海绵合成材料) cf怎么锁cf点(cf端游怎么锁定cf点) steam错误(steam错误 无法连接到内容服务器) UNI币价格今日行情美元走势,(UNI/CNY)实时汇率走势分析历史趋势 比特儿网现在还登录不了吗?比特儿官网Gate.io官网登录入口 方舟怎么从武器换成拳头(方舟如何切换武器) 通俗解释元宇宙是什么概念?元宇宙的应用有哪些? 如何下载和注册欧易APP?欧易APP下载和新手注册操作教程 分析:为什么币圈大佬认为五月FIL将有强势行情来袭? 魔兽世界斯坦索姆钥匙怎么获得(怀旧服斯坦索姆钥匙怎么弄)

热门文章

推荐专题

更多>>

游戏推荐

更多>>