今天晚上学了一会javaweb,学会了登录页面跳转,完善了增删改查,加深了理解,如下:
UserMapper接口:
点击查看代码
package job.mapper;
import job.pojo.record;
import job.pojo.staff;
import org.apache.ibatis.annotations.Param;
import java.util.List;
public interface UserMapper {
staff selectidandpassword(@Param("jobid")String jobid,@Param("password") String password);
staff selectbyid(@Param("jobid")String jobid);
int updatestaff(@Param("jobid")String jobid,@Param("name")String name,@Param("sex")String sex,@Param("birthday")String birthday);
int updatestaffpassword(@Param("jobid")String jobid,@Param("password")String password,@Param("password1")String password1);
int dailyrecord(@Param("id") Integer id, @Param("attendancetime") String attendancetime, @Param("jobid") String jobid, @Param("name") String name, @Param("sex") String sex, @Param("birthday") String birthday, @Param("department") String department, @Param("attendancetype") String attendancetype);
List<record> selectbyid1(@Param("jobid")String jobid);
}
record存储考勤信息
点击查看代码
package job.pojo;
public class record {
private int id;
private String attendancetime;
private String jobid;
private String name;
private String sex;
private String birthday;
private String department;
private String attendancetype;
@Override
public String toString() {
return "record{" +
"id=" + id +
", attendancetime='" + attendancetime + '\'' +
", jobid='" + jobid + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", birthday='" + birthday + '\'' +
", department='" + department + '\'' +
", attendancetype='" + attendancetype + '\'' +
'}';
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getAttendancetime() {
return attendancetime;
}
public void setAttendancetime(String attendancetime) {
this.attendancetime = attendancetime;
}
public String getJobid() {
return jobid;
}
public void setJobid(String jobid) {
this.jobid = jobid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBirthday(String birthday) {
this.birthday = birthday;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getAttendancetype() {
return attendancetype;
}
public void setAttendancetype(String attendancetype) {
this.attendancetype = attendancetype;
}
}
staff存储职员的信息:
点击查看代码
package job.pojo;
public class staff {
private String jobid;
private String name;
private String sex;
private String birthday;
private String department;
private String role;
private String password;
@Override
public String toString() {
return "staff{" +
"jobid='" + jobid + '\'' +
", name='" + name + '\'' +
", sex='" + sex + '\'' +
", birthday='" + birthday + '\'' +
", department='" + department + '\'' +
", role='" + role + '\'' +
", password='" + password + '\'' +
'}';
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getJobid() {
return jobid;
}
public void setJobid(String jobid) {
this.jobid = jobid;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public String getBirthday() {
return birthday;
}
public void setBorthday(String borthday) {
this.birthday = borthday;
}
public String getDepartment() {
return department;
}
public void setDepartment(String department) {
this.department = department;
}
public String getRole() {
return role;
}
public void setRole(String role) {
this.role = role;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
login登录(有跳转功能)
点击查看代码
package job.web;
import job.mapper.UserMapper;
import job.pojo.staff;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
@WebServlet("/login")
public class login extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doPost(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String jobid=req.getParameter("jobid");
String password=req.getParameter("password");
String resource = "mybatis-config.xml";
req.setCharacterEncoding("UTF-8"); //解决乱码问题
resp.setContentType("text/html;charset=utf-8");
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper usermapper=sqlSession.getMapper(UserMapper.class);
staff s=usermapper.selectidandpassword(jobid,password);
PrintWriter writer=resp.getWriter();
String role=s.getRole();
if (s != null) {
if ("员工".equals(role)) {
resp.sendRedirect("/job-demo/staffscreen.html");
} else if ("部门经理".equals(role)) {
resp.sendRedirect("/job-demo/managerscreen.html");
} else if ("管理员".equals(role)) {
resp.sendRedirect("/job-demo/adminscreen.html");
}
} else {
resp.getWriter().write("登陆失败!");
}
}
}
searchselfrecord查询自己的出勤记录:
点击查看代码
package job.web;
import job.mapper.UserMapper;
import job.pojo.record;
import job.pojo.staff;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.util.List;
@WebServlet("/searchselfrecord")
public class searchselfrecord extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String jobid = req.getParameter("jobid");
String resource = "mybatis-config.xml";
resp.setContentType("text/html;charset=utf-8");
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper usermapper=sqlSession.getMapper(UserMapper.class);
List<record> records=usermapper.selectbyid1(jobid);
PrintWriter out = resp.getWriter();
out.println("<h2>查询结果:</h2>");
out.println("<table border='1'>");
out.println("<tr><th>序号</th><th>考勤时间</th><th>工号</th><th>姓名</th><th>性别</th><th>出生日期</th><th>部门</th><th>考勤类型</th></tr>");
if (records != null && !records.isEmpty()) {
for (record r : records) {
out.println("<tr>");
out.println("<td>" + r.getId() + "</td>");
out.println("<td>" + r.getAttendancetime() + "</td>");
out.println("<td>" + r.getJobid() + "</td>");
out.println("<td>" + r.getName() + "</td>");
out.println("<td>" + r.getSex() + "</td>");
out.println("<td>" + r.getBirthday() + "</td>");
out.println("<td>" + r.getDepartment() + "</td>");
out.println("<td>" + r.getAttendancetype() + "</td>");
out.println("</tr>");
}
} else {
out.println("<tr><td colspan='8'>没有找到记录。</td></tr>");
}
out.println("</table>");
sqlSession.commit();
sqlSession.close();
}
}
点击查看代码
package job.web;
import job.mapper.UserMapper;
import job.pojo.staff;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Writer;
@WebServlet("/staffedit")
public class staffedit extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); //解决乱码问题
resp.setContentType("text/html;charset=utf-8");
String jobid = req.getParameter("jobid");
String name = req.getParameter("name");
String sex =req.getParameter("sex");
String birthday=req.getParameter("birthday");
String resource = "mybatis-config.xml";
Writer writer = resp.getWriter();
PrintWriter out = resp.getWriter();
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper usermapper=sqlSession.getMapper(UserMapper.class);
int u=usermapper.updatestaff(jobid,name,sex,birthday);
if(u>0){
writer.write("修改成功!");
staff s=usermapper.selectbyid(jobid);
out.println("<table border='1'>");
out.println("<tr><th>工号</th><th>姓名</th><th>性别</th><th>出生日期</th><th>部门</th><th>角色</th><th>密码</th></tr>");
out.println("<tr>");
out.println("<td>" + s.getJobid() + "</td>");
out.println("<td>" + s.getName() + "</td>");
out.println("<td>" + s.getSex() + "</td>");
out.println("<td>" + s.getBirthday() + "</td>");
out.println("<td>" + s.getDepartment() + "</td>");
out.println("<td>" + s.getRole() + "</td>");
out.println("<td>" + s.getPassword() + "</td>");
out.println("</table>");
}else writer.write("修改失败!");
sqlSession.commit();
sqlSession.close();
}
}
点击查看代码
package job.web;
import job.mapper.UserMapper;
import job.pojo.staff;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
import java.io.Writer;
@WebServlet("/staffeditpassword")
public class staffeditpassword extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8"); //解决乱码问题
resp.setContentType("text/html;charset=utf-8");
String jobid = req.getParameter("jobid");
String password = req.getParameter("password");
String password1 = req.getParameter("password1");
String password2 = req.getParameter("password2");
String resource = "mybatis-config.xml";
Writer writer = resp.getWriter();
PrintWriter out = resp.getWriter();
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper usermapper=sqlSession.getMapper(UserMapper.class);
staff s=usermapper.selectbyid(jobid);
int u=usermapper.updatestaffpassword(jobid,password,password1);
if(s.getPassword()!=password1&&password1!=password2){
if(u>0){
writer.write("修改成功!");
}
}else writer.write("两次输入的密码不一致或该密码与原密码相同!");
sqlSession.commit();
sqlSession.close();
}
}
点击查看代码
package job.web;
import job.mapper.UserMapper;
import job.pojo.staff;
import org.apache.ibatis.io.Resources;
import org.apache.ibatis.session.SqlSession;
import org.apache.ibatis.session.SqlSessionFactory;
import org.apache.ibatis.session.SqlSessionFactoryBuilder;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.InputStream;
import java.io.PrintWriter;
@WebServlet("/staffsearch")
public class staffsearch extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
this.doGet(req, resp);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String jobid = req.getParameter("jobid");
String resource = "mybatis-config.xml";
resp.setContentType("text/html;charset=utf-8");
InputStream inputStream = Resources.getResourceAsStream(resource);
SqlSessionFactory sqlSessionFactory = new SqlSessionFactoryBuilder().build(inputStream);
SqlSession sqlSession=sqlSessionFactory.openSession();
UserMapper usermapper=sqlSession.getMapper(UserMapper.class);
staff s=usermapper.selectbyid(jobid);
PrintWriter out = resp.getWriter();
out.println("<h2>查询结果:</h2>");
out.println("<table border='1'>");
out.println("<tr><th>工号</th><th>姓名</th><th>性别</th><th>出生日期</th><th>部门</th><th>角色</th><th>密码</th></tr>");
if(s!=null){
out.println("<tr>");
out.println("<td>" + s.getJobid() + "</td>");
out.println("<td>" + s.getName() + "</td>");
out.println("<td>" + s.getSex() + "</td>");
out.println("<td>" + s.getBirthday() + "</td>");
out.println("<td>" + s.getDepartment() + "</td>");
out.println("<td>" + s.getRole() + "</td>");
out.println("<td>" + s.getPassword() + "</td>");
out.println("</table>");
}
sqlSession.close();
}
}
点击查看代码
<?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="job.mapper.UserMapper">
<insert id="dailyrecord">
insert into record(id,attendancetime,jobid,name,sex,birthday,department,attendancetype)values
(#{id},#{attendancetime},#{jobid},#{name},#{sex},#{birthday},#{department},#{attendancetype});
</insert>
<update id="updatestaff">
update staff set name=#{name},sex=#{sex},birthday=#{birthday} where jobid=#{jobid};
</update>
<update id="updatestaffpassword">
update staff set password=#{password1} where password=#{password} and jobid=#{jobid};
</update>
<select id="selectidandpassword" resultType="job.pojo.staff">
select * from staff where jobid=#{jobid} and password=#{password};
</select>
<select id="selectbyid" resultType="job.pojo.staff">
select * from staff where jobid=#{jobid};
</select>
<select id="selectbyid1" resultType="job.pojo.record">
select * from record where jobid=#{jobid};
</select>
</mapper>
点击查看代码
<?xml version="1.0" encoding="UTF-8"?>
<configuration>
<!--
CONSOLE :表示当前的日志信息是可以输出到控制台的。
-->
<appender name="Console" class="ch.qos.logback.core.ConsoleAppender">
<encoder>
<pattern>[%level] %blue(%d{HH:mm:ss.SSS}) %cyan([%thread]) %boldGreen(%logger{15}) - %msg %n</pattern>
</encoder>
</appender>
<logger name="com.itheima" level="DEBUG" additivity="false">
<appender-ref ref="Console"/>
</logger>
<!--
level:用来设置打印级别,大小写无关:TRACE, DEBUG, INFO, WARN, ERROR, ALL 和 OFF
, 默认debug
<root>可以包含零个或多个<appender-ref>元素,标识这个输出位置将会被本日志级别控制。
-->
<root level="DEBUG">
<appender-ref ref="Console"/>
</root>
</configuration>
点击查看代码
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE configuration
PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
"http://mybatis.org/dtd/mybatis-3-config.dtd">
<configuration>
<!--起别名-->
<environments default="development">
<environment id="development">
<transactionManager type="JDBC"/>
<dataSource type="POOLED">
<property name="driver" value="com.mysql.jdbc.Driver"/>
<property name="url" value="jdbc:mysql:///test?useSSL=false&useServerPrepStmts=true"/>
<property name="username" value="root"/>
<property name="password" value="********"/>
</dataSource>
</environment>
</environments>
<mappers>
<package name="job.mapper"/>
</mappers>
</configuration>
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>管理员菜单</title>
</head>
<body>
<form>
<h1>管理员菜单</h1>
<a>新添部门基本信息</a><br>
<a>修改部门基本信息</a><br>
<a>删除部门基本信息</a><br>
<a>新添员工基本信息</a><br>
<a>修改员工基本信息</a><br>
<a>删除员工基本信息</a><br>
<a>设置角色管理</a><br>
<a>密码重置</a><br>
</form>
</body>
</html>
dailyrecord.html 出勤打卡界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>日常考勤</title>
<style>
body {
font-family: Arial, sans-serif;
text-align: center;
margin: 0;
padding: 20px;
background-color: #f4f4f4;
}
.container {
border: 2px solid #000;
padding: 20px;
background-color: #fff;
display: inline-block;
}
h1 {
font-size: 24px;
margin: 0;
}
p {
font-size: 18px;
margin: 10px 0;
}
.button {
display: inline-block;
margin: 10px;
padding: 10px 20px;
font-size: 18px;
text-decoration: none;
color: #fff;
background-color: #007BFF;
border-radius: 5px;
cursor: pointer;
}
.button:hover {
background-color: #0056b3;
}
</style>
</head>
<body>
<form action="/job-demo/dailyrecord" method="post" id="attendance-form">
<div class="container">
<h1>日常考勤管理</h1>
<p>请输入工号:<input type="text" id="jobid" name="jobid"></p>
<p id="attendance-time">考勤时间:正在获取...</p>
<input type="hidden" name="attendancetime" id="attendancetime">
<input type="hidden" name="attendancetype" id="attendancetype">
<button type="button" class="button" onclick="submitAttendance('上班')">上 班</button>
<button type="button" class="button" onclick="submitAttendance('下班')">下 班</button>
</div>
</form>
<script>
function updateTime() {
const now = new Date();
const utcOffset = 8 * 60; // 北京时间是 UTC+8
const localTime = now.getTime() + (now.getTimezoneOffset() * 60000);
const beijingTime = new Date(localTime + (utcOffset * 60000));
const year = beijingTime.getFullYear();
const month = String(beijingTime.getMonth() + 1).padStart(2, '0');
const day = String(beijingTime.getDate()).padStart(2, '0');
let hours = String(beijingTime.getHours()).padStart(2, '0');
const minutes = String(beijingTime.getMinutes()).padStart(2, '0');
if (hours < 12) {
document.getElementById('attendance-time').innerText = `考勤时间:${year}-${month}-${day} 上午 ${hours}:${minutes}`;
} else {
hours = String(beijingTime.getHours() - 12).padStart(2, '0');
document.getElementById('attendance-time').innerText = `考勤时间:${year}-${month}-${day} 下午 ${hours}:${minutes}`;
}
// 更新考勤时间隐藏字段
document.getElementById('attendancetime').value = `${year}-${month}-${day} ${beijingTime.getHours()}:${minutes}`;
}
function submitAttendance(type) {
document.getElementById('attendancetype').value = type; // 设置上下班类型
document.getElementById('attendance-form').submit(); // 提交表单
}
setInterval(updateTime, 60000);
updateTime();
</script>
</body>
</html>
managerscreen.html 部门经理主界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>部门经理菜单</title>
</head>
<body>
<form>
<h1>部门经理菜单</h1>
<a>查看个人信息</a><br>
<a>修改个人信息</a><br>
<a>修改个人密码</a><br>
<a>查询部门考勤情况</a><br>
<a>员工调岗</a><br>
</form>
</body>
</html>
screen.html 登录界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>登录</title>
</head>
<body>
<form action="/job-demo/login" method="post">
<h1>用户登录</h1>
<p>账号:<input type="text" name="jobid" id="jobid"></p>
<p>密码:<input type="text" name="password" id="password"></p>
<input type="submit" value="登录">
</form>
</body>
</html>
searchselfrecord.html 查看个人出勤记录界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>查看个人出勤记录</title>
</head>
<body>
<form action="/job-demo/searchselfrecord" method="post">
<h1>查看个人出勤记录</h1>
<p>请输入工号:<input type="text" id="jobid" name="jobid"></p>
<input type="submit" value="查询">
</form>
</body>
</html>
staffedit.html 修改职员个人信息界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改个人信息</title>
</head>
<body>
<form action="/job-demo/staffedit" method="post">
请输入要修改的工号和信息:<br>
<a>工号:<input type="text" name="jobid" id="jobid"></a><br>
<a>姓名:<input type="text" name="name" id="name"></a><br>
<a>性别:<input type="text" name="sex" id="sex"></a><br>
<a>出生日期:<input type="text" name="birthday" id="birthday"></a><br>
<input type="submit" value="修改"><br>
</form>
</body>
</html>
staffeditpassword.html 修改职员密码界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>修改密码</title>
</head>
<body>
<form action="/job-demo/staffeditpassword" method="post">
<h1>修改密码</h1>
<p>请输入工号:<input type="text" id="jobid" name="jobid"></p>
<p>请输入原密码:<input type="password" id="password" name="password"></p>
<p>请输入新密码:<input type="password" id="password1" name="password1" ></p>
<p>请再次输入新密码:<input type="password" id="password2" name="password2"></p>
<input type="submit">
</form>
</body>
</html>
staffscreen.html 职员主界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>员工菜单</title>
</head>
<body>
<form>
<h1>员工菜单</h1>
<a href="staffsearch.html">查看个人信息</a><br>
<a href="staffedit.html">修改个人信息</a><br>
<a href="staffeditpassword.html">修改个人密码</a><br>
<a href="dailyrecord.html">日常考勤</a><br>
<a href="searchselfrecord.html">浏览个人考勤记录</a><br>
</form>
</body>
</html>
staffsearch.html 职员查询个人信息界面
点击查看代码
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>查询个人信息</title>
</head>
<body>
<form action="/job-demo/staffsearch" method="post">
<p>输入工号查询:<input type="text" name="jobid" id="jobid"></p>
<input type="submit" value="查询">
</form>
</body>
</html>
总结:今天的瞄准都被代码偷走了,该睡觉了!!!吗·
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理