一、员工注册视图的使用
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) % 69
fieldsarr = ["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 + 1
continue
if 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 + 1
liuliang_to_countuse(row_values[0])
else:
y = y + 1
if 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"] = simid
if yys != "": search_dict["yys__contains"] = yys
if ks != "": search_dict["ks__contains"] = ks
if equid != "": search_dict["equid__contains"] = equid
if plat != "": search_dict["plat__contains"] = plat
if area != "": search_dict["area__contains"] = area
if combo != "": search_dict["combo__contains"] = combo
if equname != "": search_dict["equname__contains"] = equname
if sdcode_id != "": search_dict["sdcode_id"] = sdcode_id #外键不能使用__contains 属性
if village != "": search_dict["village__contains"] = village
if sdname != "": search_dict["sdname__contains"] = sdname
if stopsign != "": search_dict["stopsign"] = stopsign
if 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 = 10
equ = models.yunbo.objects.values().filter(**search_dict) #查询字典
paginator = Paginator(list(equ), int(limit))
if int(nowPage) >= int(paginator.num_pages):
nowPage = paginator.num_pages
try:
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.field
var value = obj.value
var data = obj.data
var 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] : 6
var 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%69
cols.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) + 255
var tab_xstart3 = parseInt(tab_xstart) + 510
console.log(dpi)
console.log(data)
console.log(tab_xstart)
console.log(tab_xstart2)
console.log(tab_xstart3)
var TSCObj
TSCObj = 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 TSCObj
TSCObj = 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();
}
时间有限,闲暇之余,先暂时记录这么多吧,随后再添加项。之后再源码全部分享一下。但愿能给初学者一个参考