Java程序员用下班时间给学弟做了一个在线考试系统

简介: Java程序员用下班时间给学弟做了一个在线考试系统

一、框架介绍


1.1、Spring


Spring是一个开源框架,Spring是于2003 年兴起的一个轻量级的Java 开发框架,
由Rod Johnson 在其著作Expert One-On-One J2EE Development and Design中阐述的部分理念和原型衍生而来。
它是为了解决企业应用开发的复杂性而创建的。
Spring使用基本的JavaBean来完成以前只可能由EJB完成的事情。然而,Spring的用途不仅限于服务器端的开发。
从简单性、可测试性和松耦合的角度而言,任何Java应用都可以从Spring中受益。
 简单来说,Spring是一个轻量级的控制反转(IoC)和面向切面(AOP)的容器框架


1.2、SpringMVC


  Spring MVC属于SpringFrameWork的后续产品,
  已经融合在Spring Web Flow里面。
  Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,
  这种分离让它们更容易进行定制。


52cd1ca38bec40a4860ce8e65bca3265.png


1.3、MyBatis


MyBatis 本是apache的一个开源项目iBatis, 
2010年这个项目由apache software foundation 迁移到了google code,
并且改名为MyBatis 。MyBatis是一个基于Java的持久层框架。
iBATIS提供的持久层框架包括SQL Maps和Data Access Objects(DAO)
MyBatis 消除了几乎所有的JDBC代码和参数的手工设置以及结果集的检索。
MyBatis 使用简单的 XML或注解用于配置和原始映射,
将接口和 Java 的POJOs(Plain Old Java Objects,
普通的 Java对象)映射成数据库中的记录。


1.4、SSM整合


这次整合我分了2个配置文件,分别是spring-mybatis.xml,
包含spring和mybatis的配置文件,还有个是spring-mvc的配置文件,
此外有2个资源文件:jdbc.propertis和log4j.properties


完整目录结构如下:

1b67ffc648ff402096b31acfd97d686f.png



二、开发环境



开发语言:Java
技术:JavaWeb【Servlet】
数据库:MySQL
架构:B/S
源码类型: Web
编译工具:Idea、Eclipse、MyEclipse (选其一)
其他:jdk1.8、Tomcat5.7 、Navicat
使用框架的版本:
Spring 3.2.12 RELEASE
Spring MVC 4.0.2 RELEASE
MyBatis 3.2.6


三、系统功能



3.1 考试界面登陆

0b5b6404ec5648f7ba941ab55777b516.png

8033f38062b64fcbaf14b3335ed39b47.png




3.2 选择试题

95211268c9ca4a29863fcdc57f7c8480.png


3.3 试卷界面

8b51940c9a524fe2992a62fba0731f49.png

b7366293705c4bce976a2cf5cc8d2a9a.png


3.3 后台管理员主界面

6e1cee3733e2468c9688cbb9ebc5051c.png


3.4 管理菜单

4750c6516b2d474b8f3070cd7fb01119.png

3.4.1 学员管理


8f69c62292e64d99a735243223b7ef27.png

3.4.2 套题管理

523bd54ca5b04095ad4df0a2474abab1.png


3.4.3 试题结构维护

b973fdb10b1c40ce8d446e9033cf2e32.png


3.4.3 题库管理

65a6512673ae4962900d3cae462bdf7f.png

3.4.5 成绩查询


41327b0a036a4da3b8ca9b3f515d364c.png


3.4.6 考试报告

69bb6455644147b89a573d783fdd0b6c.png


四、部分代码展示



4.1.login.jsp


<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ include file="/base.jsp"%>
<!DOCTYPE html>
<html>
<head>
<!-- Meta -->
<meta charset="utf-8" http-equiv="Content-Type" />
<!-- End of Meta -->
<!-- Page title -->
<title>登录 -${websitemap.web.company}-${websitemap.web.title}</title>
<!-- End of Page title -->
<meta name="author" content="${websitemap.web.author}" />
<meta name="keywords" content="${websitemap.web.keywords}" />
<meta name="description" content="${websitemap.web.description}" />
<link rel="shortcut icon" href="${ctx}/favicon.ico" type="image/x-icon">
<!-- Libraries -->
<link type="text/css" href="${ctx}/static/admin/css/login.css" rel="stylesheet" />
<script type="text/javascript">
  function enterSubmit(event) {
    var keyCode = event.keyCode ? event.keyCode : event.which ? event.which : event.charCode;
    if (keyCode == 13) {
      $("#loginForm").submit();
      return false;
    }
  }
</script>
</head>
<body>
  <div id="container">
    <div class="logo">
      <a href="javascript:void(0);" onclick="return false;" target="_blank" title="Elearning">
      </a>
    </div>
  </div>
  <div class="b-box">
    <div id="container">
      <div id="box">
        <h2>在线考试后台管理系统</h2>
        <form action="${ctx}/admin/main/login" method="POST" id="loginForm">
          <p class="main">
            <label>用户名: </label>
            <input name="sysUser.loginName" onkeyup="enterSubmit(event)" value="${sysUser.loginName}" placeholder="输入用户名" />
            <label>密码: </label>
            <input type="password" onkeyup="enterSubmit(event)" name="sysUser.loginPwd" value="${sysUser.loginPwd}" placeholder="输入密码">
          </p>
          <p class="main">
            <label>验证码: </label>
            <input name="randomCode" onkeyup="enterSubmit(event)" placeholder="验证码" style="width: 105px;"  maxlength="4"/>
            <span class="yzm-pic">
              <img src="${ctx}/ran/random" alt="验证码,点击图片更换" onclick="this.src='${ctx}/ran/random?random='+Math.random();" />
            </span>
          </p>
          <p class="space">
            <input type="submit" value="登录" class="login" />
            <span>${message}</span>
          </p>
        </form>
      </div>
      <div class="login-foot">
        <span>
          Powered By <a target="_blank" href="#" style="color: #666;">IT邦德</a>
        </span>
      </div>
    </div>
  </div>
</body>
</html>



4.2 修改学员信息


4.2 .1 Controller


/**
   * 修改学员信息
   */
  @RequestMapping("/updateUserInfo")
  @ResponseBody
  public Map<String, Object> updateUserInfo(HttpServletRequest request,
      @ModelAttribute("user") User user) {
    Map<String, Object> json = new HashMap<String, Object>();
    try {
      if (user.getUserId() > 0) {
        if (user.getShowName() == null || user.getShowName() == "") {
          json = this.setJson(false, "姓名不能为空!", null);
          return json;
        }
        if (user.getEmail() != null
            && user.getEmail().trim().length() > 0
            && !WebUtils.checkEmail(user.getEmail(), 50)) {
          json = this.setJson(false, "请输入正确的邮箱号", null);
          return json;
        }
        if (user.getMobile() != null
            && user.getMobile().trim().length() > 0
            && !WebUtils.checkMobile(user.getMobile())) {
          json = this.setJson(false, "请输入正确的电话号", null);
          return json;
        }
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
        String startDate=user.getStartDate();
        user.setShiftTime(sdf.parse(startDate));
        userService.updateUser(user);
        json = this.setJson(true, "学员修改成功", null);
      } else {
        json = this.setJson(false, "修改失败", null);
      }
    } catch (Exception e) {
      this.setAjaxException(json);
      logger.error("udpateUser()--error", e);
    }
    return json;
  }


4.2.2 Service


public interface UserService {
  /**
   * 创建用户
   * @param user
   * @return 返回用户ID
   */
  public int createUser(User user);
  /**
   * 通过用户ID查询用户
   * @param userId 用户不D
   * @return User
   */
  public User queryUserById(int userId);
  /**
   * 检测用户工号是否存在 
   * @param username 工号
   * @return  true存在 false不存在 
   */
  public boolean checkuserName(String username);
  /**
   * 检测手机是否存在 
   * @param mobile 手机号
   * @return true存在 false不存在 
   */
  public boolean checkMobile(String mobile);


4.2.3 ServiceImpl


@Service("userService")
public class UserServiceImpl implements UserService{
  @Autowired
  private UserDao userDao;
  @Autowired
  private SysDictService sysDictService;
  @Autowired
  private UserGroupService userGroupService;
  public int createUser(User user) {
    return userDao.createUser(user);
  }
  public User queryUserById(int userId) {
    return userDao.queryUserById(userId);
  }
  public boolean checkMobile(String mobile) {
    int count = userDao.checkMobile(mobile);
    if(count>0){
      return true;
    }
    return false;
  }
  public boolean checkuserName(String username) {
    int count = userDao.checkuserName(username);
    if(count>0){
      return true;
    }
    return false;
  }


4.2.4 dao


public interface UserDao {
  /**
   * 创建用户
   * @param user
   * @return 返回用户ID
   */
  public int createUser(User user);
  /**
   * 通过用户ID查询用户
   * @param userId 用户不D
   * @return User
   */
  public User queryUserById(int userId);
  /**
   * 检测手机是否存在 
   * @param mobile 手机号
   * @return 返回记录数
   */
  public int checkMobile(String mobile);
  /**
   * 检测工号是否存在 
   * @param username 工号
   * @return 返回记录数
   */
  public int checkuserName(String username);
  /**
   * 检测邮箱号是否存在 
   * @param email 邮箱号
   * @return 返回记录数
   */
  public int checkEmail(String email);


4.2.5 UserMapper


<?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="UserMapper">
  <!-- 分页查询用户列表,开始 -->
  <select id="queryUserListPage" parameterType="java.util.Map" resultMap="UserResult">
  SELECT <include refid="edu_user_column"/> FROM EDU_USER 
  <where>
    <if test="e.isavalible>0">
    EDU_USER.IS_AVALIBLE=#{e.isavalible}
    </if>
      <if test="e.usergroup!=null and e.usergroup!=''">
    AND (EDU_USER.USERGROUP LIKE CONCAT('%',#{e.usergroup},'%'))
    </if>
    <if test="e.keyWord!=null and e.keyWord!=''">
    AND (EDU_USER.MOBILE LIKE CONCAT('%',#{e.keyWord},'%') OR EDU_USER.EMAIL LIKE CONCAT('%',#{e.keyWord},'%') OR EDU_USER.USER_NAME LIKE CONCAT('%',#{e.keyWord},'%') OR EDU_USER.SHOW_NAME LIKE CONCAT('%',#{e.keyWord},'%'))
    </if>
    <if test="e.beginCreateTime!=null and e.beginCreateTime!=''">
      AND EDU_USER.CREATE_TIME >= #{e.beginCreateTime}
    </if>
    <if test="e.endCreateTime!=null and e.endCreateTime!=''">
      AND <![CDATA[EDU_USER.CREATE_TIME <= #{e.endCreateTime}]]>
    </if>
  </where>
  <include refid="publicMapper.pageEnd"/>
  </select>
  <select id="queryUserListPageCount" parameterType="java.util.Map" resultType="int">
  SELECT COUNT(1) FROM EDU_USER 
  <where>
    <if test="e.isavalible>0">
    EDU_USER.IS_AVALIBLE=#{e.isavalible}
    </if>
      <if test="e.usergroup!=null and e.usergroup!=''">
    AND (EDU_USER.USERGROUP LIKE CONCAT('%',#{e.usergroup},'%'))
    </if>
    <if test="e.keyWord!=null and e.keyWord!=''">
    AND (EDU_USER.MOBILE LIKE CONCAT('%',#{e.keyWord},'%') OR EDU_USER.EMAIL LIKE CONCAT('%',#{e.keyWord},'%') OR EDU_USER.USER_NAME LIKE CONCAT('%',#{e.keyWord},'%') OR EDU_USER.SHOW_NAME LIKE CONCAT('%',#{e.keyWord},'%'))
    </if>
    <if test="e.beginCreateTime!=null and e.beginCreateTime!=''">
      AND EDU_USER.CREATE_TIME >= #{e.beginCreateTime}
    </if>
    <if test="e.endCreateTime!=null and e.endCreateTime!=''">
      AND <![CDATA[EDU_USER.CREATE_TIME <= #{e.endCreateTime}]]>
    </if>
  </where>
  </select>
  <!-- 分页查询用户列表,结束--> 
  <select id="queryUserByUserName" parameterType="java.lang.String" resultMap="UserResult">
  SELECT <include refid="edu_user_column"/> FROM EDU_USER
  <where>
    EDU_USER.USER_NAME = #{value}
  </where>
  </select>
  <!-- 冻结或解冻用户 -->
  <update id="updateUserStates" parameterType="User">
  UPDATE EDU_USER SET EDU_USER.IS_AVALIBLE=#{isavalible} WHERE EDU_USER.USER_ID=#{userId}
  </update>
  <!-- 修改用户信息 -->
  <update id="updateUser" parameterType="User">
  UPDATE EDU_USER SET 
  EDU_USER.SHOW_NAME=#{showName},
  EDU_USER.USERGROUP=#{usergroup},
  EDU_USER.SECTION=#{section},
  EDU_USER.EMAIL=#{email},
  EDU_USER.MOBILE=#{mobile},
  EDU_USER.SEX=#{sex},
  EDU_USER.AGE=#{age},
  EDU_USER.SHIFT_DATE=#{shiftTime},
  EDU_USER.FREQUENCY=#{frequency}
  WHERE EDU_USER.USER_ID=#{userId}
  </update>
  <!-- 修改用户头像 -->
  <update id="updateImg" parameterType="User">
  UPDATE EDU_USER SET 
  EDU_USER.PIC_IMG=#{picImg}
  WHERE EDU_USER.USER_ID=#{userId}
  </update>
  <!-- 修改个中心个性化图片URL -->
  <update id="updateUserBannerUrl" parameterType="User">
  UPDATE EDU_USER SET BANNER_URL=#{bannerUrl} WHERE USER_ID=#{userId}
  </update>
  <!-- 查询所有学员记录数 -->
  <select id="queryAllUserCount" resultType="int">
  SELECT COUNT(1) FROM EDU_USER
  </select>
  <!-- 通过手机号或邮箱号查询用户信息 -->
  <select id="queryUserByEmailOrMobile" parameterType="java.lang.String" resultMap="UserResult">
  SELECT <include refid="edu_user_column"/> FROM EDU_USER WHERE EMAIL=#{value} OR MOBILE=#{value} LIMIT 1
  </select>
  <!-- 根据多个用户id获取用户信息 -->
  <select id="queryCustomerInCusIds" parameterType="java.util.HashMap" resultMap="UserResult">
    select
    <include refid="edu_user_column"/>
    from EDU_USER 
    where EDU_USER.USER_ID in
    <foreach collection="list" index="index" item="item" open="(" separator="," close=")">  
          #{item}  
      </foreach>  
  </select>
  <select id="getUserListPage" resultMap="UserResult" parameterType="java.util.HashMap">
    select
    <include refid="edu_user_column" />
    from edu_user
    <where>
      <if test="e.userId !=null and e.userId > 0 ">
        AND EDU_USER.USER_ID = #{e.userId}
      </if>
      <if test="e.email !=null and e.email !='' ">
        AND EDU_USER.EMAIL like CONCAT('%',#{e.email},'%')
      </if>
      <if test="e.mobile !=null and e.mobile !='' ">
        AND EDU_USER.MOBILE like CONCAT('%',#{e.mobile},'%')
      </if>
      <if test="e.userName !=null and e.userName !='' ">
        AND EDU_USER.USER_NAME like CONCAT('%',#{e.userName},'%')
      </if>
      <if test="e.showName !=null and e.showName !='' ">
        AND EDU_USER.SHOW_NAME like CONCAT('%',#{e.showName},'%')
      </if>
      <if test="e.sex !=null and e.sex > 0 ">
        AND EDU_USER.SEX=#{e.sex}
      </if>
    </where>
    order by EDU_USER.USER_ID desc
    <include refid="publicMapper.pageEnd" />
  </select>
  <select id="getUserListPageCount" resultType="int" parameterType="java.util.HashMap">
    select
    count(1)
    from edu_user
    <where>
      <if test="e.userId !=null and e.userId > 0 ">
        AND EDU_USER.USER_ID = #{e.userId}
      </if>
      <if test="e.email !=null and e.email !='' ">
        AND EDU_USER.EMAIL like CONCAT('%',#{e.email},'%')
      </if>
      <if test="e.mobile !=null and e.mobile !='' ">
        AND EDU_USER.MOBILE like CONCAT('%',#{e.mobile},'%')
      </if>
      <if test="e.userName !=null and e.userName !='' ">
        AND EDU_USER.USER_NAME like CONCAT('%',#{e.userName},'%')
      </if>
      <if test="e.showName !=null and e.showName !='' ">
        AND EDU_USER.SHOW_NAME like CONCAT('%',#{e.showName},'%')
      </if>
      <if test="e.sex !=null and e.sex > 0 ">
        AND EDU_USER.SEX=#{e.sex}
      </if>
    </where>
  </select>
  <!-- 删除学员 -->
  <delete id="deleteUserById" parameterType="int">
    DELETE FROM EDU_USER WHERE EDU_USER.USER_ID = #{value}
  </delete>
</mapper>


五 、框架其他配置



5.1 数据库配置


project.properties


#数据库主机地址
jdbc.host=localhost
#数据库名
jdbc.database=learn
#用户名
jdbc.username=root
#密码
jdbc.password=root
#项目路径
contextPath=http://localhost:80


5.2、配置spring-mvc.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"
  xmlns:mvc="http://www.springframework.org/schema/mvc"
  xsi:schemaLocation="http://www.springframework.org/schema/mvc 
    http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd
    http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
    http://www.springframework.org/schema/context 
    http://www.springframework.org/schema/context/spring-context-3.2.xsd
    ">
  <!-- ①:对web包中的所有类进行扫描,以完成Bean创建和自动依赖注入的功能 -->
  <context:component-scan base-package="com.inxedu.os"
    use-default-filters="false">
    <context:include-filter type="annotation"
      expression="org.springframework.stereotype.Controller" />
    <context:include-filter type="annotation"
      expression="org.springframework.web.bind.annotation.ControllerAdvice" />
  </context:component-scan>
  <mvc:annotation-driven
    content-negotiation-manager="contentNegotiationManager">
    <mvc:message-converters register-defaults="true">
      <!-- 将StringHttpMessageConverter的默认编码设为UTF-8 -->
      <bean class="org.springframework.http.converter.StringHttpMessageConverter">
        <constructor-arg value="UTF-8" />
      </bean>
    </mvc:message-converters>
  </mvc:annotation-driven>
  <mvc:default-servlet-handler />
  <!-- ②:拦截器的配置 -->
  <mvc:interceptors>
    <!-- 后台登录和权限的拦截器配置 -->
    <mvc:interceptor>
      <mvc:mapping path="/admin/*" />
      <mvc:mapping path="/admin/**/*" />
      <mvc:exclude-mapping path="/admin/main/login" />
      <bean class="com.inxedu.os.common.intercepter.IntercepterAdmin"></bean>
    </mvc:interceptor>
    <!-- 前台网站配置拦截器配置 -->
    <mvc:interceptor>
      <mvc:mapping path="/**/*" />
      <mvc:exclude-mapping path="/static/**/*" />
      <mvc:exclude-mapping path="/*/ajax/**" />
      <mvc:exclude-mapping path="/kindeditor/**/*" />
      <bean class="com.inxedu.os.common.intercepter.LimitIntercepterForWebsite">
      </bean>
    </mvc:interceptor>
    <!-- 前台用户登录拦截器配置 -->
    <mvc:interceptor>
      <mvc:mapping path="/uc/*" />
      <mvc:mapping path="/uc/**/*" />
      <mvc:exclude-mapping path="/uc/tologin" />
      <mvc:exclude-mapping path="/uc/getloginUser" />
      <mvc:exclude-mapping path="/uc/register" />
      <mvc:exclude-mapping path="/uc/createuser" />
      <mvc:exclude-mapping path="/uc/login" />
      <mvc:exclude-mapping path="/uc/passwordRecovery" />
      <mvc:exclude-mapping path="/uc/sendEmail" />
      <bean class="com.inxedu.os.common.intercepter.IntercepterWebLogin">
      </bean>
    </mvc:interceptor>
  </mvc:interceptors>
  <!-- ③:对模型视图名称的解析,即在模型视图名称添加前后缀 -->
  <bean
    class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/WEB-INF/view/" />
    <property name="suffix" value=".jsp" />
    <property name="viewClass"
      value="org.springframework.web.servlet.view.JstlView" />
  </bean>
  <!-- <mvc:view-controller path="/" view-name="redirect:/index"/> -->
  <!-- REST中根据URL后缀自动判定Content-Type及相应的View -->
  <bean id="contentNegotiationManager"
    class="org.springframework.web.accept.ContentNegotiationManagerFactoryBean">
    <property name="mediaTypes">
      <value>
        json=application/json
        xml=application/xml
      </value>
    </property>
  </bean>
  <!-- 文件上传限制大小 -->
  <bean id="multipartResolver"
    class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    <!-- set the max upload size 10MB -->
    <property name="maxUploadSize">
      <value>5048576000</value>
    </property>
    <property name="maxInMemorySize">
      <value>4096</value>
    </property>
  </bean>
  <!-- Spring MVC 内置处理json配置 添加jackson-mapper-asl-1.*.*.jar jackson-core-asl-1.*.*.jar这两个包实现 -->
  <bean
    class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
    <property name="messageConverters">
      <list>
        <bean
          class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter" />
      </list>
    </property>
  </bean>
  <!-- 将Controller抛出的异常转到特定View, 保持SiteMesh的装饰效果 -->
  <bean
    class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
    <property name="exceptionMappings">
      <props>
        <prop key="org.apache.shiro.authz.UnauthorizedException">/WEB-INF/view/common/403</prop>
        <prop key="java.lang.Throwable">/common/error</prop>
      </props>
    </property>
  </bean>
</beans>



5.3 Log4j的配置


为了方便调试,一般都会使用日志来输出信息,Log4j是Apache的一个开放源代码项目,
通过使用Log4j,我们可以控制日志信息输送的目的地是控制台、文件、GUI组件,
甚至是套接口服务器、NT的事件记录器、UNIX Syslog守护进程等;
我们也可以控制每一条日志的输出格式;通过定义每一条日志信息的级别,我们能够更加细致地控制日志的生成过程
log4j.rootLogger=INFO,Console,File  
#定义日志输出目的地为控制台  
log4j.appender.Console=org.apache.log4j.ConsoleAppender  
log4j.appender.Console.Target=System.out  
#可以灵活地指定日志输出格式,下面一行是指定具体的格式  
log4j.appender.Console.layout = org.apache.log4j.PatternLayout  
log4j.appender.Console.layout.ConversionPattern=[%c] - %m%n  
#文件大小到达指定尺寸的时候产生一个新的文件  
log4j.appender.File = org.apache.log4j.RollingFileAppender  
#指定输出目录  
log4j.appender.File.File = logs/ssm.log  
#定义文件最大大小  
log4j.appender.File.MaxFileSize = 10MB  
# 输出所以日志,如果换成DEBUG表示输出DEBUG以上级别日志  
log4j.appender.File.Threshold = ALL  
log4j.appender.File.layout = org.apache.log4j.PatternLayout  
log4j.appender.File.layout.ConversionPattern =[%p] [%d{yyyy-MM-dd HH\:mm\:ss}][%c]%m%n

5.4 数据库表结构

907c53ac1f904e78a716b13e5d7039aa.png

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
目录
相关文章
|
5月前
|
JavaScript Java 大数据
基于JavaWeb的销售管理系统设计系统
本系统基于Java、MySQL、Spring Boot与Vue.js技术,构建高效、可扩展的销售管理平台,实现客户、订单、数据可视化等全流程自动化管理,提升企业运营效率与决策能力。
|
4月前
|
移动开发 监控 小程序
java家政平台源码,家政上门清洁系统源码,数据多端互通,可直接搭建使用
一款基于Java+SpringBoot+Vue+UniApp开发的家政上门系统,支持小程序、APP、H5、公众号多端互通。涵盖用户端、技工端与管理后台,支持多城市、服务分类、在线预约、微信支付、抢单派单、技能认证、钱包提现等功能,源码开源,可直接部署使用。
353 24
|
4月前
|
设计模式 消息中间件 传感器
Java 设计模式之观察者模式:构建松耦合的事件响应系统
观察者模式是Java中常用的行为型设计模式,用于构建松耦合的事件响应系统。当一个对象状态改变时,所有依赖它的观察者将自动收到通知并更新。该模式通过抽象耦合实现发布-订阅机制,广泛应用于GUI事件处理、消息通知、数据监控等场景,具有良好的可扩展性和维护性。
429 8
|
4月前
|
安全 前端开发 Java
使用Java编写UDP协议的简易群聊系统
通过这个基础框架,你可以进一步增加更多的功能,例如用户认证、消息格式化、更复杂的客户端界面等,来丰富你的群聊系统。
227 11
|
4月前
|
机器学习/深度学习 人工智能 自然语言处理
Java与生成式AI:构建内容生成与创意辅助系统
生成式AI正在重塑内容创作、软件开发和创意设计的方式。本文深入探讨如何在Java生态中构建支持文本、图像、代码等多种生成任务的创意辅助系统。我们将完整展示集成大型生成模型(如GPT、Stable Diffusion)、处理生成任务队列、优化生成结果以及构建企业级生成式AI应用的全流程,为Java开发者提供构建下一代创意辅助系统的完整技术方案。
294 10
|
4月前
|
人工智能 监控 Java
Java与AI智能体:构建自主决策与工具调用的智能系统
随着AI智能体技术的快速发展,构建能够自主理解任务、制定计划并执行复杂操作的智能系统已成为新的技术前沿。本文深入探讨如何在Java生态中构建具备工具调用、记忆管理和自主决策能力的AI智能体系统。我们将完整展示从智能体架构设计、工具生态系统、记忆机制到多智能体协作的全流程,为Java开发者提供构建下一代自主智能系统的完整技术方案。
675 4
|
5月前
|
NoSQL Java 关系型数据库
超全 Java 学习路线,帮你系统掌握编程的超详细 Java 学习路线
本文为超全Java学习路线,涵盖基础语法、面向对象编程、数据结构与算法、多线程、JVM原理、主流框架(如Spring Boot)、数据库(MySQL、Redis)及项目实战等内容,助力从零基础到企业级开发高手的进阶之路。
434 1
|
4月前
|
机器学习/深度学习 分布式计算 Java
Java与图神经网络:构建企业级知识图谱与智能推理系统
图神经网络(GNN)作为处理非欧几里得数据的前沿技术,正成为企业知识管理和智能推理的核心引擎。本文深入探讨如何在Java生态中构建基于GNN的知识图谱系统,涵盖从图数据建模、GNN模型集成、分布式图计算到实时推理的全流程。通过具体的代码实现和架构设计,展示如何将先进的图神经网络技术融入传统Java企业应用,为构建下一代智能决策系统提供完整解决方案。
489 0
|
5月前
|
安全 Cloud Native Java
Java 模块化系统(JPMS)技术详解与实践指南
本文档全面介绍 Java 平台模块系统(JPMS)的核心概念、架构设计和实践应用。作为 Java 9 引入的最重要特性之一,JPMS 为 Java 应用程序提供了强大的模块化支持,解决了长期存在的 JAR 地狱问题,并改善了应用的安全性和可维护性。本文将深入探讨模块声明、模块路径、访问控制、服务绑定等核心机制,帮助开发者构建更加健壮和可维护的 Java 应用。
441 0
|
6月前
|
Java 数据库 前端开发
分享44个java系统,总有一款适合您
分享44个微信小程序,总有一款适合您
106 0