通过完成信用卡系统+购物商城 使自己在利用 字典和列表方面有了较大的提升,感悟很深,

下面将我对此次作业所展示的重点列表如下:

#!/usr/bin/env python3.5
# -*-coding:utf8-*-
import pickle,os,datetime,sysBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
# 加载用户信息
if os.path.exists(r'%s/config/user_acc.txt'% BASE_DIR):f = open("%s/config/user_acc.txt" % BASE_DIR, "rb")data = pickle.loads(f.read())f.close()
else:data = []
# 加载ATM操作日志信息
if os.path.exists(r'%s/config/user_log.txt'% BASE_DIR):fl = open("%s/config/user_log.txt" % BASE_DIR, "rb")data_log = pickle.loads(fl.read())fl.close()
else:data_log = []
# ATM 操作日志增加函数
def User_Action(cz_usercard,cz_flage,usercard,user_action,money=0):global data_logdata_log_add = {}data_log_add["cz_usercard"] = cz_usercarddata_log_add["cz_flage"] = cz_flagedata_log_add["cz_action"] = user_actiondata_log_add["cz_adduser"] = usercarddata_log_add["cz_time"] = datetime.datetime.now()data_log_add["cz_money"] = moneydata_log.append(data_log_add)fl = open("%s/config/user_log.txt" % BASE_DIR, "wb")pickle.dump(data_log, fl)fl.close()
# 增加用户
def User_Add(cz_usercard,cz_flage,usercard,password,total_money,Repayment_Date,flage):global datadata_list = []for user_data in data:data_list.append(user_data["usercard"])if usercard not in data_list:# 增加用户user_dic ={}user_dic["usercard"] = usercarduser_dic["password"] = passworduser_dic["new_money"] = total_moneyuser_dic["total_money"] = total_moneyuser_dic["Repayment_Date"] = Repayment_Dateuser_dic["flage"] = flageuser_dic["state"] = "on"data.append(user_dic)f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data, f)f.close()User_Action(cz_usercard,cz_flage,usercard,"增加用户")print("增加卡号[%s],成功!"%(usercard))else:print("增加信用卡卡号失败,原因:[“已存在”]")
# 解冻信用卡
def User_thaw(usercard,cz_usercard,cz_flage):global data# 判断是否为管理员账号if cz_flage =="1":for x_name in data:if x_name["usercard"] == usercard:x_name["state"] = "on"f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data, f)f.close()# 写日志User_Action(cz_usercard,cz_flage,usercard,"解冻用户")print("解冻用户[%s],成功!"%(usercard))# 用户冻结
def User_Frozen(usercard,cz_usercard,cz_flage):global data# 判断是否为管理员账号if cz_flage =="1":for x_name in data:if x_name["usercard"] == usercard:x_name["state"] = "off"f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data, f)f.close()# 写日志User_Action(cz_usercard,cz_flage,usercard,"冻结用户")print("冻结用户[%s],成功!"%(usercard))
# 用户删除
def User_del(usercard,cz_usercard,cz_flage):global data# 判断是否为管理员账号if cz_flage =="1":for index,x_name in enumerate(data):if x_name["usercard"] == usercard:del data[index]f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data, f)f.close()# 写日志User_Action(cz_usercard,cz_flage,usercard,"删除用户")print("删除用户[%s],成功!"%(usercard))#用户查询
def Select_User():for x_name in data:if x_name["flage"] =="1":user_type ="管理员"else:user_type= "信用卡用户"print("-"*100)print("用户类型:[%s],卡号:[%s],信用授予额度:[%s]元,信用卡当前余额:[%s]元,账单日:[%s]号"%(user_type,x_name["usercard"],x_name["total_money"],x_name["new_money"],x_name["Repayment_Date"]))
# 信用卡额度调整
def card_limit(usercard,money,cz_usercard,cz_flage):global datafor x_name in data:if x_name["usercard"] == usercard:if x_name["total_money"] + money >= 0:x_name["total_money"] += moneyx_name["new_money"] += moneyUser_Action(cz_usercard,cz_flage,usercard,"调整信用卡额度",money)print("调整信用卡[%s],额度成功!"%(usercard))else:print("信用卡可用额度不能为负数!")f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data, f)f.close()

#!/usr/bin/env python3.5
# -*-coding:utf8-*-
import os,pickle,sys,datetimeBASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
from contrl.management import User_Action
#加载ATM用户数据库
if os.path.exists(r'%s/config/user_acc.txt'% BASE_DIR):f = open("%s/config/user_acc.txt" % BASE_DIR, "rb")data_user = pickle.loads(f.read())f.close()
# 加载ATM操作日志信息
if os.path.exists(r'%s/config/user_log.txt'% BASE_DIR):fl = open("%s/config/user_log.txt" % BASE_DIR, "rb")data_log = pickle.loads(fl.read())fl.close()# 消费明细
if os.path.exists(r'%s/config/user_list.txt'% BASE_DIR):f_list = open("%s/config/user_list.txt" % BASE_DIR, "rb")data_list = pickle.loads(f_list.read())f_list.close()
else:data_list = []# 消费明细增加
def sale_add(usercard,usermoney_input,action,state,bills,remarks,Counter=0,interest=0):global data_usertoday =datetime.date.today()for x_data in data_user:if x_data["usercard"] == usercard:date = x_data["Repayment_Date"]# 计算账单日Statement_Date = today.replace(day=date)if today > Statement_Date:Statement_Date = Statement_Date + datetime.timedelta(days=+30)  # 如果今天消费的日期 大于系统计算出来的账单日,则此笔消费的出账单为下个月data_list_dic = {}data_list_dic["usercard"] = usercarddata_list_dic["date"] = datetime.datetime.now()data_list_dic["money"] = usermoney_inputdata_list_dic["action"] = action  # 1、信用卡取现 2、转账 3、消费 4、还款data_list_dic["state"] = state   # 1、已欠款 2、已还清data_list_dic["bills"] = bills   # 1、已出账单 2、未出账单data_list_dic["Counter"] = Counter  # 手续费data_list_dic["interest"] = interest  # 利息data_list_dic["Statement_Date"] = Statement_Date  # 出账单日data_list_dic["remarks"] = remarksdata_list.append(data_list_dic)f_list = open("%s/config/user_list.txt" % BASE_DIR, "wb")pickle.dump(data_list,f_list)f_list.close()# 查询余额函数
def select_balance(usercard,flage):# 定义全局变量global data_userif flage =="2":for x_name in data_user:# 匹配用户信息if x_name["usercard"] == usercard:if x_name["new_money"] - x_name["total_money"] >=0:print("""您当前可用余额为:%s元,当前信用卡授权额度为%s元,出账单日为每月%s号,当前没有欠款,谢谢!"""%(x_name["new_money"],x_name["total_money"],x_name["Repayment_Date"]))else:print("""您当前可用余额为:%s元,当前信用卡授权额度为%s元,出账单日为每月%s号,当前总欠款%s元,请按时还款!"""%(x_name["new_money"],x_name["total_money"],x_name["Repayment_Date"],(x_name["total_money"]-x_name["new_money"]) ))else:print("请求参数出错,请检查后在试!")
# 查询ATM操作日志
def select_log():print("ATM操作日志:")for index,x_log in enumerate(data_log):x_date = x_log["cz_time"]cz_user = x_log["cz_usercard"]x_action = x_log["cz_action"]x_money = x_log["cz_money"]x_user = x_log["cz_adduser"]print("-" *200)print("序号:[%s]|操作日期:[%s]|操作用户:[%s]|动作:[%s]|涉及金额:%s元|对象用户:[%s]" %(index+1,x_date,cz_user,x_action,x_money,x_user))# ATM 取现:
def Take_Money(usercard,usermoney_input,flage):global data_user,data_listfor x_name in data_user:if x_name["usercard"] == usercard:# 判断可用额度是否满足取现的金额if x_name["new_money"] - usermoney_input >= 0:Counter = usermoney_input*0.05   # 取现手续费x_name["new_money"] -= (usermoney_input + Counter)# 写日志User_Action(usercard,flage,usercard,"信用卡取款",usermoney_input)# 写消费明细if x_name["new_money"] >= x_name["total_money"]:sale_add(usercard,usermoney_input,"1","2","2","取现",Counter)else:sale_add(usercard,usermoney_input,"1","1","2","取现",Counter)print("取现[%s],成功!"%(usermoney_input))else:print("您当前取现额度超过你信用卡的可用额度,不能取现!")f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data_user, f)f.close()# 信用卡还款
def Card_Payment(usercard,money,flage="3"):global data_user,data_listfor x_name in data_user:if x_name["usercard"] == usercard:x_name["new_money"] += moneyif flage != "3":print("还款入账成功")sale_add(usercard,money,"4","2","2","还款入账")# 提前全额还款处理if x_name["new_money"] >= x_name["total_money"]:for list_name in data_list:if list_name ["usercard"] == usercard:if list_name ["state"] != "2":list_name ["state"] = "2"f_list = open("%s/config/user_list.txt" % BASE_DIR, "wb")pickle.dump(data_list,f_list)f_list.close()# 提前部分还款处理else:for list_name in data_list:if list_name ["usercard"] == usercard:if list_name ["state"] != "2":if list_name["money"] < money:money -= list_name["money"]list_name["state"] = "2"f_list = open("%s/config/user_list.txt" % BASE_DIR, "wb")pickle.dump(data_list,f_list)f_list.close()# 写还款日志User_Action(usercard,flage,usercard,"信用卡还款",money)f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data_user, f)f.close()
# 账户转账
def Transfer(usercard,flage,usercard_input,usermoney_input):global data_userfor input_name in data_user:if input_name["usercard"] == usercard:input_name["new_money"] -= usermoney_input# 写消费明细if input_name["new_money"] >= input_name["total_money"]:sale_add(usercard,usermoney_input,"2","2","2","转账")else:sale_add(usercard,usermoney_input,"2","1","2","转账")# 写日志User_Action(usercard,flage,usercard_input,"信用卡转账",usermoney_input)# 调用转账还款入账函数
            Card_Payment(usercard_input,usermoney_input)print("转账成功!")f = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data_user, f)f.close()
# 账单明细查询
def select_bill(usercard,bill_date):global data_list# 已出账单明细have_bill = []# 未出账单明细No_bills = []# 未出账单还款入账repayment = []# 未出账单已还清Already = []for index,x_name in enumerate(data_list):if x_name["usercard"] == usercard:# 欠款未出账单消费明细if x_name["state"] == "1" and x_name["bills"] == "2":No_bills.append(data_list[index])# 欠款已出账单消费明细elif x_name["state"] == "1" and x_name["bills"] == "1":have_bill.append(data_list[index])# 转账还款入账明细elif x_name["bills"] == "2" and x_name["action"] == "4":repayment.append(data_list[index])# 已还清未出账单明细elif x_name["bills"] == "2" and x_name["state"] == "2":Already.append(data_list[index])if len(have_bill) != 0:print("以下消费为已出账单未还清明细:")for index,have_bill_list in enumerate(have_bill):x_date = have_bill_list["date"]x_action = have_bill_list["remarks"]x_money = have_bill_list["money"]x_Counter = have_bill_list["Counter"]x_Statement_Date = have_bill_list["Statement_Date"]x_state = "未还清"x_interest = have_bill_list["interest"]print("-" *150)print("序号:[%s]|日期:[%s]|类型:[%s]|金额:[%s]元|手续费:%s元|状态:[%s]|此笔交易出账单日[%s]|累计利息为:%s元" %(index+1,x_date,x_action,x_money,x_Counter,x_state,x_Statement_Date,x_interest))if len(No_bills) != 0:print("以下消费为未出账单未还清明细:")for index,No_bills_list in enumerate(No_bills):x_date = No_bills_list["date"]x_action = No_bills_list["remarks"]x_money = No_bills_list["money"]x_Counter =No_bills_list["Counter"]x_Statement_Date = No_bills_list["Statement_Date"]x_state = "未还清"print("-" *100)print("序号:[%s]|日期:[%s]|类型:[%s]|金额:[%s]元|手续费:%s元|状态:[%s]|此笔交易出账单日[%s]" %(index+1,x_date,x_action,x_money,x_Counter,x_state,x_Statement_Date))if len(repayment) != 0:print("以下为未出账单还款明细:")for index,repayment_list in enumerate(repayment):x_date = repayment_list["date"]x_action = repayment_list["remarks"]x_money = repayment_list["money"]x_Counter = repayment_list["Counter"]x_state = "还款入账"print("-" *100)print("序号:[%s]|日期:[%s]|类型:[%s]|金额:[%s]元|手续费:%s元|状态:[%s]" %(index+1,x_date,x_action,x_money,x_Counter,x_state))if len(Already) != 0:print("以下为未出账单已还款或无需还款消费明细:")for index,Already_repayment_list in enumerate(Already):x_date = Already_repayment_list["date"]x_action = Already_repayment_list["remarks"]x_money = Already_repayment_list["money"]x_Counter = Already_repayment_list["Counter"]x_state = "正常"print("-" *100)print("序号:[%s]|日期:[%s]|类型:[%s]|金额:[%s]元|手续费:%s元|状态:[%s]" %(index+1,x_date,x_action,x_money,x_Counter,x_state))

在处理利息计算方面,这是我想到的方法:

#!/usr/bin/env python3.5
# -*-coding:utf8-*-
import datetime,pickle,os,sys
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
sys.path.append(BASE_DIR)
# 加载利息计算日志文件
if os.path.exists(r'%s/config/calculation_log.txt'% BASE_DIR):f_calculation = open("%s/config/calculation_log.txt" % BASE_DIR, "rb")data_calculation = pickle.loads(f_calculation.read())# 利息初始化文件# print(data_calculation)
    f_calculation.close()
else:data_calculation = []
# 加载用户信息
if os.path.exists(r'%s/config/user_acc.txt'% BASE_DIR):f = open("%s/config/user_acc.txt" % BASE_DIR, "rb")data = pickle.loads(f.read())f.close()
else:data = []
# 加载消费明细
if os.path.exists(r'%s/config/user_list.txt'% BASE_DIR):f_list = open("%s/config/user_list.txt" % BASE_DIR, "rb")data_list = pickle.loads(f_list.read())f_list.close()
else:data_list = []
# 初始化利息计算文件列表
def calculation_computer():global data, data_calculation, data_list# 获取今天时间today = datetime.date.today()# 取昨天的时间yesterday = datetime.date.today()+datetime.timedelta(days=-1)for user_data in data:if user_data["flage"] == "2":# 获取 账单日x_data_date = user_data["Repayment_Date"]# 生成账单日期x_data_time = today.replace(day=x_data_date)# 如果文件内容不为空if len(data_calculation) != 0:for y_data in data_calculation:# 如果信用卡卡号在文件字典里存在关键字if user_data["usercard"] in y_data.keys():for x in y_data[user_data["usercard"]]:# 如果该字典里存在今天新加的记录则跳出if x["date"] == today:break# 如果字典里的日期与昨天有误差则进行增加elif yesterday > y_data[user_data["usercard"]][-1]["date"]:date = y_data[user_data["usercard"]][-1]["date"] + datetime.timedelta(days=1)y_data[user_data["usercard"]].append({"date":date,"money":0,"computer":"1"})continueelse:y_data[user_data["usercard"]].append({"date":today,"money":0,"computer":"1"})break# 如果全部循环后找不到key 则新增else:# 重复数据判断list_data = []for y_data in data_calculation:for k in y_data:list_data.append(k)# 如果要添加的数据在利息初始化文件中不存大if user_data["usercard"] not in list_data:if today > x_data_time:new_dic = {user_data["usercard"]:[{"date":x_data_time,"money":0,"computer":"1"}]}data_calculation.append(new_dic)elif today < x_data_time:new_dic = {user_data["usercard"]:[{"date":today,"money":0,"computer":"1"}]}data_calculation.append(new_dic)# 将所有利息数据写入文件中fl = open("%s/config/calculation_log.txt" % BASE_DIR, "wb")pickle.dump(data_calculation, fl)fl.close()# 如果文件内容为空else:# 时间按账单日开始记录if today > x_data_time:new_dic = {user_data["usercard"]:[{"date":x_data_time,"money":0,"computer":"1"}]}data_calculation.append(new_dic)elif today < x_data_time:new_dic = {user_data["usercard"]:[{"date":today,"money":0,"computer":"1"}]}data_calculation.append(new_dic)fl = open("%s/config/calculation_log.txt" % BASE_DIR, "wb")pickle.dump(data_calculation, fl)fl.close()calculation_computer()
# 出账单及利息计算
def computer():global data, data_calculation, data_list# 调用利息初始化文件
    calculation_computer()# 获取今天时间today = datetime.date.today()for x_data in data:if x_data["flage"] == "2":x_usercard = x_data["usercard"]   # 获取计算信用卡卡号# 获取账单还款到期日,每月10号due_date = today.replace(day=10)# 如果到期还款日小于账单日,当前利息计算日 = 当月计算利息日-30天xx_time = due_date + datetime.timedelta(days=-30)# 加载消费明细账单for z_data in data_list:# 定位当前用户所有没有出账单的明细,如果今天大于或等于该笔消费出账单日if z_data["usercard"] == x_usercard and z_data["bills"] == "2" and today >= z_data["Statement_Date"]:# 则更改当前该笔消费为已出账单z_data["bills"] = "1"f_list_computer = open("%s/config/user_list.txt" % BASE_DIR, "wb")pickle.dump(data_list, f_list_computer)f_list_computer.close()# 调用利息计算初始化文件for xy_data in data_calculation:# 定位到当前用户下所有记账日if x_usercard in xy_data.keys():for date in xy_data[x_usercard]:if date["computer"] == "1":# 定位到当前用户下所有出账单的未还清的消费记录# 初始化记账日所有利息counter = 0for z1_data in data_list:# 如果记账日没有清算if z1_data["usercard"] == x_usercard and z1_data["bills"] == "1":# 如果记账日大于最后还款日大于账单日if date["date"] > due_date > z1_data["Statement_Date"] and z1_data["state"] == "1":z1_data["interest"] += (z1_data["money"]+z1_data["Counter"])*0.0005counter += (z1_data["money"]+z1_data["Counter"])*0.0005# 如果记账日小于出账单日或小于最后还款日elif date["date"] > xx_time > z1_data["Statement_Date"] and z1_data["state"] == "1":z1_data["interest"] += (z1_data["money"]+z1_data["Counter"])*0.0005counter += (z1_data["money"]+z1_data["Counter"])*0.0005x_data["new_money"] -= counter  # 更新当前用户的余额f_list_computer = open("%s/config/user_list.txt" % BASE_DIR, "wb")pickle.dump(data_list,f_list_computer)f_list_computer.close()date["computer"] = "2"continuebreakfl = open("%s/config/calculation_log.txt" % BASE_DIR, "wb")pickle.dump(data_calculation, fl)fl.close()fx = open("%s/config/user_acc.txt" % BASE_DIR, "wb")pickle.dump(data, fx)fx.close()

转载于:https://www.cnblogs.com/IPYQ/p/5496944.html

python 信用卡系统+购物商城见解相关推荐

  1. python实现简单购物商城_如何用python语言实现简单购物商城

    本文为大家分享用python语言实现购物商城小程序,供大家参考,具体内容如下,希望对大家学习python语言有所帮助. 软件版本:python3.x 功能:实现简单购物商城 1.允许用户选择购买多少件 ...

  2. javaweb JAVA JSP购物系统购物商城系统源码(jsp电子商务系统)购物系统mvc

    javaweb JAVA JSP购物系统购物商城系统源码(jsp电子商务系统)购物系统mvc protected void doGet(HttpServletRequest req, HttpServ ...

  3. 商城管理系统服务器,基于Python实现的购物商城管理系统

    完整项目地址: 简介 本项目使用Python语言编写,实现了顾客端和商家端. 功能 店主功能:注册.登录.修改店铺信息.添加商品.删除商品.修改商品.查找商品.查看交易记录. 顾客功能:注册.登录.修 ...

  4. javaweb JAVA JSP手机销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上手机店在线销售

    JSP手机销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上手机店在线销售 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线招标房,屋租 ...

  5. javaweb JAVA JSP水果销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上水果店在线销售

    javaweb JAVA JSP水果销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上水果店在线销售 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情 ...

  6. javaweb JAVA JSP书店销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上书店在线销售

    JSP书店销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上书店在线销售 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线招标房,屋租赁 ...

  7. javaweb JAVA JSP零食销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上零食在线销售

    JSP零食销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上零食在线销售 大家好,很高兴和大家分享Java项目和经验.不管同学们是出于什么需求.都希望各位计算机专业的同学有一个提 ...

  8. JSP眼镜销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上眼镜在线销售

    JSP眼镜销售系统购物系统jsp购物系统购物商城系统源码(jsp电子商务系统)网上眼镜在线销售

  9. javaweb JAVA JSP婴幼儿用品销售系统jsp购物系统购物商城系统源码(电子商务系统)网上在线销售

    javaweb JAVA JSP婴幼儿用品销售系统jsp购物系统购物商城系统源码(电子商务系统)网上在线销售 常见的Javaweb题材有 理财系统,就业管理系统,汽车租赁,简易网盘,疫情数据查看,在线 ...

最新文章

  1. 背完这444句英语,你的口语绝对不成问题了
  2. 3种纯CSS实现中间镂空的12色彩虹渐变圆环方法
  3. 设计模式:迪米特原则
  4. Goalng软件包推荐
  5. git 查看分支编码_12个常用的Git命令,赶紧记一波!
  6. [高性能javascript笔记]1-加载和执行
  7. 一个适合于.NET Core的超轻量级工作流引擎:Workflow-Core
  8. Tomcat安装与配置教程(图文教学)
  9. 中公计算机岗位知识与技能,知识与技能的分类
  10. 必看 logit回归分析步骤汇总
  11. Spring5之IOC容器中IOC操作之Bean管理(二)之p名称空间注入、外部bean、内部bean、级联赋值
  12. 【高精】Oliver的成绩
  13. Python.习题八 文件与与异常(上)
  14. php取雅加达时间,2018雅加达亚运会赛程表完整版
  15. flask内容学习第三天(flak中的csrf跨站请求)
  16. 日本电产尼得科Nidec研发出超薄直线振动马达
  17. Android商家端线下支付流程详解
  18. java汉字转换为拼音首字母
  19. Mysql服务端(三)--- 索引及设计建议
  20. 【数据库】P1 数据库历史与发展

热门文章

  1. C语言零基础——简单算术刷题系统
  2. C语言实现文件的加密解密
  3. 红宝书背诵笔记 — 简单基础词语,Java视频教程百度网盘
  4. 插桩valgrind_基于动态插桩的CC++内存泄漏检测工具的设计与实现.pdf
  5. zzzfun网站连接不上服务器,ZzzFun
  6. Linux安装Kibana详细教程
  7. java获取当天星期几
  8. html 绘制篮球,7篮球运动.html
  9. 魅族日流量显示无服务器,魅族国际流量如何使用?没有手机卡照样能上网
  10. 搭建企业私有Git服务