一、员工注册视图的使用

class UserRegisterView(View):def get(self, request):  # 显示登录页return render(request, 'register.html', {'form': UserRegisterForm()})  # 渲染模板def post(self, request):  # 提交页面表单form = UserRegisterForm(request.POST)  # 接收Form表单#用admin的字段email控制注册功能if User.objects.get(username="admin").email == '0':messages.add_message(request, messages.ERROR, '员工注册功能已关闭,请联系管理员开放!')  # 提示错误消息return render(request, 'register.html', {'form': form})  # 渲染模板if form.is_valid():  # 验证表单user_id = request.POST['user_id']  # 获取工号user_name = request.POST['user_name']  # 获取姓名password = request.POST['password']  # 获取密码password2 = request.POST['password2']  # 获取密码if User.objects.filter(username=user_id):messages.add_message(request, messages.ERROR, '工号已存在,请确认后重新输入!')  # 提示错误信息elif password != password2:messages.add_message(request, messages.ERROR, '二次密码不一致,请重新输入!')  # 提示错误信息else:d = {'username': user_id,'password': password,'first_name':user_name,'last_name':"未赋权",'is_superuser': 1,'is_active': 1,'is_staff': 1}user = User.objects.create_user(**d)user.save()django_logout(request)return HttpResponseRedirect('/index/')return render(request, 'register.html', {'form': form})  # 渲染模板
#对应注册Form
class UserRegisterForm(forms.Form):#UserRegisterForm()user_id = forms.CharField(label='工号',required=True,max_length=11,widget=forms.TextInput(attrs={'class': 'form-control mb-0','placeholder': "请输入工号"}),error_messages={'required': '工号不能为空','max_length': '长度不能超过10个字符',})user_name = forms.CharField(label='真实姓名',required=True,max_length=20,widget=forms.TextInput(attrs={'class': 'form-control mb-0','placeholder': "请输入真实姓名,方可使用本系统"}),error_messages={'required': '姓名不能为空','max_length': '长度不能超过20个字符',})password = forms.CharField(label='密码',required=True,min_length = 3,max_length = 50,widget=forms.PasswordInput(attrs={'class': 'form-control mb-0','placeholder':"请输入密码"}),error_messages={'required': '密码不能为空','min_length': '长度不能少于3个字符','max_length': '长度不能超过50个字符',})password2 = forms.CharField(label='确认密码',required=True,min_length = 3,max_length = 50,widget=forms.PasswordInput(attrs={'class': 'form-control mb-0','placeholder':"请再次输入密码"}),error_messages={'required': '密码不能为空','min_length': '长度不能少于3个字符','max_length': '长度不能超过50个字符',})

二、setattr语句在python和Django中应用。工夫不负有心人,找到了setattr语句,该语句在Django操作数据库语句中的使用,使程序节省了大量的判断语句和循环语句,甚至实现了原来很复杂的语句功能,值得学习和记录。

 # 导入月流量
def liuliang(request): if request.session['permissions'] != '***' and request.session['permissions'] != '***':  # 验证权限return render(request, "addall.html", {"msg": "sorry,你没有权限!"})"""导入excel表数据"""excel_file = request.FILES.get('equfile', '')  # 获取前端上传的文件if not excel_file:return render(request, "liuliang.html", {"msg": "未选择文件,请选择文件"})file_type = excel_file.name.split('.')[1]  # 拿到文件后缀if file_type not in ['xlsx', 'xls']:  # 支持这两种文件格式return render(request, "liuliang.html", {"msg": "导入失败:文件格式错误,请上传正确格式的文件!"})a = excel_file.name.split('.')[0]  # 拿到文件名if len(a) != 6 or str(a).isdigit == False:return render(request, "liuliang.html", {"msg": "文件名不合法,请重新选择或修改文件名!"})if int(a[0:4]) < 2022 or int(a[4:6]) < 1 or int(a[4:6]) > 12:return render(request, "liuliang.html", {"msg": "时间早于起始时间,请核实重选!"})begin_date = datetime.strptime("202204", "%Y%m")end_date = datetime.strptime(str(excel_file)[0:6], "%Y%m")if get_months(begin_date, end_date) < 0:  # 相差月份为负数,退出return render(request, "liuliang.html", {"msg": "时间早于起始时间,请核实重选!"})#69列循环存储fieldnum = get_months(begin_date, end_date) % 69fieldsarr = ["y202204", "y202205", "y202206", "y202207", "y202208", "y202209", "y202210", "y202211", "y202212","y202301", "y202302", "y202303", "y202304", "y202305", "y202306", "y202307", "y202308", "y202309","y202310", "y202311", "y202312", "y202401", "y202402", "y202403", "y202404", "y202405", "y202406","y202407", "y202408", "y202409", "y202410", "y202411", "y202412", "y202501", "y202502", "y202503","y202504", "y202505", "y202506", "y202507", "y202508", "y202509", "y202510", "y202511", "y202512","y202601", "y202602", "y202603", "y202604", "y202605", "y202606", "y202607", "y202608", "y202609","y202610", "y202611", "y202612", "y202701", "y202702", "y202703", "y202704","y202705", "y202706", "y202707", "y202708", "y202709", "y202710", "y202711", "y202712", ]data = xlrd.open_workbook(filename=None, file_contents=excel_file.read())# 打开工作文件tables = data.sheets()  # 得到excel中数据表sheets1,sheets2...x = y = z = 0# 循环获取每个数据表中的数据并写入数据库for table in tables:rows = table.nrows  # 总行数try:with transaction.atomic():  # 控制数据库事务交易# 获取数据表中的每一行数据写入设计好的数据库表for row in range(1, rows):  # 从1开始是为了去掉表头row_values = table.row_values(row)  # 每一行的数据if row_values[1] is None or row_values[1] == "":  # 流量数据不存在,进入下一行z = z + 1continueif models.yunbo.objects.filter(iccid=str(row_values[0])).exists():model = models.yunbo.objects.get(iccid=str(row_values[0]))setattr(model, fieldsarr[fieldnum], str(round(MB_value(str(row_values[1])),3))+'MB')#round(a,3)保留3位小数model.save()x = x + 1liuliang_to_countuse(row_values[0])else:y = y + 1if x == 0:return render(request, "liuliang.html", {"msg": "导入失败:未搜到合格ICCID!"})except Exception as e:return render(request, "liuliang.html", {"msg": "导入失败:" + str(e)})return render(request, "liuliang.html", {"msg": "月流量成功导入:" + str(x) + "条;有ICCID无流量值:" + str(z) + "条;ICCID不存在数量:" + str(y) + "条。请刷新表格查看!"})

三、md5 和 API接口初次应用

import hashlib, json ,requests
def to_md5(str):md5 = hashlib.md5()md5.update(str.encode("utf-8"))return md5.hexdigest()@login_required
def more(request):if request.method=='GET':return render(request, 'z_more.html')else:iccid = request.POST.get("iccid", None)cardType = request.POST.get("cardType", None)print("cardType:" + cardType)tKey = datetime.now().strftime('%Y%m%d%H%M%S')passWord = to_md5(to_md5("*********") + tKey)url = 'https://api.******.cn/api/v1/card/moreQueryCardInfo'headers = {"Content-Type": "application/json"}data = {"userName": "******","passWord": passWord,"tKey": tKey,"iccids": iccid,"cardType": cardType}reponse = requests.post(url=url, headers=headers, data=json.dumps(data))  # 接口请求data = reponse.json()return JsonResponse(data, safe=False)

四、搜索的实现函数语句

def search(request):#获取前台数据iccid=request.GET.get("iccid")simid=request.GET.get("simid")yys=request.GET.get("yys")ks=request.GET.get("ks")combo=request.GET.get("combo")equid=request.GET.get("equid")plat=request.GET.get("plat")equname=request.GET.get("equname")sdcode_id=request.GET.get("sdcode_id")area=request.GET.get("area")village=request.GET.get("village")activatedate=request.GET.get("activatedate")productdate=request.GET.get("productdate")putindate=request.GET.get("putindate")begindate=request.GET.get("begindate")sdname=request.GET.get("sdname")stopsign=request.GET.get("stopsign")search_dict = dict()  #定义查询字典,非空加入字典if iccid != "":   search_dict["iccid__contains"] = iccid # 如果查询条件不为空就写入到字典中if simid != "":   search_dict["simid__contains"] = simidif yys != "":   search_dict["yys__contains"] = yysif ks != "":   search_dict["ks__contains"] = ksif equid != "":   search_dict["equid__contains"] = equidif plat != "":   search_dict["plat__contains"] = platif area != "":   search_dict["area__contains"] = areaif combo != "":   search_dict["combo__contains"] = comboif equname != "":   search_dict["equname__contains"] = equnameif sdcode_id != "":   search_dict["sdcode_id"] = sdcode_id  #外键不能使用__contains 属性if village != "":   search_dict["village__contains"] = villageif sdname != "":   search_dict["sdname__contains"] = sdnameif stopsign != "":   search_dict["stopsign"] = stopsignif activatedate != "":  search_dict["activatedate"] = datetime.strptime(activatedate, "%Y-%m-%d")if productdate != "":  search_dict["productdate"] = datetime.strptime(productdate, "%Y-%m-%d")if putindate != "":  search_dict["putindate"] = datetime.strptime(putindate, "%Y-%m-%d")if begindate != "":  search_dict["begindate"] = datetime.strptime(begindate, "%Y-%m-%d")nowPage = request.GET.get("page")limit = request.GET.get("limit")if limit == "":limit = 10equ = models.yunbo.objects.values().filter(**search_dict) #查询字典paginator = Paginator(list(equ), int(limit))if int(nowPage) >= int(paginator.num_pages):nowPage = paginator.num_pagestry:page = paginator.page(nowPage)except:page = paginator.page(paginator.num_pages)data = {'data':list(page),'code':"200",'count':paginator.count,'page':page.number,'limit':page.__len__(),'pages':paginator.num_pages}return  JsonResponse(data)
                        //模糊查询$('.dataFrm .search_btn').on('click', function () {var iccid = $('#iccid').val();var simid = $('#simid').val();var yys = $('#yys').val();var ks = $('#ks').val();var combo = $('#combo').val();var equid = $('#equid').val();var plat = $('#plat').val();var equname = $('#equname').val();var sdcode_id = $('#sdcode_id').val();var area = $('#area').val();var village = $('#village').val();var activatedate = $('#activatedate').val();var begindate = $('#begindate').val();var putindate = $('#putindate').val();var productdate = $('#productdate').val();var sdname = $('#sdname').val();var stopsign = $('#stopsign').val();//执行重载if (iccid == "" && simid == ""&& yys == ""&& ks == ""&& combo == ""&&equid == ""&&sdname==""&&plat == ""&& equname == ""&&sdcode_id == ""&&area == ""&&  village == ""&&activatedate == ""&&activatedate == ""&& begindate == ""&& putindate == ""&& productdate == ""&&stopsign=="") {layer.msg("请至少输入一项数据再查询")} else {table.reload('table', {url: "/search/", method: "get", where: {"iccid": iccid,"simid": simid,"yys": yys,"ks": ks,"combo": combo,"equid": equid,"plat": plat,"equname": equname,"sdcode_id":sdcode_id,"area": area,"village": village,"activatedate": activatedate,"begindate": begindate,"productdate": productdate,"putindate": putindate,"sdname":sdname,"stopsign":stopsign,}, page: {curr: 1 //重新从第 1 页开始}})}});

五、layUI表格中单元格编辑的实现

                         table.on("edit(userTable)", function(obj){ //注:edit是固定事件名,test是table原始容器的属性 lay-filter="对应的值"var field = obj.fieldvar value = obj.valuevar data = obj.datavar iccid = data.iccid$.ajax({url:"/mytable/",data:{"iccid":iccid,"value":value,"field":field},type:"post",success(res) {if (res.code === 200) {$(".layui-laypage-btn")[0].click();  //页面刷新//layer.msg(("修改成功:[ICCID号:" + data.iccid + '] ' + '已改为' + value + " !"), {icon: 6});} else if (res.code === 400) {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("数据已存在,请核对后重新提交!", {icon: 5});} else if (res.code === 500) {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("客户不存在或未加入系统,请核对后重新提交!", {icon: 5});} else if (res.code === 600) {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("时间已超过系统设置,请升级或联系系统开发人员!", {icon: 5});} else if (res.code === 700) {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("阈值必须在0-1之间!", {icon: 5});} else if (res.code === 800) {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("设备号的长度不是12位!", {icon: 5});} else if (res.code === 900) {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("输入的不是规范整数!", {icon: 5});} else if (res.code === 1000) {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("你没有权限!!!", {icon: 5});}else {$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("修改失败,请核对后重新提交!", {icon: 5})}},error(){$(".layui-laypage-btn")[0].click();  //页面刷新layer.msg("修改失败,请核对后重新提交!",{icon:5});}});});

六、js中数据库循环读取的实现

var aURL = window.location.href;var show_month_num = aURL.length > 60 ? aURL.split('?')[1].split("=")[18] : 6var beginMouth = '2022-04-1'//var endMouth = '2030-12-1'var endMouth = getNowMonth()var fields = ["y202204", "y202205", "y202206", "y202207", "y202208", "y202209", "y202210", "y202211", "y202212", "y202301", "y202302", "y202303", "y202304", "y202305", "y202306", "y202307", "y202308", "y202309", "y202310", "y202311", "y202312", "y202401", "y202402", "y202403", "y202404", "y202405", "y202406", "y202407", "y202408", "y202409", "y202410", "y202411", "y202412", "y202501", "y202502", "y202503", "y202504", "y202505", "y202506", "y202507", "y202508", "y202509", "y202510", "y202511", "y202512", "y202601", "y202602", "y202603", "y202604", "y202605", "y202606", "y202607", "y202608", "y202609", "y202610", "y202611", "y202612", "y202701", "y202702", "y202703", "y202704","y202705", "y202706", "y202707", "y202708", "y202709", "y202710", "y202711", "y202712",]var titles = getMonthsArr(beginMouth,endMouth)if (show_month_num < 1){ show_month_num = 1}if ( show_month_num > titles.length ){ show_month_num = titles.length }if (show_month_num > 69){ show_month_num = 69}{#console.log('aURL:' + aURL)#}{#console.log('show_month_num:' + show_month_num)#}{#console.log("fields列表数量:"+ fields.length);#}{#console.log("titles列表数量:"+ titles.length);#}for( i = titles.length-1; i > (titles.length - show_month_num-1); i-- ){// field取余数:i%69cols.push( {field: fields[(i%69)], title: titles[i], width: 120, align: 'center',sort: true}, )}cols.push( {fixed: 'right', title: '操作', toolbar: '#barDemo', width: 150, align: 'center' } )if( show_month_num != 6 ){ document.getElementById("show_month_num").value = show_month_num }document.getElementById("show_month_num").focus();//**获取当前年月 */function getNowMonth() {var date = new Date();var year = date.getFullYear();var month = date.getMonth() + 1;month = month > 9 ? month : "0" + month;return year + "-" + month;}// 获取2个日期之间的月份序列,含起始和结尾月,结束日期必须大于起始日期function getMonthsArr(startDate,endDate) {var d1 = startDate;var d2 = endDate;var dateArry = [];var s1 = d1.split("-");var s2 = d2.split("-");var mCount = 0;if (parseInt(s1[0]) < parseInt(s2[0])) {mCount = (parseInt(s2[0]) - parseInt(s1[0])) * 12 + parseInt(s2[1]) - parseInt(s1[1])+1;} else {mCount = parseInt(s2[1]) - parseInt(s1[1])+1;}if (mCount > 0) {var startM = parseInt(s1[1]);var startY = parseInt(s1[0]);for (var i = 0; i < mCount; i++) {if (startM < 12) {dateArry[i] = startY + "年" + (startM > 9 ? startM + "月" : "0" + startM + "月");startM += 1;} else {dateArry[i] = startY + "年" + (startM > 9 ? startM + "月" : "0" + startM + "月" );startM = 1;startY += 1;}}}return dateArry;}

七、打印机TSC TTP-244 Pro的实现

 //打印开始function TestFun(){var dpi = Get_Dpi();var qudong = document.getElementById("qudong").value;var bianma = document.getElementById("bianma").value;var ifPrint_txt = document.getElementById("ifPrint_txt").value;var rotate = document.getElementById("rotate").value;var tab_speed = document.getElementById("tab_speed").value;var tab_density = document.getElementById("tab_density").value;var paper_length = document.getElementById("paper_length").value;var paper_height = document.getElementById("paper_height").value;var tab_height = document.getElementById("tab_height").value;var tab_xstart = document.getElementById("tab_xstart").value;var tab_ystart = document.getElementById("tab_ystart").value;var bar_1 = document.getElementById("bar_1").value;var bar_2 = document.getElementById("bar_2").value;var data = document.getElementById("data").value;var tab_xstart2 = parseInt(tab_xstart) + 255var tab_xstart3 = parseInt(tab_xstart) + 510console.log(dpi)console.log(data)console.log(tab_xstart)console.log(tab_xstart2)console.log(tab_xstart3)var TSCObjTSCObj = new ActiveXObject("TSCActiveX.TSCLIB")TSCObj.ActiveXopenport(qudong)TSCObj.ActiveXsendcommand("SIZE "+paper_length+" mm, "+paper_height+" mm")TSCObj.ActiveXsendcommand("SPEED "+tab_speed)TSCObj.ActiveXsendcommand("DENSITY "+tab_density)TSCObj.ActiveXsendcommand("DIRECTION 1")TSCObj.ActiveXsendcommand("SET TEAR ON")TSCObj.ActiveXclearbuffer()//x边距,y边距,编码方式,条码高度,是否打印文本,斜,间隔因子2 2,打印内容TSCObj.ActiveXbarcode(tab_xstart, tab_ystart, bianma, tab_height, ifPrint_txt, rotate, bar_1, bar_2, data)TSCObj.ActiveXbarcode(tab_xstart2, tab_ystart, bianma, tab_height, ifPrint_txt, rotate, bar_1, bar_2, data)TSCObj.ActiveXbarcode(tab_xstart3, tab_ystart, bianma, tab_height, ifPrint_txt, rotate, bar_1, bar_2, data)TSCObj.ActiveXprintlabel("1","1")TSCObj.ActiveXcloseport()}//打印开始function TestFun()  {var data = document.getElementById("data").value;console.log("244打印机:" + data);var TSCObjTSCObj = new ActiveXObject("TSCActiveX.TSCLIB")TSCObj.ActiveXopenport("TSC TTP-244 Pro")//打印机型号 驱动TSCObj.ActiveXsendcommand("SIZE 110mm, 12mm")//标签尺寸TSCObj.ActiveXsendcommand("SPEED 4") //打印速度TSCObj.ActiveXsendcommand("DENSITY 12") //打印浓度TSCObj.ActiveXsendcommand("DIRECTION 1")//设置标签方向 ,DIRECTION 1 左上角 (x,y)={0,0};DIRECTION 0 右下角 (x,y)={0,0};TSCObj.ActiveXsendcommand("SET TEAR ON")TSCObj.ActiveXclearbuffer()//清除TSCObj.ActiveXbarcode(75, 27, 128, 45, 1, 0, 2, 2, data)//x边距,y边距,编码方式,条码高度,条码内容,斜,间隔因子2 2,打印内容TSCObj.ActiveXbarcode(330, 27, 128, 45, 1, 0, 2, 2, data)//x边距,y边距,编码方式,条码高度,条码内容,斜,间隔因子2 2,打印内容TSCObj.ActiveXbarcode(580, 27, 128, 45, 1, 0, 2, 2, data)//x边距,y边距,编码方式,条码高度,条码内容,斜,间隔因子2 2,打印内容TSCObj.ActiveXprintlabel("1","1")//(打印份数,每页打印张数)TSCObj.ActiveXcloseport()window.opener=null;window.open("","_self");window.close();}

时间有限,闲暇之余,先暂时记录这么多吧,随后再添加项。之后再源码全部分享一下。但愿能给初学者一个参考,如有沟通请联系我。

python+django+layUI+MySQL+TSC打印机搭建4G设备管理平台项目(二)——过程中的难点记录相关推荐

  1. python+django+layUI+MySQL搭建4G设备管理平台项目(一)

    项目来源:大学毕业已经十多年了,突发奇想为自己做个4G设备平台.因为4G设备涉及内容太多,用Excel来管理太不方便了,另外涉及多用户同时使用,用的金山文档里的Excel,可以多用户,却又损失了很多原 ...

  2. 基于python+django框架+Mysql数据库的多用户B2C商城平台系统设计与实现

    项目背景和意义 目的:本课题主要目标是设计并能够实现一个基于web网页的多用户商城系统,整个网站项目使用了B/S架构,基于python的Django框架下开发:用户通过登录网站,查询商品,购买商品,下 ...

  3. Win10+Python+Django+Nginx+MySQL开发教程及实例(1)——开发环境搭建

    Win10+Python+Django+Nginx+MySQL开发教程及实例 PaulTsao 本教程共有三篇内容: 第一篇:Win10+Python+Django+Nginx+MySQL 开发环境搭 ...

  4. python Django 连接mysql数据库创建表详细全过程

    python Django 连接mysql数据库创建表详细全过程 1,在数据库中新建一个要连接的数据库(在cmd命令行里登录数据库进行创建创建) mysql -u root -p**+密码** cre ...

  5. 【Python Django Web项目】利用 Python+Django+Pycharm+MySQL 搭建一个自己的Web网站项目的步骤(详细图文)上集

    今天我们要来介绍一下, 利用 Python+Django+Pycharm+MySQL 搭建一个自己的Web网站项目的步骤 首先我们要建立一个专门放项目的文件夹 如下 E:\Projects , 我们建 ...

  6. python web项目(django+Layui+mysql)

    python web项目(django--+Layui+mysql) 1.结果图 2目录结构 3.开干 4.总结 为了完成期末作业,做的一个学生成绩管理系统,采用django+Layui+mysql5 ...

  7. Win10+Python+Django+Nginx+MySQL开发教程及实例(2)——Python连通操作MySQL

    Win10+Python+Django+Nginx+MySQL开发教程及实例 PaulTsao 本系列教程共有四篇内容: 第一篇: 开发环境搭建 第二篇:用Python连通操作MySQL 第三篇:用N ...

  8. nginx mysql 网页显示_Win10+Python+Django+Nginx+MySQL开发教程及实例(3)——Nginx运行html网页...

    Win10+Python+Django+Nginx+MySQL开发教程及实例 PaulTsao 本教程共有三篇内容: 第四篇*:创建个人博客 第五篇*:个人博客网站上云部署并运行 第三篇:Win10+ ...

  9. 手把手教你SSM搭建Easymall电商项目 (二)

    SSM搭建Easymall电商项目 (二) 目录 SSM搭建Easymall电商项目 (二) 一.Easymall需求代码实现 1.测试类测试请求地址路径IndexController.java    ...

最新文章

  1. Swift与LLVM-Clang原理与示例
  2. 清北顶会学霸:“表情”与“认知”引发的科学思辨 | 清华AI Time PHD
  3. 手机应用:非功能需求 Check List
  4. Android 解锁屏启动过程
  5. 净利润跌幅超六成,坚持要做“鸭中星巴克”的周黑鸭怎么了?
  6. 安徽省计算机二级考试vfp试题,安徽省计算机二级VFP考试理论模拟试题2(附答案)...
  7. 九月计划 附:《使用 Microsoft .NET 的企业解决方案模式》
  8. vb.net 同时给多个属性赋值_系统小技巧:充分用好文件的时间属性
  9. SpringBoot从入门到精通教程
  10. chrome 无法抓屏的问题
  11. AcWing 1208. 翻硬币
  12. HDU1172 猜数字【暴力+进制】
  13. React入门基础+练习 (一)
  14. ubuntu 深度音乐播放器
  15. oracle清空回收站指定表,oracle 删除表结构及清空回收站
  16. raw格式镜像文件转vmdk
  17. 运行jar包时报错:[mybatis-config.xml] cannot be opened because it does not exist
  18. 优化方法总结(BGD,SGD,Momentum,AdaGrad,RMSProp,Adam)
  19. NOIP切题注意事项
  20. YOLOV5在deepstream6.1.1上应用

热门文章

  1. 【5G RLC】AM模式的数据传输详解
  2. 纯JavaScript二维码在线生成网页源码
  3. 阿里云服务器ECS购买教程
  4. 化繁为简——分解复杂的SQL语句
  5. jquery可爱的小黑猫
  6. 宇宙最强,meltdown论文中英文对照版(三)
  7. 手机5g什么时候普及_5G网络什么时候普及,5G手机什么时候买比较合适?
  8. Python-练习 42. Is-A, Has-A, 对象和类
  9. 福建食用菌产业博览会盛大开幕 谋定中国农民丰收节交易会
  10. 使用css实现渐变色背景