员工管理系统 2.0 橙色版(java实现版,附源码)

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS PostgreSQL,高可用系列 2核4GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: 员工管理系统 2.0 橙色版(java实现版,附源码)

员工管理系统 2.0 橙色版(java实现版,附源码)

员工管理系统简介:

项目注意事项:struts2中我的action跳转到另外一个action是用的redirect,因为redirect 是重定向到一个URL,我把路径写全之后他也可以跳转action


image.png



小型员工管理系统 1.0 绿色版(java实现版,附源码) :https://blog.csdn.net/weixin_44385486/article/details/120832999


员工管理系统 2.0 橙色版 :

整个系统其实很简单,这里主要技术:idea开发工具+JSP + Struts+Mybatis+ Mysql实现

1、管理员的登录,注册,验证码功能

2、员工的增删改查,批量删除,上传文件,下载文件 其中类的设计(实体)很有参考意义。

整个系统设计的目标人群是管理者,系统的主要功能是对员工进行各种信息的操作。

主要是完成对数据库的增删改查的功能。

3、新增功能:展示所有员工数据页面升级为分页(后端mybatis实现,前端使用bootStrap实现分页)展示所有员工,分页的页面新增图灵机器人 实现智能客服,新增跳转QQ客服功能


前提:项目新增功能:

1、智能机器人程序

图灵机器人网址:http://www.turingapi.com/

# 图灵机器人的访问
1. 地址:
   http://www.tuling123.com/openapi/api
2. apikey: 用来区别使用哪个机器人
    key=apikey的值
3. 问题:
   info=要问的问题. 
总结:
   **http://www.tuling123.com/openapi/api?key=apikey的值&info=这里拼接你的问题**

image.png



image.png

image.png

http工具

// 1. 定义一个问题
String que = "天津今天天气如何?";
/**
 * 2. 使用hutool的http工具,向图灵发起请求
 * 
 * key=是机器人的apikey
 * info=是向机器人发起的问题
 * 返回值是机器人回答的结果.
 */
String ans = HttpUtil.get("http://www.tuling123.com/openapi/api?key=7789c9a323de40908d7792be7b1dd7c6&info=" + que, Charset.forName("UTF-8"));
System.out.println(ans);
public class RobotTest {
    public static void main(String[] args) {
        System.out.println("--------欢迎使用智能机器人--------");
        //---循环开始
        while(true) {
            //2.提示用户输入问题
            Scanner scanner = new Scanner(System.in);
            System.out.println("请输入你的问题:");
            String que = scanner.nextLine();
            //3.如果用户输入“退出”,则退出程序
            if (que.equals("退出")) {
                break;
            }
            //4.创建用来处理问题的机器人对象
            String ans = HttpUtil.get("http://www.tuling123.com/openapi/api?key=7789c9a323de40908d7792be7b1dd7c6&info=" + que, Charset.forName("UTF-8"));
            //5.显示答案给用户
            System.out.println(ans);
        }
    }
}

一. 项目整体目录结构

MVC实现,界面层(Web)主要使用jsp来动态展现数据库中的数据,业务逻辑层(servlets)使用的servlet,数据访问层(dao)主要是连接各个Servlet与数据库之前的通信,从而实现对数据库的各种操作。其中的entity包主要是封装了两个实体:管理员和员工,方便且规范对数据的操作和代码的书写。

image.png

image.png




二. 界面效果展示:

1、管理员页面

(1)管理员登录页面

image.png


(2)管理员注册页面

image.png


2、员工页面

(1)员工页面展示

页面展示完成员工的增删改查

image.png

image.png



(2)员工更新【页面数据回显】

image.png


(3)添加员工页面

image.png


(4)图灵机器人实现智能回复

image.png


三、数据库设计

1、admin表(管理员的账号和密码)


image.png

2、user表(员工信息表)


image.png

四、核心jar包(jar包下载参见文章末尾)


image.png

五、核心代码展示:(完整代码参见文章末尾)

1、entity类


image.png

(1)Admin.java(管理员属性的实体层,这里有管理员的登录账号和密码的定义)

public class Admin {
    private Integer id;
    private String name;
    private  String password;

(2)User.java(和Admin.java差不多主要是实体属性的get和set方法)

public class User {
    private Integer id;
    private String username;
    private String password;
    private Integer age;
    private Date birthday;

2、Dao层


image.png

(1)AdminDao接口

管理员功能:登录 注册 退出

public interface AdminDao {
    /**
     * 登录
     * @param name
     * @param password
     * @return
     */
    public Admin selectByNameAndPassword(@Param("name") String name,@Param("password") String password);
    /**
     * 添加管理员
     * @param admin
     */
    public void insertAdmin(Admin admin);
}

(2)AdminDaoImpl.xml接口实现

<mapper namespace="com.tjcu.dao.AdminDao">
    <select id="selectByNameAndPassword" resultType="admin">
        select * from admin where name=#{name} and password=#{password}
    </select>
    <insert id="insertAdmin">
        insert into admin value(#{id},#{name},#{password})
    </insert>
</mapper>

(3)UserDao接口

员工功能:分页展示所有 、 添加 、 删除 、 修改

public interface UserDao {
    /**
     * 分页查询:查询当前页的开始条数,及当前页数
     * offset:表示查询条目的起始下标,
     * rows:表示当前页最多显示多少条
     * @param offset 当前页的开始条数
     * @param rows  页展示的条数
     * @return 用户集合
     */
    public List<User> selectPage(@Param ("offset")int offset, @Param("rows") int rows);
    /**
     * 查询当前数据库用户数据总条数
     * @return
     */
    public int selectTotalNumber();
    /**
     * 添加用户
     * @param user
     */
    public void insertUser(User user);
    /**
     * 删除用户
     * @param id
     */
    public void deleteUserById(Integer id);
    /**
     * 更新用户
     * @param user
     */
    public void updateById(User user);
    /**
     * 根据id查询用户,用户数据回显
     * @param id
     * @return
     */
    public User selectById(Integer id);
    /**
     * 批量删除
     * @param ids
     * @return
     */
    public void batchDelete(List<Integer> ids);
}

(4)UserDaoImpl.xml接口实现

<mapper namespace="com.tjcu.dao.UserDao">
    <!--动态分片-->
    <sql id="selectUser">
        select *
        from t_user
    </sql>
    <!--    
     /**
     分页查询:
      查询当前页的开始条数,及当前页数接口
      offset:表示查询条目的起始下标,
      rows:表示最多显示多少条
      public List<User> selectPage(int beginNumber,int size);
       mysql中分页的sql语句:
       limit关键字用来限制查询结果的条目数,通常用于分页查询。
       语法:
       //sql语句中的最后一行语句
            limit offset,rows;
             offset:表示查询条目的起始下标,
             rows:表示最多显示多少条
       例:获取前10行:
       select * from employees limit 0,10;
       例:获取11行~20行
       select * from employees limit 10,10;
        -->
    <select id="selectPage" resultType="user">
        select *
        from t_user limit #{offset},#{rows}
    </select>
    <!--
     查询当前数据库用户的所有条数
        public int selectTotalPage();
    -->
    <select id="selectTotalNumber" resultType="int">
        select count(*)
        from t_user
    </select>
    <!--
    insertUser:添加用户
    User属性: id,username,password,age,birthday;
    -->
    <insert id="insertUser">
        insert into t_user
        values (#{id}, #{username}, #{password}, #{age}, #{birthday});
    </insert>
    <!--
    删除用户
    deleteUserById
    -->
    <delete id="deleteUserById">
        delete
        from t_user
        where id = #{id}
    </delete>
    <!--
     更新用户
     updateById
     Mybatis中的Sql动态语句
     User属性: id,username,password,age,birthday;
    -->
    <update id="updateById">
        update t_user
        <set>
            <if test="username">
                username=#{username},
            </if>
            <if test="password">
                password=#{password},
            </if>
            <if test="age">
                age=#{age},
            </if>
            <if test="birthday">
                birthday=#{birthday}
            </if>
        </set>
        where id=#{id}
    </update>
    <!--
       根据id查询用户,用户数据回显
        selectById
    -->
    <select id="selectById" resultType="user">
        <include refid="selectUser"/>
        where id=#{id}
    </select>
    <!--
    批量删除
    batchDelete(List<Integer> ids);
    -->
    <!--
  t_user : 表名
  id : 字段名
  collection:表示类型,这里参数是数组,就写成array,如果是集合,就写成list
  item : 是一个变量名,自己随便起名
  -->
    <delete id="batchDelete">
        delete from t_user where id
        <foreach collection="list" open="in(" item="id" separator="," close=")">
            #{id}
        </foreach>
    </delete>
</mapper>

3、service层[略,详情请参见文章末尾]


image.png

4、struts2实现Action层


image.png

(1)AdminAction:管理员登录、注册

package com.tjcu.action;
import com.opensymphony.xwork2.ActionSupport;
import com.tjcu.entity.Admin;
import com.tjcu.service.AdminServiceImpl;
import org.apache.struts2.ServletActionContext;
import javax.servlet.http.HttpSession;
/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/17 20:37
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class AdminAction extends ActionSupport {
    private Admin admin;
    private String password2;
    private  String code;
    /**
     * 登录
     *
     * @return
     */
    public String login() {
        AdminServiceImpl adminService = new AdminServiceImpl();
        System.out.println("12323r4tfr"+admin);
        HttpSession session = ServletActionContext.getRequest().getSession();
        String code1 = (String) session.getAttribute("code1");
        System.out.println("1234"+code1);
        System.out.println("code"+code);
        if(code.equals(code1)){
            if (admin != null) {
               ServletActionContext.getRequest().getSession().setAttribute("login",admin.getName());
                return "loginOk";
            } else {
                return "loginError";
            }
        }else {
            return "loginError";
        }
    }
    /**
     * 注册
     *
     * @return
     */
    public String register() {
        AdminServiceImpl adminService = new AdminServiceImpl();
        if (admin.getPassword().equals(password2) ) {
            System.out.println("OK");
            HttpSession session = ServletActionContext.getRequest().getSession();
            String code1 = (String) session.getAttribute("code1");
            if(code.equals(code1)) {
                adminService.insertAdmin(admin);
                return "registerOk";
            }else {
                return "registerError";
            }
        } else {
            return "registerError";
        }
    }
    public Admin getAdmin() {
        return admin;
    }
    public void setAdmin(Admin admin) {
        this.admin = admin;
    }
    public String getPassword2() {
        return password2;
    }
    public void setPassword2(String password2) {
        this.password2 = password2;
    }
    public String getCode() {
        return code;
    }
    public void setCode(String code) {
        this.code = code;
    }
}

(2)UserDao员工:增删改查

package com.tjcu.action;
import com.opensymphony.xwork2.ActionSupport;
import com.tjcu.entity.User;
import com.tjcu.service.UserServiceImpl;
import java.util.List;
/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/10/13 11:11
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class UserAction extends ActionSupport {
    /**
     * 总页数
     */
    private Integer totalPage;
    /**
     * 第几页
     */
    private Integer pageNumber;
    /**
     * 实体类
     */
    private User user;
    private List<User> users;
    private List<Integer> ids;
    /**
     * 分页实现展示页面
     *
     * @return
     */
    public String page() {
        UserServiceImpl userService = new UserServiceImpl();
        //第几页获取的用户
        users = userService.selectPage(pageNumber);
        System.out.println(users);
        //总页数
        totalPage = userService.selectTotalPage();
        System.out.println(totalPage);
        return "pageOk";
    }
    /**
     * 增
     */
    public String insertUser() {
        UserServiceImpl userService = new UserServiceImpl();
        //User属性: id,username,password,age,birthday;
        user.setId(null);
        userService.insertUser(user);
        return "insertOK";
    }
    /**
     * 删
     */
    public String deleteUser() {
        UserServiceImpl userService = new UserServiceImpl();
        userService.deleteUserById(user.getId());
        return "deleteOk";
    }
    /**
     * 更新
     */
    public String updateUser() {
        UserServiceImpl userService = new UserServiceImpl();
        userService.updateById(user);
        return "updateOk";
    }
    /**
     * 通过id查询用户
     */
    public String selectUserById() {
        UserServiceImpl userService = new UserServiceImpl();
        user = userService.selectById(user.getId());
        System.out.println(user);
        return "selectOK";
    }
    /**
     * 批量删除
     * @return
     */
    public String batchDelete() {
        UserServiceImpl userService = new UserServiceImpl();
        System.out.println(ids);
        userService.batchDelete(ids);
        return "batchDeleteOk";
    }
    public Integer getTotalPage() {
        return totalPage;
    }
    public void setTotalPage(Integer totalPage) {
        this.totalPage = totalPage;
    }
    public Integer getPageNumber() {
        return pageNumber;
    }
    public void setPageNumber(Integer pageNumber) {
        this.pageNumber = pageNumber;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public List<User> getUsers() {
        return users;
    }
    public void setUsers(List<User> users) {
        this.users = users;
    }
    public List<Integer> getIds() {
        return ids;
    }
    public void setIds(List<Integer> ids) {
        this.ids = ids;
    }
}

(3)ValidationCodeAction:验证码功能

package com.tjcu.action;
/**
 *  用于生成验证码图片  不提供返回页面
 * @author 86151
 */
public class ValidationCodeAction implements Action {
  private static final long serialVersionUID = 5126616339795936447L;
  private ConfigurableCaptchaService configurableCaptchaService = null;
  private ColorFactory colorFactory = null;
  private RandomFontFactory fontFactory = null;
  private RandomWordFactory wordFactory = null;
  private TextRenderer textRenderer = null;
  public void init() throws ServletException {
    configurableCaptchaService = new ConfigurableCaptchaService();
    // 颜色创建工厂,使用一定范围内的随机色
    colorFactory = new RandomColorFactory();
    configurableCaptchaService.setColorFactory(colorFactory);
    // 随机字体生成器
    fontFactory = new RandomFontFactory();
    fontFactory.setMaxSize(32);
    fontFactory.setMinSize(28);
    configurableCaptchaService.setFontFactory(fontFactory);
    // 随机字符生成器,去除掉容易混淆的字母和数字,如o和0等
    wordFactory = new RandomWordFactory();
    wordFactory.setCharacters("abcdefghkmnpqstwxyz23456789");
    wordFactory.setMaxLength(5);
    wordFactory.setMinLength(4);
    configurableCaptchaService.setWordFactory(wordFactory);
    // 自定义验证码图片背景
    MyCustomBackgroundFactory backgroundFactory = new MyCustomBackgroundFactory();
    configurableCaptchaService.setBackgroundFactory(backgroundFactory);
    // 图片滤镜设置
    ConfigurableFilterFactory filterFactory = new ConfigurableFilterFactory();
    List<BufferedImageOp> filters = new ArrayList<BufferedImageOp>();
    WobbleImageOp wobbleImageOp = new WobbleImageOp();
    wobbleImageOp.setEdgeMode(AbstractImageOp.EDGE_MIRROR);
    wobbleImageOp.setxAmplitude(2.0);
    wobbleImageOp.setyAmplitude(1.0);
    filters.add(wobbleImageOp);
    filterFactory.setFilters(filters);
    configurableCaptchaService.setFilterFactory(filterFactory);
    // 文字渲染器设置
    textRenderer = new BestFitTextRenderer();
    textRenderer.setBottomMargin(3);
    textRenderer.setTopMargin(3);
    configurableCaptchaService.setTextRenderer(textRenderer);
    // 验证码图片的大小
    configurableCaptchaService.setWidth(82);
    configurableCaptchaService.setHeight(32);
  }
  @Override
  public String execute() throws Exception {
    init();
    HttpServletRequest request = ServletActionContext.getRequest();
    HttpServletResponse response = ServletActionContext.getResponse();
    response.setContentType("image/png");
    response.setHeader("cache", "no-cache");
    HttpSession session = request.getSession(true);
    OutputStream outputStream = response.getOutputStream();
    // 得到验证码对象,有验证码图片和验证码字符串
    Captcha captcha = configurableCaptchaService.getCaptcha();
    // 取得验证码字符串放入Session
    String validationCode = captcha.getChallenge();
    session.setAttribute("code", validationCode);
    // 取得验证码图片并输出
    BufferedImage bufferedImage = captcha.getImage();
    ImageIO.write(bufferedImage, "png", outputStream);
    outputStream.flush();
    outputStream.close();
    destroy();
    return null;
  }
  public void destroy() {
    wordFactory = null;
    colorFactory = null;
    fontFactory = null;
    textRenderer = null;
    configurableCaptchaService = null;
  }
  /**
   * 自定义验证码图片背景,主要画一些噪点和干扰线
   */
  private class MyCustomBackgroundFactory implements BackgroundFactory {
    private Random random = new Random();
    @Override
    public void fillBackground(BufferedImage image) {
      Graphics graphics = image.getGraphics();
      // 验证码图片的宽高
      int imgWidth = image.getWidth();
      int imgHeight = image.getHeight();
      // 填充为白色背景
      graphics.setColor(Color.WHITE);
      graphics.fillRect(0, 0, imgWidth, imgHeight);
      // 画100个噪点(颜色及位置随机)
      for (int i = 0; i < 100; i++) {
        // 随机颜色
        int rInt = random.nextInt(255);
        int gInt = random.nextInt(255);
        int bInt = random.nextInt(255);
        graphics.setColor(new Color(rInt, gInt, bInt));
        // 随机位置
        int xInt = random.nextInt(imgWidth - 3);
        int yInt = random.nextInt(imgHeight - 2);
        // 随机旋转角度
        int sAngleInt = random.nextInt(360);
        int eAngleInt = random.nextInt(360);
        // 随机大小
        int wInt = random.nextInt(6);
        int hInt = random.nextInt(6);
        graphics.fillArc(xInt, yInt, wInt, hInt, sAngleInt, eAngleInt);
        // 画5条干扰线
        if (i % 20 == 0) {
          int xInt2 = random.nextInt(imgWidth);
          int yInt2 = random.nextInt(imgHeight);
          graphics.drawLine(xInt, yInt, xInt2, yInt2);
        }
      }
    }
  }
}

5、util层

手动封装JDBCUtils工具类

package com.tjcu.utils;
import java.io.IOException;
import java.io.InputStream;
import java.sql.*;
import java.util.Properties;
/**
 * @author 王恒杰
 * @version 1.0
 * @date 2021/9/11 12:38
 * @email 1078993387@qq.com
 * @Address 天津
 * @Description:
 */
public class JdbcUtils {
    //    静态的Properties集合,相当于属性
    private static Properties p = new Properties();
    //    静态的ThreadLocal输性  线程绑定对象
    private static final ThreadLocal<Connection> t = new ThreadLocal();
    static {
        InputStream is = JdbcUtils.class.getResourceAsStream("/com/tjcu/jdbc.properties");
        try {
            p.load(is);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    public static Connection getConnection() {
        //从ThreadLocal中获取Connection
        Connection conn = t.get();
        try {
            if (conn == null) {
                Class.forName(p.getProperty("driver"));
                conn = DriverManager.getConnection(p.getProperty("url"), p.getProperty("username"), p.getProperty("password"));
                t.set(conn);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return t.get();
    }
    public static void close(ResultSet rs, PreparedStatement pstm, Connection conn) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (pstm != null) {
            try {
                pstm.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
                t.remove();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    public static void close(ResultSet rs, PreparedStatement pstm) {
        if (rs != null) {
            try {
                rs.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (pstm != null) {
            try {
                pstm.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    public static void close(PreparedStatement pstm, Connection conn) {
        if (pstm != null) {
            try {
                pstm.close();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
        if (conn != null) {
            try {
                conn.close();
                //关闭链接后切记使用remove方法,移除ThreadLocal中已关闭的链接对象
                t.remove();
            } catch (SQLException throwables) {
                throwables.printStackTrace();
            }
        }
    }
    //关闭资源  用于关闭连接
    public static void close(Connection conn) {
        if (conn != null) {
            try {
                conn.close();
                //关闭链接后切记使用remove方法,移除ThreadLocal中已关闭的链接对象
                t.remove();
            } catch (Exception e) {
            }
        }
    }
}

6、config 配置文件:jdbc.properties

mysql-connector-java-8.0.16.jar之后com.mysql.cj.jdbc.Driver

driver=com.mysql.cj.jdbc.Driver
username=root
password=root
url=jdbc:mysql://localhost:3306/msc?useUnicode=true&characterEncoding=UTF-8  & useSSL=false & serverTimezone=Asia/Shanghai

源代码在githee仓库:

程序员小王Gitee: https://gitee.com/wanghengjie563135/EMS.git


相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
相关文章
|
1月前
|
消息中间件 Java Kafka
Java 事件驱动架构设计实战与 Kafka 生态系统组件实操全流程指南
本指南详解Java事件驱动架构与Kafka生态实操,涵盖环境搭建、事件模型定义、生产者与消费者实现、事件测试及高级特性,助你快速构建高可扩展分布式系统。
155 7
|
2月前
|
存储 Java 数据库连接
java 初学者必看的系统知识结构图详解
本文详解Java知识结构图,涵盖Java语言基础、JVM原理、集合框架、并发编程、网络通信及主流框架(如Spring Boot、MyBatis),并结合学生信息管理系统实例,帮助初学者构建完整知识体系,提升实战开发能力。
90 0
|
15天前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
103 2
|
8天前
|
存储 小程序 Java
热门小程序源码合集:微信抖音小程序源码支持PHP/Java/uni-app完整项目实践指南
小程序已成为企业获客与开发者创业的重要载体。本文详解PHP、Java、uni-app三大技术栈在电商、工具、服务类小程序中的源码应用,提供从开发到部署的全流程指南,并分享选型避坑与商业化落地策略,助力开发者高效构建稳定可扩展项目。
|
9天前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
71 0
|
1月前
|
安全 Oracle Java
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
177 0
JAVA高级开发必备·卓伊凡详细JDK、JRE、JVM与Java生态深度解析-形象比喻系统理解-优雅草卓伊凡
|
3月前
|
NoSQL Java Shell
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
164 8
2025服务端java搭建篇:蜻蜓I即时通讯系统私有化部署深度指南-优雅草卓伊凡|麻子|贝贝
|
1月前
|
Java 数据库 前端开发
分享44个java系统,总有一款适合您
分享44个微信小程序,总有一款适合您
37 0
|
4月前
|
Java 关系型数据库 MySQL
java酒店管理系统的设计与实现
java酒店管理系统的设计与实现
|
4月前
|
JavaScript Java 关系型数据库
家政系统源码,java版本
这是一款基于SpringBoot后端框架、MySQL数据库及Uniapp移动端开发的家政预约上门服务系统。
153 6
家政系统源码,java版本