面试机试题目,使用Spring + SpringMVC +Mybatis + html + css实现员工管理系统

2023-11-18

机试挑战

需求分析

开发环境:IntelliJ IDEA + JDK1.8 + Tomcat8.5 + Maven + SVN + MySql
采用技术:Spring + SpringMVC +Mybatis + Shiro + html + css
功能:
请编写一个Web程序,完成对员工信息的管理,实现功能如下:
1.登录;(完成)
2.查看所有员工列表;(完成)
3.查看员工详细信息;(完成)
4.添加员工信息;(完成)
5.修改员工信息;(完成)
6.删除员工信息;(完成)
大概内容:
1.登录,添加,修改,删除操作使用AOP将操作日志入库保存;(完成)
2.全部请求使用Ajax请求方式;(部分完成)
3.前端框架自行使用;(完成)
4.数据库自行设计;(完成)
5.Session管理交由Shiro管理;
6.使用log4j进行日志文件保存;(完成)
7.使用nginx进行管理,需要实现服务停止时提示维护页面

简介

访问地址: http://39.99.237.90:8080/employee

源码: https://github.com/Listen-Y/JavaWeb/tree/master/20201125

实际主要技术栈

SSM + JQuery + bootstrap

访问流程

管理员账号目前只有一个, 并对其密码使用MD5加密

账号: admin

密码: 123456

普通员工不能进行登录访问,更不能对员工信息进行操作

演示

在这里插入图片描述

显示所有员工
在这里插入图片描述

添加员工
在这里插入图片描述

查看信息
在这里插入图片描述

数据库设计

管理员table

create table admin
(
	name varchar(20) primary key,
	password varchar(32) not null
)
comment '管理员';
insert into admin values('admin',MD5('123456'));

员工table

create table employee
(
   id smallint primary key auto_increment,
   name varchar(20) not null,
   sex smallint not null,
   entry date not null,
   depart varchar(20) not null,
   phone varchar(11) not null
);
comment '员工';

insert into employee(name, sex, entry, depart, phone) VALUES ('listen', 0, CURDATE(), '开发部', '12345677889');

POJO对象

管理员

@Data
@AllArgsConstructor
@NoArgsConstructor
public class Admin implements Serializable {

    private String name;
    private String password;
}

普通员工

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Employee implements Serializable {
    private int id;
    private String name;
    private int sex;
    private Date entry;
    private String depart;
    private String phone;

    public Employee(String name, int sex, String depart, String phone) {
        this.name = name;
        this.sex = sex;
        this.depart = depart;
        this.phone = phone;
    }
}

dao层服务

管理员操作接口

public interface AdminMapper {

    Admin query(@Param("name") String name);

}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.employee.dao.AdminMapper">
    <select id="query" parameterType="string" resultType="admin">
        select * from admin where name=#{name};
    </select>
</mapper>

普通员工操作接口

public interface EmployeeMapper {

    List<Employee> select();
    List<Employee> selectLike(@Param("keyWords") String keyWords);
    Employee query(@Param("id") int id);
    int add(Employee employee);
    int delete(@Param("id") int id);
    int update(Map<String, Object> map);
}
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="com.employee.dao.EmployeeMapper">
    <select id="select" resultType="employee">
        select * from employee;
    </select>

    <select id="query" resultType="employee" parameterType="_int">
        select * from employee where id=#{id};
    </select>

    <insert id="add" parameterType="employee">
        insert into employee(name, sex, entry, depart, phone)
        VALUES (#{name}, #{sex}, CURDATE(), #{depart}, #{phone});
    </insert>

    <delete id="delete" parameterType="_int">
        delete from employee where id=#{id};
    </delete>

    <update id="update" parameterType="map">
        update employee
        <set>
            <if test="name != null">
                name=#{name},
            </if>
            <if test="sex != null">
                sex=#{sex},
            </if>
            <if test="depart != null">
                depart=#{depart},
            </if>
            <if test="phone != null">
                phone=#{phone}
            </if>
        </set>
        where id=#{id}
    </update>

    <select id="selectLike" resultType="employee" parameterType="string">
        select * from employee where name like #{keyWords};
    </select>

</mapper>


Service服务

AdminServiceImpl

public interface AdminService {

    Admin query(String name);

}

public class AdminServiceImpl implements AdminService {

    AdminMapper adminMapper;

    public void setAdminMapper(AdminMapper adminMapper) {
        this.adminMapper = adminMapper;
    }

    /**
     * 按名字查询管理员
     * @param name
     * @return
     */
    @Override
    public Admin query(String name) {
        return adminMapper.query(name);
    }
}

EmployeeServiceImpl

public interface EmployeeService {

    List<Employee> select();
    Employee query(int id);
    int add(Employee employee);
    int delete(int id);
    int update(Map<String, Object> map);
    List<Employee> selectLike(String keyWords);
}

public class EmployeeServiceImpl implements EmployeeService {

    EmployeeMapper employeeMapper;

    public void setEmployeeMapper(EmployeeMapper employeeMapper) {
        this.employeeMapper = employeeMapper;
    }

    /**
     * 查询所有员工
     * @return
     */
    @Override
    public List<Employee> select() {
        return employeeMapper.select();
    }

    /**
     * 按id查找员工
     * @param id
     * @return
     */
    @Override
    public Employee query(int id) {
        return employeeMapper.query(id);
    }

    /**
     * 添加员工
     * @param employee
     * @return
     */
    @Override
    public int add(Employee employee) {
        return employeeMapper.add(employee);
    }

    /**
     * 按照id编号删除一个员工
     * @param id
     * @return
     */
    @Override
    public int delete(int id) {
        return employeeMapper.delete(id);
    }

    /**
     * 修改员工信息, map中存储要修改的值
     * @param map
     * @return
     */
    @Override
    public int update(Map<String, Object> map) {
        return employeeMapper.update(map);
    }

    /**
     * 支持模糊查询员工
     * @param keyWords
     * @return
     */
    @Override
    public List<Employee> selectLike(String keyWords) {
        return employeeMapper.selectLike(keyWords);
    }
}

单元测试

管理员接口

public class AdminServiceImplTest extends TestCase {
    
    public void testQuery() throws Exception {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml");
        AdminService adminService = applicationContext.getBean("adminServiceImpl", AdminService.class);
        Admin admin = adminService.query("admin");
        System.out.println(MD5Utils.verify("123456", admin.getPassword()));
    }
}

员工接口

public class EmployeeServiceImplTest extends TestCase {

    private static final EmployeeService employeeService;

    static {
        ApplicationContext applicationContext = new ClassPathXmlApplicationContext("application-context.xml");
        employeeService = applicationContext.getBean("employeeServiceImpl", EmployeeService.class);

    }

    public void testSelect() {
        for (Employee employee : employeeService.select()) {
            System.out.println(employee);
        }
    }

    /* public Employee(String name, int sex, String depart, String phone) {*/
    public void testQuery() {
        Employee employee = employeeService.query(2);
        System.out.println(employee);
    }

    public void testAdd() {
        Employee employee = new Employee("bike", 1, "人事部", "11111111111");
        employeeService.add(employee);
    }

    public void testDelete() {
        employeeService.delete(2);
    }

    public void testUpdate() {
        Map<String, Object> map = new HashMap<>();
        map.put("id", 3);
/*        map.put("name", "faker");*/
        map.put("sex", 0);
        map.put("depart", "管理部");
        map.put("phone", "99999999999");
        System.out.println(employeeService.update(map));
    }

    public void testSelectLike() {
        Logger logger = Logger.getLogger(EmployeeServiceImplTest.class);
        logger.debug("hahaha");
        for (Employee employee : employeeService.selectLike("%张%")) {
            System.out.println(employee);
        }
    }
}

配置

实现拦截器

<!--关于拦截器的配置-->
<mvc:interceptors>
    <mvc:interceptor>
        <!--/** 包括路径及其子路径-->
        <!--/admin/* 拦截的是/admin/add等等这种 , /admin/add/user不会被拦截-->
        <!--/admin/** 拦截的是/admin/下的所有-->
        <mvc:mapping path="/**"/>
        <!--bean配置的就是拦截器-->
        <bean class="com.employee.config.InterceptorConfig"/>
    </mvc:interceptor>
</mvc:interceptors>

public class InterceptorConfig implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {
        //如果已经登录过就放行
        //如果访问的是login也放行
        //其他的就拦截
        if (httpServletRequest.getSession().getAttribute("admin") != null) {
            return true;
        }
        if (httpServletRequest.getRequestURI().contains("login")) {
            return true;
        }
        //不能放行, 返回到首页
        httpServletResponse.sendRedirect("./index.jsp");
        return false;
    }

    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

AOP实现前置通知输出数据库操作日志

<!--实现aop日志入库-->
<bean id="adminBeforeLogConfig" class="com.employee.config.AdminBeforeLogConfig"/>
<bean id="employeeBeforeLog" class="com.employee.config.EmployeeBeforeLog"/>
<aop:config>
    <!--配置被代理类的切入点, 注意execution的使用规则第一个* 代表任意返回类型,
    第二个参数表示切入点, .*表示这个类的全部方法, ..表示参数是任意的-->
    <aop:pointcut id="pointcut" expression="execution(* com.employee.service.AdminServiceImpl.*(..))"/>
    <aop:advisor advice-ref="adminBeforeLogConfig" pointcut-ref="pointcut"/>
</aop:config>
<aop:config>
    <!--配置被代理类的切入点, 注意execution的使用规则第一个* 代表任意返回类型,
    第二个参数表示切入点, .*表示这个类的全部方法, ..表示参数是任意的-->
    <aop:pointcut id="pointcut2" expression="execution(* com.employee.service.EmployeeServiceImpl.*(..))"/>
    <aop:advisor advice-ref="employeeBeforeLog" pointcut-ref="pointcut2"/>
</aop:config>

public class AdminBeforeLogConfig implements MethodBeforeAdvice {
    
    static Logger logger = Logger.getLogger(AdminBeforeLogConfig.class);
    
    @Override
    public void before(Method method, Object[] objects, Object o) {
        logger.error("方法名:" + method.getName() + " 参数:"+ Arrays.toString(objects)
                +" 目标:"+o);

    }
}

public class EmployeeBeforeLog implements MethodBeforeAdvice {

    static Logger logger = Logger.getLogger(EmployeeBeforeLog.class);
    
    @Override
    public void before(Method method, Object[] objects, Object o) {
        logger.error("方法名:" + method.getName() + " 参数:"+ Arrays.toString(objects)
                +" 目标:"+o);
    }
}

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-fzqWneVd-1606400193775)(C:\Users\Huawei\AppData\Roaming\Typora\typora-user-images\1606398655371.png)]

controller

管理员controller

@Controller
public class AdminController {

    @Autowired
    AdminService adminService;

    /**
     * 实现登录
     * @param request
     * @return
     * @throws UnsupportedEncodingException
     */
    @RequestMapping(value = "/login", produces="text/html;charset=utf-8")
    @ResponseBody
    public String login(HttpServletRequest request) throws UnsupportedEncodingException {

        request.setCharacterEncoding("UTF-8");
        //获取数据
        String name = request.getParameter("name");
        String password = request.getParameter("password");
        if (name == null || name.length() == 0 || password == null || password.length() == 0) {
            return "请填写账号和密码";
        }

        //查找用户
        Admin admin = adminService.query(name);
        if (admin == null) {
            return "账号或密码错误";
        }

        //密码检验
        boolean verify;
        try {
            verify = MD5Utils.verify(password, admin.getPassword());
        } catch (Exception e) {
            return "MD5检验异常";
        }
        if (verify) {
            //创建session保存
            HttpSession session = request.getSession();
            session.setAttribute("admin", admin);
        }
        System.out.println("[DEBUG]verify " + verify);
        return verify ? "OK":"账号或密码错误";
    }


    /**
     * 实现注销
     * @param session
     * @param response
     * @throws IOException
     */
    @RequestMapping("/down")
    public void down(HttpSession session, HttpServletResponse response) throws IOException {
        session.removeAttribute("admin");
        response.sendRedirect("./index.jsp");
    }
}

员工controller

@Controller
public class EmployeeController {

    @Autowired
    EmployeeService employeeService;


    /**
     * 获取所有员工数据, 返回modelAndView
     * @param model
     * @return
     */
    @RequestMapping("/success")
    public String success(Model model) {
        System.out.println("[DEBUG] success");

        model.addAttribute("list", employeeService.select());
        return "showAll";
    }

    /**
     * 添加一个员工
     * @param name
     * @param sex
     * @param depart
     * @param phone
     * @return
     */
    @RequestMapping(value = "/add", produces = "text/html;charset=utf-8")
    @ResponseBody
    public String add(String name, String sex, String depart, String phone) {
        name = name.trim();
        sex = sex.trim();
        depart = depart.trim();
        phone = phone.trim();
        //检查合法性
        String error = MessageCheck.checkAll(name, sex, depart, phone);
        if (error.length() > 0) {
            return error;
        }
        //进行数据库操作实现增加
        int sexNum = 1;
        if ("girl".equalsIgnoreCase(sex) || "女".equals(sex)) {
            sexNum = 0;
        }
        Employee employee = new Employee(name, sexNum, depart, phone);
        employeeService.add(employee);
        return "OK";

    }

    /**
     * 方便页面跳转
     * @return
     */
    @RequestMapping("/addEmployee")
    public String newEmployee() {
        return "add";
    }

    /**
     * 支持模糊查询
     * @param keyWords
     * @param model
     * @return
     */
    @RequestMapping("/findLike")
    public String findLike(String keyWords, Model model) {
        List<Employee> list = employeeService.selectLike("%" + keyWords + "%");
        if (list.size() == 0) model.addAttribute("ERROR", "未找到");
        model.addAttribute("list", list);
        return "showAll";
    }

    /**
     * 根据id得到员工数据, 然后返回修改数据页面
     * @param id
     * @param model
     * @return
     */
    @RequestMapping("/update/{id}")
    public String update(@PathVariable("id")int id, Model model) {
        Employee employee = employeeService.query(id);
        model.addAttribute("employee", employee);
        return "update";
    }

    /**
     * 执行修改员工数据的操作
     * @param id
     * @param name
     * @param sex
     * @param depart
     * @param phone
     * @return
     */
    @RequestMapping(value = "/update", produces = "text/html;charset=utf-8")
    @ResponseBody
    public String update(int id, String name, String sex, String depart, String phone) {
        name = name.trim();
        sex = sex.trim();
        depart = depart.trim();
        phone = phone.trim();
        //数据检验
        String error = MessageCheck.checkAll(name, sex, depart, phone);
        if (error.length() > 0) {
            return error;
        } else {

        int sexNum = 1;
        if ("girl".equalsIgnoreCase(sex) || "女".equals(sex)) {
            sexNum = 0;
        }

        Employee query = employeeService.query(id);
        Map<String, Object> map = new HashMap<>();
        map.put("id", id);
        if (!query.getName().equals(name)) map.put("name", name);
        if (query.getSex() != sexNum) map.put("sex", sexNum);
        if (!query.getDepart().equals(depart)) map.put("depart", depart);
        if (!query.getPhone().equals(phone)) map.put("phone", phone);
        if (map.size() <= 1) return "OK";


        int update = employeeService.update(map);
        System.out.println("[DEBUG]update " + update);
        return "OK";
        }
    }

    /**
     * 查看某个员工的详细信息
     * @param employeeId
     * @param model
     * @return
     */
    @RequestMapping(value = "/query")
    public String query(int employeeId, Model model) {
        Employee employee = employeeService.query(employeeId);
        model.addAttribute("employee", employee);
        return "detials";
    }

    /**
     * 删除一个员工
     * @param employeeId
     * @return
     */
    @RequestMapping("/delete")
    public String delete(int employeeId) {
        int delete = employeeService.delete(employeeId);
        System.out.println("[DEBUG] " + delete);
        return "redirect:/success";

    }
}

总结

  • 基本功能已实现
  • 进行了单元测试
  • 前端美化不够
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试机试题目,使用Spring + SpringMVC +Mybatis + html + css实现员工管理系统 的相关文章

  • JAXb、Hibernate 和 beans

    目前我正在开发一个使用 Spring Web 服务 hibernate 和 JAXb 的项目 1 我已经使用IDE hibernate代码生成 生成了hibernate bean 2 另外 我已经使用maven编译器生成了jaxb bean
  • Android:捕获的图像未显示在图库中(媒体扫描仪意图不起作用)

    我遇到以下问题 我正在开发一个应用程序 用户可以在其中拍照 附加到帖子中 并将图片保存到外部存储中 我希望这张照片也显示在图片库中 并且我正在使用媒体扫描仪意图 但它似乎不起作用 我在编写代码时遵循官方的Android开发人员指南 所以我不
  • INSERT..RETURNING 在 JOOQ 中不起作用

    我有一个 MariaDB 数据库 我正在尝试在表中插入一行users 它有一个生成的id我想在插入后得到它 我见过this http www jooq org doc 3 8 manual sql building sql statemen
  • 同一配置文件上的两个不同提供程序

    我在用着实体框架 6 1 0 I have 2 家提供者 MysqlClient 和 SQLServerCE 我需要创建2个不同的DBContext 这迫使我创造2个配置类因为mysql有一些不同的东西 但是当我初始化应用程序时 Datab
  • 列出jshell中所有活动的方法

    是否有任何命令可以打印当前 jshell 会话中所有新创建的方法 类似的东西 list但仅适用于方法 您正在寻找命令 methods all 它会打印所有方法 包括启动 JShell 时添加的方法 以及失败 被覆盖或删除的方法 对于您声明的
  • 映射 mysql 中同一个表的多个值

    您好 我必须使用另一个表中的值 id 获取文本值 表 1 包含值 ID 表 2 包含名称和值 ID 表 1 SEVERITY OCCURENCE DETECTABILITY 2 3 4 表 2 id name value 1 Very Hi
  • 从 127.0.0.1 到 2130706433,然后再返回

    使用标准 Java 库 从 IPV4 地址的点分字符串表示形式获取的最快方法是什么 127 0 0 1 到等效的整数表示 2130706433 相应地 反转所述操作的最快方法是什么 从整数开始2130706433到字符串表示形式 127 0
  • Java TestNG 与跨多个测试的数据驱动测试

    我正在电子商务平台中测试一系列商店 每个商店都有一系列属性 我正在考虑对其进行自动化测试 是否有可能有一个数据提供者在整个测试套件中提供数据 而不仅仅是 TestNG 中的测试 我尝试不使用 testNG xml 文件作为机制 因为这些属性
  • SQL不允许表中有重复记录

    如何使其不添加重复项 我想让它通过 ID 之外的所有其他列进行检查 我希望这个无效 ID col1 col2 col3 1 first middle last ID col1 col2 col3 2 first middle last 我希
  • 如何将 pfx 文件转换为 jks,然后通过使用 wsdl 生成的类来使用它来签署传出的肥皂请求

    我正在寻找一个代码示例 该示例演示如何使用 PFX 证书通过 SSL 访问安全 Web 服务 我有证书及其密码 我首先使用下面提到的命令创建一个 KeyStore 实例 keytool importkeystore destkeystore
  • 使用Caliper时如何指定命令行?

    我发现 Google 的微型基准测试项目 Caliper 非常有趣 但文档仍然 除了一些示例 完全不存在 我有两种不同的情况 需要影响 JVM Caliper 启动的命令行 我需要设置一些固定 最好在几个固定值之间交替 D 参数 我需要指定
  • getResourceAsStream() 可以找到 jar 文件之外的文件吗?

    我正在开发一个应用程序 该应用程序使用一个加载配置文件的库 InputStream in getClass getResourceAsStream resource 然后我的应用程序打包在一个 jar文件 如果resource是在里面 ja
  • 将不同类型的参数传递给 jdbctemplate 查询

    我正在尝试使用带有少量不同类型参数的 where 子句从数据库中检索记录 这是我编写的简单方法 我将breedId和性别作为参数传递 public List
  • Google App Engine 如何预编译 Java?

    App Engine 对应用程序的 Java 字节码使用 预编译 过程 以增强应用程序在 Java 运行时环境中的性能 预编译代码的功能与原始字节码相同 有没有详细的信息这是做什么的 我在一个中找到了这个谷歌群组消息 http groups
  • 在mockito中使用when进行模拟ContextLoader.getCurrentWebApplicationContext()调用。我该怎么做?

    我试图在使用 mockito 时模拟 ContextLoader getCurrentWebApplicationContext 调用 但它无法模拟 here is my source code Mock org springframewo
  • Java列表的线程安全

    我有一个列表 它将在线程安全上下文或非线程安全上下文中使用 究竟会是哪一个 无法提前确定 在这种特殊情况下 每当列表进入非线程安全上下文时 我都会使用它来包装它 Collections synchronizedList 但如果不进入非线程安
  • 声明的包“”与预期的包不匹配

    我可以编译并运行我的代码 但 VSCode 中始终显示错误 早些时候有一个弹出窗口 我不记得是什么了 我点击了 全局应用 从那以后一直是这样 Output is there but so is the error The declared
  • simpleframework,将空元素反序列化为空字符串而不是 null

    我使用简单框架 http simple sourceforge net http simple sourceforge net 在一个项目中满足我的序列化 反序列化需求 但在处理空 空字符串值时它不能按预期工作 好吧 至少不是我所期望的 如
  • 获取 JVM 上所有引导类的列表?

    有一种方法叫做findBootstrapClass对于一个类加载器 如果它是引导的 则返回一个类 有没有办法找到类已经加载了 您可以尝试首先通过例如获取引导类加载器呼叫 ClassLoader bootstrapLoader ClassLo
  • 静态变量的线程安全

    class ABC implements Runnable private static int a private static int b public void run 我有一个如上所述的 Java 类 我有这个类的多个线程 在里面r

随机推荐

  • 无卡支付,快捷支付,认证支付,协议支付,代扣区别与联系

    无卡支付 快捷支付 认证支付 协议支付 代扣区别与联系 无卡支付 另外名称叫快捷支付 不需开通网银 只需提供银行卡卡号 户名 手机号码等信息 银行验证手机号码正确性后 第三方支付发送手机动态口令到用户手机号上 用户输入正确的手机动态口令 即
  • 标注一致性:Inter-Annotator Agreement(IAA)

    评价者之间的一致性 Kappas Inter rater agreement Kappas 简书
  • Acwing提高课DP二刷(考研复习)

    前言 本博客主要是为了准备考研数据结构自命题而写的 主要为个人复习使用 里面的题博主在大一大二基本都刷了若干遍 所以这里只写一些简单的思路和总结评语 供日后回顾复习使用 DP 1 acwing1010 导弹拦截 题目大意 利用若干组互相独立
  • vue for循环列表(插槽)输入数据操作

    vue for循环列表 插槽 输入数据操作 1 给循环的每一行的编辑框添加chang事件 输入框 参数 数据的唯一key 绑定的键名 event target value值 下拉框 参数 数据的唯一key 绑定的键名 event值 HTML
  • c++学习之继承

    继承的优点 gt 减少重复代码 class A public B A类称为子类或派生类 B类称为父类或者基类 派生类中的成员 包含两大部分 一类是从基类继承过来的 一类是自己增加的成员 从基类继承过来的表现为共性 而新增的成员表现了个性 代
  • Mysql压力测试(sysbench)

    目录 配置项目环境 参考 采用sysbench压测mysql详解 dream21st的博客 CSDN博客 实验步骤 1 安装sysbench工具 2 在master上创建用户和库 配置用户的权限可以使他可以访问库 Mysql的主从复制 3
  • Java开发工具Idea Revert操作

    Revert是撤销操作 类似于Ctrl Z 不同的是 Revert是以版本为单位 撤销整个版本 可以这样理解Revert操作 假如有V1 V2 V3 V4 V5五个版本 Revert撤销V3版本 实际上就是合并V2版本和V5版本 并对V2版
  • Firefox如何快速关闭网页

    问题You 火狐浏览器如何通过鼠标滑动 快速关闭窗口 火狐浏览器可以通过安装扩展程序来实现通过鼠标滑动快速关闭窗口的功能 以下是具体步骤 打开火狐浏览器 在地址栏中输入 about addons 并回车 在左侧菜单中选择 扩展 然后在右侧搜
  • iOS中.obj、.usdz、.dae和.scn格式之间的转化(思路清晰版)

    作者最近在写项目的过程中遇到了一些3d模型格式问题 故写下这篇文章记录一下解决问题的过程 示例 如果我们想用SceneKit库来实现在默认背景中展示一个3D模型 大致可以这样写代码 var sceneView SCNView var sce
  • 围圈数数淘汰游戏

    在围圈游戏中 规则是从某个数同时开始逆时针和顺时针走一定步长 淘汰对应索引的人员 则有两种情况可能顺逆时针轮到同一个人或许人不同 可以通过一个函数确定每走一步数数的索引值 用一个数组表示每个人是否out 的标志位 初始数组每个值为1 out
  • 编写表格树GridTree过程遇到的问题

    项目中用到不少的树和表格 但是要用到表格树的地方不是很多 但是有时候需要的时候却不好找到 所以就在闲暇的时候自己找了一下 结果发现了很简单的 但是不满足项目的需求 于是就看懂了别人的东西之后 再结合自己的理解 干脆就做一个表格树好了 从写下
  • Angular 6 安装到使用

    TOC 前端 Angular 6 安装到使用 1 下载nodejs 并安装到本地 配置好环境变量 访问nodejs的官方网站的downdolad 网址 https nodejs org en download npm v 查看是否安装成功
  • 强大的jQuery图表插件库Highcharts支持线性图、饼状图、柱状图、区域图、气泡图

    Highcharts是一个纯JavaScript编写的jQuery图表插件库 Highcharts提供了简单的方式为您的网站或项目添加动态图表 Highcharts支持线性图 饼状图 柱状图 区域图 气泡图等近20种图表类型 下载地址 ht
  • mybatis(19)——choose标签,when标签和otherwise标签

    代码
  • JMeter简单使用

    一 下载安装 1 在官网下载或者在 share 192 168 1 201 share 开发工具 java apache jmeter 5 5 zip 2 解压 执行文件在bin目录中 二 常用测试组件 1 线程组 线程组是JMeter 中
  • 服务配置宝塔面板搭建环境及部署项目

    服务配置宝塔面板搭建环境及部署项目 1 登录你所购买阿里云服务器的账号 2 点击控制台 云服务器ecs 3 开通安全组开启端口 把需要访问的端口进行配置 选入方向 如 6379 8080 3306 80 21 22 443 4 获取服务器公
  • FOC和SVPWM的C语言代码实现   

    FOC和SVPWM的C语言代码实现 SVPWM的原理讲解在这儿 https blog csdn net qlexcel article details 74787619 comments 现在开始分析C语言的代码 代码建议复制到notepa
  • 【UE4】DataTable - 数据表

    本文使用 UE 4 26 引擎自带 ARPG 项目 从代码和编辑器两个方面记录一下 UE4 中的 DataTable 也就是数据表的用法 一 DataTable 是什么 DataTable 就是数据表 以下简称 DT 也就是二维的 M 行
  • OLED透明屏轻量化设计:提升便携性与用户体验的新方向

    随着科技的不断进步 OLED透明屏作为一种新兴的显示技术正逐渐走入人们的视野 除了在视觉效果上的优势 OLED透明屏在重量方面的设计也备受关注 对此 尼伽将深入探讨OLED透明屏轻量化设计的重要性 策略以及应用案例 希望看后对您有所启发 一
  • 面试机试题目,使用Spring + SpringMVC +Mybatis + html + css实现员工管理系统

    文章目录 机试挑战 需求分析 简介 访问地址 http 39 99 237 90 8080 employee http 39 99 237 90 8080 employee 源码 https github com Listen Y Java