当前位置: 首页 > news >正文

0802api设计和实战-网络ajax请求1-react-仿低代码平台项目

文章目录

    • 1 API设计
      • 1.1 用户功能
        • 1.1.1 获取用户信息
        • 1.1.2 注册
        • 1.1.3 登录
      • 1.2 问卷功能
        • 1.2.1 获取单个问卷
        • 1.2.2 获取问卷列表
        • 1.2.3 创建问卷
        • 1.2.4 更新问卷
        • 1.2.5 批量彻底删除问卷
        • 1.2.6 复制问卷
      • 1.3 小结
    • 2 实战
      • 2.1配置axios
      • 2.2 封装API和测试
      • 2.3 新建问卷
      • 2.4 自定义hooks封装获取问卷信息
      • 2.5 使用useRequest重构Ajax请求-统一处理
      • 2.6 开发问卷列表
      • 2.7 第三方hook抽离搜索功能
      • 2.8 开发星标和回收站
    • 结语

1 API设计

1.1 用户功能

1.1.1 获取用户信息
  • method: get
  • path: /api/user/info
  • response:
    • 成功:{errno: 0, data{...}}
    • 失败:{errno: 10001, mes: 'xxx'}
1.1.2 注册
  • method: post

  • path: /api/user/register

  • request body: {username, password, nickname}

  • response: {errno: 0}

1.1.3 登录
  • method: post
  • path: /api/user/login
  • request body: {username, password}
  • response: {errno: 0, token}
    • Token令牌:使用jwt

1.2 问卷功能

1.2.1 获取单个问卷
  • method: get
  • path: /api/question/:id
  • response: {errno: 0, data: {id, title,...}}
1.2.2 获取问卷列表
  • method: get
  • path: /api/question/
  • response: {errno: 0, data:{list:[{...}}
1.2.3 创建问卷
  • method: post
  • path: /api/question
  • request body: 暂无
  • response: {errno: 0, data: {id}}
1.2.4 更新问卷
  • method: patch
  • path: /api/question/:id
  • response: {errno: 0}

tips:删除是“假删除”,实际 是更新isDeleted属性

1.2.5 批量彻底删除问卷
  • method: delete
  • path: /api/question
  • request body: {ids: [...]}
  • response: {errno: 0}
1.2.6 复制问卷
  • method: post
  • path: `/api/question/duplicate/:id``
  • response: {errno: 0, data: {id}}

1.3 小结

  • 使用Restful API
  • 用户验证使用JWT
  • 统一返回格式:{errno, data, msg}

2 实战

2.1配置axios

src/services/request.ts基础代码如下:

import axios from "axios";const request = axios.create({timeout: 5000,
});export default request;

添加返回类型和统一错误出来,request.ts代码如下:

import axios from "axios";
import { message } from "antd";const request = axios.create({timeout: 5000,
});// response 拦截:统一处理errno和msg
request.interceptors.response.use(res => {const resData = (res.data || {}) as ResTypeconst {errno, data, msg} = resDataif (errno !== 0) {// 错误提示if (msg) {message.error(msg)}throw new Error(msg);}return data as any}
)
export default request;export type ResDataType = {[key: string]: any;
};export type ResType = {errno: number;data?: ResDataType;msg?: string;
};

2.2 封装API和测试

获取问卷信息API,src/api/question.ts代码如下:

import request, { ResDataType } from "../services/request";export async function getQuestionApi(id: string): Promise<ResDataType> {const url = `/api/question/${id}`;const data = (await request.get(url)) as ResDataType;return data;
}

src/pages/quesiton/Edit/index.tsx代码如下:

import { FC, useEffect} from "react";
import { useParams } from "react-router-dom";
import { getQuestionApi } from "@/api/question";const Edit: FC = () => {const { id = "" } = useParams();// 获取问卷信息useEffect(()=> {async function fn() {const resData = await getQuestionApi(id)console.log(resData);}fn()}, [])return <div>Edit {id}</div>;
};export default Edit;

测试结果如下图所示:在这里插入图片描述

2.3 新建问卷

封装新建问卷API,question.ts代码如下:

import request, { ResDataType } from "../services/request";.../*** 新建问卷* @returns 问卷id*/
export async function createQuestionApi() {const url = `/api/question`;const data = (await request.post(url)) as ResDataType;return data;
}

ManageLayout.tsx中调用新建问卷,src/layouts/MangeLayout.tsx代码如下:

import { FC, useState } from "react";
import { Outlet, useNavigate, useLocation } from "react-router-dom";
import {PlusOutlined,BarsOutlined,StarOutlined,DeleteOutlined,
} from "@ant-design/icons";
import { Button, Space, Divider, message } from "antd";import { createQuestionApi } from "@/api/question";
import styles from "./ManageLayout.module.scss";const ManageLayout: FC = () => {const nav = useNavigate();const { pathname } = useLocation();const [loading, setLoading] = useState(false)// 点击创建问卷async function handleCreateClick() {setLoading(true)const data = await  createQuestionApi()const {id} = data || {}if (id) {nav(`/question/edit/${id}`)message.success("创建成功")}setLoading(false)}return (<div className={styles.container}><div className={styles.left}><Space direction="vertical"><Buttontype="primary"size="large"icon={<PlusOutlined />}onClick={handleCreateClick}disabled={loading}>新建问卷</Button>...);
};export default ManageLayout;

tips:接口请求有延迟,防止用户连续点击按钮,触发重复操作,这里添加loading控制按钮,后续可以用封装好的“防抖”操作替换。

2.4 自定义hooks封装获取问卷信息

在编辑页和统计页都需要获取带加载状态的问卷信息,这里我们通过自定义hooks抽取公共部分,src/hooks/useLoadQuestionData.ts代码如下:

import { useEffect, useState } from "react";
import { useParams } from "react-router-dom";import { getQuestionApi } from "@/api/question";/*** 获取带加载状态的问卷信息* @returns loading状态,问卷信息*/
function useLoadQuestionData() {const { id = "" } = useParams();const [loading, setLoading] = useState(true);const [questionData, setQuestionData] = useState({});useEffect(() => {async function fn() {const data = await getQuestionApi(id);setQuestionData(data);setLoading(false);}fn();}, []);return { loading, questionData };
}export default useLoadQuestionData;

编辑页src/pages/question/Edit/index.tsx代码改造如下:

import { FC } from "react";
import useLoadQuestionData from "@/hooks/useLoadQuestionData";const Edit: FC = () => {// 获取问卷信息const { loading, questionData } = useLoadQuestionData();return (<div><p>Edit page</p><div>{loading ? <p>loading</p> : <p>{JSON.stringify(questionData)}</p>}</div></div>);
};export default Edit;

2.5 使用useRequest重构Ajax请求-统一处理

第三方ahooks-useRequst 当前功能有:

  • 自动/手动请求
  • 轮询
  • 防抖
  • 节流
  • 窗口聚焦刷新
  • 错误重试
  • 加载延迟
  • SWR(stale-while-revalidate)
  • 缓存

由于接口请求,每次都需要定义loading,data,使用useEffect执行函数,很繁琐,这里我们使用第三方ahooks提供的useRequest简化。

改造自定义hook-useLoadQuestionData,useLoadQuestionData.ts代码如下:

import { useParams } from "react-router-dom";
import { useRequest } from "ahooks";
import { getQuestionApi } from "@/api/question";/*** 获取带加载状态的问卷信息* @returns loading状态,问卷信息*/
function useLoadQuestionData() {const { id = "" } = useParams();async function load() {const data = await getQuestionApi(id);return data;}const { loading, data, error } = useRequest(load);return { loading, data, error };
}export default useLoadQuestionData;

改造创建问卷,ManageLayout.tsx代码如下:

import { FC, useState } from "react";
import { Outlet, useNavigate, useLocation } from "react-router-dom";
import {PlusOutlined,BarsOutlined,StarOutlined,DeleteOutlined,
} from "@ant-design/icons";
import { Button, Space, Divider, message } from "antd";import { createQuestionApi } from "@/api/question";
import styles from "./ManageLayout.module.scss";
import { useRequest } from "ahooks";const ManageLayout: FC = () => {const nav = useNavigate();const { pathname } = useLocation();// 点击创建问卷const {loading,// error,run: handleCreateClick,} = useRequest(createQuestionApi, {manual: true,onSuccess: (res) => {nav(`/question/edit/${res.id}`);message.success("创建成功");},});return (<div className={styles.container}><div className={styles.left}><Space direction="vertical"><Buttontype="primary"size="large"icon={<PlusOutlined />}onClick={handleCreateClick}disabled={loading}>新建问卷</Button>
...
};export default ManageLayout;

2.6 开发问卷列表

获取问卷列表mock接口 getQuestionList.js代码如下:

const Mock = require('mockjs');
const Random = Mock.Random;function getQuestionList(len = 10, isDeleted = false) {const list = [];for (let i = 0; i < len; i++) {list.push({_id: Random.id(),title: Random.ctitle(),isPublished: Random.boolean(),isStar: Random.boolean(),answerCount: Random.natural(50, 100),createdAt: Random.datetime(),isDeleted})}return list;
}module.exports = getQuestionList;

question.js代码如下:

const Mock = require('mockjs')const getQuestionList = require("./data/getQuestionList")const Random = Mock.Randommodule.exports = [
...{// 获取问卷列表url: '/api/question',method: 'get',response() {return {errno: 0,data: {list: getQuestionList(),total: 100}}}},
]

question.ts api代码如下所示:

/*** 获取问卷列表* @returns 问卷列表数据*/
export async function getQuestionListApi() {const url = `/api/question`;const data = (await request.get(url)) as ResDataType;return data;
}

List.tsx调用接口代码如下所示:

import { FC } from "react";
// import { useSearchParams } from "react-router-dom";
import { useRequest, useTitle } from "ahooks";
import { Typography, Spin, Divider } from "antd";import QuestionCard from "@/components/QuestionCard";
import ListSearch from "@/components/ListSearch";
import { getQuestionListApi } from "@/api/question";
import styles from "./common.module.scss";const { Title } = Typography;const List: FC = () => {useTitle("调查问卷-我的问卷");// const [searchParams] = useSearchParams();// console.log("keyword", searchParams.get("keyword"));//问卷列表数据const { data = {}, loading } = useRequest(getQuestionListApi);const { list = [], total = 0 } = data;return (<><div className={styles.header}><div className={styles.left}><Title level={3}>我的问卷</Title></div><div className={styles.right}><ListSearch /></div></div><div className={styles.content}>{loading && (<div style={{ textAlign: "center" }}><Spin /></div>)}{!loading &&list.length > 0 &&list.map((q: any) => {const { _id } = q;return <QuestionCard key={_id} {...q} />;})}</div><div className={styles.footer}>loadingMore 上划加载更多</div></>);
};export default List;

2.7 第三方hook抽离搜索功能

在我的问卷、星标问卷和回收站都有搜索功能,有相同的逻辑,这里我们通过自定义hook抽离公共逻辑。自定义搜索hook-useLoadQuestionListData.ts代码如下所示:

import { useSearchParams } from "react-router-dom";
import { useRequest } from "ahooks";
import { getQuestionListApi } from "@/api/question";import { LIST_SEARCH_PARAM_KEY } from "@/constant";/*** 获取问卷列表* @returns 问卷列表*/
function useLoadQuestionListData() {const [searchParams] = useSearchParams();const keyword = searchParams.get(LIST_SEARCH_PARAM_KEY) || "";async function load() {const data = await getQuestionListApi({ keyword });return data;}const { loading, data, error } = useRequest(load, {refreshDeps: [searchParams],});return { loading, data, error };
}export default useLoadQuestionListData;

getQuestionListApi.ts如下所示:

import request, { ResDataType } from "../services/request";type SearchOption = {keyword: string;
};.../*** 获取问卷列表* @param opt 请求参数* @returns 问卷列表数据*/
export async function getQuestionListApi(opt: Partial<SearchOption>
): Promise<ResDataType> {const url = `/api/question`;const data = (await request.get(url, {params: opt})) as ResDataType;return data;
}

说明

  • refreshDeps: useRequest 刷新依赖项,根据数组里面的变量重新执行useRequest
  • request.get(url, {params: opt})),params axios get请求传递参数,形式:url?a=b&b=1…

2.8 开发星标和回收站

星标问卷查询的数据 isStar=true;回收站查询的问卷列表isDeleted=true,我们需要扩展api接口参数。

useLoadQuestionListData.ts代码改造如下:

import { useSearchParams } from "react-router-dom";
import { useRequest } from "ahooks";
import { getQuestionListApi } from "@/api/question";import { LIST_SEARCH_PARAM_KEY } from "@/constant";type OptionType = {isStar: boolean;isDeleted: boolean;
};/*** 获取问卷列表* @returns 问卷列表*/
function useLoadQuestionListData(opt: Partial<OptionType>) {const { isStar, isDeleted } = opt;const [searchParams] = useSearchParams();const keyword = searchParams.get(LIST_SEARCH_PARAM_KEY) || "";async function load() {const data = await getQuestionListApi({ keyword, isStar, isDeleted });return data;}const { loading, data, error } = useRequest(load, {refreshDeps: [searchParams],});return { loading, data, error };
}export default useLoadQuestionListData;

星标问卷-Star.tsx代码如下所示:

import { FC } from "react";
import { useTitle } from "ahooks";
import { Typography, Empty, Spin } from "antd";import QuestionCard from "@/components/QuestionCard";
import ListSearch from "@/components/ListSearch";
import styles from "./common.module.scss";
import useLoadQuestionListData from "@/hooks/useLoadQuestionListData";const { Title } = Typography;const List: FC = () => {useTitle("调查问卷-星标问卷");//问卷列表数据const { data = {}, loading } = useLoadQuestionListData({ isStar: true });const { list = [], total = 0 } = data;return (<><div className={styles.header}><div className={styles.left}><Title level={3}>星标问卷</Title></div><div className={styles.right}><ListSearch /></div></div><div className={styles.content}>{loading && (<div style={{ textAlign: "center" }}><Spin /></div>)}{!loading && list.length === 0 && <Empty description="暂无数据" />}{!loading &&list.length > 0 &&list.map((q: any) => {const { _id } = q;return <QuestionCard key={_id} {...q} />;})}</div><div className={styles.footer}>分页</div></>);
};export default List;

回收站-Trash.tsx代码如下所示;

import { FC, useState } from "react";
import { useTitle } from "ahooks";
import {Typography,Empty,Table,Tag,Space,Button,Modal,message,Spin,
} from "antd";import { ExclamationCircleOutlined } from "@ant-design/icons";
import ListSearch from "../../components/ListSearch";
import styles from "./common.module.scss";
import useLoadQuestionListData from "@/hooks/useLoadQuestionListData";const { Title } = Typography;
const { confirm } = Modal;const List: FC = () => {useTitle("调查问卷-回收站");//问卷列表数据const { data = {}, loading } = useLoadQuestionListData({ isDeleted: true });const { list = [], total = 0 } = data;const columns = [{title: "标题",dataIndex: "title",},{title: "是否发布",dataIndex: "isPublished",render: (isPublished: boolean) =>isPublished ? <Tag color="processing">已发布</Tag> : <Tag>未发布</Tag>,},{title: "答卷",dataIndex: "answerCount",},{title: "创建时间",dataIndex: "createdAt",},];// 选择ids集合const [selectedIds, setSelectedIds] = useState<string[]>([]);function del() {confirm({title: "您确定要删除吗?",okText: "确定",cancelText: "取消",content: "删除以后不可找回!",icon: <ExclamationCircleOutlined />,onOk: () => message.success("删除成功"),});}const TableEle = (<><div style={{ marginBottom: "10px" }}><Space><Button type="primary" disabled={selectedIds.length === 0}>恢复</Button><Button danger disabled={selectedIds.length === 0} onClick={del}>彻底删除</Button></Space></div><TabledataSource={list}columns={columns}pagination={false}rowKey={(q: any) => q._id}rowSelection={{type: "checkbox",onChange: (selectRowKeys) => {setSelectedIds(selectRowKeys as string[]);},}}></Table></>);return (<><div className={styles.header}><div className={styles.left}><Title level={3}>回收站</Title></div><div className={styles.right}><ListSearch /></div></div><div className={styles.content}>{loading && (<div style={{ textAlign: "center" }}><Spin /></div>)}{!loading && list.length === 0 && <Empty description="暂无数据" />}{TableEle}</div><div className={styles.footer}>分页</div></>);
};export default List;

服务端星标问卷查询返回的isStar=true;回收站返回的isDeleted=true

index.js代码如下所示:

...async function getRes(fn, ctx) {return new Promise(resolve => {setTimeout(() => {const res = fn(ctx)resolve(res)}, 500);})
}// 注册mock路由
mockList.forEach(item => {const {url, method, response} = itemrouter[method](url, async ctx => {const res = await getRes(response, ctx)ctx.body = res})
})...

question.js代码如下:

...{// 获取问卷列表url: '/api/question',method: 'get',response(ctx) {const { url = '' } = ctxconst isStar = url.indexOf('isStar=true') >= 0const isDeleted = url.indexOf('isDeleted=true') >= 0return {errno: 0,data: {list: getQuestionList({isStar, isDeleted}),total: 100}}}},
]

getQuestionList.js如下所示:

const Mock = require('mockjs');
const Random = Mock.Random;function getQuestionList(opt = {}) {const { len = 10, isStar, isDeleted } = optconst list = [];for (let i = 0; i < len; i++) {list.push({_id: Random.id(),title: Random.ctitle(),isPublished: Random.boolean(),isStar: isStar || Random.boolean(),answerCount: Random.natural(50, 100),createdAt: Random.datetime(),isDeleted: isDeleted || Random.boolean()})}return list;
}module.exports = getQuestionList;

说明

  • 数据展示有3种状态:根据不同的状态有不同展示
    • 加载中:
    • 加载完成,数据为空
    • 加载完成,有数据
  • rowKey={(q: any) => q._id}:ts不设置any类型,程序不报错,但是ts检查错误

结语

❓QQ:806797785

⭐️仓库地址:https://gitee.com/gaogzhen

⭐️仓库地址:https://github.com/gaogzhen

[1]ahook官网[CP/OL].

[2]mock文档[CP/OL].

[3]Ant Design官网[CP/OL].

相关文章:

0802api设计和实战-网络ajax请求1-react-仿低代码平台项目

文章目录 1 API设计1.1 用户功能1.1.1 获取用户信息1.1.2 注册1.1.3 登录 1.2 问卷功能1.2.1 获取单个问卷1.2.2 获取问卷列表1.2.3 创建问卷1.2.4 更新问卷1.2.5 批量彻底删除问卷1.2.6 复制问卷 1.3 小结 2 实战2.1配置axios2.2 封装API和测试2.3 新建问卷2.4 自定义hooks封装…...

什么是CAN的非破坏仲裁?

‌CAN总线的非破坏性仲裁‌是一种在多个设备同时发送数据时&#xff0c;通过标识符&#xff08;ID&#xff09;优先级来决定哪个设备可以优先发送数据的机制。其核心思想是&#xff1a;当多个设备同时发送数据时&#xff0c;ID值较小的数据具有更高的优先级&#xff0c;能够优先…...

无线监控系统分类全解析:搭配视频融合平台EasyCVR开启高效监控

随着技术的发展&#xff0c;无线监控系统在家庭、小型企业、特定行业以及室外恶劣环境中的应用越来越广泛。本文将介绍几种常见的无线监控系统&#xff0c;分析其优缺点&#xff0c;并结合EasyCVR视频融合平台的功能&#xff0c;探讨如何优化无线监控系统的性能和应用。 一、主…...

并行RANSAC平面拟合(C++)

依赖库 1&#xff09;Eigen 2&#xff09;GLM 算法大致思路 Step 1&#xff1a;源点云随机采样3个点&#xff1b; Step 2&#xff1a;3个点拟合平面&#xff0c;统计符合该平面模型的点&#xff0c;为inlier点&#xff1b; Step 3&#xff1a;判断inlier点比例是否达到阈…...

Docker核心技术精讲:从入门到企业级实战

&#xfeff;第一章>Docker概述 第二章>Docker安装与镜像下载加速 第三章>镜像 第四章>容器 第五章>发布镜像到阿里云或私有化仓库 第六章>容器卷 第七章>Docker安装常用软件 第八章>Docker高级版-Mysql主从复制、Redis主从、分布式存储 第九章>Doc…...

【KWDB 创作者计划】_深度学习篇---向量指令集

文章目录 前言一、加速原理数据级并行&#xff08;DLP&#xff09;计算密度提升减少指令开销内存带宽优化隐藏内存延迟 二、关键实现技术1. 手动向量化&#xff08;Intrinsics&#xff09;优势挑战 2. 编译器自动向量化限制 3. BLAS/LAPACK库优化4. 框架级优化 三、典型应用场景…...

音视频小白系统入门课-4

本系列笔记为博主学习李超老师课程的课堂笔记&#xff0c;仅供参阅 往期课程笔记传送门&#xff1a; 音视频小白系统入门笔记-0音视频小白系统入门笔记-1音视频小白系统入门笔记-2音视频小白系统入门笔记-3 将mp4文件转换为yuv文件 ffmpeg -i demo.mp4 # 输入文件-an …...

CS144 Lab3 实战记录:TCP 发送器实现

文章目录 1 实验背景与目标2 TCP发送器的实现2.1 整体流程2.2 核心组件2.3 窗口管理2.4 关键函数实现2.4.1 push函数2.4.2 receive函数2.4.3 tick函数 3 仓库地址 1 实验背景与目标 在 TCP 协议中&#xff0c;发送器&#xff08;TCP Sender&#xff09;是实现可靠传输的核心组…...

Transformer:引领深度学习新时代的架构

引言 在深度学习的快速发展历程中&#xff0c;Transformer 架构如同璀璨的新星&#xff0c;照亮了自然语言处理&#xff08;NLP&#xff09;以及计算机视觉&#xff08;CV&#xff09;等众多领域的前行道路。自 2017 年在论文《Attention Is All You Need》中被提出以来&#…...

基于RabbitMQ实现订单超时自动处理

基于RabbitMQ实现订单超时自动处理 引言 在现代电商系统中&#xff0c;订单超时自动取消是一个常见的业务需求。传统的定时任务扫描数据库的方式存在性能瓶颈和实时性差的问题。本文将介绍如何使用RabbitMQ的消息队列和死信队列特性&#xff0c;构建一个高效可靠的订单超时自…...

nginx实现同一个端口监听多个服务

nginx实现同一个端口监听多个服务 前言原理配置不同域名基于路径&#xff08;URL 路由&#xff09;​补充 总之完结撒花&#xff0c;如有需要收藏的看官&#xff0c;顺便也用发财的小手点点赞哈&#xff0c;如有错漏&#xff0c;也欢迎各位在评论区评论&#xff01; 前言 受同…...

用 Firebase 和 WebRTC 快速搭建一款浏览器视频聊天应用

在现代 Web 应用中&#xff0c;实时音视频通信变得越来越普遍。本文将通过一个简洁实用的示例&#xff0c;带你一步步搭建一个基于 Firebase WebRTC 的浏览器视频聊天应用&#xff0c;帮助你理解 WebRTC 的核心通信机制以及如何借助 Firebase 进行信令传输。 &#x1f527; 技…...

记录一次OGG进程abended,报错OGG-01431、OGG-01003、OGG-01151、OGG-01296问题的处理

1. ogg进程abended的几种常见原因&#xff1a; 1. undo表空间不足导致abended。 2. 数据不一致&#xff0c;违反唯一约束导致abended。 3. 源端和目标端表结构不一致导致abended。 4. 源端表名过长&#xff0c;同步到目标端报错导致abended。 5. OGG-03517字符集转换问题导…...

机器学习分类算法详解:原理、应用场景与测试用例

机器学习分类算法详解:原理、应用场景与测试用例 一、基础分类算法 1. 决策树 原理: 通过递归划分数据集,选择信息增益(ID3)或基尼系数(CART)最大的特征作为分裂节点,构建树结构。叶节点代表分类结果。应用场景: 医疗诊断(需解释性,如判断疾病风险)。客户分群(如根…...

机器人仿真:相机信息仿真及显示

1)概要 除了激光雷达以外,机器人常用的视觉传感器还包括相机,相机图像能够获取真实世界的真实颜色和纹理信息,能够被用于进行目标检测、分割和追踪。 2)结果展示...

车载功能测试-车载域控/BCM控制器测试用例开发流程【用例导出方法+优先级划分原则】

目录 1 摘要2 位置灯手动控制简述2.1 位置灯手动控制需求简述2.2 位置灯手动控制逻辑交互图 3 用例导出方法以及优先级原则3.1 用例导出方法3.1.1 用例导出方法介绍3.1.2 用例导出方法关键差异分析 3.2 优先级规则3.2.1 优先级划分的核心原则3.2.2 具体等级定义与判定标准 3.3 …...

gem5-gpu教程05 内存建模

memory-modeling|Details on how memory is modeled in gem5-gpu ====== gem5-gpu’s Memory Simulation ====== gem5-gpu, for the most part, eschews GPGPU-Sim’s separate functional simulation and instead uses gem5’s execute-in-execute model. Therefore, memory …...

如何提升个人解决问题的能力?

提升个人解决问题的能力是一个系统性工程&#xff0c;涉及思维、知识、经验和心态的多方面提升。以下是一些具体且可操作的方法&#xff0c;帮助你逐步增强解决问题的能力&#xff1a; 1. 培养「结构化思维」 明确问题本质&#xff1a; 遇到问题时&#xff0c;先问自己&…...

CSS清楚默认样式

* {margin: 0;padding: 0;box-sizing: border-box;} 这段 CSS 代码是一个常见的全局样式重置代码块&#xff0c;它会对网页中的所有元素&#xff08;通过通配符 * 选择器&#xff09;应用相同的样式规则&#xff0c;下面分别解释每一条规则的作用。 margin: 0; 在 HTML 中&a…...

问题:raw.githubusercontent无法访问

问题&#xff1a;raw.githubusercontent无法访问 文章目录 一、问题二、hosts文件2.1、hosts文件简介2.2、hosts文件位置2.3、hosts文件修改 3、解决方法3.1、查询出raw.githubusercontent.com的ip地址3.2、在/etc/hosts里填写IP地址3.3、再次执行命令 4、一些常用IP地址 一、问…...

【C语言】文本操作函数fgetc、fputc、fgets、fputs、fprintf、fscanf、fread、fwrite

一、介绍 二、简要概括 三、函数的使用 1、fgetc和fputc int fgetc ( FILE * stream ); 从文件中读取信息&#xff0c;每次读取一个字符 从流中获取字符返回指定流的内部文件位置指示符当前指向的字符。然后将内部文件位置指示符推进到下一个字符 int main() {//打开文件FI…...

(19)VTK C++开发示例 --- 分隔文本读取器

文章目录 1. 概述2. CMake链接VTK3. main.cpp文件4. 演示效果 更多精彩内容&#x1f449;内容导航 &#x1f448;&#x1f449;VTK开发 &#x1f448; 1. 概述 本例采用坐标和法线&#xff08;x y z nx ny nz&#xff09;的纯文本文件&#xff0c;并将它们读入vtkPolyData并显示…...

C++ 中 std::thread 的高级应用

C 中 std::thread 的高级应用、常见坑&#xff0c;以及如何封装为类&#xff0c;适合做线程池、异步任务、后台 worker、并发调度等场景。内容结构如下&#xff1a; 一、std::thread 高级用法清单 1. 线程成员函数调用&#xff08;this 捕获&#xff09; class Worker { publ…...

Linux之彻底掌握防火墙-----安全管理详解

—— 小 峰 编 程 目录&#xff1a; 一、防火墙作用 二、防火墙分类 1、逻辑上划分&#xff1a;大体分为 主机防火墙 和 网络防火墙 2、物理上划分&#xff1a; 硬件防火墙 和 软件防火墙 三、硬件防火墙 四、软件防火墙 五、iptables 1、iptables的介绍 2、netfilter/…...

Linux安装ffmpeg7.1操作说明

安装yasm Index of /projects/yasm/releases/ 下载最新版 wget https://www.tortall.net/projects/yasm/releases/yasm-1.3.0.tar.gz 解压 tar -zxvf yasm-1.3.0.tar.gz 编译及安装 ./configure make && make install 安装ffmpeg https://download.csdn.net/down…...

Java 加密与解密:从算法到应用的全面解析

Java 加密与解密&#xff1a;从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代&#xff0c;数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段&#xff0c;被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文&#xff0c;使得…...

海思SDK的sensor驱动框架

对于海思的SDK之前一直对驱动的框架不清楚&#xff0c;只知道mpp的目录下的一些简单的业务demo&#xff0c;归根结底对这个SDK的框架还是不够了解&#xff0c;研究了一段时间才对该框架有一点认识。SDK是通过Makefile来管理和编译的所以对于Makefile文件需要有一定的理解&#…...

MyBatis-Plus 使用 Wrapper 构建动态 SQL 有哪些优劣势?

MyBatis-Plus (MP) 提供的 Wrapper (如 QueryWrapper, LambdaQueryWrapper, UpdateWrapper, LambdaUpdateWrapper) 是其核心特性之一&#xff0c;它允许我们在开发时以面向对象的方式构建 SQL 的 WHERE 条件、ORDER BY、SELECT 字段列表等部分。与传统的 MyBatis 在 XML 文件中…...

【PGCCC】Postgres 故障排除:修复重复的主键行

如何从表中删除不需要的重复行。这些重复行之所以“不需要”&#xff0c;是因为同一个值在指定为主键的列中出现多次。自从 glibc 好心地改变了排序方式后&#xff0c;我们发现这个问题有所增加。当用户升级操作系统并修改底层 glibc 库时&#xff0c;这可能会导致无效索引。 唯…...

Java多线程的暗号密码:5分钟掌握wait/notify

wait和join的区别 wait和join在使用上都是等待。 但是join是等待其他线程结束&#xff0c;而wait是等待其他线程的notify通知再运行。 当拿到锁的线程&#xff0c;发现要执行的任务时机不成熟的时候&#xff0c;使用wait进行阻塞等待&#xff0c;然后等时机成熟了再notify通…...

【重学Android】03.高版本 Android Studio 不能使用引用库资源ID的问题

问题背景 由于直接下载的最新版本Android Studio&#xff0c;然后直接创建的新项目&#xff0c;因此默认的工程配置相比以前的老版本有了不少的变化&#xff0c;Gradle的新版本使用&#xff0c;导致一些配置项也发生了变化&#xff0c;加上谷歌针对gradle.properties文件的一些…...

8. kubernetes的service原理

Kubernetes 的 Service 是集群内部和外部访问 Pod 的核心抽象层&#xff0c;解决了 Pod 动态 IP 变化及负载均衡问题。以下是其核心概念、原理及使用方法&#xff1a; 一、Service 的核心概念 概念说明服务发现通过标签选择器&#xff08;selector&#xff09;动态关联一组 Po…...

杭电oj(1087、1203、1003)题解

DP 即动态规划&#xff08;Dynamic Programming&#xff09;&#xff0c;是一种通过把原问题分解为相对简单的子问题&#xff0c;并保存子问题的解来避免重复计算&#xff0c;从而解决复杂问题的算法策略。以下从几个方面简述动态规划&#xff1a; 基本思想 动态规划的核心在…...

解锁安防新境界:XS9933四通道多合一同轴高清解码芯片方案

在安防监控领域&#xff0c;高清、高效、便捷一直是行业追求的目标。今天&#xff0c;我们要为大家介绍一款具有突破性的产品——XS9933四通道多合一同轴高清解码芯片方案&#xff0c;它将为安防监控带来全新的体验。 一、强大性能&#xff0c;高清呈现 XS9933是一款4通道模拟复…...

Mysql之存储过程

&#x1f3dd;️专栏&#xff1a;Mysql_猫咪-9527的博客-CSDN博客 &#x1f305;主页&#xff1a;猫咪-9527-CSDN博客 “欲穷千里目&#xff0c;更上一层楼。会当凌绝顶&#xff0c;一览众山小。 目录 1.存储过程概述 2.存储过程的基本语法 2.1创建存储过程 2.2调用存储过…...

2.第二章:政策法规与标准体系

文章目录 2.1 全球数据治理政策概览2.1.1 欧盟GDPR2.1.2 美国数据法规2.1.3 亚太地区数据法规 2.2 国际标准体系2.2.1 ISO/IEC 270012.2.2 NIST框架2.2.3 DAMA DMBOK2.2.4 其他国际标准 2.3 中国数据治理法规体系2.3.1 《网络安全法》2.3.2 《数据安全法》2.3.3 《个人信息保护…...

Kubernetes (k8s) 日常运维命令总结

一、资源查看 查看所有命名空间的 Pod kubectl get pod --all-namespaces查看指定命名空间的 Pod kubectl get pod --namespace <命名空间>查看所有部署&#xff08;Deployments&#xff09; kubectl get deployments.apps --all-namespaces查看所有守护进程集&#xff0…...

NLP高频面试题(五十三)——LLM中激活函数详解

引言 在现代大型语言模型架构中,激活函数是贯穿神经网络各层的关键组件。它们通过为线性变换结果引入非线性,从而赋予模型表达复杂语言模式的能力。选择合适的激活函数,不仅影响训练的稳定性与收敛速度,还在推理阶段决定了计算效率与模型性能。本文将系统梳理常见激活函数…...

跨平台软件开发探讨

一、跨平台开发核心思路 1. 代码复用最大化 通过抽象平台差异实现核心逻辑复用&#xff0c;理想情况下70%代码可复用&#xff0c;仅30%处理平台特性。 2. 分层架构设计 业务逻辑层&#xff1a;完全平台无关&#xff08;C/Rust&#xff09; 平台适配层&#xff1a;封装系统AP…...

网络原理————HTTP

1&#xff0c;HTTP简介 我们上一期谈到了网络编程尤其是TCP和UDP&#xff0c;使用网络套接字来实现网络编程&#xff0c;上一期忘记说了&#xff0c;我们使用TCP的时候&#xff0c;我们用了线程池&#xff0c;这样就可以处理很多客户端而不会阻塞&#xff0c;那么如果客户端一…...

安装Jupyter Notebook 之不断报错 差点放弃版

error: subprocess-exited-with-error Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [6 lines of output] Cargo, the Rust package manager, is not installed or is not on PATH. This package requires Rust and Cargo to com…...

w~大模型~合集13

我自己的原文哦~ https://blog.51cto.com/whaosoft/13864163 #TextRCNN、TextCNN、RNN 小小搬运工周末也要学习一下~~虽然和世界没关 但还是地铁上看书吧, 大老勿怪 今天来说一下 文本分类必备经典模型 模型 SOTA&#xff01;模型资源站收录情况 模型来源论文 RAE ​…...

【华为】防火墙双击热备-之-主备模式-单外网线路

FW1和FW2的业务接口都工作在三层&#xff0c;上行连接二层交换机。上行交换机连接运营商的接入点&#xff0c;运营商为企业分配的IP地址为100.100.100.2。现在希望FW1和FW2以主备备份方式工作。正常情况下&#xff0c;流量通过FW1转发&#xff1b;当FW1出现故障时&#xff0c;流…...

学习记录:DAY16

Maven 进阶与前端实战 前言 二轮考核的内容下来了&#xff0c;由整体项目构建转为实现特定模块的功能。对细节的要求更高了&#xff0c;而且有手搓线程池、手搓依赖注入等进阶要求&#xff0c;又有得学力。嘻嘻&#xff0c;太简单了&#xff0c;只要我手搓 Spring Boot 框架……...

基于 Spring Boot 瑞吉外卖系统开发(六)

基于 Spring Boot 瑞吉外卖系统开发&#xff08;六&#xff09; 菜品列表 在系统管理端首页&#xff0c;单击左侧菜单栏中的“菜品管理”&#xff0c;会在右侧打开菜品管理页面。 请求URL/dish/page&#xff0c;请求方法GET,请求参数page&#xff0c;pageSize。 该菜品列表…...

香港服务器租用需要哪些性能要求

在如今数字化的时代&#xff0c;租用香港服务器成为了许多企业和个人的选择。但你知道租用香港服务器需要哪些性能要求吗&#xff1f;香港服务器租用需满足硬件性能、网络质量、安全合规、扩展能力四大核心要求&#xff0c;旨在支撑业务高并发、低延迟、稳定安全的运行环境。其…...

LLama Factory从入门到放弃

目录 简介 安装 LLama Factory界面介绍 数据格式要求 微调训练 今天在这里介绍一种常用的大模型微调框架——LLama Factory。 简介 LLama Factory 是一个高效的界面化大语言模型微调工具库&#xff0c;支持多种参数高效微调技术&#xff0c;提供简洁接口和丰富示例&#…...

钧瓷产业原始创新的许昌共识:技术破壁·产业再造·生态重构(一)

大禹智库 第 9期〔总第463期〕2025-4-23 钧瓷产业许昌共识&#xff1a;技术破壁产业再造生态重构&#xff08;一&#xff09; ——基于钧瓷产业一体化与数字化原始创新的双轮驱动实践 在当今快速发展的科技领域&#xff0c;创新已成为推动进步的核心动力&#xff0c;企业生存和…...

思科路由器密码绕过+重置

思科路由器密码忘记&#xff0c;重新设置密码不重置配置 1、路由器在初始化过程中会询问是否进行初始化配置&#xff0c;输入no&#xff0c;将直接进入路由器&#xff0c;不会出现用户设置、密码设置等操作。 Would you like to enter the initial configuration dialog? [ye…...

OpenCV 图形API(52)颜色空间转换-----将 NV12 格式的图像数据转换为 RGB 格式的图像

操作系统&#xff1a;ubuntu22.04 OpenCV版本&#xff1a;OpenCV4.9 IDE:Visual Studio Code 编程语言&#xff1a;C11 算法描述 将图像从 NV12 (YUV420p) 色彩空间转换为 RGB。该函数将输入图像从 NV12 色彩空间转换到 RGB。Y、U 和 V 通道值的常规范围是 0 到 255。 输出图…...