银行管理系统(使用SQL Server)-Python快速编程入门(第2版)-人民邮电出版社-阶段案例

阶段案例—银行管理系统

题目描述

银行管理系统是一个集开户、查询、取款、存款、转账、锁定、解锁、退出等一系列业务于一体的管理系统,随着计算机技术在金融行业的广泛应用,银行企业采用管理系统替代了传统手工记账的方式,这极大地缩短了用户办理基础储蓄业务的时间,提升了银行企业的形象。
假设现有一银行管理系统,该系统的“欢迎登录银行管理系统”界面和“功能菜单”界面分别如图所示

***************************************************
***                                             ***
***                                             ***
***        欢迎登录银行管理系统                   ***
***                                             ***
***                                             ***
***************************************************:"欢迎登录银行管理系统"界面
**************************************************
***                                            ***
***    1.开户(12.查询(2***
***    3.取款(34.存款(4***
***    5.转账(56.锁定(6***
***    7.解锁(7***
***                                            ***
***    退出(Q)                                ***
***                                            ***
**************************************************:"功能菜单"界面

银行管理系统启动后会显示“欢迎登录银行管理系统”界面,并要求工作人员按照提示输入管理员的账户和密码,输入正确的账户和密码后方可进入“功能菜单”界面,否则直接退出银行管理系统。管理员信息输入正确和输入错误的提示信息如图8-7所示。

请输入管理员账户:admin
请输入密码:12345 
请输入密码:123
操作成功,请稍后…… 
				图:输入正确的账号密码
请输入管理员账户:ad 
管理员账户输入错误……
				图:输入错误的账号
请输入管理员账户:admin
输入密码有误……
				图:输入错误的密码

图示的“功能菜单”界面显示了银行管理系统的全部功能,包括开户、查询、取款、存款、转账、锁定、解锁和退出,每个功能的介绍如下。

  • 开户功能:用户根据提示依次输入姓名、身份证号、手机号、预存金额、密码等信息,输入无误后会获取系统随机生成的一个不重复的由6位数字组成的卡号。
  • 查询功能:用户根据提示输入正确的卡号、密码后,可以查询卡中余额,若连续3次输入错误的密码,则卡号会被锁定。
  • 取款功能:用户根据提示输入正确的卡号、密码后,可以看到系统显示的卡中余额,之后输入取款金额,会看到系统显示取款后的卡中余额。如果用户连续3次输入错误的密码,那么用户的卡号会被锁定;如果用户输入的取款金额大于卡中余额或小于0,那么系统进行是示并返回“功能菜单”界面。
  • 存款功能:用户根据提示输入正确的卡号、密码后,可以看到系统显示的卡中余额,后输入存款金额,会看到系统显示取款后的卡中余额。如果用户输入的存款金额小于0,那么系统进行提示并返回“功能菜单”界面。
  • 转账功能:用户根据提示分别输入转出卡号和转入卡号,之后输入转账金额,并再大确认是否执行转账功能,确定执行转账功能后,转出卡与转入卡做相应金额计算;取消转账功能后,回退到之前的操作。如果用户连续3次输入错误的密码,那么用户的卡号会被锁定。
  • 锁定功能:用户根据提示输入卡号、密码后,会看到系统显示的锁定成功的信息。3定的卡号不能进行查询、取款、存款、转账等操作。
  • 解锁功能:用户根据提示输入卡号、密码后,会看到系统显示的解锁成功的信息。锁的卡号可以重新进行查询、取款、存款、转账等操作。
  • 退出功能:工作人员根据提示输入管理员的账户和密码,如果输入了错误的账户密码,会返回到系统的“功能菜单”界面;如果输入正确的账户和密码,那么会退出系统。
    本案例要求编写程序,实现一个基于面向对象的、具有上述功能的银行管理系统。

数据库准备

数据库配置

使用SSMS(Microsoft SQL Server Management Studio,版本:v18.9.1。如非此版本请手动创建数据库,因为可能会出现不兼容的情况。)
创建新用户
右键数据库名选择属性
在这里插入图片描述
选择安全性并按如图配置
在这里插入图片描述
右键登录名创建新用户
在这里插入图片描述
选择常规并配置用户名密码
在这里插入图片描述
选择安全对象并授权(要求能够查询,修改,添加,删除数据库的元素)
在这里插入图片描述
如图配置即可完成
在这里插入图片描述
配置完毕之后可以登录数据库试试
在这里插入图片描述

数据库文件准备

参考脚本如下

USE [master]
GO
/****** Object:  Database [bank]    Script Date: 2021/5/5 19:12:05 ******/
CREATE DATABASE [bank]
 CONTAINMENT = NONE
 ON  PRIMARY 
( NAME = N'bank', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\bank.mdf' , SIZE = 8192KB , MAXSIZE = UNLIMITED, FILEGROWTH = 65536KB )
 LOG ON 
( NAME = N'bank_log', FILENAME = N'D:\Program Files\Microsoft SQL Server\MSSQL15.MSSQLSERVER\MSSQL\DATA\bank_log.ldf' , SIZE = 8192KB , MAXSIZE = 2048GB , FILEGROWTH = 65536KB )
 WITH CATALOG_COLLATION = DATABASE_DEFAULT
GO
ALTER DATABASE [bank] SET COMPATIBILITY_LEVEL = 150
GO
IF (1 = FULLTEXTSERVICEPROPERTY('IsFullTextInstalled'))
begin
EXEC [bank].[dbo].[sp_fulltext_database] @action = 'enable'
end
GO
ALTER DATABASE [bank] SET ANSI_NULL_DEFAULT OFF 
GO
ALTER DATABASE [bank] SET ANSI_NULLS OFF 
GO
ALTER DATABASE [bank] SET ANSI_PADDING OFF 
GO
ALTER DATABASE [bank] SET ANSI_WARNINGS OFF 
GO
ALTER DATABASE [bank] SET ARITHABORT OFF 
GO
ALTER DATABASE [bank] SET AUTO_CLOSE OFF 
GO
ALTER DATABASE [bank] SET AUTO_SHRINK OFF 
GO
ALTER DATABASE [bank] SET AUTO_UPDATE_STATISTICS ON 
GO
ALTER DATABASE [bank] SET CURSOR_CLOSE_ON_COMMIT OFF 
GO
ALTER DATABASE [bank] SET CURSOR_DEFAULT  GLOBAL 
GO
ALTER DATABASE [bank] SET CONCAT_NULL_YIELDS_NULL OFF 
GO
ALTER DATABASE [bank] SET NUMERIC_ROUNDABORT OFF 
GO
ALTER DATABASE [bank] SET QUOTED_IDENTIFIER OFF 
GO
ALTER DATABASE [bank] SET RECURSIVE_TRIGGERS OFF 
GO
ALTER DATABASE [bank] SET  DISABLE_BROKER 
GO
ALTER DATABASE [bank] SET AUTO_UPDATE_STATISTICS_ASYNC OFF 
GO
ALTER DATABASE [bank] SET DATE_CORRELATION_OPTIMIZATION OFF 
GO
ALTER DATABASE [bank] SET TRUSTWORTHY OFF 
GO
ALTER DATABASE [bank] SET ALLOW_SNAPSHOT_ISOLATION OFF 
GO
ALTER DATABASE [bank] SET PARAMETERIZATION SIMPLE 
GO
ALTER DATABASE [bank] SET READ_COMMITTED_SNAPSHOT OFF 
GO
ALTER DATABASE [bank] SET HONOR_BROKER_PRIORITY OFF 
GO
ALTER DATABASE [bank] SET RECOVERY FULL 
GO
ALTER DATABASE [bank] SET  MULTI_USER 
GO
ALTER DATABASE [bank] SET PAGE_VERIFY CHECKSUM  
GO
ALTER DATABASE [bank] SET DB_CHAINING OFF 
GO
ALTER DATABASE [bank] SET FILESTREAM( NON_TRANSACTED_ACCESS = OFF ) 
GO
ALTER DATABASE [bank] SET TARGET_RECOVERY_TIME = 60 SECONDS 
GO
ALTER DATABASE [bank] SET DELAYED_DURABILITY = DISABLED 
GO
ALTER DATABASE [bank] SET ACCELERATED_DATABASE_RECOVERY = OFF  
GO
EXEC sys.sp_db_vardecimal_storage_format N'bank', N'ON'
GO
ALTER DATABASE [bank] SET QUERY_STORE = OFF
GO
USE [bank]
GO
/****** Object:  User [root]    Script Date: 2021/5/5 19:12:06 ******/
CREATE USER [root] FOR LOGIN [root] WITH DEFAULT_SCHEMA=[dbo]
GO
/****** Object:  Table [dbo].[account]    Script Date: 2021/5/5 19:12:06 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
CREATE TABLE [dbo].[account](
	[name] [varchar](20) NOT NULL,
	[id] [varchar](50) NOT NULL,
	[password] [varchar](50) NOT NULL,
	[balance] [float] NOT NULL,
	[telephone_number] [varchar](50) NOT NULL,
	[is_lock] [int] NOT NULL,
	[id_card] [varchar](50) NOT NULL,
 CONSTRAINT [PK_account] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, OPTIMIZE_FOR_SEQUENTIAL_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]
GO
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Alice', N'178324', N'154737', 0, N'16574358756', 1, N'126467198709394765')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Dennis', N'189612', N'156464', 2035.1, N'16455631735', 0, N'164536199801017635')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Jobs', N'234244', N'163736', 0, N'16745461746', 0, N'164564199801017844')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Lincoln', N'234534', N'144563', 10000, N'15463656473', 0, N'219033198811129034')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Bidden', N'254546', N'132412', 0, N'16443745627', 1, N'164567199807081535')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Trump', N'324555', N'154632', 0, N'16735482798', 0, N'183647198902038464')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Maldives', N'325455', N'123212', 0, N'16744753877', 1, N'145666199802031846')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Bob', N'329574', N'174465', 0, N'16755748375', 0, N'174657199802031324')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Lucy', N'345656', N'154635', 100000, N'15746587368', 0, N'198773199908091846')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Bill', N'384594', N'154635', 0, N'15463641546', 1, N'153635199901017834')
INSERT [dbo].[account] ([name], [id], [password], [balance], [telephone_number], [is_lock], [id_card]) VALUES (N'Antone', N'685630', N'132354', 0.8, N'15464538775', 0, N'419817199897111735')
GO
USE [master]
GO
ALTER DATABASE [bank] SET  READ_WRITE 
GO

数据库创建效果
在这里插入图片描述

源代码

# coding=utf-8
# sqlserver的连接
import random
import pymssql


class MSSQL:

    def __GetConnect(self):
        """
        得到连接信息
        返回: conn.cursor()
        """
        self.conn = pymssql.connect(host='主机名(可以是localhost)', user='用户名(要求此用户有操作数据库数据的权限)', password='密码', database='数据库名', charset="utf8")
        cur = self.conn.cursor()
        if not cur:
            raise (NameError, "连接数据库失败")
        else:
            return cur

    def ExecQuery(self, sql):
        """
        执行查询语句
        返回的是一个包含tuple的list,list的元素是记录行,tuple的元素是每行记录的字段
        """
        cur = self.__GetConnect()
        cur.execute(sql)
        result_list = cur.fetchall()
        # 查询完毕后必须关闭连接
        self.conn.close()
        return result_list

    def ExecNonQuery(self, sql):
        """
        执行非查询语句
        """
        cur = self.__GetConnect()
        try:
            cur.execute(sql)
        except Exception as ex:
            print(ex)
        self.conn.commit()
        self.conn.close()


class Account:
    def new_account(self):
        name = input('欢迎成为我们的新用户,请输入您的姓名')
        account = str(random.randint(100000, 999999))
        password = input('请输入您的密码')
        repeat_password = input('请再输入一次')
        if password == repeat_password:
            telephone = input('请输入您的电话')
            import re
            #使用正则表达式匹配电话号码
            pattern_telephone = re.compile(R"^1[3578]\d{9}$")
            phone_match_result = pattern_telephone.match(telephone)
            if phone_match_result is not None:
            	#使用正则表达式匹配身份证号码
                id_card = input('请输入您的身份证号码')
                pattern_id_card=re.compile(R"^[1-9]\d{5}(18|19|([23]\d))\d{2}((0[1-9])|(10|11|12))(([0-2]["
                                           R"1-9])|10|20|30|31)\d{3}[0-9Xx]$")
                id_card_match_result = pattern_id_card.match(id_card)
                if id_card_match_result is not None:
                    money=input('请输入预存金额')
                    da = MSSQL()
                    sql = 'INSERT INTO account VALUES(' + "'" + name + "','" + account + "','" + password + "'," + money + ",'" + telephone + "'," + "0" + ",'" + id_card + "')"
                    da.ExecNonQuery(sql)
                else:
                    print('身份证号码无效')
            else:
                print("手机号码无效")
        else:
            print('注册失败,您输入的密码不一致')

    def find(self):
        d = MSSQL()
        account = input('欢迎使用ATM存取款一体机,请插入银行卡')
        sql = 'SELECT * FROM account WHERE id=' + account
        result_list = d.ExecQuery(sql)
        if len(result_list) == 0:
            print('非法卡,请重试')
        else:
            user_message = result_list[0]
            for i in range(3):
                password = input('请输入密码')
                if password == user_message[2]:
                    print('亲爱的客户您好,您的信息如下')
                    def check_account():
                        if user_message[5] == 0:
                            print('姓名', user_message[0], '\n账号', user_message[1], '\n余额', user_message[3], '\n手机号',
                                  user_message[4], '\n账户正常\n身份证号', user_message[6])
                        else:
                            print('您的账户已锁定,无法查询')
                            return

                    check_account()
                    print('查询完毕,请取走卡片。\n谢谢您的光临')
                    return
                else:
                    print('密码错误,请重试')
            print('密码错误次数过多,银行卡已锁定')
            sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
            d.ExecNonQuery(sql)

    def get_money(self):
        account = input('欢迎使用ATM存取款一体机,请插入银行卡')
        d = MSSQL()
        sql = 'SELECT * FROM account WHERE id=' + account
        result_list = d.ExecQuery(sql)
        if len(result_list) == 0:
            print('非法卡,请重试')
        else:
            for i in range(3):
                password = input('请输入密码')
                user_message = result_list[0]
                if password == user_message[2]:
                    if user_message[5] == 0:
                        print('您的余额为', user_message[3])
                        money = float(input('请取款'))
                        if money > user_message[3]:
                            print('您的余额不足,取款失败')
                            return
                        elif money < 0:
                            print('您的输入有误,取款失败')
                            return
                        else:
                            money_ = user_message[3]
                            money_ = str(money_ - money)
                            sql = 'UPDATE account SET balance=' + money_ + ' WHERE id=' + "'" + user_message[1] + "'"
                            d.ExecNonQuery(sql)
                            print('取款成功,请核对。')
                            return
                    else:
                        print('您的银行卡已锁定,无法操作')
                        return
                else:
                    print('密码错误,请重试')
            print('密码错误次数过多,银行卡已锁定')
            sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
            d.ExecNonQuery(sql)
        print('取款结束,请取走卡片。\n谢谢您的光临')

    def save_money(self):
        account = input('欢迎使用ATM存取款一体机,请插入银行卡')
        d = MSSQL()
        sql = 'SELECT * FROM account WHERE id=' + account
        result_list = d.ExecQuery(sql)
        if len(result_list) == 0:
            print('非法卡,请重试')
        else:
            for i in range(3):
                password = input('请输入密码')
                user_message = result_list[0]
                if password == user_message[2]:
                    if user_message[5] == 0:
                        print('您的余额为', user_message[3])
                        money = float(input('请存款'))
                        if money < 0:
                            print('您的输入有误,存款失败')
                            return
                        else:
                            money_ = user_message[3]
                            money_ = str(money_ + money)
                            sql = 'UPDATE account SET balance=' + money_ + ' WHERE id=' + "'" + user_message[1] + "'"
                            d.ExecNonQuery(sql)
                            print('存款成功,请核对。')
                            return
                    else:
                        print('您的银行卡已锁定,无法操作')
                        return
                else:
                    print('密码错误,请重试')
            print('密码错误次数过多,银行卡已锁定')
            sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
            d.ExecNonQuery(sql)
        print('存款结束,请取走卡片。\n谢谢您的光临')

    def transfer_money(self):
        account = input('欢迎使用ATM存取款一体机,请插入银行卡')
        d = MSSQL()
        sql = 'SELECT * FROM account WHERE id=' + account
        result_list = d.ExecQuery(sql)
        if len(result_list) == 0:
            print('非法卡,请重试')
        else:
            user_message = result_list[0]
            for i in range(3):
                password = input('请输入密码')
                if password == user_message[2]:
                    if user_message[5] == 0:
                        print('您的余额为', user_message[3])
                        person = input('请输入转到的银行卡号')
                        money = float(input('请输入转账金额'))
                        if money < 0:
                            print('您的输入有误,转账失败')
                            return
                        else:
                            make_sure_transfor=input('您确定转账?输入Y继续,输入其他退出')
                            if make_sure_transfor=='Y':
                                sql = 'SELECT * FROM account WHERE id=' + "'" + person + "'"
                                de = d.ExecQuery(sql)
                                if len(de) == 0:
                                    print('无效卡号,请核对')
                                    return
                                else:
                                    if money > user_message[3]:
                                        print('您的余额不足,转账失败')
                                        return
                                    else:
                                        money_ = user_message[3]
                                        money_ = str(money_ - money)
                                        sql1 = 'UPDATE account SET balance=' + money_ + ' WHERE id=' + "'" + user_message[
                                            1] + "'"
                                        d.ExecNonQuery(sql1)
                                        money__ = de[0][3]
                                        money__ = str(money__ + money)
                                        sql2 = 'UPDATE account SET balance=' + money__ + ' WHERE id=' + "'" + person + "'"
                                        d.ExecNonQuery(sql2)
                                        print('转账成功,请核对。')
                                        return
                            else:
                                return
                else:
                    print('您的银行卡已锁定,无法操作')
                    return
            else:
                print('密码错误,请重试')
        print('密码错误次数过多,银行卡已锁定')
        sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
        d.ExecNonQuery(sql)
    print('转账结束,请取走卡片。\n谢谢您的光临')


    def lock(self):
        account = input('欢迎使用ATM存取款一体机,请输入银行卡卡号')
        d = MSSQL()
        sql = 'SELECT * FROM account WHERE id=' + account
        result_list = d.ExecQuery(sql)
        if len(result_list) == 0:
            print('非法卡,请重试')
        else:
            user_message = result_list[0]
            for i in range(3):
                password = input('请输入密码')
                if password == user_message[2]:
                    if user_message[5] == 0:
                        print('您的余额为', user_message[3])
                        is_lock = input('您确定要锁定您的银行卡吗?输入1锁定银行卡,输入其他字符返回')
                        if is_lock != '1':
                            return
                        else:
                            sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
                            d.ExecNonQuery(sql)
                            print('锁定成功')
                            return
                    else:
                        print('您的银行卡已锁定,无法操作')
                        return
                else:
                    print('密码错误,请重试')
            print('密码错误次数过多,银行卡已锁定')
            sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
            d.ExecNonQuery(sql)
        print('挂失结束。\n谢谢您的光临')

    def un_lock(self):
        account = input('欢迎使用ATM存取款一体机,请输入银行卡卡号')
        d = MSSQL()
        sql = 'SELECT * FROM account WHERE id=' + account
        result_list = d.ExecQuery(sql)
        if len(result_list) == 0:
            print('非法卡,请重试')
        else:
            user_message = result_list[0]
            for i in range(3):
                password = input('请输入密码')
                if password == user_message[2]:
                    if user_message[5] == 1:
                        print('您的余额为', user_message[3])
                        is_lock = input('您确定要解锁您的银行卡吗?输入0解锁银行卡,输入其他字符返回')
                        if is_lock != '0':
                            return
                        else:
                            sql = 'UPDATE account SET is_lock=0 WHERE id=' + "'" + user_message[1] + "'"
                            d.ExecNonQuery(sql)
                            print('解锁成功')
                            return
                    else:
                        print('您的银行卡未锁定,无法操作')
                        return
                else:
                    print('密码错误,请重试')
            print('密码错误次数过多,银行卡已锁定')
            sql = 'UPDATE account SET is_lock=1 WHERE id=' + "'" + user_message[1] + "'"
            d.ExecNonQuery(sql)
        print('挂失结束。\n谢谢您的光临')


def welcome():
    welcome_ = '''
********************************************
***                                      ***
***                                      ***
***            欢迎登录银行管理系统          ***
***                                      ***
***                                      ***
********************************************
    '''
    print(welcome_)


def main_menu():
    menu = '''
**************************************************
***                                            ***
***    1.开户(1)                 2.查询(2)    ***
***    3.取款(3)                 4.存款(4)    ***
***    5.转账(5)                 6.锁定(6)    ***
***    7.解锁(7)                              ***
***                                            ***
***    退出(Q)                                ***
***                                            ***
**************************************************
    '''
    print(menu)


def login():
    acc = input('请输入管理员账户:')
    if acc != 'admin':
        print('管理员账户输入错误......')
        exit(0)
    p_s_w_d = input('请输入密码:')
    if p_s_w_d != '12345':
        print('输入密码有误......')
        exit(0)
    print('操作成功,请稍后......')


def choose():
    a = Account()
    choose_ = input('请输入您的操作')
    if choose_ == '1':
        a.new_account()
    elif choose_ == '2':
        a.find()
    elif choose_ == '3':
        a.get_money()
    elif choose_ == '4':
        a.save_money()
    elif choose_ == '5':
        a.transfer_money()
    elif choose_ == '6':
        a.lock()
    elif choose_ == '7':
        a.un_lock()
    elif choose_ == 'Q':
        exit(0)
    else:
        print('输入错误')


def main():
    welcome()
    login()
    while True:
        main_menu()
        choose()


if __name__ == '__main__':
    main()

  • 2
    点赞
  • 46
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

量子代码时空

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

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

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

打赏作者

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

抵扣说明:

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

余额充值