Java全栈项目-学生综合服务管理平台

内容

在当今信息化的时代,教育行业也在不断寻求创新和突破。学生综合服务管理平台作为一个Java全栈项目,旨在为学生、教师以及管理人员提供一个高效、便捷的互动平台。本文将深入探讨该平台的架构设计、核心功能以及技术实现。

项目背景

随着教育信息化的推进,传统的学生管理方式已经难以满足现代化的需求。学生综合服务管理平台应运而生,旨在通过信息技术手段提高管理效率,提升学生的学习体验。

架构设计

平台采用Java全栈技术,前端使用Vue.js构建,后端基于Spring Boot框架。数据库选用MySQL,以保证数据的高效存储和检索。系统架构遵循MVC模式,确保代码的高内聚和低耦合。

核心功能

  1. 学生信息管理:提供学生基本信息的录入、修改和查询功能。
  2. 课程管理:支持课程的安排、调整以及课程表的生成。
  3. 成绩管理:实现成绩的录入、统计及分析功能。
  4. 通知公告:提供公告发布和通知推送功能,确保信息的及时传达。

技术实现

前端技术

前端采用Vue.js框架,结合Element UI组件库,实现了响应式设计和良好的用户体验。通过Vuex管理状态,实现组件间的数据共享和同步。

后端技术

后端基于Spring Boot框架,使用Spring MVC进行请求的分发和处理。通过Spring Data JPA与MySQL数据库交互,实现数据的持久化。

结语

学生综合服务管理平台的开发不仅提高了学校管理的效率,也为学生提供了更加便捷的服务。未来,我们将继续优化平台功能,提升用户体验,助力教育信息化的发展。

Directory Content Summary

Source Directory: ./student_management

Directory Structure

student_management/
  README.md
  backend/
    pom.xml
    src/
      main/
        java/
          com/
            example/
              studentmanagement/
                Announcement.java
                AnnouncementController.java
                AnnouncementRepository.java
                AnnouncementService.java
                Course.java
                CourseController.java
                CourseRepository.java
                CourseService.java
                Grade.java
                GradeController.java
                GradeRepository.java
                GradeService.java
                Student.java
                StudentController.java
                StudentRepository.java
                StudentService.java
        resources/
          application.properties
  frontend/
    src/
      App.vue
      main.js
      components/
        AnnouncementForm.vue
        AnnouncementList.vue
        CourseForm.vue
        CourseList.vue
        GradeForm.vue
        GradeList.vue
        StudentForm.vue
        StudentList.vue

File Contents

README.md


学生综合服务管理平台

项目简介

该项目是一个Java全栈项目,旨在提供学生信息管理的基本功能,包括录入、修改和查询学生信息。

技术栈

  • 前端:Vue.js
  • 后端:Spring Boot
  • 数据库:MySQL

目录结构

student_management/
│
├── backend/
│   ├── src/
│   │   └── main/
│   │       ├── java/
│   │       │   └── com/example/studentmanagement/
│   │       │       ├── StudentController.java
│   │       │       ├── StudentService.java
│   │       │       ├── StudentRepository.java
│   │       │       └── Student.java
│   │       └── resources/
│   │           └── application.properties
│
└── frontend/
    └── src/
        ├── components/
        │   ├── StudentForm.vue
        │   └── StudentList.vue
        ├── App.vue
        └── main.js

使用说明

后端

  1. 确保MySQL服务已启动,并创建数据库 student_db
  2. 修改 backend/src/main/resources/application.properties 文件中的数据库用户名和密码。
  3. 运行Spring Boot应用。

前端

  1. 进入 frontend 目录。
  2. 运行 npm install 安装依赖。
  3. 运行 npm run serve 启动前端应用。

backend\pom.xml

<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 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0</modelVersion>
    <groupId>com.example</groupId>
    <artifactId>student-management</artifactId>
    <version>1.0-SNAPSHOT</version>
    <packaging>jar</packaging>

    <properties>
        <java.version>11</java.version>
        <spring-boot.version>2.5.4</spring-boot.version>
    </properties>

    <dependencies>
        <!-- Spring Boot Starter Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- Spring Boot Starter Data JPA -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>

        <!-- MySQL Connector Java -->
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
            <scope>runtime</scope>
        </dependency>

        <!-- Spring Boot Starter Test -->
        <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>
            </plugin>
        </plugins>
    </build>
</project>

backend\src\main\java\com\example\studentmanagement\Announcement.java

package com.example.studentmanagement;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import java.time.LocalDateTime;

@Entity
public class Announcement {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String content;
    private LocalDateTime createdAt;

    public Announcement() {
        this.createdAt = LocalDateTime.now();
    }

    // Getters and setters

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getContent() {
        return content;
    }

    public void setContent(String content) {
        this.content = content;
    }

    public LocalDateTime getCreatedAt() {
        return createdAt;
    }

    public void setCreatedAt(LocalDateTime createdAt) {
        this.createdAt = createdAt;
    }
}

backend\src\main\java\com\example\studentmanagement\AnnouncementController.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/announcements")
public class AnnouncementController {

    @Autowired
    private AnnouncementService announcementService;

    @PostMapping
    public ResponseEntity<Announcement> addAnnouncement(@RequestBody Announcement announcement) {
        Announcement savedAnnouncement = announcementService.saveAnnouncement(announcement);
        return ResponseEntity.ok(savedAnnouncement);
    }

    @GetMapping
    public ResponseEntity<List<Announcement>> getAllAnnouncements() {
        List<Announcement> announcements = announcementService.getAllAnnouncements();
        return ResponseEntity.ok(announcements);
    }
}

backend\src\main\java\com\example\studentmanagement\AnnouncementRepository.java

package com.example.studentmanagement;

import org.springframework.data.jpa.repository.JpaRepository;

public interface AnnouncementRepository extends JpaRepository<Announcement, Long> {
}

backend\src\main\java\com\example\studentmanagement\AnnouncementService.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class AnnouncementService {

    @Autowired
    private AnnouncementRepository announcementRepository;

    public Announcement saveAnnouncement(Announcement announcement) {
        return announcementRepository.save(announcement);
    }

    public List<Announcement> getAllAnnouncements() {
        return announcementRepository.findAll();
    }
}

backend\src\main\java\com\example\studentmanagement\Course.java

package com.example.studentmanagement;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Course {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String title;
    private String description;

    // Getters and setters

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }
}

backend\src\main\java\com\example\studentmanagement\CourseController.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/courses")
public class CourseController {

    @Autowired
    private CourseService courseService;

    @PostMapping
    public ResponseEntity<Course> addCourse(@RequestBody Course course) {
        Course savedCourse = courseService.saveCourse(course);
        return ResponseEntity.ok(savedCourse);
    }

    @PutMapping("/{id}")
    public ResponseEntity<Course> updateCourse(@PathVariable Long id, @RequestBody Course course) {
        Course updatedCourse = courseService.updateCourse(id, course);
        return ResponseEntity.ok(updatedCourse);
    }

    @GetMapping
    public ResponseEntity<List<Course>> getAllCourses() {
        List<Course> courses = courseService.getAllCourses();
        return ResponseEntity.ok(courses);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Course> getCourseById(@PathVariable Long id) {
        Course course = courseService.getCourseById(id);
        return ResponseEntity.ok(course);
    }
}

backend\src\main\java\com\example\studentmanagement\CourseRepository.java

package com.example.studentmanagement;

import org.springframework.data.jpa.repository.JpaRepository;

public interface CourseRepository extends JpaRepository<Course, Long> {
}

backend\src\main\java\com\example\studentmanagement\CourseService.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class CourseService {

    @Autowired
    private CourseRepository courseRepository;

    public Course saveCourse(Course course) {
        return courseRepository.save(course);
    }

    public Course updateCourse(Long id, Course course) {
        return courseRepository.findById(id)
                .map(existingCourse -> {
                    existingCourse.setTitle(course.getTitle());
                    existingCourse.setDescription(course.getDescription());
                    return courseRepository.save(existingCourse);
                })
                .orElseThrow(() -> new RuntimeException("Course not found"));
    }

    public List<Course> getAllCourses() {
        return courseRepository.findAll();
    }

    public Course getCourseById(Long id) {
        return courseRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Course not found"));
    }
}

backend\src\main\java\com\example\studentmanagement\Grade.java

package com.example.studentmanagement;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Grade {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private Long studentId;
    private Long courseId;
    private Double score;

    // Getters and setters

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public Long getStudentId() {
        return studentId;
    }

    public void setStudentId(Long studentId) {
        this.studentId = studentId;
    }

    public Long getCourseId() {
        return courseId;
    }

    public void setCourseId(Long courseId) {
        this.courseId = courseId;
    }

    public Double getScore() {
        return score;
    }

    public void setScore(Double score) {
        this.score = score;
    }
}

backend\src\main\java\com\example\studentmanagement\GradeController.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/grades")
public class GradeController {

    @Autowired
    private GradeService gradeService;

    @PostMapping
    public ResponseEntity<Grade> addGrade(@RequestBody Grade grade) {
        Grade savedGrade = gradeService.saveGrade(grade);
        return ResponseEntity.ok(savedGrade);
    }

    @GetMapping("/student/{studentId}")
    public ResponseEntity<List<Grade>> getGradesByStudent(@PathVariable Long studentId) {
        List<Grade> grades = gradeService.getGradesByStudentId(studentId);
        return ResponseEntity.ok(grades);
    }

    @GetMapping("/course/{courseId}")
    public ResponseEntity<List<Grade>> getGradesByCourse(@PathVariable Long courseId) {
        List<Grade> grades = gradeService.getGradesByCourseId(courseId);
        return ResponseEntity.ok(grades);
    }

    @GetMapping("/average/course/{courseId}")
    public ResponseEntity<Double> getAverageGradeByCourse(@PathVariable Long courseId) {
        Double average = gradeService.getAverageGradeByCourseId(courseId);
        return ResponseEntity.ok(average);
    }
}

backend\src\main\java\com\example\studentmanagement\GradeRepository.java

package com.example.studentmanagement;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;
import org.springframework.data.repository.query.Param;

import java.util.List;

public interface GradeRepository extends JpaRepository<Grade, Long> {

    List<Grade> findByStudentId(Long studentId);

    List<Grade> findByCourseId(Long courseId);

    @Query("SELECT AVG(g.score) FROM Grade g WHERE g.courseId = :courseId")
    Double findAverageByCourseId(@Param("courseId") Long courseId);
}

backend\src\main\java\com\example\studentmanagement\GradeService.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class GradeService {

    @Autowired
    private GradeRepository gradeRepository;

    public Grade saveGrade(Grade grade) {
        return gradeRepository.save(grade);
    }

    public List<Grade> getGradesByStudentId(Long studentId) {
        return gradeRepository.findByStudentId(studentId);
    }

    public List<Grade> getGradesByCourseId(Long courseId) {
        return gradeRepository.findByCourseId(courseId);
    }

    public Double getAverageGradeByCourseId(Long courseId) {
        return gradeRepository.findAverageByCourseId(courseId);
    }
}

backend\src\main\java\com\example\studentmanagement\Student.java

package com.example.studentmanagement;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Student {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String name;
    private String email;

    // Getters and setters

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

backend\src\main\java\com\example\studentmanagement\StudentController.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;

import java.util.List;

@RestController
@RequestMapping("/students")
public class StudentController {

    @Autowired
    private StudentService studentService;

    @PostMapping
    public ResponseEntity<Student> addStudent(@RequestBody Student student) {
        Student savedStudent = studentService.saveStudent(student);
        return ResponseEntity.ok(savedStudent);
    }

    @PutMapping("/{id}")
    public ResponseEntity<Student> updateStudent(@PathVariable Long id, @RequestBody Student student) {
        Student updatedStudent = studentService.updateStudent(id, student);
        return ResponseEntity.ok(updatedStudent);
    }

    @GetMapping
    public ResponseEntity<List<Student>> getAllStudents() {
        List<Student> students = studentService.getAllStudents();
        return ResponseEntity.ok(students);
    }

    @GetMapping("/{id}")
    public ResponseEntity<Student> getStudentById(@PathVariable Long id) {
        Student student = studentService.getStudentById(id);
        return ResponseEntity.ok(student);
    }
}

backend\src\main\java\com\example\studentmanagement\StudentRepository.java

package com.example.studentmanagement;

import org.springframework.data.jpa.repository.JpaRepository;

public interface StudentRepository extends JpaRepository<Student, Long> {
}

backend\src\main\java\com\example\studentmanagement\StudentService.java

package com.example.studentmanagement;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;

@Service
public class StudentService {

    @Autowired
    private StudentRepository studentRepository;

    public Student saveStudent(Student student) {
        return studentRepository.save(student);
    }

    public Student updateStudent(Long id, Student student) {
        return studentRepository.findById(id)
                .map(existingStudent -> {
                    existingStudent.setName(student.getName());
                    existingStudent.setEmail(student.getEmail());
                    return studentRepository.save(existingStudent);
                })
                .orElseThrow(() -> new RuntimeException("Student not found"));
    }

    public List<Student> getAllStudents() {
        return studentRepository.findAll();
    }

    public Student getStudentById(Long id) {
        return studentRepository.findById(id)
                .orElseThrow(() -> new RuntimeException("Student not found"));
    }
}

backend\src\main\resources\application.properties

spring.datasource.url=jdbc:mysql://localhost:3306/student_db
spring.datasource.username=root
spring.datasource.password=yourpassword
spring.jpa.hibernate.ddl-auto=update

frontend\src\App.vue

<template>
  <div id="app">
    <h1>Student Management System</h1>
    <StudentForm />
    <StudentList />
    <CourseForm />
    <CourseList />
    <GradeForm />
    <GradeList />
    <AnnouncementForm />
    <AnnouncementList />
  </div>
</template>

<script>
import StudentForm from './components/StudentForm.vue';
import StudentList from './components/StudentList.vue';
import CourseForm from './components/CourseForm.vue';
import CourseList from './components/CourseList.vue';
import GradeForm from './components/GradeForm.vue';
import GradeList from './components/GradeList.vue';
import AnnouncementForm from './components/AnnouncementForm.vue';
import AnnouncementList from './components/AnnouncementList.vue';

export default {
  name: 'App',
  components: {
    StudentForm,
    StudentList,
    CourseForm,
    CourseList,
    GradeForm,
    GradeList,
    AnnouncementForm,
    AnnouncementList
  }
};
</script>

<style>
/* Add some global styling */
</style>

frontend\src\main.js

import Vue from 'vue';
import App from './App.vue';

Vue.config.productionTip = false;

new Vue({
  render: h => h(App),
}).$mount('#app');

frontend\src\components\AnnouncementForm.vue

<template>
  <div>
    <h2>Announcement Form</h2>
    <form @submit.prevent="submitForm">
      <div>
        <label for="title">Title:</label>
        <input type="text" id="title" v-model="announcement.title" required />
      </div>
      <div>
        <label for="content">Content:</label>
        <textarea id="content" v-model="announcement.content" required></textarea>
      </div>
      <button type="submit">Submit</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      announcement: {
        title: '',
        content: ''
      }
    };
  },
  methods: {
    submitForm() {
      // Implement form submission logic
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

frontend\src\components\AnnouncementList.vue

<template>
  <div>
    <h2>Announcement List</h2>
    <ul>
      <li v-for="announcement in announcements" :key="announcement.id">
        <h3>{{ announcement.title }}</h3>
        <p>{{ announcement.content }}</p>
        <small>Posted on: {{ new Date(announcement.createdAt).toLocaleString() }}</small>
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      announcements: []
    };
  },
  created() {
    this.fetchAnnouncements();
  },
  methods: {
    fetchAnnouncements() {
      // Implement fetch logic to get announcements
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

frontend\src\components\CourseForm.vue

<template>
  <div>
    <h2>Course Form</h2>
    <form @submit.prevent="submitForm">
      <div>
        <label for="title">Title:</label>
        <input type="text" id="title" v-model="course.title" required />
      </div>
      <div>
        <label for="description">Description:</label>
        <textarea id="description" v-model="course.description" required></textarea>
      </div>
      <button type="submit">Submit</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      course: {
        title: '',
        description: ''
      }
    };
  },
  methods: {
    submitForm() {
      // Implement form submission logic
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

frontend\src\components\CourseList.vue

<template>
  <div>
    <h2>Course List</h2>
    <ul>
      <li v-for="course in courses" :key="course.id">
        {{ course.title }} - {{ course.description }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      courses: []
    };
  },
  created() {
    this.fetchCourses();
  },
  methods: {
    fetchCourses() {
      // Implement fetch logic to get courses
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

frontend\src\components\GradeForm.vue

<template>
  <div>
    <h2>Grade Form</h2>
    <form @submit.prevent="submitForm">
      <div>
        <label for="studentId">Student ID:</label>
        <input type="number" id="studentId" v-model="grade.studentId" required />
      </div>
      <div>
        <label for="courseId">Course ID:</label>
        <input type="number" id="courseId" v-model="grade.courseId" required />
      </div>
      <div>
        <label for="score">Score:</label>
        <input type="number" id="score" v-model="grade.score" required min="0" max="100" />
      </div>
      <button type="submit">Submit</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      grade: {
        studentId: null,
        courseId: null,
        score: null
      }
    };
  },
  methods: {
    submitForm() {
      // Implement form submission logic
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

frontend\src\components\GradeList.vue

<template>
  <div>
    <h2>Grade List</h2>
    <ul>
      <li v-for="grade in grades" :key="grade.id">
        Student ID: {{ grade.studentId }}, Course ID: {{ grade.courseId }}, Score: {{ grade.score }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      grades: []
    };
  },
  created() {
    this.fetchGrades();
  },
  methods: {
    fetchGrades() {
      // Implement fetch logic to get grades
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

frontend\src\components\StudentForm.vue

<template>
  <div>
    <h2>Student Form</h2>
    <form @submit.prevent="submitForm">
      <div>
        <label for="name">Name:</label>
        <input type="text" id="name" v-model="student.name" required />
      </div>
      <div>
        <label for="email">Email:</label>
        <input type="email" id="email" v-model="student.email" required />
      </div>
      <button type="submit">Submit</button>
    </form>
  </div>
</template>

<script>
export default {
  data() {
    return {
      student: {
        name: '',
        email: ''
      }
    };
  },
  methods: {
    submitForm() {
      // Implement form submission logic
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

frontend\src\components\StudentList.vue

<template>
  <div>
    <h2>Student List</h2>
    <ul>
      <li v-for="student in students" :key="student.id">
        {{ student.name }} - {{ student.email }}
      </li>
    </ul>
  </div>
</template>

<script>
export default {
  data() {
    return {
      students: []
    };
  },
  created() {
    this.fetchStudents();
  },
  methods: {
    fetchStudents() {
      // Implement fetch logic to get students
    }
  }
};
</script>

<style scoped>
/* Add some basic styling */
</style>

源码下载

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

天天进步2015

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

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

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

打赏作者

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

抵扣说明:

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

余额充值