创建一个react项目(router,store,axios,antd)最后有项目地址

第一步:使用cra脚手架 创建项目

文档地址:Create React App 中文文档

npx create-react-app '你的项目名称'

第二步:整理项目结构和删除多余代码

目标效果图:

在src目录下分别新建apis,assets,components,pages,router,store,utlis文件夹

原始项目目录结构只保留App.js,index.css,index.js这个三个文件

App.js:

index.css:

index.js:

拓展:安装scss

npm install sass -D

测试和使用:

App.js内容:

把index.css改为index.scss

index.js内容:

效果:

 第三步:安装ui组件库-Ant Design

官网链接:在 create-react-app 中使用 - Ant Design

npm install antd --save

测试使用:

src/App.js:

import { Button } from 'antd';
function App() {
  return (
    <div>
      <Button type="primary">Button</Button>
    </div>
  );
}

export default App;

效果图:

第四步:配置路由

中文文档:在开始之前 | React Router6 中文文档

第一步:安装

npm install react-router-dom

第二步:新建两个页面文件

在src/pages下新建两个文件Layout和Login

Layout/index.js:

const Layout= ()=>{
    return(
        <div>
            我是Layout
        </div>
    )
}

export default Layout

Login/index.js:

const Login= ()=>{
    return(
        <div>
            我是Login
        </div>
    )
}

export default Login

第三步:新建路由实例

 src/router下新建index.js

import Layout from "../pages/Layout";
import Login from "../pages/Login";
import { createBrowserRouter } from "react-router-dom";
// 配置路由
const router = createBrowserRouter([
    {
        path: '/',
        element: <Layout></Layout>
    },
    {
        path: '/login',
        element: <Login></Login>
    }
])

export default router

第四步:使用挂载实例

在src/index.js种导入

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.scss';
import router from './router';
import { RouterProvider } from 'react-router-dom';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <RouterProvider router={router}></RouterProvider>
  </React.StrictMode>
);

效果图:

第五步:封装request

第一步:修改src/pages/Login/index.js文件

import { Card, Button, Form, Input, message } from 'antd';
import './index.scss'
import { useDispatch } from 'react-redux';
import { fetchLogin } from '../../store/modules/user';
import { useNavigate } from 'react-router-dom';
const Login = () => {
    const navigate= useNavigate()
    // 实例的账号密码
    // 13800000002
    // 246810
    const dispatch = useDispatch()
    const onFinish =async (values) => {
        await dispatch(fetchLogin(values))
        // 跳转
        navigate('/')
        // 提示
        message.success('登录成功')
        console.log('Success:', values);
      };
      const onFinishFailed = (errorInfo) => {
        console.log('Failed:', errorInfo);
      };
    return (
        <div>
            <Card className='card'>
                <Form
                    name="basic"
                    labelCol={{
                        span: 8,
                    }}
                    wrapperCol={{
                        span: 16,
                    }}
                    style={{
                        maxWidth: 600,
                    }}
                    initialValues={{
                        remember: true,
                    }}
                    onFinish={onFinish}
                    onFinishFailed={onFinishFailed}
                    autoComplete="off"
                >
                    <Form.Item
                        label="Username"
                        name="mobile"
                        rules={[
                            {
                                required: true,
                                message: 'Please input your username!',
                            },
                        ]}
                    >
                        <Input />
                    </Form.Item>

                    <Form.Item
                        label="Password"
                        name="code"
                        rules={[
                            {
                                required: true,
                                message: 'Please input your password!',
                            },
                        ]}
                    >
                        <Input.Password />
                    </Form.Item>

                    <Form.Item
                        wrapperCol={{
                            offset: 8,
                            span: 16,
                        }}
                    >
                        <Button type="primary" htmlType="submit">
                            Submit
                        </Button>
                    </Form.Item>
                </Form>
            </Card>
        </div>
    )
}

export default Login

在src/pages/Login下添加index.scss

.card{
    display: flex;
    justify-content: center;
    position: fixed;
    top: 100px;
    left:35%;
    width: 500px;
}

第二步:封装request

中文文档起步 | Axios中文文档 | Axios中文网

安装axios

npm install axios

在src/utlis下新建request.js和index.js

request.js:

// axios封装
// 1 根域名配置
// 2 超时时间
// 3 请求拦截器
// 4 响应拦截器
import axios from "axios";
import { getToken } from "./token";
const request = axios.create({
    baseURL:'http://geek.itheima.net/v1_0',
    timeout:5000
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    const token= getToken()
    if(token){
        config.headers.Authorization='Bearer '+token
    }
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    return Promise.reject(error);
  });

export {request}

index.js:

// 统一中转工具函数导出
import { request } from "./request";
import { setToken,getToken,removeToken } from "./token";
export {
    request,
    setToken,
    getToken,
    removeToken
}

第六步:利用redux封装token

第一步安装react-redux/@reduxjs/toolkit

中文文档:入门 Redux | Redux 中文官网

npm install @reduxjs/toolkit react-redux

 在src/store新建modules/user.js和index.js

src/store/index.js:

// 组合子模块
import { configureStore } from "@reduxjs/toolkit";
import userStore from "./modules/user";
const store = configureStore({
    reducer:{
        userStore
    }
})

export default store

src/store/modules/user.js:

// 放置和用户相关的
import { createSlice } from "@reduxjs/toolkit";
import { request,setToken as _setToken,getToken } from "../../utils";
const userSlice= createSlice({
    name:'user',
    initialState:{
        // token持久化
        token:getToken()||'',
    },
    reducers:{
        setToken:(state,action)=>{
            state.token=action.payload
            // token持久化
            _setToken(action.payload)
        }
    }

})

// 解构
const {setToken} = userSlice.actions

// 获取reducer函数
const userStore= userSlice.reducer

// 封装一部方法 完成登录 获取token
const fetchLogin=(loginForm)=>{
    return async (dispatch)=>{
        // 1 发送异步请求
        const res = await request.post('/authorizations',loginForm)
        // 2 提交同步修改方法
        dispatch(setToken(res.data.token))

    }
}

export {fetchLogin,setToken}

export default userStore

最后在src/index.js添加store

import React from 'react';
import ReactDOM from 'react-dom/client';
import './index.scss';
import router from './router';
import { RouterProvider } from 'react-router-dom';
import { Provider } from 'react-redux';
import store from './store';

const root = ReactDOM.createRoot(document.getElementById('root'));
root.render(
  <React.StrictMode>
    <Provider store={store}>
      <RouterProvider router={router}></RouterProvider>
    </Provider>
  </React.StrictMode>
);

 然后在login进行调用

封装存,取,删token的方法

在src/utlis新建token.js

const TOKENKEY='token'
const setToken =(token)=>{
    localStorage.setItem(TOKENKEY,token)
}

const getToken=()=>{
   return localStorage.getItem(TOKENKEY)
}

const removeToken=()=>{
    localStorage.removeItem(TOKENKEY)
}

export {setToken,getToken,removeToken}

在src/pages/Layout下进行测试

// 测试toekn
import { useEffect } from "react"
import { request } from "../../utils"
const Layout= ()=>{
    useEffect(()=>{
        request.get('/user/profile')
    },[])
    return(
        <div>
            我是Layout
        </div>
    )
}

export default Layout

 第七步:根据token进行路由权限判断

在src/components下新建Auth.js

// 封装高阶组件
// 有token正常访问 无token跳转login

import { getToken } from "../utils"
import { Navigate } from "react-router-dom"

const Auth = ({children}) => {
    const token = getToken()
    if(token){
        return <>{children}</>
    }else{
        return <Navigate to={'/login'} replace></Navigate>
    }
}

export default Auth

 然后在router/index.js修改

import Layout from "../pages/Layout";
import Login from "../pages/Login";
import { createBrowserRouter } from "react-router-dom";
import Auth from "../components/Auth";
import Home from "../pages/Home";
import Article from "../pages/Article";
import Publish from "../pages/Publish";
// 配置路由
const router = createBrowserRouter([
    {
        path: '/',
        element: <Auth><Layout></Layout></Auth>,
        children:[
            {
                index:true,
                element:<Home></Home>
            },
            {
                path:'article',
                element:<Article></Article>
            },            {
                path:'publish',
                element:<Publish></Publish>
            }
        ]
    },
    {
        path: '/login',
        element: <Login></Login>
    }
])

export default router

新建src/pages下的Home,Article,Publish文件

 Home.js:

const Home = ()=>{
    return(
        <div>我是Home</div>
    )
}
export default Home

下面两个文件类推!!!

 第八步:封装Laout样式组件

覆盖src/pages/Layout/index.js

import React, { useEffect, useState } from 'react';
import {
    MenuFoldOutlined,
    MenuUnfoldOutlined,
    UploadOutlined,
    UserOutlined,
    VideoCameraOutlined,
} from '@ant-design/icons';
import { Button, Layout, Menu, theme, Popconfirm } from 'antd';
import { Outlet, useLocation, useNavigate } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import { clearUserInfo, fetchUserInfo } from '../../store/modules/user';
const { Header, Sider, Content } = Layout;
const App = () => {
    const navigste = useNavigate()
    const dispatch = useDispatch()
    const [collapsed, setCollapsed] = useState(false);
    const {
        token: { colorBgContainer, borderRadiusLG },
    } = theme.useToken();

    // 侧边跳转
    const MenuClick = (key) => {
        navigste(key)
    }

    useEffect(() => {
        dispatch(fetchUserInfo())
    }, [dispatch])

    const userInfo = useSelector(state => state.userStore.userInfo)

    // 退出按钮
    const confirm = () => {
        dispatch(clearUserInfo())
        navigste('/login')
    }

    // 获取路由参数 初始化侧边高亮
    const location = useLocation()
    return (
        <Layout style={{ height: '100vh' }}>
            <Sider trigger={null} collapsible collapsed={collapsed}>
                <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '10px' }}>
                    <img src='https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg' style={{ width: '50%', height: '50px' }} alt=''></img>
                    {!collapsed &&
                        <div style={{ color: '#fff', width: '50%' }}>哈哈哈</div>
                    }
                </div>
                <Menu
                    onClick={({ key }) => MenuClick(key)}
                    theme="dark"
                    mode="inline"
                    defaultSelectedKeys={[location.pathname]}
                    items={[
                        {
                            key: '/',
                            icon: <UserOutlined />,
                            label: '首页',
                        },
                        {
                            key: '/article',
                            icon: <VideoCameraOutlined />,
                            label: '文章',
                        },
                        {
                            key: '/publish',
                            icon: <UploadOutlined />,
                            label: '发布',
                        },
                    ]}
                />
            </Sider>
            <Layout>
                <Header
                    style={{
                        padding: '0 24px 0 0',
                        background: colorBgContainer,
                        display: 'flex',
                        justifyContent: 'space-between'
                    }}
                >
                    <Button
                        type="text"
                        icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
                        onClick={() => setCollapsed(!collapsed)}
                        style={{
                            fontSize: '16px',
                            width: 64,
                            height: 64,
                        }}
                    />
                    <div style={{ display: 'flex', alignItems: 'center', fontSize: '16px' }}>
                        <span>{userInfo.name}</span>
                        <UserOutlined style={{ marginLeft: '10px' }} />
                        <Popconfirm
                            title="退出"
                            description="确认退出吗?"
                            onConfirm={confirm}
                            okText="Yes"
                            cancelText="No"
                        >
                            <span style={{ cursor: "pointer" }}>退出</span>

                        </Popconfirm>
                    </div>
                </Header>
                <Content
                    style={{
                        margin: '24px 16px',
                        padding: 24,
                        minHeight: 280,
                        background: colorBgContainer,
                        borderRadius: borderRadiusLG,
                    }}
                >
                    {/* 二级路由出口 */}
                    <Outlet></Outlet>
                </Content>
            </Layout>
        </Layout>
    );
};
export default App;

封装退出方法

src/store/modules/user.js

// 放置和用户相关的
import { createSlice } from "@reduxjs/toolkit";
import { request,setToken as _setToken,getToken, removeToken } from "../../utils";
const userSlice= createSlice({
    name:'user',
    initialState:{
        // token持久化
        token:getToken()||'',
        userInfo:{}
    },
    reducers:{
        setToken:(state,action)=>{
            state.token=action.payload
            // token持久化
            _setToken(action.payload)
        },
        setUserInfo:(state,action)=>{
            state.userInfo=action.payload
        },
        clearUserInfo:(state)=>{
            state.token=''
            state.userInfo={}
            removeToken()
        }
    }

})

// 解构
const {setToken,setUserInfo,clearUserInfo} = userSlice.actions

// 获取reducer函数
const userStore= userSlice.reducer

// 封装异步方法 完成登录 获取token
const fetchLogin=(loginForm)=>{
    return async (dispatch)=>{
        // 1 发送异步请求
        const res = await request.post('/authorizations',loginForm)
        // 2 提交同步修改方法
        dispatch(setToken(res.data.token))

    }
}
// 获取个人信息
const fetchUserInfo=()=>{
    return async (dispatch)=>{
        // 1 发送异步请求
        const res = await request.get('/user/profile')
        // 2 提交同步修改方法
        dispatch(setUserInfo(res.data))
    }
}

export {fetchLogin,setToken,fetchUserInfo,clearUserInfo}

export default userStore

 第九步:处理token失效

src/utlis/request.js

// axios封装
// 1 根域名配置
// 2 超时时间
// 3 请求拦截器
// 4 响应拦截器
import axios from "axios";
import { getToken, removeToken } from "./token";
import router from "../router";
const request = axios.create({
    baseURL:'http://geek.itheima.net/v1_0',
    timeout:5000
})

// 添加请求拦截器
request.interceptors.request.use(function (config) {
    // 在发送请求之前做些什么
    const token= getToken()
    if(token){
        config.headers.Authorization='Bearer '+token
    }
    return config;
  }, function (error) {
    // 对请求错误做些什么
    return Promise.reject(error);
  });

// 添加响应拦截器
request.interceptors.response.use(function (response) {
    // 2xx 范围内的状态码都会触发该函数。
    // 对响应数据做点什么
    return response.data;
  }, function (error) {
    // 超出 2xx 范围的状态码都会触发该函数。
    // 对响应错误做点什么
    // 处理token失效
    if(error.response.status===401){
        removeToken()
        router.navigate('/login')
        window.location.reload()
    }
    return Promise.reject(error);
  });

export {request}

第十步:封装Api请求

src/apis/user.js

import { request } from "../utils";

const loginApi=(data)=>{
    return request({
        url:'/authorizations',
        method:'post',
        data
    })
}

const userInfoApi=()=>{
    return request({
        url:'/user/profile',
        method:'get',
    })
}

export {loginApi,userInfoApi}

修改src/store/modules/user.js

// 放置和用户相关的
import { createSlice } from "@reduxjs/toolkit";
import {setToken as _setToken,getToken, removeToken } from "../../utils";
import { loginApi, userInfoApi } from "../../apis/user";
const userSlice= createSlice({
    name:'user',
    initialState:{
        // token持久化
        token:getToken()||'',
        userInfo:{}
    },
    reducers:{
        setToken:(state,action)=>{
            state.token=action.payload
            // token持久化
            _setToken(action.payload)
        },
        setUserInfo:(state,action)=>{
            state.userInfo=action.payload
        },
        clearUserInfo:(state)=>{
            state.token=''
            state.userInfo={}
            removeToken()
        }
    }

})

// 解构
const {setToken,setUserInfo,clearUserInfo} = userSlice.actions

// 获取reducer函数
const userStore= userSlice.reducer

// 封装异步方法 完成登录 获取token
const fetchLogin=(loginForm)=>{
    return async (dispatch)=>{
        // 1 发送异步请求
        const res = await loginApi(loginForm)
        // 2 提交同步修改方法
        dispatch(setToken(res.data.token))

    }
}
// 获取个人信息
const fetchUserInfo=()=>{
    return async (dispatch)=>{
        // 1 发送异步请求
        const res = await userInfoApi()
        // 2 提交同步修改方法
        dispatch(setUserInfo(res.data))
    }
}

export {fetchLogin,setToken,fetchUserInfo,clearUserInfo}

export default userStore

拓展:使用图表

Echarts文档:Examples - Apache ECharts

在src/pages/新建一个Echarts文件来放置我们的echrats

src/pages/Echarts/index.js:

import * as echarts from 'echarts';
import { useEffect, useRef } from 'react';
const Echarts = () => {
    const chartRef= useRef(null)
    useEffect(() => {
        // 保证dom是可用的
        // 1 获取要渲染的图标节点
        const chartDom = chartRef.current
        // 2 初始化生成echarts实例
        const myChart = echarts.init(chartDom);
        //  3 配置参数
        const option = {
            xAxis: {
                type: 'category',
                data: ['Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun']
            },
            yAxis: {
                type: 'value'
            },
            series: [
                {
                    data: [120, 200, 150, 80, 70, 110, 130],
                    type: 'bar'
                }
            ]
        };
        // 4 使用参数完成渲染
        option && myChart.setOption(option);
    }, [])
    return (
        <div>
            <div ref={chartRef} style={{width:'600px',height:'600px'}}></div>
        </div>
    )
}

export default Echarts

在src/router/index.js添加路由

import Layout from "../pages/Layout";
import Login from "../pages/Login";
import { createBrowserRouter } from "react-router-dom";
import Auth from "../components/Auth";
import Home from "../pages/Home";
import Article from "../pages/Article";
import Publish from "../pages/Publish";
import Echarts from "../pages/Echarts";
// 配置路由
const router = createBrowserRouter([
    {
        path: '/',
        element: <Auth><Layout></Layout></Auth>,
        children: [
            {
                index: true,
                element: <Home></Home>
            },
            {
                path: 'article',
                element: <Article></Article>
            }, {
                path: 'publish',
                element: <Publish></Publish>
            },
            {
                path:'echarts',
                element:<Echarts></Echarts>
            }
        ]
    },
    {
        path: '/login',
        element: <Login></Login>
    }
])

export default router

在src/pages/Layout/index.js追加路由

import React, { useEffect, useState } from 'react';
import {
    MenuFoldOutlined,
    MenuUnfoldOutlined,
    UploadOutlined,
    UserOutlined,
    VideoCameraOutlined,
} from '@ant-design/icons';
import { Button, Layout, Menu, theme, Popconfirm } from 'antd';
import { Outlet, useLocation, useNavigate } from 'react-router-dom';
import { useDispatch, useSelector } from 'react-redux';
import { clearUserInfo, fetchUserInfo } from '../../store/modules/user';
const { Header, Sider, Content } = Layout;
const App = () => {
    const navigste = useNavigate()
    const dispatch = useDispatch()
    const [collapsed, setCollapsed] = useState(false);
    const {
        token: { colorBgContainer, borderRadiusLG },
    } = theme.useToken();

    // 侧边跳转
    const MenuClick = (key) => {
        navigste(key)
    }

    useEffect(() => {
        dispatch(fetchUserInfo())
    }, [dispatch])

    const userInfo = useSelector(state => state.userStore.userInfo)

    // 退出按钮
    const confirm = () => {
        dispatch(clearUserInfo())
        navigste('/login')
    }

    // 获取路由参数 初始化侧边高亮
    const location = useLocation()
    return (
        <Layout style={{ height: '100vh' }}>
            <Sider trigger={null} collapsible collapsed={collapsed}>
                <div style={{ display: 'flex', alignItems: 'center', justifyContent: 'center', padding: '10px' }}>
                    <img src='https://gw.alipayobjects.com/zos/rmsportal/KDpgvguMpGfqaHPjicRK.svg' style={{ width: '50%', height: '50px' }} alt=''></img>
                    {!collapsed &&
                        <div style={{ color: '#fff', width: '50%' }}>哈哈哈</div>
                    }
                </div>
                <Menu
                    onClick={({ key }) => MenuClick(key)}
                    theme="dark"
                    mode="inline"
                    defaultSelectedKeys={[location.pathname]}
                    items={[
                        {
                            key: '/',
                            icon: <UserOutlined />,
                            label: '首页',
                        },
                        {
                            key: '/article',
                            icon: <VideoCameraOutlined />,
                            label: '文章',
                        },
                        {
                            key: '/publish',
                            icon: <UploadOutlined />,
                            label: '发布',
                        },
                        {
                            key: '/echarts',
                            icon: <UploadOutlined />,
                            label: '图标',
                        },
                    ]}
                />
            </Sider>
            <Layout>
                <Header
                    style={{
                        padding: '0 24px 0 0',
                        background: colorBgContainer,
                        display: 'flex',
                        justifyContent: 'space-between'
                    }}
                >
                    <Button
                        type="text"
                        icon={collapsed ? <MenuUnfoldOutlined /> : <MenuFoldOutlined />}
                        onClick={() => setCollapsed(!collapsed)}
                        style={{
                            fontSize: '16px',
                            width: 64,
                            height: 64,
                        }}
                    />
                    <div style={{ display: 'flex', alignItems: 'center', fontSize: '16px' }}>
                        <span>{userInfo.name}</span>
                        <UserOutlined style={{ marginLeft: '10px' }} />
                        <Popconfirm
                            title="退出"
                            description="确认退出吗?"
                            onConfirm={confirm}
                            okText="Yes"
                            cancelText="No"
                        >
                            <span style={{ cursor: "pointer" }}>退出</span>

                        </Popconfirm>
                    </div>
                </Header>
                <Content
                    style={{
                        margin: '24px 16px',
                        padding: 24,
                        minHeight: 280,
                        background: colorBgContainer,
                        borderRadius: borderRadiusLG,
                    }}
                >
                    {/* 二级路由出口 */}
                    <Outlet></Outlet>
                </Content>
            </Layout>
        </Layout>
    );
};
export default App;

效果图:

拓展:使用富文本编辑器

这里介绍的富文本叫ReactQuill,使用比较简单,用的也比较多,适用于大多数场景!

npm地址:react-quill - npm

npm install react-quill --save

在src/pages/Publish/index.js:

import ReactQuill from 'react-quill';
import 'react-quill/dist/quill.snow.css';
// 以上为导入资源
import { useState } from 'react';
const Publish = () => {
    // value 就是富文本的值
    const [value, setValue] = useState('');
    console.log(value);
    return (
        <div>
            <ReactQuill style={{ width: '500px', height: '200px' }} theme="snow" value={value} onChange={setValue} >
            </ReactQuill>

        </div>
    )
}

export default Publish

效果图:

到这里恭喜你完成了一个简单版本的react后台模板

示例代码地址:react-demo-pc: 练习使用的一个react后台模板,主要熟悉联系ui组件库,redux,router,axios

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

重学JavaScript核心知识点(二)—— 详解Js中的模块化

详解Js中的模块化 1. 模块化的背景2. 来看一个例子3. 优雅的做法 —— 创建模块对象4. 模块与类&#xff08;class&#xff09;5. 合并模块6. 动态加载模块 1. 模块化的背景 JavaScript 在诞生之初是体积很小的&#xff0c;早期&#xff0c;它们大多被用来执行独立的脚本任务&…

C++初学者,使用命令行编绎C文件

今天在家里&#xff0c;闲来无事。又开始学习制作Helloworld! VStudio 版本众多&#xff0c;用哪个好呢&#xff0c;真是不好选择。今天就使用网上的大神&#xff1a;theoractice&#xff0c;制造的版本来学习C&#xff0c;我喜欢2013这个版本&#xff0c;真是太好用了。不但C…

Qt自定义控件--提升为

为什么要自定义控件 1&#xff0c;有复合小控件需要组合为一个整体控件时&#xff1b; 2&#xff0c;一个复合控件需要重复使用时&#xff1b; 实现 自定义控件文件 新增三个文件 关联不同组的控件 关联之前的准备工作 1&#xff0c;在主控件选择和子控件所有控件所在控件…

【一键录音,轻松转换:用Python打造个性化音频记录工具】

在数字化时代,音频记录已成为日常学习、工作和娱乐不可或缺的一部分。想象一下,只需简单按下几个键,即可随时随地捕捉灵感,记录会议要点,或是珍藏孩子的童言稚语。本文将引领您步入Python编程的奇妙世界,展示如何借助几个强大的库,构建一个既简单又实用的音频录制及转换…

第十二届蓝桥杯省赛真题 Java A 组【原卷】

文章目录 发现宝藏【考生须知】试题 A: 相乘试题 B: 直线试题 C : \mathrm{C}: C: 货物摆放试题 D: 路径试题 E: 回路计数试题 F : \mathrm{F}: F: 最少砝码试题 G: 左孩子右兄弟试题 H : \mathrm{H}: H: 异或数列试题 I \mathbf{I} I 双向排序试题 J : \mathrm{J}: J: 分…

如何快速展示专业:掌握类的基本概念-类/方法/关键字/变量/数据类型/注释

在李笑来的《财富自由之路》中提到一种初学者快速入门的学习方法&#xff1a;快速掌握最小必要知识。 关于Java的类&#xff0c;最少必要知识就是本文提到的基本概念&#xff0c;掌握了这些基本概念&#xff0c;就对类有了基本的了解&#xff0c;为后续的深入学习和沟通奠定了基…

Go编程语言的调试器Delve | Goland远程连接Linux开发调试(go远程开发)

文章目录 Go编程语言的调试器一、什么是Delve二、delve 安装安装报错cgo: C compiler "gcc" not found: exec: "gcc": executable file not found in $PATH解决 三、delve命令行使用delve 常见的调试模式常用调试方法todo调试程序代码与动态库加载程序运行…

真要这么卷?某国产大模型定价下调90%,百万 tokens 只需 1 元!

就在刚刚&#xff0c;国内明星AI公司——智谱AI官宣重磅炸弹&#xff1a; 将能力对标GPT3.5-Turbo的GLM-3的大模型API调用价格最高下调90%&#xff0c;价格仅为原来的十分之一&#xff01; 废话不多说&#xff0c;直接上图&#xff1a; 官网地址&#xff1a;https://open.big…

【SRC实战】前端脱敏信息泄露

挖个洞先 https://mp.weixin.qq.com/s/xnCQQCAneT21vYH8Q3OCpw “ 以下漏洞均为实验靶场&#xff0c;如有雷同&#xff0c;纯属巧合 ” 01 — 漏洞证明 一、前端脱敏&#xff0c;请求包泄露明文 “ 前端脱敏处理&#xff0c;请求包是否存在泄露&#xff1f; ” 1、获取验…

公有云Linux模拟UDP端口并抓包

目录 写在前面操作步骤服务端开启UDP端口并监听客户端连接Wireshark抓包查看 写在前面 关于具体的操作&#xff0c;请参考我的上一篇文章 公有云Linux模拟TCP三次挥手与四次握手&#xff08;Wireshark抓包验证版&#xff09; 在本文&#xff0c;仅介绍与上一篇不同的地方。 操…

STL中的优先级队列

目录 1.引言 2.简介 3.基本操作 4.实现原理 5.自定义优先级比较 6.相关题目 7.能特点 8.总结 1.引言 在C标准库中&#xff0c;优先级队列是一种非常有用的数据结构&#xff0c;它允许我们根据元素的优先级来对其进行排序和访问。这种数据结构在多种应用场景中都发挥着重…

Linux提权--第三方软件MYSQL数据库提权(WEB+本地)

免责声明:本文仅做技术交流与学习,非法搞事后果自负... 目录 靶场镜像: 过程: 手工: 下载mysql udf poc 进行编译. 进入数据库进行UDF导出 下载(上传) 创建do_system函数调用 探针(./LinEnum.sh),查找suid权限. 配合使用find调用执行 工具: 过程: 外连不上? 隧道出…

云器Lakehouse:Multi-Cluster弹性架构如何实现湖上高并发低延迟分析

导读 在当今快速发展的大数据时代&#xff0c;数据平台的性能和效率对于企业来说至关重要。云器Lakehouse的Multi-Cluster弹性架构为我们提供了一种全新的视角&#xff0c;以应对数据湖上高并发和低延迟分析的挑战。本文将深入探讨云器Lakehouse如何通过其独特的技术理念和架构…

B端弹窗设计指南,3000字讲清楚,内附大量案例。

B端系统弹窗是指在企业级&#xff08;Business to Business&#xff09;系统中&#xff0c;弹出的窗口或对话框&#xff0c;用于向用户展示信息、提供操作选项或者收集用户输入。 一、B端系统弹窗的作用 作用如下&#xff1a; 提示和通知&#xff1a;弹窗可以用于向用户展示重…

Maven多环境与SpringBoot多环境配置

1. Maven多环境配置与应用 1.1 多环境开发 我们平常都是在自己的开发环境进行开发&#xff0c; 当开发完成后&#xff0c;需要把开发的功能部署到测试环境供测试人员进行测试使用&#xff0c; 等测试人员测试通过后&#xff0c;我们会将项目部署到生成环境上线使用。 这个时…

RisingWave基本操作

什么是RisingWave RisingWave 是一款基于 Apache 2.0 协议开源的分布式流数据库。RisingWave 让用户使用操作传统数据库的方式来处理流数据。通过创建实时物化视图&#xff0c;RisingWave 可以让用户轻松编写流计算逻辑&#xff0c;并通过访问物化视图来对流计算结果进行及时、…

Mobilenet四代网络模型架构

一、Mobilenet v1 MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文地址:https://arxiv.org/abs/1704.04861https://arxiv.org/abs/1704.04861 1.概述 Mobilenet是一个用于移动端和嵌入式的神经网络,其核心思想是采用深度可分离…

六西格玛遇上AI:质量提升进入“快车道”

人工智能&#xff08;AI&#xff09;与六西格玛管理方法——正在慢慢接近我们的视野中&#xff0c;预示着在质量管理中一场改革重大改革将要到来。 AI&#xff0c;作为科技的前沿&#xff0c;正以其强大的数据处理能力和机器学习能力&#xff0c;为质量管理提供全新的视角。它…

四十九坊股权设计,白酒新零售分红制度,新零售策划机构

肆拾玖坊商业模式 | 白酒新零售体系 | 新零售系统开发 坐标&#xff1a;厦门&#xff0c;我是易创客肖琳 深耕社交新零售行业10年&#xff0c;主要提供新零售系统工具及顶层商业模式设计、全案策划运营陪跑等。 不花钱开3000多家门店&#xff0c;只靠49个男人用一套方法卖白酒…

docker-compose集成elk(基于logstash+filebeat)采集java和nginx日志

1.准备compose.yml编排式文件 services: #日志信息同步logstash:container_name: logstashimage: docker.elastic.co/logstash/logstash:7.17.14 #logstash:command: logstash -f /usr/share/logstash/pipeline/logstash.confdepends_on:- elasticsearchrestart: on-failurepo…