• 【项目】购物车系统(学习1个月的项目)


            自学已近一个月,做的第一个项目,虽然写的时候磕磕碰碰,但还是写出来了。代码有好多不够完善的,在各位大佬面前就像是小孩子的玩具,但是我能力有限,相信我会慢慢强大起来的,这算是第一版,我的目标是:等后面知识学到位,做个真淘宝出来。

            下面先附图片功能,再附源代码

                                          bandicam 2019-04-11 00-05-24-578

                  bandicam 2019-04-11 00-05-53-659                           

                 bandicam 2019-04-11 00-06-18-735

                bandicam 2019-04-11 00-06-23-327

                bandicam 2019-04-11 00-06-30-232

                bandicam 2019-04-11 00-06-42-687

                bandicam 2019-04-11 00-07-33-322

    代码:

    # 导入模块
    import os  # 系统模块
    from datetime import *  # 时间模块
    
    import pymysql  # 数据库模块
    import qrcode  # 支付二维码模块
    
    # 定义变量
    is_login = False  # 定义登录状态
    info = []  # 记录登录后信息
    sql = ''  # sql语句
    cursor = ''  # 游标
    connect = ''  # 数据库连接参数
    
    
    # ============================================= 主模块 =============================================#
    # 启动
    def start():  # :start启动
        tag_map = {  # 定义启动选项的字典
            '0': exit,  # 退出
            '1': login,  # 登录
            '2': register,  # 注册
            '3': forget_pwd  # 忘记密码
        }
        while True:
            os.system('cls')
            os.system('color 3E&title 欢迎使用购物车系统 V2.0')
            os.system('mode con cols=75 lines=25')
            print('''
    
    
        【================== 欢迎使用淘宝系统 ==================】
    
    
    
                请选择功能:
                    0.退出
                    1.登录
                    2.注册
                    3.忘记密码
    
                ''')
            tag = input('请选择====>>').strip()
            tag_map[tag]() if (tag in tag_map) else print('您输入有误,请重新输入!')
    
    
    # ==================================== 1.登录 ====================================#
    # ====================定制数据库连接 connect ====================##
    def connect_sql():  # 连接数据库
        global cursor, connect
        try:
            host = '106.75.31.89'
            user = 'root'
            password = '123456'
            data = 'data'
            port = 3306
            connect = pymysql.connect(host, user, password, data, port, charset='utf8')  # 数据库连接参数
            cursor = connect.cursor()  # 获取一个游标
            print('连接成功!')
        except Exception:
            print('发生异常!')
            exit()
    
    
    # =============================获取文件=========================##
    def get_file(usr):  # 获取登录用户的相关文件,返回取到的data数据
        global sql, cursor
        sql = 'select *from info where usr ="%s"' % usr
        cursor.execute(sql)
        data = cursor.fetchone()
        return data
    
    
    # 执行sql语句
    def execute_sql(sql):
        global cursor, connect
        cursor.execute(sql)
        connect.commit()
    
    
    # ========================获取用户名===========================##
    def get_usr():  # get获取  usr用户名  输入用户名,判断,返回
        while True:
            usr = input('请输入用户名====>>').strip()
            if usr == '0': start()
            if not ((usr.isalpha() or usr.isnumeric()) and len(usr) >= 3):
                print('用户名输入错误')
            else:
                break
        get_info(usr)
        return usr
    
    
    # 获取新的info登录信息
    def get_info(usr):
        global info
        info = get_file(usr)
        return get_file(usr)
    
    
    # ========================验证用户名===========================#
    def check_usr():  # check 核对  usr 用户名
        global info
        usr = get_usr()
        if not info:
            input('没有此用户,请注册,按任意键返回。。。')
            start()   #有问题
        return usr
    
    
    # ==========================获取密码==========================##
    def get_pwd(usr):  # get 取得  pwd 密码
        while True:
            pwd = input('请输入密  码====>>').strip()
            if not len(pwd) >= 3:
                print('密码格式输入错误!')
            else:
                return pwd
    
    
    # =====================获取锁定相差时间=======================#
    # 获取当前时间
    def at_time():
        tim = datetime.now().strftime('%Y-%m-%d %H:%M:%S')  # 当前时间
        tim1 = datetime.strptime(tim, '%Y-%m-%d %H:%M:%S')  # 转换统一格式
        return tim1
    
    
    # 获取锁定相差时间
    def time_n(usr):
        tim1 = at_time()
        tim2 = datetime.strptime(get_file(usr)[6], '%Y-%m-%d %H:%M:%S')  # 存在数据库时间格式
        n = tim1 - tim2
        n = 600 - n.seconds  # 差额为秒
        return n
    
    
    # ==================判断用户是否锁定状态=====================#
    # 判断用户是否锁定状态,时间到达10分钟后自定解锁
    def lock_NY(usr):
        n = time_n(usr)
        if int(get_file(usr)[3]) < 0:
            if n > 0:
                input('您的账号已被锁定,还有%s秒解除,按任意键返回。。。' % n)
                return False
            elif n < 0:
                sql = 'update info set num=2 where usr="%s"' % (usr)
                execute_sql(sql)
    
    
    # ===============密码错误,写入数据库次数===================#
    # 密码错误,写入数据库次数
    def check_pwd(usr):
        global info, cursor, sql, connect
        sql = 'update info set num=(num-1) where usr="%s"' % (usr)  # 错误写入数据库
        execute_sql(sql)  # 执行sql语句
        num = int(get_file(usr)[3])  # 获取还可以输入的次数
        if num < 0:
            tim1 = at_time()
            sql = 'update info set time="%s" where usr="%s"' % (tim1, usr)  # 锁定 用户,把时间插入数据库
            execute_sql(sql)
            input('输入密码次数已达三次,用户将锁定10分钟!')
        else:
            input('密码错误,用户%s还有%s次机会!' % (usr, num + 1))
    
    
    # ======================== 登录判断 ========================#
    # 登录判断
    def login():
        # 验证密码
        while True:
            os.system('cls')
            global is_login, info
            print('''
    
    
        【====================== 用户登录 ======================】
    
    
    
    按 0 退出登录界面。。。
                ''')
            usr = check_usr()  # 获取用户名
            if lock_NY(usr) == False:  # 判断是否是锁定状态
                start()
            pwd = get_pwd(usr)  # 获取密码
            if pwd == info[2]:
                if usr == 'admin':
                    admin()
                else:
                    is_login = True
                    shop_start()
            else:
                check_pwd(usr)
    
    
    # ==================================== 2.注册 ====================================#
    # ======================= 获取手机号 =======================#
    def get_phone(phone):
        global sql, cursor
        sql = 'select *from info where phone ="%s"' % phone
        cursor.execute(sql)
        data = cursor.fetchone()
        return data
    
    
    # ==========================手机号=========================#
    # 注册手机号,并核对手机号是否重复
    def check_phone():
        while True:
            phone = input('请输入手机号:')
            if len(phone) == 11 and phone.isnumeric():
                data = get_phone(phone)
                if data:
                    print('您输入的手机号已被" %s "注册,请重新输入!' % data[1])
                else:
                    return phone
            else:
                print('您输入的格式错误!')
    
    
    # =====================验证注册用户=======================#
    # 验证注册用户
    def check_reg_usr():
        while True:
            usr = get_usr()
            if not info:
                print('用户未被注册,合法!')
                return usr
            else:
                print('用户已被注册,请重新输入!')
    
    
    # =======================注册用户=========================#
    # 注册用户
    def register():
        os.system('cls')
        print('''
    
    
        【====================== 注册用户 ======================】
    
    
    
    按 0 退出注册界面。。。
        ''')
        global info
        usr = check_reg_usr()
        pwd = get_pwd(usr)
        phone = check_phone()
        tim1 = at_time()
        sql = 'insert into info (usr,pwd,num,money,phone,time) values ("%s","%s","2","10000","%s","%s")' % (
            usr, pwd, phone, tim1)
        execute_sql(sql)
        input('注册成功,按任意键返回。。。')
    
    
    # ================================== 3.找回密码 ==================================#
    # ===================核对找回密码手机号====================#
    def check_for_phone():
        global info
        while True:
            phone = input('请输入手机号:')
            if len(phone) == 11 and phone.isnumeric():
                if phone == info[5]:
                    break
                else:
                    print('手机号核对错误,请重新输入!')
            else:
                print('您输入的格式错误!')
        print('手机号核对成功!')
        return phone
    
    
    # =======================输入新密码========================#
    # 输入新密码
    def now_pwd(usr):
        while True:
            now_pwd1 = get_pwd(usr)
            now_pwd2 = get_pwd(usr)
            if now_pwd1 != now_pwd2:
                print('您输入两次的密码不一致,请重新输入!')
            else:
                return True
    
    
    # ========================找回密码=========================#
    # 找回密码
    def forget_pwd():
        os.system('cls')
        print('''
    
    
        【====================== 找回密码 ======================】
    
    
    
            按 0 退出找回界面。。。
            ''')
    
        usr = check_usr()
        check_for_phone()
        input('找回成功!') if now_pwd(usr) == True else input('找回失败!')
    
    
    # ========================================华丽丽的分割线========================================#
    # =========================================启动购物系统========================================#
    # 启动购物车系统
    def shop_start():
        os.system('cls')
        print('''
    
    
        【================ 欢迎使用淘宝购物系统 ================】
                               【 客户版 】
    
                0.退出                    4.购物车
                1.查询余额                5.查看已购买过的商品
                2.充值                    8.注销
                3.查看商品                9.修改客户密码
    
    
            ''')
        tag_map = {
            '0': exit,
            '1': money,
            '2': top_up,
            '3': look_shop,
            '4': shop_cart,
            '5': bill,
            '8': logout,
            '9': change_pwd
        }
        while True:
            tag = input('请选择====>>')
            tag_map[tag]() if tag in tag_map else print('输入错误,请重新输入!')
    
    
    # 1、查询余额
    def money():
        global info
        get_info(info[1])
        moneys = int(info[4])
        if moneys < 2000:
            print('您的余额还有 %s 元,请及时充值,以免影响您的购物!' % moneys)
            input('按任意键继续。。。')
            shop_start()
        else:
            print('您的余额还有 %s 元 !' % moneys)
            input('按任意键继续。。。')
            shop_start()
    
    
    # 2、充值
    def top_up():
        os.system('cls')
        print('''
    
    
        【======================= 充 值 ========================】
    
            请选择支付方式:
                0.取消支付
                1.微信支付
                2.支付宝支付
    
        ''')
        tag_map = {
            '0': shop_start,
            '1': wechat_top_up,
            '2': Alipay_top_up
        }
        while True:
            tag = input('请选择====>>').strip()
            if tag in tag_map:
                tag_map[tag]()
            else:
                print('非法输入,请重新输入!')
    
    
    # 2.1、微信支付
    def wechat_top_up():
        while True:
            moneys = input('请输入您要充值的金额====>>').strip()
            if moneys.isnumeric():
                break
            else:
                print('非法输入,请重新输入!')
        text = 'wxp://f2f0k4kxD8gJHD1YQNWKoRynRuntpiQ_g7ks'
        img = qrcode.make(text)
        img.show()
        print('正在支付中。。。')
        read_money(moneys)
        # print('充值成功%s元。。。')%str(moneys)
        money()
        top_up()
    
    
    # 2.2、支付宝支付
    def Alipay_top_up():
        while True:
            moneys = input('请输入您要充值的金额====>>').strip()
            if moneys.isnumeric():
                break
            else:
                print('非法输入,请重新输入!')
        text = 'https://qr.alipay.com/fkx045285gzeelj8gjxze0a'
        img = qrcode.make(text)
        img.show()
        print('正在支付中。。。')
        read_money(moneys)
        # print('充值成功%s元。。。')%moneys
        money()
        top_up()
    
    
    # 2.9、修改支付金额
    def read_money(moneys):
        global info
        usr = info[1]
        money_new = int(info[4]) + int(moneys)
    
        sql = 'update info set money="%s" where usr="%s"' % (money_new, usr)
        execute_sql(sql)
    
    # 3、查看商品
    def look_shop():
        os.system('cls')
        print("查看商品信息!")
        print('''
    
    
        【==================== 选择商品类别 ====================】
    
                0.返回上一级          5.电脑
                1.零食                6.手机
                2.汽车                7.珠宝
                3.水果                8.餐厨
                4.百货                9.奶粉辅食
    
    
        ''')
        # 3.1、零食 snack
        # 3.2、汽车 car
        # 3.3、水果 fruit
        # 3.4、百货 general_goods
        # 3.5、电脑 computer
        # 3.6、手机 phone
        # 3.7、珠宝 jewelry
        # 3.8、餐厨 ware
        # 3.9、奶粉辅食 milk
        tag_mpa = {
            '0': shop_start,
            '1': '零食',
            '2': '汽车',
            '3': '水果',
            '4': '百货',
            '5': '电脑',
            '6': '手机',
            '7': '珠宝',
            '8': '餐厨',
            '9': '奶粉辅食'
        }
        while True:
            tag = input('请选择要购买的商品类型====>>').strip()
            if tag == '0':
                shop_start()  # 返回上级菜单函数
            elif tag in tag_mpa:
                sort = tag_mpa[tag]
                show_shop(sort)  # 调用查看商品信息函数
                while True:
                    tag_num = input('
    
    
    详情请按序号,返回上一级按【0】=====>>').strip().lower()
                    if tag_num == '0':
                        look_shop()
                    elif tag_num.isnumeric():
                        num_shop(tag_num, sort)  # 调用选择商品函数
                        break
                    else:
                        print('您输入的有误,请重新输入!')
            else:
                print('您输入的有误,请重新输入!')
    
    
    # 3.1、查询商品详细信息
    def demand_shop(b, l, sort):
        global cursor
        sql = 'select *from %s where %s="%s"' % (b, l, sort)
        execute_sql(sql)
        data = cursor.fetchall()
        return data
    
    
    # 3.2、显示商品信息
    def show_shop(sort):
        os.system('cls')
        data = demand_shop('shop', 'sort', sort)
        print(''
              '
    
         【================== 您正在查看 %s 类商品 ==================】
    
    ' % sort)
        print('序号|      名称      |   金额   |   库存   |           描  述       |')
        for i in data:
            id, sort, name, cost, QTY, units, detail, *_ = i
            print('%s|【%s】|%s 元|  %s%s|%s|' % (str(id).center(4), name.center(6, ' '),
                                               cost.rjust(7), QTY.rjust(6), units, detail.ljust(9, ' ')))
    
    
    # 3.3、选择商品
    def num_shop(tag_num, sort):
        global cursor
        try:
            sql = 'select pic from shop where sort="%s" and id="%s"' % (sort, tag_num)
            cursor.execute(sql)
            # 打开商品图片
            output = open('image.png', 'wb')
            output.write(cursor.fetchone()[0])
            output.close()
            print('正在打开详情。。。')
            os.startfile('image.png')
            # 选择商品
            join_shop(tag_num, sort)
            return True
        except Exception:
            print('您选择的商品序号错误,请重新选择!')
            show_shop(sort)
    
    
    # 3.4、加入购物车
    def join_shop(tag_num, sort):
        while True:
            l = input('是否满意 [y / n] ====>>').lower().strip()
            if l == 'y':
                while True:
                    l = input('是否加入购物车 [y / n] ====>>').lower().strip()
                    if l == 'y':
                        while True:
                            sort, name, cost, QTY, units = look_QTY(tag_num, sort)
                            inp_num = input('输入需要加入的数量,库存还有%s%s====>>' % (QTY, units)).lower().strip()
                            if inp_num.isnumeric():
                                if int(inp_num) > int(QTY) or int(inp_num) <= 0:
                                    print('您输入的数量大于库存,请输入%s%s以内的数量!' % (QTY, units))
                                else:
                                    break
                            else:
                                print('输入不合法,请重新输入!')
                        print('加入成功,可以在购物车中查看。')
                        inp_num_1 = int(QTY) - int(inp_num)
                        amend_QTY(inp_num_1, sort, tag_num)
                        join_shop_cart(sort, name, cost, units, inp_num)
                        input('按任意键返回继续购物。。。').lower().strip()
                        look_shop()
    
    
                    else:
                        look_shop()
            else:
                print('滚犊子')
    
    
    # 3.5、查询库存
    def look_QTY(tag_num, sort):
        global cursor
        sql = 'select sort,name,cost,QTY,units from shop where sort = "%s" and id = "%s"' % (sort, tag_num)
        execute_sql(sql)
        sort, name, cost, QTY, units = cursor.fetchone()
        print(QTY, units)
        return sort, name, cost, QTY, units
    
    
    # 3.6、修改库存
    def amend_QTY(QTY, sort, tag_num):
        sql = 'update shop set QTY="%s" where sort ="%s" and id = "%s" ' % (QTY, sort, tag_num)
        execute_sql(sql)
    
    
    # 3.7、加入购物车
    def join_shop_cart(sort, name, cost, units, inp_num):
        global info
        info_name = info[1]
        moneys = int(cost) * int(inp_num)
        print(moneys)
        sql = 'insert into shop_cart (sort,name,cost,QTY,units,moneys,info_name)' 
              ' VALUES ("%s","%s","%s","%s","%s","%s","%s")' % (sort, name, cost, inp_num, units, moneys, info_name)
        execute_sql(sql)
    
    
    # 4、购物车
    def shop_cart():
        global info
        get_info(info[1])
        moneys = int(info[4])
        add = shop_detail()
    
        tag = input('''
    
        0.返回
        1.清空购物车
        2.结账
    请选择====>>''').lower().strip()
        if tag == '2':
            if add <= moneys:
                account(info[1])
                money_old = get_info(info[1])[4]
                money_new = int(money_old) - add
                sql = 'update info set money = "%s"' % money_new
                execute_sql(sql)
                print('结账成功,请亲耐心等待发货哦!')
                money()
            else:
                input('您的余额不足,请充值!')
                shop_start()
        elif tag == '1':
            empty()
            input('已清空购物车,按任意键返回。。。')
        else:
            shop_start()
    
    
    # 4.1、查看购物车明细
    def shop_detail():
        os.system('cls')
        print('
    
    '
              '   【===================== 查看购物车 =====================】
    
    ')
        global info
        usr = info[1]
        data = demand_shop('shop_cart', 'info_name', usr)
        if data:
            n = add = 0
    
            print(''
                  '序号|      名称      |   金额   |   数量   |  小计金额 |')
            for i in data:
                n += 1
                id, sort, name, cost, QTY, units, moneys, info_name = i
                add = add + int(moneys)
                print('%s|【%s】|%s 元|  %s%s|%s 元|' % (str(n).center(4), name.center(6, ' '),
                                                     cost.rjust(7), QTY.rjust(6), units, moneys.rjust(8)))
            print('
    
    您购物车中的商品总计:%s件,%s元:' % (n, add))
            return add
        else:
            input('您在购物车无商品,按任意键去购买。。。')
            look_shop()
    
    
    # 4.2、结账
    def account(usr):
        global cursor, connect
        # 写入数据库buy_record表
        data = demand_shop('shop_cart', 'info_name', usr)
        buy_time = at_time()
        for i in data:
            print(i)
            id, sort, name, cost, QTY, units, moneys, info_name = i
            sql = 'insert into buy_record (sort, name, cost, QTY, units, moneys, info_name, buy_time) ' 
                  'VALUES ("%s","%s","%s","%s","%s","%s","%s","%s")' % (
                      sort, name, cost, QTY, units, moneys, info_name, buy_time)
            cursor.execute(sql)
            connect.commit()
            sql = ''
        empty(usr)
    
    
    def empty(usr):
        # 清除数据库shop_cart表中符信息
        sql = 'delete from shop_cart where info_name = "%s"' % usr
        execute_sql(sql)
    
    
    # ============================== 5、查看已购买过的商品 ====================
    # 5、查看已购买过的商品
    def bill():
        os.system('cls')
        print('
    
    '
              '   【===================== 查看已够买 =====================】
    
    ')
        global info
        usr = info[1]
        data = demand_shop('buy_record', 'info_name', usr)
        if data:
            n = add = 0
            print('序 号|      名称      |   金额   |   数量   |  小计金额 |      购买日期      |')
            for i in data:
                n += 1
                id, sort, name, cost, QTY, units, moneys, info_name, buy_time = i
                add = add + int(moneys)
                print('%s|【%s】|%s 元|  %s%s|%s 元|%s|' % (str(n).center(5), name.center(6, ' '),
                                                        cost.rjust(7), QTY.rjust(6), units, moneys.rjust(8),
                                                        buy_time.rjust(20)))
            input('
    
    您消费总计:%s件,%s元。按任意键返回。。。' % (n, add))
            shop_start()
            return add
        else:
            input('您无购买记录,按任意键去购买。。。')
            look_shop()
    
    
    # ============================== 8、注销 ==================================
    # 8、注销
    def logout():
        global info, is_login
        is_login = False
        info = ''
        input('注销成功,按任意键重新登录!')
        start()
    
    
    # ============================== 9、修改密码 ==============================
    # 9、修改密码
    def change_pwd():
        os.system('cls')
        print('''
    
    
        【======================= 修改密码 =====================】
    
    
    
            按 0 退出修改界面。。。
                ''')
        global info
        usr = info[1]
        check_for_phone()
        input('修改成功!') if now_pwd(usr) == True else input('修改失败!')
    
    
    # ========================================== 管理员 ================================================$
    def admin():
        os.system('cls')
        print('''
    
    
        【================ 欢迎使用淘宝购物系统 ================】
                              【 管理员版 】
    
    
            0.退出
            1.管理客户
            2.管理商品
            8.注销
            9.修改管理员密码
            ''')
        while True:
            tag = input('请选择功能=====>>').strip()
            tap_map = {
                '0': exit,
                '1': client_usr,  # 管理客户
                '2': shop_admin,
                '7': logout,
                '8': change_pwd,
                '9': contact_way,
            }
            tap_map[tag]() if tag in tap_map else print('您输入有误,请重新输入!')
    
    
    # 1、管理客户
    def client_usr():
        os.system('cls')
        global cursor
        print('''
    
    
    【====================== 管理客户 ======================】
    
        客户列表:
        |序 号|   客户名   |  客户余额  |   手机号   |''')
        # 查询客户信息
        sql = 'select id,usr,money,phone from info'
        cursor.execute(sql)
        data = cursor.fetchall()
        for i in data:
            id, usr, money, phone = i
            print('    | %s |%s|%s元|%s|' % (str(id).center(3), usr.center(12), money.rjust(10), phone.rjust(12)))
        # 删除客户信息
        usr_id = input('
    
    请输入需要操作客户的序号 [按 0 返回]====>>').strip()
        if usr_id == '0':
            admin()
        else:
            print('''请选择:
                1.修改客户名称
                2.修改客户手机号
                3.注销客户账户
            ''')
        while True:
            tag = input('请选择功能=====>>').strip()
            tap_map = {
                '1': amend_usr,  # 管理客户
                '2': amend_phone,
                '3': del_usr
            }
            tap_map[tag](usr_id) if tag in tap_map else print('您输入有误,请重新输入!')
    
    
    # 1.1、修改客户名称
    def amend_usr(usr_id):
        res = input('请输入新客户名称====>>').strip()
        rest('usr', res, usr_id)
    
    
    # 1.2、修改客户手机号
    def amend_phone(usr_id):
        res = check_phone()
        rest('phone', res, usr_id)
    
    
    # 1.3、注销客户账户
    def del_usr(usr_id):
        res = input('请确认是否[ y / n ]删除,删除无法找回!').strip().lower()
        if res == 'y':
            sql = 'delete from info where id = "%s"' % usr_id
            execute_sql(sql)
            input('修改成功按任意键返回。。。')
            admin()
        else:
            admin()
    
    
    # 1.9
    def rest(field, res, usr_id):
        sql = 'update info set %s = "%s" where id = "%s"' % (field, res, usr_id)
        execute_sql(sql)
        input('修改成功按任意键返回。。。')
        admin()
    
    
    # 2、管理商品
    def shop_admin():
        os.system('cls')
        global cursor
        print('''
    【===================== 全部商品 =====================】
    
    
        ''')
        print('序号|      名称      |   金额   |   库存   |           描  述       |')
        sql = 'select *from shop'
        execute_sql(sql)
        data = cursor.fetchall()
        for i in data:
            id, sort, name, cost, QTY, units, detail, *_ = i
            print('%s|【%s】|%s 元|  %s%s|%s|' % (str(id).center(4), name.center(6, ' '),
                                               cost.rjust(7), QTY.rjust(6), units, detail.ljust(9, ' ')))
        input('如需修改库存,请到数据库修改,按任意键返回。。。')
        admin()
    
    
    # 9、联系我
    def contact_way():
        print('''
        如有任何问题,请联系我!
        QQ:1206709430
        微信:15536582917
        ''')
    
    
    connect_sql()
    start()
    
    购物车代码
  • 相关阅读:
    jboss项目迁移至WebLogic12
    数据库字段关联更新
    清理ms sql server 大日志文件数据
    tool class
    pwn学习日记Day17 《程序员的自我修养》读书笔记
    pwn学习日记Day16 pwn原理理解
    pwn学习日记Day15 《程序员的自我修养》读书笔记
    pwn学习日记Day14 《程序员的自我修养》读书笔记
    pwn学习日记Day13 《程序员的自我修养》读书笔记
    pwn学习日记Day12 《程序员的自我修养》读书笔记
  • 原文地址:https://www.cnblogs.com/tyler-bog/p/10687153.html
Copyright © 2020-2023  润新知