项目场景:
最近学校出了一个任务,要求每班出一个编程能力较强的人,编写一个项目,由于博主是转专业的学生,不用参加即将到来的军训,所以最后排来排去,最后还好排到了博主的头上,博主大概用了3天将大概的框架搭建好了,这次博客主要记录一下自己的艰辛历程
问题描述:
项目要求,扫描一个二维码,直接跳转到另一个页面,这个页面要有一个心理的小游戏,考虑到博主有自己的服务器,选择跳转到一个jsp页面,对于编写jsp页面的游戏,完全不会,最后考虑要充分发挥自身有事利用自己浅薄的知识,借鉴java武老师的建议写一个类似试卷调查的测试页面,在此特别感谢武老师,半夜十二点多还无偿帮我看代码。
解决方案:
博主这是运用到了自学python的知识。
安装需要的第三方库
pip install image
pip install pillow
pip install qrcode
python代码
import qrcode#导入库
qr = qrcode.QRCode(
version=2,
error_correction=qrcode.constants.ERROR_CORRECT_L,
box_size=10,
border=1
)#设置二维码的大小
#设置要转换的网址
qr.add_data("http://www.chaogezuishuai.top:8080/xl/xinli.jsp")
qr.make(fit=True)
img = qr.make_image()
#保存为png图片
img.save("xinli.png")
print("生成成功\n")
不重要,略过。
<%@ page language="java" contentType="text/html; charset=utf-8"
pageEncoding="UTF-8"%>
<html>
<head>
<meta charset="UTF-8">
<title>心理小游戏</title>
<style>
body{background:url(1.png)
no-repeat center center;
background-size:cover;
background-attachment:fixed;
background-color:#CCCCCC;}
</style>
</head>
<body>
<script type="text/javascript">
alert("放轻松,接下来让我们一起做一个小测试。");
</script>
<form action="js.jsp" methon="post">
<%@ include file="xinli.txt" %>
</form>
</body>
</html>
这里重点看21行,使用了include标记导入一个txt文本。
txt文本样式
<p>
第一题:平时不知为什么总觉得心慌意乱,坐立不安。
</p>
<input name="1" type="radio" value=2 checked="checked"/>常常是<br/>
<input name="1" type="radio" value=1 checked="checked"/>偶尔<br>
<input name="1" type="radio" value=0 checked="checked"/>完全没有<br>
<p>
第二题:上床后,怎么也睡不着,即使睡着也容易惊醒。
</p>
<input name="2" type="radio" value=2 checked="checked"/>常常是<br/>
<input name="2" type="radio" value=1 checked="checked"/>偶尔<br>
<input name="2" type="radio" value=0 checked="checked"/>完全没有<br>
<input type="submit" value="送出" name=submit width=>
类似这样的题目大约有40个,如果一个个手写会累死人的。
但博主可是会python得人,手写就不用专门导入一个txt文本了,决定由Python写这个txt文本。
经过分析这里要使用两个函数。
1.一个可以输出大写数字的函数。
2.打开题库遍历所有行,并提出来,写到另一个文件里。
第一个
def shuzi(a):
s=["零","一","二","三","四","五","六","七","八","九","十"]
if (a<11):
return s[a]
elif(a<20):
ten=int(a/10)
ge=a-ten*10
b=s[10]+s[ge]
return b
elif(a%10==0):
ten = int(a / 10)
return s[ten]+s[10]
else:
ten = int(a / 10)
ge = a - ten * 10
return s[ten]+s[10]+s[ge]
这个函数可以接受一个小于100的阿拉伯数字,返回相应的大写数字。
第二个
from shuzi import shuzi
f= open("心理.txt","r")
for line in f:
with open("xinli.txt","a") as s:
s.write("<p>"+'\n')
s.write("第"+shuzi(int(line.split(".")[0]))+"题:"+line.split(".")[1])
s.write("</p>"+'\n')
s.write("<input name="+str(int(line.split(".")[0]))+" type="+"radio"+" value=2 checked="+"checked"+"/><p>常常是</p><br/>"+'\n')
s.write("<input name="+str(int(line.split(".")[0]))+" type="+"radio"+" value=1 checked="+"checked"+"/><p>偶尔</p><br/>"+'\n')
s.write("<input name="+str(int(line.split(".")[0]))+" type="+"radio"+" value=0 checked="+"checked"+"/><p>完全没有</p><br/>"+'\n')
f.close()
这个函数可以写出jsp页面直接能识别的格式
运行之后的结果
不知道是什么原因出了乱码,查询了各种资料之后,只要在TXT文件中加一行代码就行,博主直接加到了Python文件中。
from shuzi import shuzi
#解决乱码问题
with open("xinli.txt","a") as s:
s.write("<%@page pageEncoding="+'"UTF-8"'+"%>"+"\n")
f= open("心理.txt","r")
for line in f:
with open("xinli.txt","a") as s:
s.write("<p>"+'\n')
s.write("第"+shuzi(int(line.split(".")[0]))+"题:"+line.split(".")[1])
s.write("</p>"+'\n')
s.write("<input name="+str(int(line.split(".")[0]))+" type="+"radio"+" value=2 checked="+"checked"+"/><p>常常是</p><br/>"+'\n')
s.write("<input name="+str(int(line.split(".")[0]))+" type="+"radio"+" value=1 checked="+"checked"+"/><p>偶尔</p><br/>"+'\n')
s.write("<input name="+str(int(line.split(".")[0]))+" type="+"radio"+" value=0 checked="+"checked"+"/><p>完全没有</p><br/>"+'\n')
f.close()
运行后的TXT
第一行增加了代码。
再次运行结果
之后再将txt最后一行加一个提交按钮就好了
仔细观察之前的代码会发现博主将这个数据都提交到了一个js.jsp,现在开始编写这个jsp页面
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body bgcolor=pink>
<% int grade=0;
for(int i=1;i<40;i++){
String s = Integer.toString(i);
String score=request.getParameter(s);
int w = Integer.parseInt(score);
grade+=w;
}
if (grade<8)
out.print("<font size=50px>你心理非常健康,请你放心</font>");
else if (grade<16)
out.print("<font size=50px>你大致还属于健康范围,但应有所注意,也可以找老师或同学聊聊。</font>");
else if (grade<30)
out.print("<font size=50px>你在心理方面有了一些障碍,应采取适当的方法进行调适,或找心理辅导老师帮助你。</font>");
else if (grade<40)
out.print("<font size=50px>你在心理方面有了一些障碍,应采取适当的方法进行调适,或找心理辅导老师帮助你。</font>");
else
out.print("<font size=50px>你有较严重的心理障碍,应及时找专门的心理医生治疗。</font>");
%>
</body>
</html>
博主用java程序片遍历每一个选项,并获取相应的分数(单选框对应的value值)进行相加,跟据对应的分数,返回对应的结果。
至此基本框架搭建完成,剩下的就是把页面弄得漂亮一点,不在多做赘述。
最后再次感谢为我提供思路的武老师,和教我jsp编写的贺老师,两位都是很优秀的老师。