家居网购项目(Ajax验证用户名+上传图片)

文章目录

    • 1.Ajax验证用户名
        • 1.程序框架图
        • 2.修改MemberServlet
        • 3.修改login.jsp
        • 4.结果展示
    • 2.Ajax判断验证码是否输入正确
        • 1.修改MemberServlet
        • 2.修改login.jsp
        • 3.结果展示
    • 3.Ajax添加购物车
        • 1.程序框架图
        • 2.修改CartServlet
        • 2.修改index.jsp
        • 3.解决问题—未登录直接添加购物车,ajax请求无法重定向到登录页面
          • 1.解决方案
          • 2.编写WebUtils判断是否是ajax请求
          • 3.修改MemberAuthorization(过滤器)
          • 4.修改index.jsp
        • 4.结果展示
          • 1.未登录添加购物车,跳转到登录页面
          • 2.登录之后添加购物车,ajax局部刷新
    • 4.上传更新家居图片
        • 1.需求分析
        • 2.程序框架图
        • 3.修改FurnServlet
        • 4.修改furn_update.jsp
          • 1.样式
          • 2.修改form的enctype
          • 3.修改td
        • 5.解决bug,写sql的时候注意映射,映射,映射!!!!!!!!(卡了2个小时才发现,醉了)
        • 6.结果展示
          • 1.点击上传图片
          • 2.查看效果
          • 3.点击修改家居,回到原页面
      • 5.上传添加家居图片
        • 1.修改FurnServlet
        • 2.修改furn_add.jsp
          • 1.前端样式与前面一样
          • 2.修改form的enctype
          • 3.修改td
        • 3.结果展示
          • 1.准备添加家居
          • 2.效果展示
          • 3.添加之后

1.Ajax验证用户名

1.程序框架图

image-20240212095746271

2.修改MemberServlet
    //根据注册名判断数据库中是否存在并返回json格式的结果
    public void isExistName(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取用户名
        String username = req.getParameter("username");
        //判断是否存在
        boolean res = memberService.isExistsUsername(username);
        //返回json格式,使用map形式
        Map<String, Boolean> map = new HashMap<>();
        map.put("isExist", res);
        //转换成json格式
        Gson gson = new Gson();
        String json = gson.toJson(map);
        resp.getWriter().write(json);
    }
3.修改login.jsp
            //绑定失去焦点事件
            $("#username").blur(function () {
                //获取信息,并向后端发送ajax请求
                var username = $(this).val();
                $.getJSON(
                    "memberServlet",
                    {
                        "action": "isExistName",
                        "username": username
                    },
                    function (data, status, xhr) {
                        //根据是否存在显示信息
                        if (data.isExist) {
                            $("span.errorMsg").text("用户名已存在!");
                        } else {
                            $("span.errorMsg").text("用户名可用!");
                        }
                    }
                )
            })
4.结果展示

image-20240212113138517

2.Ajax判断验证码是否输入正确

1.修改MemberServlet
    //根据验证码判断是否正确,返回json格式的结果
    public void judgementCodeText(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取验证码
        String codeText = req.getParameter("codeText");
        //获取验证码
        HttpSession session = req.getSession();
        Object kaptchaSessionKey = session.getAttribute(KAPTCHA_SESSION_KEY);
        boolean res = false;
        if (kaptchaSessionKey != null && ((String) kaptchaSessionKey).equalsIgnoreCase(codeText)) {
            res = true;
        }
        //将信息保存在map中并以json格式返回
        Map<String, Object> map = new HashMap<>();
        map.put("judgementCodeText", res);
        Gson gson = new Gson();
        String json = gson.toJson(map);
        resp.getWriter().write(json);
    }
2.修改login.jsp
            //验证码绑定失去焦点事件
            $("#code").blur(function () {
                var codeText = $(this).val();
                //发送Ajax请求
                $.getJSON(
                    "memberServlet",
                    {
                        "action": "judgementCodeText",
                        "codeText": codeText
                    },
                    function (data, status, xhr) {
                        //根据是否存在显示信息
                        if (data.judgementCodeText) {
                            $("span.errorMsg").text("验证码正确!");
                        } else {
                            $("span.errorMsg").text("验证码错误!");
                        }
                    }
                )
            })
3.结果展示

image-20240212113211691

3.Ajax添加购物车

1.程序框架图

image-20240212134444094

2.修改CartServlet
    //根据物品信息添加到购物车,并以json格式返回数据
    public void addItemByAjax(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //获取前端物品信息
        Integer cartItemId = DataUtils.parseInt(req.getParameter("cartItemId"), -1);
        String cartItemName = req.getParameter("cartItemName");
        BigDecimal cartItemPrice = new BigDecimal(req.getParameter("cartItemPrice"));
        //计算剩余数据项
        Integer cartItemCount = 1;
        BigDecimal cartItemTotalPrice = null;
        //获取session
        HttpSession session = req.getSession();
        //获取存放物品信息的map
        HashMap<Integer, CartItem> cart = (HashMap<Integer, CartItem>) session.getAttribute("Cart");
        if (cart == null || cart.isEmpty()) { //如果map是空的或者没有数据
            HashMap<Integer, CartItem> CartItemHashMap = new HashMap<>();
            //只有一件,总价格就是一件的价格
            cartItemTotalPrice = cartItemPrice;
            //封装到bean中
            CartItem cartItem = new CartItem(cartItemId, cartItemName, cartItemPrice, cartItemCount, cartItemTotalPrice);
            CartItemHashMap.put(cartItemId, cartItem);
            session.setAttribute("Cart", CartItemHashMap);
            session.setAttribute("totalNum", cartItemCount);
            session.setAttribute("allPrice", cartItemPrice);
        } else {
            //只要map里包含了同样的id则数量加一
            if (cart.containsKey(cartItemId)) {
                cartItemCount = cart.get(cartItemId).getCount() + 1;
            }
            //计算总价格
            cartItemTotalPrice = cartItemPrice.multiply(new BigDecimal(cartItemCount));
            //封装到bean中
            CartItem cartItem = new CartItem(cartItemId, cartItemName, cartItemPrice, cartItemCount, cartItemTotalPrice);
            cart.put(cartItemId, cartItem);
            //重新计算总价和商品数量,并放到session中
            CartItem.calTotalNumAndPrice(cart, session);
        }
        //将totalNum以json的形式返回
        Map<String, Object> map = new HashMap<>();
        map.put("cartTotalCount", (Integer) session.getAttribute("totalNum"));
        Gson gson = new Gson();
        String json = gson.toJson(map);
        resp.getWriter().write(json);
    }
2.修改index.jsp

image-20240212145708647

image-20240212145724322

3.解决问题—未登录直接添加购物车,ajax请求无法重定向到登录页面
1.解决方案

image-20240212151620187

2.编写WebUtils判断是否是ajax请求
package com.sxs.furns.utils;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
 * @author 孙显圣
 * @version 1.0
 */
public class WebUtils {
    //判断是否是ajax请求
    public static boolean isAjaxRequest(HttpServletRequest request, HttpServletResponse response) {
        return "XMLHttpRequest".equals(request.getHeader("X-Requested-With"));
    }
}

3.修改MemberAuthorization(过滤器)
package com.sxs.furns.filter;

import com.google.gson.Gson;
import com.sxs.furns.utils.WebUtils;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.util.HashMap;
import java.util.Map;

/**
 * 普通权限认证
 * @author 孙显圣
 * @version 1.0
 */
public class MemberAuthorization implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpSession session = ((HttpServletRequest) servletRequest).getSession();
        //进行普通权限认证
        Object username = session.getAttribute("username");
        Object admin = session.getAttribute("admin");
        if (username != null || admin != null) {
            //放行
            filterChain.doFilter(servletRequest, servletResponse);
        } else {
            //如果不是ajax请求就正常执行
            if (!WebUtils.isAjaxRequest((HttpServletRequest) servletRequest, (HttpServletResponse) servletResponse)){
                //重定向到用户登录界面
                ((HttpServletResponse) servletResponse).sendRedirect("/jiaju_mail/views/member/login.jsp");
            }
            //如果是ajax请求,就返回一个url,以json形式
            Map<String, Object> map = new HashMap<>();
            map.put("url", "views/member/login.jsp");
            String json = new Gson().toJson(map);
            servletResponse.getWriter().write(json);
        }
    }

    @Override
    public void destroy() {

    }
}

4.修改index.jsp

image-20240212151816331

4.结果展示
1.未登录添加购物车,跳转到登录页面

image-20240212151946811

2.登录之后添加购物车,ajax局部刷新

image-20240212152146138

4.上传更新家居图片

1.需求分析

image-20240212152430428

2.程序框架图

image-20240212155349629

3.修改FurnServlet
    /**
     * 读取表单信息,进行修改
     *
     * @param req
     * @param resp
     */
    public void updateFurn(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //判断是否为文件类型的表单
        if (ServletFileUpload.isMultipartContent(req)) {
            //构建一个解析上传文件数据的工具对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //将这个对象给servletFileUpload,创建一个实例
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            //解决文件乱码
            servletFileUpload.setHeaderEncoding("utf-8");
            try {
                //获取文件项列表
                List<FileItem> list = servletFileUpload.parseRequest(req);
                Furn furn = new Furn();
                //ArrayList存储所有的普通表单字段
                ArrayList<String> furnItems = new ArrayList<>();
                //遍历文件项,判断是一个文件还是普通表单字段,做出不同的处理
                for (FileItem fileItem : list) {
                    //普通表单字段处理
                    if (fileItem.isFormField()) {
                        //获取普通表单字段,添加到ArrayList中
                        String furnItem = fileItem.getString("utf-8");
                        furnItems.add(furnItem);
                    } else {

                        //文件项处理
                        //获取文件名,对名字进行处理,防止重名
                        String name = UUID.randomUUID() + "_" + System.currentTimeMillis() + fileItem.getName();
                        //创建将来要存放的目录,这里不加/也会被认为是上下文路径,跟地址栏无关,但是建议加上
                        String filePath = "/assets/images/product-image/";
                        //获取真实路径
                        String realPath = super.getServletContext().getRealPath(filePath);
                        //判断是否有这个目录,如果没有再创建
                        File file = new File(realPath);
                        if (!file.exists()) {
                            file.mkdirs();
                        }
                        //将文件拷贝到刚才创建的目录下
                        String fileFullPath = realPath + name;
                        fileItem.write(new File(fileFullPath));
                        //设置furn的imgPath
                        String imgPath = "assets/images/product-image/" + name;
                        furn.setImgPath(imgPath);
                        if (fileItem.getName() == null || "".equals(fileItem.getName())) {
                            //如果没有修改图片,则路径不变
                            //从数据库中查询该id对应的imgPath
                            //就这里查出来的结果跟数据库的imgPath结果不一致
                            Furn rawFurn = furnService.queryFurnById(DataUtils.parseInt(furnItems.get(0), 0));
                            imgPath = rawFurn.getImgPath();
                        }
                        furn.setImgPath(imgPath);

                    }
                }

                //将普通订单项结果放到furn中
                furn.setId(DataUtils.parseInt(furnItems.get(0), 0));
                furn.setName(furnItems.get(1));
                furn.setMaker(furnItems.get(2));
                furn.setPrice(new BigDecimal(furnItems.get(3)));
                furn.setSales(DataUtils.parseInt(furnItems.get(4), 0));
                furn.setStock(DataUtils.parseInt(furnItems.get(5), 0));


                //获取pageNo
                String pageNo = req.getParameter("pageNo");
                //执行更新操作
                if (furnService.updateFurn(furn)) {
                    //更新成功则重定向到展示页面
                    resp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=page&pageNo=" + pageNo);
                } else {
                    System.out.println("更新失败");
                }
            } catch (FileUploadException e) {
                throw new RuntimeException(e);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }
    }
4.修改furn_update.jsp
1.样式
    <style type="text/css">
        /* 整体表格样式 */
        .table-content table {
            width: 100%;
            border-collapse: collapse;
            margin: 20px 0;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            box-shadow: 0 4px 8px rgba(0, 0, 0, 0.05);
        }

        .table-content th,
        .table-content td {
            text-align: left;
            padding: 12px;
            border-bottom: 1px solid #ddd;
        }

        .table-content th {
            background: linear-gradient(120deg, #006c70, #00b2a9);
            color: #ffffff;
            text-shadow: 0 1px 1px rgba(0, 0, 0, 0.2);
        }

        .table-content tr:hover {
            background-color: #f5f5f5;
        }

        /* 上传文件部分的样式 */
        .table-content .product-thumbnail {
            display: flex;
            flex-direction: column;
            align-items: center;
            position: relative;
            margin: 20px auto;
        }

        .table-content input[type="file"] {
            width: 200px;
            height: 200px;
            opacity: 0;
            position: absolute;
            cursor: pointer;
            z-index: 2; /* 确保文件输入位于图片上方 */
        }

        .table-content img {
            border-radius: 50%;
            width: 150px;
            height: 150px;
            object-fit: cover; /* 确保图片不会失真 */
            border: 2px solid #009688; /* 图片边框颜色与表头一致 */
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2); /* 轻微的阴影效果 */
        }

        /* 自定义文件上传提示样式 */
        .product-thumbnail::before {
            content: '点击或拖拽上传图片';
            position: absolute;
            width: 200px;
            height: 200px;
            background-color: rgba(0, 150, 136, 0.9);
            color: white;
            display: flex;
            justify-content: center;
            align-items: center;
            text-align: center;
            border-radius: 50%;
            font-size: 16px;
            transition: all 0.3s ease;
            opacity: 0;
            z-index: 1;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            font-weight: 600;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
        }

        .product-thumbnail:hover::before {
            opacity: 1;
        }

        /* 调整提交按钮样式 */
        .table-content input[type="submit"] {
            background: linear-gradient(120deg, #31B0D5, #2196F3);
            color: white;
            padding: 10px 20px;
            border: none;
            border-radius: 5px;
            transition: background-color 0.3s ease;
            cursor: pointer;
            font-size: 16px;
            text-transform: uppercase;
            letter-spacing: 1px;
            box-shadow: 0 2px 4px rgba(0, 0, 0, 0.2);
        }

        .table-content input[type="submit"]:hover {
            background-color: #2196F3;
        }

        /* 响应式设计 */
        @media (max-width: 768px) {
            .product-thumbnail {
                width: 150px;
                height: 150px;
            }

            .product-thumbnail input[type="file"] {
                width: 150px;
                height: 150px;
            }

            .product-thumbnail img {
                width: 150px;
                height: 150px;
            }

            .product-thumbnail::before {
                width: 150px;
                height: 150px;
                font-size: 14px;
            }

            .table-content input[type="submit"] {
                padding: 8px 16px;
            }
        }
    </style>

    <script type="text/javascript">
        function prev(event) {
            //获取展示图片的区域
            var img = document.getElementById("prevView");
            //获取文件对象
            var file = event.files[0];
            //获取文件阅读器: Js的一个类,直接使用即可
            var reader = new FileReader();
            reader.readAsDataURL(file);
            reader.onload = function () {
                //给img的src设置图片url
                img.setAttribute("src", this.result);
            }
        }
    </script>

2.修改form的enctype

image-20240212203805492

3.修改td

image-20240212203815981

5.解决bug,写sql的时候注意映射,映射,映射!!!(卡了2个小时才发现,醉了)

image-20240212204042144

6.结果展示
1.点击上传图片

image-20240212204223568

2.查看效果

image-20240212204306233

3.点击修改家居,回到原页面

image-20240212204336968

5.上传添加家居图片

1.修改FurnServlet
    /**
     * 添加家居并重新获取家居信息,重定向到furn_manage.jsp
     *
     * @param req
     * @param resp
     */
    public void add(HttpServletRequest req, HttpServletResponse resp) throws IOException, ServletException, InvocationTargetException, IllegalAccessException {

        //判断是否为文件类型的表单
        if (ServletFileUpload.isMultipartContent(req)) {
            //构建一个解析上传文件数据的工具对象
            DiskFileItemFactory diskFileItemFactory = new DiskFileItemFactory();
            //将这个对象给servletFileUpload,创建一个实例
            ServletFileUpload servletFileUpload = new ServletFileUpload(diskFileItemFactory);
            //解决文件乱码
            servletFileUpload.setHeaderEncoding("utf-8");
            try {
                //获取文件项列表
                List<FileItem> list = servletFileUpload.parseRequest(req);
                Furn furn = new Furn();
                //ArrayList存储所有的普通表单字段
                ArrayList<String> furnItems = new ArrayList<>();
                //遍历文件项,判断是一个文件还是普通表单字段,做出不同的处理
                for (FileItem fileItem : list) {
                    //普通表单字段处理
                    if (fileItem.isFormField()) {
                        //获取普通表单字段,添加到ArrayList中
                        String furnItem = fileItem.getString("utf-8");
                        furnItems.add(furnItem);
                    } else {

                        //文件项处理
                        //获取文件名,对名字进行处理,防止重名
                        String name = UUID.randomUUID() + "_" + System.currentTimeMillis() + fileItem.getName();
                        //创建将来要存放的目录,这里不加/也会被认为是上下文路径,跟地址栏无关,但是建议加上
                        String filePath = "/assets/images/product-image/";
                        //获取真实路径
                        String realPath = super.getServletContext().getRealPath(filePath);
                        //判断是否有这个目录,如果没有再创建
                        File file = new File(realPath);
                        if (!file.exists()) {
                            file.mkdirs();
                        }
                        //将文件拷贝到刚才创建的目录下
                        String fileFullPath = realPath + name;
                        fileItem.write(new File(fileFullPath));
                        //设置furn的imgPath
                        String imgPath = "assets/images/product-image/" + name;
                        furn.setImgPath(imgPath);
                        if (fileItem.getName() == null || "".equals(fileItem.getName())) {
                            //如果没有修改图片,则路径设置默认的
                            imgPath = "assets/images/product-image/default.jpg";
                        }
                        furn.setImgPath(imgPath);

                    }
                }

                //将普通订单项结果放到furn中
                furn.setName(furnItems.get(0));
                furn.setMaker(furnItems.get(1));
                furn.setPrice(new BigDecimal(furnItems.get(2)));
                furn.setSales(DataUtils.parseInt(furnItems.get(3), 0));
                furn.setStock(DataUtils.parseInt(furnItems.get(4), 0));

                //获取pageNo
                String pageNo = req.getParameter("pageNo");
                //插入到数据库
                if (furnService.add(furn)) {
                    //插入成功则重定向到家居显示的servlet
                    resp.sendRedirect(super.getServletContext().getContextPath() + "/manage/furnServlet?action=page&pageNo=" + pageNo);
                } else {
                    System.out.println("插入失败");
                }
            } catch (FileUploadException e) {
                throw new RuntimeException(e);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }

        }

    }
2.修改furn_add.jsp
1.前端样式与前面一样
2.修改form的enctype

image-20240212212234575

3.修改td

image-20240212212322080

3.结果展示
1.准备添加家居

image-20240212212421192

2.效果展示

image-20240212212456525

3.添加之后

image-20240212212523716

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

每日一题---OJ题: 有效的括号

片头 嗨! 小伙伴们,大家好! 我们又见面啦! 今天我们来一起尝试一下这道题目---有效的括号,准备好了吗? 我们开始咯! 说实话,我刚开始做这道题的时候也是一脸懵,怎么进行括号匹配呢? 别慌,我们一起画个图,分析分析括号匹配的过程~ 如下图所示,上方表示一个字符串数组,存放不…

【C++】力扣OJ题:找出只出现一次的数字

Hello everybody!这是我第一次写关于OJ题目的博客&#xff0c;因为正好学到完了C的STL库&#xff0c;就顺手刷了一些OJ题。 我今天要介绍的题目虽然是力扣上的简单题&#xff0c;但思想很巧妙&#xff0c;我觉得有必要和大家分享一下&#xff01; 1.题目 2.代码 class Solut…

【Go】原子并发操作

目录 一、基本概念 支持的数据类型 主要函数 使用场景 二、基础代码实例 开协程给原子变量做加法 统计多个变量 原子标志判断 三、并发日志记录器 四、并发计数器与性能监控 五、优雅的停止并发任务 worker函数 Main函数 应用价值 Go语言中&#xff0c;原子并发操…

飞机飞行数据三维可视化管控系统更智能、精准

近年来&#xff0c;随着无人化工厂和智能工厂在中国大量涌现&#xff0c;基于成熟的数字孪生理念&#xff0c;智能工厂三维可视化虚拟管控系统引领未来工业革命的先锋。数字孪生公司深圳华锐视点结合前沿的三维仿真、GIS和三维可视化技术技术&#xff0c;深度集成工厂生产、经营…

鸿蒙 Failed :entry:default@CompileResource...

Failed :entry:defaultCompileResource... media 文件夹下有文件夹或者图片名称包含中文字符 rawfile 文件夹下文件名称、图片名称不能包含中文字符

IGBT退饱和现象解析与防范

IGBT是一种重要的功率半导体器件&#xff0c;广泛应用于电力电子领域&#xff0c;如变频器、电动机驱动、电力传输等。在这些应用中&#xff0c;IGBT的导通和关断特性至关重要&#xff0c;而退饱和是IGBT工作过程中的一个重要现象。 IGBT的退饱和定义 退饱和是指IGBT在导通状态…

软件测试面试题分享(含答案+文档)

&#x1f345; 视频学习&#xff1a;文末有免费的配套视频可观看 &#x1f345; 点击文末小卡片&#xff0c;免费获取软件测试全套资料&#xff0c;资料在手&#xff0c;涨薪更快 准备找工作的小伙伴们&#xff0c;今天我给大家带来了一些自动化测试面试题&#xff0c;在这个公…

NLP vs. LLMs: 理解它们之间的区别

作者&#xff1a;Elastic Platform Team 随着人工智能持续发展并在无数行业解决问题&#xff0c;技术的一个关键部分是能够无缝地桥接人类语言和机器理解之间的差距。这就是自然语言处理&#xff08;NLP&#xff09;和大型语言模型&#xff08;LLMs&#xff09;的用武之地。它们…

运用OSI模型提升排错能力

1. OSI模型有什么实际的应用价值&#xff1f; 2. 二层和三层网络的区别和应用&#xff1b; 3. 如何通过OSI模型提升组网排错能力&#xff1f; -- OSI - 开放式系统互联 - 一个互联标准 - 从软件和硬件 定义标准 - 不同厂商的设备 研发的技术 - 具备兼容性 -- O…

Python基于flask的豆瓣电影分析可视化系统

博主介绍&#xff1a;✌程序员徐师兄、7年大厂程序员经历。全网粉丝12w、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取源码联系&#x1f345; &#x1f447;&#x1f3fb; 精彩专栏推荐订阅&#x1f447;…

初识集合框架

前言~&#x1f973;&#x1f389;&#x1f389;&#x1f389; hellohello~&#xff0c;大家好&#x1f495;&#x1f495;&#xff0c;这里是E绵绵呀✋✋ &#xff0c;如果觉得这篇文章还不错的话还请点赞❤️❤️收藏&#x1f49e; &#x1f49e; 关注&#x1f4a5;&#x1f…

机器视觉图像采集卡及其接口概述

本文主要是介绍机器视觉图像采集卡及其使用的各种接口。 首先&#xff0c;我们将概述外围计算机卡&#xff0c;然后探索图像采集卡中使用的不同类型的机器视觉接口。 我们先来说一个常见的问题&#xff1a;什么是电脑外设卡&#xff0c;如何分类&#xff1f; 用于机器视觉的…

GIS 数据格式转换

1、在线工具 mapshaper 2、数据上传 3、数据格式转换 导入数据可导出为多种格式&#xff1a;Shapefile、Json、GeoJson、CSV、TopJSON、KML、SVG

【python】项目实战

启动一个项目对于新手都是不容易的事情 在哪 对于Windows平台&#xff0c;打开cmd 使用命令py -0p 【其中0是零】 显示已安装的 python 版本且带路径的列表 切换python3命令 在Windows下&#xff0c;可以使用cmd下使用mklink命令创建“软链接”更好一些。 例如&#xf…

Three.js--》穿越虚拟门槛打造的3D登录界面

今天简单实现一个three.js的小Demo&#xff0c;加强自己对three知识的掌握与学习&#xff0c;只有在项目中才能灵活将所学知识运用起来&#xff0c;话不多说直接开始。 目录 项目搭建 初始化three代码 添加背景与地球 星星动画效果 星云动画效果 实现登录框效果 项目搭建…

软件设计不是CRUD(18):像搭积木一样搭建应用系统(上)——单个应用系统的搭建过程

1、概述 之前的文章本专题花了大量文字篇幅,介绍如何基于业务抽象的设计方式完成应用系统各个功能模块的设计工作。而之所以进行这样的功能模块设计无非是希望这些功能模块在具体的项目实施过程中,能够按照当时的需求快速的、简易的、稳定的、最大可能节约开发成本的形成可用…

提高大型语言模型 (LLM) 性能的四种数据清理技术

原文地址&#xff1a;four-data-cleaning-techniques-to-improve-large-language-model-llm-performance 2024 年 4 月 2 日 检索增强生成&#xff08;RAG&#xff09;过程因其增强对大语言模型&#xff08;LLM&#xff09;的理解、为它们提供上下文并帮助防止幻觉的潜力而受…

关于沃进科技无线模块demo软件移植问题

文章目录 一、无线模块开发测试准备二、开发板硬件三、开发板默认功能上电默认界面功能选择界面数据包发送界面数据包接收显示界面射频性能测试界面参数设置界面固件信息显示界面 四、软件开发软件SDK框图1、射频硬件驱动&#xff08;详见./radio/myRadio_gpio.c&#xff09;2、…

Linux_iptables防火墙学习笔记

文章目录 iptables 概述四表五链iptables 安装启动iptables 配置详解iptables配置文件iptables配置语法iptables常用实例查看规则修改默认规则保存和备份规则恢复备份的规则清空规则放行SSH服务在ubuntu14.04中iptables规则持久化 iptables 概述 主机型 对主机进行保护 网络型…

CSS基础:margin属性4种值类型,4个写法规则详解

你好&#xff0c;我是云桃桃。 一个希望帮助更多朋友快速入门 WEB 前端的程序媛。大专生&#xff0c;一枚程序媛&#xff0c;感谢关注。回复 “前端基础题”&#xff0c;可免费获得前端基础 100 题汇总&#xff0c;回复 “前端工具”&#xff0c;可获取 Web 开发工具合集 268篇…