带有界面的12306!无限自动查询并购票的脚本!年关买票了吗

CSS+JS+Java设计12306登录界面 1.今天先来梳理JS部分: 众所周知,JS代码位于之间的function checkGenValue(txtId,divId,spanId,regex,infoStr){ //先从文档中获取元素 var flag = false; var txtObj = document.getElementById(txtId);//txtObj是提示框中的文本对象 var d 阅读详情

分享记录一个带有GUI界面的12306(默认二等座)无限自动查询并购票的脚本(购票成功发送邮件)

from tkinter import * #编写GUI界面
import threading  #引入线程,解决GUI堵塞
from selenium import webdriver
#导入显式等待相关库
from selenium.webdriver.support.ui import WebDriverWait
#导入显式等待条件语句库
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By #后面的until()必须元组形式,所以导入By
#导入csv模块来读取站点代号
import  csv
#导入表单下滑选项操作的库
from selenium.webdriver.support.ui import Select
#导入可能出现的异常
from selenium.common.exceptions import NoSuchElementException
from selenium.common.exceptions import ElementNotVisibleException
from selenium.common.exceptions import StaleElementReferenceException
from selenium.common.exceptions import ElementNotInteractableException
#导入时间模块进行等待
from time import sleep
#导入发送邮件模块
import yagmail


"""将driver放在外面的原因是:
   如果放在里面,那么driver将会随着对象的销毁而销毁
   而我们的类TrainSpider的实例对象是放在main()函数中执行的
   只要main()函数运行完成后,里面所有的变量都会被销毁
   也就说spider类实例对象也会被销毁
"""

#初始化GUI界面
root = Tk()
root.title('Carson的12306购票器')
root.geometry('400x350')
#初始化基本GUI界面的组件
lb1 = Label(root,text = '欢迎使用Carson的12306二等座购票器',font=('Arial', 14))
lb1.place(relx = 0.08,rely=0.02)
lb2 = Label(root,text = '乘车人员:',font=('Arial', 12))
lb2.place(x = 45,y = 45)
lb3 = Label(root,text = '出发日期:',font=('Arial', 12))
lb3.place(x = 45,y = 78)
lb4 = Label(root,text = '出发车站:',font=('Arial', 12))
lb4.place(x = 45,y = 111)
lb5 = Label(root,text = '终点车站:',font=('Arial', 12))
lb5.place(x = 45,y = 144)
lb6 = Label(root,text = '购买车次:',font=('Arial', 12))
lb6.place(x = 45,y = 177)
lb7 = Label(root,text = '购票信息如下:',font=('Arial', 12))
lb7.place(x = 0,y = 205)
text = Text(root,height = 5,width=56)
text.place(x = 0,y= 232)
entry1_str = StringVar()
entry1_str.set('输入乘车人的姓名,如:张三')
entry1 = Entry(root,textvariable = entry1_str,)
entry1.place(x = 120,y = 46,height=28,width=160)
entry2_str = StringVar()
entry2_str.set('输入出发日期,格式如:2021-01-16')
entry2 = Entry(root,textvariable = entry2_str,)
entry2.place(x = 120,y = 79,height=28,width=190)
entry3_str = StringVar()
entry3_str.set('输入起始站,如:深圳北')
entry3 = Entry(root,textvariable = entry3_str)
entry3.place(x = 120,y = 112,height=28,width=160)
entry4_str = StringVar()
entry4_str.set('输入终点站,如:潮阳')
entry4 = Entry(root,textvariable = entry4_str)
entry4.place(x = 120,y = 145,height=28,width=160)
entry5_str = StringVar()
entry5_str.set('输入车次,格式如:G6006 D1234')
entry5 = Entry(root,textvariable = entry5_str)
entry5.place(x = 120,y = 178,height=28,width=180)
class TrainSpider:  
    #将属性放类里面定义为类属性
    login_url = 'https://kyfw.12306.cn/otn/resources/login.html' #二维码登陆界面url
    personal_url = 'https://kyfw.12306.cn/otn/view/index.html'  #登陆后进入的个人中心url
    left_ticket_url = 'https://kyfw.12306.cn/otn/leftTicket/init?linktypeid=dc' #查询车次和余票的url
    confirm_passenger_url = 'https://kyfw.12306.cn/otn/confirmPassenger/initDc' #确认乘客信息的url
    
    def __init__(self,from_station,to_station,train_date,trains,passengers,driver):
        """
        :param from_station:  起始车站
        :param to_station: 目的地车站
        :param train_date: 出发日期
        :param trains: 需要购买的车次。需要字典形式,形式如:{“G529”:["O","M"],"G403":["O","M"]}多车次就多个键值对
        :param passengers: 需要买票的乘车人,需要为一个列表
        """
        self.driver = driver
        self.from_station = from_station
        self.to_station = to_station
        self.train_date = train_date
        self.trains = trains
        self.passengers = passengers
        self.current_number = None #定义一下变量保存下当前预定的车次序号信息
        self.current_seat = None #定义一下变量保存下当前选中的车次的选中的席位信息
        #为了方便根据站名文字来取得车站代号,需要创建字典存储代号数据
        #且空集合的创建要在函数外,不然执行完函数集合数据就没有了
        self.station_codes = {}
        #初始化站点代号数据
        self.get_station_codes()


    #获取车站代码
    #这里需要本地有一个station.csv的车站对应代码的文件
    def get_station_codes(self):
        #读取数据并存放到空字典中
        with open('stations.csv', 'r', encoding='utf-8') as fp:
            reader = csv.DictReader(fp)
            for line in reader:
                name = line['name']
                code = line['code']
                self.station_codes[name] = code


    #实现登陆功能
    def login(self):
        self.driver.maximize_window() #最大化窗口
        # 将属性放类里面定义为类属性,调用时需要加self进行调用
        self.driver.get(self.login_url)
        # 进行显式等待(有条件)设置100秒,且用来判断是否登陆成功
        # 即后面判断条件是url是否变化成个人中心的url
        WebDriverWait(self.driver, 100).until(
            EC.url_to_be(self.personal_url)  # 注意类中变量调用加self
            #或者EC.url_contains(self.personal_url)
        )
        print('登陆成功!')
        print('开始刷票!')


    #查询车次余票
    def search_left_tickets(self):
        self.driver.get(self.left_ticket_url)
        """起始站的代号设置"""
        from_station_input = self.driver.find_element_by_id('fromStation')
        #利用用户输入文字获取起始站的代号
        from_station_code = self.station_codes[self.from_station]
        #通过js代码修改隐藏标签的value值来达到输入起始站的目的
        self.driver.execute_script("arguments[0].value = '%s'"%from_station_code,from_station_input)
        """终点站的代号设置"""
        to_station_input = self.driver.find_element_by_id('toStation')
        to_station_code = self.station_codes[self.to_station]
        self.driver.execute_script("arguments[0].value = '%s'"%to_station_code,to_station_input)
        """日期设置"""
        #这里没有前面两个复杂,没有被隐含,理论上标签send_keys即可
        #但可能也像前面两个输入框一样被处理过,故输入时间也才用执行js代码的方式
        train_date_input = self.driver.find_element_by_xpath('//*[@id="train_date"]') #xpath*表任意
        self.driver.execute_script("arguments[0].value = '%s'" % self.train_date, train_date_input)
        """执行查询操作"""
        search_button = self.driver.find_element_by_id('query_ticket').click()
        print("第1次查询中...")
        # 因为点击查询按钮后需等待一下才会返回列车车次数据
        # 所以在解析具体的车次信息前需要设置等待,采用显示等待(条件即加载出tbody下的tr标签)
        """注意,在until(EC.presence_of_element_located())中
        验证元素是否出现,传入的参数必须都是元组类型的locator,如(By.ID, ‘kw’),
        不能传入webelement对象,即driver.find_elemet_by_id()的写法不行会报错
        """
        # 设置1000秒显式等待有各个列车信息的tr标签出现(一般开售前5分种即5*60=300秒足够了)
        WebDriverWait(self.driver, 1000).until(
            # 条件判断是某元素即tr标签是否出现,注意..located()里面是元组类型的locator,必须如下写法
            EC.presence_of_element_located((By.XPATH, '//*[@id="queryLeftTable"]/tr'))
        )
        # 注意有许多车次对应许多的tr标签,注意用elements返回列表
        # 且注意对第二个tr标签利用xpath里面的not(@属性名)过滤掉
        trains = self.driver.find_elements_by_xpath('//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')
        #添加一个布尔标志,用于判断所选车次是否有票再去查询
        is_searched = False
        n =1
        #添加死循环,直到数据符合条件才退出
        while True:
            for train in trains:
                # 利用text打印出标签里面关于车次信息的文本即可
                # 由于刚打印出来的数据之间都是换行的,现在将其替换空格放成同一行
                # 调用split(),以空格进行分割,分割上面替换后的字符串,会返回列表形式的车次的所有信息
                infos = train.text.replace("\n", ' ').split(' ')
                # 从返回的车次列表信息中提取出车次序号数据
                number = infos[0]
                # 判断提取的车次序号数据(number)有没有在用户要的车次字典的里面
                # 是的话再判断有无席位的信息再去预定,
                if number in self.trains:  # 注意self.trains我们已定义是字典,{“G529":["O"."M"]}
                    seat_types = self.trains[number]  # 根据numer的键取得定义字典的座席类型
                    # 取得的座位类型是列表,需要for循环遍历
                    for seat_type in seat_types:
                        # 当座位席位是二等座时,且二等座对应infos[9]
                        if seat_type == "O":
                            count = infos[9]
                            # 当count是数字或者是有 时代表有座
                            # 用.isdigtit()方法说明是数字
                            if count.isdigit() or count == '有':
                                is_searched = True
                                break  # 找到一个座位类型就可以退出自己想要的座位类型列表了
                        # 当座位席位是一等座时,且一等座对应infos[8]
                        elif seat_type == "M":
                            count = infos[8]
                            if count.isdigit() or count == '有':
                                is_searched = True
                                break  # 找到一个座位类型就可以退出自己想要的座位类型列表了
                # 当有票即布尔标志为True时执行预定按钮
                if is_searched:
                    self.current_number = number  # 保存下当前选择的车次序号信息
                    # 从train即第一个有数据的tr标签里面用xpath去找预定按钮执行预定
                    order_button = train.find_element_by_xpath('.//a[@class="btn72"]')
                    order_button.click()
                    print(str(number)+"车次有票,当前购买的车次是"+str(number))
                    # 当有票且执行预定了的话,买到票了,就可以退出最外层的对车次解析的循环了
                    return#不能用break只能退出for,return才能退出死循环

            # 当标志为False时,不断执行查询操作
            if is_searched==False:
                try:
                    search_button = self.driver.find_element_by_id('query_ticket')
                    search_button.click()
                    n += 1
                    #trains也要在每次查询点击后再重新查找一下,即更新trains元素
                    trains = self.driver.find_elements_by_xpath('//tbody[@id="queryLeftTable"]/tr[not(@datatran)]')
                    print("第%d次查询中..."%n)
                    #设置等待,让其监控余票
                    #这里可以不设置sleep,或者更慢,自动查询的速度更块
                    sleep(3)

                except StaleElementReferenceException: #俘获异常则pass
                    pass


    def confirm_passengers(self):
        #需要显示等待下,确认下url是否已经变化到确认乘客信息
        WebDriverWait(self.driver,100).until(
            #EC.url_to_be(self.confirm_passenger_url)
            EC.url_contains(self.confirm_passenger_url)
        )
        #需要再显示等待下,确认下乘车人的横栏信息是否加载出来了
        WebDriverWait(self.driver,100).until(
            EC.presence_of_element_located((By.XPATH,'//ul[@id="normal_passenger_id"]/li/label'))
        )
        """确认需要购买的乘客"""
        #需要找到多个li标签下的label,需要elements且返回列表
        passenger_lables = self.driver.find_elements_by_xpath('//ul[@id="normal_passenger_id"]/li/label')
        for passenger_lable in passenger_lables:
            name = passenger_lable.text
            #判断这个获取的name在不在所要买票的人的列表里
            if name in self.passengers:  #注意是列表形式的数据才能用in
                passenger_lable.click() #勾选起来即可

        """确认需要购买的座位类型"""
        #先用Select()包装下
        seat_select = Select(self.driver.find_element_by_id('seatType_1'))
        #下面选择席位,需要根据用户能够接受的席位来选择
        #这步的话有个细节,前面需要保存下之前预定按钮选择的车次序号,以便根据序号来看看对应用户需要的座位类型
        seat_types = self.trains[self.current_number]  # 使用相应的key值查找对应车次序号的座位类型列表
        for seat_type in seat_types:
            #注意细节,假如第一个选择的席位没有票了,选择不到,会抛出异常
            try:
                self.current_seat = seat_type #保存一下当前选泽的席位信息
                seat_select.select_by_value(seat_type)
            except NoSuchElementException:
                continue
            else:
                break  #假如第一个有票就直接选择然后退出循环

        #等待提交按钮可以被点击
        WebDriverWait(self.driver,100).until(
            #即等待某个元素可以被点击
            EC.element_to_be_clickable((By.ID,'submitOrder_id'))
        )
        sumit_button = self.driver.find_element_by_id('submitOrder_id')
        sumit_button.click()

        #判断模态对话框即购票信息对话框出现并确认按钮可以点击了
        WebDriverWait(self.driver,100).until(
            EC.presence_of_element_located((By.CLASS_NAME,'dhtmlx_window_active'))
        )
        WebDriverWait(self.driver,100).until(
            EC.element_to_be_clickable((By.ID,'qr_submit_id'))
        )
        sumit_button = self.driver.find_element_by_id('qr_submit_id')
        #注意这里的细节,由于Seenium自身的Bug,可能会导致确认点击操作无法正确执行
        #故需俘获异常,且需加入无限循环操作,点击之后再获取再点击
        try:
            while sumit_button:
                try:
                    sumit_button.click()
                    sumit_button = self.driver.find_element_by_id('qr_submit_id')
                except (ElementNotVisibleException,ElementNotInteractableException): #当在此页面见不到此元素,代表已进入付款页面
                    break
            print("恭喜鲁!%s车次%s席位抢票成功"%(self.current_number,self.current_seat))
        except:
            pass

    def send_mail(self):
        """发送邮件"""
        # 连接服务器,提供用户名,授权码,服务器地址
        #这里需要您的QQ邮箱开启smtp服务才行。
        yag_server = yagmail.SMTP(user='你的qq邮箱账号', password='你的smtp授权码', host='smtp.qq.com'
        # 填写发送对象,邮件主题和内容
        email_to = ['你的接收通知信息的邮箱账号', ]
        email_title = "恭喜你!%s的%s车次二等座购票成功"%(self.passengers,self.current_number)
        #由于self.passengers是列表的形式,要转为str进行拼接然后加[0]提取内容
        email_content = "乘车人:"+str(self.passengers[0])+"\n"+"出发日期:"+str(self.train_date)+"\n"+"所买车次:"+str(self.current_number)+"\n"+"所买路线:"+str(self.from_station)+"------>>"+str(self.to_station)
          
        # 发送邮件
        yag_server.send(email_to, email_title, email_content)
        print('已发送邮件!')
        # 关闭服务
        yag_server.close()


    """写个run方法,将步骤封装在一起,让使用起来更方便,即不用理里面的细节"""
    def run(self):
        #先登陆
        self.login()
        #查车次余票
        self.search_left_tickets()
        #确认乘客和车次信息
        self.confirm_passengers()
        #购票后发送邮件通知
        self.send_mail()

#引入线程,target是main函数,防止GUI堵塞
def run():
    t = threading.Thread(target=main)
    t.start() #启动线程
    
#输出信息函数
def printlog():
    #提取输入的数据
    name = entry1_str.get()
    date = entry2_str.get() 
    start_station = entry3_str.get()
    stop_station = entry4_str.get()
    train_s = entry5_str.get()
    #打印个人信息
    info='乘车人:'+name+"\n"+"出发日期:"+date+"\n"+"路线:"+start_station+"---->>"+stop_station+"\n"+"所选车次:"+train_s
    text.insert(END,info)

#运行函数
def main():
    #由12306座位类型的代号设置如下
    #9:商务座 M:一等座 O:二等座 3:硬卧 4:软卧 1:硬座      注意:G6006车次7点27出发,9点16到是【复兴号】
    #初始化chromedriver
    driver = webdriver.Chrome(executable_path='chromedriver.exe')
    name = entry1_str.get()
    date = entry2_str.get() 
    start_station = entry3_str.get()
    stop_station = entry4_str.get()
    train_s = entry5_str.get()
    train_infos = train_s.split(' ')#以空格符为分界形成车次信息列表
    trains = {} #创建空字典存储车次信息
    for train_info in train_infos:
        trains[train_info] = ["O"]  #默认都选为O二等座,然后加入空字典
    spider = TrainSpider(start_station,stop_station,date,trains,[name,],driver)
    spider.run()

#输出所填的信息确认
bt2 = Button(root,text = '输出购票信息',font=('Arial', 14),command=printlog)
bt2.place(x= 20,y= 307)
#按钮事件执行时间过长,引入线程,
bt2 = Button(root,text = '确认无误,开始刷票',font=('Arial', 14),command=run)
bt2.place(x= 200,y= 307)

root.mainloop() #加载GUI界面输入信息后再执行购票程序

#if __name__ == '__main__':
    #main()

其中有一个stations.csv文件需要通过爬虫从12306爬取下来,获得其车站和其对应的编码。由于这里上传不了文件,就只给出GUI脚本制作的代码。

GUI界面

 

后记

近期有很多朋友通过私信咨询有关Python学习问题。为便于交流,点击蓝色自己加入讨论解答资源基地

 

基于java的火车票售票系统,界面Swing 本系统是一个基于java的火车票管理系统,用Swing显示信息。 开发环境Eclipes,mysql数据库 用户分为 用户和管理员。 Main.java 为程序入口 立即下载

相关推荐

JAVA学生火车票订票系统

JAVAEE开发,学生火车订票系统,可以后台管理火车各种列车和出车时间,到达时间,还可以设置出发城市,经过城市,终点城市,前台支持团购,学生寒暑假半价功能,等等常用的火车票售卖系统

12306 swing 实现简单购票功能

需要安装jdk 1.7版本或1.7以上版本

奥巴牛 960

高铁订票系统java源码-StationTicketingSystem:JavaGUI系统设计:使用JavaSwing编写的铁路售票应用系统

高铁订票系统java源码 StationTicketingSystem 这是一个 Java GUI 系统设计:使用 Java Swing 编写的铁路售票应用系统。 技术栈 所使用到的技术:Java Swing + Java AWT + MySQL 5.5.62 运行截图 登录界面 注册用户 默认的注册是乘客身份,必须要填写完整信息并确定阅读相关服务条款后才能进行注册,否则会有错误提示。 普通乘客端——乘客身份登录系统 在车票业务中可以执行购票、订单信息、切换用户及退出功能。 例如,搜索上海至北京的 2020 年 1 月 22 日的车票(这里的日期没有使用日历控件,先手动输入): 车次默认查询结果如下: 可以选择指定车次并选择其座位类型进行购票: 购票成功后,可以返回主页面的 ” 订单 “ 信息栏中看到个人的订单信息: 在订单信息中可以进行改签和退票操作,这里就不在演示。 在查询车票时,还可以支持分类查询,比如:只看勾选高铁/动车选项搜索上海到北京的车次: 这样就可以进行筛选显示了。(学生票功能还没有完善) 除了车票业务,用户还可以修改个人信息以及管理常用联系人的信息: 管理员端——管理

Java使用多线程和GUI实现购买火车票<集合>

文章目录绪:样例DEMO——购票项目项目要求实现步骤一、【车次.txt】【Person类】【Ticket类】1.【车次.txt】2.【Person类】3.【Ticket类】二、主窗口 【Window类】1、界面2、事件监听1.窗口加载就显示出信息2.查找按钮3. 刷新4.购买三、购买窗口【PayWindow类】1、界面2、实现线程接口【Runnable】3、事件监听1.提交信息2.下单3.窗口销毁源代码 绪: 多线程与并发 集合 GUI(ecplise插件WindowBuilder) 样例 DEMO

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 2705

JAVA版12306订票代码

1.实现了从登陆到查询出票的所有过程 2.代码简单,但功能全在,具体的查询信息条件没有做,例子里面是明天的北京到上海的车票有余票的 3.代码仅供学习,对了解httpClient,http+ssl协议有些小小的帮助。 4.运行代码,需要修改四个变量myStore,codeImg,loginUserName,loginPassWord

修改Avaya IP-Office电话交换机出厂自带的提示语音内容

1,本文的应用场景是在使用Avaya IP-office 500 v2电话交换机时,来电振铃超时后,会转入语音信箱,呼叫者会听到一条语音信箱留言的欢迎辞(…请留言…)。但我们单位情况比较特殊,首先是的IPO配置很精简,内嵌的语音信箱只能保留3天,用处不大;其次是用户没有收听语音信箱的习惯;第三是我们单位使用数字中继和DID,每人一个直拨号码,不通过总机转接。很多业务是单线联系,所以一旦来电无法接通,来电者可能完全无法联系到我们单位的其他同事。出于这三点原因,我们希望将语音信箱的欢迎辞,增加告知我们的总机电话

qlin4cn的博客 4917

教你如何秒杀12306,JAVA程序抢票成功!----阿冬专栏

教你如何秒杀12306,JAVA程序抢票成功! 来自:http://jingyan.baidu.com/article/ab69b270c403412ca7189f95.html 12306.cn 火车票 网络购票助手 1.1 要过年,先回家!要回家先买票!虽然大家翘首以盼的火车票终于实现网络购票了,但由于其各方面的不成熟,即使是常用电脑的

阿冬专栏 8845

ROS2前置基础教程 | 使用CMakeLists.txt编译ROS2节点

答案是有的,那就是cmake工具。cmake通过调用CMakeLists.txt直接生成Makefile。 2.新建CMakeLists.txt 在新建,输入下面内容。 3.编译代码 我们一般会创建一个新的目录,运行cmake并进行编译,这样的好处是不会显得那么乱。 创建好文件夹,接着运行cmake指令,代表到上级目录找。 运行完cmake你应该可以在build目录下看到cmake自动生成的Makefile了,接着就可以运行make指令进行编译 运行完上面的指令,就可以在build目录下发现节点了。ROS2

生活不止眼前的苟且 1万+

java多线程简单模拟12306抢票

简单就是很简单模拟一下...(简单也写了好久..synchronized使用的位置真的很重要..) 业务描述 假设有200张票,用4个线程去订票,不能有两个或者以上的线程订到了 同一个票(原因就不说了),当最后一张票卖掉的时候结束,再订就抛 异常提示出票卖完了。 业务分析,要实现以上功能, 1、需要创建一个车票类,初始化票,卖票的接口saleTicket() 2、自定义异常的一个类。 3、创建卖票线程类,在run方法中卖车票。 4、初始化车票的线程,负

weixin_56469079的博客 4709

3D Gaussian Splatting环境配置和运行

使用conda命令根据environment.yml文件创建虚拟环境时,安装的pytorch是使用conda install 命令来安装的,实际上并不能成功安装带有gpu的pytorch,而这两个模块的安装依赖于带gpu的pytorch。如果不注释掉这三行,直接安装会报错

m0_46360757的博客 3326

国科大学习资料--高级软件工程-复习题选择题答案

国科大学习资料–高级软件工程(罗铁坚 魏峻 刘丹)-复习题选择题答案 ’‘

无名何许人的博客 1165

火车票预售系统(JavaGUI)

手机号、班次号、火车号、银行卡号、身份证号、车票号分别为用户、班次、火车、银行卡、身份证、车票的主码。售票管理员信息:管理员编号、管理员名字、管理员电话购票用户信息:身份证号、电话号码、银行卡号。性别只能是男女、车票钱不能为空、车速不能为空、班次目的地与出发地不能为空、用户类型只能是 0。班次号中的火车号为火车表的主码、银行卡号中所有者号码为用户的主码、车票号、班次号、座位号、乘客身份证号、车票价钱、车厢数。班次号、火车号、出发地点、目的地、出发时间、到达时间。能够正确、高效、迅速地完成所有操作。

毕业作品网站 1037

DDR5 JEDEC标准简析:一次读懂DDR5的核心规范!

JEDEC,全称是,中文名称是「电子元件工程联合委员会」,它是全球权威的存储接口标准制定机构。我们常见的 DDR2、DDR3、DDR4、DDR5 都是它搞出来的。📌 JEDEC 就像存储接口界的“裁判+编剧”——规定谁该怎么跑,怎么演,怎么配合。

weixin_43199439的博客 2570

Java实现12306登录和查票

前言:   之前一直打算写一个模拟12306的工具,一直拖到现在,实在忍不了了,最近艰难的一步一步开始。由于想重新学习一下Java相关的知识,所以使用Java来进行开发,目前总算是有了一点进展,已经实现了登录和查票功能,先记录一下。下单以及其他抢票设置还在开发中。。。 界面:   本文主要是关注功能的实现,另外就是javaswing的排版也不是很擅长,所以界面比较丑陋,将就看一下就行,目前主要是主...

李清的博客 6107

UFS软件分区介绍

本文主要介绍了ufs软件分区管理的概况,能够使大家对软件分区有个大体的认识

肥匪斐's blogs 1万+

基于深度学习的野生菌菇检测识别分类系统(YOLOv8 + UI界面 + 数据集)

随着深度学习技术的迅猛发展,计算机视觉领域的应用得到了广泛的关注。野生菌菇的检测与识别是一个复杂而又有趣的问题,涉及到物体检测、图像分类以及自然语言处理等技术。本文将介绍如何基于YOLOv8模型,结合自定义UI界面与数据集,构建一个高效且精确的野生菌菇检测识别分类系统。首先,我们将介绍YOLOv8的原理与特点,然后详细描述如何构建和训练野生菌菇识别模型,并介绍如何为该系统设计UI界面,最终形成一个完整的系统。本文内容包括代码实现、模型训练及数据集准备等,旨在为有类似需求的开发者提供参考和帮助。目录摘要目录。

YOLO 1546

12306抢票 JAVA客户端

基于JAVA写的12306抢票的客户端,上图,有兴趣的可以试试。云盘的下载地址是 http://aj9hmr54ac.l25.yunpan.cn/lk/QGHRr3QE7eUjt     

追梦人 579

麻雀搜索算法(SSA)详解:从鸟群智能到优化实践

麻雀搜索算法(SSA)是一种新型群智能优化算法,模拟麻雀群体的觅食行为和反捕食机制。该算法将优化问题转化为麻雀群体对食物源的搜索过程,通过发现者、加入者和警戒者的角色分工实现高效优化。SSA具有原理新颖、参数合理、收敛快速等特点,在函数优化、工程设计和机器学习等领域展现出良好应用前景。算法通过数学模型模拟麻雀的觅食策略,包括发现者全局探索、加入者局部开发和警戒者危险预警机制,有效平衡了全局搜索与局部开发能力。SSA相比传统优化算法具有更好的收敛性和优化效果。

qq_42212808的博客 1072

抢票软件12306java版

1、抢票软件的原理2、12306抓包分析

调皮的写代码 6986

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

锂电池充电器电路设计 里面有电路

锂电池充电器电路设计 里面有电路 3.7V升压到5V电路设计。

Java——Demo仿12306窗口实现购买火车票<MySQL>

文章目录绪:成品样例修改地方 绪: 在Java——Demo使用GUI并连接数据库实现购买火车票<MySQL>基础上 修改了车次查找 取消了按车次名查找 增添了根据起点站→和终点站进行查询 修改了点击购买按钮弹出下单页面 取消了购买按钮 增添了根据查找的车次,点击其中一行,弹出下单页面,车次名自动填充 成品样例 修改地方 【tickets数据表】添加id列,设置主键和自动增长,后续用来根据行和id查询车次 既然【tickets数据表】改了,那么【tickets.java

赵士杰——成功并非一蹴而就,而是在持之以恒的努力中逐渐实现。 1394

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

JAVA版12306抢票工具

JAVA版12306抢票工具,实现时间是2015-2016当前是2017-06-11不废话,上截图1、登录界面 2、主界面 3、订单界面 有话要说 原本是私人项目,但作者时间有限无法继续更新,因此交给广大coding伙计们。16年该项目可以实现登录、查票、刷票、查询订单、退订等功能。其中部分控件被我重写或修改。有些地方试试双击,比如席别那里,选择后想删除只要双击该席别就行。17年发现查票和提

qq_21181253的博客 2万+

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

java 12306 模拟登陆_GitHub - zuihou/12306-test: 基于java httpclient的12306 买票软件, 仅供学习使用...

12306-hunterJava Swing C/S版本12306订票助手本程序完全开放源代码,仅作为技术学习研究交流之用,不得用于任何商业用途;作者不承担任何由此带来的直接或间接责任特别说明: 整个程序除了速度和效率高一些外,和浏览器订票请求没有本质区别,因此如果12306服务器做了任何调整,程序随时可能失效,请自行酌情使用。强烈建议: “不要把所有鸡蛋放到一个篮子”,可注册多个账号,一些用于浏...

weixin_29793587的博客 365

Java Swing C/S版本12306订票助手

Java Swing C/S版本12306订票助手 https://github.com/xautlx/12306-hunter http://git.oschina.net/xautlx/hunter-12306 本程序完全开放源代码,仅作为技术学习研究交流之用,不得用于任何商业用途;作者不承担任何由此带来的直接或间接责任 特别说明: 整个程序除了速度和效率高一些...

xautlx 382

springboot毕设项目高校辅导员工作管理系统gtud9(java+VUE+Mybatis+Maven+Mysql)

Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX(Webstorm也行)+ Eclispe(IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持)。springboot毕设项目高校辅导员工作管理系统gtud9(java+VUE+Mybatis+Maven+Mysql)若包含,则为maven项目,否则为非maven项目。Springboot + mybatis + Maven + Vue 等等组成,B/S模式 + Maven管理等等。其他版本理论上也可以。.

蒋道理吧 736

【Java+JSP+MySql】12306购票系统(一)项目介绍

文章目录系统功能概述系统界面设计登录注册选择出行需求选择车票确认购买个人信息修改个人信息取消订票系统物理模型表视图 系统功能概述 用户登录 用户注册 用户按出发地、到达地和出发日期查询车票 用户按不同座位等级购买车票 用户查看购买车票信息 退票 修改个人信息 系统界面设计 登录 输入数据库中包含的争取的telephone和upassword,点击确认登陆,就可以登陆成功 注册 按提示输入信息,其中身份证号必须为18位,手机号必须为11位,两次输入密码必须相同。 选择出行需求 登陆成功后,会进入选择出

somia的博客 4268
上一篇: 侄子今天问我这个一元二次方程怎么解!还好Python会解!
下一篇: 阿里云短信服务的使用-----获取短信验证码
pythonlaodi
博客等级 码龄6年 286粉丝 244原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值