SSM入门小项目----学生信息管理系统

SSM入门小项目----学生信息管理系统

学习了SSM后,自己想动手写个小项目,巩固一下。选择了比较简单的学生信息管理系统,项目比较简单,包括的功能有:登录、学生信息的增删改查、分页(前端实现)

本项目前后端分离,由于本人较菜,所以前端是直接拿别人写好的来修改使用的(已征得原作者同意),前端原文链接:https://blog.csdn.net/qq_43198568/article/details/104432485

完整代码在GitHub上:https://github.com/Fjz-Kuroko/StudentManagePro


效果图

登录页面

在这里插入图片描述

登录后进入的页面(主页)

在这里插入图片描述

新增

在这里插入图片描述

更新

在这里插入图片描述
前端效果可以去前端原文看,基本差不多,这里不过多展示。

下面开始进入正文

搭建项目

IDE:IDEA,运行环境:Tomcat 8.5 + Windows10
本项目使用Maven + Spring + SpringMvc + MyBatis开发,如果有同学不懂怎么使用Maven搭建SSM框架的话,可以参考我上一篇博客:https://blog.csdn.net/weixin_44215175/article/details/108642595

目录结构

其中以Test开头的是为了测试使用,可以不用理会
在这里插入图片描述

具体代码

登录

  • 新建一个数据表Login,我的比较简单,只包含三个属性:username、email、password
  • 在entity包中新建Login实体类
package pers.kuroko.entity;

public class Login {

    private String username;
    private String email;
    private String password;

    public Login() {
    }

    public Login(String username, String email, String password) {
        this.username = username;
        this.email = email;
        this.password = password;
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }
}

  • 在mapper(dao)包中新建LoginMapper.java接口以及loginMapper.xml的配置文件

LoginMapper.java

public interface LoginMapper {
    public int doLogin(Login login);
}

loginMapper.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper
        PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
        "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<!-- namespace:该mapper.xml映射文件的唯一标识 -->
<mapper namespace="pers.kuroko.mapper.LoginMapper">
    <select id="doLogin" parameterType="Login" resultType="int">
        select count(*) from login where username = #{username} and password = #{password}
    </select>
</mapper>
  • 在service包中新建LoginService.java接口,并且新建LoginServiceImpl.java实现类
public interface LoginService {
    int doLogin(Login login);
}
public class LoginServiceImpl implements LoginService {
    LoginMapper loginMapper;
    public void setLoginMapper(LoginMapper loginMapper) {
        this.loginMapper = loginMapper;
    }
    @Override
    public int doLogin(Login login) {
        return loginMapper.doLogin(login);
    }
}
  • 在controller包中新建LoginController类
//指定在浏览器的路径
@RequestMapping("loginController")
@Controller//注解,表明是Controller
public class LoginController {
    @Autowired
    @Qualifier("loginService")
    LoginService loginService;

    @RequestMapping(value = "homePage")
    public String homePage(Login login, Map<String, Object> map) {
        int i = loginService.doLogin(login);
        if (i > 0) {
            map.put("login", login);
            return "redirect:/studentController/getAllStudent";
        } else {
            return "error";
        }
    }
    @RequestMapping("login")
    public String login() {
        return "login";
    }
}
  • login.jsp
<body class="bgimg">
<div >
    <div class="login-box">
        <form action="loginController/homePage" method="post" name="f">
            <h2>学生管理系统-登录</h2>
            <div class="login-field">
                <img src="<%= basePath%>img/user.png"  />
                <input type="text" placeholder="请输入用户名" name="username" id="username" />
            </div>
            <div class="login-field">
                <img src="<%= basePath%>img/password.png" />
                <input type="password" placeholder="请输入密码" name="password" id="password"  />
            </div>
            <div class="login-sub">
                <button type="submit">登录</button>
            </div>
        </form>
    </div>
</div>
</body>

增加

  • 在entity包中新增Student实体类
package pers.kuroko.entity;

public class Student {

    private int id;
    private String name;
    private String sex;
    private int age;
    private String insitute;
    private String majo;
    private int grade;
    private int clazz;

    public Student() {
    }

    //此处省略有参构造和setter、getter
    @Override
    public String toString() {
        return "Student{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", sex='" + sex + '\'' +
                ", age=" + age +
                ", insitute='" + insitute + '\'' +
                ", majo='" + majo + '\'' +
                ", grade=" + grade +
                ", clazz=" + clazz +
                '}';
    }
}
  • 在StuMapper接口中增加一个方法 int addStudent(Student student);
  • 在stuMapper.xml中新增SQL语句
    <insert id="addStudent" parameterType="Student"> insert into student(id,name,sex,age,insitute,majo,grade,clazz) values (#{id}, #{name}, #{sex}, #{age}, #{insitute}, #{majo}, #{grade}, ${clazz}) </insert>
  • 在service包中的StudentService接口和StudentServiceImpl实现类中都增加相应方法
int addStudent(Student student);
@Override
    public int addStudent(Student student) {
        return stuMapper.addStudent(student);
    }
  • 最后在StudentController中调用service中的方法,进行最后的逻辑处理即可
@ResponseBody
    @RequestMapping(value = "addStudent")
    public String addStudent(Student student) {
        //判断该学号的学生是否已经存在
        Student studentById = studentService.queryStudentById(student.getId());
        if (studentById != null) {
            return "isExist";
        }
        //加入数据库,看返回值决定是否成功
        int i = studentService.addStudent(student);
        if (i > 0) {
            return "success";
        } else {
            return "error";
        }
    }
  • 前端调用,使用ajax
//data是前端定义的类,包含所有从前端获取的信息,完整url应该是http://localhost:8081/StudentManagePro/studentController/addStudent
$.ajax({
        type : 'post',
        url : url,
        data : data,
        success : function (data) {
            if (data === "error") {
                alert("添加失败");
            } else if (data === "success") {
                sumbit();
                alert("添加成功");
            } else if (data === "isExist") {
                alert("学号重复,添加失败");
            }
        },
        error : function (data) {
            alert("异常情况!")
        }
    })

删除、修改、查询

本质上删除、修改、查询和增加的逻辑是一样的,这里就不一 一展开了,具体代码可以到GitHub去看,本项目GitHub链接

  • 在StuMapper.java中添加对应方法、在stuMapper.xml添加对应的SQL语句
  • 在StudentService和StudentServiceImpl中新增对应方法,调用StuMapper
  • 在StudentController中新增对应方法,调用StudentService

缺点、不足

  • 功能较少
  • 分页功能使用的是前端实现

优点

  • 逻辑简单,适合新手入门
  • 代码层次明了

写在后面

此项目比较适合新手学习SSM的时候用来巩固一些基本操作,代码并不难懂,逻辑比较简单,如果有什么建议或者不懂的地方,可以通过评论 or 邮箱联系我(2497965937@qq.com)

希望大家共同进步。

<think>好的,我现在需要帮助用户解决关于Dify循环实现的问题。首先,我需要明确用户的具体需求。他们提到“dify 循环实现”或“dify 如何处理循环”,但Dify本身可能没有直接称为“循环”的功能,所以需要结合现有文档中的信息来推断可能的解决方案。 根据用户提供的引用内容,Dify工作流中有迭代节点[^1]。这可能类似于编程中的循环结构,用于重复执行某个任务。例如,在处理列表数据或需要多次执行同一操作时,迭代节点可以派上用场。我需要详细解释迭代节点的配置和使用步骤,确保用户能够理解如何设置循环次数或遍历数据集。 另外,用户可能对如何处理循环中的错误或性能问题感兴趣。引用[2]提到在Dify中处理PEM文件的问题,这可能涉及在循环中正确处理数据格式,避免错误积累。需要提醒用户在循环中注意错误处理和资源管理,确保每次迭代的稳定性。 引用[3]中的例子展示了如何结合FastAPI和Selenium进行实时监控并生成GIF,这可能涉及循环截取浏览器内容。虽然Dify本身可能不直接控制这类循环,但可以通过外部脚本或定时任务触发工作流,模拟循环执行。这部分需要说明如何将外部循环机制与Dify结合使用。 接下来,我需要组织回答结构。首先介绍迭代节点的基本概念和配置步骤,然后讨论循环中的数据处理和错误处理,最后补充外部触发循环的方法。同时,生成相关问题以帮助用户进一步探索,比如优化循环性能或处理复杂数据结构。 需要确保回答符合格式要求,使用正确的中文表达,行内公式用$...$,独立公式用$$...$$,但当前问题不涉及数学公式,所以可能不需要使用。同时,引用标识要自然地添加到相关段落末尾,如、[^2]、[^3]。 最后,检查是否有遗漏点,比如Dify的其他循环相关功能或用户可能遇到的常见问题,确保回答全面且易于理解。</think>在Dify中处理循环逻辑主要通过**迭代节点**实现,以下是具体实现方式和应用场景的解析: ### 一、Dify循环实现机制 Dify通过**工作流设计器**中的迭代节点处理循环需求,其核心原理类似编程中的`for循环`。迭代节点可遍历以下数据类型: - 数组列表:`["A","B","C"]` - 字典集合:`{"key1":"value1", "key2":"value2"}` - 数值范围:通过`range()`函数生成序列 配置示例: ```python # 模拟迭代节点的数据输入 input_data = { "dataset": [1,2,3,4,5], "process_logic": "item * 2" # 对每个元素执行乘以2的操作 } ``` ### 二、迭代节点的关键配置步骤 1. **数据源绑定**:将数组/字典类型变量连接到迭代节点的输入端口 2. **循环变量命名**:设定当前元素的变量名(默认为`item`) 3. **子流程设计**:在迭代节点内部构建需要重复执行的逻辑模块 4. **结果聚合**:通过`outputs`收集所有迭代结果,支持数组或对象格式 $$ \text{总耗时} = \sum_{i=1}^{n}(单次迭代时间_i) + 系统开销 $$ ### 三、循环中的特殊处理 1. **错误中断控制**: - 启用`continueOnError`参数可跳过失败迭代 - 通过`try-catch`模块包裹敏感操作 2. **并行优化**: ```python # 伪代码示例 Parallel.forEach(dataset, lambda item: process(item)) ``` 3. **结果过滤**: ```python filtered = filter(lambda x: x%2==0, processed_results) ``` ### 四、应用场景案例 1. **批量文件处理**:遍历存储桶中的文件列表进行格式转换 2. **数据清洗**:对数据库查询结果集进行逐条校验 3. **API轮询**:定时循环调用第三方接口直到满足特定条件
评论 44
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值