news 2026/9/26 20:06:31

springboot甘肃特产服务平台50301-计算机课程设计、毕业设计

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
springboot甘肃特产服务平台50301-计算机课程设计、毕业设计

前言

✨博主介绍:一线全栈工程师,毕设实战引路人。技术栈覆盖Java、Python、C#、PHP、Node.js及UniApp跨端开发,擅长多语言项目落地与架构设计。持续分享毕设源码、开题报告、技术选型心得与职场踩坑经验。用工程化思维写代码,帮你把毕设做成作品集。👍👍

👇精彩专栏 推荐订阅👇

海量实战库,源码任你选! 坐拥Java项目2000+套

海量实战库,源码任你选! 坐拥Python项目1000+套

海量实战库,源码任你选! 坐拥小程序/app项目500+套

✅获取源码请私信✅

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️

系统实现

普通用户功能实现

用户注册

注册用户在访问系统首页后,可选择点击“注册”按钮,进入相应的注册页面。在该页面中,用户需完成所有注册信息必填项,点击页面下方的“注册”按钮。系统在接收到表单数据并完成验证后,若信息无误,将提示注册成功,并在自动跳转至系统的登录界面,以便用户立即进行登录操作。注册界面如下图所示。

用户注册界面

用户登录

用户在登录界面点击“登录”按钮后,需输入用户名、密码以及验证码以完成身份验证操作。系统在前端会自动对所输入信息进行有效性校验,同时检查该用户是否已通过后台审核流程。若审核通过且信息无误,则系统将允许用户成功登录并跳转至相应的功能界面;反之页面会弹出相应的提示信息,提醒用户重新输入或检查相关信息的正确性。登录界面如下图所示。

登录界面

甘肃特产

甘肃特产主要展示商品信息,提供搜索功能,普通用户可浏览商城中心详情内容,可收藏商品信息,发表评论,支持热门推荐、今日推荐等(优先推荐购买过的商品内容),实现立即购买、加入购物车操作。

甘肃特产界面

我的购物车

展示用户临时选购的产品列表,用户可以在此确认产品数量、价格,或删除不需要的产品。我的购物车界面如下图所示。

我的购物车界面

我的订单

提供用户的历史订单和当前订单的详细信息,包括每个订单的状态、预计送达时间、产品明细等。我的订单主界面如下图所示。

我的订单界面

我的地址

用户可以管理自己的收货地址,确保送达时的准确性。支持新增、修改、删除收货地址。我的地址界面如下图所示。

我的地址界面

管理员功能实现

系统用户

管理员可管理所有用户信息,包括对普通用户、商家用户和管理员等用户信息增改删查操作,支持审核、封禁、权限设置等功能。界面如下图所示。

系统用户界面

店铺信息管理管理

管理员审核商家提交的店铺资质(营业执照、食品经营许可证等),管理店铺状态(上架/下架/冻结),查看店铺评分与投诉记录。店铺信息管理界面如下图所示。

店铺信息管理界面

系统管理

系统管理:可以查看轮播图详情,以及查询、重置、删除、添加等操作。系统管理界面如下图所示:

系统管理界面

平台公告管理

管理员可以发布平台公告,管理员还可以编辑、删除或修改已发布的公告,确保公告内容的时效性和准确性。平台公告管理界面如下图所示。

平台公告管理界面

资源管理

管理员在资源管理页面查看所有把资讯文章,支持新增、编辑和删除操作。点击“新增”填写标题、内容并上传图片,选择分类后发布。可批量删除过期文章。界面如下图所示。

资源管理界面

商城管理

管理员通过商城管理模块对商品进行整体管控,包括商品的信息录入与维护、分类列表的设置与调整,以及订单列表、订单配送和订单售后的全流程管理,实现从用户下单到售后服务的闭环操作。商城管理界面如下图所示。

商城管理界面

商家用户功能实现

商城管理

商家用户可在商城管理中发布新特产,完善图片、描述、价格及库存信息,并随时编辑商品详情或控制上下架状态。通过自定义分类列表,商家能对店内商品进行二次划分,便于顾客筛选。在订单处理方面,商家可查看所有订单明细,确认收款后打印发货单,填写物流单号以更新发货状态并跟踪轨迹。此外,商家还需负责订单售后工作,与用户沟通协商退款或退货事宜,并及时上传相关凭证完成处理。界面如下图所示。

商城管理界面

数据库参考

CREATE TABLE `logistics_delivery` ( `logistics_delivery_id` int(11) NOT NULL AUTO_INCREMENT COMMENT '物流配送ID', `order_number` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '订单号', `product_name` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '商品名称', `purchase_quantity` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '购买数量', `total_transaction_amount` double(10,2) DEFAULT '0.00' COMMENT '交易总额', `the_date_of_issuance` date DEFAULT NULL COMMENT '发货日期', `delivery_number` varchar(30) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送订单', `ordinary_users` int(11) DEFAULT '0' COMMENT '普通用户', `shipping_address` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '收货地址', `delivery_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '配送状态', `signing_status` varchar(64) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '签收状态', `recommend` int(11) NOT NULL DEFAULT '0' COMMENT '智能推荐', `contact_name` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '联系人名字', `merchant_id` int(11) DEFAULT NULL COMMENT '商家id', `create_time` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `courier_type` int(11) NOT NULL DEFAULT '1' COMMENT '配送方式(1:商家配送,2:其他配送)', `courier_id` int(11) DEFAULT NULL COMMENT '配送员ID', `courier_name` varchar(255) COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '配送员名字', `courier_detail` longtext COLLATE utf8mb4_general_ci COMMENT '配送详情', PRIMARY KEY (`logistics_delivery_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='物流配送'; DROP TABLE IF EXISTS `goods`; CREATE TABLE `goods` ( `goods_id` mediumint(8) unsigned NOT NULL AUTO_INCREMENT COMMENT '产品ID', `title` varchar(125) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '标题', `img` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '封面图:用于显示于产品列表页', `description` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci DEFAULT NULL COMMENT '描述', `price_ago` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '原价', `price` double(8,2) unsigned NOT NULL DEFAULT '0.00' COMMENT '卖价', `sales` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '销量', `inventory` int(11) NOT NULL DEFAULT '0' COMMENT '商品库存', `type` varchar(64) CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci NOT NULL DEFAULT '' COMMENT '商品分类', `hits` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '点击量', `content` longtext CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '正文', `img_1` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图1', `img_2` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图2', `img_3` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图3', `img_4` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图4', `img_5` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '主图5', `create_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间', `update_time` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间', `customize_field` text CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci COMMENT '自定义字段', `source_table` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源表', `source_field` varchar(255) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL COMMENT '来源字段', `source_id` int(10) unsigned NOT NULL DEFAULT '0' COMMENT '来源ID', `user_id` int(11) unsigned DEFAULT '0' COMMENT '添加人', `integral` int(11) DEFAULT '0' COMMENT '积分', `list_status` smallint(1) DEFAULT '1' COMMENT '上架状态(0:下架;1上架)', PRIMARY KEY (`goods_id`) USING BTREE ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='商品信息';

代码参考

package com.project.demo.controller; import com.project.demo.entity.BusinessUser; import com.project.demo.service.BusinessUserService; import com.alibaba.fastjson.JSON; import com.project.demo.entity.User; import com.project.demo.controller.base.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.util.StringUtils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.persistence.Query; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; /** * 商家用户:(BusinessUser)表控制层 * */ @RestController @RequestMapping("/business_user") public class BusinessUserController extends BaseController<BusinessUser, BusinessUserService> { /** * 商家用户对象 */ @Autowired public BusinessUserController(BusinessUserService service) { setService(service); } @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String,Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); BusinessUser business_user = new BusinessUser(); business_user.setStore_name(paramMap.get("store_name")==null?null:String.valueOf(paramMap.get("store_name"))); business_user.setBusiness_name(paramMap.get("business_name")==null?null:String.valueOf(paramMap.get("business_name"))); business_user.setBusiness_phone(paramMap.get("business_phone")==null?null:String.valueOf(paramMap.get("business_phone"))); business_user.setQualification_certificate(paramMap.get("qualification_certificate")==null?null:String.valueOf(paramMap.get("qualification_certificate"))); business_user.setExamine_state(paramMap.get("examine_state")==null?null:String.valueOf(paramMap.get("examine_state"))); business_user.setUserId(paramMap.get("user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("user_id")))); business_user.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(business_user); System.out.println("商家用户新增成功"); return success(1); } @PostMapping("/set") @Transactional public Map<String, Object> set(HttpServletRequest request) throws IOException { Map<String,String> queryMap = service.readQuery(request); Map<String,String> configMap = service.readConfig(request); Map<String,Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); BusinessUser business_user = new BusinessUser(); business_user.setStore_name(paramMap.get("store_name")==null?null:String.valueOf(paramMap.get("store_name"))); business_user.setBusiness_name(paramMap.get("business_name")==null?null:String.valueOf(paramMap.get("business_name"))); business_user.setBusiness_phone(paramMap.get("business_phone")==null?null:String.valueOf(paramMap.get("business_phone"))); business_user.setQualification_certificate(paramMap.get("qualification_certificate")==null?null:String.valueOf(paramMap.get("qualification_certificate"))); business_user.setExamine_state(paramMap.get("examine_state")==null?null:String.valueOf(paramMap.get("examine_state"))); business_user.setUserId(paramMap.get("user_id")==null?null:Integer.valueOf(String.valueOf(paramMap.get("user_id")))); this.setEntity(queryMap,configMap,business_user); System.out.println("商家用户修改成功"); return success(1); } /** * 修改审核状态 * * @param id 要修改的记录ID * @param newState 新的审核状态 * @return 提示信息:审核成功/失败 */ @Transactional @GetMapping("/update_examine_state") public String updateExamineState(Long id, String newState) throws IOException { // 检查传入的状态是否合法 if (!newState.equals("未审核") && !newState.equals("已通过") && !newState.equals("未通过")) { return "非法的审核状态"; } Map<String,String> queryMap = new HashMap<>(); queryMap.put("id",String.valueOf(id)); // 根据ID查找记录 BusinessUser business_user = service.findOne(queryMap); if (business_user!=null) { // 更新审核状态 business_user.setExamine_state(newState); this.setEntity(queryMap,new HashMap<>(),business_user); return "审核成功"; } else { return "审核失败:记录不存在"; } } /** * 根据 user_id 查询用户及其附加表信息 * * @param userId 用户ID * @return 包含用户信息和附加信息的对象 */ @GetMapping("/get_user_by_id") public Map<String,Object> getUserById(Long userId) { Map<String,String> queryMap = new HashMap<>(); queryMap.put("user_id",String.valueOf(userId)); // 查询用户基本信息 Map<String,Object> registeredMap = this.getObjByMap(queryMap); BusinessUser business_user = JSON.parseObject(JSON.toJSONString(registeredMap),BusinessUser.class); if (business_user != null) { // 查询用户附加信息 Map<String,Object> userMap = this.getObjByMap(queryMap); User user = JSON.parseObject(JSON.toJSONString(userMap),User.class); Map<String,Object> result = new HashMap<>(); result.put("user",user); result.put("business_user",business_user); return result; } else { throw new RuntimeException("商家用户不存在}"); } } } package com.project.demo.controller; import com.project.demo.controller.base.BaseController; import com.project.demo.entity.LogisticsDelivery; import com.project.demo.service.LogisticsDeliveryService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; /** * 物流 * */ @RestController @RequestMapping("logistics_delivery") public class LogisticsDeliveryController extends BaseController<LogisticsDelivery, LogisticsDeliveryService> { /** * 服务对象 */ @Autowired public LogisticsDeliveryController(LogisticsDeliveryService service) { setService(service); } } package com.project.demo.controller; import com.project.demo.entity.StoreInformation; import com.project.demo.service.StoreInformationService; import com.alibaba.fastjson.JSON; import com.project.demo.controller.base.BaseController; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.transaction.annotation.Transactional; import org.springframework.web.bind.annotation.*; import org.springframework.util.StringUtils; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import javax.persistence.Query; import javax.servlet.http.HttpServletRequest; import java.io.IOException; import java.util.HashMap; import java.util.List; import java.util.Map; import java.util.*; /** * 店铺信息:(StoreInformation)表控制层 * */ @RestController @RequestMapping("/store_information") public class StoreInformationController extends BaseController<StoreInformation, StoreInformationService> { /** * 店铺信息对象 */ @Autowired public StoreInformationController(StoreInformationService service) { setService(service); } @PostMapping("/add") @Transactional public Map<String, Object> add(HttpServletRequest request) throws IOException { Map<String,Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); StoreInformation store_information = new StoreInformation(); store_information.setMerchant_number(paramMap.get("merchant_number")==null?null:String.valueOf(paramMap.get("merchant_number"))); store_information.setBusiness_user(paramMap.get("business_user")==null?null:Integer.valueOf(String.valueOf(paramMap.get("business_user")))); store_information.setStore_name(paramMap.get("store_name")==null?null:String.valueOf(paramMap.get("store_name"))); store_information.setBusiness_name(paramMap.get("business_name")==null?null:String.valueOf(paramMap.get("business_name"))); store_information.setBusiness_phone(paramMap.get("business_phone")==null?null:String.valueOf(paramMap.get("business_phone"))); store_information.setBusiness_hours(paramMap.get("business_hours")==null?null:String.valueOf(paramMap.get("business_hours"))); store_information.setShop_signboard(paramMap.get("shop_signboard")==null?null:String.valueOf(paramMap.get("shop_signboard"))); store_information.setStore_address(paramMap.get("store_address")==null?null:String.valueOf(paramMap.get("store_address"))); store_information.setBrand_story(paramMap.get("brand_story")==null?null:String.valueOf(paramMap.get("brand_story"))); store_information.setStore_announcement(paramMap.get("store_announcement")==null?null:String.valueOf(paramMap.get("store_announcement"))); store_information.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits")))); store_information.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len")))); store_information.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len")))); store_information.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); store_information.setCreate_by(paramMap.get("create_by")==null?null:Integer.valueOf(String.valueOf(paramMap.get("create_by")))); this.addEntity(store_information); System.out.println("店铺信息新增成功"); return success(1); } @PostMapping("/set") @Transactional public Map<String, Object> set(HttpServletRequest request) throws IOException { Map<String,String> queryMap = service.readQuery(request); Map<String,String> configMap = service.readConfig(request); Map<String,Object> paramMap = service.readBody(request.getReader()); paramMap.entrySet().removeIf(entry -> { Object value = entry.getValue(); return value instanceof String && ((String) value).isEmpty(); }); StoreInformation store_information = new StoreInformation(); store_information.setMerchant_number(paramMap.get("merchant_number")==null?null:String.valueOf(paramMap.get("merchant_number"))); store_information.setBusiness_user(paramMap.get("business_user")==null?null:Integer.valueOf(String.valueOf(paramMap.get("business_user")))); store_information.setStore_name(paramMap.get("store_name")==null?null:String.valueOf(paramMap.get("store_name"))); store_information.setBusiness_name(paramMap.get("business_name")==null?null:String.valueOf(paramMap.get("business_name"))); store_information.setBusiness_phone(paramMap.get("business_phone")==null?null:String.valueOf(paramMap.get("business_phone"))); store_information.setBusiness_hours(paramMap.get("business_hours")==null?null:String.valueOf(paramMap.get("business_hours"))); store_information.setShop_signboard(paramMap.get("shop_signboard")==null?null:String.valueOf(paramMap.get("shop_signboard"))); store_information.setStore_address(paramMap.get("store_address")==null?null:String.valueOf(paramMap.get("store_address"))); store_information.setBrand_story(paramMap.get("brand_story")==null?null:String.valueOf(paramMap.get("brand_story"))); store_information.setStore_announcement(paramMap.get("store_announcement")==null?null:String.valueOf(paramMap.get("store_announcement"))); store_information.setHits(paramMap.get("hits")==null?null:Integer.valueOf(String.valueOf(paramMap.get("hits")))); store_information.setPraise_len(paramMap.get("praise_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("praise_len")))); store_information.setCollect_len(paramMap.get("collect_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("collect_len")))); store_information.setComment_len(paramMap.get("comment_len")==null?null:Integer.valueOf(String.valueOf(paramMap.get("comment_len")))); this.setEntity(queryMap,configMap,store_information); System.out.println("店铺信息修改成功"); return success(1); } }

前端:基于Vue.js框架构建用户界面,使用HTML5、CSS3和JavaScript实现页面结构与交互逻辑,通过Vue Router管理路由,Vuex或Pinia维护全局状态。采用Element UI或Vant组件库快速搭建界面,Axios封装HTTP请求实现与后端的数据通信。

后端:基于springboot框架搭建,遵循Controller-Service-Mapper三层架构。Controller层接收前端请求并校验参数,Service层处理核心业务逻辑,Mapper层通过MyBatis或MyBatis-Plus完成数据库操作。使用Spring Security或Shiro结合JWT实现用户认证与权限控制。

数据库:采用MySQL存储持久化数据,Redis缓存热点信息以提升系统性能。

开发工具:使用IDEA开发后端,VSCode或HBuilderX开发前端,Git进行版本管理,Maven和npm分别管理前后端依赖。

源码获取

私信联系我即可~

大家点赞、收藏、关注、评论啦

👇精彩专栏 推荐订阅👇

海量实战库,源码任你选! 坐拥Java项目2000+套

海量实战库,源码任你选! 坐拥Python项目1000+套

海量实战库,源码任你选! 坐拥小程序/app项目500+套

✅获取源码请私信✅

感兴趣的可以先收藏起来,还有大家在毕设选题,项目以及论文编写等相关问题都可以找我咨询,希望帮助更多的人❤️

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/26 20:04:34

AgentScope 多智能体框架实战:消息驱动、编排配置与 RAG 落地

AgentScope 这个框架&#xff0c;我最早是在一个多智能体协作项目的技术选型阶段接触到的。当时团队要做一个能同时调度十几个 Agent 协同完成复杂任务的原型系统&#xff0c;试了几套方案&#xff0c;要么是通信机制太简陋&#xff0c;要么是调试起来像在黑箱里摸象。后来翻到…

作者头像 李华
网站建设 2026/9/26 20:00:38

NativeWind 响应式设计指南:在 React Native 中使用 Tailwind 断点体系

移动开发跨平台前端 【免费下载链接】nativewind The utility-first workflow you love from Tailwind CSS in your React Native applications. 项目地址&#xff1a; https://gitcode.com/gh_mirrors/na/nativewind 点击查看 免费下载 本文是 NativeWind 响应式设计的实战指…

作者头像 李华
网站建设 2026/9/26 19:57:57

SpringBoot3+Vue3酒店管理系统开发指南:毕设从骨架搭建到答辩避坑

简介&#xff1a;这套酒店管理系统是一份面向毕业设计与课程设计的完整实战源码&#xff0c;采用 SpringBoot3 与 Vue.js3 搭建前后端分离架构&#xff0c;后端借助 SpringBoot3 简化配置、快速构建 REST 服务&#xff0c;前端通过 Vue.js3 实现组件化页面与响应式交互&#xf…

作者头像 李华
网站建设 2026/9/26 19:57:43

红帽领航企业级开源:RHEL、OpenShift与Ansible实战解析

都说红帽是企业级开源里的“风向标”&#xff0c;我在基础架构这行干了十多年&#xff0c;从物理服务器的RHEL装到容器平台上的OpenShift&#xff0c;再从几百台机器的Ansible自动化到日常的补丁与合规审计&#xff0c;Red Hat几乎是绕着整个工作流出现在我身边的。很多朋友一听…

作者头像 李华
网站建设 2026/9/26 19:53:05

Web视频使用完整链路:采集播放录制与浏览器兼容实战

先快速说明一下。“video-use”这个名字听起来很泛&#xff0c;好像什么都能往里装。我一开始接触的时候&#xff0c;以为是某个视频播放器的项目&#xff0c;后来真正上手才发现&#xff0c;这名字对应的是一整套“视频怎么进项目、怎么被处理、怎么最终呈现出来”的完整链路。…

作者头像 李华