XX网站搭建全程
程序员文章站
2022-05-31 20:56:59
...
本博客记录了接单全程
项目流程
- 与客户沟通,确定需求,如果客户需求不定,就根据客户需要的功能以及应用范围制定出需求范本给客户看
- 客户确定最终需求
- 商量开发费用与周期,一般是定金40%,后期的自行商量
- 数据库设计
- 选前端页面框架,设计好前端页面,网上一大堆模板资源,挑选出来合适的给客户选择
- 整体规划一下,具体从何做起
环境与技术
- Java:java8
- Tomcat:tomcat8
- 页面:jsp页面
- 数据库:mysql5.5
- 框架:基于servlet和jsp
- 调试浏览器:Google Chrome浏览器
- 系统:win10或者linux
- 前端:layui(成本低)
1. 背景
产品名称:医疗科技公司网站
最终用户:网站管理人员及网上用户
2. 用户特点
本网站的用户都是网络用户,包括两大类,一类是访问者,另一类是企业网站管理人员。
3. 角色定义:
角色是指与系统产生交互的外部用户或者外部系统。
网站角色有两类,访问者,企业管理员。外部系统为数据库。
4. 角色定义:系统主要用例
此网站可以分为两个主要组成部分,一个是客户端子系统,一个是管理端子系统。客户端子系统功能主要是指网*问者对于网站的访问与信息查询等。管理端子系统的功能主要是对网站信息进行管理。
5. 功能描述
1) 访问者:
仅能访问公司网站的公开信息部分
2) 网站管理者
所有网站管理者均可以对订单以及网站页面信息进行操作(为保信息安全,每一次操作都会产生对应一条记录保存操作者的信息)
对于所有管理者:
a) 联系方式增删改查
b) 网站主页滚动图片管理
c) 注册登录
d) 公司介绍管理
e) 公司档案信息管理
f) 公司荣誉资质管理
g) 公司相册管理
h) 订单管理(即采购清单管理)
i) 招商代理管理
j) 产品管理
i. 产品推荐设置
ii. 供应产品设置
iii. 产品分类管理
对于网站顶层管理者:
a) 人员管理(对已注册的管理员或者未注册的准管理员进行信息管理,防止数据库人员信息只进不出)
目录结构
web配置
防止sql注入过滤器
<filter>
<filter-name>SqlInjectFilter</filter-name>
<filter-class>com.jianxiao.util.SqlInjectFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>SqlInjectFilter</filter-name>
<url-pattern>/ *</url-pattern>
</filter-mapping>
package com.jianxiao.util;
import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
public class SqlInjectFilter implements Filter {
public void destroy() {
}
public void init(FilterConfig arg0) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) res;
// 获得所有请求参数名
Enumeration params = request.getParameterNames();
String sql = "";
while (params.hasMoreElements()) {
// 得到参数名
String name = params.nextElement().toString();
// 得到参数对应值
String[] value = request.getParameterValues(name);
for (int i = 0; i < value.length; i++) {
sql = sql + value[i];
}
}
if (sqlValidate(sql)) {
// throw new IOException("您发送请求中的参数中含有非法字符");
sql = "null";
} else {
chain.doFilter(request, response);
}
}
/**
* 参数校验
*
* @param str
*/
public static boolean sqlValidate(String str) {
str = str.toLowerCase();// 统一转为小写
System.out.println("这是----->"+str);
String badStr = "select.update.and.delete.insert.truncate.char.into.substr.ascii.declare.exec.count.master.into.drop.execute.table";
String[] badStrs = badStr.split("\\.");
for (int i = 0; i < badStrs.length; i++) {
// System.out.println("这是badStr----->"+badStrs[i]);
// 循环检测,判断在请求参数当中是否包含SQL关键字
if (str.indexOf(badStrs[i]) >= 0) {
System.out.println("被拦截!"+badStrs[i]);
return true;
}
}
return false;
}
}
登录拦截器
<filter>
<filter-name>MyInterceptor</filter-name>
<filter-class>com.jianxiao.interceptors.MyInterceptor</filter-class>
</filter>
<filter-mapping>
<filter-name>MyInterceptor</filter-name>
<url-pattern>/ *</url-pattern>
</filter-mapping>
package com.jianxiao.interceptors;
import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Date;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import com.jianxiao.dao.LogDao;
import com.jianxiao.impl.LogDaoimpl;
import com.jianxiao.po.User;
public class MyInterceptor implements Filter {
/**
* 拦截器
*/
// 不拦截的请求
private static final String[] IGNORE_URI = { "jumpIndex", "jumpProduct", "jumpCDetail", "jumpCertification",
"zhaoShanginfo", "shoppingList", "jumpToAlbum", "goToliuYan", "goToDangAn", "layui", "login", "loginJudge","quit","myJs","img",
"res", "jumpZhuCe", "goToZhuCe", "alupload", "upload", "zsupload", "ceupload", "getShoppingList" };
private static final String[] SUPER_URI = { "memberList", "getMember", "memberUpdate", "memberAdd", "memberInsert",
"logList", "getLog"
};
private LogDao logDao = new LogDaoimpl();
@Override
public void destroy() {
// TODO Auto-generated method stub
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
HttpServletResponse resp = (HttpServletResponse) servletResponse;
// 把用户提交的数据的编码统一为utf-8
req.setCharacterEncoding("utf-8");
// 把servlet打印输入的内容先设定为html
resp.setContentType("text/html");
// 设置输出信息的编码为utf-8
resp.setCharacterEncoding("utf-8");
String servletPath = req.getServletPath();
String XRequested = req.getHeader("X-Requested-With");
// PrintWriter out = resp.getWriter();
System.out.println("----请求的路径servletPath----------------" + servletPath);
System.out.println(
"路径-->" + req.getRequestURI() + "--servletPath--->" + servletPath + "----XRequested---->" + XRequested);
// flag 为true的话,通过,为false重新登录
boolean flag = false;
HttpSession session = req.getSession();
User user = (User) session.getAttribute("user");
if (user != null) {
// 进入日志 操作人为user
String logsql = "insert into log (action,time,person) values(?,?,?)";
SimpleDateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");// 设置日期格式
String time = df.format(new Date());
String person = user.getuName();
String action = null;
switch (servletPath) {
case "/loginJudge":
action = "登录";
System.out.println(action);
break;
case "/getMember":
action = "浏览人员";
break;
case "/memberUpdate":
action = "更新人员";
break;
case "/memberInsert":
action = "添加人员";
break;
case "/categoryList":
action = "浏览产品类别";
break;
case "/categoryUpdate":
action = "编辑产品类别";
break;
case "/categoryDelete":
action = "删除产品类别";
break;
case "/categoryInsert":
action = "插入产品类别";
break;
case "/productList":
action = "浏览产品";
break;
case "/productInsert":
action = "插入产品";
break;
case "/productUpdateSome":
action = "更改产品开关";
break;
case "/productUpdate":
action = "编辑产品";
break;
case "/productDelete":
action = "删除产品";
break;
case "/getOrders":
action = "浏览订单";
break;
case "/orderInsert":
action = "插入订单";
break;
case "/orderEdit":
action = "编辑订单";
break;
case "/getShoppingList":
action = "浏览采购订单";
break;
case "/editShoppingList":
action = "编辑采购订单";
break;
case "/shoppingListInsert":
action = "添加采购订单";
break;
case "/shoppingInsert":
action = "批量导入采购订单";
break;
case "/certificationList":
action = "浏览荣誉资质";
break;
case "/certificationUpdate":
action = "编辑荣誉资质";
break;
case "/certificationDelete":
action = "删除荣誉资质";
break;
case "/certificationInsert":
action = "添加荣誉资质";
break;
case "/jumpAlbumList":
action = "浏览公司相册";
break;
case "/albumInsert":
action = "添加公司相册图片";
break;
case "/jumpAlbumEdit":
action = "修改公司相册";
break;
case "/albumDelete":
action = "删除公司相册";
break;
case "/jumpZhaoShangList":
action = "浏览招商列表";
break;
case "/zhaoShangInsert":
action = "添加招商信息";
break;
case "/jumpZhaoShangEdit":
action = "编辑招商信息";
break;
case "/zhaoShangDelete":
action = "删除招商信息";
break;
case "/contactUs":
action = "浏览联系方式";
break;
case "/contactUpdate":
action = "修改联系方式";
break;
case "/cDetailList":
action = "浏览公司详情";
break;
case "/cDetailUpdate":
action = "编辑/删除/添加公司详情";
break;
case "/jumpCDetailAdd":
action = "跳转到添加公司详情";
break;
case "/cFileList":
action = "浏览公司档案";
break;
case "/cFileUpdate":
action = "编辑公司档案";
break;
case "/jumpLiuYan":
action = "浏览留言";
break;
case "/liuYanDelete":
action = "删除留言";
break;
}
Object param[]=new Object[3];
param[0]=action;
param[1]=time;
param[2]=person;
System.out.println("操作--"+action);
if(action!=null) {
logDao.insert(param, logsql);
}
}
if ("XMLHttpRequest".equals(XRequested) && user != null) {
flag = true;
chain.doFilter(servletRequest, servletResponse);
} else {
// 如果不是ajax请求,判断是否需要拦截
for (String s : IGNORE_URI) {
if (servletPath.contains(s)) {
// System.out.println("----请求的路径servletPath----------------" + servletPath);
chain.doFilter(servletRequest, servletResponse);
flag = true;
break;
}
}
// 需要拦截
if (!flag) {
if (user != null) {
if (user.getuGrade().equals("1")) {
chain.doFilter(servletRequest, servletResponse);
return;
} else {
// 判断访问的路径是否涉及到一级管理员,如果涉及到一级管理员弹窗提示越权!
// 判断当前访问的路径里边是否有一级管理员的专属路径
for (String s : SUPER_URI) {
if (servletPath.contains(s)) {
System.out.println("----请求的路径servletPath----------------" + servletPath);
req.getRequestDispatcher("WEB-INF/backstage/index2.jsp").forward(req, resp);
break;
} else {
chain.doFilter(servletRequest, servletResponse);
return;
}
}
}
}else {
resp.sendRedirect("login");
}
}
}
}
@Override
public void init(FilterConfig arg0) throws ServletException {
// TODO Auto-generated method stub
}
}
路径映射
没有采用注解的方式,采用的配置的方式,类似于下面
<servlet>
<servlet-name>GoToFinalIndex</servlet-name>
<servlet-class>com.jianxiao.action.GoToFinalIndex</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>GoToFinalIndex</servlet-name>
<url-pattern>/goToFinalIndex</url-pattern>
</servlet-mapping>
具体项目代码就不写了,很简单的增删改查,由于没有使用框架,开发起来相当费劲,客户要求的原生的servlet。。。写此博客只为了给大家像我一样的小白提供些思路
下面展示下成果,大家见笑了