基于c#的c/s网吧管理系统开发

        本人是在读大二软件工程学生,本c#开发的系统适合初学者借鉴与参考的简单的管理系统,系统有些内容为了方便做的简单,有兴趣可以自己开发,欢迎大家积极讨论交流,如有需要可以给小编留言。话不多说,直接上教学!!

资源公开在百度网盘:

链接:https://pan.baidu.com/s/1Vr0gRDLoeH3vUnqJ1OpYoA 
提取码:ngjh

系统目录

前言

一、开发环境

二、系统功能设计    

三、系统数据库设计    

四、系统实现  

总结


前言

        本人是在读软件工程专业学生,此系统为实训开发,只是一个基础框架,还有很多内容有待完善,大家可以在评论区一起交流学习,此处会奉上尽可能详细的教学以及源代码,此系统开源的源码仅限制学习使用,仅限制学习使用!!


一、开发环境

        本项目系统基于Windows11,Visual Studio2022,SqlServer2008、Navicat Premium 12、窗体美化工具WinFormSkin

二、系统功能设计    

        本网咖管理系统能满足网咖的日常需求,其中包括:会员注册、修改密码、会员充值、会员注销、会员上机、会员下机、会员换机、信息查询以及管理员注册、退出系统、注销登录、帮助、关于作者等功能。

1. 会员模块

  1. 1 会员注册模块

        输入符合格式的用户名和密码即可注册成功。

  1. 2 修改密码模块

        输入正确的用户名和旧密码后输入两次一样的新密码即可修改密码。

  1. 3 会员充值模块

        当用户余额不足时可通过查找会员号和输入金额来进行充值。

  1. 4 会员注销模块

        可以注销用户的当前账号。

  1. 5 会员上机模块

        会员选择主机进行登记即可进行使用。

  1. 6 会员下机模块

        会员使用完毕后将上机信息、下机时间以及消费金额等信息即可完成下机。

  1. 7 会员换机模块

        当会员当前使用的机器出现故障时,输入当前机器信息和想要换的机器信息,并将信息存储起来即可完成换机操作。

  1. 8 信息查询模块

        当会员忘记自己的信息时可查询到自己的所有信息。

2. 系统模块

      2.1管理员注册模块

        本系统的所有操作都有管理员进行,在登录界面点击管理员注册输入符合要求的管理员账号以及两次相同的密码即可注册成功用于操作的管理员账号。

      2.2 退出系统模块

        点击退出系统按钮会关闭网咖管理系统。

      2.3 注销登录模块

        点击菜单栏注销按钮会退出当前登录的网吧管理系统,回到登录页面。

      2.4 帮助模块

        点击帮助按钮会弹出一些问题的解决办法。

      2.5 关于作者模块

        点击关于作者按钮会弹出作者信息以及作者联系方式等。        

        本系统功能模块设计如图1.1所示。

图1.1 飞天网咖管理系统功能模块图

三、系统数据库设计    

SQLServer 自增主键创建语法:identity(seed, increment) 其中 seed 起始值   increment 增量

不懂得同学自行百度,此处不予以给出。

1. 管理员信息表(admin)

        是用来存储管理员用户名和密码的,包括管理员用户名(admin)、密码(password)。管理员信息表结构如表1.2所示。

字段名称

数据类型

是否允许为空

字段说明

admin

char(10)

管理员用户名

password

int

密码

表1.2 管理员信息表(admin)

2. 会员信息表(vip)

        是用来存储会员信息的,包括会员编号(vid)、会员账号(vnum)、会员密码(vpassword)、卡上余额(vbalance)、以及办卡时间(vtime)。会员信息表如表1.3所示。(vid为主键需设置为自增主键)

字段名称

数据类型

是否允许为空

字段说明

vid

int

会员编号

vnum

varchar(20)

会员账号

vpassword

varchar(20)

会员密码

vbalance

int

卡上余额

vtime

datetime

办卡时间

                                                                                                           表1.3 会员信息表(vip)

3. 电脑信息表(pc)

        是用来存储电脑信息的,包括电脑编号(pcid)、状态(pcstate)、电脑描述(pcnode)。电脑信息表如表1.4所示。(pcid为主键需设置为自增主键)

字段名称

数据类型

是否允许为空

字段说明

pcid

int

电脑编号

pcstate

int

状态

pcnode

varchar(300)

电脑描述

                                                                                                          表1.4 电脑信息表(pc)

4. 上机记录表(onlinepc)

        是用来存储上机记录的,包括记录编号(onid)、会员编号(vid)、电脑编号(pcid)、上机时间(begintime)、下机时间(endtime)、下机费用(price)。上机记录表如表1.5所示。(onid为主键需设置为自增主键)

字段名称

数据类型

是否允许为空

字段说明

onid

int

记录编号

vid

int

会员编号

pcid

int

电脑编号

begintime

datetime

上机时间

endtime

datetime

下机时间

price

int

上机费用

                                                                                                         表1.5 电脑信息表(onlinepc)

四、系统实现  

        1. 系统架构        

        本系统采用了.NET Framework 4.6的系统框架。建立了网咖管理系统解决方案,使用using引用了程序集,创建了12个项目的Windows窗体,分别是会员注册、修改密码、会员充值、会员注销、会员上机、会员下机、会员换机、信息查询以及管理员注册、登录、帮助、关于作者。系统整体架构图如图2.1所示。

图2.1 系统架构图

        图2.1系统架构图创建的类属性里存储了一些的公共方法,在程序中可直接引用,节省了一些重复代码的书写,program为程序接口,ValidCode是绘制验证码公共方法,DBwangba和SqlHelper封装数据库操作,大量减少重复代码使用,同时调用lrisskin4.dll对form窗体进行了美化处理如图2.2所示。

图2.2 工具类管理员注册模块

        2. 管理员注册模块

        使用此系统需要一个管理员账户进行登录,点击“还没有,点我注册!”超链接会跳转如图所示的界面,如果用户时第一次使用必须先进行注册。输入符合规则的账号和两次一样的密码点击注册按钮即可注册成功。如图2.3所示。

图2.3 管理员注册页面

        实现过程:

        在“注册”按钮事件Button-click中获取用户输入的账号和密码,调用SqlConnection方法将输入的账号的密码更新到数据库中,且注册的用户名必须为六个字符,密码也只能为六位,不符合规则则不能注册成功。若符合以上规则,则将对应的数据更新到数据库中。完成注册管理员操作,注册成功的账号可以用于正常登录此网咖管理系统

        3. 登录模块

        登录时会显示如图所示的界面,管理员输入正确的用户名、密码以及验证码按登录按键即可登录成功。如果输入的用户名不正确则提示用户不存在,不能登录成功;如果输入的用户名正确,密码错误,则提示密码输入错误,不能登录成功;如果输入的用户名和密码都正确,输入的验证码不正确,则提示验证码不正确,不能登录成功;点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.4所示。

图2.4 系统登录页面

        实现过程:

        在“登录“按钮事件Button-click中获取用户输入的账号和密码,实例化ValidCode类,作为参数调用Bitmap中的方法将用户名和密码传递到方法中,如果存在该用户信息则返回“登录成功”,否则返回“null”。使用if语句返回结果进行判断,正确则显示信息,错误提示错误信息。上方滚动显示通过两个timer控件来实现,登录成功后显示主界面。

        4. 飞天网吧管理系统主界面模块

        登录成功后即显示如图所示的界面。可以根据界面点击按钮进行操作,按下不同的按钮会弹出不同的界面,不同的界面可以实现不同的功能。主界面左下角显示”欢迎使用”;右下角会实时显示当前时间;中心左侧有“会员信息表”,“电脑信息表”,“上机记录表”,可以通过点击按钮实现不同表的查看。左上角使用menustrip尽心不同页面的显示。右上角是电脑的编号,通过按钮的灰亮状态可以观察出该电脑是否在使用(灰色状态表示正在使用,亮的状态表示无人使用)。右下角的方框内输入会员编号即可对该会员进行对应的操作。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.5所示。

图2.5 系统主界面页面

        实现过程:

        通过添加toolscrip控件,将控件民命为索要显示的功能添加相应的图标,如系统设计,会员管理等功能完成界面,并通过show()命令进行窗体间的跳转;添加datagreatview控件实现会员信息表,电脑信息表,以及上机记录表的显示;添加groupbox完成如图所示的会员管理部分的功能。添加timer控件完成当前时间的显示。

        5. 会员注册模块

        点击主界面的会员注册按钮会显示如图所示的界面,输入想要注册的账号和两次一样的密码和账户余额点击注册按钮即可注册成功(账号和密码必须都为六个字符),点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.6所示。

图2.6 会员注册页面

        实现过程:

        在“注册“按钮事件Button-click中获取用户输入的账号和密码,调用SqlConnection方法将输入的账号的密码更新到数据库中,且注册的用户名必须为六个字符,密码也只能为六位,不符合规则则不能注册成功。如果想要注册的用户名已经存在,则会提示用户“该用户已经存在!”如果输入的账号密码以及用户名没有重复,则提示“注册成功!”则注册成功,注册的会员账号可以用于正常登录本网咖的进行上机,换机,下机等操作。

        6. 信息查询模块

        点击主界面的查询按钮会显示如图的界面,输入正确的会员卡号和密码即可查询出对应会员的卡上余额和办卡时间。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.7所示。

图2.7 会员信息查询页面

        实现过程:

        用户输入会员卡号点击查询按钮后系统将用户输入的会员卡号赋值给qe,判断是否为空后连接数据库。判断是否连接成功,团转窗口致用户信息表,用条件语句进行查询,如读取到结果将读取到的结果显示出来,如果没有读取到结果则显示“没有该用户!”,点击关闭按钮会关闭该界面。输出数据完成该操作。

        7. 会员充值模块

        点击主界面的会员充值按钮后即可显示如图所示的界面,在下拉菜单中可以选择会员卡号,输入符合格式的充值金额点击充值按钮即可充值成功。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.8所示。

图2.8 会员充值页面

        实现过程:

        点击主界面的会员充值按钮后会显示该界面,调用SqlConnection方法与数据库相连接,查询数据库中的cardInfo(会员卡号)一栏的数据,调用dataset函数实现将数据显示在combobox中。接着将输入的金额利用SqlCommand函数传递到数据库中,更新数据库。点击充值操作完成对应的操作,如果输入的金额不是数字则提示“请输入数字!”。

        8. 会员上机模块

        点击主界面的会员上机按钮会显示如图所示的界面,会员选择主机,输入卡号和密码即可上机时间点击上机按钮,即可上级成功。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.9所示。

图2.9 会员上机页面

        实现过程:

        点击主界面的会员上机按钮后会显示该界面,调用SqlConnection方法与数据库相连接,查询数据库中的PCInfo表中的PCId(电脑编号)一栏的数据,调用dataset函数实现将数据显示在combobox中。接着将输入的会员卡号和密码利用SqlCommand函数传递到数据库中,判断是否存在该用户,以及用户密码是否正确。并用Format函数更新后的电脑状态,以及上机时间会员卡号等信息更新到数据库,点击上机操作完成对应的操作。

        9. 会员换机模块

        点击主界面的会员换机按钮会显示如图所示的界面,当会员当前使用的机器出现故障时,输入当前机器信息和想要换的机器信息,并将信息存储起来即可完成换机操作。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.10所示。

图2.10 会员换机页面

        实现过程:

        点击主界面的会员换机按钮后会显示该界面,调用SqlConnection方法与数据库相连接,查询数据库中的PCInfo表中的PCId(电脑编号)一栏的数据,并判断PCUse这一列的状态,如果是1(使用中)则调用dataset函数实现将数据显示在combobox1中。相同的原理调用SqlConnection方法与数据库相连接,查询数据库中的PCInfo表中的PCId(电脑编号)一栏的数据,并判断PCUse这一列的状态,如果是0(未使用)则调用dataset函数实现将数据显示在combobox2中.点击换机即可完成对应的操作。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。

        10. 会员下机模块

        点击主界面的会员下机按钮会显示如图所示的界面,会员使用完毕后点击会员下机选择对用的机器即可显示对应的使用人的会员卡号以及上机时间、下机时间、上机用时、本次费用等信息。点击下机即可完成操作。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.11所示。

图2.11 会员下机页面

        实现过程:

        点击主界面的会员下机按钮后会显示该界面,调用SqlConnection方法与数据库相连接,查询数据库中的PCInfo表中的PCId(电脑编号)一栏的数据,并判断PCUse这一列的状态,如果是1(使用中)则调用dataset函数实现将数据显示在combobox1中。调用datatime函数获取上机时间和系统当前时间,用系统当前时间减去上机时间即可得出上机用时,15元一小时不满一小时的按一小时计算。并将数据更新到数据库中,点击下机按钮即可完成对应的操作。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。

        11. 修改密码模块

        点击修改密码按钮会显示如图所示的界面,输入会员号和旧密码并输入两次相同的新密码点击修改按钮即可修改成功。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.12所示。

图2.12 会员修改密码页面

        实现过程:

        在button_click中获取用户输入的会员卡号,作为参数调用SqlDataReaderSqlCommand 方法来对数据库进行更新,查询旧密码是否与新输入的密码一致,则一致则提示“新密码不能与原密码相同!”;若输入的密码与原密码不一致且输入的两次密码相同且符合输入规则和要求,则将数据更新到数据库中,点击修改按钮完成对应的操作。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。

        12. 会员注销模块

        点击会员注销按钮会显示如图所示的界面,会显示所有会员的信息,选择相应的会员点击注销按钮即可注销成功。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。如图2.13所示。

图2.13 会员注销页面

        实现过程:

        点击主界面的会员注销按钮后会显示该界面,调用SqlConnection方法与数据库相连接,查询数据库中的cardId表中ID、会员账号、账户余额、注册时间列的信息,调用dataset函数实现将数据显示在datagreatview中。用户选择一行会员信息进行操作,系统将选中的会员信息在数据库中进行delete操作。点击注销按钮完成对应的操作。点击取消按钮后显示确认和取消按钮,点击确认即可退出系统。

        13.帮助模块

        点击菜单栏帮助按钮会显示如图所示的界面,显示“如遇任何问题请联系作者QQ”,点击确定按钮即可关闭当前窗口回到主窗体。如图2.14所示。

图2.14 帮助页面

        实现过程:

        点击主界面的菜单栏帮助按钮后会显示该界面,使用对话框messagebox向用户展示消息,用MessageBoxButtons在对话框添加一个确定按钮,点击确认即可关闭当前窗口回到主窗体。

        14. 关于作者模块

        点击菜单栏关于作者按钮会显示如图所示的界面,显示系统版本、作者、联系方式、版权等,关闭当前窗口即可回到主窗体。如图2.15所示。

图2.15 关于作者页面

        实现过程:

        点击主界面的菜单栏帮助按钮后会显示该界面,使用lable控件text属性填写文字说明,关闭当前窗口即可回到主窗体。


总结

        由于时间和技术条件的限制,还存在一些不足之处,有些功能有待完善。比如应该增加会员注销后的一系列后续的操作。这些应在进一步进行系统调查和需求分析后进一步完善。简而言之,一个真正与时俱进的软件必须有一个不断改进的过程。欢迎小伙伴们一起来交流讨论!

  • 8
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 6
    评论
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Data.SqlClient; using System.Timers; //Download by http://www.codefans.net namespace qwe { public partial class F_main : Form { //定义SqlDataAdapter的引用 SqlDataAdapter da = new SqlDataAdapter(); //定义Datast的引用 DataSet ds = new DataSet(); public F_main() { string skin = "skin/DiamondBlue.ssk"; InitializeComponent(); skinEngine1.SkinFile = skin; } private void F_main_Load(object sender, EventArgs e) { //定义SQL语句 string str_sql = string.Format("select cardid,cardnumber,cardbalance,transacttime from cardinfo"); //生成适配器实例 da = new SqlDataAdapter(str_sql,share.con); //填充数据 da.Fill(ds); //绑定数据源 dgv_data.DataSource = ds.Tables[0]; } public void shuaxin() { ds.Tables[0].Clear(); da.Fill(ds.Tables[0]); } private void btn_zc_Click(object sender, EventArgs e) { F_zhuce w = new F_zhuce(); w.ShowDialog(); } private void btn_close_Click(object sender, EventArgs e) { this.Close(); } private void btn_chaxun_Click(object sender, EventArgs e) { if (txt_ID.Text != "") { //执行SQL语句 string str_sql1 = string.Format("select count(*) from cardinfo where cardnumber = '{0}'", txt_ID.Text); //创建命名对象 SqlCommand cmd1 = new SqlCommand(str_sql1, share.con); //打开连接 share.con.Open(); //执行操作 int k = Convert.ToInt32(cmd1.ExecuteScalar()); share.con.Close(); if (k > 0) { F_chaxun a = new F_chaxun(); //执行SQL语句 string str_sql = string.Format("select cardnumber,cardpassword,cardbalance,transacttime from cardinfo where cardnumber = '{0}'", txt_ID.Text); //创建命名对象 SqlCommand cmd = new SqlCommand(str_sql, share.con); //打开连接 share.con.Open(); //执行操作 SqlDataReader reader = cmd.ExecuteReader(); //如果读取到数据就将其显示出来 if (reader.Read()) { a.txt_user.Text = reader[0].ToString(); a.txt_mima.Text = reader[1].ToString(); a.txt_yu_e.Text = reader[2].ToString(); a.txt_xiaji.Text = reader[3].ToString(); } share.con.Close(); a.ShowDialog(); } else { MessageBox.Show("没有该会员!", "操作提示", MessageBoxButtons.OK, MessageBoxIcon.Error); } } else { MessageBox.Show("请输入要查询的会员ID","操作提示",MessageBoxButtons.OK,MessageBoxIcon.Error); } } private void timer1_Tick(object sender, EventArgs e) { this.lbl_time.Text = "现在时间:"+DateTime.Now.ToString(); } private void F_main_FormClosed(object sender, FormClosedEventArgs e) { } private void F_main_FormClosed_1(object sender, FormClosedEventArgs e) { Application.Exit(); } private void dataGridView1_CellContentClick(object sender, DataGridViewCellEventArgs e) { } private void 会员上机ToolStripMenuItem_Click(object sender, EventArgs e) { F_shangji b = new F_shangji(); b.ShowDialog(); } private void btn_updata_Click(object sender, EventArgs e) { F_updatapass m = new F_updatapass(); m.ShowDialog(); } private void btn_del_Click(object sender, EventArgs e) { F_del k = new F_del(); k.ShowDialog(); } private void btn_cz_Click(object sender, EventArgs e) { F_jiaofei qq = new F_jiaofei(); qq.ShowDialog(); } private void 会员下机ToolStripMenuItem_Click(object sender, EventArgs e) { F_xiaji t = new F_xiaji(); t.ShowDialog(); } private void 上机ToolStripMenuItem_Click(object sender, EventArgs e) { F_zhuce w = new F_zhuce(); w.ShowDialog(); } private void 下机ToolStripMenuItem_Click(object sender, EventArgs e) { F_updatapass m = new F_updatapass(); m.ShowDialog(); } private void 网卡充值ToolStripMenuItem_Click(object sender, EventArgs e) { F_jiaofei qq = new F_jiaofei(); qq.ShowDialog(); } private void 会员注销ToolStripMenuItem_Click(object sender, EventArgs e) { F_del k = new F_del(); k.ShowDialog(); } private void 退出系统ToolStripMenuItem_Click(object sender, EventArgs e) { this.Close(); } private void 关于ToolStripMenuItem_Click(object sender, EventArgs e) { F_help a = new F_help(); a.ShowDialog(); } private void 会员换机ToolStripMenuItem_Click(object sender, EventArgs e) { F_huanji1 a = new F_huanji1(); a.ShowDialog(); } private void panel2_Paint(object sender, PaintEventArgs e) { } private void 银色清爽ToolStripMenuItem_Click(object sender, EventArgs e) { string skin = "skin/MacOS.ssk"; skinEngine1.SkinFile = skin; } private void 黑色大气ToolStripMenuItem_Click(object sender, EventArgs e) { string skin = "skin/Calmness.ssk"; skinEngine1.SkinFile = skin; } private void 漂亮红色ToolStripMenuItem_Click(object sender, EventArgs e) { string skin = "skin/DiamondBlue.ssk"; skinEngine1.SkinFile = skin; } private void 绿色春意ToolStripMenuItem_Click(object sender, EventArgs e) { string skin = "skin/OneGreen.ssk"; skinEngine1.SkinFile = skin; } private void 黄色秋凉ToolStripMenuItem_Click(object sender, EventArgs e) { string skin = "skin/XPOrange.ssk"; skinEngine1.SkinFile = skin; } private void lbl_time_Click(object sender, EventArgs e) { } private void 刷新ToolStripMenuItem_Click(object sender, EventArgs e) { shuaxin(); } private void cms_youjian_Opening(object sender, CancelEventArgs e) { } private void wuliaToolStripMenuItem_Click(object sender, EventArgs e) { F_zhuce w = new F_zhuce(); w.ShowDialog(); } private void 密码修改ToolStripMenuItem_Click(object sender, EventArgs e) { F_updatapass m = new F_updatapass(); m.ShowDialog(); } private void 网卡充值ToolStripMenuItem1_Click(object sender, EventArgs e) { F_jiaofei qq = new F_jiaofei(); qq.ShowDialog(); } private void 会会员注销ToolStripMenuItem_Click(object sender, EventArgs e) { F_del k = new F_del(); k.ShowDialog(); } private void 会员上机ToolStripMenuItem1_Click(object sender, EventArgs e) { F_shangji b = new F_shangji(); b.ShowDialog(); } private void 会员下机ToolStripMenuItem1_Click(object sender, EventArgs e) { F_xiaji t = new F_xiaji(); t.ShowDialog(); } private void 会员换机ToolStripMenuItem1_Click(object sender, EventArgs e) { F_huanji1 a = new F_huanji1(); a.ShowDialog(); } private void groupBox1_Enter(object sender, EventArgs e) { } private void panel4_Paint(object sender, PaintEventArgs e) { } private void pictureBox1_Click(object sender, EventArgs e) { } private void groupBox1_Enter_1(object sender, EventArgs e) { } private void label4_Click(object sender, EventArgs e) { } private void label5_Click(object sender, EventArgs e) { } private void groupBox4_Enter(object sender, EventArgs e) { } private void groupBox2_Enter(object sender, EventArgs e) { } private void dgv_data_SelectionChanged(object sender, EventArgs e) { if (dgv_data.SelectedRows.Count < 1) { return; } txt_name.Text = (string)dgv_data.SelectedRows[0].Cells["cardnumber"].Value; txt_balance.Text = Convert.ToString((int)dgv_data.SelectedRows[0].Cells["cardbalance"].Value); txt_time.Text = Convert.ToString(dgv_data.SelectedRows[0].Cells["transacttime"].Value); } private void button3_Click(object sender, EventArgs e) { } private void button1_Click(object sender, EventArgs e) { } private void btn_jiqiadd_Click(object sender, EventArgs e) { } private void label5_Click_1(object sender, EventArgs e) { } private void groupBox3_Enter(object sender, EventArgs e) { } } }

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

被代码抛弃的人

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

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

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

打赏作者

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

抵扣说明:

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

余额充值