使用Nextjs学习(学习+项目完整版本)

news2024/10/5 13:33:13

创建项目

运行如下命令

npx create-next-app next-create

创建项目中出现的各种提示直接走默认的就行,一直回车就行了
创建完成后进入到项目运行localhost:3000访问页面,如果和我下面页面一样就是创建项目成功了
在这里插入图片描述

整理项目

  • 将app/globals.css里面的样式都删除,只留下最上面三行即可
  • 将app/layout.js的类名添加一个补充,换成 className={ ${inter.className} h-screen} 相当于给了高度100vh撑满

页面与布局

将app/Layout.js进行改造

import {
    Inter } from "next/font/google";
import "./globals.css";

const inter = Inter({
    subsets: ["latin"] });

export const metadata = {
   
  title: "Create Next App",  // 网站标题
  description: "Generated by create next app", // 描述信息
};

export default function RootLayout({
     children }) {
   
  return (
    <html lang="en">
      <body className={
   inter.className}>
        app下面的layout
        {
   children}</body>
    </html>
  );
}

新建app/user/Layout.js存入以下内容

export default function userLayout({
     children }) {
   
  return (
    <section>
        user下面的layout
        {
   children}
    </section>
  );
}

访问localhost:3000

在这里插入图片描述
访问localhost:3000/user

在这里插入图片描述
通过对比可以发现,app下面的就是公共的根样式,下面每个Layout.js都会继承到,然后每个文件夹下都可以定义当前路由页面的样式

路由创建

静态路由

在app下面新建demo文件夹,在里面新建page.js和layout.js,内容如下

// page.js
export default function(){
   
    return <div>12121</div>
}

// layout.js
export default function({
    children}){
   
    return <div>我是demo的母版 <br/>{
   children}</div>
}

访问:http://localhost:3000/demo
效果图
在这里插入图片描述
说明:app下面每个文件夹名称都是一个路由,每个文件夹下面的page.js就是代表当前文件夹的页面,每个文件夹又都有自己的layout.js(layout.js不是必须的,页面内不写这个文件也没关系),里面默认的参数children就是当前页面的元素,也可以说layout.js就相当于当前页面的母版,每个路由都有自己的layout.js但是app下面的layout.js是全局公共的

如果demo下面还有list这个页面,则在demo文件夹内list文件夹,然后在里面创建page.js文件即可,在里面写内容后,页面上面直接访问localhost:3000/demo/list即可

动态路由

当我们访问localhost:3000/demo/list/1或者localhost:3000/demo/list/2这种动态路由怎么实现呢???

这就要用到动态参数了

在app/demo/list下面新建[id]文件夹,这种文件夹名字是[]包裹的就是动态参数了

例如我们的[id]文件夹里面创建page.js内容如下

export default function({
    params}){
   
    return <div>动态参数的值为{
   params.id}</div>
}

当访问http://localhost:3000/demo/list/2001时,页面效果如下

在这里插入图片描述
上面有个弊端就是只支持一级动态参数,如果希望多级的话可以将[id]文件名换成[…id]这样就是可以匹配到后面所有参数,访问localhost:3000/demo/list/2/3/4/5

效果图
在这里插入图片描述

路由组

项目下新建三个路径文件

  • app/(marketing)/about/page.js
  • app/(marketing)/bolg/page.js
  • app/(marketing)/(shop)/acconut/page.js

在每个page.js里面随便写点内容,访问以下路径

  • localhost:3000/about
  • localhost:3000/bolg
  • localhost:3000/account

可以发现都能被访问到,总结规律就是文件夹名字带括号的相当于可以忽略了

路由组不参与url的设定的

个人感觉唯一作用是用于设置共同的Layout.js

创建如下两个Layout.js文件

  • app/(marketing)/Layout.js
  • app/(marketing)/(shop)/Layout.js

在这两个里面添加如下代码

export default function userLayout({
     children }) {
   
  return (
    <section>
        marketing下面的layout
        {
   children}
    </section>
  );
}
export default function userLayout({
     children }) {
   
  return (
    <section>
        marketing下面shop的layout
        {
   children}
    </section>
  );
}

运行后会发现,marking的Layout,js被它里面所有文件所共用,shop里面的Layout.js被shop里面的文件所共用,因为这个案例shop在marking里面的,因此shop里面的文件也共用marking里面的样式,这就是路由组,按照上面传统的方式建路由,需要每个文件单独设置自己的Layout.js,使用路由组可以达到复用性

路由跳转和传参以及接收参数

跳转和传参

这里跳转的路径为app/list/[id]/page.js

'use client';
import Link from "next/link";
import {
    useRouter } from "next/navigation";

function Home({
     items, time }) {
   
  const router = useRouter()
  return (
    <div className="Home">
     <Link href={
   '/list/1'}>跳转到xiaoji页面</Link>
     <br></br>
     <Link href={
   '/list/1?name=萧寂'}>跳转到xiaoji页面(带参数)</Link>
     <hr></hr>
     <button onClick={
   ()=>{
   router.push('/list/1')}}>跳转到xiaoji页面</button>
     <br></br>
     <button onClick={
   ()=>{
   router.push('/list/1?name=萧寂')}}>跳转到xiaoji页面(第一种带参数)</button>
     <button onClick={
   ()=>{
   router.push({
   
      pathname:'/list/1',
      query:{
   
        name:'萧寂'
      }
     })}}>跳转到xiaoji页面(第二种带参数)</button>
    </div>
  );
}
export default Home;

接收参数

app/list/[id]/page.js里面代码如下

export default async function({
    params,searchParams}){
   
    await new Promise((resolve) => setTimeout(resolve, 2000));
    return <div>动态参数的值为{
   params.id},query动态的搜索参数为{
   searchParams.name}</div>
}

当我在页面输入地址localhost:3000/list/3?name=xiaoji,效果如下:

在这里插入图片描述

Loadding加载和流的处理

1.在app下面新建loading.js组件

export default function(){
   
    return <div className={
   "text-2xl text-pink-400"}>Loading...</div>
}

2.修改app/Layout.js

import {
    Inter } from "next/font/google";
import {
    Suspense } from "react"; 
import Loading from './loading';  // 引入app/loading.js
import "./globals.css";

const inter = Inter({
    subsets: ["latin"] });

export const metadata = {
   
  title: "Create Next App",  // 网站标题
  description: "Generated by create next app", // 描述信息
};

export default function RootLayout({
     children }) {
   
  return (
    <html lang="en">
      <body className={
   inter.className}>
        <Suspense fallback={
   <Loading></Loading>}> // 2.使用SusPense将页面包裹
        	app下面的layout
        	{
   children}
        </Suspense>
        </body>
    </html>
  );
}

子组件代码

这里使用了async/await模拟了一下异步,这是个细节,因为上面的loadding效果如果要出来的话,页面数据必须要是有异步效果,因为我没注意到这点,费了点时间才搞明白

export default async function Posts() {
   
  await new Promise((resolve) => setTimeout(resolve, 2000));
  return <div>1111</div>;
}

注意:将Lodding放到app/Layout.js里面包裹的话,则针对所有页面生效,如果某个页面有不一样的loading效果的话,则需要在当前文件夹里面的Layout.js去单独引入对应的loading.js,可以在当前文件夹里面创建个loading.js,这样的话loading.js的样式仅仅作用于当前文件夹下的所有页面

import {
    Suspense } from "react";
export default function userLayout({
     children }) {
   
  return (
    <section>
        // 这个loading效果仅作用于当前文件夹下面的所有页面
        <Suspense fallback={
   <div className={
   "text-2xl text-pink-400"}>Loading...</div>}>
        user下面的layout
        {
   children}
      </Suspense>
    </section>
  );
}

注意:必须是渲染的页面内有异步操作(如async/await)才会有Loading.js效果

错误处理

新建app/error.js,放入以下内容

'use client'

export default function({
    error,reset}){
   
    return (
        <div>
            <h2>我是全局的错误样式处理</h2>
            <button onClick={
   ()=>reset()}>重试一下</button>
        </div>
    )
}

也可以对每个页面单独定义路由样式,只需要在目标页面的文件夹内新建error.js,放入以下内容即可

例如我在app/user/error.js内加入以下内容

'use client'

export default function({
    error,reset}){
   
    return (
        <div>
            <h2>app/user 页面内有错误啦!!!</h2>
            <button onClick={
   ()=>reset()}>重试一下</button>
        </div>
    )
}

例如我们在目标的user页面加入一些错误信息

export default function Posts() {
   
  console.log('a',a);  // 这里没有a变量,因此这里会报错
  return <div>1111</div>;
}

当我们在浏览器访问localhost:3000/user就会报出以下错误

在这里插入图片描述
当我们访问其他页面有错误信息时,但是没有给那个页面单独定义错误样式,则会触发全局的错误样式

例如访问: localhost:3000/about

在这里插入图片描述

链接和导航

修改下app/page.js内容如下

'use client';
import Link from "next/link";
import {
    useRouter } from "next/navigation";


export default function Home() {
   
  const router = useRouter()
  return (
    <>
    <h1 className="text-4xl text-orange-600">Hello Name</h1>
    <br></br>
    <Link href={
   "/user"}>跳转到user路由</Link>
    <br></br>
    <button onClick={
   ()=>{
   router.push('/user')}}>点击跳转/user</button>
    </>
  );
}

滚动到新路由的指定位置处,相当于锚点链接

<Link href="/dashboard#settings">Settings</Link>
 
// Output
<a href="/dashboard#settings">Settings</a>

平行路由(Parallel Routes)

在app下面新建@home和@setting文件夹,里面都新建一个page.js文件,在里面写一点页面

在app/Layout.js里面改为如下页面代码

import {
    Inter } from "next/font/google";
import {
    Suspense } from "react";
import Loading from './loading';
import "./globals.css";

const inter = Inter({
    subsets: ["latin"] });

export const metadata = {
   
  title: "Create Next App",  // 网站标题
  description: "Generated by create next app", // 描述信息
};

export default function RootLayout({
     children,home,setting }) {
   
  return (
    <html lang="en">
      <body className={
   inter.className}>
        <Suspense fallback={
   <Loading></Loading>}>
        app下面的layout
        {
   home}
        {
   children}
        {
   setting}
        </Suspense>
        </body>
    </html>
  );
}

在这里插入图片描述

可以发现组件效果已经出来了

这里有个注意点,使用了平行路由后,这个文件夹内不要创建别的路由文件夹了,因为就算创建了后面的路径也会报错一堆404,我不知道是正常情况还是异常情况,本人就这样理解的,因此把所有的需要用到平行路由的界面我都归类为最终页面了

组件化渲染

下面是可以应用到我们页面里面的组件的案例

在app平级处创建components/frame/index.js,放入以下内容

import Image from "next/image";

export default function({
    photo}){
   
    console.log('photo',photo);
    return <>
    <Image src={
   photo.src} alt="" width={
   600} height={
   600} className={
   'w-full object-cover aspect-square col-span-2 w-28'}></Image>
    </>
}

在app里面新建photo/page.js文件,插入以下内容

import Photo from "@/components/frame"  // 引入组件
export default function(){
   
    const photo = {
   src:'https://take-saas.oss-cn-hangzhou.aliyuncs.com/wechat_applets/coach/bgcimg/bgc-13.png'}
    // 给组件传值
    return <Photo photo={
   photo}></Photo>
}

注意:这里可能会报错图片问题(网络图片需要加一下白名单才能正常加载,如下在next.config.mjs里面进行配置)

/** @type {import('next').NextConfig} */
const nextConfig = {
   
    images:{
   
        domains:['take-saas.oss-cn-hangzhou.aliyuncs.com'] // 这里是存放域名白名单处
    }
};

export default nextConfig;

然后就可以看到图片正常加载了

在这里插入图片描述

定义404页面

在app下面新建not-found.js,放入以下内容

export default function(){
   
    return <div className={
   "text-2xl text-pink-400"}>访问页面不存在...</div>
}

当页面访问一个不存在的页面路由时,页面显示效果如下

在这里插入图片描述

自定义页面网站标题(有利于SEO)

静态设置meta标签

在任意page.js内都按照下面这样写就行

export const metadata = {
   
    title: "我是list页面",  // 页面标题
    description: "list页面描述",  // 页面描述
    keywords:"list页面,nextjs开发,测试页面"  // 关键词
  };
export default function(){
   
    return <div>list</div>
}

只要在页面内部导出metadata 即可,里面写好网站title和描述信息,这是一种约束,nextjs默认你导出这个就是设置title和描述的
效果图

在这里插入图片描述

动态设置meta标签

例如我在app/list/[id]/page.js加入以下代码

export async function generateMetadata({
    params,searchParams}){
   
    // 这个方法是异步方法
    return {
   
      title:`这是动态参数:${
     params.id}-${
     searchParams.name}`,  // 这个id其实就是动态路由的动态参数,跟下面的页面接收到的params值一样
    }
  }

export default async function({
    params,searchParams}){
   
    await new Promise((resolve) => setTimeout(resolve, 2000));
    return <div>动态参数的值为{
   params.id},query动态的搜索参数为{
   searchParams.name}</div>
}

在页面输入地址localhost:3000/list/3?name=xiaoji,效果如下:

在这里插入图片描述

编写Api接口

静态路径

在app下面新建api文件夹,在里面新建goods文件夹在里面再次新建route.js文件,放入以下内容
主意api文件夹一定是要放到app文件夹下面的,并且接口文件都是route.js命名跟page.js一样是约定名称,固定的

import {
    NextRequest,NextResponse } from "next/server";

export const GET = ()=>{
   
    return NextResponse.json({
   
        succes:true,
        errorMessage:"获取数据",
        data:{
   }
    })
}

重启项目访问http://localhost:3000/api/goods,效果如下

在这里插入图片描述

动态路径

在app下面新建api文件夹,在里面新建goods文件夹,再新建[id]文件夹,在里面再次新建route.js文件,放入以下内容

import {
    NextRequest,NextResponse } from "next/server";

export const GET = (req,{
    params})=>{
   
    return NextResponse.json({
   
        succes:true,
        errorMessage:"获取单条记录"+params.id,
        data:{
   }
    })
}

浏览器访问:http://localhost:3000/api/goods/123

在这里插入图片描述

发送接口请求

注意:在app文件夹下面所有文件夹名字前面带_的都不会被自动解析为路由

  1. 在app/list下面新建_components作为组件文件夹,在里面新建list.js写客户端组件进行发请求,代码如下:
"use client"
import {
    useEffect,useState } from "react"
export default function(){
   
    const [data,setData] = useState([]) 
    useEffect(()=>{
   
        fetch("api/goods").then((res)=>res.json()).then((res)=>{
   
            setData(res.data)
        })
    },[])
    return <div>
        <ul>
            {
   
                data.map((item,index)=>{
   
                    return <li key={
   item.id}>{
   item.name}</li>
                })
            }
        </ul>
    </div>
}
  1. 在app/list/page.js里面引入组件
import List from "./_components/list";

export default function(){
   
    return <List></List>
}
  1. 访问http://localhost:3000/list,效果图如下

在这里插入图片描述

数据库引入

在前端使用这个用于操作数据库的库https://www.prisma.io/

1.安装库

yarn add prisma --save-dev
// 下面这个安装官网没有,但是我报了一个错误是因为没有这个模块导致的,如果跟我一样报错的话就手动安装一下
yarn add @prisma/client

2.初始化数据库(sqlite数据库)

npx prisma init --datasource-provider sqlite

3.在schema.prisma文件内新增一个model模型,也就是表

// This is your Prisma schema file,
// learn more about it in the docs: https://pris.ly/d/prisma-schema

generator client {
   
  provider = "prisma-client-js"
}

datasource db {
   
  provider = "sqlite"
  url      = env("DATABASE_URL")
}

// 新增如下
model Goods{
   
  id String @id @unique @default(uuid())
  name String
  desc String @default("")
  content String @default("") 
  createAt DateTime @default(now()) @map("create_at") // @map起别名,默认当前时间
  updateAt DateTime @updatedAt @map("update_at")
  @@map("products") // 表名
}

4.生成数据库(项目下终端执行命令)

npx prisma db push

5.这时候就会看到prisma下面多了一个dev.db数据库文件了

6.使用数据库软件navicat打开这个数据库就可以发现刚刚我们新建的表

在这里插入图片描述

7.连接数据库(在prisma官网搜Solution这个关键词,下面这段代码即可,也可以直接复制我的也是一样的)

app同级位置新建文件db.js放入以下内容

import {
    PrismaClient } from '@prisma/client'

const prismaClientSingleton = () => {
   
  return new PrismaClient()
}

const prisma = globalThis.prismaGlobal ?? prismaClientSingleton()

export default prisma

if (process.env.NODE_ENV !== 'production') globalThis.prismaGlobal = prisma

8.将刚刚的/api/good/route.js文件做修改,做两个接口,新增和修改,代码如下

import {
    NextRequest,NextResponse } from "next/server";
import prisma from '@/db'
export const GET = async ()=>{
   
    // 查询数据,根据时间倒序排序
    // 创建的模型名称小写的(goods)
    const data =await prisma.goods.findMany({
   
        orderBy:{
   
            createAt:"desc",
        }
    })
    return NextResponse.json({
   
        succes:true,
        successMessage:"获取数据成功",
        data
    })
}

// 新增数据
export const POST = async (req)=>{
   
    const data = await req.json() // 获取请求体中传递的json数据
    await prisma.goods.create({
   
        data,
    })
    return NextResponse.json({
   
        succes:true,
        successMessage:"创建数据成功",
        data:{
   }
    })
}

9:使用apiFox等工具添加数据(post请求,端口号3000)

接口地址为:http:localhost:3000/api/goods
参数:点击body->json->输入{name:‘萧寂’}
发请求:点击send

在这里插入图片描述

10:数据创建成功后刷新下数据库,使用数据库软件查看数据

在这里插入图片描述

11:在浏览器访问上面发送接口请求的那个页面,看看是否显示了数据

访问:http:localhost:3000/list
在这里插入图片描述
可以发现,数据确实被加进来了,至此添加和查询数据的接口准备完毕

项目阶段(做个管理后台)

引入Antd组件库

官方网站
安装

yarn add antd

随便找个页面放入antd组件查看页面是否有效果,我这里在app/page.js放入以下内容

import React from 'react';
import {
    DatePicker } from 'antd';

const App = () => {
   
  return <DatePicker />;
};

export default App;

浏览器访问:http://localhost:3000/
效果图

在这里插入图片描述
这样就代表组件库已经引入进来了

但是如果发现样式和antd样式不一致,就是tailwindcss和其样式冲突了,我们需要在tailwind.config.js进行配置

/** @type {import('tailwindcss').Config} */
module.exports = {
   
  content: [
    "./pages/**/*.{js,ts,jsx,tsx,mdx}",
    "./components/**/*.{js,ts,jsx,tsx,mdx}",
    "./app/**/*.{js,ts,jsx,tsx,mdx}",
  ],
  theme: {
   
    extend: {
   
      backgroundImage: {
   
        "gradient-radial": "radial-gradient(var(--tw-gradient-stops))",
        "gradient-conic":
          "conic-gradient(from 180deg at 50% 50%, var(--tw-gradient-stops))",
      },
    },
  },
  plugins: [],
  corePlugins:{
   
    preflight:false  // 新增,页面就正常了
  }
};

项目结构搭建和配置

在app下面新建admin文件夹

在admin下面新建_components/AntdAdmin.js组件作为管理系统主页面容器,内容如下(这个后台管理布局直接从antd组件库的layout直接复制粘贴来的)

"use client";
import {
   Button, Layout, Menu, theme } from "antd";
import "antd/dist/reset.css";
import {
   
  MenuFoldOutlined,
  MenuUnfoldOutlined,
  UploadOutlined,
  UserOutlined,
  VideoCameraOutlined,
} from "@ant-design/icons";
import {
    useState } from "react";
const {
    Header, Sider, Content } = Layout;
export default function ({
     children }) {
   
  const [collapsed, setCollapsed] = useState(false);
  const {
   
    token: {
    colorBgContainer, borderRadiusLG },
  } = theme.useToken();
  return (
    // 设置语言包
    <>
      <Layout style={
   {
   height:'100vh'}}>
        <Sider trigger={
   null} collapsible collapsed

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

盲盒抽卡机小程序的特点,互联网下市场发展前景

近几年&#xff0c;盲盒抽卡成为了年轻人的新宠&#xff0c;也受到了未成年人的喜爱&#xff0c;卡牌的内容更是丰富多样&#xff0c;涵盖了动漫、漫画、影视等&#xff0c;因此吸引了各类消费者和越来越多的创业者。 目前&#xff0c;随着市场的发展&#xff0c;抽卡机小程序…

2024HW面试 中高级面试面经背诵笔记(持续更新)

常见数据库的端口&#xff0c;Vnc的端口等 参考答案地址&#xff1a;常见数据库默认端口号_数据库端口-CSDN博客 MySQL 3306 Oracle 1521 DB2 5000 PostgreSQL 5432 MongoDB 27017 Redis 6379 SQL Server 1433 vnc的端口是&#xff1a;5900 推荐一个很好的护网笔记&#xff…

代码随想录刷题笔记-哈希表篇

文章目录 242 有效的字母异位词(easy)力扣地址题目描述题目实例解题思路代码实现 383 赎金信(easy)力扣地址题目描述题目实例解题思路代码实现 49 字母异位词分组(mid)力扣地址题目描述题目实例解题思路代码实现 438 找到字符串中所有字母异位词(mid)力扣地址题目描述题目实例解…

802.11漫游流程简单解析与笔记_Part1

最近在进行和802.11漫游有关的工作&#xff0c;需要对wpa_supplicant认证流程和漫游过程有更多的了解&#xff0c;所以通过阅读论文等方式&#xff0c;记录整理漫游相关知识。Part1将记录802.11漫游的基本流程、802.11R的基本流程、与认证和漫游都有关的三层秘钥基础。Part1将包…

Leetcode3040. 相同分数的最大操作数目 II

Every day a Leetcode 题目来源&#xff1a;3040. 相同分数的最大操作数目 II 解法1&#xff1a;记忆化搜索 第一步可以做什么&#xff1f;做完后&#xff0c;剩下要解决的问题是什么&#xff1f; 删除前两个数&#xff0c;剩下 nums[2] 到 nums[n−1]&#xff0c;这是一个…

AIGC之MetaHuman:HeyGen(基于AI驱动的视频生成平台+数字人)的简介、安装和使用方法、案例应用之详细攻略

AIGC之MetaHuman&#xff1a;HeyGen(基于AI驱动的视频生成平台数字人)的简介、安装和使用方法、案例应用之详细攻略 目录 HeyGen的简介 1、HeyGen是一款AI视频生成平台&#xff0c;它提供以下关键功能&#xff1a; HeyGen的安装和使用方法 1、使用方法 01创建或选择一个头…

2003远程桌面端口修改,远程桌面端口修改的方法有哪些

方法一&#xff1a;通过修改注册表 1、打开注册表编辑器&#xff1a; 打开“开始”菜单&#xff0c;点击“运行”&#xff0c;输入“regedit”&#xff0c;然后按下“Enter”键。 2、导航到远程桌面服务的注册表项&#xff1a; 依次展开以下路径&#xff1a; HKEY_LOCAL_M…

【Qt】Qt常见的数据类型

思维导图 学习目标 一、基础类型 因为Qt是一个C的框架&#xff0c;因此C的语法和数据类型在Qt中都是被支持的&#xff0c;但是Qt中也是定义了一些属于自己的数据类型&#xff0c;不过&#xff0c;好多数据类型都是对C的数据类型进行封装&#xff0c;下面来简要介绍一下这些基…

6.切蛋糕

上海市计算机学会竞赛平台 | YACSYACS 是由上海市计算机学会于2019年发起的活动,旨在激发青少年对学习人工智能与算法设计的热情与兴趣,提升青少年科学素养,引导青少年投身创新发现和科研实践活动。https://www.iai.sh.cn/problem/71 题目描述 一个圆型的蛋糕,切 𝑛n 刀…

Rust-06-所有权

所有权&#xff08;系统&#xff09;是 Rust 最为与众不同的特性&#xff0c;它让 Rust 无需垃圾回收即可保障内存安全&#xff0c;下面是所有权以及相关功能&#xff1a;借用&#xff08;borrowing&#xff09;、slice 以及 Rust 如何在内存中布局数据。 通过所有权系统管理内…

JDBC学习笔记(二)进阶篇

一、JDBC 扩展 1.1 实体类和ROM 实体类代码&#xff1a; package com.atguigu.advanced.pojo;//类名就是数据库表的 t_ 后面的单词全写 public class Employee {private Integer empId;//emp_idprivate String empName;//emp_nameprivate Double empSalary;//emp_salarypriva…

FL Studio 21.2.3.4004官方中文破解版下载安装激活教程重磅发布含注册机

今天带来的是FL Studio 21中文版&#xff0c;内置破解补丁&#xff0c;可以完美激活程序。所有功能均可在线编辑&#xff0c;用户可直接操作。同时&#xff0c;因为FL Studio 21是最新版本&#xff0c;所以增加了新的功能。共有八种乐器和效果器插件&#xff0c;包括效果链、音…

在开源处理器架构RISC-V中发现可远程利用的中危漏洞

在RISC-V SonicBOOM处理器设计中发现中度危险的漏洞 最近&#xff0c;西北工业大学的网络空间安全学院胡伟教授团队在RISC-V SonicBOOM处理器设计中发现了一个中度危险的漏洞。这个团队的研究人员发现了一个可远程利用的漏洞&#xff0c;该漏洞存在于开源处理器架构RISC-V中。…

Redis系列-4 Redis集群介绍

Redis集群 Redis提供了持久化能力&#xff0c;保证了重启不会丢失数据&#xff1b;但Redis重启至完全恢复期间&#xff0c;缓存不可用。另外&#xff0c;对于高并发场景下&#xff0c;单点Redis服务器的性能不能满足吞吐量要求&#xff0c;需要进行横向扩展。此时&#xff0c;…

【适配鸿蒙next】Flutter 新一代混合栈管理框架

前言 据最新消息显示&#xff0c;华为今年下半年将全面转向其自主平台HarmonyOS&#xff0c;放弃Android系统。 报道中提到&#xff0c;下一版HarmonyOS预计将随华为即将推出的Mate 70旗舰系列一起发布。 据悉&#xff0c;HarmonyOS Next 已经扩展到4000个应用程序&#xff0c;…

【Python学习1】matplotlib和pandas库绘制人口数变化曲线

✍&#x1f3fb;记录学习过程中的输出&#xff0c;坚持每天学习一点点~ ❤️希望能给大家提供帮助~欢迎点赞&#x1f44d;&#x1f3fb;收藏⭐评论✍&#x1f3fb;指点&#x1f64f; 一、Python库说明 Matplotlib Matplotlib是一个功能强大的Python 2D绘图库&#xff0c;它允…

【实战项目二】Python爬取豆瓣影评

目录 一、环境准备 二、编写代码 一、环境准备 pip install beautifulsoup4 pip intall lxml pip install requests我们需要爬取这些影评 二、编写代码 我们发现每个影评所在的div的class都相同&#xff0c;我们可以从这入手 from bs4 import BeautifulSoup import request…

修改云主机配置 - 内存增容

文章目录 一、修改云主机配置缘由二、修改云主机配置步骤1、查看云主机概述2、查看master云主机3、更改master云主机配置4、查看master云主机 三、使用Spark Shell玩Saprk SQL1、启动HDFS服务2、启动Spark集群3、启动集群模式Spark Shell4、读取文件生成单例数据帧5、将单列数据…

给浮躁的面试者一个建议

哈喽&#xff0c;大家好&#xff0c;我叫人宅&#xff0c;关于找工作&#xff0c;大家心态非常浮躁&#xff0c;尤其是零零后&#xff0c;或者是九五后。本次为大家分享一下关于就业问题和就业态度。 我讲解的这些其实适合所有高科技行业。我这边就拿程序员为例。 如果你是刚毕…

Python Mistune库:Markdown解析和处理

更多Python学习内容&#xff1a;ipengtao.com Mistune是一个用于Python的快速且功能强大的Markdown解析库。它以其高性能和灵活性著称&#xff0c;能够轻松扩展和定制。Mistune支持标准的Markdown语法&#xff0c;并且可以通过插件扩展支持更多功能&#xff0c;例如数学公式、高…