使用JavaWeb写一个管理系统,可以进行登录注册,对MySQL数据库中的用户和商品信息进行管理。
IDEA、MySQL Workbench、LayUI框架
HTML的form表单。onblur()是输入框失去焦点时执行的函数。
<form id="Form" method="POST" action="register">
<div class="form-item">
<div class="form-title">用户名</div>
<input type="text" name="Name" id="name-input" onblur="checkName()">
</div>
<div id="name-errMsg"></div> <!--用于显示错误信息 -->
<div class="form-item">
<div class="form-title">密码</div>
<input type="password" name="Pwd" id="pwd-input1" onblur="checkPwd1()">
</div>
<div id="pwd-errMsg1"></div>
<div class="form-item">
<div class="form-title">重复密码</div>
<input type="password" name="Pwd2" id="pwd-input2" onblur="checkPwd2()">
</div>
<div id="pwd-errMsg2"></div>
<div class="form-item">
<div class="form-title">昵称</div>
<input type="text" name="NickName" id="nickName-input" onblur="checkEmail()">
</div>
<div id="nickName-div"></div>
<div class="form-item">
<div class="form-title">电话号码</div>
<input type="number" name="Tel" id="tel-input" onblur="checkTel()" >
</div>
<div id="tel-errMsg"></div>
<div class="form-item">
<div class="form-title">邮箱</div>
<input type="text" name="Email" id="email-input" onblur="checkEmail()">
</div>
<div id="email-errMsg"></div>
<div class="form-item">
<div class="form-title">住址</div>
<input type="text" name="Address" id="address-input" onblur="checkEmail()">
</div>
<div id="address-div"></div>
<div id="submit-div">
<div id="submit-left">
</div>
<div id="submit-mid">
<button type="submit" id="Submit">注册</button>
</div>
<div id="submit-right">
<a href="LoginPage.jsp" id="login">已有账号,前往登录</a>
</div>
</div>
</form>
注册格式检查需要检查:
<script src="https://lib.sinaapp.com/js/jquery/2.0.2/jquery-2.0.2.min.js"></script>
<script>
//定义变量控制是否能提交
//Enable为true表示格式正确 , Empty为false表示不为null或空字符串
var nameEnable = false;
var nameEmpty = true;
var pwdEnable = false;
var pwd1Empty = true;
var pwd2Empty = true;
var telEnable = false;
var telEmpty = true;
var emailEnable = false;
var emailEmpty = true;
//判断字符串是否为null或空字符串 ""
function CheckEmpty(ss){
return ss == null || ss === "";
}
//检查用户名,不能出现特殊字符
function checkName(){
//失去焦点(光标)后执行的事件函数
var inputName = document.getElementById("name-input").value;
var pattern = new RegExp("[` ~!@#$^&*()%=|{}':;',\\[\\].<>《》/?~!@#¥……&*()——|{}【】‘;:”“'。,、?]");
if(!CheckEmpty(inputName)){
nameEmpty = false;
if(pattern.test(inputName)){
//包含特殊字符
document.getElementById("name-errMsg").innerHTML = "用户名格式错误,不能包含特殊字符!"
document.getElementById("name-input").style = "border:2px solid red;"
nameEnable = false;
}else{
document.getElementById("name-errMsg").innerHTML = " "
document.getElementById("name-input").style = "border:0px;"
nameEnable = true;
}
}else{
nameEmpty = true;
}
}
//检查密码,
function checkPwd1(){
var inputPwd_1 = document.getElementById("pwd-input1").value;
var inputPwd_2 = document.getElementById("pwd-input2").value;
if(!CheckEmpty(inputPwd_1) && !CheckEmpty(inputPwd_2)){
pwd1Empty = false;
pwd2Empty = false;
if(inputPwd_1 != inputPwd_2){
document.getElementById("pwd-errMsg2").innerHTML = "两次密码不相同,请检查!";
document.getElementById("pwd-input1").style = "border:2px solid red;"
document.getElementById("pwd-input2").style = "border:2px solid red;"
pwdEnable = false;
}
if(inputPwd_1 == inputPwd_2){
document.getElementById("pwd-errMsg2").innerHTML = " ";
document.getElementById("pwd-input1").style = "border:0px;"
document.getElementById("pwd-input2").style = "border:0px;"
pwdEnable = true;
}
}else if(!CheckEmpty(inputPwd_1) && CheckEmpty(inputPwd_2)){
pwd1Empty = false;
pwd2Empty = true;
}else if(CheckEmpty(inputPwd_1) && !CheckEmpty(inputPwd_2)){
pwd1Empty = true;
pwd2Empty = false;
}else{
pwd1Empty = true;
pwd2Empty = true;
}
}
//检查重复密码,是否相同
function checkPwd2(){
var inputPwd_1 = document.getElementById("pwd-input1").value;
var inputPwd_2 = document.getElementById("pwd-input2").value;
if(!CheckEmpty(inputPwd_1) && !CheckEmpty(inputPwd_2)){
pwd1Empty = false;
pwd2Empty = false;
if(inputPwd_1 != inputPwd_2){
document.getElementById("pwd-errMsg2").innerHTML = "两次密码不相同,请检查!";
document.getElementById("pwd-input1").style = "border:2px solid red;"
document.getElementById("pwd-input2").style = "border:2px solid red;"
pwdEnable = false;
}
if(inputPwd_1 == inputPwd_2){
document.getElementById("pwd-errMsg2").innerHTML = " ";
document.getElementById("pwd-input1").style = "border:0px;"
document.getElementById("pwd-input2").style = "border:0px;"
pwdEnable = true;
}
}else if(!CheckEmpty(inputPwd_1) && CheckEmpty(inputPwd_2)){
pwd1Empty = false;
pwd2Empty = true;
}else if(CheckEmpty(inputPwd_1) && !CheckEmpty(inputPwd_2)){
pwd1Empty = true;
pwd2Empty = false;
}else{
pwd1Empty = true;
pwd2Empty = true;
}
}
//检查电话号码,是否全是数字,是否为十一位
function checkTel(){
var inputTel = document.getElementById("tel-input").value;
var flag = true;
if (!CheckEmpty(inputTel)){
telEmpty = false;
if (!(/^1[3456789]\d{9}$/.test(inputTel))) {
// 格式错误
flag=false;
}
if(!flag){
document.getElementById("tel-errMsg").innerHTML = "手机号格式错误,请检查!"
document.getElementById("tel-input").style = "border:2px solid red;"
}else{
document.getElementById("tel-errMsg").innerHTML = " ";
document.getElementById("tel-input").style = "border:0px;"
}
telEnable = flag;
}else{
telEmpty = true;
}
}
//检查邮箱格式
function checkEmail(){
var inputEmail = document.getElementById("email-input").value;
var flag = true;
var reg = /^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/;
if(!CheckEmpty(inputEmail)){
emailEmpty = false;
//调用正则验证test()函数
if(!reg.test(inputEmail)){
flag = false;
}
if(!flag){
document.getElementById("email-errMsg").innerHTML = "邮箱格式不正确,请检查!"
document.getElementById("email-input").style = "border:2px solid red;"
}else{
document.getElementById("email-errMsg").innerHTML = " "
document.getElementById("email-input").style = "border:0px;"
}
emailEnable = flag;
}else{
emailEmpty = true;
}
}
$(document).ready(function () {
$("#name-input").focus();
//全局检查并判断是否可以提交
$("#Submit").click(function () {
if(nameEmpty){
document.getElementById("name-input").style = "border:2px solid red;"
alert("请输入用户名!");
return;
}else if(pwd1Empty){
document.getElementById("pwd-input1").style = "border:2px solid red;"
alert("请输入密码!");
return;
}else if(pwd2Empty){
document.getElementById("pwd-input2").style = "border:2px solid red;"
alert("请再次输入密码!");
return;
}else if(telEmpty){
document.getElementById("tel-input").style = "border:2px solid red;"
alert("请输入电话号码!");
return;
}else if(emailEmpty){
document.getElementById("email-input").style = "border:2px solid red;"
alert("请输入邮箱!");
return;
}else if(!nameEnable){
return;
}else if(!pwdEnable){
return;
}else if(!telEnable){
return;
}else if(!emailEnable){
return;
}
$("#Form").submit();
});
});
</script>
从注册页面获得参数,并提交数据到数据库。这是JavaWeb的基础,就不详细解释了。
HTML的form表单。和注册页面的类似,从数据库查找数据并验证密码。
验证成功,使用Session传递用户User类型变量
验证失败,返回登录界面并保留输入的用户名
public class Login extends HttpServlet {
public void service(HttpServletRequest request, HttpServletResponse response)
throws IOException {
//获取登陆的用户名和密码
String loName = request.getParameter("Name");
String loPwd = request.getParameter("Pwd");
String userName;
String res; //返回的信息,若登陆成功则返回空字符串,若登陆失败返回错误信息
try {
//获取用户账号列表
List<User> userList = User_dataList.get();
//遍历
for (User userItem : userList) {
//用于登录失败后用户名不消失
if (userItem.getName().equals(loName)) {
if(userItem.getPwd().equals(loPwd)){
//匹配成功
//创建Session并携带用户信息的参数loginUser
HttpSession session = request.getSession();
session.setAttribute("loginUser", userItem);
//跳转至个人信息界面,
request.getRequestDispatcher("Main.jsp").forward(request, response);
}else{
//匹配失败,密码错误
userName = userItem.getName();
res = "账号或密码错误,请检查!";
request.setAttribute("res",res);
request.setAttribute("userName",userName);
request.getRequestDispatcher("LoginPage.jsp").forward(request ,response);
}
}
}
//匹配失败,返回错误信息
} catch (Exception e) {
e.printStackTrace();
}
}
}
LayUI数据表格中的删除和修改操作事件对应的js代码为
table.on('tool(test)', function(obj){
//tool 是工具的事件名,test 是 table 原始容器的属性 lay-filter="对应的值"
if(obj.event === 'del'){
//修改操作
//obj为点击的数据对象,包含name,tel等属性
}
else if(obj.event === 'edit'){
//修改操作
}
(1)删除操作
if(obj.event === 'del'){
var delName = obj.data.name;
//在执行obj.del()执行前将要删除的用户名存储 并用于URL参数
//因为不确定执行obj.del()后是否会被释放而导致找不到数据
layer.confirm('删除成功', function(index){
obj.del();
layer.close(index);
});
window.location.href= 'delUser?delName=' + delName;
//window.location.href = 'url' JS跳转页面的方法之一
//delUser为Servlet的url , delName为要删除的用户的用户名
}
(2)修改操作
首先读清楚LayUI官方文档中关于弹窗layer.prompt(option ,yes)的使用
title:弹窗的标题
value:输入框的值,可以设定初始值
form:输入框类型
yes:回调函数function(value , index ,elem){} 获取输入框的value值执行操作
由于修改数据需要修改的字段名和修改的值两个数据,layer.prompt()弹出层又无法设定两个输入框。所以我在第一个弹窗的回调函数中再增加一个弹窗,以获取两个数据。
if(obj.event === 'edit'){
layer.prompt({
//输入字段名的弹窗
formType: 0,
value: '',
title:'请输入修改字段名'
}, function(value, index ,elem){
var field = value; //中文字段名
var fieldName = value;
var oldValue = ''; //原值
//通过输入的中文字段名判断是数据库中的哪个字段,并在obj对象中获取该字段的原值
if(field === '用户名') {
field = 'name'; oldValue = obj.data.name;}
else if(field === '电话'){
field = 'tel'; oldValue = obj.data.tel;}
else if(field === '邮箱'){
field = 'email'; oldValue = obj.data.email;}
else if(field === '昵称'){
field = 'nickName'; oldValue = obj.data.nickName;}
else if(field === '住址'){
field = 'address'; oldValue = obj.data.address;}
//修改字段的值弹窗
layer.prompt({
formType: 0,
value: oldValue, //将默认值设置为原来的值
title: '将'+fieldName+'修改为'
},function (value, index, elem){
window.location.href=
'updateUser?updateField='+field //字段名
+'&updateValue='+value //修改的值
+'&updateId=' +obj.data.id.toString();
// 跳转到Servlet服务器进行修改,数据表中id作为主键,修改数据需要id值
// 这里最将int类型的obj.data.id转换成字符串类型
layer.close(index);
})
console.log(value,index,elem);
layer.close(index);
});
}
1、通过jQuery和JS函数实现:定义一个对象类型的变量menusStatus,表示每个菜单内容是否显示
var menusStatus = {
//初始状态
indexShow : true, //首页
userTableShow : false, //用户表格
page2Show : false,
page3Show : false
}
2、定义一个函数FreshMenusStatus(),根据menusStatus对象各个内容的状态来判断是否需要显示,若有内容增加需要在该函数中多加一组if-else判断。
function FreshMenusStatus(){
//根据menusStatus对象中的值来判断元素是否显示
if(menusStatus.indexShow){
$("#indexPage").show();}
else {
$("#indexPage").hide();}
if(menusStatus.userTableShow){
$("#userTable-div").show();}
else{
$("#userTable-div").hide();}
if(menusStatus.page2Show){
$("#page2").show();}
else {
$("#page2").hide();}
}
3、这里需要再定义一个函数setStatusAllHide()(后面会用到),作用是将menusStatus中的状态(值)全部置为false。
function setStatusAllHide(){
//设置所有元素状态隐藏 for (var key in menusStatus){ menusStatus[key] = false; }}
4、对菜单指定的元素编写点击事件,这里使用jQuery中的click方法。这样就可以实现点击某个菜单并在主体内容中只显示指定的元素。
$("#userTableMenu").click(function (){
setStatusAllHide(); //将状态全部置为false menusStatus.userTableShow = true ; //再将点击的元素对应的状态设置为true FreshMenusStatus(); //刷新状态});
注意:页面加载完成时也别忘了来一个FreshMenusStatus()
window.onload =function (){
//页面加载完成获取状态 FreshMenusStatus();}
需要源码的可以从下面链接获取
文章浏览阅读2.4k次,点赞3次,收藏9次。在写qt网口通信的过程中,遇到中文就乱码。解决方法如下:1.接收端处理中文乱码代码如下 QByteArray-> QString 中文乱码解决: #include <QTextCodec>QByteArray data= tcpSocket->readAll(); QTextCodec *tc = QTextCodec::codecForName("GBK"); QString str = tc->toUnicode(data);//str如果是中文则是中文字符_qbytearray中文乱码
文章浏览阅读2.5k次,点赞2次,收藏15次。什么是 DOM?文档对象模型(Document Object Model,简称 DOM),是 W3C 组织推荐的处理可扩展标记语言(HTML或者XML)的标准编程接口。W3C 已经定义了一系列的 DOM 接口,通过这些 DOM 接口可以改变网页的内容、结构和样式DOM 树文档:一个页面就是一个文档,DOM 中使用 document 表示元素:页面中的所有标签都是元素,DOM 中使用 element 表示节点:网页中的所有内容都是节点(标签、属性、文本、注释等),DOM 中使用 node._元素事件
文章浏览阅读1.4k次,点赞3次,收藏7次。关于服务的一些基本知识,包括活动对接口的方法调用,接口实现,服务生命周期等知识。_安卓服务
文章浏览阅读7.9k次,点赞5次,收藏8次。小白式数据库连接池使用,看完拿捏数据库连接池。_采用连接池方式连接数据库
文章浏览阅读4.9k次,点赞5次,收藏36次。摘要:本文介绍了C++11中如何开启新线程,并详细讲解了线程的基础同步原语:mutex, lock_guard, unique_lock, condition variable和semaphore等。如何采用async, packaged_task和promise实现future同步机制?怎样处理spurious wakeup?本文以质数判定服务为例为大家分享C++多线程同步措施!1. C++线程和基础同步原语Thread mutex, lock_guard, unique_lock con._c++线程同步
文章浏览阅读3.3k次,点赞4次,收藏9次。STM32 GPIOx通用输入输出I/O端口的BSRR寄存器与BRR功能简述_gpiob->brr
文章浏览阅读590次。IMP-00019: row rejected due to ORACLE error 12899IMP-00003: ORACLE error 12899 encounteredORA-12899: value too large for column "CRM"."BK_ECS_ORDER_INFO_00413"."POSTSCRIPT" (actual: 895, maximum..._row rejected due to oracle
文章浏览阅读918次。目前很多Web的项目在部署的时候会采用Nginx做为前端的反向代理服务器,后端会部署很多业务处理服务器,通常情况下Nginx代理服务器部署的还是比较少,而且其以高效性能著称,几万的并发连接处理速度都不在话下。然而去年的时候,我们的线上系统也采用类似的部署结构,同时由于我们的业务需求,Nginx的部署环境在虚拟机上面,复用了其他虚拟机的整体磁盘,在高IO消耗的场景中,我们发现Nginx的磁盘_nginx tcp转发 硬盘io
文章浏览阅读645次。Activiti 开发环境的搭建非常简单,主要分为 Activiti runtime 的安装以及 Eclipse 开发环境的配置。本文以 Windows 平台为例介绍 Activiti 5.8 版的开发环境的搭建配置过程。Activiti 的运行时程序可以从http://www.activiti.org/download.html 下载,目前最新版本为 5.8。为了配置使用 Activ_antdev activity
文章浏览阅读2.3k次。1. Vuex 是什么?Vuex 是专门为Vue 组件化思想带来的组件间通信问题提供的解决方案,主要解决以下两个问题:多个视图依赖于同一状态 来自不同视图的行为需要变更同一状态2. 核心概念State: 可以简单理解为Vue 维持的全局变量(状态)。 Getter: 获取State 中的状态的方法,可以在取出前对数据进行二次处理。 Mutation: 是改变State 中的状态..._vuex的组件同级通信
文章浏览阅读8.4k次,点赞31次,收藏33次。逆向中常常出现一些加密算法,如果我们能对这些加密算法进行快速识别则会大大减少我们逆向的难度,虽然IDA已有密码分析神器Findcrypt,但掌握手动分析方法能帮助我们应对更多的情况。这篇文章将介绍逆向中常见的单项散列算法和对称加密算法的识别方法。0xFF. 前言在很长一段时间里我经常发现自己面对复杂的加密算法无从下手,可能是因为还没有系统学过密码学吧orz,总之这个问题困扰了我很久。于是最近我花了一些时间来解决自己在密码学这块的薄弱点,写下这篇文章的目的之一也是为了巩固所学知识。加密算法的部分没有_findcrypt3 支持哪些算法
文章浏览阅读5.3k次。smplayerThere are lots of video players out there, but one that we think gets overlooked is SMPlayer. It can do anything other video players can do and even more – like remembering where you left off ..._sm69影视