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

项目制作流程

一、使用 CRA 创建项目

npx create-react-app name

二、按照业务规范整理项目目录 (重点src目录)

三、安装插件

npm install sass -Dnpm install antd --savenpm install react-router-dom

四、配置基础路由 Router

1. 安装路由包 react-router-dom

2. 准备两个基础路由组件 Layout 和 Login

3. 在 router/index.js 文件中引入组件进行路由配置,导出 router 实例

4. 在入口文件中渲染 <RouterProvider />,传入  router 实例

router/index.js

import { createBrowserRouter } from "react-router-dom";// 配置路由实例
const router = createBrowserRouter([{path: "/",element: <Layout />,},{path: "/login",element: <Login />,},
]);export default router;
import { RouterProvider } from "react-router-dom";
import router from "./router";const root = ReactDOM.createRoot(document.getElementById("root"));
root.render(<RouterProvider router={router} />);

五、登录

使用 AntD 现成的组件 创建登录页的内容结构

 主要组件:Card、Form、Input、Button

    <div><Card><img  />{/* 登录表单 */}<Form><Form.Item><Input /></Form.Item> <Form.Item><Input /></Form.Item> </Form></Card></div>

1. 表单校验实现

表单校验可以在提交登录之前,校验用户的输入是否符合预期,如果不符合就阻止提交,显示错误信息

    <Form.Itemlabel="Username"name="username"rules={[{ required: true, message: '请输入用户名!' }]}><Input size="large" placeholder="请输入手机号" /></Form.Item>

 增加失焦时校验

<Form validateTrigger="onBlur">...
</Form>

手机号为有效格式

          <Form.Itemname="mobile"// 多条校验逻辑 先校验第一条 第一条通过之后再校验第二条rules={[{required: true,message: '请输入手机号',},{pattern: /^1[3-9]\d{9}$/,message: '请输入正确的手机号格式'}]}><Input size="large" placeholder="请输入手机号" /></Form.Item>

2. 获取表单数据

当用户输入了正确的表单内容,点击确认按钮时,需要收集用户输入的内容,用来提交接口请求

解决方案:给 Form 组件绑定 onFinish 回调函数,通过回调函数的参数获取用户输入的内容

  const onFinish = async (values) => {console.log(values)}<Form onFinish={onFinish} validateTrigger="onBlur">...<Form.Item><Button type="primary" htmlType="submit" size="large" block>登录</Button></Form.Item></Form>

3. 封装 request 请求模块

 在整个项目中会发送很多网络请求,使用 axios 三方库做好统一封装,方便统一管理和复用

npm i axios

 utils/request.js

// axios的封装处理
import axios from "axios"// 1. 根域名配置
// 2. 超时时间
// 3. 请求拦截器 / 响应拦截器const request = axios.create({baseURL: 'http://geek.itheima.net/v1_0',timeout: 5000
})// 添加请求拦截器
// 在请求发送之前 做拦截 插入一些自定义的配置 [参数的处理]
request.interceptors.request.use((config) => {return config
}, (error) => {return Promise.reject(error)
})// 添加响应拦截器
// 在响应返回到客户端之前 做拦截 重点处理返回的数据
request.interceptors.response.use((response) => {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么return response.data
}, (error) => {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么return Promise.reject(error)
})export { request }

utils/index.js

// 统一中转工具模块函数
// import {request} from '@/utils'import { request } from './request'export {request,
}

4. 使用 redux 管理 token

Token 作为一个用户的标识数据,需要在很多个模块中共享,Redux 可以方便的解决共享问题

(1)redux 中编写获取 Token 的 异步获取和同步修改

(2)Login 组件负责提交 action 并且把表单数据传递过来

npm i react-redux @reduxjs/toolkit

store/modules/user.js

// 和用户相关的状态管理
import { createSlice } from '@reduxjs/toolkit'
import { setToken as _setToken, getToken } from '@/utils'const userStore = createSlice({name: "user",// 数据状态initialState: {token: getToken() || '',},// 同步修改方法reducers: {setToken (state, action) {state.token = action.payload_setToken(action.payload)},}
})// 解构出actionCreater
const { setToken } = userStore.actions// 获取reducer函数
const userReducer = userStore.reducer// 登录获取token异步方法封装
const fetchLogin = (loginForm) => {return async (dispatch) => {// 1. 发送异步请求const res = await request.post('authorizations', loginForm)// 2. 提交同步 action 进行 token 存入dispatch(setToken(res.data.token))}
}export { fetchLogin, setToken }export default userReducer

store/index.js

// 组合redux子模块 + 导出store实例
import { configureStore } from '@reduxjs/toolkit'
import userReducer from './modules/user'export default configureStore({reducer: {user: userReducer}
})

index.js

import { RouterProvider } from 'react-router-dom'
import router from './router'
import { Provider } from 'react-redux'
import store from './store'const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<Provider store={store}><RouterProvider router={router} /></Provider>
)

封装 localStorage - Token 持久化

现存问题:

Redux 存入 Token 之后如果刷新浏览器,Token 会丢失(持久化就是防止刷新时丢失 Token)

问题原因:

Redux 是基于浏览器内存的储存方式,刷新时状态恢复为初始值

utils/token.js

// 封装基于ls存取删三个方法
const TOKENKEY = 'token_key'function setToken (token) {return localStorage.setItem(TOKENKEY, token)
}function getToken () {return localStorage.getItem(TOKENKEY)
}function removeToken () {return localStorage.removeItem(TOKENKEY)
}export {setToken,getToken,removeToken
}

utils/index.js

// 统一中转工具模块函数
// import {request} from '@/utils'import { request } from './request'
import { setToken, getToken, removeToken } from './token'export {request,setToken,getToken,removeToken
}

pages/login/index.js

import { useDispatch } from 'react-redux'
import { fetchLogin } from '@/store/modules/user'
import { useNavigate } from 'react-router-dom'const Login = () => {const dispatch = useDispatch()const navigate = useNavigate()const onFinish = async (values) => {console.log(values)// 触发异步action fetchLoginawait dispatch(fetchLogin(values))// 1. 跳转到首页navigate('/')// 2. 提示一下用户message.success('登录成功')}return (...)
}

5. Axios 请求拦截器注入 Token

Token 作为用户的一个标识数据,后端很多接口都会以它作为接口权限判断的依据;请求拦截器注入 Token 之后,所有用到 Axios 实例的接口请求都自动携带了 Token

utils/request.js

import { getToken } from "./token"// 添加请求拦截器
// 在请求发送之前 做拦截 插入一些自定义的配置 [参数的处理]
request.interceptors.request.use((config) => {// 操作这个config 注入token数据// 1. 获取到token// 2. 按照后端的格式要求做token拼接const token = getToken()if (token) {config.headers.Authorization = `Bearer ${token}`}return config
}, (error) => {return Promise.reject(error)
})

6. 使用 Token 做路由权限控制

有些路由页面的内容信息比较敏感,如果用户没有经过登录获取到有效 Token,是没有权限跳转的,根据 Token 的有无控制当前路由是否可以跳转,就是路由的权限控制

components/AuthRoute.js

// 封装高阶组件
// 核心逻辑: 有token 正常跳转  无token 去登录import { getToken } from '@/utils'
import { Navigate } from 'react-router-dom'export function AuthRoute ({ children }) {const token = getToken()if (token) {return <>{children}</>} else {return <Navigate to={'/login'} replace />}
}

router/index.js

import { createBrowserRouter } from 'react-router-dom'
import { AuthRoute } from '@/components/AuthRoute'// 配置路由实例
const router = createBrowserRouter([{path: "/",element: <AuthRoute> <Layout /></AuthRoute>,},{path: "/login",element: <Login />}
])export default router

六、Layout

1. 样式初始化

样式 reset

npm install normalize.css

index.js

import 'normalize.css'const root = ReactDOM.createRoot(document.getElementById('root'))
root.render(<Provider store={store}><RouterProvider router={router} /></Provider>
)

index.scss

html,
body {margin: 0;height: 100%;
}#root {height: 100%;
}

2.  二级路由配置

(1)准备三个二级路由

(2)router 中通过 children 配置项进行配置

(3)Layout 组件中配置二级路由出口

router/index.js

const router = createBrowserRouter([{path: "/",element: <AuthRoute> <Layout /></AuthRoute>,children: [{index: true,element: <Home />},{path: 'article',element: <Article />},{path: 'publish',element: <Publish />}]},{path: "/login",element: <Login />}
])export default router

pages/Layout/index.js

    <Layout><Header>...</Header><Layout><Sider><Menu></Menu></Sider><Layout style={{ padding: 20 }}>{/* 二级路由的出口 */}<Outlet /></Layout></Layout></Layout>

3. 点击菜单跳转路由

实现效果:点击左侧菜单可以跳转到对应的目标路由

思路分析:

(1)左侧菜单要和路由形成一一对应的关系

(2)点击时拿到路由路径,调用路由方法跳转(跳转到对应的路由下面)

 具体操作:

(1)菜单参数 Item 中 key 属性换成路由的路由地址

(2)点击菜单时通过 key 获取路由地址跳转

 pages/Layout/index.js

const items = [{label: '首页',key: '/',icon: <HomeOutlined />,},{label: '文章管理',key: '/article',icon: <DiffOutlined />,},{label: '创建文章',key: '/publish',icon: <EditOutlined />,},
]const GeekLayout = () => {const navigate = useNavigate()const onMenuClick = (route) => {const path = route.keynavigate(path)}return (<Layout><Header className="header">...</Header><Layout><Sider><Menumode="inline"theme="dark"defaultSelectedKeys={['1']}onClick={onMenuClick}items={items}style={{ height: '100%', borderRight: 0 }}></Menu></Sider><Layout>{/* 二级路由的出口 */}<Outlet /></Layout></Layout></Layout>)
}
export default GeekLayout

4. 根据当前路由路径高亮菜单

 实现效果:页面在刷新时可以根据当前的路由路径让对应的左侧菜单高亮显示

思路分析;

(1)获取当前 url 上的路由路径

(2)找到菜单组件负责高亮的属性,绑定当前的路由路径

  // 反向高亮// 1. 获取当前路由路径const location = useLocation()console.log(location.pathname)const selectedkey = location.pathname<Sider width={200} className="site-layout-background"><Menumode="inline"theme="dark"// 修改selectedKeys={selectedkey}onClick={onMenuClick}items={items}style={{ height: '100%', borderRight: 0 }}></Menu></Sider>

5. 展示个人信息

关键问题:用户信息应该放到哪里维护?

和 Token 令牌类似,用户的信息通常很有可能在多个组件中都需要共享使用,所以同样应该放到Redux 中维护

(1)使用 Redux 进行信息管理

(2)Layout 组件中提交 action

(3)Layout 组件中完成渲染

store/modules/user.js

// 和用户相关的状态管理
import { createSlice } from '@reduxjs/toolkit'
import { setToken as _setToken, getToken, removeToken } from '@/utils'
import { loginAPI, getProfileAPI } from '@/apis/user'const userStore = createSlice({name: "user",// 数据状态initialState: {token: getToken() || '',userInfo: {}},// 同步修改方法reducers: {setToken (state, action) {state.token = action.payload_setToken(action.payload)},setUserInfo (state, action) {state.userInfo = action.payload},}
})// 解构出actionCreater
const { setToken, setUserInfo } = userStore.actions// 获取reducer函数
const userReducer = userStore.reducer// 登录获取token异步方法封装
const fetchLogin = (loginForm) => {return async (dispatch) => {const res = await request.post('/authorizations', loginForm)dispatch(setToken(res.data.token))}
}// 获取个人用户信息异步方法
const fetchUserInfo = () => {return async (dispatch) => {const res = await request.get('/user/profile')dispatch(setUserInfo(res.data))}
}export { fetchLogin, fetchUserInfo }export default userReducer

pages/Layout/index.js

  // 触发个人用户信息actionconst dispatch = useDispatch()useEffect(() => {dispatch(fetchUserInfo())}, [dispatch])const name = useSelector(state => state.user.userInfo.name)<span className="user-name">{name}</span>

6. 退出登录

(1)提示用户是否确认要退出(危险操作,二次确认)

(2)用户确认之后清除用户信息(Token 以及其他个人信息)

(3)跳转到登录页(为下次登录做准备)

pages/Layout/index.js

  // 退出登录确认回调const onConfirm = () => {console.log('确认退出')dispatch(clearUserInfo())navigate('/login')}...<span className="user-logout"><Popconfirm title="是否确认退出?" okText="退出" cancelText="取消" onConfirm={onConfirm}><LogoutOutlined /> 退出</Popconfirm></span>

store/modules/user.js

  // 同步修改方法reducers: {setToken (state, action) {state.token = action.payload_setToken(action.payload)},setUserInfo (state, action) {state.userInfo = action.payload},clearUserInfo (state) {state.token = ''state.userInfo = {}removeToken()}}
})

7. 处理 Token 失效

什么是 Token 失效?

为了用户的安全和隐私考虑,在用户长时间未在网络中做出任何操作规定的失效时间到达之后,当前的 Token 就会失效。一旦失效,不能再作为用户令牌标识请求隐私数据

前端如何知道 Token 已经失效了?

通常在 Token 失效之后再去请求接口,后端会返回401状态码,前端可以监控这个状态,做后续的操作

Token 失效了前端做什么?

(1)在 axios 拦截中监控 401 状态码

(2)清除失效 Token, 跳转登录

utils/request.js

import router from "@/router"// 添加响应拦截器
// 在响应返回到客户端之前 做拦截 重点处理返回的数据
request.interceptors.response.use((response) => {// 2xx 范围内的状态码都会触发该函数。// 对响应数据做点什么return response.data
}, (error) => {// 超出 2xx 范围的状态码都会触发该函数。// 对响应错误做点什么// 监控 401 token失效console.dir(error)if (error.response.status === 401) {removeToken()router.navigate('/login')// 强制刷新window.location.reload()}return Promise.reject(error)
})

七、Home

1. Echarts 基础图表渲染

三方图表插件如何在项目中快速使用起来?

(1)按照图表插件文档中的“快速开始”,快速跑起来 Demo

(2)按照业务需求修改配置项做定制处理

npm install echarts

pages/Home/index.js

// 柱状图组件
import * as echarts from 'echarts'
import { useEffect, useRef } from 'react'const Home = () => {const chartRef = useRef(null)useEffect(() => {// 保证dom可用 才进行图表的渲染// 1. 获取渲染图表的dom节点const chartDom = chartRef.current// 2. 图表初始化生成图表实例对象const myChart = echarts.init(chartDom)// 3. 准备图表参数const option = {title: {text: title},xAxis: {type: 'category',data: ['Vue', 'React', 'Angular']},yAxis: {type: 'value'},series: [{data: [10, 40, 70],type: 'bar'}]}// 4. 使用图表参数完成图表的渲染option && myChart.setOption(option)}, [title])return (<div ref={chartRef} style={{ width: '500px', height: '400px' }}></div>)
}export default Home

2. Echarts 组件封装实现

pages/Home/index.js 

import BarChart from "./components/BarChart"const Home = () => {return (<div><BarChart title={'三大框架满意度'} /><BarChart title={'三大框架使用度'} /></div>)
}export default Home

pages/Home/components/BarCharts.js

// 柱状图组件
import * as echarts from 'echarts'
import { useEffect, useRef } from 'react'
// 1. 把功能代码都放到这个组件中
// 2. 把可变的部分抽象成prop参数const BarChart = ({ title }) => {const chartRef = useRef(null)useEffect(() => {// 保证dom可用 才进行图表的渲染// 1. 获取渲染图表的dom节点const chartDom = chartRef.current// 2. 图表初始化生成图表实例对象const myChart = echarts.init(chartDom)// 3. 准备图表参数const option = {title: {text: title},xAxis: {type: 'category',data: ['Vue', 'React', 'Angular']},yAxis: {type: 'value'},series: [{data: [10, 40, 70],type: 'bar'}]}// 4. 使用图表参数完成图表的渲染option && myChart.setOption(option)}, [title])return <div ref={chartRef} style={{ width: '500px', height: '400px' }}></div>
}export default BarChart

八、拓展 - API 模块封装

现存问题:

当前的接口请求放到了功能实现的位置,没有在固定的模块内维护,后期查找维护困难

解决思路:

把项目中的所有接口按照业务模块以函数的形式统一封装到 apis 模块中

apis/user.js

// 用户相关的所有请求
import { request } from "@/utils"
// 1. 登录请求
export function loginAPI (formData) {return request({url: '/authorizations',method: 'POST',data: formData})
}// 2. 获取用户信息
export function getProfileAPI () {return request({url: '/user/profile',method: 'GET'})
}

store/modules/user.js

import { loginAPI, getProfileAPI } from '@/apis/user'// 登录获取token异步方法封装
const fetchLogin = (loginForm) => {return async (dispatch) => {const res = await loginAPI(loginForm)dispatch(setToken(res.data.token))}
}// 获取个人用户信息异步方法
const fetchUserInfo = () => {return async (dispatch) => {const res = await getProfileAPI()dispatch(setUserInfo(res.data))}
}

九、文章发布

相关文章:

项目制作流程

一、使用 CRA 创建项目 npx create-react-app name 二、按照业务规范整理项目目录 &#xff08;重点src目录&#xff09; 三、安装插件 npm install sass -Dnpm install antd --savenpm install react-router-dom 四、配置基础路由 Router 1. 安装路由包 react-router-dom …...

ctr查看镜像

# 拉取镜像到 k8s.io 命名空间 sudo nerdctl --namespace k8s.io pull nginx:1.23.4 # 验证镜像是否已下载 sudo nerdctl --namespace k8s.io images 下载镜像到k8s.io名称空间下 nerdctl --namespace k8s.io pull zookeeper:3.6.2 sudo ctr image pull --namespace k8s.io …...

【深度学习基础】从感知机到多层神经网络:模型原理、结构与计算过程全解析

【深度学习基础】从感知机到多层神经网络&#xff1a;模型原理、结构与计算过程全解析 1. 引言 神经网络的重要性&#xff1a; 作为人工智能的核心技术之一&#xff0c;神经网络通过模拟人脑神经元的工作机制&#xff0c;成为解决复杂模式识别、预测和决策任务的利器。从图像分…...

discuz X3.5批量新建用户

<?php define(IN_DISCUZ, true); require ./source/class/class_core.php; // 确保管理员权限&#xff08;可选&#xff0c;增加安全性&#xff09;删除这一段加粗则可以直接使用. if ($_G[adminid] ! 1) { exit(Access denied. Only admin allowed.); } C::app()->…...

symfonos: 1靶场

symfonos: 1 来自 <https://www.vulnhub.com/entry/symfonos-1,322/> 1&#xff0c;将两台虚拟机网络连接都改为NAT模式 2&#xff0c;攻击机上做namp局域网扫描发现靶机 nmap -sn 192.168.23.0/24 那么攻击机IP为192.168.23.182&#xff0c;靶场IP192.168.23.252 3&…...

C# String 格式说明符

标准格式说明符数字格式说明符C 或 c&#xff1a;货币格式D 或 d&#xff1a;十进制数字格式E 或 e&#xff1a;科学计数法格式。F 或 f&#xff1a;固定点格式G 或 g&#xff1a;常规格式N 或 n&#xff1a;数字格式P 或 p&#xff1a;百分比格式X 或 x&#xff1a;十六进制格…...

Python高级特性深度解析:从熟练到精通的跃迁之路

Python高级特性深度解析&#xff1a;从熟练到精通的跃迁之路 引言 对于已经掌握Python基础语法的开发者而言&#xff0c;如何突破瓶颈进入高手行列&#xff1f;本文将从Python的高级特性入手&#xff0c;深入剖析那些能让代码更优雅、效率更高的技术点&#xff0c;助你完成从…...

【微信小程序 + 高德地图API 】键入关键字搜索地址,获取经纬度等

前言 又到熟悉的前言&#xff0c;接到个需求&#xff0c;要引入高德地图api&#xff0c;我就记录一下&#xff0c;要是有帮助记得点赞、收藏、关注&#x1f601;。 后续有时间会慢慢完善一些文章&#xff1a;&#xff08;画饼时间&#xff09; map组件自定义气泡、mark标记点…...

贪心、分治和回溯算法

1. 贪心算法 1.1. 贪心算法的概念 定义&#xff1a;在求解过程中&#xff0c;始终做出当前状态下看起来“最优”的选择&#xff0c;不回退。核心思想&#xff1a;每一步都选择当前最优解&#xff0c;期望最后得到全局最优解。 适用问题的特征&#xff1a; 问题可以分解成多个…...

window自带截图快捷键

Win Shift S&#xff1a;按此组合键后&#xff0c;会出现截图模式选择框&#xff0c;可选择矩形截图、任意形状截图、窗口截图和全屏幕截图&#xff0c;然后使用 “Ctrl V” 粘贴截图内容...

简单使用Slidev和PPTist

简单使用Slidev和PPTist 1 简介 前端PPT制作有很多优秀的工具包&#xff0c;例如&#xff1a;Slidev、revealjs、PPTist等&#xff0c;Slidev对Markdown格式支持较好&#xff0c;适合与大模型结合使用&#xff0c;选哟二次封装&#xff1b;revealjs适合做数据切换&#xff0c…...

1.2.2

某智慧养老平台的心率监测模块目前存在数据准确性不高、异常预警响应慢等问题&#xff0c;影响了老年人健康监测的体验和服务质量。作为人工智能训练师&#xff0c;你需要结合业务知识和人工智能技术&#xff0c;对该模块进行优化设计与实现。 &#xff08;1&#xff09;列出心…...

LeeCode 101.对称二叉树

给你一个二叉树的根节点 root &#xff0c; 检查它是否轴对称。 提示&#xff1a; 树中节点数目在范围 [1, 1000] 内-100 < Node.val < 100 进阶&#xff1a;你可以运用递归和迭代两种方法解决这个问题吗&#xff1f; 答案 && 测试代码&#xff1a; #include &…...

面向GIS的Android studio移动开发(二)--在地图上绘制电子围栏

电子围栏&#xff0c;校园跑的常客&#xff0c;也是定位打卡必不可少的东西 主要代码&#xff1a; 创建电子围栏代码 // 添加多边形地理围栏&#xff08;兼容2023版SDK&#xff09;private void addPolygon(String fenceName, List<LatLng> points) {if (points null…...

《从零开始:Spring Cloud Eureka 配置与服务注册全流程》​

关于Eureka的学习&#xff0c;主要学习如何搭建Eureka&#xff0c;将order-service和product-service都注册到Eureka。 1.为什么使用Eureka? 我在实现一个查询订单功能时&#xff0c;希望可以根据订单中productId去获取对应商品的详细信息&#xff0c;但是产品服务和订单服…...

能力验证及大练兵活动第一期

计算机 请根据计算机检材&#xff0c;回答以下问题&#xff1a; (10道题&#xff0c;共19.0分) 1. 计算机中曾挂载的Bitlocker加密分区的恢复密钥后6位为&#xff1f;&#xff08;答案格式&#xff1a;6位数字&#xff09; (1.0分) 答案&#xff1a;700755 2. 请写出曾远程连…...

TASK03【Datawhale 组队学习】搭建向量知识库

文章目录 向量及向量知识库词向量与向量向量数据库 数据处理数据清洗文档分割 搭建并使用向量数据库 向量及向量知识库 词向量与向量 词向量&#xff08;word embedding&#xff09;是一种以单词为单位将每个单词转化为实数向量的技术。词向量背后的主要想理念是相似或相关的…...

ProfibusDP转ModbusRTU的实用攻略

ProfibusDP转ModbusRTU的实用攻略 在工业自动化领域中&#xff0c;Profibus DP和Modbus RTU是两种常见的通信协议。 Profibus DP是一种广泛应用于过程控制和工厂自动化的现场总线标准&#xff0c;具有高实时性和可靠性。 而Modbus RTU则是一种串行通信协议&#xff0c;常用于…...

基于开源AI智能名片链动2+1模式S2B2C商城小程序源码的去中心化商业扩散研究

摘要&#xff1a;本文探讨在去中心化商业趋势下&#xff0c;开源AI智能名片链动21模式S2B2C商城小程序源码如何助力企业挖掘数据价值、打破信息孤岛&#xff0c;实现商业高效扩散。通过分析该技术组合的架构与功能&#xff0c;结合实际案例&#xff0c;揭示其在用户关系拓展、流…...

iOS 工厂模式

iOS 工厂模式 文章目录 iOS 工厂模式前言工厂模式简单工厂案例场景分析苹果类优点缺点 小结 工厂模式客户端调用**优点****缺点** 抽象工厂模式三个模式对比 前言 笔者之前学习了有关于设计模式的六大原则,之前简单了解过这个工厂模式,今天主要是重新学习一下这个模式,正式系统…...

LaTeX OCR - 数学公式识别系统

文章目录 一、关于 LaTeX OCR1、项目概览架构图2、相关链接资源3、功能特性 二、安装配置基础环境要求Linux 安装Mac 安装 三、使用指南1、快速训练&#xff08;小数据集&#xff09;2、完整训练&#xff08;大数据集&#xff09; 四、可视化功能训练过程可视化预测过程可视化 …...

Go 语言即时通讯系统开发日志-日志day2-5:架构设计与日志封装

Go语言即时通讯系统开发日志day2 计划&#xff1a;学习go中MySQL&#xff0c;Redis的使用&#xff0c;使用MySQL和Redis完成一个单聊demo。 总结&#xff1a;现在每天下午用来开发这个项目&#xff0c;如果有课的话可能学习时间只有3-4个小时&#xff0c;再加上今天的学习效率不…...

@JsonProperty和@JSONField 使用

JsonProperty和JSONField注解的区别 1.底层框架不同 JsonProperty 是Jackson实现的 JSONField 是fastjson实现的 2.用法不同 &#xff08;1&#xff09;bean序列化为Json&#xff1a; JsonProperty&#xff1a; ObjectMapper().writeValueAsString(Object value) JSONField&…...

从代码学习深度学习 - 近似训练 PyTorch版

文章目录 前言负采样 (Negative Sampling)层序Softmax (Hierarchical Softmax)代码示例总结前言 在自然语言处理(NLP)领域,词嵌入(Word Embeddings)技术如Word2Vec(包括Skip-gram和CBOW模型)已经成为一项基础且强大的工具。它们能够将词语映射到低维稠密向量空间,使得…...

代码上传gitte仓库

把代码push上去就行...

系统架构设计(十四):解释器风格

概念 解释器风格是一种将程序的每个语句逐条读取并解释执行的体系结构风格。程序在运行时不会先被编译为机器码&#xff0c;而是动态地由解释器分析并执行其语义。 典型应用&#xff1a;Python 解释器、JavaScript 引擎、Bash Shell、SQL 引擎。 组成结构 解释器风格系统的…...

掌握LINQ:查询语法与方法语法全解析

文章目录 引言1. 查询语法 vs 方法语法1.1 查询语法 (Query Syntax)1.2 方法语法 (Method Syntax)1.3 两种语法的比较 2. 基本的 LINQ 查询结构2.1 数据源2.2 查询操作2.3 查询执行 3. 查询表达式中的关键字3.1 基本关键字fromwhereselectorderbygroup byjoin 3.2 其他常用关键…...

Go 后端中双 token 的实现模板

下面是一个典型的 Go 后端双 Token 认证机制 实现模板&#xff0c;使用 Gin 框架 JWT Redis&#xff0c;结构清晰、可拓展&#xff0c;适合实战开发。 项目结构建议 /utils├── jwt.go // Access & Refresh token 的生成和解析├── claims.go // 从请求…...

GESP编程能力等级认证C++3级1-数组1

1 GESP编程能力等级认证C3级 1.1 GESP简介 GESP是CCF 编程能力等级认证的简称&#xff0c;它为青少年计算机和编程学习者提供学业能力验证的规则和平台。GESP 覆盖中小学阶段&#xff0c;符合年龄条件的青少年均可参加认证。 1.2 GESP的分级 C 编程测试划分为一至八级&…...

FreeRTOS “探究任务调度机制魅力”

引入 现如今随着单片机的资源越来越多&#xff0c;主频越来越高&#xff0c;在面临更复杂的功能实现以及对MCU性能的充分压榨&#xff0c;会RTOS已经成为一个必要的技能&#xff0c;新手刚开始学习的时候就很好奇“为什么代码可以放到两个循环里同时运行&#xff1f;”。接下来…...

BGP策略实验练习

要求&#xff1a; 1、使用PreVal策略&#xff0c;确保R4通过R2到达192.168.10.0/24 2、使用AS_Path策略&#xff0c;确保R4通过R3到达192.168.11.0/24 3、配置MED策略&#xff0c;确保R4到达R3到达192.168.11.0/24 4、使用Local Preference策略&#xff0c;确保R1通过R2到达192…...

Office 中 VBE 的共同特点与区别

1. Excel VBE 核心对象 #mermaid-svg-IklDO11Hu656bdGS {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-IklDO11Hu656bdGS .error-icon{fill:#552222;}#mermaid-svg-IklDO11Hu656bdGS .error-text{fill:#552222;stro…...

Linux虚拟文件系统(1)

1 虚拟文件系统&#xff08;VFS&#xff09; 虚拟文件系统&#xff08;Virtual File System, VFS&#xff09;作为内核的子系统。&#xff0c;它为用户空间的应用程序提供了一个统一的文件系统接口。通过VFS&#xff0c;不同的文件系统可以共存于同一个操作系统中&#xff0c;…...

目标检测评估指标mAP详解:原理与代码

目标检测评估指标mAP详解&#xff1a;原理与代码 目标检测评估指标mAP详解&#xff1a;原理与代码一、前言&#xff1a;为什么需要mAP&#xff1f;二、核心概念解析2.1 PR曲线&#xff08;Precision-Recall Curve&#xff09;2.2 AP计算原理 三、代码实现详解3.1 核心函数ap_pe…...

Linux干货(六)

前言 从B站黑马程序员Linux课程摘选的学习干货&#xff0c;新手友好&#xff01;若有侵权&#xff0c;会第一时间处理。 目录 前言 1.环境变量 1.环境变量的定义 2.env命令的作用 3.$符号的作用 4.PATH的定义和作用 5.修改环境变量的方法 1.临时生效 2.永久生效 2.…...

字符串相乘(43)

43. 字符串相乘 - 力扣&#xff08;LeetCode&#xff09; 解法&#xff1a; class Solution { public:string multiply(string num1, string num2) {string res "0";for (int i 0; i < num2.size(); i) {string str multiplyOneNum(num1, num2[num2.size() -…...

【Vue篇】数据秘语:从watch源码看响应式宇宙的蝴蝶效应

目录 引言 一、watch侦听器&#xff08;监视器&#xff09; 1.作用&#xff1a; 2.语法&#xff1a; 3.侦听器代码准备 4. 配置项 5.总结 二、翻译案例-代码实现 1.需求 2.代码实现 三、综合案例——购物车案例 1. 需求 2. 代码 引言 &#x1f4ac; 欢迎讨论&#…...

esp32课设记录(二)lcd屏显示文字与照片

取模软件链接&#xff1a; 链接: 百度网盘 请输入提取码 提取码: 1234 课设要求如图所示&#xff0c;因此需要在esp32显示文字和照片。在上个文章中我已经写了按键相关内容。这篇主要描述怎么显示文字和照片。我使用的是ESP-IDF库。 本项目使用的是基于ST7789驱动芯片的LCD屏幕…...

Open CASCADE学习|几何体切片处理:OpenMP与OSD_Parallel并行方案深度解析

在三维建模与仿真领域&#xff0c;几何体切片处理是CAE前处理、3D打印路径规划、医学影像分析等场景的关键技术。其核心目标是将三维模型沿特定方向离散为二维截面集合&#xff0c;便于后续分析或制造。OpenCASCADE作为开源几何内核&#xff0c;提供高效的布尔运算与几何算法&a…...

【Android】从Choreographer到UI渲染(二)

【Android】从Choreographer到UI渲染&#xff08;二&#xff09; Google 在 2012 年推出的 Project Butter&#xff08;黄油计划&#xff09;是 Android 系统发展史上的重要里程碑&#xff0c;旨在解决长期存在的 UI 卡顿、响应延迟等问题&#xff0c;提升用户体验。 在 Androi…...

板凳-------Mysql cookbook学习 (三)

1.22 使长输出行更具可读性 mysql> show full columns from limbs; ------------------------------------------------------------------------------------------------------------- | Field | Type | Collation | Null | Key | Default | Extra | Pri…...

济南国网数字化培训班学习笔记-第三组-2-电力通信光缆网认知

电力通信光缆网认知 光缆网架构现状 基础底座 电路系统是高度复杂&#xff0c;实时性、安全性、可靠性要求极高的巨系统&#xff0c;必须建设专用通信网 相伴相生 电力系统是由发电、输电、变电、配电、用电等一次设施&#xff0c;及保障其正常运行的保护、自动化、通信等…...

黑灰产业链深度解析

黑灰产业链深度解析 大家好&#xff0c;欢迎来到「黑产档案」。本频道专注于反诈教育宣传&#xff0c;通过深度拆解黑灰产业链的运作逻辑&#xff0c;帮助公众识别骗局、规避风险。本节课将聚焦产业链的核心环节&#xff0c;揭示其背后的灰色生态。 一、黑灰产的定义与范畴 要…...

golang选项设计模式

选项设计模式 有时候一个函数会有很多参数&#xff0c;为了方便函数的使用&#xff0c;我们会给希望给一些参数设定默认值&#xff0c;调用时只需要传与默认值不同的参数即可&#xff0c;类似于 python 里面的默认参数和字典参数&#xff0c;虽然 golang 里面既没有默认参数也…...

方案精读:104页DeepSeek金融银行核算流程场景部署建设方案【附全文阅读】

DeepSeek,金融银行核算流程的革新方案! 这份方案专为金融银行从业者打造,旨在解决传统核算流程的难题。当下,金融银行核算面临效率低、错误率高、合规压力大等挑战,DeepSeek 方案正是应对之策。 该方案运用人工智能和大数据技术,实现数据采集、清洗自动化,智能核算对账,…...

【MySQL】02.数据库基础

1. 数据库的引入 之前存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件存储存在安全性问题&#xff0c;文件不利于数据查询和管理&#xff0c;文件不利于存储海量数据&#xff0c;文件在程序中控制不方便。而为了解决上述问题&#xff0c;专家们设计出更加利于…...

STM32项目实战:ADC采集

STM32F103C8T6的ADC配置。PB0对应的是ADC1的通道8。在标准库中&#xff0c;需要初始化ADC&#xff0c;设置通道&#xff0c;时钟&#xff0c;转换模式等。需要配置GPIOB的第0脚为模拟输入模式&#xff0c;然后配置ADC1的通道8&#xff0c;设置转换周期和触发方式。 接下来是I2C…...

《AI语音模型:MiniMax Speech-02》

开场&#xff1a;AI 语音界的震撼弹 在 AI 语音技术的激烈竞争赛道上&#xff0c;MiniMax Speech - 02 的出现宛如一颗震撼弹&#xff0c;瞬间引爆了整个行业。不久前&#xff0c;一则消息在全球 AI 领域引起轩然大波&#xff1a;MiniMax 的新一代语音大模型 Speech - 02&#…...

基于LabVIEW的双音多频系统设计

目录 1 系统设计概述 双音多频(Dual-Tone Multi-Frequency, DTMF)信号是一种广泛应用于电话系统中的音频信号,通过不同的频率组合表示不同的按键。每个按键对应两个频率,一个低频和一个高频,共同组成独特的信号。在虚拟仪器技术快速发展的背景下,利用LabVIEW等图形化编程…...

快速生成角色背景设定:基于Next.js的AI辅助工具开发实践

引言 在游戏开发、小说创作和角色扮演&#xff08;RP&#xff09;中&#xff0c;角色背景设定&#xff08;Headcanon&#xff09;的构建往往耗时耗力。传统方法依赖手动编写&#xff0c;容易陷入思维定式。本文将分享如何利用Next.js和Tailwind CSS开发一个高效的AI角色设定生…...