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

news2024/12/26 22:14:04

文章目录

    • 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

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

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

相关文章

Excel文件解析

在此模块的学习中&#xff0c;我们需要一个新的开源类库---Apahche POI开源类库。这个类库的用途是&#xff1a;解析并生成Excel文件(Word、ppt)。Apahche POI基于DOM方式进行解析&#xff0c;将文件直接加载到内存&#xff0c;所以速度比较快&#xff0c;适合Excel文件数据量不…

没有算法大佬,都是草台班子

没有算法大佬&#xff0c;都是草台班子。 最近除了工作之外&#xff0c;还有一些时间在和加我微信的小伙伴沟通&#xff0c;聊的内容大部分集中在如何快速有效的学习人工智能、入门人工智能的技巧。 其中&#xff0c;一个知乎过来加我微信的小伙伴的经历更是让我感触很深。 …

eclipse导入maven项目与配置使用本地仓库

前言 本人润国外了&#xff0c;发现不能用收费软件IDEA了&#xff0c;需要使用eclipse&#xff0c;这个免费。 但是早忘了怎么用了&#xff0c;在此总结下。 一、eclipse导入本地项目 1.选这个&#xff1a;open projects from file system… 2.找到项目文件夹&#xff0c;…

树莓派点亮双色LED

双色LED灯准确来说叫双基色LED灯,是指模块只能显示2种颜色,一般是红色和绿色,可以有三种状态 :灭,颜色1亮,颜色2亮,根据颜色组合的不同,分为红蓝双色,黄蓝双色,红绿双色等等。 接线:将引脚S(绿色)和中间引脚(红色)连接到Raspberry Pi的GPIO接口上,对Raspberry…

《QT实用小工具·二十六》运行时间记录

1、概述 源码放在文章末尾 运行时间记录&#xff0c;包含如下功能&#xff1a; 可以启动和停止服务&#xff0c;在需要的时候启动。 可以指定日志文件存放目录。 可以指定时间日志输出间隔。 可以单独追加一条记录到日志文件。 日志为文本格式&#xff0c;清晰明了。 软…

JavaScript排序大揭秘:手绘图解6大常见排序算法,一网打尽

前言 &#x1f4eb; 大家好&#xff0c;我是南木元元&#xff0c;热爱技术和分享&#xff0c;欢迎大家交流&#xff0c;一起学习进步&#xff01; &#x1f345; 个人主页&#xff1a;南木元元 本文用图解总结梳理了6种常见的排序算法 &#xff0c;如下&#x1f447;&#xff1…

【热门话题】PyTorch:深度学习领域的强大工具

&#x1f308;个人主页: 鑫宝Code &#x1f525;热门专栏: 闲话杂谈&#xff5c; 炫酷HTML | JavaScript基础 ​&#x1f4ab;个人格言: "如无必要&#xff0c;勿增实体" 文章目录 PyTorch&#xff1a;深度学习领域的强大工具一、PyTorch概述二、PyTorch核心特性…

WGCNA分析

目录 基本概念 基本原理 下游分析 基本概念 WGCNA其译为加权基因共表达网络分析。该分析方法旨在寻找协同表达的基因模块(module)&#xff0c;并探索基因网络与关注的表型之间的关联关系&#xff0c;以及网络中的核心基因。 适用于复杂的数据模式&#xff08;推荐5组(或者…

JavaEE企业开发新技术5

目录 2.18 综合应用-1 2.19 综合应用-2 2.20 综合应用-3 2.21 综合应用-4 2.22 综合应用-5 Synchronized &#xff1a; 2.18 综合应用-1 反射的高级应用 DAO开发中&#xff0c;实体类对应DAO的实现类中有很多方法的代码具有高度相似性&#xff0c;为了提供代码的复用性,降低…

Zookeeper与Kafka消息队列

目录 一、Zookeeper 1、zookeeper简介 2、zookeeper的特点 3、zookeeper的工作模式跟工作机制 3.1 工作模式&#xff1a; 3.2工作机制&#xff1a;​编辑 4、zookeeper应用场景及选举机制 4.1 应用场景&#xff1a; 4.2 选举机制&#xff1a; 4.2.1第一次启动选举机制…

<计算机网络自顶向下> CDN

视频服务挑战 规模性异构性&#xff1a;不同用户有不同的能力&#xff08;比如有线接入和移动用户&#xff1b;贷款丰富和受限用户&#xff09;解决方法是&#xff1a;分布式的应用层面的基础设施CDN 多媒体&#xff1a;视频 视频是固定速度显示的一系列图像的序列&#xff…

MySQL 使用C语言

一般使用MySQL很少用命令行&#xff0c;一般都是通过程序内部使用&#xff0c;MySQL也为不同的语言定制了不同的头文件和库函数&#xff0c;可以在自己的程序中通过包含头文件和编译时候链接库函数来使用MySQL。 现在一般安装MySQL的时候就会自动给你安装库函数和头文件。 可…

python爬虫------- Selenium下篇(二十三天)

&#x1f388;&#x1f388;作者主页&#xff1a; 喔的嘛呀&#x1f388;&#x1f388; &#x1f388;&#x1f388;所属专栏&#xff1a;python爬虫学习&#x1f388;&#x1f388; ✨✨谢谢大家捧场&#xff0c;祝屏幕前的小伙伴们每天都有好运相伴左右&#xff0c;一定要天天…

11.哀家要长脑子了!

目录 1.453. 最小操作次数使数组元素相等 - 力扣&#xff08;LeetCode&#xff09; 2.665. 非递减数列 - 力扣&#xff08;LeetCode&#xff09; 3. 283. 移动零 - 力扣&#xff08;LeetCode&#xff09; 4. 3114. 替换字符可以得到的最晚时间 - 力扣&#xff08;LeetCode…

构建第一个ArkTS用的资源分类与访问

应用开发过程中&#xff0c;经常需要用到颜色、字体、间距、图片等资源&#xff0c;在不同的设备或配置中&#xff0c;这些资源的值可能不同。 应用资源&#xff1a;借助资源文件能力&#xff0c;开发者在应用中自定义资源&#xff0c;自行管理这些资源在不同的设备或配置中的表…

Redis实现延迟任务的几种方案

&#x1f3f7;️个人主页&#xff1a;牵着猫散步的鼠鼠 &#x1f3f7;️系列专栏&#xff1a;Java全栈-专栏 &#x1f3f7;️个人学习笔记&#xff0c;若有缺误&#xff0c;欢迎评论区指正 目录 1.前言 2.Redis如何实现延迟任务&#xff1f; 3.代码实现 3.1. 过期键通知事…

【Java】maven的生命周期和概念图

maven的生命周期&#xff1a; 在maven中存在三套"生命周期"&#xff0c;每一套生命周期,相互独立,互不影响的,但是中同一套生命周期里,执行后面的命令会自动先执行前面的命令 CleanLifeCycle&#xff1a;清理的生命周期 clean defaultLifeCycle&#xff1a;默认的…

智能物联网远传冷水表管理系统

智能物联网远传冷水表管理系统是一种基于物联网技术的先进系统&#xff0c;旨在实现对冷水表的远程监测、数据传输和智能化管理。本文将从系统特点、构成以及带来的效益三个方面展开介绍。 系统特点 1.远程监测&#xff1a;系统可以实现对冷水表数据的远程监测&#xff0c;无…

趣话最大割问题:花果山之群猴博弈

内容来源&#xff1a;量子前哨&#xff08;ID&#xff1a;Qforepost&#xff09; 编辑丨浪味仙 排版丨 沛贤 深度好文&#xff1a;3000字丨15分钟阅读 趋利避害&#xff0c;是所有生物遵循的自然法则&#xff0c;人类也不例外。 举个例子&#xff0c;假如你是某生鲜平台的配…

【Entity Framework】你要知道EF中功能序列与值转换

【Entity Framework】你要知道EF中功能序列与值转换 文章目录 【Entity Framework】你要知道EF中功能序列与值转换一、序列1.1 基本用法1.2 配置序列设置 二、值转换2.1 配置值转换器2.2 批量配置值转换器2.3 预定义的转换2.4 ValueConverter类2.5 内置转换器 三、应用3.1 简单…