• 管理系统-------------SSH框架书写登录和显示用户


    一、思路的穿插。

        web.xml中的配置找到--->application.xml---->找到对应的Action---->找到struts.xml----->在去找action----->service的实现类---->dao的impl实现类。

    二、SSH框架整合需要的jar

      

        

    三、实现登录

      (一)、创建实体

    /*
     * 员工表
     * */
    @Entity
    @Table(name="sys_employee")
    public class Employee {
        @Id
        @GeneratedValue
        private String  Sn;//员工编号
        private Integer Position_id;//岗位编号
        private Integer Department_id;//部门编号
        private String Name;//员工姓名
        private String Password;//密码
        private String Stuatus;//状态
        @ManyToOne(fetch=FetchType.LAZY)//和岗位表是多对一的关系
        @JoinColumn(name="Posiid")
        private Position position;
        
        
        @ManyToOne(fetch=FetchType.LAZY)
        private Department department;

      //省get/set方法 }
    /*
     * 岗位表
     * */
    @Entity
    @Table(name="sys_position")
    public class Position {
        @Id
        @GeneratedValue
        @Column(name="ID")
         private Integer Posiid;//岗位编号
        @Column(name="NAME_CN")
         private String Name_cn;//岗位名称(中文)
        @Column(name="NAME_EN")
         private String Name_en;//岗位名称(英文)
        //省get/set方法
    }

      (二)1.创建dao

    public interface LoginDao {
        //登录
        public Employee login(Employee emp) throws Exception;
    }

        2.dao.Impl

    public class LoginDaoImpl implements LoginDao {
        private SessionFactory sessionFactory;//创建一个工厂对象
        //登录
    public Employee login(Employee emp) throws Exception { // System.out.println("SessionFactory"+sessionFactory); //System.out.println("Session"+getSesion()); String hql = "from Employee where Sn=? and Password=?"; Employee emps=(Employee) getSesion().createQuery(hql).setString(0,emp.getSn()).setString(1, emp.getPassword()).uniqueResult(); System.out.println(emps); return emps; } //创建一个工厂 private Session getSesion() { return sessionFactory.getCurrentSession(); } public SessionFactory getSessionFactory() { return sessionFactory; } public void setSessionFactory(SessionFactory sessionFactory) { this.sessionFactory = sessionFactory; } }

      (三)1.创建service.dao

    public interface LoginServiceDao {
        //登录
        public Employee login(Employee emp) throws Exception;
    }

      2.创建service.Impl

    public class LoginServiceDaoImpl implements LoginServiceDao {
        
        //登录的daoimpl的对象
        private LoginDaoImpl li;
        
        @Transactional
        public Employee login(Employee emp) throws Exception {
            // TODO Auto-generated method stub
            System.out.println("实现类");
                    return li.login(emp);
        }
    
    
        public LoginDaoImpl getLi() {
            return li;
        }
    
    
        public void setLi(LoginDaoImpl li) {
            this.li = li;
        }
    
    }

      (四)创建Action

    public class LoginAction extends ActionSupport {
        private LoginServiceDao oaservice;
        private Employee emp;
        
        public String login() throws Exception {
        
            Employee employee = oaservice.login(emp);
            if (employee!=null) {
                
                ServletActionContext.getRequest().getSession().setAttribute("emp", employee);
                //ServletActionContext.getRequest().getSession().setAttribute("position",employee.getPosition().getName_cn());
                //ServletActionContext.getContext().getSession().put("position", employee);
                return SUCCESS;
            }else
            return INPUT;
        }
    
        public LoginServiceDao getOaservice() {
            return oaservice;
        }
    
        public void setOaservice(LoginServiceDao oaservice) {
            this.oaservice = oaservice;
        }
    
        public Employee getEmp() {
            return emp;
        }
    
        public void setEmp(Employee emp) {
            this.emp = emp;
        }
        
        
        
    }

    (五)配置文件

      application.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:aop="http://www.springframework.org/schema/aop" 
        xmlns:tx="http://www.springframework.org/schema/tx" 
         xsi:schemaLocation="
            http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop.xsd
            http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx.xsd">
        
         <!-- 配置连接池 -->
          <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
                  <property name="driverClass" value="oracle.jdbc.OracleDriver"></property>
                  <property name="jdbcUrl" value="jdbc:oracle:thin:@localhost:1521:orcl"></property>
                  <property name="user" value="bdqn"></property>
                  <property name="password" value="bdqn"></property>
          </bean>
            
            <bean id="sessionFactory" class="org.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean">
             <!--找配置好的连接池 -->
             <property name="dataSource" ref="dataSource"></property>
             <!-- 添加Hibernate配置参数 -->
             <property name="hibernateProperties">
                 <props>
                     <!--配置Hibernate方言  -->
                     <prop key="hibernate.dialect">org.hibernate.dialect.Oracle10gDialect</prop>
                     <!--配置Hibernate在控制台显示sql语句 -->
                     <prop key="hibernate.show_sql">true</prop>
                     <!--配置Hibernate自动提交 -->
                     <!-- <prop key="hibernate.connection.autocommit">true</prop> -->
                     <!--配置Hibernate格式化 -->
                     <prop key="hibernate.format_sql">true</prop>
                     <prop key="hibernate.hbm2ddl.auto">update</prop>
                     <prop key="hibernate.current_session_context_class"> org.springframework.orm.hibernate3.SpringSessionContext</prop>
                 </props>
             </property>
             
             <!--扫描所有包下的注解信息  包扫描器 -->
             <property name="packagesToScan" value="cn.oa.entity"></property>
             
         </bean>
    
        <!-- 登录 -->
         <!--配置Dao  -->
         <bean id="Logindao" class="cn.oa.dao.impl.LoginDaoImpl">
           
             <property name="sessionFactory" ref="sessionFactory"></property>
         </bean>
         <!--配置Service  相当于之前我们使用new来构建的实例对象  -->
         <bean id="OAService" class="cn.oa.service.dao.impl.LoginServiceDaoImpl">
             <property name="li" ref="Logindao"></property>
         </bean>
         
         <!--配置Action  -->
         <bean id="select" class="cn.oa.action.LoginAction" scope="prototype">
             <property name="oaservice" ref="OAService"></property>
         </bean>
         
         
        <!--查看部门 -->
        <!--配置Dao  -->
         <bean id="deparDao" class="cn.oa.dao.impl.IdepartmentDaoImpl">
         <property name="sessionFactory" ref="sessionFactory"></property>
         </bean>
         <!--配置Service  相当于之前我们使用new来构建的实例对象  -->
         <bean id="serviceDao" class="cn.oa.service.dao.impl.DeparmentServiceDaoImpl">
             <property name="deparmentImpl" ref="deparDao"></property>
         </bean>
         
         <!--配置Action  -->
         <bean id="Claim" class="cn.oa.action.DeparmentAction" scope="prototype">
             <property name="serviceDao" ref="serviceDao"></property>
         </bean>
         
       
           <!--查看岗位 -->
        <!--配置Dao  -->
         <bean id="positionDao" class="cn.oa.dao.impl.PositionDaoImpl">
         <property name="sessionFactory" ref="sessionFactory"></property>
         </bean>
         <!--配置Service  相当于之前我们使用new来构建的实例对象  -->
         <bean id="PositionserviceDao" class="cn.oa.service.dao.impl.PositionServiceDaoImpl">
             <property name="position" ref="positionDao"></property>
         </bean>
         
         <!--配置Action  -->
         <bean id="PAction" class="cn.oa.action.PositionAction" scope="prototype">
             <property name="positionService" ref="PositionserviceDao"></property>
         </bean>
       
         
         <!-- 注解的事务 -->
         <bean id="transactionManager" class="org.springframework.orm.hibernate3.HibernateTransactionManager">
             <property name="sessionFactory" ref="sessionFactory"></property>
             <!-- <property name="proxyTargetClass" >
               <value>true</value>
             </property> -->
         </bean>
          
         <tx:annotation-driven transaction-manager="transactionManager"/>
         
    </beans>

        struts.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <!DOCTYPE struts PUBLIC
        "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
        "http://struts.apache.org/dtds/struts-2.3.dtd">
    <struts>
        <!-- Action 查看部门信息 -->
        <package name="default" namespace="/" extends="struts-default">
    
            <!-- 在spring的配置里面 -->
            <action name="Action" class="select" method="login">
                <result name="input">/login.jsp</result>
                <result name="success">/index.jsp</result>
            </action>
    
            <!-- 查找部门所有的信息 -->
            <action name="ClaimAction" class="Claim" method="getList">
                <result name="input">/index.jsp</result>
                <result name="success">/deptList.jsp</result>
            </action>
            
            <!-- 查找岗位所有的信息  放入的是Action类的路径-->
            <action name="PositionAction" class="PAction">
                <result name="input">/index.jsp</result>
                <result name="success">/positionList.jsp</result>
            
            </action>
            
        </package>
    
    
        <!-- Action查找部门返回错误的页面-->
        <package name="dept" namespace="/dept" extends="struts-default">
    
            <!-- 在spring的配置里面 -->
            <action name="deptAction" class="Claim" method="login">
                <result name="error">/inde.jsp</result>
            </action>
        </package>
            
    
    
    
            <!-- <package name="josn_default" namespace="/" extends="json-default"> 
                <action name="ClaimAction" class="Claim"> <result type="json" name="input">/index.jsp</result> 
                <result type="json" name="success">/deptList.jsp</result> <result type="json"> 
                <param name="success">/deptList.jsp</param> </result> </action> </package> -->
    </struts>

      web.xml

    <?xml version="1.0" encoding="UTF-8"?>
    <web-app version="3.0" 
        xmlns="http://java.sun.com/xml/ns/javaee" 
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
        xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
        http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
      <display-name></display-name>
      
          
      <!-- 指定 applicationContext.xml的路径(或者放置与WEB-INF目录下)-->
          <context-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:applicationContext.xml</param-value>
        </context-param>
      
      <!-- 配置监听 -->
       <listener>
            <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
       </listener>
        <!-- 做一些初始化工作的监听器 -->
        <listener>
            <listener-class>cn.oa.listener.InitListener</listener-class>
        </listener>
      
      <filter>
        <filter-name>openSessionInview</filter-name>
        <filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>openSessionInview</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      
          
       <!-- Struts2的配置 -->
      <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
      </filter>
      <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
      </filter-mapping>
      
      <welcome-file-list>
        <welcome-file>login.jsp</welcome-file>
      </welcome-file-list>
    </web-app>

    (六)登录页面

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="/struts-tags" prefix="s" %>
    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
        <title>北大青鸟办公自动化管理系统</title>
    
    <style type="text/css">
        * {
            margin: 0;
            padding: 0;
        }
        
        body {
            font: 12px 宋体;
            background: #4BB8EF url(images/bg.gif) repeat-x;
        }
        
        img {
            border: 0;
        }
        
        .login-top {
             100%;
            height: 186px;
            margin: 147px auto 0;
            background: url(images/login_01.gif) no-repeat center 0;
        }
        
        .login-area {
             100%;
            height: 140px;
            margin: 0 auto;
            background: url(images/login_02.gif) no-repeat center 0;
        }
        
        .login-area form {
             290px;
            margin: 0 auto;
        }
        
        .login-area label {
            clear: left;
            float: left;
            margin-top: 13px;
             60px;
            font: 600 14px 宋体;
        }
        
        .login-area  input {
             122px;
            height: 16px;
            margin-top: 11px;
            border: 1px #767F94 solid;
            font: 12px/ 16px 宋体;
        }
        
        input.login-sub {
             104px;
            height: 34px;
            border: 0;
            background: url(images/login_sub.gif) no-repeat 0px 1px; *
            margin-top: 5px;
        }
        
        .login-copyright {
             100%;
            height: 30px;
            margin: 18px auto 0;
            background: url(images/copyright.gif) no-repeat center 0;
        }
    </style>
    <script type="text/javascript">
        function changeValidateCode(obj) {
            //获取当前的时间作为参数,无具体意义 
            var timenow = new Date().getTime();
            //每次请求需要一个不同的参数,否则可能会返回同样的验证码
            //这和浏览器的缓存机制有关系,也可以把页面设置为不缓存,这样就不用这个参数了。 
            obj.src = "random.action?d=" + timenow;
        }
        function check() {
            var msg = document.getElementById("msg").value;
            if (msg.length != 0) {
                alert(msg);
                document.getElementById("msg").value = "";
            }
        }
    </script>
    </head>
    <body onload="check()">
        <div class="login-top"></div>
        <div class="login-area">
            <form action="Action" method="post">
                <label>&nbsp;&nbsp;号:
                </label>
                <input type="text" name="emp.Sn" />
                <label>&nbsp;&nbsp;码:
                </label>
                <input type="password" name="emp.Password" />
                <label>
                    验证码:
                </label>
                <input type="text" name="random" size="6" />
                <input type="image" src="random.action"
                    onclick="changeValidateCode(this)" title="点击图片刷新验证码" />
                <input type="submit" class="login-sub" value="" />
                <s:actionerror cssStyle="margin-top: 10px;"/>
                <input type="hidden" id="msg" value="${requestScope.msg }" />
            </form>
        </div>
        <div class="login-copyright"></div>
    </body>
    </html>

    四、实现部门显示信息用(easyUI)

      (一)创建dao

    public interface IdepartmentDao {
    //查看所有的部门
        public List<Department> getDepar();
        //根据分页查询出指定的部门信息
        public List<Department> getdeptBypage(int pageSize, int pageIndex)throws Exception;
    
        //查询所有记录
        public int getAllCount() throws Exception;
    
    }

      Impl实现类

    public class DeparmentAction extends ActionSupport {
        private IdeparmentServiceDao serviceDao;
        
        private Department dept;
        private List<Department> deptlist;
        
        private Integer rows;//和datagrid控件绑定的记录条数
        private Integer page;//和datafrid控件绑定的页码数
        private int size;
        private String json;
        
        
        public String getList() throws Exception{
            System.out.println("AAAAAAAA");
            List<Department> list = serviceDao.getdeptBypage(rows, page);
            System.out.println(list+"bbb");
            setDeptlist(list);
            size=serviceDao.getAllCount();
            ServletActionContext.getResponse().setCharacterEncoding("utf-8");
            ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
            
            System.out.println(getJson().getBytes("utf-8"));
            ServletActionContext.getResponse().getOutputStream().write(getJson().getBytes("utf-8"));
            return NONE;
        }
    
        @Override
        
        public String execute() throws Exception {
            
            
            /*System.out.println("action");
            System.out.println("serviceDao"+serviceDao);*/
            List<Department> depar = serviceDao.getDepar();
            for (Department item : depar) {
                System.out.println(item.getDaparid());
                System.out.println(item.getDaparidname());
            }
            
            if(depar!=null){
                return SUCCESS;
            }
            return INPUT;
        }
        public IdeparmentServiceDao getServiceDao() {
            return serviceDao;
        }
        public void setServiceDao(IdeparmentServiceDao serviceDao) {
            this.serviceDao = serviceDao;
        }
        public Department getDept() {
            return dept;
        }
    
        public void setDept(Department dept) {
            this.dept = dept;
        }
    
        public List<Department> getDeptlist() {
            return deptlist;
        }
    
        public void setDeptlist(List<Department> deptlist) {
            this.deptlist = deptlist;
        }
    
        public Integer getRows() {
            return rows;
        }
    
        public void setRows(Integer rows) {
            this.rows = rows;
        }
    
        public Integer getPage() {
            return page;
        }
    
        public void setPage(Integer page) {
            this.page = page;
        }
    
        public int getSize() {
            return size;
        }
    
        public void setSize(int size) {
            this.size = size;
        }
    
        public String getJson() {
            String json=null;
            try {
                json = "{"total":"+size+","rows":"+JSONUtil.serialize(getDeptlist())+"}";
            } catch (JSONException e) {
                e.printStackTrace();
            }
            System.out.println("aaa"+json);
            return json;
            
        }
    
        public void setJson(String json) {
            this.json = json;
        }

      (二)service.dao

    public interface IdeparmentServiceDao {
        //查看所有的部门
        public List<Department> getDepar();
        //根据分页查询出指定的部门信息
            public List<Department> getdeptBypage(int pageSize, int pageIndex)throws Exception;
    
            //查询所有记录
            public int getAllCount() throws Exception;
    }

        Impl

    public class DeparmentServiceDaoImpl implements IdeparmentServiceDao{
        private IdepartmentDaoImpl deparmentImpl;
    
    
        @Transactional
        public List<Department> getDepar() {
            System.out.println("DeparmentServiceDaoImpl");
            System.out.println("deparmentImpl"+deparmentImpl);
            return deparmentImpl.getDepar();
        }
        public List<Department> getdeptBypage(int pageSize, int pageIndex)
                throws Exception {
            
            return deparmentImpl.getdeptBypage(pageSize, pageIndex);
        }
        
        
        public IdepartmentDaoImpl getDeparmentImpl() {
            return deparmentImpl;
        }
        public void setDeparmentImpl(IdepartmentDaoImpl deparmentImpl) {
            this.deparmentImpl = deparmentImpl;
        }
        public int getAllCount() throws Exception {
            
            return deparmentImpl.getAllCount();
        }
    
    
    
        
    
    }
    public class DeparmentAction extends ActionSupport {
        private IdeparmentServiceDao serviceDao;
        
        private Department dept;
        private List<Department> deptlist;
        
        private Integer rows;//和datagrid控件绑定的记录条数
        private Integer page;//和datafrid控件绑定的页码数
        private int size;
        private String json;
        
        
        public String getList() throws Exception{
            System.out.println("AAAAAAAA");
            List<Department> list = serviceDao.getdeptBypage(rows, page);
            System.out.println(list+"bbb");
            setDeptlist(list);
            size=serviceDao.getAllCount();
            ServletActionContext.getResponse().setCharacterEncoding("utf-8");
            ServletActionContext.getResponse().setContentType("text/html;charset=UTF-8");
            
            System.out.println(getJson().getBytes("utf-8"));
            ServletActionContext.getResponse().getOutputStream().write(getJson().getBytes("utf-8"));
            return NONE;
        }
    
        @Override
        
        public String execute() throws Exception {
            
            
            /*System.out.println("action");
            System.out.println("serviceDao"+serviceDao);*/
            List<Department> depar = serviceDao.getDepar();
            for (Department item : depar) {
                System.out.println(item.getDaparid());
                System.out.println(item.getDaparidname());
            }
            
            if(depar!=null){
                return SUCCESS;
            }
            return INPUT;
        }
        public IdeparmentServiceDao getServiceDao() {
            return serviceDao;
        }
        public void setServiceDao(IdeparmentServiceDao serviceDao) {
            this.serviceDao = serviceDao;
        }
        public Department getDept() {
            return dept;
        }
    
        public void setDept(Department dept) {
            this.dept = dept;
        }
    
        public List<Department> getDeptlist() {
            return deptlist;
        }
    
        public void setDeptlist(List<Department> deptlist) {
            this.deptlist = deptlist;
        }
    
        public Integer getRows() {
            return rows;
        }
    
        public void setRows(Integer rows) {
            this.rows = rows;
        }
    
        public Integer getPage() {
            return page;
        }
    
        public void setPage(Integer page) {
            this.page = page;
        }
    
        public int getSize() {
            return size;
        }
    
        public void setSize(int size) {
            this.size = size;
        }
    
        public String getJson() {
            String json=null;
            try {
                json = "{"total":"+size+","rows":"+JSONUtil.serialize(getDeptlist())+"}";
            } catch (JSONException e) {
                e.printStackTrace();
            }
            System.out.println("aaa"+json);
            return json;
            
        }
    
        public void setJson(String json) {
            this.json = json;
        }
        
        
    }

        jsp

    <%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
    <%
    String path = request.getContextPath();
    String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
    %>
    <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
    
    <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
    <html>
      <head>
        <title></title>
      <script type="text/javascript" src="<%=path %>/js/jquery-easyui-1.2.6/jquery-1.7.2.min.js"></script>
      <script type="text/javascript" src="<%=path %>/js/jquery-easyui-1.2.6/jquery.easyui.min.js"></script>
      <link rel="stylesheet" href="<%=path %>/js/jquery-easyui-1.2.6/themes/icon.css" type="text/css"></link>
      <link rel="stylesheet" href="<%=path %>/js/jquery-easyui-1.2.6/themes/default/easyui.css" type="text/css"></link>
      </head>
      
      <body>
      <div align="right"></div>
       <table id="dg" title="部门信息" style="700px;height:310px"><a href="<%=path%>/jsp/system/deptAdd.jsp">添加部门</a></table>
        <script type="text/javascript">
            $(function(){
            $("#dg").datagrid({
                  url:'<%=path%>/ClaimAction',
                   iconCls : 'icon-search',//表头标题图片
                   collapsible : true,//是否可折叠的 
                   rowNumbers:true,//显示行号
                   pagination:true,//显示底部分页栏
                   striped:true,//隔行变色
                   pageSize : 5,//设置每页默认显示的记录数
                   pageList:[5,10,15],
                   columns:[[
                     {field:'daparid',title:'编号',200    },
                     {field:'daparidname',title:'名称',200},
                     /* {field:'parent',title:'上级部门名称',
                     formatter: function(value,row,index){
                     if(value==null){
                     return "";
                     }else{
                     return "<a >"+row.parent.name+"</a>";
                     } 
                        },
                     200}, */
                    /*  {field:'caozuo',title:'操作',
                        formatter: function(value,row,index){
                    
                        return "<a href='#'>编辑</a> <a href='/dept/deptAction!deleteDeptBySn?dept.id='"+row.id+">删除</a>";
                        },
                      
                     200}
                      */
                  ]], 
                   
                  loadMsg:"数据正在进行加载"    ,
               });       
            });
            </script>
      </body>
    </html>
  • 相关阅读:
    Easy | LeetCode 154 | 剑指 Offer 11. 旋转数组的最小数字 | 二分法
    Easy | 剑指 Offer 17. 打印从1到最大的n位数 | 大数
    Easy | LeetCode 191 | 剑指 Offer 15. 二进制中1的个数 | 位运算
    Easy | 剑指 Offer 57
    Medium | LeetCode 15. 三数之和 | 双指针法
    jq load()方法实现html 模块化。
    vue 剪切图片上传头像,使用 cropperjs 实现
    vue 的nextTick的理解
    使用nodejs进行开发,concurrently模块,使我们同时执行多个命令。
    cookie生命周期expires 时间过期,但是cookie没有被浏览器清理的问题
  • 原文地址:https://www.cnblogs.com/yejiaojiao/p/6108663.html
Copyright © 2020-2023  润新知