【工程化】如何搭建一个项目的网络请求

前端工程化详解——理解与实践前端工程化 前端工程化一直是一个老生常谈的问题,不管是面试还是我们在公司做基建都会经常提到前端工程化,那么为什么经常会说到前端工程化,并没有听过后端工程化、Java工程化或者Python工程化呢?我们理解的前端工程化是不是一直都是Webpack的性能调优,或者是一个cli工具呢?今天我们带着问题来一起寻找一下答案吧! 阅读详情

如何搭建一个项目的网络请求

1.基础请求类 baseRequest

在 baseRequest.js 文件中,我们通常会使用class语法糖,构建一个请求类,对axios进行二次封装。

如下:

import axios from "axios";
import router from "@/router/index";
import useStore from "../store/index"

export default class FactoryRequest {
    // 构造函数
    constructor(baseURL = "/", requestInterCeptors) {
        // 设定请求类的基础信息,同时提供一个让用户自定义请求拦截器的接口
        this.baseURL = baseURL;
        this.instance = null;
        this.requestInterCeptors = requestInterCeptors;
        // 执行初始化函数
        this.init();
    }
    // 获取请求类中axois实例的方法
    get value() {
        return this.instance;
    }
    ...
}

然后,配置请求类的初始化函数init()

init() {
    // 首先创建axios实例
    this.instance = axios.create({
        // 请求超时时间
        timeout: 5 * 1000,
        // `baseURL` 将自动加在 `url` 前面,除非 `url` 是一个绝对 URL。
        baseUrl: this.baseUrl,
        // `withCredentials` 表示跨域请求时是否需要使用凭证,默认为false
        withCredentials: false,
        // 自定义请求头
        headers: {
            "Cache-Control": "no-cache",
            "Content-Type": "application/json;charset=UTF-8",
        },
    });
    
    // 其次,配置请求拦截器和响应拦截器
    // 请求拦截器
    this.instance.interceptors.request.use(
        // 第一个参数,接收一个函数,用于在发送请求之前进行一些处理
        // config是axios请求的配置信息,其中包括请求头等。
    	(config) => {
            // 如果用户自定义了拦截器,则直接使用即可
            if (this.requestInterCeptors) return this.requestInterCeptors(config);
            // 在请求头中加上token,校验用户权限
            const store = useStore()
            if (store.token){
              config.headers.Authorization = "Bearer " +  store.token;
            }
            return config;
        },
        // 第二个参数,接收一个函数,用于对请求错误进行处理
        // error是错误信息
        (error) => {
            ElMessage.error({
              message: "加载超时",
            });
            return Promise.reject(error);
        },
    );
    // 响应拦截器
    this.instance.interceptors.response.use(
        // 第一个参数,接收一个函数,用于收到响应之后对响应进行一些预处理
        // response是请求返回的响应。
        (response) => {
            if (response.data.code !== 0) {
                  // 响应code不为0,说明出错,首先输出错误信息
                  ElMessage.error(response.data.message);
                  // 判断错误类型,并做出相应的处理
                  if (response.data.code === 401) {
                        ...
                  }
                  ...
                  // 抛出错误信息
                  throw new Error(response.data.message);
            } else {
                  // 此时code为0,说明未出错。
                  try {
                        // 进行一些预处理,例如:输出提示信息、判断响应中的某些特定字段等
                        ...
                  } catch (error) {
                      ...
                  }
            }
            return response;
        },
        // 第二个参数,同样接收一个函数,用于收到响应之后的错误处理
        (error) => {
            if (error && error.response) {
              // 根据前后端约定好的错误码,设定出错文本
              responseTodo(error);
            } else {
              // 超时出错处理
              if (error.message.includes("timeout")) {
                ElMessage.error("服务器响应超时,请刷新当前页");
              }
              error.message = "连接服务器失败";
            }
            ElMessage.error(error.message);
            throw new Error(response.data.message);
        }
    )
}

可以注意到,上面的代码中提到了,需要根据前后端约定的错误码,设定出错文本。这里的错误码,是需要在编写之前与后端去确认的!

这里可以给出一个范例:

responseTodo(error) {
    const backtrack = {
      400: () => {
        error.message = "错误请求";
      },
      401: () => {
        error.message = "未授权,请重新登录";
      },
      403: () => {
        error.message = "拒绝访问";
      },
      404: () => {
        error.message = "请求错误,未找到该资源";
      },
      405: () => {
        error.message = "请求方法未允许";
      },
      408: () => {
        error.message = "请求超时";
      },
      500: () => {
        error.message = "服务器端出错";
      },
      501: () => {
        error.message = "网络未实现";
      },
      502: () => {
        error.message = "网络错误";
      },
      503: () => {
        error.message = "服务不可用";
      },
      504: () => {
        error.message = "网络超时";
      },
      505: () => {
        error.message = "http版本不支持该请求";
      },
    };
    backtrack[error.response.status]();
  }

这样,就完成了基础请求类的创建。

但是,这仅仅是一个类,要真正在项目中使用它,我们还需要创建它的实例。因此,创建一个 request.js 文件,在其中创建一个请求类的实例对象Requset,并将其暴露出来,供后续使用。

// Request.js
import FactoryReauest from "./baseRequest";

export const baseRequest = new FactoryRequest(
    import.meta.env.VITE_PROJECT_ENV === "dev" ? "" : import.meta.env.VITE_BASE_API_URL
);

// ⚠️ 本地联调无需传递参数
// export const baseRequest = new FactoryReauest();

接下来,就可以使用这个对象,对基础的get、post请求进行统一封装。

2.封装基础请求函数,对外统一get、post方法

在 api.js 文件中,对具体业务请求函数中所使用的基础请求函数进行封装。

基础请求函数,实际上是指在业务请求函数中,往往不会直接进行用 async/await 语法调用axios的get、post方法,设置相关配置并发送请求这些工作。因为如果这样的话,每一个业务请求函数中,都需要写一次类似的代码,这样会增加工作量,而且代码维护性也会降低。

因此,我们需要单独建立一个文件 api.js ,并在其中统一get、post请求的方法。

下面给出一个实例:

// api.js
// 这里的实例中,使用了Vue3工具库VueUse中提供的 useAxios API
// 其中,useAxios方法会返回多个对象,但是其中常用的只有4个,其它的可以去相关文档了解
/* 
	1.data --- 请求响应的数据对象
	2.execute --- 实际发送请求的函数对象,其中会发送请求,在请求完成后,会更新data对象或error对象
	3.isLoading --- 请求是否在加载中
	4.error --- 请求出错时,execute方法会更新该对象,并将错误信息填入其中
*/
// 接下来,就可以进行请求方法封装了

------
// 首先,从request.js文件中拿到基础请求类的实例Request,并引入useAxios
import { Request } from "./request";
import { useAxios } from "@vueuse/integrations/useAxios";

// 其次,根据当前的开发环境,设置当前的请求前缀
const apiStr = import.meta.env.VITE_PROJECT_ENV === "dev" ? "/api" : "";

// Post请求封装
// 1.普通Post请求
export const commonPost = (path, postData) => {
    // 返回一个Promise对象
    return baseRequest.value.post(apiStr + path, {
        ...postData,
    });
}
// 2.基于useAxios的Post请求
export const upgradedPost = async (path, postData) => {
    // 调用useAxios方法,从返回对象中取出data、execute、isLoading、error4个对象
    const { data, execute, isLoading, error, ...rest } = useAxios(
    	apiStr + path, // 请求路径
        { method: "POST" },	// 请求方式
        Request.value, // 第三个参数,接收一个axios实例,这里我们将之前封装好的请求实例Request传入即可
        { immediate: false }, // 第四个参数,接收一个options对象,其中有一些用于配置axios请求的属性
    );
    
    // 将返回的信息暴露出去
    return {
        data,
        /* 
        	在这里再将useAxios返回的execute方法进行一次封装。
        	提供一个传入数据的接口,并将其与之前的数据postData拼接在一起。
        */
        execute: (data) => execute({data: {...data, ...postData}}),
        isLoading,
        error,
        ...rest,
    };
};

// Get请求封装
// 原理实际上与上面一样,这里就不提供例子了。
...

这样,我们就完成了对项目中get、post请求接口的统一。

这里说明一下为什么对于get、post请求,需要封装两份,即一个普通接口,一个基于useAxios方法的接口。

它们的区别在于:

  • 调用普通的接口实现业务请求函数时,会直接在调用函数的同时发送请求,不会有复杂的逻辑流程,不会传递复杂的参数。因此,较为适合在较为简单的业务需求中使用,例如:列表页的列表数据请求。
  • 而基于基于useAxios方法的接口则不同,调用该接口实现的业务请求函数时,其不会立即发送请求,而是返回一个对象,从中可以获取data、execute、isLoading、error四个对象。而只有执行execute函数时,才会发送请求,并更新data或error对象。因此,在业务模块中,我们可以更加方便的发送请求、读取数据,更加适合复杂的业务场景。

但需要注意一点:用基于useAxios方法的接口实现的业务请求函数,只有在请求成功时,才会更新data对象,请求失败时,会更新error对象,而此时的data对象仍为上一次请求成功后更新的data!

完成以上两步的工作后,项目网络请求的基础就已经成型了,剩下的工作就是:

  1. 编写业务请求函数,并用文件的形式进行管理
  2. 根据业务需求对请求进行进一步的优化

这些内容我们在第三、四部分中继续进行说明。

3.封装业务请求函数,并用文件夹进行统一管理

在实际的项目开发中,我们一般会以文件为单位,将一个业务模块中的所有请求函数写在一个文件中,然后统一将这些文件放在一个指定的文件夹中。(当然,如果项目更为复杂的话,会进一步分层)

因此,结合上面两步的工作,项目的网络请求模块的基本结构就是下面这样:

---http
|
|---baseRequest.js
|---request.js
|---api.js
|---module
|     |---login.js
|     |---user.js
|     |---xxx.js
|     |---...

至于其中的每一个文件的编写,这里给出一个实例:

import { upgradedPost, commonPost } from "../api";

// xx相关接口
// 获取xx细节
export const getDiscount = (postData) => 
commonPost("/lqyp-cms-api/discount/getDiscount", {
    ...postData,
})

// 更新xx
export const updateDiscount = (postData) => 
upgradedPost("/lqyp-cms-api/discount/updateDiscount", {
    ...postData,
})

4.实际开发的最终解决方案

4.1 存在的问题🔍

实际上,在完成第三部分的工作后,项目的网络请求就可以实现了。

但是,在目前前端业务越来越复杂的环境下,网络请求的场景也会更加复杂,例如:

  • 多次请求,每次请求时需要拿上一次请求返回的数据作为本次请求的参数
  • 当某个值发生变化时,需要重新请求
  • 当某个值满足了某个条件时,发送请求
  • 某个请求函数需要进行防抖
  • …

对于上述业务场景,如果使用简单的链式调用,即:

getData({...data},{...info}).then((res) => {
	// ...
}).catch((error) => {
    // ...
})

这样在整个业务模块中会有大量重复代码,代码可维护性大大降低!

而使用更为优雅的async/await方式,似乎能够解决上述问题:

  • async/await方式拿响应数据很方便✅
  • 第二个则可以将该值放入watch中进行监听,值发生变化时执行请求函数即可✅
  • 第三个场景,可以在请求函数中加入条件判断✅
  • 单独配置一个防抖函数,在请求函数中调用即可✅
  • …

似乎都可以解决,但实际上,在一个业务模块中,会存在很多组件,其中都会有多个有相同或不同需求的请求,此时如果对每一个请求函数均进行以上操作,会导致大量的代码重复!

而第三部分中使用的 useAxios 并不支持这些功能,所以,单纯的 useAxios 并不能完全适用这些场景!

4.2 如何解决💡

因此,我们需要单独封装一个功能更为全面的 Hook,将请求的依赖、请求的判断条件、执行async/await发送请求的方法等等都封装在一块儿使用,而用户只需要传递业务请求函数,和一个配置项,用于指明需要开启的功能即可。

这里给出一个简单的示例:

 const useRequest = (service,option)=>{
   // service就是传递进来的业务请求函数,option则是用户传递进来指明了功能需求的配置项
   const data = ref()
   
   // 真正发送请求的地方
   const run = async ()=>{
      const res = await service()
      data.value = res
   }
   
   // 是否满足条件
   if(option.ready){
     run()
   }
   // 依赖重新请求
   watch(option.deps,()=>{
     run()
   })
   
   // 仅仅返回准备好的数据,和一个执行函数
   return {
     data,
     run
   }
 }

而在业务模块中

<template>
  <div>读取值:{{ data }}</div>
</template>

<script lang="ts" setup>
import { ref } from 'vue'
import { useRequest } from '..'
// 业务请求函数
import { getXXXData } from '..'
//...业务代码 
    
const { data } = useRequest(
    () => getXXXData(), 
    option: {
      ready: 指明请求是否准备执行的对象
      deps: [请求依赖的其他响应式对象]
    }
)
</script>

在这块业务代码中,用户会直接拿到处理好的请求响应data,它是一个响应式对象,所以业务层省去了一个声明响应式对象来保存数据的代码。

在传入的option中,传入了ready判断条件,业务层又被砍去一个条件判断函数;传入了依赖刷新deps,砍去书写watch的代码,用户只需要关注配置即可

同时,我们会发现它是通过run方法调用触发请求的,那么,我们的防抖、节流函数只需要作用于 run 函数即可,所以这样的做法非常很简洁。

另外,这里的拓展性极强,你可以拓展loading状态、params、error错误信息等出去。因为使用async/await,所以我们封装的业务请求函数只需要返回一个promise对象即可,意味着 axios 和 request 这些都兼容,完全将请求这块的功能性的模块从业务层脱离,用户只需要关注配置和API接口!

4.3 最终的解决方案🎉

但是,这里的工作量是非常大的,我们没有必要一次次地造轮子,而工具库 Vueuse 中也没有很好地实现这些功能的模块,所以,这里我们选择使用一个Vue3的插件 — vue-hook-plus。

因此,我们最终的解决方案如下:

  1. 按照第一部分的方法,二次封装axios,构建基础请求类 baseRequest 和其实例。
  2. 按照第二部分的方法,统一项目中的get、post请求。
  3. 按照第三部分的方法,封装业务请求函数返回Promise对象,并以文件为单位进行管理。
  4. 在业务层,使用请求中间层vue-hook-plus,用户仅需要传递对应的业务请求函数和配置项即可。
补充:vue-hook-plus 文档

VueHook Plus | VueHook Plus (gitee.io)

【Vue教程】使用Vite快速搭建前端工程化项目 Vue3 Vite Node.js 前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,可以使 JavaScript 运行在服务器端。使用 Node.js,可以方便地开发服务器端应用程序,如 Web 应用、API、后端服务,还可以通过 Node.js 构建命令行工具等。 阅读详情

相关推荐

从 0 搭建 Vite 3 + Vue 3 Js版 前端工程化项目

前言之前分享过一篇vue3+ts+vite构建工程化项目的文章,针对小的开发团队追求开发速度,不想使用ts想继续使用js,所以就记录一下从0搭建一个vite+vue3+js的前端项目,做记录分享。Vite 3 - 构建工具Vue 3Vue Router - 官方路由管理器Pinia - Vue Store你也可以选择vuexelement-plus - UI组件库Sass - CSS 预处理器Axios - 一个基于 promise 的网络请求库,可以用于浏览器和 node.js。

csl125的博客 2119

VueUse个人笔记

这个其实就是localStorage或者sessionStorage本身的调用而已,只不过这个更简单,对象也不用转换序列化直接拿就行。可以看到,状态结果都有返回的,如果以后是想做过渡动画或者判断是否还在请求中之类的,可以直接调用这个,判断isLoading就可以。官方说的是,将ref克隆到reactive中,但是ref和reactive的深拷贝好像也是可以的?要根据路由是history还是hash,传对应的值才会显示正确,hash就是有#的那个。可以查看其中是否为处理完成,或者看失败效果都是可以的。

yi742891270的博客 2953

【Vue H5项目实战】从0到1的自助点餐系统—— 搭建脚手架(Vue3.2 + Vite + TS + Vant + Pinia + Node.js)

H5 项目基于 Web 技术,可以在智能手机、平板电脑等移动设备上的浏览器中运行,无需下载和安装任何应用程序,且H5 项目的代码和资源可以集中在服务器端进行管理,只需更新服务器上的代码,即可让所有顾客访问到最新的系统版本。本系列将以肯德基自助点餐页面为模板,搭建一款自助点餐系统,第一次开发移动端h5项目,免不了有所差错和不足,欢迎各位大佬指正。Vue3.2 + Vite + TS + Vant + Pinia + Node.js + MongoDB

白洞,白色的明天在等着我们 6596

使用 vite 构建 vue3 +TS + vant + pinia + axios + ESlint 的H5模板

使用 vite 构建 vue3 +TS + vant + pinia + axios

qq_60990876的博客 7722

Android应用开发实战:身份证与手机号归属地查询系统源码解析

回顾这个“小小”的身份证查询应用,我们走过了环境搭建、UI设计、网络通信、数据解析、异常处理、测试验证等一系列环节。每一个步骤看似独立,实则环环相扣。更重要的是,这些技术选择背后反映的是一种工程思维不是“能不能实现”,而是“如何可持续地实现”。就像一辆车,发动机再强,如果没有良好的悬挂系统、刹车系统和导航系统,也跑不远。软件工程也是如此。优秀的开发者不仅要会写代码,更要懂得如何让代码长期健康地运行下去。

weixin_34268462的博客 413

Qt网络请求工程化封装:构建统一、健壮的HTTP客户端

在软件开发中,网络请求是连接客户端与服务器的核心桥梁,其稳定性和易用性直接影响应用体验。Qt框架提供了基础的QNetworkAccessManager组件,但直接使用往往面临异步回调复杂、错误处理分散、生命周期管理困难等挑战。工程化的HTTP封装通过引入统一入口、标准化请求/响应模型、拦截器机制等设计模式,将底层网络细节抽象为简洁的API,显著提升代码可维护性和开发效率。这种封装尤其适用于需要频繁进行API交互的桌面或嵌入式应用场景,能有效管理请求超时、自动重试等健壮性机制。本文以QHttpRequest为

weixin_42666036的博客 261

基于vueuse -useAxios的二次封装

使用hooks写法,省去日常请求中响应式变量的定义,提高开发效率。

qq_41347620的博客 598

Zotero搭配CNKI.js插件:一键批量下载知网文献的完整教程(附常见问题解决)

本文提供Zotero搭配CNKI.js插件实现知网文献批量下载的完整教程。详细介绍了从环境准备、插件安装到实战操作的全流程,并针对常见问题提供解决方案,旨在帮助科研人员高效构建自动化文献管理工作流,显著提升文献收集与整理效率。

e4f5g6h7的博客 1201

【无标题】

项目

m0_69759037的博客 384

计算机毕业设计springboot基于微信平台的二次元手办商场小程序【附源码】

选题背景: 随着二次元文化的兴起和普及,越来越多的人开始对二次元角色产生了浓厚的兴趣和喜爱。手办作为二次元文化的重要载体之一,成为了许多二次元爱好者收藏和展示的对象。然而,在传统的线下手办商场中,消费者往往面临着时间、空间和选择的限制。因此,基于微信平台的二次元手办商场小程序应运而生。 选题意义: 首先,基于微信平台的二次元手办商场小程序能够打破地域限制,使得用户可以随时随地通过手机进行购物。无论是在家中、上班途中还是旅行中,用户都能够方便地浏览和购买自己喜欢的手办,极大地提高了购物的便利性和灵活性。

拉期程序 452

【教程】BM1684X-32边缘计算盒子 网络配置教程

BM1684X边缘计算盒子网络配置教程

ShiMetaPi的博客 714

02-Vue使用axios( Vue 全家桶02)

axios特点支持客户端发送Ajax请求支持服务端Node.js发送请求支持Promise相关用法支持请求和响应的拦截器功能自动转换JSON数据axios 底层还是原生js实现, 内部通过Promise封装的。

m0_70847086的博客 1177

Simulink模块库介绍(一)——信号源模块

Simulink模块库介绍(一)——信号源模块库目录Clock模块Digital Clock模块Band-Limited White Noise模块 目录 simulink模块库中提供了丰富的信号源模块组。逐一介绍,算是对之前做个总结吧 Clock模块 通过时钟模块,输出的时间作为判断呢,如下图,前2s之前为高斯白噪声,后2s为正弦曲线,共计10s。 Digital Clock模块 数字时钟模块主要用于离散系统的计时,sample time表示采用时间,如下图:分别是1s和0.5s的采样时间 Band-

5万+

打造工程化Vue项目

在Vue项目开发中,使用脚手架工具(create - vue)是极为必要的。手动搭建项目不仅耗时费力,还容易出现配置错误,比如在处理各种依赖关系和项目基础结构搭建上,往往需要花费大量时间去摸索。而create - vue脚手架工具能够快速且规范地帮我们构建项目基础,大大提高开发效率。创建命令中,是固定格式,@3.3.4表示指定的脚手架版本号。指定版本号对于项目的稳定性和兼容性至关重要。特定版本经过了一定的测试和优化,能确保项目在开发过程中较少出现因版本变动带来的不兼容问题。

2401_86968005的博客 973

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO

激光SLAM总结——Fast LIO / Fast LIO2 / Faster LIO 在之前的工作中有接触过LOAM,最近在工作中又接触到Faster LIO相关的工作,于是想着对Fast LIO / Fast LIO2 / Faster LIO这一系列工作进行一个简单的总结,以加深自己对激光SLAM算法的理解,之前总结过的一些和激光SLAM算法相关的博客还有,感兴趣的同学可以一起学习讨论: 激光SLAM总结——VLOAM / LIMO算法解析 激光SLAM总结——LIO-Mapping / LIOM /

weixin_44580210的博客 1万+

【反蒸馏实战 00】AI抢不走的工作:一份针对30个“高危”职位的“反取代”实战手册(反蒸馏计划启动)

AI时代职场生存指南:30个技术岗位的“反蒸馏”实战策略 随着AI技术快速发展,职场正面临前所未有的结构性重构。本系列专栏聚焦30个技术岗位,深入分析AI对各职位的影响路径,并提供系统性的"反蒸馏"策略。通过5层分析框架(AI冲击现状、核心价值解构、AI天花板、能力升级路径、人机协作模式),帮助从业者识别可替代任务与核心价值,建立不可替代的专业优势。内容涵盖IT开发、数据分析、产品管理等技术领域,为职场人提供从“被AI替代”到“与AI协同”的转型路线图,守护职业价值。

专注于人工智能、软件开发、工控自动化、工厂数字化及智能化等领域,希望和大家共同进步! 1650

【Vue教程】使用Vite快速搭建前端工程化项目 | Vue3 | Vite | Node.js

前端工程化是使用软件工程的方法来单独解决前端的开发流程中模块化、组件化、规范化、自动化的问题,其主要目的为了提高效率和降低成本。Node.js 是一个基于 Chrome V8 引擎的 JavaScript 运行时环境,可以使 JavaScript 运行在服务器端。使用 Node.js,可以方便地开发服务器端应用程序,如 Web 应用、API、后端服务,还可以通过 Node.js 构建命令行工具等。

神马都会亿点点的毛毛张 2373

在isaacsim仿真系统进行遥操作(设备是quest3):怎么让遥操作设备(quest3)在Isaac sim系统中控制机械臂并把其中的参数传输出来??

我长期专注 Python 爬虫工程化实战,主理专栏 👉 《Python爬虫实战》:从采集策略到反爬对抗,从数据清洗到分布式调度,持续输出可复用的方法论与可落地案例。内容主打一个“能跑、能用、能扩展”,让数据价值真正做到——抓得到、洗得净、用得上。

**My Coding Family** 940

#vue# 【四】 超级详细步骤!vue项目封装网络请求接口思路及方法

#vue# 网络请求之接接口(比较详细) 一. 后端接口文档的解析 二. 接接口之前的准备工作(post) 三. 接接口的工程化封装(拼接域名及地址) 四. 几种接接口的情况 (1)在本页(当前页)数据渲染 (2)不同页(跳转页、仅一页跳转,类似于从首页跳转到其他页)数据渲染 (3)父子组件页面之间的数据渲染 (4)列表页跳转(类似于从文章列表,跳转到具体文章的详情页里)数据渲染 一. 后端接口文档的解析 当我们拿到后端同事的接口以后,要先看一下里面的参数数据,具体每一个位置的解析如下: ...

ZHENGCHUNJUN的博客 2980

ISO 21434汽车网络安全标准深度解读系列(十):标准实施总结与展望

ISO21434标准深度解读系列总结篇系统回顾了汽车网络安全标准的核心内容与实施要点。文章梳理了10篇系列文章的结构体系,提炼出标准的三大核心价值:系统性方法(全生命周期覆盖、多层次管理)、风险导向理念(威胁驱动、动态管理)和供应链协同机制。总结了实施经验中的关键要素,包括高层承诺、专业团队建设,并提出了分阶段实施路径建议。同时分析了当前面临的技术挑战(系统复杂性、新兴技术)和管理挑战(文化转变、资源投入)。最后展望了AI应用、零信任架构等技术发展趋势,以及标准未来的演进方向,为企业实施提供战略与执行层面的

VehSwHwDeveloper的博客 559

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Flutter 工程化搭建指南

本文介绍了Flutter工程化搭建的完整指南,包括项目结构模块化设计、代码规范与静态检查等核心内容。通过清晰的目录结构划分职责,采用单例模式管理网络请求模块,并使用flutter_lints进行代码规范检查。文中提供了详细的代码示例和配置文件,帮助开发者构建可维护、高性能的Flutter应用。

2501_94417424的博客 1118

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

Axios鸿蒙封装:深度解析网络请求工程化

本文详细解析了一个鸿蒙平台上基于Axios封装的HTTP网络请求调试界面,重点从架构设计、状态管理、UI交互等维度展开分析。核心内容包括: 架构分层:采用Service层的静态方法设计,通过懒加载优化首次请求性能,并包含启动日志等调试信息。 状态管理:通过5个@StorageLink变量构建完整的请求生命周期监控,包括连接状态、响应快照、请求计数等关键指标。 UI设计: 状态面板采用三列仪表盘布局,动态数据彩色化显示 操作面板通过三色按钮区分GET/POST/错误场景 拦截器面板可视化请求/响应处理链路 工

2401_88937325的博客 157

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

上一篇: 【JS基础】JS遍历数组或对象的方法
下一篇: 【Vue3基础】组合式API
cannotbecounted
博客等级 码龄7年 101粉丝 59原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值