Article Directory
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:
- Users log in with employee ID and password
- 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
- 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 - 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>
<!--<!–配置handlerMapping和handlerAdapter–>-->
<!--<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>-->
<!-- <!--加载静态资源–>-->
<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
- 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>
- 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>
- 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 地点:镇江市丹徒区长晖路666号<br/></p>
</div>
</body>
</html>
- 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>——2022年4月NoSql期末考核</b>
</div>
</form>
</body>
</html>
- 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>
- 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" >
姓 名:<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>
<input type="submit" value="提交" style="padding-left: 10px;">
<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
- 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
- log in page
- Department manager login
2.1 View the department names of all departments
2.2 View the names, salaries, and entry dates of all employees in the department
2.3 Change password
- Department staff login
3.1 View the department names of all departments
3.2 Check the names and entry time of all employees in this department
3.3 Change password
-
prompt information
-
information cycle cache
-
Data query Test
6.1 Department number, department name, manager number of all departments in the database
6.2 Query an employee's information
6.3 Query all employee information of a department
7. Database information