Springboot+vue后台管理系统-前后端分离数据传递

零:最终实现图片展览:

请添加图片描述

请添加图片描述

请添加图片描述

一:前端项目搭建;

1:使用cmd下载vue:

请添加图片描述

2:npm install -g @vue/cli (如果安装过就不用啦)

3:vue create springboot-vue-demo(自己的名字):

请添加图片描述

4:请添加图片描述

5:将目标移动到第一个选项然后按回车到达下面这个界面,选择一个vue版本,我们这里选择vue3x

请添加图片描述

6:下一个界面依次按下: y in package.json y 这三个,第三个是是否保存当前配置可以按N

7:请添加图片描述

请添加图片描述

进入:请添加图片描述

退出打开idea去开启项目编写

二:前端框架搭建,首先看一下最终的实现效果:

请添加图片描述

请添加图片描述

1:首先我们发现这个后台管理系统有三个部分,内容,顶部栏,左边导航栏,所以我们要将顶部和左侧两个不变的地方写在components中:

请添加图片描述

Header.vue:

<template>
  <div style="height: 50px; line-height: 50px; border-bottom: 1px solid #ccc; display: flex; background-color:#545c64">
    <div style="width: 200px; padding-left: 30px; font-weight: bold; color: white">后台管理</div>
    <div style="flex: 1"></div>
    <div style="width: 100px">
      <el-dropdown style="line-height: 3.5 ;color: white">
        <span class="el-dropdown-link" >
          张三 <el-icon class="el-icon--right"><arrow-down /></el-icon>
        </span>
        <template #dropdown>
          <el-dropdown-menu>
            <el-dropdown-item>个人信息</el-dropdown-item>
            <el-dropdown-item>退出系统</el-dropdown-item>

          </el-dropdown-menu>
        </template>
      </el-dropdown>
    </div>
    </div>
</template>


<script >
import { ArrowDown } from '@element-plus/icons-vue';
export default {
  components:{ArrowDown},
  name: "Header"

}

</script>




插入一下:新版element引入图标使用的script:import { ArrowDown } from '@element-plus/icons-vue';,项目中加入element是需要手动npm导入的,这里可以通过看官网介绍

Aside.vue:

<template>
  <div>
    <el-menu
        style="width: 200px; min-height: calc(100vh - 50px)"
        :uniqueOpened="true"
        default-active="2"
        class="el-menu-vertical-demo"
        background-color="#545c64"
        text-color="#fff"
        active-text-color="#ffd04b"
    >
      <el-sub-menu index="1">
        <template #title>
          <i class="el-icon-location"></i>
          <span>导航一</span>
        </template>

        <el-menu-item index="1-4">
          <template #title>选项1-1</template>
        </el-menu-item>
      </el-sub-menu>

      <el-menu-item index="2">
        <el-icon><document /></el-icon>
        <template #title>导航二</template>
      </el-menu-item>

      <el-menu-item index="3">
        <el-icon><document /></el-icon>
        <template #title>导航三</template>
      </el-menu-item>

      <el-menu-item index="4">
        <el-icon><setting /></el-icon>
        <template #title>导航四</template>
      </el-menu-item>
    </el-menu>
  </div>
</template>
<script>
import {
  Location,
  Document,
  Menu as IconMenu,
  Setting,
} from '@element-plus/icons-vue'
export default {
  components:{
    Location,
    Document,
    IconMenu,
    Setting
  },

  name: "Aside"
}
</script>

<style scoped>

</style>

Main.js:

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
import 'dayjs/locale/zh-cn'
import locale from 'element-plus/es/locale/lang/zh-cn'


import router from './router'
import store from './store'
import '@/assets/css/global.css'



createApp(App).use(store).use(router).use(ElementPlus,{locale}).mount('#app')

App.vue:

请添加图片描述

<template>
  <div >
<!--    头部-->
    <Header/>
<!--    主体-->
    <div style="display: flex">
<!--      侧边栏-->
      <Aside />
<!--      内容区域-->
      <router-view style="flex: 1"/>
    </div>
  </div>
<!--  <router-view/>-->
</template>

<style>

</style>

<script>
import Header from "@/components/Header";
import Aside from "@/components/Aside";

export default {
  name:"Layout",
  components:{
    Header,
    Aside
  }
}


</script>


Home.vue:

<template>

  <div style="padding: 10px" >

<!--    功能区域-->
    <div style="margin: 10px 0px">
      <el-button type="primary" @click="add">新增</el-button>
      <el-button type="primary">导入</el-button>
      <el-button type="primary">导出</el-button>
    </div>
<!--    搜索区域-->
    <div style="margin: 10px 0px">
      <el-input v-model="search" placeholder="请输入关键字" style="width: 20%"></el-input>
      <el-button type="primary" style="margin-left: 5px">查询</el-button>
    </div>

    <el-table :data="tableData" border style="width: 100%">
      <el-table-column
          prop="id"
          label="ID" sortable="sortable" >
      </el-table-column>
      <el-table-column
          prop="username"
          label="用户名" >
      </el-table-column>
      <el-table-column
          prop="nickName"
          label="昵称">
      </el-table-column>
      <el-table-column
          prop="age"
          label="年龄">
      </el-table-column>
      <el-table-column
          prop="sex"
          label="性别">
      </el-table-column>
      <el-table-column
          prop="address"
          label="地址">
      </el-table-column>

      <el-table-column fixed="right" label="操作" width="100">
        <template #default="scope">
          <el-button @click="handleEdit(scope.row)" type="text" size="small">编辑</el-button>
          <el-popconfirm title="确定删除吗?">
            <template #reference>
              <el-button type="text">删除</el-button>
            </template>
          </el-popconfirm>
        </template>
      </el-table-column>
    </el-table>

    <div style="margin: 10px 0">
      <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="currentPage"
          :page-sizes="[5, 10, 20]"
          :page-size="10"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total"
      >
      </el-pagination>

      <el-dialog title="提示" v-model="dialogVisible" width="30%">
        <el-form :model="form" label-width="120px">
          <el-form-item label="用户名">
            <el-input v-model="form.username" style="width: 80%"></el-input>
          </el-form-item>
          <el-form-item label="昵称">
            <el-input v-model="form.nickName" style="width: 80%"></el-input>
          </el-form-item>
          <el-form-item label="年龄">
            <el-input v-model="form.age" style="width: 80%"></el-input>
          </el-form-item>
          <el-form-item label="性别">
            <el-radio v-model="form.sex" label=""></el-radio>
            <el-radio v-model="form.sex" label=""></el-radio>
          </el-form-item>
          <el-form-item label="地址">
            <el-input type="textarea" v-model="form.address" style="width: 80%"></el-input>
          </el-form-item>

        </el-form>
        <template #footer>
          <span class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="save" >确 定</el-button>
          </span>
        </template>
      </el-dialog>


    </div>


  </div>
</template>

<script>

import request from "@/util/request";

export default {
  name: 'Home',
  components: {

  },
  data(){
    return{
      form:{},
      dialogVisible:false,
      search:"",
      currentPage:1,
      total:10,
      tableData:[

      ]

    }
  },
  methods:{
    // 新增用户
    add(){
      this.dialogVisible = true
      // 先清空表单域
      this.form = {}
    },
    // 保存用户传送给后台,使用常见的api:axios
    save(){
      request.post("/user",this.form).then(res => {
        console.log(res)
      })

    },
    handleEdit(){


    },
    handleSizeChange(){

    },

    handleCurrentChange(){

    }


  }
}
</script>

全局css:

请添加图片描述

index.js:(router)

import { createRouter, createWebHistory } from 'vue-router'
import Home from '../views/Home.vue'

const routes = [
  {
    path: '/',
    name: 'Home',
    component: Home
  },
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

store:index.js

import { createStore } from 'vuex'

export default createStore({
  state: {
  },
  mutations: {
  },
  actions: {
  },
  modules: {
  }
})

三:后端基本结构:使用springboot+mybatis-plus

请添加图片描述

pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.5.2</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.example</groupId>
	<artifactId>demo</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<name>demo</name>
	<description>Demo project for Spring Boot</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>com.baomidou</groupId>
			<artifactId>mybatis-plus-boot-starter</artifactId>
			<version>3.4.3.1</version>
		</dependency>


		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		<dependency>
			<groupId>org.mybatis.spring.boot</groupId>
			<artifactId>mybatis-spring-boot-starter</artifactId>
			<version>2.2.2</version>
		</dependency>

		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>org.projectlombok</groupId>
			<artifactId>lombok</artifactId>
			<optional>true</optional>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.projectlombok</groupId>
							<artifactId>lombok</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

</project>

实体类:user:

package com.example.demo.entity;

import com.baomidou.mybatisplus.annotation.IdType;
import com.baomidou.mybatisplus.annotation.TableId;
import com.baomidou.mybatisplus.annotation.TableName;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;

@TableName("user")
@Data
@AllArgsConstructor
@NoArgsConstructor
public class User {

    @TableId(type = IdType.AUTO)
    private Integer id;

    private String username;
    private String password;
    private String nickName;
    private Integer age;
    private String sex;
    private String address;
    private String avatar;

}

Mapper接口:

package com.example.demo.mapper;

import com.baomidou.mybatisplus.core.mapper.BaseMapper;
import com.example.demo.entity.User;

public interface UserMapper extends BaseMapper<User> {
}

返回结果封装类:Result:

package com.example.demo.common;


/**
 * 返回结果的包装类
 * @param <T>
 */
public class Result<T> {
    private String code;
    private String msg;
    private T data;

    public String getCode() {
        return code;
    }

    public void setCode(String code) {
        this.code = code;
    }

    public String getMsg() {
        return msg;
    }

    public void setMsg(String msg) {
        this.msg = msg;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }

    public Result() {
    }

    public Result(T data) {
        this.data = data;
    }

    public static Result success() {
        Result result = new Result<>();
        result.setCode("0");
        result.setMsg("成功");
        return result;
    }

    public static <T> Result<T> success(T data) {
        Result<T> result = new Result<>(data);
        result.setCode("0");
        result.setMsg("成功");
        return result;
    }

    public static Result error(String code, String msg) {
        Result result = new Result();
        result.setCode(code);
        result.setMsg(msg);
        return result;
    }
}

Mybatis-plus插件:

package com.example.demo.common;

import com.baomidou.mybatisplus.annotation.DbType;
import com.baomidou.mybatisplus.extension.plugins.MybatisPlusInterceptor;
import com.baomidou.mybatisplus.extension.plugins.inner.PaginationInnerInterceptor;
import org.mybatis.spring.annotation.MapperScan;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 *  mybatis-plus 分页插件
 */
@Configuration
@MapperScan("com.example.demo.mapper")
public class MybatisPlusConfig {

    /**
     * 分页插件
     */
    @Bean
    public MybatisPlusInterceptor mybatisPlusInterceptor() {
        MybatisPlusInterceptor interceptor = new MybatisPlusInterceptor();
        interceptor.addInnerInterceptor(new PaginationInnerInterceptor(DbType.MYSQL));
        return interceptor;
    }

}

控制层:controller:

package com.example.demo.controller;

import com.example.demo.common.Result;
import com.example.demo.entity.User;
import com.example.demo.mapper.UserMapper;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import javax.annotation.Resource;

/**
 * @RestController:返回数据
 * @Controller:渲染界面
 */

@RestController
@RequestMapping("/user")
public class UserController {

    @Resource
    UserMapper userMapper;
    /**
     * 新增  @RequestBody:前台传过来的json转换为java对象
     * @return
     */
    @PostMapping
    public Result<?> save(@RequestBody User user){
        userMapper.insert(user);
        return Result.success();
    }




}

三:数据交互:

这里首先说前端我们怎样将home.vue里面的数据传输给后端?答案是使用axios!

配置axios:

import axios from 'axios'

const request = axios.create({
    // 注意!! 这里是全局统一加上了 '/api' 前缀,也就是说所有接口都会加上'/api'前缀在,页面里面写接口的时候就不要加 '/api'了,否则会出现2个'/api',类似 '/api/api/user'这样的报错,切记!!!
    baseURL: '/api',
    timeout: 5000
})

// request 拦截器
// 可以自请求发送前对请求做一些处理
// 比如统一加token,对请求参数统一加密
request.interceptors.request.use(config => {
    config.headers['Content-Type'] = 'application/json;charset=utf-8';

    // config.headers['token'] = user.token;  // 设置请求头
    return config
}, error => {
    return Promise.reject(error)
});
// response 拦截器
// 可以在接口响应后统一处理结果
request.interceptors.response.use(
    response => {
        let res = response.data;
        // 如果是返回的文件
        if (response.config.responseType === 'blob') {
            return res
        }
        // 兼容服务端返回的字符串数据
        if (typeof res === 'string') {
            res = res ? JSON.parse(res) : res
        }
        return res;
    },
    error => {
        console.log('err' + error) // for debug
        return Promise.reject(error)
    }
)
export default request


配好这个以后在数据交互的home.vue界面就可以使用了:

请添加图片描述

浏览器还有一个跨域访问的问题:配置vue.config.js:

// 跨域配置
module.exports = {
    devServer: {                //记住,别写错了devServer//设置本地默认端口  选填
        port: 9876,
        proxy: {                 //设置代理,必须填
            '/api': {              //设置拦截器  拦截器格式   斜杠+拦截器名字,名字可以自己定
                target: 'http://localhost:7099',     //代理的目标地址
                changeOrigin: true,              //是否设置同源,输入是的
                pathRewrite: {                   //路径重写
                    '^/api': ''                     //选择忽略拦截器里面的内容
                }
            }
        }
    }
}

请添加图片描述

现在就可以测试了:

请添加图片描述
请添加图片描述
请添加图片描述

最新的home.vue:

<template>

  <div style="padding: 10px" >

<!--    功能区域-->
    <div style="margin: 10px 0px">
      <el-button type="primary" @click="add">新增</el-button>
      <el-button type="primary">导入</el-button>
      <el-button type="primary">导出</el-button>
    </div>
<!--    搜索区域-->
    <div style="margin: 10px 0px">
      <el-input v-model="search" placeholder="请输入关键字" style="width: 20%"></el-input>
      <el-button type="primary" style="margin-left: 5px">查询</el-button>
    </div>

    <el-table :data="tableData" border style="width: 100%">
      <el-table-column
          prop="id"
          label="ID" sortable="sortable" >
      </el-table-column>
      <el-table-column
          prop="username"
          label="用户名" >
      </el-table-column>
      <el-table-column
          prop="nickName"
          label="昵称">
      </el-table-column>
      <el-table-column
          prop="age"
          label="年龄">
      </el-table-column>
      <el-table-column
          prop="sex"
          label="性别">
      </el-table-column>
      <el-table-column
          prop="address"
          label="地址">
      </el-table-column>

      <el-table-column fixed="right" label="操作" width="100">
        <template #default="scope">
          <el-button @click="handleEdit(scope.row)" type="text" size="small">编辑</el-button>
          <el-popconfirm title="确定删除吗?">
            <template #reference>
              <el-button type="text">删除</el-button>
            </template>
          </el-popconfirm>
        </template>
      </el-table-column>
    </el-table>

    <div style="margin: 10px 0">
      <el-pagination
          @size-change="handleSizeChange"
          @current-change="handleCurrentChange"
          :current-page="currentPage"
          :page-sizes="[5, 10, 20]"
          :page-size="10"
          layout="total, sizes, prev, pager, next, jumper"
          :total="total"
      >
      </el-pagination>

      <el-dialog title="提示" v-model="dialogVisible" width="30%">
        <el-form :model="form" label-width="120px">
          <el-form-item label="用户名">
            <el-input v-model="form.username" style="width: 80%"></el-input>
          </el-form-item>
          <el-form-item label="昵称">
            <el-input v-model="form.nickName" style="width: 80%"></el-input>
          </el-form-item>
          <el-form-item label="年龄">
            <el-input v-model="form.age" style="width: 80%"></el-input>
          </el-form-item>
          <el-form-item label="性别">
            <el-radio v-model="form.sex" label=""></el-radio>
            <el-radio v-model="form.sex" label=""></el-radio>
          </el-form-item>
          <el-form-item label="地址">
            <el-input type="textarea" v-model="form.address" style="width: 80%"></el-input>
          </el-form-item>

        </el-form>
        <template #footer>
          <span class="dialog-footer">
            <el-button @click="dialogVisible = false">取 消</el-button>
            <el-button type="primary" @click="save" >确 定</el-button>
          </span>
        </template>
      </el-dialog>


    </div>


  </div>
</template>

<script>

import request from "@/util/request";

export default {
  name: 'Home',
  components: {

  },
  data(){
    return{
      form:{},
      dialogVisible:false,
      search:"",
      currentPage:1,
      total:10,
      tableData:[

      ]

    }
  },
  methods:{
    // 新增用户
    add(){
      this.dialogVisible = true
      // 先清空表单域
      this.form = {}
    },
    // 保存用户传送给后台,使用常见的api:axios
    save(){
      request.post("/user",this.form).then(res => {
        console.log(res)
      })
      this.dialogVisible=false

    },
    handleEdit(){


    },
    handleSizeChange(){

    },

    handleCurrentChange(){

    }


  }
}
</script>

这就是一个简单的前后端交互数据,接下来我们完善这个项目…未完…

加急更新…

### 回答1: 在写一个前后端分离后台管理系统时,您可以使用 Spring Boot 作为后端框架, Vue.js 作为前端框架,MyBatis 作为数据访问框架。 首先,您需要在 Spring Boot 中配置 MyBatis,连接到数据库并编写相应的 SQL 语句。然后,您可以编写后端控制器来处理 HTTP 请求,并使用 MyBatis 执行数据库操作。 在前端部分,您可以使用 Vue.js 构建用户界面,并使用 Axios 等库与后端进行交互。当用户在前端界面中进行操作时,Vue.js 将调用相应的函数并发送 HTTP 请求到后端。后端控制器将处理请求并返回响应,Vue.js 将使用响应更新前端界面。 总的来说,使用 Spring BootVue.js 和 MyBatis 开发前后端分离后台管理系统是一个不错的选择,它们提供了良好的支持和工具,帮助您快速构建功能丰富、可扩展的后台管理系统。 ### 回答2: 要写一个前后端分离后台管理系统,首先需要明确系统的功能和需求,然后结合Spring BootVue和MyBatis这三个框架进行开发。 1. 后端开发: - 使用Spring Boot搭建后台服务,配置相关依赖和基本的配置。 - 设计数据库表结构,并使用MyBatis进行数据库操作。 - 创建后端接口,包括用户管理、权限管理、数据查询等功能,并使用MyBatis实现相关的数据操作。 - 配置接口的权限验证,使用Spring Security进行登录认证和权限控制。 2. 前端开发: - 使用Vue框架搭建前端界面,并配置相关依赖和基本的配置。 - 设计后台管理系统的页面布局和样式,使用Vue Router进行前端路由管理。 - 实现用户登录和权限验证功能,与后端接口进行通信,使用Axios进行数据请求和响应处理。 - 开发各个功能模块的前端页面,包括用户管理、权限管理、数据查询等,并与后端接口进行数据交互。 3. 前后端协作: - 前后端的数据交互一般使用JSON格式,后端通过Spring Boot提供的@RestController注解,返回JSON格式的数据前端。 - 前端通过Axios库发送请求给后端接口,获取数据并进行处理展示。 - 前后端对接口的定义和数据格式进行约定,确保数据的有效性和一致性。 - 前后端进行联调和测试,确认系统正常运行并满足需求。 总之,使用Spring BootVue和MyBatis可以很好地实现一个前后端分离后台管理系统。通过后端提供接口和数据服务,前端实现页面展示和用户操作,两者通过数据交互实现系统功能。这种架构可以提高开发效率和可维护性,实现前后端的解耦和灵活性。 ### 回答3: 将SpringBootVue和MyBatis结合起来构建一个前后端分离后台管理系统可以分为以下几个步骤: 1. 创建SpringBoot项目:首先,我们需要创建一个SpringBoot项目作为后端服务。可以使用Spring Initializr快速搭建项目基础结构,并且添加所需的依赖,如Spring Web、Spring Data JPA、MyBatis等。 2. 设计数据库结构:根据后台管理系统的需求,设计数据库表结构,并使用MyBatis创建对应的实体类和Mapper接口。 3. 编写后端API:在SpringBoot项目中,编写对应的Controller类,实现接口的定义和业务逻辑。通过注解配置路由信息,用于定义API的访问路径和请求方式,同时接收前端传递的参数并返回相应的结果。 4. 创建Vue项目:使用Vue脚手架工具(例如Vue CLI)创建一个新的Vue项目作为前端界面。在项目初始化中选择自己喜欢的UI框架(如ElementUI),并安装需要的插件和依赖。 5. 编写前端页面:根据后台管理系统的需求,设计并编写相应的页面组件。利用Vue的组件化开发,将整个页面划分为不同的组件,并进行组件的构建和样式的设计。 6. 实现前后端数据交互:在Vue项目中,使用axios或者其他HTTP请求库与后端建立请求连接,发送API请求,并接收后端返回的数据。可以使用Vue的生命周期钩子函数或者Vuex来处理数据的请求和响应。 7. 页面路由与导航:根据后台管理系统的需求,在Vue项目中设置路由信息,配置页面导航和跳转功能。可以利用Vue Router进行路由的管理和操作。 8. 测试和部署:完成以上步骤后,进行系统的单元测试和集成测试,并进行系统的部署和上线。 通过以上步骤,就可以使用SpringBootVue和MyBatis构建一个前后端分离后台管理系统前端通过Vue实现了页面的展示和交互逻辑,后端通过SpringBoot提供了API的定义和业务处理,而MyBatis则负责与数据库之间的交互操作。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

water-之

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值