请把下面的Student对象的gender字段对外隐藏起来,用get_gender()和set_gender()代替,并检查参数有效性:

本文介绍了一个使用Python定义学生类的实例,展示了如何通过__init__方法初始化对象属性,并使用__gender实现属性的封装,使其对外部隐藏。同时,通过get_gender和set_gender方法提供了访问和修改gender属性的安全途径。
class Student(object):
    def __init__(self, name, gender):
        self.name = name
        self.__gender = gender    #让gender属性对外部隐藏
    def get_gender(self):
        return self.__gender         
    def set_gender(self, gender):
        if gender == 'male' or gender == 'female':     #对gender的参数进行有效性判断
            self.__gender = gender
        else:
            raise ValueError('incorrect gender')
import tkinter as tk from tkinter import ttk, messagebox, filedialog import json import os import csv from datetime import datetime class StudentManagementSystem: def __init__(self, root): self.root = root self.root.title("学生信息管理系统 v1.0") self.root.geometry("1000x600") self.root.configure(bg="#f0f2f5") # 初始化数据 self.students = [] self.current_file = None self.load_data() # 创建样式 self.create_styles() # 创建界面组件 self.create_widgets() # 加载数据到表格 self.load_table_data() def create_styles(self): """创建自定义样式""" style = ttk.Style() # 配置Treeview样式 style.configure("Treeview", font=("Arial", 11), rowheight=25, background="#FFFFFF", fieldbackground="#FFFFFF") style.configure("Treeview.Heading", font=("Arial", 12, "bold"), background="#4A90E2", foreground="white") # 配置按钮样式 style.configure("TButton", font=("Arial", 11), padding=6) style.map("TButton", background=[("active", "#4A90E2"), ("!active", "#5A9AE6")], foreground=[("active", "white"), ("!active", "white")]) # 配置标签样式 style.configure("Title.TLabel", font=("Arial", 16, "bold"), background="#f0f2f5", foreground="#333333") style.configure("Subtitle.TLabel", font=("Arial", 12), background="#f0f2f5", foreground="#666666") def create_widgets(self): """创建界面组件""" # 创建顶部标题 header_frame = ttk.Frame(self.root) header_frame.pack(fill="x", padx=20, pady=10) title_label = ttk.Label(header_frame, text="学生信息管理系统", style="Title.TLabel") title_label.pack(side="left") subtitle_label = ttk.Label(header_frame, text="管理学生信息,支持增删改查操作", style="Subtitle.TLabel") subtitle_label.pack(side="left", padx=10) # 创建工具栏 toolbar_frame = ttk.Frame(self.root) toolbar_frame.pack(fill="x", padx=20, pady=5) self.create_toolbar_buttons(toolbar_frame) # 创建搜索区域 search_frame = ttk.Frame(self.root) search_frame.pack(fill="x", padx=20, pady=10) self.create_search_area(search_frame) # 创建学生表格 table_frame = ttk.Frame(self.root) table_frame.pack(fill="both", expand=True, padx=20, pady=5) self.create_student_table(table_frame) # 状态栏 self.status_var = tk.StringVar(value="就绪 | 学生总数: 0") status_bar = ttk.Label(self.root, textvariable=self.status_var, relief="sunken", anchor="w", padding=(10, 5)) status_bar.pack(side="bottom", fill="x") def create_toolbar_buttons(self, parent): """创建工具栏按钮""" button_data = [ ("添加学生", self.add_student, "#27AE60"), ("编辑学生", self.edit_student, "#F39C12"), ("删除学生", self.delete_student, "#E74C3C"), ("刷新", self.refresh_data, "#3498DB"), ("保存", self.save_data, "#2ECC71"), ("另存为", self.save_as, "#9B59B6"), ("导入", self.import_data, "#1ABC9C"), ("导出", self.export_data, "#16A085"), ("关于", self.show_about, "#7F8C8D"), ] for text, command, color in button_data: btn = ttk.Button(parent, text=text, command=command, style="TButton") btn.configure(style="TButton") btn.pack(side="left", padx=5) def create_search_area(self, parent): """创建搜索区域""" ttk.Label(parent, text="搜索:", font=("Arial", 11)).pack(side="left", padx=(0, 5)) self.search_var = tk.StringVar() search_entry = ttk.Entry(parent, textvariable=self.search_var, width=30, font=("Arial", 11)) search_entry.pack(side="left", padx=5) search_entry.bind("<KeyRelease>", self.search_students) search_btn = ttk.Button(parent, text="搜索", command=self.search_students, style="TButton") search_btn.pack(side="left", padx=5) clear_btn = ttk.Button(parent, text="清除", command=self.clear_search, style="TButton") clear_btn.pack(side="left", padx=5) # 搜索选项 ttk.Label(parent, text="按:", font=("Arial", 11)).pack(side="left", padx=(20, 5)) self.search_by_var = tk.StringVar(value="姓名") search_options = ttk.Combobox(parent, textvariable=self.search_by_var, values=["学号", "姓名", "班级", "专业"], state="readonly", width=8) search_options.pack(side="left", padx=5) def create_student_table(self, parent): """创建学生表格""" # 创建滚动条 scroll_y = ttk.Scrollbar(parent, orient="vertical") scroll_x = ttk.Scrollbar(parent, orient="horizontal") # 创建表格 columns = ("student_id", "name", "gender", "age", "class", "major", "phone", "email") self.tree = ttk.Treeview(parent, columns=columns, show="headings", yscrollcommand=scroll_y.set, xscrollcommand=scroll_x.set, selectmode="browse") # 配置列 self.tree.column("student_id", width=100, anchor="center") self.tree.column("name", width=100, anchor="center") self.tree.column("gender", width=80, anchor="center") self.tree.column("age", width=60, anchor="center") self.tree.column("class", width=120, anchor="center") self.tree.column("major", width=150, anchor="center") self.tree.column("phone", width=120, anchor="center") self.tree.column("email", width=180, anchor="center") # 设置列标题 self.tree.heading("student_id", text="学号") self.tree.heading("name", text="姓名") self.tree.heading("gender", text="性别") self.tree.heading("age", text="年龄") self.tree.heading("class", text="班级") self.tree.heading("major", text="专业") self.tree.heading("phone", text="电话") self.tree.heading("email", text="邮箱") # 配置滚动条 scroll_y.config(command=self.tree.yview) scroll_x.config(command=self.tree.xview) # 布局 self.tree.pack(side="left", fill="both", expand=True) scroll_y.pack(side="right", fill="y") scroll_x.pack(side="bottom", fill="x") # 绑定双击事件 self.tree.bind("<Double-1>", self.on_row_double_click) def load_data(self): """尝试加载上次打开的数据""" try: if os.path.exists("last_session.json"): with open("last_session.json", "r", encoding="utf-8") as f: data = json.load(f) self.students = data.get("students", []) self.current_file = data.get("current_file") except: self.students = [] self.current_file = None def save_session(self): """保存当前会话信息""" session_data = { "students": self.students, "current_file": self.current_file } with open("last_session.json", "w", encoding="utf-8") as f: json.dump(session_data, f, ensure_ascii=False, indent=2) def load_table_data(self): """加载数据到表格""" # 清空表格 for row in self.tree.get_children(): self.tree.delete(row) # 添加数据 for student in self.students: self.tree.insert("", "end", values=( student.get("student_id", ""), student.get("name", ""), student.get("gender", ""), student.get("age", ""), student.get("class", ""), student.get("major", ""), student.get("phone", ""), student.get("email", "") )) # 更新状态栏 self.status_var.set(f"就绪 | 学生总数: {len(self.students)}") def add_student(self): """打开添加学生对话框""" dialog = tk.Toplevel(self.root) dialog.title("添加学生") dialog.geometry("400x500") dialog.transient(self.root) dialog.grab_set() # 表单字段 fields = [ ("学号*", "student_id"), ("姓名*", "name"), ("性别", "gender"), ("年龄", "age"), ("班级", "class"), ("专业", "major"), ("电话", "phone"), ("邮箱", "email") ] entries = {} for i, (label_text, field_name) in enumerate(fields): frame = ttk.Frame(dialog) frame.pack(fill="x", padx=20, pady=5) label = ttk.Label(frame, text=label_text, width=10, anchor="e") label.pack(side="left", padx=5) entry = ttk.Entry(frame, width=30) entry.pack(side="left", fill="x", expand=True, padx=5) entries[field_name] = entry # 性别选项 gender_frame = ttk.Frame(dialog) gender_frame.pack(fill="x", padx=20, pady=5) ttk.Label(gender_frame, text="性别", width=10, anchor="e").pack(side="left", padx=5) gender_var = tk.StringVar(value="男") ttk.Radiobutton(gender_frame, text="男", variable=gender_var, value="男").pack(side="left", padx=5) ttk.Radiobutton(gender_frame, text="女", variable=gender_var, value="女").pack(side="left", padx=5) entries["gender"] = gender_var # 按钮区域 button_frame = ttk.Frame(dialog) button_frame.pack(fill="x", padx=20, pady=20) def save(): student_data = {} for field, entry in entries.items(): if isinstance(entry, tk.Entry): value = entry.get().strip() else: # StringVar value = entry.get() student_data[field] = value # 验证必填字段 if not student_data.get("student_id") or not student_data.get("name"): messagebox.showerror("错误", "学号姓名是必填项!") return # 检查学号是否重复 for s in self.students: if s["student_id"] == student_data["student_id"]: messagebox.showerror("错误", "该学号已存在!") return self.students.append(student_data) self.load_table_data() messagebox.showinfo("成功", "学生添加成功!") dialog.destroy() ttk.Button(button_frame, text="保存", command=save, style="TButton").pack(side="right", padx=10) ttk.Button(button_frame, text="取消", command=dialog.destroy, style="TButton").pack(side="right") def edit_student(self): """编辑选中的学生""" selected = self.tree.selection() if not selected: messagebox.showwarning("警告", "先选择一个学生!") return item = selected[0] values = self.tree.item(item, "values") student_id = values[0] # 找到学生数据 student = None for s in self.students: if s["student_id"] == student_id: student = s break if not student: messagebox.showerror("错误", "未找到学生信息!") return # 打开编辑对话框 dialog = tk.Toplevel(self.root) dialog.title("编辑学生") dialog.geometry("400x500") dialog.transient(self.root) dialog.grab_set() # 表单字段 fields = [ ("学号", "student_id"), ("姓名", "name"), ("性别", "gender"), ("年龄", "age"), ("班级", "class"), ("专业", "major"), ("电话", "phone"), ("邮箱", "email") ] entries = {} for i, (label_text, field_name) in enumerate(fields): frame = ttk.Frame(dialog) frame.pack(fill="x", padx=20, pady=5) label = ttk.Label(frame, text=label_text, width=10, anchor="e") label.pack(side="left", padx=5) entry = ttk.Entry(frame, width=30) entry.insert(0, student.get(field_name, "")) entry.pack(side="left", fill="x", expand=True, padx=5) # 学号不可编辑 if field_name == "student_id": entry.config(state="readonly") entries[field_name] = entry # 性别选项 gender_frame = ttk.Frame(dialog) gender_frame.pack(fill="x", padx=20, pady=5) ttk.Label(gender_frame, text="性别", width=10, anchor="e").pack(side="left", padx=5) gender_var = tk.StringVar(value=student.get("gender", "男")) ttk.Radiobutton(gender_frame, text="男", variable=gender_var, value="男").pack(side="left", padx=5) ttk.Radiobutton(gender_frame, text="女", variable=gender_var, value="女").pack(side="left", padx=5) entries["gender"] = gender_var # 按钮区域 button_frame = ttk.Frame(dialog) button_frame.pack(fill="x", padx=20, pady=20) def save(): updated_data = {} for field, entry in entries.items(): if isinstance(entry, tk.Entry): value = entry.get().strip() else: # StringVar value = entry.get() updated_data[field] = value # 验证必填字段 if not updated_data.get("student_id") or not updated_data.get("name"): messagebox.showerror("错误", "学号姓名是必填项!") return # 更新学生数据 for i, s in enumerate(self.students): if s["student_id"] == updated_data["student_id"]: self.students[i] = updated_data break self.load_table_data() messagebox.showinfo("成功", "学生信息更新成功!") dialog.destroy() ttk.Button(button_frame, text="保存", command=save, style="TButton").pack(side="right", padx=10) ttk.Button(button_frame, text="取消", command=dialog.destroy, style="TButton").pack(side="right") def delete_student(self): """删除选中的学生""" selected = self.tree.selection() if not selected: messagebox.showwarning("警告", "先选择一个学生!") return item = selected[0] values = self.tree.item(item, "values") student_id = values[0] name = values[1] if messagebox.askyesno("确认删除", f"确定要删除学生 {name}(学号:{student_id}) 吗?"): # 从数据中删除 self.students = [s for s in self.students if s["student_id"] != student_id] self.load_table_data() messagebox.showinfo("成功", "学生删除成功!") def on_row_double_click(self, event): """双击行打开编辑对话框""" self.edit_student() def search_students(self, event=None): """搜索学生""" keyword = self.search_var.get().lower() search_by = self.search_by_var.get() if not keyword: self.load_table_data() return # 清空表格 for row in self.tree.get_children(): self.tree.delete(row) # 添加匹配的数据 count = 0 for student in self.students: # 根据搜索型确定搜索字段 if search_by == "学号": field_value = student.get("student_id", "").lower() elif search_by == "姓名": field_value = student.get("name", "").lower() elif search_by == "班级": field_value = student.get("class", "").lower() elif search_by == "专业": field_value = student.get("major", "").lower() else: field_value = "" if keyword in field_value: self.tree.insert("", "end", values=( student.get("student_id", ""), student.get("name", ""), student.get("gender", ""), student.get("age", ""), student.get("class", ""), student.get("major", ""), student.get("phone", ""), student.get("email", "") )) count += 1 # 更新状态栏 self.status_var.set(f"搜索: '{keyword}' | 找到 {count} 个学生") def clear_search(self): """清除搜索""" self.search_var.set("") self.load_table_data() def refresh_data(self): """刷新数据""" self.load_table_data() messagebox.showinfo("刷新", "数据已刷新!") def save_data(self): """保存数据到当前文件""" if not self.current_file: self.save_as() return try: with open(self.current_file, "w", encoding="utf-8") as f: json.dump(self.students, f, ensure_ascii=False, indent=2) messagebox.showinfo("成功", f"数据已保存到 {self.current_file}") self.save_session() except Exception as e: messagebox.showerror("错误", f"保存文件时出错: {str(e)}") def save_as(self): """另存为数据文件""" file_path = filedialog.asksaveasfilename( defaultextension=".json", filetypes=[("JSON文件", "*.json"), ("所有文件", "*.*")], title="保存学生数据" ) if not file_path: return try: with open(file_path, "w", encoding="utf-8") as f: json.dump(self.students, f, ensure_ascii=False, indent=2) self.current_file = file_path messagebox.showinfo("成功", f"数据已保存到 {file_path}") self.save_session() except Exception as e: messagebox.showerror("错误", f"保存文件时出错: {str(e)}") def import_data(self): """导入数据""" file_path = filedialog.askopenfilename( filetypes=[("JSON文件", "*.json"), ("CSV文件", "*.csv"), ("所有文件", "*.*")], title="选择要导入的文件" ) if not file_path: return try: if file_path.endswith(".json"): with open(file_path, "r", encoding="utf-8") as f: new_data = json.load(f) # 合数据(避免重复学号) existing_ids = {s["student_id"] for s in self.students} for student in new_data: if student.get("student_id") and student["student_id"] not in existing_ids: self.students.append(student) existing_ids.add(student["student_id"]) messagebox.showinfo("成功", f"成功导入 {len(new_data)} 条学生记录") elif file_path.endswith(".csv"): with open(file_path, "r", encoding="utf-8") as f: reader = csv.DictReader(f) new_data = list(reader) # 合数据(避免重复学号) existing_ids = {s["student_id"] for s in self.students} count = 0 for row in new_data: if row.get("student_id") and row["student_id"] not in existing_ids: # 转换数据型 if "age" in row and row["age"]: try: row["age"] = int(row["age"]) except ValueError: row["age"] = "" self.students.append(row) existing_ids.add(row["student_id"]) count += 1 messagebox.showinfo("成功", f"成功导入 {count} 条学生记录") self.current_file = None self.load_table_data() self.save_session() except Exception as e: messagebox.showerror("错误", f"导入文件时出错: {str(e)}") def export_data(self): """导出数据""" if not self.students: messagebox.showwarning("警告", "没有数据可导出!") return file_path = filedialog.asksaveasfilename( defaultextension=".csv", filetypes=[("CSV文件", "*.csv"), ("JSON文件", "*.json"), ("所有文件", "*.*")], title="导出学生数据" ) if not file_path: return try: if file_path.endswith(".json"): with open(file_path, "w", encoding="utf-8") as f: json.dump(self.students, f, ensure_ascii=False, indent=2) elif file_path.endswith(".csv"): fieldnames = ["student_id", "name", "gender", "age", "class", "major", "phone", "email"] with open(file_path, "w", encoding="utf-8", newline="") as f: writer = csv.DictWriter(f, fieldnames=fieldnames) writer.writeheader() writer.writerows(self.students) messagebox.showinfo("成功", f"数据已导出到 {file_path}") except Exception as e: messagebox.showerror("错误", f"导出文件时出错: {str(e)}") def show_about(self): """显示关于信息""" about_text = f""" 学生信息管理系统 v1.0 功能: - 学生信息的增删改查 - 数据导入导出 - 搜索筛选 - 数据持久化存储 开发人员:Python课设小组 开发日期:2023-11-15 当前数据:{len(self.students)} 名学生 """ messagebox.showinfo("关于", about_text.strip()) if __name__ == "__main__": root = tk.Tk() app = StudentManagementSystem(root) root.mainloop() 把按钮字体变成黑色,美观一点
06-22
# 题目重述 完成以下任务: 1. 定义一个 `Student` ,包含以下属性方法: - 属性:姓名 `name`(String)、性别 `gender`(String)、年龄 `age`(int)、分数 `score`(double)。 - 方法:无参构造方法、全参构造方法,以及所有属性的 `get` `set` 方法。 2. 定义测试: - 在 `main` 方法中读取 `student.txt` 文件中的数据。 - 将文件中的每条数据封装为一个 `Student` 对象存储到 `ArrayList<Student>` 集合中。 - 最后将集合中的所有学生信息输出到控制台。 # 给出答案(答案为带注释的代码块) ```java import java.io.*; import java.util.*; // 学生定义 class Student { // 属性 private String name; private String gender; private int age; private double score; // 无参构造方法 public Student() {} // 全参构造方法 public Student(String name, String gender, int age, double score) { this.name = name; this.gender = gender; this.age = age; this.score = score; } // getset方法 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } public double getScore() { return score; } public void setScore(double score) { this.score = score; } // 重写toString方法便于输出 @Override public String toString() { return "姓名:" + name + ",性别:" + gender + ",年龄:" + age + ",分数:" + score; } } // 测试 public class StudentTest { public static void main(String[] args) { // 创建ArrayList集合存储Student对象 List<Student> students = new ArrayList<>(); // 读取student.txt文件 try (BufferedReader br = new BufferedReader(new FileReader("student.txt"))) { String line; while ((line = br.readLine()) != null) { // 假设每行数据格式为:姓名,性别,年龄,分数 String[] parts = line.split(","); if (parts.length == 4) { String name = parts[0].trim(); String gender = parts[1].trim(); int age = Integer.parseInt(parts[2].trim()); double score = Double.parseDouble(parts[3].trim()); // 创建Student对象添加到集合 Student student = new Student(name, gender, age, score); students.add(student); } } // 输出所有学生信息 for (Student s : students) { System.out.println(s); } } catch (IOException e) { System.err.println("文件读取错误:" + e.getMessage()); } catch (NumberFormatException e) { System.err.println("数据格式错误:" + e.getMessage()); } } } ``` # 代码解析 1. **Student 设计**: - 使用 `private` 封装四个属性,确保数据安全性。 - 提供两个构造方法:默认构造函数用于通用创建;全参构造函数用于初始化所有属性。 - 所有属性提供 `get/set` 方法,符合 JavaBean 规范。 - 重写 `toString()` 方法,便于打印对象信息。 2. **测试逻辑**: - 使用 `ArrayList<Student>` 动态存储多个学生对象。 - 利用 `BufferedReader` 逐行读取 `student.txt` 文件。 - 每行使用 `split(",")` 分割字符串,解析出各字段。 - 使用 `Integer.parseInt()` `Double.parseDouble()` 转换数值型。 - 异常处理覆盖文件不存在、格式错误等情况,增强程序健壮性。 - 最终通过遍历集合输出所有学生信息。 3. **假设文件格式**: - `student.txt` 中每行代表一个学生,字段以英文逗号分隔,例如: ``` 张三,男,20,85.5 李四,女,19,90.0 ``` # 知识点(列出该代码中遇到的知识点) - **面向对象封装**:通过定义属性与方法,使用 private 修饰属性提供 get/set 方法,实现数据封装与访问控制。 - **文件输入输出(I/O)**:利用 BufferedReader FileReader 读取文本文件,掌握字符流的使用及资源自动关闭 try-with-resources 语法。 - **集合框架 ArrayList**:使用 ArrayList 存储对象集合,理解泛型 List<Student> 的声明与遍历操作。 用字符流
最新发布
09-01
我正在编辑【java】代码,遇到了输出错误 【student.Student@15db9742 student.Student@6d06d69c student.Student@7852e922 worker.Worker@4e25154f worker.Worker@70dea4e worker.Worker@5c647e05】 ,题目为【第一题:为某学校定义如下的测试其正确性: (1)在student包中定义一个学生Student,包括成员变量:学生姓名(name)、性别(gender)、学号(stID)、班级(stClass)。 定义不同参数的构造器(构造方法重载),用以初始化不同成员变量,构造不同的对象。针对成员变量,设计相应的访问器方法(getXXX)修改器方法(setXXX)。 (2)在包worker定义一个工人Worker,包括成员变量:工人姓名(name)、性别(gender)、工号(workerID)、部门(department)。定义不同参数的构造器(构造方法重载),用以初始化不同成员变量,构造不同的对象。针对成员变量,设计相应的访问器方法(getXXX)修改器方法(setXXX)。 (3)在包test中定义主Test,在main方法中分别创建3个Student对象3个Worker的对象,用相应的数组来存储这些对象,遍历对象数组输出各对象信息(对象中各个成员变量的值)。如“张三,男,2003123,计算机2班”,“李四,女,1001,后勤处。”】帮我检查改正错误点。我的原始代码如下: 【package student; public class Student { private String name; private String gender; private int stID; private String stClass; //四个参数 public Student(String name, String gender, int stID, String stClass) { this.name = name; this.gender = gender; this.stID = stID; this.stClass = stClass; } //三个参数 public Student(String name, String gender, int stID) { super(); this.name = name; this.gender = gender; this.stID = stID; } //两个参数 public Student(String name, String gender) { super(); this.name = name; this.gender = gender; } //方法定义 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getStID() { return stID; } public void setStID(int stID) { this.stID = stID; } public String getStClass() { return stClass; } public void setStClass(String stClass) { this.stClass = stClass; } }package worker; public class Worker { private String name; private String gender; private int workerID; private String department; //四个参数 public Worker(String name, String gender, int workerID, String department) { super(); this.name = name; this.gender = gender; this.workerID = workerID; this.department = department; } //三个参数 public Worker(String name, String gender, int workerID) { super(); this.name = name; this.gender = gender; this.workerID = workerID; } //两个参数 public Worker(String name, String gender) { super(); this.name = name; this.gender = gender; } //方法定义 public String getName() { return name; } public void setName(String name) { this.name = name; } public String getGender() { return gender; } public void setGender(String gender) { this.gender = gender; } public int getWorkerID() { return workerID; } public void setWorkerID(int workerID) { this.workerID = workerID; } public String getDepartment() { return department; } public void setDepartment(String department) { this.department = department; } }package test; import student.Student; import worker.Worker; public class Test { public static void main(String[] args) { Student students[]=new Student[3]; students[0]=new Student("张三","男",1001,"语文1班"); students[1]=new Student("李师傅","男",1002,"数学3班"); students[2]=new Student("何可","女",1003,"英语5班"); for(Student student:students) { System.out.println(student); } Worker workers[]=new Worker[3]; workers[0]=new Worker("简洁","女",202501,"后勤部"); workers[1]=new Worker("松江","女",202502,"财务部"); workers[2]=new Worker("沈阳","男",202503,"行政部"); for(Worker worker:workers) { System.out.println(worker); } } }】
03-23
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值