电影院售票系统

电影院售票系统

摘要

20世纪末,随着计算机科学的发展,数据库技术在Internet中的应用越来越广泛,为广大网络用户提供了更加周到和人性化的服务。传统手动售票方式繁琐,统计帐户的时候一张一张的记录进入到账户薄里面,容易出现错误,所以研究一个电影售票系统已经非常的重要了。

设计电影院售票系统,能方便的订票、退票、查询财务售票情况,极大的提高了了工作效率。 本系统由前台和后台两大模块。在前台,用户可以注册、登陆,然后查看影片信息,订票信息,在订票的时候,用户可以根据影片信息选择场次和座位号。在后台,管理员可以对用户信息,电影信息进行管理,主要功能有添加、删除、修改等。

本系统基于Microsoft Visual studio 2005开发平台,运用C#开发语言进行设计开发,后台数据库选用Microsoft SQL Server 2005数据库,系统页面简洁明了,功能全面,方便用户操作体验。

关键词:电影院 自动售票 C#  SQL Server

Cinema ticketing system

Abstract : As the movie in people's entertainment life occupy an increasingly important position, the traditional manual ticketing cumbersome, statistical account when a record into account thin inside, prone to error, so the study of a movie ticketing system is very important.Design of cinema ticketing system, to facilitate the booking, refunds, query financial ticketing, greatly improves the work efficiency.

The system consists of foreground and background of two modules. In the foreground, users can register, login, and then view the video information, booking information, booking tickets when, users can according to the video information selection number and seat number. In the background, the administrator can the user information, the information management, the main function of add, delete, modify and so on.

The system is based on the Microsoft Visual Studio 2005 development platform, using C # development language for design and development, background database using Microsoft SQL Server 2005 database, the system pages concise, complete function, convenient user operation experience.

Key words:  C#   SQL Server   cinema   Automatic ticketing    

目录

1概述

1.1研究背景

1.2研究目的和意义

1.3本系统所具备的功能

2 理论知识及原理说明

2.1 C#概述

2.2 SQLServer数据库概述

3电影院售票系统系统分析

3.1需求分析

3.1.1业务需求

3.1.2客户需求

3.1.3功能需求

        3.1.4非功能需求

    3.2功能说明

4数据库设计

4.1数据库概念设计(E-R)

4.2数据库设计

4.2.1数据库命名规范

4.2.2数据库逻辑设计

4.2.3关系图

5电影院系统设计

5.1系统整体功能结构

5.2系统主要功能模块详细设计

5.2.1 本系统所有的窗体介绍

5.2.2 登陆界面

5.2.3 主界面

5.2.4Dbhelper 数据库连接功能

5.2.5注册和添加新电影功能模块实现

5.2.6删除修改添加电影功能模块实现

6附录

7.11 

7.33 

8.33参考文献

   电影院售票系统

  1. 1概述

三十年前,全中国没有一家多厅电影院,没有一家纯商业运作的电影院,电影行业发展落后,传统的售票方式严重的影响了当时的帐户的记录工作。

随着互联网技术的不断发展,用信息技术改造传统行业,将信息技术运用到生产经营与各项管理决策中,提高市场竞争力和经济效益,所以,开发出一款电影院售票管理系统就显得尤为重要了。

电影院售票系统是基于.NET技术平台,采用ADO.NET数据访问技术和相关性能优化技术,利用C#语言设计实现,以SQL server2000作为后台数据库系统。由于.NET采用了可视化的程序设计,所以,系统中采用大量的可视化控件来实现相应的功能,从而缩短了代码长度,也提高了程序的灵活性。

本系统的主要作用是管理票务信息,还可以实现预订票,退票,让观众及时了解售票的情况,及时买票;以保证售票工作能更顺畅的运行。这就要求软件的设计要结合具体实际,从而为影院管理服务,提高运行效率。为此,我进行了专门调查,搜集了大量的资料,制定了详尽的需求分析与系统设计。本系统可以很好地帮助影院提高工作效率,进一步提高工作效益和影院现代化水平,具有很高的开发价值和使用价值。

研究这样一个系统可以提高电影院的售票效率,使影院工作更加的人性化,工作效率更高,创造更多的价值。也可以为广大用户提供一个更快捷方便的购买电影票的方式,提高广大群众的生活质量,替用户节约时间、节省精力。总体的研究目标如下:

界面简洁、友好,易于用户操作。使用了大量控件,缩短了代码长度。 Visual Studio.NET 2005提供了可视化的编程,所以,系统中大部分功能通过控件实现,使得运行界面十分简洁,用户可以方便地完成查看、修改和统计各类操作。

分权限管理,满足不同用户的需求。系统用户包括:用户、售票员和管理员,所以在分析设计初期,就分别为三类用户分配了相应权限,用户登录系统时,会根据权限跳转至不同的界面。

各类信息及时发布,提高效率。各类信息(包括:电影信息、人员管理信息、坐席信息和放映时间信息等)由管理员及时发布,并提供了相应的查询统计模块,从而方便管理员统计和存档。

1.3本系统所具备的功能

    本系统主要是实现电影院售票管理系统,从而提高售票效率。使用本系统,可以有效地管理和统计影票的基本信息和各类影院的相关信息,包括:影票基本信息、影院基本信息、放映时间信息、人员管理等,完成这些信息的增加、删除、修改、查询统计功能,同时,还可以将这些信息打印输出,以方便整理和存档。             具体功能模块如下:  

1.销售管理(影票信息的增加、查询和统计)

2.预定影票管理(影票信息和座位号的预定)

3.退票管理(影票的退票操作等)

4.查询管理(财务查询,售票情况查询)

5.用户管理(用户权限的分配)

  1. 2 理论知识及原理说明
    1. C#概述

    C#是一种安全的、稳定的、简单的,由C和C++衍生出来的面向对象的编程语言。它在继承C和C++强大功能的同时去掉了一些它们的复杂特性(例如没有宏和模板,不允许多重继承)[2]。C#综合了VB简单的可视化操作和C++的高运行效率,以其强大的操作能力、优雅的语法风格、创新的语言特性和便捷的面向组件编程的支持成为.NET开发的首选语言。C#语言的主要优点大概可以归纳如下:

1.语法简洁:C#取消了指针、也不定义繁琐的伪关键字;它使用有限地指令、修饰符合操作符,语法上几乎不存在任何冗余,整个语言结构十分清晰。初学者通常能够快速掌握C#基本特性,而C/C++程序员转入C#则几乎不会有什么障碍。

2.完全面向对象:C#具有面向对象的语言所应有的基本特性:封装、继承和多态性。它禁止多继承,禁止各种全局方法、全局变量和常量。C#以类为基础来构建所有的类型,并通过命名空间对代码进行层次化的组织和管理。许多精巧的对象设计模式都在C#语言中得到了有效的应用。

3.目标软件的安全性:C#符合通用类型系统的类型安全性要求,并用CLR所提供的代码访问安全特性,从而能够在程序中方便的配置安全等级和用户权限。此外,垃圾收集机制自动管理对象的生命周期,这是的开发人员无需再负担内存管理的任务,应用程序的可靠性进一步得到提高。

4.版本管理技术:C#语言中内置了版本控制功能,并通过接口和继承来实现应用的可扩展性[3]。应用程序的维护和升级更加易于管理。

5.灵活性与兼容性:C#中允许使用非托管代码来与其他程序(包括COM组件、WIN32API等)进行集成和交互。它还可以通过委托(delegate)来模拟指针的功能,通过接口来模拟多继承的实现。

    1. SQLServer数据库概述

    SQL是高级的非过程化编程语言,是沟通数据库服务器和客户端的重要工具,允许用户在高层数据结构上工作。它不要求用户指定对数据的存放方法,也不需要用户了解具体的数据存放方式,所以,具有完全不同底层结构的不同数据库系统,可以使用相同的SQL语言作为数据输入与管理的SQL接口。它以记录集合作为操作对象,所有SQL语句接受集合作为输入,返回集合作为输出,这种集合特性允许一条SQL语句的输出作为另一条SQL语句的输入,所以SQL语句可以嵌套,这使它具有极大的灵活性和强大的功能,在多数情况下,在其他语言中需要一大段程序实现的功能只需要一个SQL语句就可以达到目的,这也意味着用SQL语言可以写出非常复杂的语句。

  结构化查询语言(Structured Query Language)最早是IBM的圣约瑟研究实验室为其关系数据库管理系统SYSTEM R开发的一种查询语言,它的前身是SQUARE语言。SQL语言结构简洁,功能强大,简单易学,所以自从IBM公司1981年推出以来,SQL语言得到了广泛的应用。如今无论是像Oracle、Sybase、DB2、Informix、SQL Server这些大型的数据库管理系统,还是像Visual Foxpro、PowerBuilder这些PC上常用的数据库开发系统,都支持SQL语言作为查询语言。

  美国国家标准局(ANSI)与国际标准化组织(ISO)已经制定了SQL标准。ANSI是一个美国工业和商业集团组织,负责开发美国的商务和通讯标准。ANSI同时也是ISO和International Electrotechnical Commission(IEC)的成员之一。ANSI 发布与国际标准组织相应的美国标准。1992年,ISO和IEC发布了SQL国际标准,称为SQL-92。ANSI随之发布的相应标准是ANSI SQL-92。ANSI SQL-92有时被称为ANSI SQL。尽管不同的关系数据库使用的SQL版本有一些差异,但大多数都遵循 ANSI SQL 标准。SQL Server使用ANSI SQL-92的扩展集,称为T-SQL,其遵循ANSI制定的 SQL-92标准。

SQL语言包含3个部分:

  数据定义语言Data Definition Language(DDL),定义:definition/ 例如:CREATE、DROP、ALTER等语句。

  数据操作语言Data Manipulation Language(DML),操作:make/ 例如:INSERT(插入)、UPDATE(修改)、DELETE(删除)语句。

  数据控制语言Data Controlling Language(DCL),控制:control/ 例如:GRANT、REVOKE、COMMIT、ROLLBACK等语句。

SQL语言包括三种主要程序设计语言类别的语句:数据定义语言(DDL),数据操作语言(DML)及数据控制语言(DCL)

  1. 3电影院售票系统系统分析
      1. 业务需求

随着社会的发展,人们生活水平的提高,欣赏电影逐渐成为人们闲暇时的主要娱乐方式之一,传统的电影售票都是人工服务,观看座位都是人工安排,无法体现人性化选择,加上现在人们的生活节奏越来越快,购票时间需要相应缩短以及方便电影院工作人员的管理,因此,充分利用现代信息化,因特网的优势,设计“电影院自动售票系统”,提高工作效率,提高信息的及时性,减轻各级相关工作人员的劳动度是非常有必要和紧迫的任务。

电影院售票系统可以实现影片的登记和电影票的购买,可以方便的进行电影以及实时影票信息的查询等,从而做到方便的售票操作,方便工作人员的同时也让顾客能够轻轻松松地买票。

      1. 客户需求

本系统的最终用户特点:对操作人员和维护人员的教育水平和技术专长要求不大,只要能够掌握基本的电脑知识,能够运用简单的操作。

本系统能够使顾客在购买电影票的时候方便的选择座位以及查询电影信息。

      1. 功能需求

售票员:

1.查找即将上映的影片信息

2.售票和为顾客挑选满意座位

管理员:

1.从上映的影片中删掉某部影片

2.添加即将上映的影片

3.查询与修改某部影片的信息

4.为会员观众打折

顾客:

1. 买票

2.退票

3. 选位

      1. 非功能需求
  1. 系统在30秒之内响应客户需求

2. 系统应该在没故障的前提下每天都是可以使用的

  1.  系统开发工具

根据各用户的需求,以及系统各大功能的需求,经过大量的调查分析,针对本高校学生考勤管理系统选择以下开发工具进行开发:

2.1系统操作环境

系统结构:B/S (浏览器/服务器)

    开发语言: C#

    数据库:SQL Server 2005

    开发工具:Microsoft Visual Studio 2008

    1.  B/S(浏览器/服务器)简介

B/S(Browser/Server,浏览器/服务器)模式又称B/S结构。它是随Internet技术的兴起,对C/S模式应用的扩展。在这种结构下,用户工作界面是通过IE浏览器来实现的。B/S模式最大的好处是运行维护比较简便,能实现不同的人员,从不同的地点,以不同的接入方式访问和操作共同的数据;最大的缺点是对网络环境依赖性太强,由于各种原因引起网络中断都会造成系统瘫痪。

2.3 C#简介

C#是微软公司在2000年7月发布的一种全新且简单、安全、面向对象的程序设计语言,是专门为.NET的应用而开发的语言。它吸收了C++、Visual Basic、Delphi、Java等语言的优点,体现了当今最新的程序设计技术的功能和精华。C#继承了C语言的语法风格,同时又继承了C++的面向对象特性。不同的是,C#的对象模型已经面向Internet进行了重新设计,使用的是.NET框架的类库;C#不再提供对指针类型的支持,使得程序不能随便访问内存地址空间,从而更加健壮;C#不再支持多重继承,避免了以往类层次结构中由于多重继承带来的可怕后果。.NET框架为C#提供了一个强大的、易用的、逻辑结构一致的程序设计环境。同时,公共语言运行时(Common Language Runtime)为C#程序语言提供了一个托管的运行时环境,使程序比以往更加稳定、安全。其特点有:(1)语言简洁;(2)保留了C++的强大功能;(3)快速应用开发功能;(4)语言的自由性;(5)强大的Web服务器控件;(6)支持跨平台;(7)与XML相融合。

  1. 4数据库设计
    1. 数据库概念设计(E-R图)

     概念结构设计是整个数据库设计的关键,它能通过对需求进行综合,归纳与抽象,形成一个独立于具体DBMS的概念模型,即E-R图[1]。简单的说,E-R图用来分析数据关系的。下面是本系统主要的实体图。

电影管理实体图如图4.1所示

图1电影管理实体图

电影管理实体图如图4.2所示

                             图2影片信息管理实体图

各实体间的E-R图(图中各主体由于篇幅原因,属性只列主要的)

    1. 数据库命名规范

1.数据库

数据库命名以数据库相关英文单词命名。

如表所示:

表1 数据库命名

数据库名称

描述

dbo.Moive

影院电影时刻查询系统数据库

2.数据表

如表所示:

表2 数据表命名表

数据库表名

描述

TypeNo

电影类型编号

moiveName

电影名称

Price

                    票价

mvTime

电影放映时间

Type

电影类型

imgL

电影图片路径

            moiveNo

                   电影编号

              Director

主演

      1. 数据库逻辑设计

逻辑结构是把概念结构转换为某个DBMS所支持的数据模型,并对其进行优化。本系统根据E-R图可以对数据库进行设计,以下列出主要的数据表。

数据库中包含3个数据库:Moive、MVtype、Tuserpad、根据系统需求,通过对系统的数据流程的分析

表1影片类型(MVtype)

列名

类型

是否标识列

允许为空

描述

TypeNo

nvarchar(50)

主键

MoiveType

nvarchar(50)

电影的类型

表4 电影信息表(Film)

表2电影信息(Moive)

列名

类型

标识列

允许为空

描述

TypeNo

Nvarchar(50)

电影类型编号

moiveNO

Nvarchar(50)

电影编号

moiveName

Nvarchar(50)

电影名称

Director

Nvarchar(50)

主演

Actor

Nvarchar(50)

导演

Price

Int

             价格

mvTime

Nvarchar(50)

放映日期与时间

Type

Nvarchar(50)

类型

imgL

Nvarchar(50)

电影简图地址

表3管理员账号(Tuserpad)

列名

类型

是否标识列

允许为空

描述

UserID

nvarchar(50)

管理员账号

Psd

nvarchar(50)

         管理员密码

alevel

nvarchar(50)

管理员权限

4.2.3关系图

  1. 5电影院系统设计

图6 系统整体功能结构图

1.售票系统模块:给观众提供售票服务。不同的位置有不同的价格。要选购哪个位置由观众决定。工作人员根据观众的需要进行操作。

2.电影信息管理

:影片播放管理是对电影院播放的电影的充实,设定电影的播放,以及电影时间的设定。当所设定的电影已经播放完成后,要对其进行删除。还要对数据库进行清理,把一些没用的数据全部清除。对新电影进行添加。

      1. 本系统所有的窗体介绍

表7 窗体功能表

窗体名称

功能

登录窗体(LojinForm)

登陆进入主界面(有两个不同的角色)

退出窗体(ExitForm)

询问用户是否退出系统,避免点错直接退出

订票窗体(OrderForm)

在这个界面实现不同电影、不同座位不同的价格、不同的会员级别不同的折扣方式、可以连续选择多个位置进行订票、可以在这个界面退订电影票

主窗体(MainForm)

显示多个按钮方便连接各个操作界面

电影查询窗口(SelectForm)

查询电影,同时在这个界面可以选择电影进入订票窗口

增加电影窗口(AddForm)

管理员添加新的电影,便于及时的更新数据库电影的情况

修改电影窗口(AmendForm)

管理员进行电影修改

      1. 登陆界面

     登陆界面通过用户输入帐号密码验证是否本影院的工作人员,并判断工作人员的类型,并将类型输入help文件。

                

图8 登陆界面展示

图9 登陆界面流程图

登陆界面通过用户输入帐号、密码、用户类型,然后点击登陆按钮通过后台判断每个文本框中的内容是否符合要求,最后通过数据库SQL语言比较数据库进行如图8中的验证流程

      1. 主界面

      图10 主界面展示

5.2.4订票界面

5.2.5注册和添加新电影功能模块实现

      1. 数据库连接功能

这个类主要作用是连接数据库,通过每次连接数据库的时候直接调用函数,实现代码的简介化。

using System;

using System.Collections.Generic;

using System.Text;

using System.Data.SqlClient;

namespace FilmsSelect

{

    class DBHelper

    {

        public static SqlConnection conn = new SqlConnection

            ("Data Source=.\\SQLEXPRESS;AttachDbFilename=C:\\Documents and Settings\\Administrator\\桌面\\codefans.net\\flim_cs\\DATA\\Films.mdf;Integrated Security=True;Connect Timeout=30;User Instance=True");

    }

}

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;

namespace Tickets

{

    public partial class loginForm : Form

    {

        public loginForm()

        {

            InitializeComponent();

        }

        private void btnEnter_Click(object sender, EventArgs e)

        {

            if (tbUserName.Text.Trim() == "" || tbPsd.Text.Trim() == "" || cbbCaozuo.SelectedItem == null)

            {

                MessageBox.Show("请输入数据");

                return;

            }

            sqlCommand1.CommandText = string.Format("select count(*) from Tuserpad where  UserID='{0}'and Psd='{1}'and alevel='{2}'", tbUserName.Text.Trim(), tbPsd.Text.Trim(), cbbCaozuo.SelectedItem.ToString());

            int result = 0;

            MainForm XB = new MainForm();

            try

            {

                sqlConnection1.Open();

                result = (int)sqlCommand1.ExecuteScalar();

                if (result > 0)

                {

                    MessageBox.Show("登陆成功");

                    Movie.tbUserName = tbUserName.Text;

                    Movie.Caozuo = cbbCaozuo.SelectedItem.ToString();

                    XB.Show();

                    this.Hide();

                }

                else

                    MessageBox.Show("用户名或密码错误");

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

            }

            finally

            {

                sqlConnection1.Close();

            }

        }

        private void loginForm_Load(object sender, EventArgs e)

        {

        }

    }

}

主页面各种功能代码

using System;

using System.Collections.Generic;

using System.ComponentModel;

using System.Data;

using System.Drawing;

using System.Text;

using System.Windows.Forms;

using System.Data.SqlClient;

using System.IO;

namespace Tickets

{

    public partial class MainForm : Form

    {

        int i = 0;

        Cinema cinema;

        Dictionary<string, Label> labels = new Dictionary<string, Label>();

        public static List<Ticket> list;

        int ticket = 0;

        string image = null;

        string key = null;

        string kill = null;

        string k = null;

        public MainForm()

        {

            InitializeComponent();

        }

        private int editRecord(string editString)//自定义方法

        {

            try

            {

                sqlCommand1.CommandText = editString;//执行的命令文本

                sqlConnection1.Open();

                int result = sqlCommand1.ExecuteNonQuery();//执行连接并返回受影响的行数

                return result;

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

                return 0;

            }

            finally { sqlConnection1.Close(); }//关闭数据库

        }

        private void getAlDY()

        {

            //treeView1.Nodes.Clear();

            string seleStr = "select MoiveType from MVtype";

            try

            {

                sqlCommand1.CommandText = seleStr;

                sqlConnection1.Open();

                SqlDataReader dr = sqlCommand1.ExecuteReader();

                while (dr.Read())

                {

                    tvMovies.Nodes.Add(dr[0].ToString());

                }

                dr.Close();

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

            }

            finally

            { sqlConnection1.Close(); }

        }//查找电影名称

        private void getAllDY时间()

        {

            for (i = 0; i < tvMovies.Nodes.Count; i++)

            {

                getdianyingshijian(tvMovies.Nodes[i].Text.Trim());

            }

        }//遍历系别编号查找专业名称

        private void getdianyingshijian(string MoiveType)

        {

            string seleStr = string.Format("select moiveName from Moive,MVtype where MVtype.TypeNo=Moive.TypeNo and MoiveType='{0}'", MoiveType);

            try

            {

                sqlCommand1.CommandText = seleStr;

                sqlConnection1.Open();

                SqlDataReader dr = sqlCommand1.ExecuteReader();

                while (dr.Read())

                {

                    tvMovies.Nodes[i].Nodes.Add(dr[0].ToString());

                }

                dr.Close();

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

            }

            finally

            { sqlConnection1.Close(); }

        }

        private void MainForm_Load(object sender, EventArgs e)

        {

            tsbczy.Text = "欢迎您!  " + Movie.Caozuo + "  "+   Movie.tbUserName;

            this.lblMovieName.Text = "";

            this.cmbDisCount2.Enabled = false;

            this.cmbDisCount.Enabled = false;

            this.rdoNormal.Checked = true;

            labtime.Text = DateTime.Now.ToLongTimeString();

            cinema = new Cinema();

            InitSeats(7, 5, tpCinema);

            //初始化座位

            cinema.Load();

            getAlDY();

            getAllDY时间();

        }

        /// <summary>

        /// 初始化座位

        /// </summary>

        /// <param name="seatRow">行数</param>

        /// <param name="seatLine">列数</param>

        /// <param name="tb"></param>

        private void InitSeats(int seatRow, int seatLine, TabPage tb)

        {

            Label label;

            Seat seat;

            for (int i = 0; i < seatRow; i++)

            {

                for (int j = 0; j < seatLine; j++)

                {

                    label = new Label();

                    label.BackColor = Color.Yellow;

                    label.AutoSize = false;

                    label.Font = new System.Drawing.Font("宋体", 14.25F, System.Drawing.FontStyle.Regular, System.Drawing.GraphicsUnit.Point, ((byte)(134)));

                    label.Location = new System.Drawing.Point(59, 60);

                    label.Name = "lbl" + (j + 1).ToString() + "_" + (i + 1).ToString();

                    label.Size = new System.Drawing.Size(50, 25);

                    //设置座位号

                    label.Text = (j + 1).ToString() + "-" + (i + 1).ToString();

                    label.TextAlign = ContentAlignment.MiddleCenter;

                    label.Location = new Point(60 + (i * 90), 60 + (j * 60));

                    //所有的标签都绑定到同一事件

                    label.Click += new System.EventHandler(lblSeat_Click);

                    tb.Controls.Add(label);

                    labels.Add(label.Text, label);

                    //实例化一个座位

                    seat = new Seat((j + 1).ToString() + "-" + (i + 1).ToString(), Color.Yellow);

                    //保存的座位集合

                    cinema.Seats.Add(seat.SeatNum, seat);

                }

            }

        }

        private void tsmiMovies_Click(object sender, EventArgs e)

        {

            //判断放映列表是否为空

            if (cinema.Schedule.Items.Count == 0)

            {

                cinema.Schedule.LoadItems();

            }

        }

        private void chazhao(string shuju)

        {

            lblCalcPrice.Text = "待刷新";

            string selMoive = string.Format(shuju,key);

            try

            {

                sqlCommand1.CommandText = selMoive;

                sqlConnection1.Open();

                SqlDataReader dr = sqlCommand1.ExecuteReader();

                while (dr.Read())

                {

                    kill = dr[0].ToString();

                }

                dr.Close();

            }

            catch (Exception ex) { }

            finally

            {

                sqlConnection1.Close();

            }

        }

        private void tvMovies_AfterSelect(object sender, TreeViewEventArgs e)

        {

            TreeNode node = tvMovies.SelectedNode;

            if (node == null) return;

            if (node.Level != 1) return;

            key = node.Text;

            //将详细信息显示

            this.lblMovieName.Text = key;

            string Director = "select Director from Moive where moiveName='{0}'";

            chazhao(Director);

            lblDirector.Text = kill;

            string selActor = "select Actor from Moive where moiveName='{0}'";

            chazhao(selActor);

            lblActor.Text = kill;

            string selPrice = "select Price from Moive where moiveName='{0}'";

            chazhao(selPrice);

            lblPrice.Text = kill;

            string selTime = "select mvTime from Moive where moiveName='{0}'";

            chazhao(selTime);

            lblTime.Text = kill;

            string seltype = "select Type from Moive where moiveName='{0}'";

            chazhao(seltype);

            lblType.Text = kill;

            string selimg = "select imgL from Moive where moiveName='{0}'";

            chazhao(selimg);

            this.picMovie.ImageLocation = kill;

            

            //清空座位

            ClearSeat();

            //遍历该场电影的座位销售情况

            foreach (Ticket ticket in cinema.SoldTickets)

            {

                foreach (Seat seat in cinema.Seats.Values)

                {

                    if ((ticket.ScheduleItem.Time == key)

                        && (ticket.Seat.SeatNum == seat.SeatNum))

                    {

                        seat.Color = Color.Red;

                    }

                }

            }

            UpdateSeat();

        }

        /// <summary>

        /// 清空座位

        /// </summary>

        private void ClearSeat()

        {

            foreach (Seat seat in cinema.Seats.Values)

            {

                seat.Color = Color.Yellow;

            }

        }

        /// <summary>

        /// 更新座位状态

        /// </summary>

        private void UpdateSeat()

        {

            foreach (string key in cinema.Seats.Keys)

            {

                labels[key].BackColor = cinema.Seats[key].Color;

            }

        }

        /// <summary>

        /// 点击一个座位

        /// 买票事件

        /// </summary>

        /// <param name="sender"></param>

        /// <param name="e"></param>

        private void lblSeat_Click(object sender, EventArgs e)

        {

            if (String.IsNullOrEmpty(this.lblMovieName.Text))

            {

                MessageBox.Show("您还没选择电影");

                return;

            }

            ticket++;

            try

            {

                string seatNum = ((Label)sender).Text.ToString();

           

                //调用工厂创建票

                if (cinema.Seats[seatNum].Color == Color.Yellow)

                {

                   

                    DialogResult result = MessageBox.Show("是否购买?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Question);

                 

                    if (result == DialogResult.Yes)

                    {

                        if (rdoHuiyuan.Checked)

                        {

                            cinema.Seats[seatNum].Color = Color.Red;

                            UpdateSeat();

                            lblCalcPrice.Text = (double.Parse(lblPrice.Text) * double.Parse(cmbDisCount2.SelectedItem.ToString()) / 10).ToString();

                         

                        }

                        if(rdoStudent.Checked)

                        {

                            cinema.Seats[seatNum].Color = Color.Red;

                            UpdateSeat();

                            lblCalcPrice.Text = (double.Parse(lblPrice.Text) * double.Parse(cmbDisCount.SelectedItem.ToString()) / 10).ToString();

                        }

                        if (rdoNormal.Checked)

                        {

                            cinema.Seats[seatNum].Color = Color.Red;

                            UpdateSeat();

                            lblCalcPrice.Text = lblPrice.Text;

                        }

                    }

                    else if (result == DialogResult.No)

                    {

                        return;

                    }

                }

                else

                {

                    MessageBox.Show("此影院座位已售出.");

                }

            }

            catch (Exception ex)

            {

                MessageBox.Show(ex.ToString());

            }

        }

        private void rdoVip_CheckedChanged(object sender, EventArgs e)

        {

            this.cmbDisCount2.Enabled = true;

            this.cmbDisCount2.Text = "8";

            this.cmbDisCount.Enabled = false;

            this.cmbDisCount.Text = "";

        }

        private void rdoStudent_CheckedChanged(object sender, EventArgs e)

        {

            this.cmbDisCount2.Enabled = false;

            this.cmbDisCount2.Text = "";

            this.cmbDisCount.Enabled = true;

            this.cmbDisCount.Text = "5";

        }

        private void rdoNormal_CheckedChanged(object sender, EventArgs e)

        {

            this.cmbDisCount.Enabled = false;

            this.cmbDisCount2.Text = "";

            this.cmbDisCount2.Enabled = false;

            this.cmbDisCount.Text = "";

        }

        private void tsmiExit_Click(object sender, EventArgs e)

        {

            //退出时序列化Cinema对象

            cinema.Save();

            this.Dispose();

        }

        private void tsmiSave_Click(object sender, EventArgs e)

        {

            cinema.Save();

        }

        private void MainForm_FormClosing(object sender, FormClosingEventArgs e)

        {

            DialogResult close;

            close = MessageBox.Show("是否保存当前销售状态?", "提示", MessageBoxButtons.YesNo, MessageBoxIcon.Information);

            if (close == DialogResult.Yes)

            {

                cinema.Save();

            }

        }

        private void btnliulan_Click(object sender, EventArgs e)

        {

            OpenFileDialog ofd = new OpenFileDialog();

            ofd.Title = "请选择上传的图片";

            ofd.Filter = "图片格式|*.jpg";

            ofd.Multiselect = false;

            if (ofd.ShowDialog() == System.Windows.Forms.DialogResult.OK)

            {

                string filePath = ofd.FileName;

                int position = filePath.LastIndexOf("\\");

                String fileName = filePath.Substring(position + 1);

                System.IO.File.Copy(filePath, @"image\" + fileName);

                tbZhaoPian.Text = @"image\" + fileName;

                 pbImage.ImageLocation = ofd.FileName;

            }

           

        }    

        private void tbZhaoPian_TextChanged(object sender, EventArgs e)

        {

            this.pbImage.ImageLocation = openFileDialog1.FileName;

            

        }

        private void 修改电影信息ToolStripMenuItem_Click(object sender, EventArgs e)

        {

             MoiveInfo xg = new MoiveInfo();

             xg.ShowDialog();

        }

        private void timer1_Tick(object sender, EventArgs e)

        {

            labtime.Text = DateTime.Now.ToLongTimeString();

        }

        private void btn取消_Click(object sender, EventArgs e)

        {

              try

            {

                if (tabControl2.SelectedTab ==tptianjia)

                {

                    this.tabControl2.SelectedTab = this.tpToday;

                }

            }

            catch (Exception ex)

            {

            }

        }

        private void btntianjia_Click(object sender, EventArgs e)

        {

            if (ccbNO.SelectedItem == null || tbmvNo.Text.Trim() == "" || tbPName.Text.Trim() == "" || tbZY.Text.Trim() == "" ||

              tbDY.Text.Trim() == "" || tbTime.Text.Trim() == "" || tbPRI.Text.Trim() == "" || ccblei.SelectedItem == null || tbZhaoPian.Text.Trim() == "")

            {

                MessageBox.Show("请输入数据");

                return;

            }

            string addr = string.Format("insert  into Moive  values ('{0}','{1}','{2}','{3}','{4}','{5}','{6}','{7}','{8}')", ccbNO.SelectedItem.ToString(), tbmvNo.Text.Trim(),

                 tbPName.Text.Trim(), tbZY.Text.Trim(), tbDY.Text.Trim(), ccblei.SelectedItem.ToString(), tbTime.Text.Trim(), tbPRI.Text.Trim(), tbZhaoPian.Text.Trim());

            if (editRecord(addr) > 0)

            {

                MessageBox.Show("添加成功!");

                tvMovies.Nodes.Clear();

                getAlDY();

                getAllDY时间();

            }

            else

                MessageBox.Show("添加失败!");

        }

        private void 添加ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            try

            {

                if (tabControl2.SelectedTab == tpToday)

                {

                    this.tabControl2.SelectedTab = this.tptianjia;

                    tbmvNo.Text = "" ;

                    tbPName.Text = "" ;

                    tbZY.Text = "" ;

                    tbDY.Text = "";

                    tbTime.Text = ""  ;

                    tbPRI.Text = ""  ;

                    tbZhaoPian.Text = "";

                }

            }

            catch (Exception ex)

            {

            }

        }

  

        private void timer1_Tick_1(object sender, EventArgs e)

        {

            labtime.Text = DateTime.Now.ToLongTimeString();

        }

        private void 获取新列表ToolStripMenuItem_Click(object sender, EventArgs e)

        {

            tvMovies.Nodes.Clear();

            getAlDY();

            getAllDY时间();

        }

  }

        }

电影信息修改界面代码

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;

namespace Tickets

{

    public partial class MoiveInfo : Form

    {

        

        int i = 0;

        public MoiveInfo()

        {

            InitializeComponent();

        }

        private void button2_Click(object sender, EventArgs e)

        {

        }

        private void getAlDY()

        {

            //treeView1.Nodes.Clear();

            string seleStr = "select MoiveType from MVtype";

            try

            {

                sqlCommand1.CommandText = seleStr;

                sqlConnection1.Open();

                SqlDataReader dr = sqlCommand1.ExecuteReader();

                while (dr.Read())

                {

                    treeView1.Nodes.Add(dr[0].ToString());

                }

                dr.Close();

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

            }

            finally

            { sqlConnection1.Close(); }

        }//查找电影名称

        private void MoiveInfo_Load(object sender, EventArgs e)

        {

            getAlDY();

        }

        private void getAllDY时间()

        {

            for (i = 0; i < treeView1.Nodes.Count; i++)

            {

                getdianyingshijian(treeView1.Nodes[i].Text.Trim());

            }

        }//遍历所有电影

        private void getdianyingshijian(string MoiveType)

        {

            string seleStr = string.Format("select moiveName from Moive,MVtype where MVtype.TypeNo=Moive.TypeNo and MoiveType='{0}'", MoiveType);

            try

            {

                sqlCommand1.CommandText = seleStr;

                sqlConnection1.Open();

                SqlDataReader dr = sqlCommand1.ExecuteReader();

                while (dr.Read())

                {

                    treeView1.Nodes[i].Nodes.Add(dr[0].ToString());

                }

                dr.Close();

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

            }

            finally

            { sqlConnection1.Close(); }

        }

        private void MoiveInfo_Load_1(object sender, EventArgs e)

        {

            getAlDY();

            getAllDY时间();

            appear();

        }

        private void appear()   //listView1的显示。

        {

            listView1.Items.Clear();

            string seleStr = "select TypeNo,moiveNO, moiveName, Director, Actor, Price, mvTime,Type,imgL from Moive";

            try

            {

                sqlCommand1.CommandText = seleStr;

                sqlConnection1.Open();

                SqlDataReader dr = sqlCommand1.ExecuteReader();

                while (dr.Read())

                {

                    ListViewItem li = new ListViewItem((dr[0].ToString()));

                    li.SubItems.Add(dr[1].ToString());

                    li.SubItems.Add(dr[2].ToString());

                    li.SubItems.Add(dr[4].ToString());

                    li.SubItems.Add(dr[5].ToString());

                    li.SubItems.Add(dr[3].ToString());

                    li.SubItems.Add(dr[6].ToString());

                    li.SubItems.Add(dr[7].ToString());

                    li.SubItems.Add(dr[8].ToString());

                    listView1.Items.Add(li);

                   

                }

                dr.Close();

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

            }

            finally

            {

                sqlConnection1.Close();

            }

        }

        private void listView1_SelectedIndexChanged(object sender, EventArgs e)

        {

          

           

            tbbianhao.Enabled = false;

            tbleix.Enabled = false;

            tbDbiaohao.Enabled = false;

            try

            {

                if (listView1.SelectedItems == null)

                {

                    MessageBox.Show("请选择数据");

                }

                else

                {

                    tbbianhao.Text = listView1.SelectedItems[0].SubItems[0].Text;

                    tbDbiaohao.Text = listView1.SelectedItems[0].SubItems[1].Text;

                    tbpiaojia.Text = listView1.SelectedItems[0].SubItems[4].Text;

                    tbdao.Text = listView1.SelectedItems[0].SubItems[3].Text;

                    tbzhu.Text = listView1.SelectedItems[0].SubItems[5].Text;

                    tbleix.Text = listView1.SelectedItems[0].SubItems[7].Text;

                    tbshi.Text = listView1.SelectedItems[0].SubItems[6].Text;

                    tbpian.Text = listView1.SelectedItems[0].SubItems[2].Text;

                    textBox9.Text = listView1.SelectedItems[0].SubItems[8].Text;

                    this.picMovie2.ImageLocation = textBox9.Text;

                }

            }

            catch (Exception ex)

            {

            }

        }

        private int editRecord(string editString)//自定义方法

        {

            try

            {

                sqlCommand1.CommandText = editString;//执行的命令文本

                sqlConnection1.Open();

                int result = sqlCommand1.ExecuteNonQuery();//执行连接并返回受影响的行数

                return result;

            }

            catch (Exception ex)

            {

                Console.WriteLine(ex.ToString());

                return 0;

            }

            finally { sqlConnection1.Close(); }//关闭数据库

        }

        private void btn修改_Click(object sender, EventArgs e)

        {

            string UpStr = string.Format("Update  Moive set TypeNo='{0}' , moiveName='{2}' , Director='{3}' , Actor='{4}' , price='{5}' ,  mvTime='{6}', Type='{7}' , imgL='{8}'  where moiveNo='{1}'",

                tbbianhao.Text.Trim(), tbDbiaohao.Text.Trim(), tbpian.Text.Trim(), tbdao.Text.Trim(), tbzhu.Text.Trim(), tbpiaojia.Text.Trim(), tbshi.Text.Trim(), tbleix.Text.Trim(), textBox9.Text.Trim());

            if (editRecord(UpStr) > 0)

            {

                MessageBox.Show("修改成功!");

                treeView1.Nodes.Clear();

                getAlDY();

                getAllDY时间();

                appear();

            }

            //重新遍历

            else

                MessageBox.Show("修改失败!");

        }

        private void btn删除_Click(object sender, EventArgs e)

        {

            string delStr = string.Format("Delete from Moive where  TypeNo='{0}' and  moiveName='{2}'and Director='{3}' and Actor='{4}' and price='{5}' and  mvTime='{6}'and Type='{7}'and imgL='{8}' and  moiveNo='{1}'",

                tbbianhao.Text.Trim(), tbDbiaohao.Text.Trim(), tbpian.Text.Trim(), tbdao.Text.Trim(), tbzhu.Text.Trim(), tbpiaojia.Text.Trim(), tbshi.Text.Trim(), tbleix.Text.Trim(), textBox9.Text.Trim());

            if (editRecord(delStr) > 0)

            {

                MessageBox.Show("删除成功!");

                treeView1.Nodes.Clear();

                getAlDY();

                getAllDY时间();   //重新遍历

                appear();

            }

            else

                MessageBox.Show("删除失败!");

        }

        private void btn取消_Click(object sender, EventArgs e)

        {

                this.Close();

        }

    }

}

      

  

    

7.11结 论

从开始选择题目、系统的规划再到后来系统的一点点的设计与实现,在经过不断的调试和修改,本超市管理系统基本完成。本系统采用的开发工具是C#语言和SQL Server。

本管理系统实现了影院管理的一些基本功能,像影片管理、订票管理、财务管理、等功能。对于一般的小影院来说还是很有实际意义以及很强的实用性的。比如在销售了商品或者修改了某种商品信息时,与之关联的库存表和信息表也被修改,实现了数据的实时性。同时各个模块之间都有查询功能,用来实时掌握本影院电影、订票信息。本系统同时还具有以下特点:扩展性能好,以及快速便捷的操作能力。系统比较安全可靠,用户管理权限很明确。本系统采用相应的技术,具有很好的安全严密性,系统完善的功能设置、比较友好的流程化界面,节省了大量的人力物力和财力,同时也降低了影院的运营成本。总的来说本系统是一个比较好的比较适合小影院的系统,它通过前台和数据库,将原来比较繁琐、浪费时间精力还易出错误的工作,变得简单。

总之,本系统的美观和人性化还做得不够。手动操作量大,导致系统处理大量数据的时候反应很慢。在查询功能上部分模块没有实现模糊查询。

  1. 致 谢

在本次毕业设计实践中,毫无疑问要感谢的是我的李敏老师,在这次毕业设计中,李老师不辞辛劳的一点点的帮助我,从选题的指导到系统设计的修改,让我从刚开始的摸不到头脑到后来的日益纯熟,都是李老师辛勤付出的结果。在设计中我还领略到了李老师认真负责的工作态度,严谨的治学精神,以及乐观热情的生活态度,李老师不仅仅的在指导我的毕业设计,也在指导着我今后的人生,她教导我的这些东西,会对我以后的学习生活大有裨益。所以在这里我真诚的对给予我认真指导和耐心帮助的李老师表示最深切的谢意。

通过这次的毕业设计,自己对软件工程又有了一个更深层次的理解。以前在做任何设计时,对设计的前期工作不是很重视,但通过这次系统的编写,我发现前期的设计是很重要的一部分,只有对设计的需求分析有了很好的理解才能有更好的解决思路。平时我们在代码编写时对函数和变量的命名都很随便,还缺少必要的注释,或许这样问题当时能够解决但对于后期开发和维护以及旁人的阅读都带来了一定的困难,都可能会产生异议或不理解。再者测试在项目开发中也是很重要的一个环节,测试能对一些程序的Bug做一些必要的弥补,可以使程序更加的完善和人性化。

  1. 参考文献
  1. 刘甫迎、刘光会、王蓉.C#程序设计教程(第2版).北京:电子工业出版社,2008:P52-24
  2. 李兰友、杨晓光.Visual C#.NET程序设计.北京:清华大学,北方交通大学出版社,2004:P68-59
  3. 王昊亮、李刚等.Visual C#程序设计教程.北京:清华大学出版社,2003:P43-25
  4. 张海藩.软件工程导论.第四版.北京:清华大学出版社,2004:P 65-92
  5. 吴晨,孙少波. ASP.NET数据库项目案例导航.北京:清华大学出版社2004.11
  6. Inmon W.数据库管理.第二版北京:电子工业出版社2000P 66-10
  7. Imhoff C.数据库设计.第四版.北京:机械工业出版社,2004:P 171-197
  8. Karli Watson, Christian Nagel.Beginning Visual C#2005 [M].北京:清华大学出版社,2006,7-9.
  9. Simon R, Ollie C. Professional C# [M].1st ed. Beijing: Tsinghua University Press, 2002: 339-348.
  10. YAO Wanjun.The Technology of Applying ADO to Access SQL Server based on VC[J].Micro-computer Application,2004,25(1):99.

  • 2
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
具体要求:***********尽量做的简单化 别用CSS技术以及自定义控件 别用脚本语言 我们看不懂 达到我们学生初级初级水平****** 在线售票系统(毕业设计) 系统设置:密码修改 增加用户(权限) [打印机设置 票样打印设置 这2块用不着实现系统界面上 放着就好了] 基础设置:基础参数设置(买票设置/订票设置/退票设置)(比如多少时间之前不能买票订票) 车票设置(标准票/儿童票/。。。增删改) 车辆设置(增删该) 车次设置(增删该) 运营计划设置(调度设置) 前台营业:销售车票 预定车票 退回车票 信息查询:售票信息查询 订票信息查询 运营计划查询 当班信息查询(类似当班收入什么的) 营业统计:日售票报表统计 月售票报表统计 季度售票报表统计 常用工具:记事本、计算器 备注信息:只要程序 不要论文 5/1号要 你看能不 能按照这个界面这样做 这样应该做界面的人有个参照就简单点吧 最好按照这个系统的流程做 有些具体的我订单上没有写说明的就省了吧 但是你要把刚刚我们2个的都做简单再简单。。。。行不 别用java脚本 或者CSS 不然我们不懂的 界面漂亮点 代码菜鸟点 使用帮助: 1. 把DB文件夹的主数据库webSealTicket_Data.MDF 还原到你的sql 2000数据库系统中 名称不要变为webSealTicket。 2. App_Code文件夹下是sql静态链接类System.Data.SqlClient.SqlConnection con = new System.Data.SqlClient.SqlConnection("server=(local);database=webSealTicket;uid=sa;pwd=;"); 如直接还原这里不用变化"server=(local)是你的本机的ip地址,database=webSealTicket 是你的数据库名称不要变化,uid=sa 是sql2000的用户名,pwd位密码。 3. login.aspx文件设置成主页,为登录界面。登录成共进入Index.aspx页面。 4. image 文件夹为系统中用到的图片。 5. 如出现连接数据库问题请查看Web.Config文件用记事本打开配置节 为程序中用到的数据库链接。name="webSealTicketConnectionString"为连接字符串。connectionString="Data Source=.;Initial Catalog=webSealTicket; 为数据源。 Security=True"启用安全。 @更多@ http://cleopard.download.csdn.net/ 福利 http://xuemeilaile.com @更多@ http://download.csdn.net/user/cleopard/album 17份软件测试文档 http://download.csdn.net/album/detail/1425 13份WPF经典开发教程 http://download.csdn.net/album/detail/1115 C#资料合辑二[C#桌面编程入门篇] http://download.csdn.net/album/detail/957 C#资料合辑一[C#入门篇] http://download.csdn.net/album/detail/669 [Csharp高级编程(第6版)](共8压缩卷) http://download.csdn.net/album/detail/667 10个[精品资源]Java学习资料合辑[一] http://download.csdn.net/album/detail/663 10个C#Socket编程代码示例 http://download.csdn.net/album/detail/631 6份GDI+程序设计资源整
以下是一个简单的Java实现影院订票系统的代码示例: ```java import java.util.Scanner; public class MovieTicketSystem { private static int[][] seats = new int[10][10]; // 影院座位,0表示空位,1表示已售 public static void main(String[] args) { Scanner input = new Scanner(System.in); while (true) { System.out.println("欢迎使用影院订票系统!"); System.out.println("请输入功能序号:"); System.out.println("1. 显示座位情况"); System.out.println("2. 选座购票"); System.out.println("3. 退出系统"); int choice = input.nextInt(); switch (choice) { case 1: displaySeats(); break; case 2: buyTicket(); break; case 3: System.out.println("欢迎下次使用!"); System.exit(0); default: System.out.println("输入错误,请重新输入!"); } } } // 显示座位情况 private static void displaySeats() { System.out.println("正在显示座位情况:"); System.out.println(" 1 2 3 4 5 6 7 8 9 10"); for (int i = 0; i < seats.length; i++) { System.out.print((i + 1) + " "); for (int j = 0; j < seats[i].length; j++) { if (seats[i][j] == 0) { System.out.print("○ "); } else { System.out.print("● "); } } System.out.println(); } } // 选座购票 private static void buyTicket() { Scanner input = new Scanner(System.in); System.out.println("正在进行选座购票:"); while (true) { System.out.println("请输入行号(1-10):"); int row = input.nextInt() - 1; System.out.println("请输入列号(1-10):"); int col = input.nextInt() - 1; if (row < 0 || row >= seats.length || col < 0 || col >= seats[0].length) { System.out.println("输入座位号错误,请重新输入!"); } else if (seats[row][col] == 1) { System.out.println("该座位已售出,请重新选择!"); } else { System.out.println("购票成功!"); seats[row][col] = 1; break; } } } } ``` 这个例子中,我们使用一个二维数组来表示影院座位,其中0表示空位,1表示已售。程序提供两个功能,一个是显示座位情况,另一个是选座购票。在选座购票功能中,用户需要输入所选座位的行号和列号,程序会判断该座位是否已售出,如果没有售出则将其标记为已售,并输出购票成功的信息。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

等天晴i

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

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

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

打赏作者

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

抵扣说明:

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

余额充值