private void jButton

本文分享了作者在大学课程设计中的经历,包括设计流程、操作说明、功能实现及设计总结。主要内容涉及学生表、课程表、成绩表的操作与查询,以及数据验证过程。此外,文章还讨论了设计过程中的挑战与解决方案,如数据存储结构、完整性控制等问题。通过详细的文档设计和逐步解决问题的方法,作者展示了如何构建一个简单的操作界面。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  * 根据成绩表查询某个人的各科成绩

  * 创建时间:2014-02-23 13:26

  */

  //查询个人的各科成绩(课程名 成绩)

  private void jButton13ActionPerformed(java.awt.event.ActionEvent evt) {

  // TODO add your handling code here:

  String Sno = jTextField11.getText();

  boolean flag = false;

  Vector data = new Vector();

  for (int k = 0; sc[k] != null; k++) {

  Vector row = new Vector();

  if (sc[k].GetSno()。equals(Sno)) {

  flag = true;

  int k1 = 0;

  while (course[k1] != null) {

  if (course[k1].GetCno()。equals(sc[k].GetCno())) {

  row.add(course[k1].GetCname());

  row.add(sc[k].GetGrade());

  data.add(row);

  }

  k1 += 1;

  }

  }

  }

  if (!flag) {

  JOptionPane.showMessageDialog(this, "该同学暂时还没有选课成绩或不存在在该同学");

  }

  Vector title = new Vector();

  title.add("课程名");

  title.add("成绩");

  DefaultTableModel dtm = new DefaultTableModel(data, title);

  jTable4.setModel(dtm);

  jTextField11.setText("");

  }

  /**

  * 查询该课程的选课学生信息

  * 创建时间:2014-02-23 14:22

  */

  //查询课程已选人的信息

  private void jButton14ActionPerformed(java.awt.event.ActionEvent evt) {

  // TODO add your handling code here:

  DefaultTableModel dtm = new DefaultTableModel();//

  String Cname = jTextField12.getText();

  String Cno = null;

  boolean flag = false;

  int k1 = 0;

  //由课程名从course中得到Cno

  while (course[k1] != null) {

  if (course[k1].GetCname()。equals(Cname)) {

  Cno = course[k1].GetCno();

  }

  k1 += 1;

  }

  if (Cno == null) {

  JOptionPane.showMessageDialog(this, "不存在该课程");

  return;

  }

  Vector data = new Vector();

  for (int k = 0; sc[k] != null; k++) {

  if (sc[k].GetCno()。equals(Cno)) {

  int k2 = 0;

  flag = true;

  //由课程名从course中得到Cno

  Vector row = new Vector();

  while (student[k2] != null) {

  if (student[k2].GetSno()。equals(sc[k].GetSno())) {

  row.add(student[k2].GetSno());

  row.add(student[k2].GetSname());

  row.add(student[k2].GetSsex());

  row.add(student[k2].GetSdept());

  data.add(row);

  }

  k2 += 1;

  }

  }

  }

  if (!flag) {

  JOptionPane.showMessageDialog(this, "该课程暂时无人选");

  return;

  }

  Vector title = new Vector();

  title.add("学号");

  title.add("姓名");

  title.add("性别");

  title.add("专业");

  dtm = new DefaultTableModel(data, title);

  jTable5.setModel(dtm);

  jTextField12.setText("");

  }

  (七)、对数据的验证代码

  public class Helper {

  /**

  * 功能:完成对学生学号的正确性检验

  * 创建时间 2014-02-23 21:42

  * @param Sno

  */

  public static boolean checkSno(String Sno){

  boolean flag=true;

  char temp[]=Sno.toCharArray();

  for(int i=0;i<temp.length;i++)< p="">

  {

  if(temp[i]<'0'||temp[i]>'9')

  {

  flag=false;break;

  }

  }

  return flag;

  }

  /**

  * 功能;完成对学号唯一性的检验

  * 创建时间:2014-02-23 22:01

  */

  public static boolean onlySno(Student []s,String Sno){

  boolean flag=true;

  for(int k=0;s[k]!=null;k++){

  if(s[k].GetSno()。equals(Sno))

  {

  flag=false;break;

  }

  }

  if(Sno==null)

  {

  flag=false;

  }

  return flag;

  }

  /**

  * 功能:完成对学生表中年龄的正确性检验

  * @param Sage

  */

  public static boolean checkSage(String Sage)

  {

  boolean flag=false;

  int temp=Integer.parseInt(Sage);

  if(temp!=0&&temp>0&&temp<150){

  flag=true;

  }

  return flag;

  }

  /**

  * 功能:完成对选课表学分的正确性验证

  * @param Ccredit

  * @return

  */

  public static boolean checkCcredit(String Ccredit){

  boolean flag=false;

  double temp=Double.parseDouble(Ccredit);

  if(temp>0&&((temp+"")。length()-(temp+"")。indexOf(".")-1)==1){

  flag=true;

  }

  return flag;

  }

  /**

  * 功能:完成对选课表的课程号的唯一性验证

  * @param Cno

  * @return

  */

  public static boolean onlyCno(Course []c,String Cno)

  {

  boolean flag=true;

  for(int k=0;c[k]!=null;k++)

  {

  if(c[k].GetCno()。equals(Cno))

  {

  flag=false;break;

  }

  }

  if(Cno==null)

  {

  flag=false;

  }

  return flag;

  }

  /**

  * 功能:完成对选课表的课程名的唯一性验证

  * @param c

  * @param Cname

  * @return

  */

  public static boolean onlyCname(Course []c,String Cname)

  {

  boolean flag=true;

  for(int k=0;c[k]!=null;k++)

  {

  if(c[k].GetCname()。equals(Cname))

  {

  flag=false;break;

  }

  }

  if(Cname==null){

  flag=false;

  }

  return flag;

  }

  /**

  * 功能:完成成绩表的对学号的存在性验证

  * 创建时间:2014-02-24 15:29

  */

  public static boolean existSno(Student s[],String Sno)

  {

  boolean flag=false;

  for(int k=0;s[k]!=null;k++)

  {

  if(s[k].GetSno()。equals(Sno))

  {

  flag=true;break;

  }

  }

  return flag;

  }

  /**

  * 功能:完成成绩表的对课程号的存在性验证

  * 创建时间:2014-02-24 15:35

  */

  public static boolean existCno(Course c[],String Cno){

  boolean flag=false;

  for(int k=0;c[k]!=null;k++)

  {

  if(c[k].GetCno()。equals(Cno)){

  flag=true;break;

  }

  }

  return flag;

  }

  /***

  * 功能:完成成绩表的成绩值的合格性验证

  * 创建时间:2014-02-24 15:40

  */

  public static boolean checkGrade(String Grade)

  {

  boolean flag=false;

  double temp=Double.parseDouble(Grade);

  if(temp>=0&&temp<=100&&((temp+"")。length()-(temp+"")。indexOf(".")-1)==1){

  flag=true;

  }

  return flag;

  }

  /***

  * 检测该生的该课程是否只有一个成绩

  * 创建时间:2014-03-11 23:02

  */

  public static boolean checkOnlyOneSC(SC sc[],String sno,String cno)

  {

  boolean flag=true;

  for(int k=0;sc[k]!=null;k++)

  {

  if(sc[k].GetSno()。equals(sno)&&sc[k].GetCno()。equals(cno)){

  flag=false;break;

  }

  }

  return flag;

  }

  四、使用说明

  //对学生表的单独操作说明如下:

  1、可直接对学生表进行插入,但是学号不能重复,且学号为只能数字。

  2、点击修改时先从表格选中要修改的行,再点击修改,只能对除学号以外的信息修改,然后修改变为保存字样。

  点击保存后出现提示,是则修改,提示修改成功。否则放弃修改,将界面恢复为主界面(第一张图)

  3、删除时也要先从表格中选定要删除的行,让后点击删除,是则删除,否则返回界面

  4、查找时直接点击查找按钮,弹出一个文本框,提示只能按学号查找。

  若存在该同学,则将该学生信息显示到主界面,若不存在,则提示不存在该同学。

  //对课程表的单独操作说明如下:

  1、添加时课程号不能重复,课程名也不能重复,学分只能是以为小数。

  2、修改也要先选定,在进行修改,只能修改课程的学分。与学生表操作类似。

  3、删除操作在选定后直接删除即可,附加判断,是否真的删除,是则删,不是则返回;

  4、查找时直接点击查找按钮,弹出一个文本框,输入课程名,按课程名查找。若找到,则显示信息到主界面,找不到则提示不存在。

  //对成绩表的综合操作

  1、插入时要判断该学生号和课程号是否在Student.txt和COurse.txt文件中存在。还有成绩是不是在0~100之间,若其中有一个条件不满足,则插入不会成功。

  2、修改时只能对成绩进行修改。然后点击保存,是则保存,不是则返回。

  3、删除时从表格中选中后删除即可。

  //综合查询部分

  //查询个人所有课程成绩

  1、文本框中输入学生学号,点击查询,可以查到该生所有课程成绩

  //查询某门科目的选课学生信息

  输入课程名后查询,讲查询结果添加到表格中,若不存在在该课程,则会提示课程不存在。

  五、设计总结

  本次课程设计其实从寒假就看到任务书,但是一直没有下定决心去做,所以以前有好多时间可以去准备的,但是没有付诸于实践。开学后经过老师的详细安排,自己也之前了解过数据库的基本知识,所以一下子想到了要实现的功能,以及要控制的数据,报括学号,课程号的唯一性,成绩,年龄的参照完整性,还有可控数据的处理。虽然还是有好多问题没有得意解决,但是的确学到了好多东西,一直是我感觉到,学着去做一个大的东西,分析清楚他的各种功能,然后一点一点的查找,学习,这种学习方法真的很好。就拿这次课程设计来说,老师提出了好多界面化。考虑到用户体验,于是我就想用java做,但是好多东西之前根本不知道,更不用说用了。就开始网上搜索,查找资料,等一系列学习途径,一个一个问题解决,各个击破。最终做出了还可以操作的简单界面,但是好多控制都没有加上去,好多该处理的问题都出来了,途中遇到了很棘手的问题,就是删除某一项数据,然后添加时他会给你返回"该学生学号已经存在","该课程号已经存在"等错误,经过仔细分析,原来是我把文件中的数据的确是删除了,但是没有对存储结构里的数据惊醒更新,也就是对象数组里那些值还是存在的,而我所添加的判断正是又对象数组里的值进行处理,故而提醒新添加的数据时已经存在的。

  还有就是我的综合查询,差一个学生的各科成绩,表格中就给我重复列出各科成绩信息,并且一个考场信息不止重复一次,搞得我真是烦啊,最后才发现,前面添加之后,我的对象数组是静态的,由于对他的操作是放在类外,对后面的没有初始化,所以给我出错。

  还有就是这次的课程设计从开始设计到初步完成,再到细化到各个功能,我都是先做了设计步骤的。今天完成那些功能,用怎么样的方法去完成,我都写了详细的文档,所以做的时候思路清晰,遇到问题都能很快的处理掉,还有数据的存储结构,还有完整性控制我都重新建了两个类。这样操作方便,容易找到错误,测试也很方便。所以我有了一个完整的设计思想,以及一定的设计理念,这样对我以后用其他语言,开发其他的项目,都是很好的参考。

import javax.swing.*; import java.awt.*; import java.awt.event.ActionEvent; import java.io.*; import java.nio.file.Files; import java.nio.file.Path; import java.util.HashMap; import java.util.Map; class User { private String password; private final String phone; public User(String password, String phone) { this.password = password; this.phone = phone; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } public String getPhone() { return phone; } } public class LoginSystem extends JFrame { private JComboBox<String> userTypeComboBox; private JTextField usernameField; private JPasswordField passwordField; private final Map<String, User> studentAccounts = new HashMap<>(); private final Map<String, User> teacherAccounts = new HashMap<>(); private String adminUsername = "1"; private String adminPassword = "123"; private static final String STUDENT_FILE = "students.txt"; private static final String TEACHER_FILE = "teachers.txt"; private static final String ADMIN_FILE = "admin.txt"; public LoginSystem() { initializeUI(); loadAllAccounts(); } private void initializeUI() { setTitle("学生选课系统 - 登录"); setSize(400, 400); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setLocationRelativeTo(null); JPanel panel = new JPanel(new GridBagLayout()); GridBagConstraints gbc = new GridBagConstraints(); gbc.insets = new Insets(10, 10, 10, 10); gbc.fill = GridBagConstraints.HORIZONTAL; // 用户类型选择 addComponent(panel, new JLabel("用户类型:"), 0, 0, gbc); userTypeComboBox = new JComboBox<>(new String[]{"学生", "教师", "管理员"}); userTypeComboBox.addActionListener(this::updateRegisterButton); addComponent(panel, userTypeComboBox, 1, 0, gbc); // 用户名 addComponent(panel, new JLabel("用户名:"), 0, 1, gbc); usernameField = new JTextField(15); addComponent(panel, usernameField, 1, 1, gbc); // 密码 addComponent(panel, new JLabel("密码:"), 0, 2, gbc); passwordField = new JPasswordField(15); addComponent(panel, passwordField, 1, 2, gbc); // 登录按钮 JButton loginButton = new JButton("登录"); loginButton.addActionListener(this::performLogin); addButton(panel, loginButton, 3, gbc); // 注册按钮 JButton registerButton = new JButton("学生注册"); registerButton.addActionListener(this::performRegister); addButton(panel, registerButton, 4, gbc); // 忘记密码按钮 JButton forgotButton = new JButton("忘记密码"); forgotButton.addActionListener(this::performForgotPassword); addButton(panel, forgotButton, 5, gbc); add(panel); } private void addComponent(JPanel panel, Component comp, int x, int y, GridBagConstraints gbc) { gbc.gridx = x; gbc.gridy = y; panel.add(comp, gbc); } private void addButton(JPanel panel, JButton button, int y, GridBagConstraints gbc) { gbc.gridx = 0; gbc.gridy = y; gbc.gridwidth = 2; gbc.fill = GridBagConstraints.CENTER; panel.add(button, gbc); } private void updateRegisterButton(ActionEvent e) { String userType = (String) userTypeComboBox.getSelectedItem(); for (Component comp : getContentPane().getComponents()) { if (comp instanceof JPanel) { for (Component subComp : ((JPanel) comp).getComponents()) { if (subComp instanceof JButton btn && btn.getText().contains("注册")) { btn.setText(userType + "注册"); btn.setVisible(!"管理员".equals(userType)); } } } } } private void performLogin(ActionEvent e) { String userType = (String) userTypeComboBox.getSelectedItem(); String username = usernameField.getText().trim(); String password = new String(passwordField.getPassword()).trim(); if (validateLogin(userType, username, password)) { dispose(); showUserWindow(userType, username); } } private boolean validateLogin(String userType, String username, String password) { if (username.isEmpty() || password.isEmpty()) { showError("用户名和密码不能为空"); return false; } if ("管理员".equals(userType)) { if (username.equals(adminUsername) && password.equals(adminPassword)) { showSuccess("管理员登录成功!"); return true; } showError("管理员账号或密码错误"); return false; } Map<String, User> accounts = "学生".equals(userType) ? studentAccounts : teacherAccounts; User user = accounts.get(username); if (user == null || !user.getPassword().equals(password)) { showError("用户名或密码错误"); return false; } showSuccess("登录成功!"); return true; } private void showUserWindow(String userType, String username) { JFrame frame = switch (userType) { case "学生" -> new StudentFrame(username); case "教师" -> new TeacherFrame(username); default -> new AdminFrame(username); }; frame.setVisible(true); } // 文件操作方法 private void loadAllAccounts() { loadStudents(); loadTeachers(); loadAdmin(); } private void loadStudents() { if (!Files.exists(Path.of(STUDENT_FILE))) return; try (BufferedReader br = new BufferedReader(new FileReader(STUDENT_FILE))) { String line; while ((line = br.readLine()) != null) { String[] parts = line.split(","); if (parts.length == 3) { studentAccounts.put(parts[0], new User(parts[1], parts[2])); } } } catch (IOException e) { showError("学生账户加载失败"); } } private void loadTeachers() { if (!Files.exists(Path.of(TEACHER_FILE))) return; try (BufferedReader br = new BufferedReader(new FileReader(TEACHER_FILE))) { String line; while ((line = br.readLine()) != null) { String[] parts = line.split(","); if (parts.length == 3) { teacherAccounts.put(parts[0], new User(parts[1], parts[2])); } } } catch (IOException e) { showError("教师账户加载失败"); } } private void loadAdmin() { if (!Files.exists(Path.of(ADMIN_FILE))) { saveAdmin(); return; } try (BufferedReader br = new BufferedReader(new FileReader(ADMIN_FILE))) { String line = br.readLine(); if (line != null) { String[] parts = line.split(","); if (parts.length == 2) { adminUsername = parts[0]; adminPassword = parts[1]; } } } catch (IOException e) { showError("管理员账户加载失败"); } } private void saveAdmin() { try (BufferedWriter bw = new BufferedWriter(new FileWriter(ADMIN_FILE))) { bw.write(adminUsername + "," + adminPassword); } catch (IOException e) { showError("管理员账户保存失败"); } } // 注册功能 private void performRegister(ActionEvent e) { String userType = (String) userTypeComboBox.getSelectedItem(); new RegisterDialog(userType).setVisible(true); } private class RegisterDialog extends JDialog { private final String userType; public RegisterDialog(String userType) { super(LoginSystem.this, userType + "注册", true); this.userType = userType; initialize(); } private void initialize() { setLayout(new GridLayout(6, 2, 10, 10)); setSize(350, 250); JTextField userField = new JTextField(); JPasswordField passField = new JPasswordField(); JPasswordField confirmField = new JPasswordField(); JTextField phoneField = new JTextField(); addComponents(userField, passField, confirmField, phoneField); JButton registerBtn = new JButton("注册"); registerBtn.addActionListener(e -> processRegistration( userField.getText().trim(), new String(passField.getPassword()).trim(), new String(confirmField.getPassword()).trim(), phoneField.getText().trim() )); JButton cancelBtn = new JButton("取消"); cancelBtn.addActionListener(e -> dispose()); add(registerBtn); add(cancelBtn); setLocationRelativeTo(LoginSystem.this); } private void addComponents(JTextField userField, JPasswordField passField, JPasswordField confirmField, JTextField phoneField) { add(new JLabel("注册类型:")); add(new JLabel(userType)); add(new JLabel("用户名:")); add(userField); add(new JLabel("密码:")); add(passField); add(new JLabel("确认密码:")); add(confirmField); add(new JLabel("手机号:")); add(phoneField); } private void processRegistration(String username, String password, String confirm, String phone) { if (!validateInput(username, password, confirm, phone)) return; Map<String, User> accounts = "学生".equals(userType) ? studentAccounts : teacherAccounts; accounts.put(username, new User(password, phone)); saveToFile(username, password, phone); showSuccess(userType + "注册成功!"); dispose(); } private boolean validateInput(String username, String password, String confirm, String phone) { if (username.isEmpty() || password.isEmpty() || phone.isEmpty()) { showError("所有字段不能为空"); return false; } if (!password.equals(confirm)) { showError("两次输入的密码不一致"); return false; } if (!phone.matches("^1[3-9]\\d{9}$")) { showError("手机号格式不正确"); return false; } Map<String, User> accounts = "学生".equals(userType) ? studentAccounts : teacherAccounts; if (accounts.containsKey(username)) { showError("用户名已存在"); return false; } return true; } private void saveToFile(String username, String password, String phone) { String filename = "学生".equals(userType) ? STUDENT_FILE : TEACHER_FILE; try (BufferedWriter bw = new BufferedWriter(new FileWriter(filename, true))) { bw.write(username + "," + password + "," + phone); bw.newLine(); } catch (IOException ex) { showError("账户保存失败"); } } } // 忘记密码功能 private void performForgotPassword(ActionEvent e) { new ForgotPasswordDialog().setVisible(true); } private class ForgotPasswordDialog extends JDialog { public ForgotPasswordDialog() { super(LoginSystem.this, "忘记密码", true); initialize(); } private void initialize() { setLayout(new GridLayout(4, 2, 10, 10)); setSize(300, 200); JComboBox<String> typeCombo = new JComboBox<>(new String[]{"学生", "教师"}); JTextField userField = new JTextField(); JTextField phoneField = new JTextField(); addComponents(typeCombo, userField, phoneField); JButton submitBtn = new JButton("提交"); submitBtn.addActionListener(e -> processVerification( (String) typeCombo.getSelectedItem(), userField.getText().trim(), phoneField.getText().trim() )); JButton cancelBtn = new JButton("取消"); cancelBtn.addActionListener(e -> dispose()); add(submitBtn); add(cancelBtn); setLocationRelativeTo(LoginSystem.this); } private void addComponents(JComboBox<String> typeCombo, JTextField userField, JTextField phoneField) { add(new JLabel("用户类型:")); add(typeCombo); add(new JLabel("用户名:")); add(userField); add(new JLabel("手机号:")); add(phoneField); } private void processVerification(String userType, String username, String phone) { Map<String, User> accounts = "学生".equals(userType) ? studentAccounts : teacherAccounts; User user = accounts.get(username); if (user == null || !user.getPhone().equals(phone)) { showError("用户名或手机号错误"); return; } dispose(); new ResetPasswordDialog(userType, username).setVisible(true); } } private class ResetPasswordDialog extends JDialog { private final String userType; private final String username; public ResetPasswordDialog(String userType, String username) { super(LoginSystem.this, "重置密码", true); this.userType = userType; this.username = username; initialize(); } private void initialize() { setLayout(new GridLayout(3, 2, 10, 10)); setSize(300, 150); JPasswordField newPassField = new JPasswordField(); JPasswordField confirmField = new JPasswordField(); addComponents(newPassField, confirmField); JButton submitBtn = new JButton("提交"); submitBtn.addActionListener(e -> processReset( new String(newPassField.getPassword()).trim(), new String(confirmField.getPassword()).trim() )); add(submitBtn); setLocationRelativeTo(LoginSystem.this); } private void addComponents(JPasswordField newPassField, JPasswordField confirmField) { add(new JLabel("新密码:")); add(newPassField); add(new JLabel("确认密码:")); add(confirmField); } private void processReset(String newPass, String confirm) { if (!newPass.equals(confirm)) { showError("两次输入的密码不一致"); return; } Map<String, User> accounts = "学生".equals(userType) ? studentAccounts : teacherAccounts; User user = accounts.get(username); user.setPassword(newPass); updatePasswordFile(); showSuccess("密码重置成功!"); dispose(); } private void updatePasswordFile() { String filename = "学生".equals(userType) ? STUDENT_FILE : TEACHER_FILE; try (BufferedWriter bw = new BufferedWriter(new FileWriter(filename))) { Map<String, User> accounts = "学生".equals(userType) ? studentAccounts : teacherAccounts; for (Map.Entry<String, User> entry : accounts.entrySet()) { bw.write(entry.getKey() + "," + entry.getValue().getPassword() + "," + entry.getValue().getPhone()); bw.newLine(); } } catch (IOException ex) { showError("密码更新失败"); } } } // 用户界面基类 private abstract class UserFrame extends JFrame { public UserFrame(String title) { setTitle(title); setSize(600, 400); setLocationRelativeTo(null); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); addReturnButton(); } private void addReturnButton() { JPanel panel = new JPanel(new FlowLayout(FlowLayout.RIGHT)); JButton returnButton = new JButton("返回登录"); returnButton.addActionListener(e -> { dispose(); new LoginSystem().setVisible(true); }); add(panel, BorderLayout.NORTH); } } private class StudentFrame extends UserFrame { public StudentFrame(String username) { super("学生界面 - " + username); // 添加学生特有组件 } } private class TeacherFrame extends UserFrame { public TeacherFrame(String username) { super("教师界面 - " + username); // 添加教师特有组件 } } private class AdminFrame extends UserFrame { public AdminFrame(String username) { super("管理员界面 - " + username); // 添加管理员特有组件 } } // 工具方法 private void showError(String message) { JOptionPane.showMessageDialog(this, message, "错误", JOptionPane.ERROR_MESSAGE); } private void showSuccess(String message) { JOptionPane.showMessageDialog(this, message, "成功", JOptionPane.INFORMATION_MESSAGE); } public static void main(String[] args) { SwingUtilities.invokeLater(() -> new LoginSystem().setVisible(true)); } }
最新发布
05-28
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值