家居网购项目(一)

news2024/11/30 4:54:04

文章目录

    • 1.前置知识
        • 1.项目开发阶段
        • 2.Java经典三层架构
        • 3.项目具体分层(包方案)
        • 4.MVC
    • 2.开发环境搭建
        • 1.新建普通javaweb项目,导入jar包
        • 2.创建项目结构
        • 3.搭建前端页面
    • 3.会员注册前端js校验
        • 1.需求分析
        • 2.代码
          • login.html
        • 3.结果
        • 4.调试阶段
          • 1.验证信息一闪而过
            • 原因:
    • 4.会员注册后端
        • 1.需求分析
        • 2.程序框架图
        • 3.数据库表设计
          • 会员表设计
        • 4.建立javabean与表的映射
          • Member.java
        • 5.引入德鲁伊连接池工具类
          • JDBCUtilsByDruid.java
        • 6.引入BasicDao
          • BasicDao.java
        • 7.编写druid配置文件
          • druid.properties
          • 编写测试类,测试连接
            • JDBCUtilsByDruidTest.java
        • 8.编写MemberDao
          • 1.MemberDao.java
          • 2.MemberDaoImpl.java
          • 3.进行单元测试
            • MemberDaoTest.java
            • 测试结果:
        • 9.编写MemberService
          • 1.MemberService.java
          • 2.MemberServiceImpl.java
          • 3.进行单元测试
            • MemberServiceTest.java
            • 测试结果
        • 10.login.html优化
          • 1.设置base路径
          • 2.修改所有../../为空
          • 3.运行login.html
          • 4.修改前端js验证通过逻辑
        • 11.编写RegisterServlet
          • 1.修改login.html
          • 2.引入两个前端页面
          • 3.修改两个页面的base路径
          • 4.RegisterServlet.java
        • 12.注册功能展示
          • 注册界面
          • 注册成功
          • 注册失败返回首页

1.前置知识

1.项目开发阶段

image-20240204174457829

2.Java经典三层架构

image-20240204181049612

3.项目具体分层(包方案)

image-20240204181314291

4.MVC

image-20240204183543670

image-20240204182252025

2.开发环境搭建

1.新建普通javaweb项目,导入jar包

image-20240204185053583

2.创建项目结构

image-20240204185122184

3.搭建前端页面

image-20240204191613545

3.会员注册前端js校验

1.需求分析

image-20240204193615650

2.代码
login.html
<!--    引入jquery-->
    <script type="text/javascript" src="../../script/jquery-3.6.0.min.js"></script>
    <script>
        $(function () { //页面加载
            //绑定注册按钮点击事件
            $("#sub-btn").click(function () {
                //获取username
                var usernameVal = $("#username").val();
                // alert(usernameVal);
                //1.编写正则表达式验证用户名
                var usernamePattern = /^\w{6,10}$/;
                //验证
                if (!usernamePattern.test(usernameVal)) {
                    //使用前端给的span展示错误信息
                    $("span[class='errorMsg']").text("用户名格式不对,需要6到10个字符");
                    return false; //不提交
                }
                //2.编写正则表达式验证密码
                //获取密码
                var passwordVal =  $("#password").val();
                //正则
                var passwordPattern = /^\w{6,10}$/;
                //验证
                if (!passwordPattern.test(passwordVal)) {
                    //使用前端给的span展示错误信息(普通选择器)
                    $("span.errorMsg").text("密码格式不对,需要6到10个字符");
                    return false;
                }
                //3.两次密码需要相同
                //获取第二次输入的密码
                var repwdVal = $("#repwd").val();
                //与第一次的密码进行比较
                if (repwdVal != passwordVal) {
                    $("span.errorMsg").text("两次密码不相同!");
                    return false;
                }
                //4.验证邮箱
                //得到邮箱
                var emailVal = $("#email").val();
                //正则
                var emailPattern = /^[\w-]+@([a-zA-Z]+\.)+[a-zA-Z]+$/; //java中是两个斜杠,js是一个
                //验证
                if(!emailPattern.test(emailVal)) {
                    $("span.errorMsg").text("电子邮件格式不对!");
                    return false;
                }
                //暂时先算过关,先不提交
                $("span.errorMsg").text("验证通过!");
                return false;
            })
        })
    </script>
3.结果

image-20240204201041909

4.调试阶段
1.验证信息一闪而过
原因:

没有在js中return false,阻止表单提交

4.会员注册后端

1.需求分析

image-20240204201601053

2.程序框架图

image-20240204202530923

3.数据库表设计
会员表设计
-- 创建家具网购数据库表
CREATE DATABASE home_furnishing;

USE home_furnishing;

-- 创建会员表
CREATE TABLE `member` (
`id` INT PRIMARY KEY auto_increment,
`username` VARCHAR(32) NOT NULL UNIQUE,
`password` VARCHAR(32) NOT NULL,
`email` VARCHAR(64)
)
-- 测试数据
INSERT INTO member VALUES(NULL, 'admin', MD5('admin'), '1721469477@qq.com')
4.建立javabean与表的映射
Member.java
package com.sxs.furns.entity;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class Member {
    private Integer id;
    private String username;
    private String password;
    private String email;

    //无参构造方法!!!用于反射调用
    public Member(){}

    public Member(Integer id, String username, String password, String email) {
        this.id = id;
        this.username = username;
        this.password = password;
        this.email = email;
    }

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getUsername() {
        return username;
    }

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

    public String getPassword() {
        return password;
    }

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

    public String getEmail() {
        return email;
    }

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

5.引入德鲁伊连接池工具类
JDBCUtilsByDruid.java
package com.sxs.furns.utils;

import com.alibaba.druid.pool.DruidDataSourceFactory;

import javax.sql.DataSource;
import java.io.IOException;
import java.sql.Connection;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.Properties;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class JDBCUtilsByDruid {
    //静态数据源引用(jdbc的接口)
    private static DataSource dataSource;

    //静态代码块,在类加载时为数据源引用赋值
    static {
        //1.读取配置文件
        Properties properties = new Properties();
        try {
            //使用类加载器读取配置文件,配置文件放在resources文件夹
            //这句话的意思是,使用JDBCUtilsByDruid类读取在resources文件夹下的配置文件,druid.properties
            properties.load(JDBCUtilsByDruid.class.getClassLoader().getResourceAsStream("druid.properties"));
        } catch (IOException e) {
            throw new RuntimeException(e);
        }
        //2.使用配置文件,创建德鲁伊数据源对象
        try {
            dataSource = DruidDataSourceFactory.createDataSource(properties);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    //编写getConnection方法
    public static Connection getConnection() {
        try {
            return dataSource.getConnection();
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }

    //把Connection对象放回连接池
    public static void close(ResultSet resultSet, Statement statement, Connection connection) {
        try {
            if (resultSet != null) {
                resultSet.close();
            }
            if (statement != null) {
                statement.close();
            }
            if (connection != null) {
                connection.close();
            }
        } catch (SQLException e) {
            throw new RuntimeException(e);
        }
    }


}

6.引入BasicDao
BasicDao.java
package com.sxs.furns.dao;

import com.sxs.furns.utils.JDBCUtilsByDruid;
import org.apache.commons.dbutils.QueryRunner;
import org.apache.commons.dbutils.handlers.BeanHandler;
import org.apache.commons.dbutils.handlers.BeanListHandler;
import org.apache.commons.dbutils.handlers.ScalarHandler;

import java.sql.Connection;
import java.sql.SQLException;
import java.util.List;

/**
 * @author 孙显圣
 * @version 1.0
 * 开发BasicDAO , 是其他DAO的父类
 */
public class BasicDao<T> { //泛型指定具体类型

    private QueryRunner qr =  new QueryRunner();

    //开发通用的dml方法, 针对任意的表
    public int update(String sql, Object... parameters) {

        Connection connection = null;

        try {
            connection = JDBCUtilsByDruid.getConnection();
            int update = qr.update(connection, sql, parameters);
            return  update;
        } catch (SQLException e) {
           throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }

    }

    //返回多个对象(即查询的结果是多行), 针对任意表

    /**
     *
     * @param sql sql 语句,可以有 ?
     * @param clazz 传入一个类的Class对象 比如 Actor.class
     * @param parameters 传入 ? 的具体的值,可以是多个
     * @return 根据Actor.class 返回对应的 ArrayList 集合
     */
    public List<T> queryMulti(String sql, Class<T> clazz, Object... parameters) {

        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return qr.query(connection, sql, new BeanListHandler<T>(clazz), parameters);

        } catch (SQLException e) {
            throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }

    }

    //查询单行结果 的通用方法
    public T querySingle(String sql, Class<T> clazz, Object... parameters) {

        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return  qr.query(connection, sql, new BeanHandler<T>(clazz), parameters);

        } catch (SQLException e) {
            throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }

    //查询单行单列的方法,即返回单值的方法

    public Object queryScalar(String sql, Object... parameters) {

        Connection connection = null;
        try {
            connection = JDBCUtilsByDruid.getConnection();
            return  qr.query(connection, sql, new ScalarHandler(), parameters);

        } catch (SQLException e) {
            throw  new RuntimeException(e); //将编译异常->运行异常 ,抛出
        } finally {
            JDBCUtilsByDruid.close(null, null, connection);
        }
    }

}

7.编写druid配置文件
druid.properties
#key=value
driverClassName=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://localhost:3306/home_furnishing?rewriteBatchedStatements=true
#url=jdbc:mysql://localhost:3306/girls
username=root
password=root
#initial connection Size
initialSize=10
#min idle connecton size
minIdle=5
#max active connection size
maxActive=50
#max wait time (5000 mil seconds)
maxWait=5000
编写测试类,测试连接
JDBCUtilsByDruidTest.java
package com.sxs.furns.test;

import com.sxs.furns.utils.JDBCUtilsByDruid;
import org.junit.Test;

import java.sql.Connection;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class JDBCUtilsByDruidTest {
    @Test
    public void getConnection() {
        //测试连接
        Connection connection = JDBCUtilsByDruid.getConnection();
        System.out.println(connection);
        JDBCUtilsByDruid.close(null, null, connection);
    }
}

image-20240204210743090

8.编写MemberDao
1.MemberDao.java
package com.sxs.furns.dao;

import com.sxs.furns.entity.Member;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface MemberDao {
    //1.通过用户名返回Member
    public Member queryMemberByUsername(String username);
    //2.保存Member对象到数据库的member表
    public int saveMember(Member member);
}

2.MemberDaoImpl.java
package com.sxs.furns.dao.impl;

import com.sxs.furns.dao.BasicDao;
import com.sxs.furns.dao.MemberDao;
import com.sxs.furns.entity.Member;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberDaoImpl extends BasicDao<Member> implements MemberDao {
    /**
     * 通过用户名,返回对应的Member
     * @param username 用户名
     * @return 对应的Member对象,如果没有则返回null
     */
    @Override
    public Member queryMemberByUsername(String username) {
        //查询单行数据
        Member member = querySingle("select * from member where username = ?", Member.class, username);
        return member;
    }

    /**
     * 保存一个会员
     * @param member 传入Member对象
     * @return 返回-1就是失败,返回其他的数字就是受影响的行数
     */
    @Override
    public int saveMember(Member member) {
        //获取member对象信息
        String username = member.getUsername();
        String password = member.getPassword();
        String email = member.getEmail();
        //插入到member表中
        return update("insert into member values(?,?,md5(?),?)", null, username, password, email);
    }
}

3.进行单元测试
MemberDaoTest.java
package com.sxs.furns.test;

import com.sxs.furns.dao.MemberDao;
import com.sxs.furns.dao.impl.MemberDaoImpl;
import com.sxs.furns.entity.Member;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberDaoTest {
    private MemberDao memberDao = new MemberDaoImpl();
    @Test
    public void queryMemberByUsername() {
        if (memberDao.queryMemberByUsername("admin") == null) {
            System.out.println("该用户不存在");
        } else {
            System.out.println("该用户存在");
        }
    }
    @Test
    public void saveMember() {
        Member member = new Member(null, "jack", "123", "123@qq.com");
        if (memberDao.saveMember(member) == 1) {
            System.out.println("添加成功");
        } else {
            System.out.println("添加失败");
        }
    }
}

测试结果:

image-20240205095931244

image-20240205095853310

9.编写MemberService
1.MemberService.java
package com.sxs.furns.service;

import com.sxs.furns.entity.Member;

/**
 * @author 孙显圣
 * @version 1.0
 */
public interface MemberService {
    //注册用户
    public boolean registerMember(Member member);
    //判断用户名是否存在
    public boolean isExistsUsername(String username);
}

2.MemberServiceImpl.java
package com.sxs.furns.service.impl;

import com.sxs.furns.dao.MemberDao;
import com.sxs.furns.dao.impl.MemberDaoImpl;
import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberServiceImpl implements MemberService {
    //定义一个MemberDao的属性
    MemberDao memberDao = new MemberDaoImpl();

    /**
     * 将注册用户信息插入到数据库中
     * @param member 注册用户信息
     * @return 成功返回true,失败返回false
     */
    @Override
    public boolean registerMember(Member member) {
        return memberDao.saveMember(member) == 1 ? true : false;
    }

    /**
     * 判断用户是否存在
     * @param username 用户名
     * @return 如果存在,返回true,否则返回false
     */
    @Override
    public boolean isExistsUsername(String username) {
        return memberDao.queryMemberByUsername(username) == null ? false : true;
    }
}

3.进行单元测试
MemberServiceTest.java
package com.sxs.furns.test;

import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;
import com.sxs.furns.service.impl.MemberServiceImpl;
import org.junit.Test;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class MemberServiceTest {
    private MemberService memberService = new MemberServiceImpl();

    @Test
    public void registerMember() {
        Member member = new Member(null, "jack", "123", "123@qq.com");
        if (!memberService.registerMember(member)) {
            System.out.println("注册失败");
        } else {
            System.out.println("注册成功");
        }
    }

    @Test
    public void isExistsUsername() {
       if (!memberService.isExistsUsername("jack")) {
           System.out.println("用户不存在");
       } else {
           System.out.println("用户存在");
       }
    }
}

测试结果

image-20240205102436637

image-20240205102443364

10.login.html优化
1.设置base路径
<!--    base路径设置    -->
    <base href="http://localhost:8080/jiaju_mail/">

image-20240205104237811

2.修改所有…/…/为空

image-20240205104843033

3.运行login.html

image-20240205104903148

4.修改前端js验证通过逻辑

image-20240205105045231

11.编写RegisterServlet
1.修改login.html

image-20240205105359729

2.引入两个前端页面

image-20240205140855281

3.修改两个页面的base路径

image-20240205140931909

4.RegisterServlet.java
package com.sxs.furns.web;

import com.sxs.furns.entity.Member;
import com.sxs.furns.service.MemberService;
import com.sxs.furns.service.impl.MemberServiceImpl;

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;

/**
 * @author 孙显圣
 * @version 1.0
 */
@WebServlet(urlPatterns = "/registerServlet")
public class RegisterServlet extends HttpServlet {
    //定义属性
    private MemberService memberService = new MemberServiceImpl();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //接受用户注册信息
        String username = req.getParameter("username");
        String password = req.getParameter("password");
        String email = req.getParameter("email");
        //判断用户名是否在数据库中
        if (!memberService.isExistsUsername(username)) { //不在数据库中,可以注册
            Member member = new Member(null, username, password, email);
            //注册
            if (memberService.registerMember(member)) {
                //请求转发
                req.getRequestDispatcher("/views/member/register_ok.html").forward(req, resp);
            } else {
                //请求转发
                req.getRequestDispatcher("/views/member/register_fail.html").forward(req, resp);
            }
        } else {
            //返回注册页面
            req.getRequestDispatcher("/views/member/login.html").forward(req, resp);
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

12.注册功能展示
注册界面

image-20240205141051819

注册成功

image-20240205141105048

注册失败返回首页

image-20240205141249455

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1586380.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法训练营第24天回溯(组合)

回溯&#xff08;组合&#xff09; 模板 void backtracking(参数) {if (终止条件) {存放结果;return;}for (选择&#xff1a;本层集合中元素&#xff08;树中节点孩子的数量就是集合的大小&#xff09;) {处理节点;backtracking(路径&#xff0c;选择列表); // 递归回溯&…

6.11物联网RK3399项目开发实录-驱动开发之定时器的使用(wulianjishu666)

嵌入式实战开发例程【珍贵收藏&#xff0c;开发必备】&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1tkDBNH9R3iAaHOG1Zj9q1Q?pwdt41u 定时器使用 前言 RK3399有 12 个 Timers (timer0-timer11)&#xff0c;有 12 个 Secure Timers(stimer0~stimer11) 和 2 个 …

LC 501.二叉搜索树中的众数

501.二叉搜索树中的众数 给你一个含重复值的二叉搜索树&#xff08;BST&#xff09;的根节点 root &#xff0c;找出并返回 BST 中的所有 众数&#xff08;即&#xff0c;出现频率最高的元素&#xff09;。 如果树中有不止一个众数&#xff0c;可以按 任意顺序 返回。 假定 …

深入浅出 -- 系统架构之在Java体系中的微服务标准组件

前面我们介绍了微服务架构的各个组件以及各组件的职责&#xff0c;在Java领域中&#xff0c;Spring可以说是无人不知无人不晓的&#xff0c;我们现代的企业级应用和互联网应用&#xff0c;很大一部分都是构建在Spring生态体系上的&#xff0c;同样&#xff0c;实现微服务架构的…

MySQL高级详解

文章目录 约束概述分类主键约束概述特点定义及删除主键自增 唯一约束作用语法 非空约束作用语法 面试题&#xff1a;非空唯一约束与主键约束有什么区别默认值约束作用语法 总结 表关系及外键约束表关系概述分类一对多关系表设计外键字段设计原则 多对多关系表设定设计原则 一对…

【图论】Dijkstra单源最短路径-朴素方法-简单模板(迪杰斯特拉算法)

Dijkstra单源最短路径 问题描述 输入n 表示n个结点&#xff0c;m表示m条边&#xff0c;求编号1的结点到每个点的最短路径 输出从第一个点到第n个点的最短路径 思路 将图g[][]中所有的权值初始化为0x3f表示正无穷 将dist[]中所有的值初始化为0x3f表示从第一个点到所有点的距离…

一辆新能源汽车需要多少颗传感器?

随着科技的发展和环保意识的日益提高&#xff0c;新能源汽车&#xff08;包括纯电动汽车、混合动力汽车等&#xff09;在全球范围内越来越受到欢迎。这些汽车不仅减少了碳排放&#xff0c;还推动了汽车产业的创新。然而&#xff0c;这些高科技汽车的背后&#xff0c;隐藏着许多…

Qt中播放GIF动画

在Qt应用程序中&#xff0c;如果你想在QLabel控件上播放GIF动画&#xff0c;可以使用QMovie类与QLabel配合来实现。以下是详细步骤和代码示例&#xff1a; 步骤1&#xff1a;引入必要的头文件 首先&#xff0c;在你的源代码文件中包含QMovie和QLabel相关的头文件&#xff1a;…

Java官网下载JDK21版本详细教程(下载、安装、环境变量配置)

文章目录 前言&#xff1a;一、下载(一).链接&#xff08;直达JDK21&#xff09;(二).官网搜索&#xff08;可选其他版本&#xff09; 二、安装三、环境变量配置四、验证安装和配置五、常见问题解答 前言&#xff1a; 本文将为您提供关于Java官网下载JDK21版本的详细教程。作为…

springboot在使用 Servlet API中提供的javax.servlet.Filter 过滤器 对请求参数 和 响应参数 进行获取并记录日志方案

不多说 直接上代码 第一步 package com.xxx.init.webFilter;import com.alibaba.fastjson.JSONObject; import com.xxx.api.constant.CommonConstant; import com.xxx.api.entities.log.OperationLog; import com.xxx.init.utils.JwtHelper; import com.xxx.init.utils.Reques…

King‘s AUTO的QI妙能力|实验室“总导演”

在2023年夏天&#xff0c;两场国际赛事分别在成都、杭州盛大举办——第31届世界大学生夏季运动会&#xff08;大运会&#xff09;以及第19届亚洲运动会&#xff08;亚运会&#xff09;。为确保开幕式的顺利进行&#xff0c;大运会共进行了三次全要素彩排&#xff0c;而亚运会则…

上海人工智能实验室的书生·浦语大模型学习笔记(第二期第三课——上篇)

书生浦语是上海人工智能实验室和商汤科技联合研发的一款大模型&#xff0c;这次有机会参与试用&#xff0c;特记录每次学习情况。 一、课程笔记 本次学习的是RAG&#xff08;Retrieval Augmented Generation&#xff09;技术&#xff0c;它是通过检索与用户输入相关的信息片段…

【MATLAB源码-第185期】基于matlab的16QAM系统相位偏移估计EOS算法仿真,对比补偿前后的星座图误码率。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 1. 引言 M-QAM调制技术的重要性 现代通信系统追求的是更高的数据传输速率和更有效的频谱利用率。M-QAM调制技术&#xff0c;作为一种高效的调制方案&#xff0c;能够通过在相同的带宽条件下传输更多的数据位来满足这一需求…

springboot如何切换内置web服务器?

切换内置web服务器 这是没有引入web依赖的服务 这是引入web依赖的服务 由此可知默认是tomcat服务器 那么如何切换内置服务器 只要有对应服务器的坐标即可自动切换&#xff0c;先排除tomcat再引入依赖&#xff0c;比如切换成jetty服务器 <dependency><groupId>org…

d3dx9_43.dll丢失的一些可行的解决方案,有效解决d3dx9_43.dll丢失

在电脑中&#xff0c;d3dx9_43.dll文件丢失是一个相当普遍的问题。实际上&#xff0c;要解决这个问题有多种方法。今天&#xff0c;我们将讨论一下关于d3dx9_43.dll文件丢失的问题&#xff0c;并向大家介绍一些可行的解决方案。 一.快速了解d3dx9_43.dll文件 首先&#xff0c;…

Linux的学习之路:6、Linux编译器-gcc/g++使用

摘要 本文主要是说一些gcc的使用&#xff0c;g和gcc使用一样就没有特殊讲述。 目录 摘要 一、背景知识 二、gcc如何完成 1、预处理(进行宏替换) 2、编译&#xff08;生成汇编&#xff09; 3、汇编&#xff08;生成机器可识别代码 4、链接&#xff08;生成可执行文件或…

2024-基于人工智能的药物设计方法研究-AIDD

AIDD docx 基于人工智能的药物设计方法研究 AI作为一种强大的数据挖掘和分析技术已经涉及新药研发的各个阶段&#xff0c;有望推动创新药物先导分子的筛选、设计和发现&#xff0c;但基于AI的数据驱动式创新药物设计和筛选方法仍存在若干亟待解决的问题。我们课题组的核心研究…

【Entity Framework】如何使用EF中的生成值

【Entity Framework】如何使用EF中的生成值 文章目录 【Entity Framework】如何使用EF中的生成值一、概述二、默认值三、计算列四、设置主键五、显示配置值生成六、设置日期/时间值生成6.1 创建时间戳6.2 更新时间戳 七、替代值生成八、无值生成九、总结 一、概述 数据库列的值…

服务器端口被扫会出现哪些风险

一、安全风险增加端口扫描是黑客攻击的常见手段之一。通过对服务器端口进行扫描&#xff0c;黑客可以了解服务器的开放端口、服务类型以及可能存在的漏洞。一旦黑客发现漏洞并成功利用&#xff0c;就可能导致服务器被入侵&#xff0c;进而窃取数据、植入恶意软件或进行其他非法…

基于SSM的电影网站(有报告)。Javaee项目。ssm项目。

演示视频&#xff1a; 基于SSM的电影网站&#xff08;有报告&#xff09;。Javaee项目。ssm项目。 项目介绍&#xff1a; 采用M&#xff08;model&#xff09;V&#xff08;view&#xff09;C&#xff08;controller&#xff09;三层体系结构&#xff0c;通过Spring SpringMv…