热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

员工管理系统,实现增删改查!

学完了servlet、数据库、以及之前的jsp。我们可以做一个管理系统,将知识综合起来运用!一、创建数据库,表名easyui。二、实现增删

学完了servlet、数据库、以及之前的jsp。我们可以 做一个管理系统,将知识综合起来运用!

一、创建数据库,表名 easyui。

二、实现增删改查。

1.新建web项目,导入所需要的4个包 

 

2.包的分层  工具包将之前的复制过来就好了。

dao部分  创建  接口和 实现类。实现类在dao包下新建包impl。

package com.aaa.dao;import com.aaa.entity.Employee;import java.util.List;
import java.util.Map;public interface IDengDAO {boolean goDeng(String username,String password);//查询所有员工List> getAll();//添加员工的方法boolean add(Employee emp);//删除员工的方法boolean delete(int id);//修改员工的方法boolean update(Employee emp);//根据id 获取员工MapgetEmp(int id);}

impl部分

package com.aaa.dao.Impl;import com.aaa.dao.IDengDAO;
import com.aaa.entity.Employee;
import com.aaa.util.DBUtil;import java.util.List;
import java.util.Map;public class DengDAOImpl implements IDengDAO {@Overridepublic boolean goDeng(String username, String password) {String sql="select * from login where username=? and password=?";List> list = DBUtil.executeQuery(sql, username, password);return list.size()>0;}@Overridepublic List> getAll() {String sql = "select e.id,e.name,e.telephone,e.hiredate,e.state,d.name dname,r.name rname from employee e INNER JOIN department d on e.deptID = d.id INNER JOIN role r on e.roleID = r.id";return DBUtil.executeQuery(sql);}@Overridepublic boolean add(Employee emp) {String sql = "insert into employee (name,telephone,deptID,roleID,state) values (?,?,?,?,?)";return DBUtil.executeUpdate(sql,emp.getName(),emp.getTelephone(),emp.getDeptID(),emp.getRoleID(),emp.getState());}@Overridepublic boolean delete(int id) {String sql = "delete from employee where id = ?";return DBUtil.executeUpdate(sql, id);}@Overridepublic boolean update(Employee emp) {String sql = "update employee set name = ? , telephone = ? , deptID=? , roleID=? ,state = ? where id = ?";return DBUtil.executeUpdate(sql,emp.getName(),emp.getTelephone(),emp.getDeptID(),emp.getRoleID(),emp.getState(),emp.getId());}@Overridepublic Map getEmp(int id) {String sql = "select * from employee where id = ?";List> list = DBUtil.executeQuery(sql, id);if(list.size()>0){return list.get(0);}return null;}
}

entity实体类部分

package com.aaa.entity;public class Employee {private int id;private String name;private String telephone;private int deptID;private int roleID;private int state;public Employee() {}public Employee(int id, String name, String telephone, int deptID, int roleID, int state) {this.id = id;this.name = name;this.telephone = telephone;this.deptID = deptID;this.roleID = roleID;this.state = state;}public Employee(String name, String telephone, int deptID, int roleID, int state) {this.name = name;this.telephone = telephone;this.deptID = deptID;this.roleID = roleID;this.state = state;}public int getId() {return id;}public void setId(int id) {this.id = id;}public String getName() {return name;}public void setName(String name) {this.name = name;}public String getTelephone() {return telephone;}public void setTelephone(String telephone) {this.telephone = telephone;}public int getDeptID() {return deptID;}public void setDeptID(int deptID) {this.deptID = deptID;}public int getRoleID() {return roleID;}public void setRoleID(int roleID) {this.roleID = roleID;}public int getState() {return state;}public void setState(int state) {this.state = state;}@Overridepublic String toString() {return "Employee{" +"id=" + id +", name='" + name + '\'' +", telephone='" + telephone + '\'' +", deptID=" + deptID +", roleID=" + roleID +", state=" + state +'}';}
}

3.创建登录界面index.jsp,在web目下。并创建LoginServlet  进行业务操作。

<%--Created by IntelliJ IDEA.User: AdministratorDate: 2019/4/18Time: 20:06To change this template use File | Settings | File Templates.
--%>
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<html><head><%-- 此时 这里仅仅只是登录界面 不通过servlet 用户直接在浏览器中访问index.jsp --%><title>用户登录界面title><style>fieldset{width: 300px;margin: 100px auto;}style>head><body><fieldset><legend>用户登录legend><%--密码错误 通过 error 关键字 获得 错误提示信息--%><div style&#61;"color: red">${error}div><%--提交的地址 是我们所写的loginServlet 注意路径格式--%><form action&#61;"/zxf/deng" method&#61;"post"><div>姓名&#xff1a;<input type&#61;"type" name&#61;"username"/>div><div>密码&#xff1a;  <input type&#61;"password" name&#61;"password"/>div><button >登录button>form>fieldset>body>
html>

package com.aaa.servelt;import com.aaa.dao.IDengDAO;
import com.aaa.dao.Impl.DengDAOImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
&#64;WebServlet(
"/deng") //虚拟路径 form表单的提交地址 /zxf/deng
public class LoginServlet extends HttpServlet {&#64;Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException{//1.获取 我们在登录界面 输入的密码和用户名String username &#61; req.getParameter("username");String password &#61; req.getParameter("password");//2.调用dao方法进行验证IDengDAO dao&#61;new DengDAOImpl();boolean goDeng &#61; dao.goDeng(username, password);//3.判断密码 是否正确if (goDeng){//4.正确 重定向 到main.jsp页面resp.sendRedirect("/zxf/main.jsp");}else{//5.错误 共享数据 请求转发到 index.jspreq.setAttribute("error","账号密码错误&#xff0c;请重试&#xff01;");req.getRequestDispatcher("/index.jsp").forward(req,resp);}}
}

登录不成功  会提示错误。登陆成功&#xff0c;就跳转到main.jsp部分

<%--Created by IntelliJ IDEA.User: AdministratorDate: 2019/4/18Time: 20:53To change this template use File | Settings | File Templates.
--%>
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<html>
<head><title>员工数据库系统title><style>ul,iframe{float: left;}ul{width: 15%;}iframe{width: 80%;}style>
head>
<body><h1>欢迎来到员工管理系统h1><div><ul><li><a href&#61;"/zxf/emp" target&#61;"show">员工管理a>li><li><a href&#61;"/zxf/add.jsp" target&#61;"show">添加员工a>li>ul><iframe name&#61;"show" height&#61;"800px">iframe>div>
body>
html>

点击员工管理&#xff0c;跳转到

package com.aaa.servelt;import com.aaa.dao.IDengDAO;
import com.aaa.dao.Impl.DengDAOImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;
import java.util.Map;&#64;WebServlet("/emp") //main.jsp 的员工管理 跳转到这
public class EmpServlet extends HttpServlet {&#64;Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取所有数据IDengDAO dao&#61;new DengDAOImpl();List> list &#61; dao.getAll();//共享数据req.setAttribute("list",list);//请求转发req.getRequestDispatcher("/emp.jsp").forward(req,resp);}
}

转发到 emp.jsp

<%--Created by IntelliJ IDEA.User: AdministratorDate: 2019/4/19Time: 16:37To change this template use File | Settings | File Templates.
--%>
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<%&#64; taglib uri&#61;"http://java.sun.com/jsp/jstl/core" prefix&#61;"c"%>
<html>
<head><title>Titletitle>
head>
<body>
<table border&#61;"1" cellspacing&#61;"0" width&#61;"95%" align&#61;"center"><tr><th>员工编号th><th>员工姓名th><th>员工手机号th><th>入职时间th><th>员工部门th><th>员工角色th><th>员工状态th><th>员工操作th>tr><c:forEach var&#61;"emp" items&#61;"${list}"><tr><th>${emp.id}th><th>${emp.name}th><th>${emp.telephone}th><th>${emp.hiredate}th><th>${emp.dname}th><th>${emp.rname}th><th>${emp.state&#61;&#61;1?"在职":"离职"}th><th><%-- 修改和删除 有各自要跳转的servlet页面--%><a href&#61;"/zxf/delete?id&#61;${emp.id}">删除a><a href&#61;"/zxf/toUpdate?id&#61;${emp.id}">修改a>th>tr>c:forEach>table>
body>
html>

点节删除  跳转到DeleteEmpServlet

package com.aaa.servelt;import com.aaa.dao.IDengDAO;
import com.aaa.dao.Impl.DengDAOImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
&#64;WebServlet(
"/delete")
public class DeleteEmpServlet extends HttpServlet {&#64;Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求参数String id &#61; req.getParameter("id");//调用dao 根据id删除员工。IDengDAO dao&#61;new DengDAOImpl();boolean delete &#61; dao.delete(Integer.parseInt(id));//重定向到 empresp.sendRedirect("/zxf/emp");}
}

点击修改员工 &#xff0c;跳转到ToUpdateServlet

package com.aaa.servelt;import com.aaa.dao.IDengDAO;
import com.aaa.dao.Impl.DengDAOImpl;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Map;&#64;WebServlet("/toUpdate")
/*修改 用户点击修改按钮请求到servlet先要获取 要修改的员工信息 共享给jsp 请求转发过去 展示给用户看*/
public class ToUpdate extends HttpServlet {&#64;Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取参数String id &#61; req.getParameter("id");//根据ID获取员工信息IDengDAO dao&#61;new DengDAOImpl();Map emp&#61; dao.getEmp(Integer.parseInt(id));//共享员工信息req.setAttribute("emp",emp);//请求转发req.getRequestDispatcher("/update.jsp").forward(req,resp);}
}

他会请求转发到 update.jsp

<%--Created by IntelliJ IDEA.User: AdministratorDate: 2019/4/18Time: 9:14To change this template use File | Settings | File Templates.
--%>
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<html>
<head><title>修改title><style type&#61;"text/css">fieldset{width: 300px;margin: 100px auto;}style>
head>
<body>
<fieldset id&#61;""><legend>修改员工legend><form action&#61;"/zxf/update" method&#61;"post"><input type&#61;"hidden" name&#61;"id" value&#61;"${emp.id}" /><div>员工姓名&#xff1a; <input name&#61;"name" value&#61;"${emp.name}" />div><div>员工手机&#xff1a; <input name&#61;"telephone" value&#61;"${emp.telephone}" />div><div>员工部门&#xff1a;<select name&#61;"deptID" id&#61;"deptID" ><option value&#61;"1" ${emp.deptID&#61;&#61;1?"selected":""} >总经办option><option value&#61;"2" ${emp.deptID&#61;&#61;2?"selected":""} >人事部option><option value&#61;"3" ${emp.deptID&#61;&#61;3?"selected":""} >业务部option>select>div><div>员工角色&#xff1a;<select name&#61;"roleID" id&#61;"roleID" ><option value&#61;"1" id&#61;"r1">超级管理员option><option value&#61;"2" id&#61;"r2">员工管理员option><option value&#61;"3" id&#61;"r3">业务管理员option>select>div><div>员工状态&#xff1a;<select name&#61;"state" ><option value&#61;"0" id&#61;"s0">离职option><option value&#61;"1" id&#61;"s1">在职option>select>div><button>修改button>form>fieldset>
<script>// 当前表单的表单元素 够不够// 让 角色下拉框中的 1 2 3
document.getElementById("r"&#43;${emp.roleID}).selected &#61; "selected";document.getElementById("s"&#43;${emp.state}).selected &#61; "selected";
script>body>
html>

这里的jsp页面会跳转到UpdateServlet

package com.aaa.servelt;import com.aaa.dao.IDengDAO;
import com.aaa.dao.Impl.DengDAOImpl;
import com.aaa.entity.Employee;import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
&#64;WebServlet(
"/update")
public class UpdateEmpServlet extends HttpServlet {&#64;Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//获取请求参数 处理请求乱码req.setCharacterEncoding("UTF-8");req.setCharacterEncoding("UTF-8");// 1 获取请求参数String name &#61; req.getParameter("name");String telephone &#61; req.getParameter("telephone");String deptID &#61; req.getParameter("deptID");String roleID &#61; req.getParameter("roleID");String state &#61; req.getParameter("state");String id &#61; req.getParameter("id");Employee employee &#61; new Employee(Integer.parseInt(id), name, telephone, Integer.parseInt(deptID), Integer.parseInt(roleID), Integer.parseInt(state));//2 通过dao将数据添加到数据库中IDengDAO dao&#61;new DengDAOImpl();boolean update &#61; dao.update(employee);//3 重定向到/empresp.sendRedirect("/zxf/emp");}
}

他又回到了emp  就是EmpServlet。

到此 删除和修改的功能完成。

回到 man.jsp 点击添加 员工。他会跳转到 add.jsp 页面

<%--Created by IntelliJ IDEA.User: AdministratorDate: 2019/4/17Time: 11:48To change this template use File | Settings | File Templates.
--%>
<%&#64; page contentType&#61;"text/html;charset&#61;UTF-8" language&#61;"java" %>
<html>
<head><title>Titletitle><style type&#61;"text/css">fieldset{width: 300px;margin: 100px auto;}style>
head>
<body><fieldset id&#61;""><legend>添加员工legend><%-- 跳转到 /zxf/addEmp 这个servlet--%><form action&#61;"/zxf/addEmp" method&#61;"post"><div>员工姓名&#xff1a; <input name&#61;"name" />div><div>员工手机&#xff1a; <input name&#61;"telephone" />div><div>员工部门&#xff1a;<select name&#61;"deptID"><option value&#61;"1">总经办option><option value&#61;"2">人事部option><option value&#61;"3">业务部option>select>div><div>员工角色&#xff1a;<select name&#61;"roleID"><option value&#61;"1">超级管理员option><option value&#61;"2">员工管理员option><option value&#61;"3">业务管理员option>select>div><div>员工状态&#xff1a;<select name&#61;"state"><option value&#61;"0">离职option><option value&#61;"1">在职option>select>div><button>添加button>form>fieldset>body>
html>

这里的jsp 会跳转到AddServlet

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
&#64;WebServlet(
"/addEmp")
public class AddEmpServlet extends HttpServlet {&#64;Overrideprotected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {//处理1.请求乱码---->浏览器发给 servlet 乱码// 2.响应乱码----->servlet 回传给浏览器之后乱码 不用处理 为啥&#xff1f; 因为我们将其交给了 jsp 来解决&#xff01;req.setCharacterEncoding("utf-8");// 1 获取请求参数String name &#61; req.getParameter("name");String telephone &#61; req.getParameter("telephone");String deptID &#61; req.getParameter("deptID");String roleID &#61; req.getParameter("roleID");String state &#61; req.getParameter("state");Employee employee &#61; new Employee(name,telephone,Integer.parseInt(deptID),Integer.parseInt(roleID),Integer.parseInt(state));// 2 调用dao 将数据添加到数据库中IDengDAO dao&#61;new DengDAOImpl();dao.add(employee);// 3 回传信息 成功/失败req.setAttribute("msg","添加成功");// 4 请求转发到 add.jspreq.getRequestDispatcher("/add.jsp").forward(req,resp);}
}

这里会将数据 传送给add.jsp。

好了&#xff0c;添加员工完成!  增删改查实现&#xff0c;舒服。

 

三、总结。

  1.jsp是用来展示数据的

  2.servlet 是用来进行业务操作的  请求转发和重定向。

  3.bug虽然痛苦&#xff0c;但自己解决 的时候&#xff0c;也很开心。-------菜鸟的心得&#xff01;

 

四&#xff0c;展示所有的文件目录

  

 

转:https://www.cnblogs.com/ZXF6/p/10738961.html



推荐阅读
  • 在Android应用开发中,实现与MySQL数据库的连接是一项重要的技术任务。本文详细介绍了Android连接MySQL数据库的操作流程和技术要点。首先,Android平台提供了SQLiteOpenHelper类作为数据库辅助工具,用于创建或打开数据库。开发者可以通过继承并扩展该类,实现对数据库的初始化和版本管理。此外,文章还探讨了使用第三方库如Retrofit或Volley进行网络请求,以及如何通过JSON格式交换数据,确保与MySQL服务器的高效通信。 ... [详细]
  • 本指南介绍了如何在ASP.NET Web应用程序中利用C#和JavaScript实现基于指纹识别的登录系统。通过集成指纹识别技术,用户无需输入传统的登录ID即可完成身份验证,从而提升用户体验和安全性。我们将详细探讨如何配置和部署这一功能,确保系统的稳定性和可靠性。 ... [详细]
  • Python 伦理黑客技术:深入探讨后门攻击(第三部分)
    在《Python 伦理黑客技术:深入探讨后门攻击(第三部分)》中,作者详细分析了后门攻击中的Socket问题。由于TCP协议基于流,难以确定消息批次的结束点,这给后门攻击的实现带来了挑战。为了解决这一问题,文章提出了一系列有效的技术方案,包括使用特定的分隔符和长度前缀,以确保数据包的准确传输和解析。这些方法不仅提高了攻击的隐蔽性和可靠性,还为安全研究人员提供了宝贵的参考。 ... [详细]
  • 优化后的标题:深入探讨网关安全:将微服务升级为OAuth2资源服务器的最佳实践
    本文深入探讨了如何将微服务升级为OAuth2资源服务器,以订单服务为例,详细介绍了在POM文件中添加 `spring-cloud-starter-oauth2` 依赖,并配置Spring Security以实现对微服务的保护。通过这一过程,不仅增强了系统的安全性,还提高了资源访问的可控性和灵活性。文章还讨论了最佳实践,包括如何配置OAuth2客户端和资源服务器,以及如何处理常见的安全问题和错误。 ... [详细]
  • Python 程序转换为 EXE 文件:详细解析 .py 脚本打包成独立可执行文件的方法与技巧
    在开发了几个简单的爬虫 Python 程序后,我决定将其封装成独立的可执行文件以便于分发和使用。为了实现这一目标,首先需要解决的是如何将 Python 脚本转换为 EXE 文件。在这个过程中,我选择了 Qt 作为 GUI 框架,因为之前对此并不熟悉,希望通过这个项目进一步学习和掌握 Qt 的基本用法。本文将详细介绍从 .py 脚本到 EXE 文件的整个过程,包括所需工具、具体步骤以及常见问题的解决方案。 ... [详细]
  • 本文详细介绍了在 Oracle 数据库中使用 MyBatis 实现增删改查操作的方法。针对查询操作,文章解释了如何通过创建字段映射来处理数据库字段风格与 Java 对象之间的差异,确保查询结果能够正确映射到持久层对象。此外,还探讨了插入、更新和删除操作的具体实现及其最佳实践,帮助开发者高效地管理和操作 Oracle 数据库中的数据。 ... [详细]
  • 基于试题数据的智能化管理平台采用Java语言进行面向对象编程,旨在构建一个高效的试题信息管理系统。该系统在JDK 6.0和MyEclipse 10.6环境下开发,通过优化试题数据管理和处理流程,提升系统的稳定性和用户体验。平台支持多用户操作,具备强大的数据处理能力和灵活的扩展性,适用于各类教育机构和考试组织。 ... [详细]
  • Web开发框架概览:Java与JavaScript技术及框架综述
    Web开发涉及服务器端和客户端的协同工作。在服务器端,Java是一种优秀的编程语言,适用于构建各种功能模块,如通过Servlet实现特定服务。客户端则主要依赖HTML进行内容展示,同时借助JavaScript增强交互性和动态效果。此外,现代Web开发还广泛使用各种框架和库,如Spring Boot、React和Vue.js,以提高开发效率和应用性能。 ... [详细]
  • 使用Maven JAR插件将单个或多个文件及其依赖项合并为一个可引用的JAR包
    本文介绍了如何利用Maven中的maven-assembly-plugin插件将单个或多个Java文件及其依赖项打包成一个可引用的JAR文件。首先,需要创建一个新的Maven项目,并将待打包的Java文件复制到该项目中。通过配置maven-assembly-plugin,可以实现将所有文件及其依赖项合并为一个独立的JAR包,方便在其他项目中引用和使用。此外,该方法还支持自定义装配描述符,以满足不同场景下的需求。 ... [详细]
  • 本文将继续探讨 JavaScript 函数式编程的高级技巧及其实际应用。通过一个具体的寻路算法示例,我们将深入分析如何利用函数式编程的思想解决复杂问题。示例中,节点之间的连线代表路径,连线上的数字表示两点间的距离。我们将详细讲解如何通过递归和高阶函数等技术实现高效的寻路算法。 ... [详细]
  • 本文深入探讨了Java多线程环境下的同步机制及其应用,重点介绍了`synchronized`关键字的使用方法和原理。`synchronized`关键字主要用于确保多个线程在访问共享资源时的互斥性和原子性。通过具体示例,如在一个类中使用`synchronized`修饰方法,展示了如何实现线程安全的代码块。此外,文章还讨论了`ReentrantLock`等其他同步工具的优缺点,并提供了实际应用场景中的最佳实践。 ... [详细]
  • 本文介绍了如何利用ObjectMapper实现JSON与JavaBean之间的高效转换。ObjectMapper是Jackson库的核心组件,能够便捷地将Java对象序列化为JSON格式,并支持从JSON、XML以及文件等多种数据源反序列化为Java对象。此外,还探讨了在实际应用中如何优化转换性能,以提升系统整体效率。 ... [详细]
  • 开发日志:201521044091 《Java编程基础》第11周学习心得与总结
    开发日志:201521044091 《Java编程基础》第11周学习心得与总结 ... [详细]
  • 在深入掌握Spring框架的事务管理之前,了解其背后的数据库事务基础至关重要。Spring的事务管理功能虽然强大且灵活,但其核心依赖于数据库自身的事务处理机制。因此,熟悉数据库事务的基本概念和特性是必不可少的。这包括事务的ACID属性、隔离级别以及常见的事务管理策略等。通过这些基础知识的学习,可以更好地理解和应用Spring中的事务管理配置。 ... [详细]
  • 本指南从零开始介绍Scala编程语言的基础知识,重点讲解了Scala解释器REPL(读取-求值-打印-循环)的使用方法。REPL是Scala开发中的重要工具,能够帮助初学者快速理解和实践Scala的基本语法和特性。通过详细的示例和练习,读者将能够熟练掌握Scala的基础概念和编程技巧。 ... [详细]
author-avatar
手机用户2602930681
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有