欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

XX网站搭建全程

程序员文章站 2022-05-31 20:56:59
...


本博客记录了接单全程

项目流程

  1. 与客户沟通,确定需求,如果客户需求不定,就根据客户需要的功能以及应用范围制定出需求范本给客户看
  2. 客户确定最终需求
  3. 商量开发费用与周期,一般是定金40%,后期的自行商量
  4. 数据库设计
  5. 选前端页面框架,设计好前端页面,网上一大堆模板资源,挑选出来合适的给客户选择
  6. 整体规划一下,具体从何做起

环境与技术

  1. Java:java8
  2. Tomcat:tomcat8
  3. 页面:jsp页面
  4. 数据库:mysql5.5
  5. 框架:基于servlet和jsp
  6. 调试浏览器:Google Chrome浏览器
  7. 系统:win10或者linux
  8. 前端:layui(成本低)

1. 背景

产品名称:医疗科技公司网站
最终用户:网站管理人员及网上用户

2. 用户特点

本网站的用户都是网络用户,包括两大类,一类是访问者,另一类是企业网站管理人员。

3. 角色定义:

角色是指与系统产生交互的外部用户或者外部系统。
网站角色有两类,访问者,企业管理员。外部系统为数据库。

4. 角色定义:系统主要用例

此网站可以分为两个主要组成部分,一个是客户端子系统,一个是管理端子系统。客户端子系统功能主要是指网*问者对于网站的访问与信息查询等。管理端子系统的功能主要是对网站信息进行管理。

XX网站搭建全程
XX网站搭建全程

5. 功能描述

1) 访问者:
仅能访问公司网站的公开信息部分
2) 网站管理者
所有网站管理者均可以对订单以及网站页面信息进行操作(为保信息安全,每一次操作都会产生对应一条记录保存操作者的信息)
对于所有管理者:

a) 联系方式增删改查
b) 网站主页滚动图片管理
c) 注册登录
d) 公司介绍管理
e) 公司档案信息管理
f) 公司荣誉资质管理
g) 公司相册管理
h) 订单管理(即采购清单管理)
i) 招商代理管理

j) 产品管理
i. 产品推荐设置
ii. 供应产品设置
iii. 产品分类管理
对于网站顶层管理者:
a) 人员管理(对已注册的管理员或者未注册的准管理员进行信息管理,防止数据库人员信息只进不出)

目录结构

XX网站搭建全程
XX网站搭建全程

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。。。写此博客只为了给大家像我一样的小白提供些思路
下面展示下成果,大家见笑了

XX网站搭建全程
XX网站搭建全程
XX网站搭建全程
XX网站搭建全程
XX网站搭建全程
XX网站搭建全程
XX网站搭建全程
XX网站搭建全程

相关标签: 开发 java web