Nosql and Redis final assessment project review

End-of-term assessment requirements

Create data tables emp and dep tables in MySQL.
The emp table stores employee information, including number, name, password, salary, department number, and entry time. The dep
table stores department information, including department number, department name, and manager number.
Write a Java server program to achieve the following functions:

  1. Users log in with employee ID and password
  2. After logging in, you can view the department names of all departments. The queried department names are cached using redis. The cache period is 10 hours. When the cache expires, it will be queried again and written to redis
  3. Click on the department name to view the personnel information of the department: if the login person is the manager of the department, you can view
    the name, salary, and entry time of all employees in the department; if you log in as an employee of this department, you can view all
    the employees in the department Name and joining time; if the registrant is not an employee of the department, the prompt information has no right to view. All viewed information
    is written into the cache, and the cache period is 5 minutes
  4. Click on the employee's name, if the login person is the employee himself, you can modify the login password, otherwise an error message will be displayed

1. Backend code part

1. The controller layer

1.1 DeptController

package com.igeek.controller;
import com.igeek.bean.Dept;
import com.igeek.bean.User;
import com.igeek.service.DeptService;
import com.igeek.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;

@Controller
public class DeptController {
    
    

    @Autowired
    private DeptService deptService;

    @Autowired
    private UserService userService;

    @RequestMapping("department")
    public String getDept(String depno,String userDepno, Model model){
    
    
        List<User> users = deptService.queryByDeptNO(depno);
        Dept dept = deptService.queryByNo(depno);
        model.addAttribute("depList", users);
        model.addAttribute("dept", dept);
        if (userDepno.equals(depno)){
    
    
            return "worker";
        }else
            return "404";
    }

    @RequestMapping("modify")
    public String modifyPwd(String modifyUser,String userid){
    
    
        if (modifyUser.equals(userid)){
    
    
            return "modify";
        }else {
    
    
            return "404";
        }
    }

    @RequestMapping("update")
    public String updatePwd(String oldpwd,String newpwd,String userid){
    
    
        User user = userService.queryUserById(userid);
        if (user.getPassword().equals(oldpwd)){
    
    
            if (oldpwd.equals(newpwd)){
    
    
                return "404";
            }else {
    
    
                userService.updatePwd(userid, newpwd);

                return "update";
            }
        }else {
    
    
            return "404";
        }
    }
}

1.2 JumController

package com.igeek.controller;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class JumpController {
    
    

    @RequestMapping("login")
    public String jumpToLogin(){
    
    
        return "login";
    }
}

1.3 LoginController

package com.igeek.controller;

import com.igeek.bean.Dept;
import com.igeek.bean.User;
import com.igeek.service.DeptService;
import com.igeek.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import java.util.List;

@Controller
public class LoginController {
    
    

    @Autowired
    private UserService userService;

    @Autowired
    private DeptService deptService;

    @RequestMapping("Login")
    public String loginToPage(String userid, String password, Model model) {
    
    
        if (userid != null && password != null) {
    
    
            User user = userService.queryUser(userid, password);
            List<Dept> depts = deptService.queryAllDept();
            if (user!=null){
    
    
                model.addAttribute("deptList", depts);
                model.addAttribute("user", user);
                return "department";
            }else{
    
    
                return "404";
            }
        }
        return "login";
    }
}

2. bean layer

2.1 com.igeek.bean.Dept

package com.igeek.bean;
public class Dept {
    
    

    private String depno;
    private String depname;
    private String managerid;

    public Dept() {
    
    
    }

    public Dept(String depno, String depname, String managerid) {
    
    
        this.depno = depno;
        this.depname = depname;
        this.managerid = managerid;
    }

    public String getDepno() {
    
    
        return depno;
    }

    public void setDepno(String depno) {
    
    
        this.depno = depno;
    }

    public String getDepname() {
    
    
        return depname;
    }

    public void setDepname(String depname) {
    
    
        this.depname = depname;
    }

    public String getManagerid() {
    
    
        return managerid;
    }

    public void setManagerid(String managerid) {
    
    
        this.managerid = managerid;
    }

    @Override
    public String toString() {
    
    
        return "Dept{" +
                "depno='" + depno + '\'' +
                ", depname='" + depname + '\'' +
                ", managerid='" + managerid + '\'' +
                '}';
    }
}

2.2 com.igeek.bean.User

package com.igeek.bean;
import java.util.Date;

public class User {
    
    
    private String userid;
    private String username;
    private String password;
    private double salary;
    private String depno;
    private Date workdate;

    public User() {
    
    
    }

    public User(String userid, String username, String password, double salary, String depno, Date workdate) {
    
    
        this.userid = userid;
        this.username = username;
        this.password = password;
        this.salary = salary;
        this.depno = depno;
        this.workdate = workdate;
    }

    public String getUserid() {
    
    
        return userid;
    }

    public void setUserid(String userid) {
    
    
        this.userid = userid;
    }

    public String getUsername() {
    
    
        return username;
    }

    public void setUsername(String username) {
    
    
        this.username = username;
    }

    public String getPassword() {
    
    
        return password;
    }

    public void setPassword(String password) {
    
    
        this.password = password;
    }

    public double getSalary() {
    
    
        return salary;
    }

    public void setSalary(double salary) {
    
    
        this.salary = salary;
    }

    public String getDepno() {
    
    
        return depno;
    }

    public void setDepno(String depno) {
    
    
        this.depno = depno;
    }

    public Date getWorkdate() {
    
    
        return workdate;
    }

    public void setWorkdate(Date workdate) {
    
    
        this.workdate = workdate;
    }

    @Override
    public String toString() {
    
    
        return "User{" +
                "userid='" + userid + '\'' +
                ", username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", salary=" + salary +
                ", depno='" + depno + '\'' +
                ", workdate=" + workdate +
                '}';
    }
}

3. cache layer

package com.igeek.cache;

import org.apache.ibatis.cache.Cache;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.dao.DataAccessException;
import org.springframework.data.redis.connection.RedisConnection;
import org.springframework.data.redis.core.RedisCallback;
import org.springframework.data.redis.core.RedisTemplate;

import java.util.concurrent.TimeUnit;
import java.util.concurrent.locks.ReadWriteLock;
import java.util.concurrent.locks.ReentrantReadWriteLock;

public class RedisCache implements Cache {
    
    

    private static final Logger logger = LoggerFactory.getLogger(RedisCache.class);
    //    使用spring中管理的redisTamplate
    private static RedisTemplate<String, Object> redisTemplate;
    private final String id;

    private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();
    @Override
    public ReadWriteLock getReadWriteLock() {
    
    
        return this.readWriteLock;
    }
    public static void setRedisTemplate(RedisTemplate redisTemplate){
    
    
        RedisCache.redisTemplate=redisTemplate;
    }

    public RedisCache(String id) {
    
    
        if (id == null) {
    
    
            throw new IllegalArgumentException("Cache require an ID");
        }
        this.id = id;
    }

    @Override
    public String getId() {
    
    
        return this.id;
    }

    @Override
    public void putObject(Object key, Object value) {
    
    
        try {
    
    
            logger.info("-----------putObject:key=" + key + ",value=" + value + "-----------");
            if (value == null) {
    
    
                redisTemplate.opsForValue().set(key.toString(), value, 5, TimeUnit.MINUTES);
            }
        } catch (Exception e) {
    
    
            logger.error("redis获取数据异常");
            e.printStackTrace();
        }
    }

    @Override
    public Object getObject(Object key) {
    
    
        Object object=null;
        try {
    
    
            logger.info("-----------putObject:key=" + key +"-----------");
            if (key != null) {
    
    
                object=redisTemplate.opsForValue().get(key.toString());
                return object;
            }
        } catch (Exception e) {
    
    
            logger.error("redis获取数据异常");
            e.printStackTrace();
        }
        return object;
    }

    @Override
    public Object removeObject(Object key) {
    
    
        Object object=null;
        try {
    
    
            logger.info("-----------putObject:key=" + key +"-----------");
            if (key != null) {
    
    
                object=redisTemplate.expire(key.toString(),1,TimeUnit.DAYS);
                return object;
            }
        } catch (Exception e) {
    
    
            logger.error("redis获取数据异常");
            e.printStackTrace();
        }
        return object;
    }

    @Override
    public void clear() {
    
    
        Long size=redisTemplate.execute(new RedisCallback<Long>() {
    
    
            @Override
            public Long doInRedis(RedisConnection redisConnection) throws DataAccessException {
    
    
                Long size = redisConnection.dbSize();
                redisConnection.flushDb();
                redisConnection.flushAll();
                return size;
            }
        });
        logger.info("------------------clear清除了"+size+"个对象");
    }

    @Override
    public int getSize() {
    
    
        Long size=redisTemplate.execute(new RedisCallback<Long>() {
    
    
            @Override
            public Long doInRedis(RedisConnection redisConnection) throws DataAccessException {
    
    
                Long size = redisConnection.dbSize();
                return size;
            }
        });
        return size.intValue();
    }

}

4. mapper layer

4.1 DeptMapper


package com.igeek.mapper;

import com.igeek.bean.Dept;
import com.igeek.bean.User;

import java.util.List;

public interface DeptMapper {
    
    

    List<Dept> queryAllDept();

    Dept queryByNo(String deptno);
    List<User> queryByDeptNo(String deptno);
}

4.2 DeptMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.igeek.mapper.DeptMapper">
    <select id="queryAllDept" resultType="com.igeek.bean.Dept">
        select * from dep
    </select>

    <select id="queryByDeptNo" resultType="com.igeek.bean.User">
        select * from emp where depno=#{deptno}
    </select>

    <select id="queryByNo" resultType="com.igeek.bean.Dept">
        select * from dep where depno=#{deptno}
    </select>
</mapper>

4.3. UserMapper

package com.igeek.mapper;
import com.igeek.bean.User;
import org.apache.ibatis.annotations.Param;

import java.util.List;

public interface UserMapper {
    
    

    User queryUser(@Param("userid") String userid, @Param("password") String password);

    User queryUserById(String userid);

//    User queryAllUser(String depno);
    List<User> queryAllUsersByDepno(String deptno);
    
    Integer updatePwd(@Param("userid") String userid, @Param("password") String password);
}

4.4 UserMapper.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.igeek.mapper.UserMapper">
    <cache type="com.igeek.cache.RedisCache"/>
    <select id="queryUser" resultType="com.igeek.bean.User">
          select * from emp where userid=#{userid} and password=#{password}
    </select>

    <select id="queryUserById" useCache="true" parameterType="String" resultType="com.igeek.bean.User">
        SELECT *
        FROM emp
        where userid=#{userid}
    </select>

    <select id="queryAllUsersByDepno" resultType="com.igeek.bean.User">
        SELECT *
        FROM emp
        where depno=#{depno}
    </select>


    <update id="updatePwd">
        update emp set password=#{password} where userid=#{userid}
    </update>
</mapper>

5. service layer

5.1 DeptService

package com.igeek.service;
import com.igeek.bean.Dept;
import com.igeek.bean.User;
import java.util.List;

public interface DeptService {
    
    

    List<Dept> queryAllDept();
    Dept queryByNo(String deptno);
    List<User> queryByDeptNO(String deptno);
}

5.2 DeptServiceImpl

package com.igeek.service.Impl;
import com.igeek.mapper.DeptMapper;
import com.igeek.bean.Dept;
import com.igeek.bean.User;
import com.igeek.service.DeptService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.concurrent.TimeUnit;

@Service
public class DeptServiceImpl implements DeptService {
    
    
    private static RedisTemplate<String, Object> redisTemplate;

    @Autowired
    private DeptMapper deptMapper;
    public DeptServiceImpl(RedisTemplate redisTemplate){
    
    
        this.redisTemplate=redisTemplate;
    }

    @Override
    public List<Dept> queryAllDept() {
    
    
        //从缓存中读取数据
        List<Dept> allDept = (List<Dept>) redisTemplate.opsForValue().get("ViewStaffData");
        if (allDept==null) {
    
    
            //若缓存中没有数据,则将从数据库中查询到的数据存入缓存中
            List<Dept> depts = deptMapper.queryAllDept();
            redisTemplate.opsForValue().set("ViewStaffData", depts);
            redisTemplate.expire("ViewStaffData", 10, TimeUnit.HOURS);
            return depts;
        }
        else{
    
    
            return allDept;
        }
    }

    @Override
    public Dept queryByNo(String deptno) {
    
    
        Dept dept = (Dept) redisTemplate.opsForHash().get("Dept", deptno);
        if (dept==null){
    
    
            Dept dept1 = deptMapper.queryByNo(deptno);
            redisTemplate.opsForHash().put("Dept", deptno, dept1);
            redisTemplate.expire("Dept", 5, TimeUnit.MINUTES);
            return dept1;
        }else{
    
    
            return dept;
        }
    }

    @Override
    public List<User> queryByDeptNO(String deptno) {
    
    
        List<User> userByDeptNo = (List<User>) redisTemplate.opsForValue().get(deptno);
        if (userByDeptNo==null){
    
    
            List<User> users = deptMapper.queryByDeptNo(deptno);
            redisTemplate.opsForValue().set(deptno, users);
            redisTemplate.expire(deptno, 5, TimeUnit.MINUTES);
            return users;
        }else{
    
    
            return userByDeptNo;
        }
    }
}

5.3 UserServiceImpl

package com.igeek.service.Impl;

import com.igeek.mapper.UserMapper;
import com.igeek.bean.User;
import com.igeek.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Service;

import java.util.concurrent.TimeUnit;

@Service
public class UserServiceImpl implements UserService {
    
    

    @Autowired
    private UserMapper userMapper;

    private static RedisTemplate<String, Object> redisTemplate;

    public UserServiceImpl(RedisTemplate redisTemplate){
    
    
        this.redisTemplate=redisTemplate;
    }

    @Override
    public User queryUser(String userid, String password) {
    
    
        return userMapper.queryUser(userid, password);
    }

    @Override
    public User queryUserById(String userid) {
    
    
        User user = (User) redisTemplate.opsForHash().get("user", userid);
        if (user==null){
    
    
            User user1 = userMapper.queryUserById(userid);
            redisTemplate.opsForHash().put("user",userid,user1);
            redisTemplate.expire("user", 5, TimeUnit.MINUTES);
            return user1;
        }else {
    
    
            return user;
        }
    }


    @Override
    public Integer updatePwd(String userid, String password) {
    
    
        return userMapper.updatePwd(userid, password);
    }
}

5.4 UserService

package com.igeek.service;
import com.igeek.bean.User;
public interface UserService {
    
    

    User queryUser(String userid, String password);
    User queryUserById(String userid);
    Integer updatePwd(String userid, String password);
}

6. util layer

6.1 RedisCaCheTransfer

package com.igeek.util;
import com.igeek.cache.RedisCache;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;

@Component
public class RedisCaCheTransfer {
    
    
    @Autowired
    public void setRedisTemplate(RedisTemplate redisTemplate){
    
    
        RedisCache.setRedisTemplate(redisTemplate);
    }
}


6.2 DateConvertor

package com.igeek.util;
import org.springframework.core.convert.converter.Converter;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateConvertor implements Converter<String, Date> {
    
    
    public Date convert(String s) {
    
    
        System.out.println("进入转换器");
        SimpleDateFormat simpleDateFormat=new SimpleDateFormat("yyy-MM-dd");
        try {
    
    
            return simpleDateFormat.parse(s);
        } catch (ParseException e) {
    
    
            e.printStackTrace();
        }
        return null;
    }
}

7. resources layer

7.1 druid.properties

jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/nosql07?useSSL=false
jdbc.username=root
jdbc.password=xxx

7.2 log4j.properties

### 锟斤拷锟斤拷志锟斤拷息锟斤拷锟斤拷锟斤拷台 ###
log4j.appender.stdout=org.apache.log4j.ConsoleAppender
log4j.appender.stdout.Target=System.out
log4j.appender.stdout.layout=org.apache.log4j.PatternLayout
log4j.appender.stdout.layout.ConversionPattern=%d{
    
    yyyy-MM-dd HH:mm:ss} %m%n

### 锟斤拷锟斤拷志锟斤拷息锟斤拷锟斤拷募锟斤拷锟絘ccp.log ###
log4j.appender.file=org.apache.log4j.FileAppender
log4j.appender.file.File=.log
log4j.appender.file.layout=org.apache.log4j.PatternLayout
log4j.appender.file.layout.ConversionPattern=%d{
    
    yyyy-MM-dd HH:mm:ss} %l  %m%n

### 锟斤拷锟斤拷锟斤拷锟饺硷拷锟斤拷锟皆硷拷锟斤拷锟皆?###
log4j.rootLogger=debug, stdout,file
###log4j.logger.s2jsp.sg.ch04.ArrayIndexExceptionLog4j=info,file

7.3 redis.properties

redis.hostName=localhost
redis.port=6379
redis.timeout=10000
redis.maxIdle=300
redis.maxTotal=1000
redis.maxWaitMillis=1000
redis.minEvictableIdleTimeMillis=300000
redis.numTestsPerEvictionRun=1024
redis.timeBetweenEvictionRunsMillis=30000
redis.testOnBorrow=true
redis.testWhileIdle=true

7.4 log4j2.xml

<?xml version="1.0" encoding="UTF-8"?>
<Configuration status="warn">
<Appenders>
    <Console name="Console" target="SYSTEM_OUT">
        <PatternLayout pattern="[%-5p] %d %c - %m%n" />
    </Console>
    <File name="File" fileName="dist/my.log">
        <PatternLayout pattern="%m%n" />
    </File>
</Appenders>

<Loggers>
    <Logger name="mh.sample2.Log4jTest2" level="INFO">
        <AppenderRef ref="File" />
    </Logger>
    <Root level="INFO">
        <AppenderRef ref="Console" />
    </Root>
</Loggers>
</Configuration>

7.5 applicationContext.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
    <import resource="applicationContext-mybatis.xml"/>
    <import resource="applicationContext-redis.xml"/>
    <import resource="applicationContext-tx.xml"/>
    <import resource="applicationContext-service.xml"/>
    <import resource="springmvc.xml"/>
</beans>

7.6 applicationContext-mybatis.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"
       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
        ">

    <context:property-placeholder ignore-unresolvable="true" location="classpath:config/druid.properties"/>

    <!-- 开启注解扫描功能
  base-package:该包及子包下的所有类都会被扫描到
   -->
    <context:component-scan base-package="com.igeek"/>

    <!-- 1.数据源的配置,只能通过xml -->
    <bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
        <property name="driverClassName" value="${jdbc.driver}"/>
        <property name="url" value="${jdbc.url}"/>
        <property name="username" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>

        <property name="maxActive" value="30"/>
        <property name="initialSize" value="10"/>
        <property name="maxWait" value="60000"/>
        <property name="minIdle" value="5"/>
    </bean>

    <!-- 2.配置sqlSessionFactory单例的对象 -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">
        <!-- 设置Mybatis核心配置文件的位置 -->
        <!--<property name="configLocation" value="classpath:SqlMapConfig.xml"/>-->

        <property name="configurationProperties">
            <props>
                <!-- 全局映射器启用缓存 *主要将此属性设置完成即可-->
                <prop key="cacheEnabled">true</prop>
                <!-- 查询时,关闭关联对象即时加载以提高性能 -->
                <prop key="lazyLoadingEnabled">false</prop>
                <!-- 设置关联对象加载的形态,此处为按需加载字段(加载字段由SQL指 定),不会加载关联表的所有字段,以提高性能 -->
                <prop key="aggressiveLazyLoading">true</prop>
            </props>
        </property>
        <property name="typeAliasesPackage" value="com.igeek.bean"/>
        <!-- 设置数据源属性 -->
        <property name="dataSource" ref="dataSource"/>
    </bean>

    <!-- 第二种配置方式:只需要配置接口的包 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.igeek.mapper"/>
    </bean>

</beans>

7.7 applicationContext-redis.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"

       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

        ">
    <!--ignore-unresolable设置为true时,配置文件找不到对应占位符值时,默认给${},如果false,
        找不到会直接报错,一般适用于单个xml中有多个配置文件-->
    <context:property-placeholder ignore-unresolvable="true" location="classpath:config/redis.properties"/>
    <!--2.redis连接池的配置-->
    <bean id="poolConfig" class="redis.clients.jedis.JedisPoolConfig">
        <!--最大空闲数量-->
        <property name="maxIdle" value="${redis.maxIdle}"/>
        <!--连接池的最大连接数-->
        <property name="maxTotal" value="${redis.maxTotal}"/>
        <!--连接池的最大连接等待时间-->
        <property name="maxWaitMillis" value="${redis.maxWaitMillis}"/>
        <!--逐出连接的最小空闲时间 默认30分钟1800000毫秒-->
        <property name="minEvictableIdleTimeMillis" value="${redis.minEvictableIdleTimeMillis}"/>
        <!--是否从池中取连接时进行校验,如果校验失败,则去除连接,并尝试从另一个取-->
        <property name="testOnBorrow" value="${redis.testOnBorrow}"/>
        <!--在空闲时检查有效性,默认值false-->
        <property name="testWhileIdle" value="${redis.testWhileIdle}"/>
    </bean>
    <!--3.配置jedis的连接工厂-->
    <bean id="connectionFactory" class="org.springframework.data.redis.connection.jedis.JedisConnectionFactory">
        <property name="poolConfig" ref="poolConfig"/>
        <!--ip地址-->
        <property name="hostName" value="${redis.hostName}"/>
        <!--端口号-->
        <property name="port" value="${redis.port}"/>
        <!--redis如果有密码-->
        <!--<property name="password" value="${redis.password}"/>-->
        <!--客户端超时时间-->
        <property name="timeout" value="${redis.timeout}"/>
    </bean>
    <!-- 4. redis操作模板,使用该对象可以操作redis  -->
    <bean id="redisTemplate" class="org.springframework.data.redis.core.RedisTemplate">
        <property name="connectionFactory" ref="connectionFactory"/>
        <!--如果不配置Serializer,那么存储的时候缺省使用String,如果用User类型存储,那么会提示错误User can't cast to String!!  -->
        <property name="keySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="valueSerializer">
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
        </property>
        <property name="hashKeySerializer">
            <bean class="org.springframework.data.redis.serializer.StringRedisSerializer"/>
        </property>
        <property name="hashValueSerializer">
            <bean class="org.springframework.data.redis.serializer.GenericJackson2JsonRedisSerializer"/>
        </property>
        <!--开启事务  -->
        <property name="enableTransactionSupport" value="true"/>
    </bean>
</beans>

7.8 applicationContext-service.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"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd">

    <!-- 配置service扫描 -->
    <context:component-scan base-package="com.igeek.service" />
</beans>

7.9 applicationContext-tx.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:tx="http://www.springframework.org/schema/tx"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd
   http://www.springframework.org/schema/aop
   http://www.springframework.org/schema/aop/spring-aop-4.2.xsd
   http://www.springframework.org/schema/tx
   http://www.springframework.org/schema/tx/spring-tx-4.2.xsd
   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.2.xsd">

    <!-- 事务管理器 -->
    <bean id="transactionManager"
          class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 数据源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>

    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 传播行为 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="query*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>

    <!-- 切面 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
                     pointcut="execution(* com.igeek.service.*.*(..))" />
    </aop:config>

</beans>

7.10 mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--settings:控制mybatis全局行为-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

7.11 mybatis.xml

<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
    PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
    <!--settings:控制mybatis全局行为-->
    <settings>
        <!--设置mybatis输出日志-->
        <setting name="logImpl" value="STDOUT_LOGGING"/>
    </settings>
</configuration>

7.11 springmvc.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:task="http://www.springframework.org/schema/task"
       xmlns:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd
        http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsd
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd">

    <!--controller的扫描-->
    <context:component-scan base-package="com.igeek.controller"></context:component-scan>
    
    <!--&lt;!&ndash;配置handlerMapping和handlerAdapter&ndash;&gt;-->
    <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"></bean>-->
    <!--<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter"></bean>-->

    <!--注解驱动方式启动
        取代上面的两个bean
        并且可以将结果以默认形式转换后返回客户端
    -->
    <mvc:annotation-driven></mvc:annotation-driven>

    <!--视图解析器-->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/page/"></property>
        <property name="suffix"  value=".jsp"></property>
    </bean>
    <mvc:default-servlet-handler/>

    <!--声明自定义的转换器-->
    <mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven>

    <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <property name="converters">
            <set>
                <bean class="com.igeek.util.DateConvertor"></bean>
            </set>
        </property>
    </bean>

    <!--上传解析器-->
<!--    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">-->
<!--        <property name="maxUploadSize" value="10487566"></property>-->
<!--    </bean>-->

    <!--加载静态资源-->
<!--    <mvc:resources mapping="/**" location="/calendar"></mvc:resources>-->
<!--    <mvc:resources mapping="/**" location="/css"></mvc:resources>-->
<!--    <mvc:resources mapping="/**" location="/image"></mvc:resources>-->
<!--    <mvc:resources mapping="/**" location="/images"></mvc:resources>-->
<!--    <mvc:resources mapping="/**" location="/js"></mvc:resources>-->
<!--    <!&#45;&#45;加载静态资源&ndash;&gt;-->
    <mvc:resources mapping="/**" location="/../../../web/imge" />
    <mvc:resources mapping="/**" location="/../../../web/js" />
    <mvc:annotation-driven/>

</beans>

8. test layer

8.1 QueryAllDept

import com.igeek.mapper.DeptMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.List;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:xml/applicationContext.xml")
public class QueryAllDept {
    
    
    @Autowired
    DeptMapper mapper;
    @Test
    public void test1(){
    
    
        List AllDept= mapper.queryAllDept();
        System.out.println(AllDept);
//        User userAll= (User) mapper.queryAllUsers("4444");
//        ArrayList<String> arrayList= new ArrayList<String>((Collection<? extends String>) userAll);

//        Jedis jedis=new Jedis("localhost", Integer.parseInt("6379"));
//        String user2=jedis.hget("userid","1001");
//        System.out.println(user2);
    }
}

8.2 QueryAllUserByDepno

import com.igeek.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import java.util.ArrayList;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:xml/applicationContext.xml")
public class QueryAllUserByDepno {
    
    
    @Autowired
    UserMapper mapper;
    @Test
    public void test1(){
    
    
        ArrayList userAll= (ArrayList) mapper.queryAllUsersByDepno("4444");
        System.out.println(userAll);
//        User userAll= (User) mapper.queryAllUsers("4444");
//        ArrayList<String> arrayList= new ArrayList<String>((Collection<? extends String>) userAll);

//        Jedis jedis=new Jedis("localhost", Integer.parseInt("6379"));
//        String user2=jedis.hget("userid","1001");
//        System.out.println(user2);
    }
}

8.3 QueryUserByUid

import com.igeek.bean.User;
import com.igeek.mapper.UserMapper;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration("classpath:xml/applicationContext.xml")
public class QueryUserByUid {
    
    
    @Autowired
    UserMapper mapper;

    @Test
    public void test1(){
    
    
        //1、通过用户ID和密码查询
        User user=mapper.queryUser("1009","123300");
        System.out.println(user);
        
        //2、通过用户ID查询
//        User user=mapper.queryUserById("1009");
//        System.out.println(user);
    }
}

Two, the front part

  1. 404.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>404</title>

</head>
<%@ include file="top.jsp"%>
<body>
    <ul>
    <li/>
<p style="color: red;font-family:仿宋;font-size:30px;padding-left: 10px;position:relative;
         margin-top:70px;" ><strong>抱歉了,你还没有此操作权限 !</strong></p>
    </ul>
<div style="margin:0 auto; height:306px;">

    <img src="../../imge/404.png" style="padding-left: 50px;width: 50%">
</div>
<div style="height: 3%">
</div>
<%@ include file="middle.jsp"%>
<%@ include file="foot.jsp"%>
</body>
</html>

  1. department.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="com.igeek.bean.Dept" %>
<%@ page import="com.igeek.bean.User" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>部门管理</title>
</head>
<body>

<%@ include file="top.jsp"%>

<%
    User user = new User();
    request.setCharacterEncoding("utf-8");
    if (request.getAttribute("user") != null) {
    
    
        user = (User) request.getAttribute("user");
        session.setAttribute("user", user);
    } else {
    
    
        user = (User) session.getAttribute("user");
    }
%>
<ul>
    <li/>
    <h3 style="padding-left: 10px">各部门展示</h3>
</ul>

<div class="container" style="overflow:auto;height: 55%;width: 40%">
<table border="1" cellpadding="15px" cellspacing="3px">
    <tr  align=center>
        <th   colspan="3" >所有在库部门信息表</th>
    </tr>
    <tr align=center>
        <td colspan="2">部门名称</td>
        <td>备注</td>
    </tr>

    <%
        List<Dept> deptList = (List<Dept>) request.getAttribute("deptList");
        for (Dept dept : deptList) {
    
    

    %>
    <tr align=center>
        <td >一线部门:</td>
        <td><a href="${pageContext.request.contextPath}/department.action?depno=<%=dept.getDepno()%>&userDepno=<%=user.getDepno()%>"><%=dept.getDepname()%></a></td>
        <td>仅供本部门经理及员工查看!</td>
    </tr>
    <%
        }
    %>
</table>

</div>
<div>
    <%@ include file="middle.jsp"%>
    <!-- 尾部-->
    <%@ include file="foot.jsp"%>
</div>
</body>
</html>

  1. foot.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>Foot Page</title>

</head>
<body>

<div style="background:yellowgreen;position:absolute;bottom:0;height: 40px;margin-top:-100px;width: 100%">

    <p align="center">联系我们:000000-5555555-55555 &nbsp; &nbsp;地点:镇江市丹徒区长晖路666<br/></p>

</div>
</body>
</html>

  1. login.jsp
<%--
  Created by IntelliJ IDEA.
  User: 水月
  Date: 2022/4/17
  Time: 23:24
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>

<head>
    <meta charset="UTF-8">
    <title>欢迎访问</title>
    <style type="text/css">
        body {
    
    
            background: url("../../imge/100.jpg") center;
            background-size: 120% auto;
            background-repeat: no-repeat;
        }

        #login-box {
    
    
            width: 30%;
            height: auto;
            margin: 0 auto;
            margin-top: 15%;
            text-align: center;
            background: #00000080;
            padding: 20px 50px;
        }

        #login-box h1 {
    
    
            color: white;

        }

        #login-box .form .item {
    
    
            color: white;
            margin-top: 15px;
        }

        #login-box .form .item input {
    
    
            width: 180px;
            font-size: 18px;
            border: 0;
            border-bottom: 3px solid white;
            padding: 5px 10px;
            background: #ffffff00;
            color: #ffffff;
        }

        #login-box .form .item input[placeholder] {
    
    
            color: white;
        }

        #login-box .form .item i {
    
    
            font-size: 18px;
            color: white;
        }

        #login-box button {
    
    
            border: 0;
            margin-top: 15px;
            width: 125px;
            height: 30px;
            font-size: 20px;
            font-weight: 700;
            color: white;
            background-image: linear-gradient(to right, #00dbde 0%, #fc00ff 100%);
            border-radius: 15px;
        }

        input::-webkit-input-placeholder {
    
    
            color:white;
        }
        input::-moz-placeholder {
    
    
            /* Mozilla Firefox 19+ */
            color: white;
        }
        input:-moz-placeholder {
    
    
            /* Mozilla Firefox 4 to 18 */
            color: white;
        }put-placeholder {
    
    
             /* Inte
         input:-ms-inrnet Explorer 10-11 */
             color: white;
         }

        .login03:before {
    
    
            content: "\2708";
        }
        .login02:before {
    
    
            content: "\2764";
        }
        
        .login01 {
    
    
            display: inline-block;
            /*font: normal normal normal 14px/1 FontAwesome;*/
            font:normal normal 14px/1.2 '宋体','微软雅黑';
            font-size: inherit;
            color: white;
            text-rendering: auto;
            -webkit-font-smoothing: antialiased;
            -moz-osx-font-smoothing: grayscale;
            border: aqua;
        }
    </style>

</head>
<body>
<form action="${pageContext.request.contextPath}/Login.action" method="POST">
    <div id="login-box">
        <h1>部门员工管理系统</h1>
        <div class="form">
            <div class="item">
                <i class="login01 login02" aria-hidden="true"></i>
                <input type="text" placeholder="请输入用户ID" name="userid">
            </div>

            <div class="item">
                <i class="login01 login03" aria-hidden="true"></i>
                <input type="password" placeholder="请输入密码" name="password">
            </div>
        </div>
        <button type="submit">登录</button>
        <button type="reset">重置</button>
    </div>
    <div style="color:black;text-align: center;">
        <br/><br/>
         <b>感谢使用部门员工系统!</b>
        <br><b>——20224NoSql期末考核</b>
    </div>
</form>
</body>

</html>


  1. middle.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!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 charset="UTF-8">
      <title>middle</title>
   </head>
<body>
   <div style=" text-align:left; height: 135px">
      <ul>
         <li/>
      <p style="color: red;padding-left: 10px;position:relative;
         margin-top:25px;font-size:20px">温馨提示:</p>
      </ul>
      <p style="padding-left: 18px">1. 登录后可以查看所有部门的部门名称,查询的部门名称的缓存周期为10小时,缓存过期将重新查询并写入redis;<br />
      2. 登录人是某部门的经理,则可点击该部门名称查看该部门的所有员工姓名、薪水、入职时间;<br />
      3. 登录人某部门员工,则可点击该部门名称查看该部门的所有员工姓名和入职时间;<br />
      4. 登录人非本部门员工则无权查看该部门信息。所有查看的信息,都写入缓存,缓存周期为 5 分钟。<br />
      </p>
   </div>
</body>
</html>

  1. modify.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.igeek.bean.User" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>更改密码</title>

</head>
<body>
<%@ include file="top.jsp"%>
<div style="height: 5%">
</div>
<div class="container">
<%
    User user= (User) session.getAttribute("user");
%>
    <ul>
        <li/>
        <h3 style="padding-left: 10px">更改密码</h3>
    </ul>
<div style="height: 2%">
</div>
<div style="border: 2px">
<form style="padding-left: 15px" action="${pageContext.request.contextPath}/update.action" method="post" >&nbsp;&nbsp;&nbsp;名:<input type="text" value="<%=user.getUsername()%>" readonly><br>
    <input type="hidden" name="userid" value="<%=user.getUserid()%>">
    旧密码:<input type="password" name="oldpwd"><br>
    新密码:<input type="password" name="newpwd"><br>
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="submit" value="提交" style="padding-left: 10px;">
    &nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<input type="reset" value="重置">
</form>
<div style="height: 5%">
</div>
    <%@ include file="middle.jsp"%>
</div>

</div>
<div style="height: 17%">
</div>
<div>
    <img src="../../imge/01.gif" alt="" height="70px" style="padding-left: 10px;position:relative;
         margin-top:35px;width: 50%">
</div>
<div>
    <!-- 尾部-->
    <%@ include file="foot.jsp"%>
</div>
</body>
</html>

8 top.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
   <meta charset="UTF-8">
   <title>管理系统 </title>
<%--<meta http-equiv="description" content="This is my page" />--%>
<%--<script type="text/javascript">--%>
<script type="text/javascript" src="<%=request.getContextPath()%>/js/time.js"></script>
</head>
<body>
<div>
   <ul>
      <li style="background: #cceeff; padding-left: 14px;position:absolute;top:0;width: 100%;height: 35px;margin-bottom: -100px">欢迎光临部门员工系统!今天是:
         <span id="clock" style="color:red"></span>
         <script type="text/javascript">
            var clock = new Clock();
            clock.display(document.getElementById("clock"));
         </script>
      </li>
   </ul>
</div>
<div>
   <img src="../../imge/01.gif" alt="" height="70px" style="padding-left: 10px;position:relative;
         margin-top:35px;width: 50%">
</div>
</body>
</html>
</body>
</html>

9 update.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>更新</title>

</head>
<body>
<%@ include file="top.jsp"%>
<div style="height: 5%">
</div>
<div class="container">

<table bgcolor="#7fffd4" border="1" style="margin-top: 45px;height: 60px;padding-left: 1px;" cellpadding="32px" >
  <tr>
      <td><p >恭喜你,密码更改成功</p></td>
  </tr>
</table>
    <div style="height: 5%">
    </div>
    <%@ include file="middle.jsp"%>
    <div style="height: 22%">
    </div>
    <div>
        <img src="../../imge/01.gif" alt="" height="70px" style="padding-left: 10px;position:relative;
         margin-top:35px;width: 50%">
    </div>
    <div>
        <!-- 尾部-->
        <%@ include file="foot.jsp"%>
    </div>

</div>
</body>
</html>

10 worker.jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.igeek.bean.User" %>
<%@ page import="java.util.List" %>
<%@ page import="com.igeek.bean.Dept" %>
<%@ page import="java.text.SimpleDateFormat" %>
<html>
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<%@ include file="top.jsp"%>
<%
    User user= (User) session.getAttribute("user");
    Dept dept= (Dept) request.getAttribute("dept");
    List<User> userlist= (List<User>) request.getAttribute("depList");
%>
<ul>
    <li/>
    <h3 style="padding-left: 10px">本部门的所有在库成员</h3>
</ul>
<div class="container" style="overflow:auto;height: 55%;width: 40%">
    <table border="1" cellpadding="15px" cellspacing="3px">
        <tr  align=center>
            <th   colspan="4" >部门成员信息表</th>
        </tr>
<%--<table border:"1" style="padding-left: 10px">--%>
    <tr align=center>
        <td >姓名</td>
        <%
            if (dept.getManagerid().equals(user.getUserid())){
    
    
        %>
        <td >薪水</td>
        <%
            }
        %>
        <td >入职时间</td>
        <td >备注</td>
    </tr>
    <%
        for (User user1 : userlist) {
    
    
            SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyy-MM-dd");
            String workdate = simpleDateFormat.format(user1.getWorkdate());
    %>
    <tr align="center">
        <td><a href="${pageContext.request.contextPath}/modify.action?modifyUser=<%=user1.getUserid()%>&userid=<%=user.getUserid()%>"><%=user1.getUsername()%></a></td>
    <%
        if (dept.getManagerid().equals(user.getUserid())){
    
    
    %>
        <td><%=user1.getSalary()%></td>
    <%
        }
    %>
        <td><%=workdate%></td>
        <td>员工本人可点击员工姓名来对登录密码进行修改 </td>
    </tr>
    <%
        }
    %>
</table>
</div>
<div>
    <%@ include file="middle.jsp"%>
    <!-- 尾部-->
    <%@ include file="foot.jsp"%>
</div>
</body>
</html>

11 time.js

function Clock() {
    
    
    var date = new Date();
    this.year = date.getFullYear();
    this.month = date.getMonth() + 1;
    this.date = date.getDate();
    this.day = new Array("星期日", "星期一", "星期二", "星期三", "星期四", "星期五", "星期六")[date.getDay()];
    this.hour = date.getHours() < 10 ? "0" + date.getHours() : date.getHours();
    this.minute = date.getMinutes() < 10 ? "0" + date.getMinutes() : date.getMinutes();
    this.second = date.getSeconds() < 10 ? "0" + date.getSeconds() : date.getSeconds();

    this.toString = function() {
    
    
        return this.year + "年" + this.month + "月" + this.date + "日 "  + this.day;
    };

    this.toSimpleDate = function() {
    
    
        return this.year + "-" + this.month + "-" + this.date;
    };

    this.toDetailDate = function() {
    
    
        return this.year + "-" + this.month + "-" + this.date + " " + this.hour + ":" + this.minute + ":" + this.second;
    };

    this.display = function(ele) {
    
    
        var clock = new Clock();
        ele.innerHTML = clock.toString();
        window.setTimeout(function() {
    
    clock.display(ele);}, 1000);
    };
}

3. Database design

  1. Nosql07.sql
    (SQL statement dump and export)
SET FOREIGN_KEY_CHECKS=0;

-- ----------------------------
-- Table structure for dep
-- ----------------------------
DROP TABLE IF EXISTS `dep`;
CREATE TABLE `dep` (
  `depno` varchar(5) NOT NULL,
  `depname` varchar(10) DEFAULT NULL,
  `depname` varchar(10) DEFAULT NULL,
  `managerid` varchar(20) DEFAULT NULL,
  PRIMARY KEY (`depno`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of dep
-- ----------------------------
INSERT INTO `dep` VALUES ('1111', '销售部', '1006');
INSERT INTO `dep` VALUES ('2222', '技术部', '1007');
INSERT INTO `dep` VALUES ('3333', '售后部', '1008');
INSERT INTO `dep` VALUES ('4444', '运输部', '1009');
INSERT INTO `dep` VALUES ('5555', '策划部', '1005');
INSERT INTO `dep` VALUES ('6666', '维修部', '1004');
INSERT INTO `dep` VALUES ('7777', '顾问部', '1003');
INSERT INTO `dep` VALUES ('8888', '监察部', '1002');

-- ----------------------------
-- Table structure for emp
-- ----------------------------
DROP TABLE IF EXISTS `emp`;
CREATE TABLE `emp` (
  `userid` varchar(20) NOT NULL,
  `username` varchar(20) NOT NULL,
  `password` varchar(20) NOT NULL,
  `salary` double DEFAULT NULL,
  `depno` varchar(5) DEFAULT NULL,
  `workdate` date DEFAULT NULL,
  PRIMARY KEY (`userid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- ----------------------------
-- Records of emp
-- ----------------------------
INSERT INTO `emp` VALUES ('1001', '张安', '123202', '5000', '1111', '2021-10-01');
INSERT INTO `emp` VALUES ('1002', '李素', '123022', '6000', '8888', '2021-07-01');
INSERT INTO `emp` VALUES ('1003', '吴局', '123698', '7000', '7777', '2020-10-01');
INSERT INTO `emp` VALUES ('1004', '刘六', '123852', '8000', '6666', '2020-12-01');
INSERT INTO `emp` VALUES ('1005', '刘七', '123630', '5200', '5555', '2021-09-01');
INSERT INTO `emp` VALUES ('1006', '刘强东', '123789', '7200', '1111', '2021-01-01');
INSERT INTO `emp` VALUES ('1007', '马化腾', '123678', '8100', '2222', '2020-10-26');
INSERT INTO `emp` VALUES ('1008', '马云', '123123', '7838', '3333', '2019-07-24');
INSERT INTO `emp` VALUES ('1009', '章泽天', '123025', '8838', '4444', '2020-06-19');
INSERT INTO `emp` VALUES ('1010', '张一鸣', '123321', '5957', '5555', '2019-06-14');
INSERT INTO `emp` VALUES ('1011', '张磊', '123632', '6936', '6666', '2019-07-26');
INSERT INTO `emp` VALUES ('1012', '任正非', '123963', '9926', '5555', '2012-04-06');
INSERT INTO `emp` VALUES ('1013', '孟晚舟', '123888', '7878', '4444', '2013-02-14');
INSERT INTO `emp` VALUES ('1014', '刘亦菲', '123444', '5858', '6666', '2009-11-27');
INSERT INTO `emp` VALUES ('1015', '董明珠', '123333', '5656', '4444', '2008-06-14');
INSERT INTO `emp` VALUES ('1016', '王力宏', '123222', '8484', '4444', '2011-10-22');
INSERT INTO `emp` VALUES ('1017', '黄渤', '123555', '5652', '6666', '2014-10-20');
INSERT INTO `emp` VALUES ('1018', '董卿', '123666', '5963', '4444', '2015-11-26');
INSERT INTO `emp` VALUES ('1019', '彭于晏', '123777', '8522', '7777', '2009-12-01');
INSERT INTO `emp` VALUES ('1020', '章子怡', '123999', '5757', '8888', '2005-07-13');
INSERT INTO `emp` VALUES ('1021', '任平', '123111', '6985', '2222', '2020-06-24');
INSERT INTO `emp` VALUES ('1022', '马龙', '123000', '8565', '4444', '2020-05-12');
INSERT INTO `emp` VALUES ('1023', '赵丽颖', '123201', '4896', '4444', '2019-06-19');
INSERT INTO `emp` VALUES ('1024', '薛之谦', '123025', '6985', '1111', '2019-02-04');
INSERT INTO `emp` VALUES ('1025', '鞠婧祎', '123211', '8088', '2222', '2019-02-28');
INSERT INTO `emp` VALUES ('1026', '杨钰莹', '123985', '7887', '3333', '2010-02-09');
INSERT INTO `emp` VALUES ('1027', '田馥郁', '123321', '8000', '7777', '2020-02-06');
INSERT INTO `emp` VALUES ('1028', '张杰', '123000', '7418', '8888', '2021-02-02');
INSERT INTO `emp` VALUES ('1029', '梅花', '123333', '6868', '4444', '2018-02-14');
INSERT INTO `emp` VALUES ('1030', '许嵩', '123668', '8118', '4444', '2018-06-15');

4. Relevant screenshots

  1. log in page
    insert image description here
  2. Department manager login

insert image description here

2.1 View the department names of all departments

insert image description here

2.2 View the names, salaries, and entry dates of all employees in the department

insert image description here

2.3 Change password

insert image description here

insert image description here

  1. Department staff login
    insert image description here

3.1 View the department names of all departments

insert image description here

3.2 Check the names and entry time of all employees in this department

insert image description here

3.3 Change password

insert image description here

insert image description here

  1. prompt information
    insert image description here

  2. information cycle cache
    insert image description here

  3. Data query Test
    6.1 Department number, department name, manager number of all departments in the database

insert image description here

6.2 Query an employee's information

insert image description here
6.3 Query all employee information of a department

insert image description here
7. Database information

insert image description here

insert image description here

Guess you like

Origin blog.csdn.net/m0_48170265/article/details/130025052