Nosql与Redis期末考核项目回顾
文章目录
-
- 期末考核要求
- 一、后端代码部分
-
- 1. controller层
- 2. bean层
- 3. cache层
- 4. mapper层
- 5. service层
- 6. util层
- 7. resources层
- 8. test 层
- 二、前端部分
- 三、数据库设计
- 四、相关截图
期末考核要求
在 MySQL 中创建数据表 emp、dep 表。
emp 表存储员工信息,包含编号、姓名、密码、薪水、所在部门编号、入职时间
dep 表存储部门信息,包含部门编号、部门名称、经理编号
编写 Java 服务器程序实现以下功能:
- 用户通过员工编号和密码进行登录
- 登录后可以查看所有部门的部门名称,查询的部门名称使用 redis 进行缓存,缓存周期为 10 小时,缓存过期将重新查询并写入 redis
- 点击部门名称可以查看该部门的人员信息:如果登录人是该部门的经理,则可以查看该
部门的所有员工姓名、薪水、入职时间;如果登录人本部门员工,则可以查看该部门的所有
员工姓名和入职时间;如果登录人非本部门员工则提示信息无权查看。 所有查看的信息
都写入缓存,缓存周期为 5 分钟 - 点击员工姓名,如果登录人是员工本人,则可以对登录密码进行修改,否则提示错误信息
一、后端代码部分
1. controller层
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 {@Autowiredprivate DeptService deptService;@Autowiredprivate 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";}elsereturn "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 {@Autowiredprivate UserService userService;@Autowiredprivate 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层
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;}@Overridepublic 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;}@Overridepublic String toString() {return "User{" +"userid='" + userid + '\\'' +", username='" + username + '\\'' +", password='" + password + '\\'' +", salary=" + salary +", depno='" + depno + '\\'' +", workdate=" + workdate +'}';}
}
3. cache层
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中管理的redisTamplateprivate static RedisTemplate<String, Object> redisTemplate;private final String id;private final ReadWriteLock readWriteLock = new ReentrantReadWriteLock();@Overridepublic 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;}@Overridepublic String getId() {return this.id;}@Overridepublic 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();}}@Overridepublic 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;}@Overridepublic 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;}@Overridepublic void clear() {Long size=redisTemplate.execute(new RedisCallback<Long>() {@Overridepublic Long doInRedis(RedisConnection redisConnection) throws DataAccessException {Long size = redisConnection.dbSize();redisConnection.flushDb();redisConnection.flushAll();return size;}});logger.info("------------------clear清除了"+size+"个对象");}@Overridepublic int getSize() {Long size=redisTemplate.execute(new RedisCallback<Long>() {@Overridepublic Long doInRedis(RedisConnection redisConnection) throws DataAccessException {Long size = redisConnection.dbSize();return size;}});return size.intValue();}}
4. mapper层
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 mapperPUBLIC "-//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 mapperPUBLIC "-//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 empwhere userid=#{userid}</select><select id="queryAllUsersByDepno" resultType="com.igeek.bean.User">SELECT *FROM empwhere depno=#{depno}</select><update id="updatePwd">update emp set password=#{password} where userid=#{userid}</update>
</mapper>
5. service层
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;@Autowiredprivate DeptMapper deptMapper;public DeptServiceImpl(RedisTemplate redisTemplate){this.redisTemplate=redisTemplate;}@Overridepublic 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;}}@Overridepublic 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;}}@Overridepublic 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 {@Autowiredprivate UserMapper userMapper;private static RedisTemplate<String, Object> redisTemplate;public UserServiceImpl(RedisTemplate redisTemplate){this.redisTemplate=redisTemplate;}@Overridepublic User queryUser(String userid, String password) {return userMapper.queryUser(userid, password);}@Overridepublic 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;}}@Overridepublic 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层
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 {@Autowiredpublic 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层
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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttp://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.xsdhttp://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsdhttp://www.springframework.org/schema/aophttp://www.springframework.org/schema/aop/spring-aop-4.2.xsdhttp://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.2.xsdhttp://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 configurationPUBLIC "-//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 configurationPUBLIC "-//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.xsdhttp://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.2.xsdhttp://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 层
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 {@AutowiredDeptMapper mapper;@Testpublic 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 {@AutowiredUserMapper mapper;@Testpublic 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 {@AutowiredUserMapper mapper;@Testpublic 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);}
}
二、前端部分
- 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/17Time: 23:24To 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 {/* Inteinput:-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);};
}
三、数据库设计
- Nosql07.sql
(SQL语句转储导出)
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');
四、相关截图
- 登录页面
- 部门经理登录
2.1 查看所有部门的部门名称
2.2 查看部门的所有员工姓名、薪水、入职时间
2.3 更改密码
- 部门员工登录
3.1 查看所有部门的部门名称
3.2 查看该部门的所有员工姓名和入职时间
3.3 更改密码
-
提示信息
-
信息周期缓存
-
数据查询Test
6.1 数据库内所有部门的部门编号、部门名称、经理编号
6.2 查询某一员工信息
6.3 查询某一部门所有员工信息
7. 数据库信息