vue-ts-demo

news2024/11/15 9:49:01

 npm i -g @vue/cli

PS D:\kwai\vue3\project> vue create vue3-te-demo

element-plus

一个 Vue 3 UI 框架 | Element Plus

https://element-plus.org/zh-CN/guide/installation.html

安装:

npm install element-plus --save

完整引入使用:

使用:

按需引入使用

首先你需要安装unplugin-vue-components 和 unplugin-auto-import这两款插件

shell

npm install -D unplugin-vue-components unplugin-auto-import

修改vue.config.js中的内容为:

const { defineConfig } = require('@vue/cli-service')
const AutoImport = require('unplugin-auto-import/webpack')
const Components = require('unplugin-vue-components/webpack')
const { ElementPlusResolver } = require('unplugin-vue-components/resolvers')

module.exports = defineConfig({
  transpileDependencies: true,
  configureWebpack:{
    plugins: [
      AutoImport({
        resolvers: [ElementPlusResolver()],
      }),
      Components({
        resolvers: [ElementPlusResolver()],
      }),
    ],
  }
})

如果报错:RROR  TypeError: AutoImport is not a function TypeError,则需要降版本:

ERROR TypeError: AutoImport is not a function TypeError: AutoImport is not a-CSDN博客

使用:

重启项目

快速生成模版快捷键

登录页面

表单:

解决外边距塌陷:

css解决外边距塌陷的7种方法_css外边距塌陷-CSDN博客

 内容:

<template>
    <div class="login-box">
        <el-form
        ref="ruleFormRef"
        :model="ruleForm"
        status-icon
        :rules="rules"
        label-width="80px"
        class="demo-ruleForm"
        >
            <h2>后台管理系统</h2>
            <el-form-item label="姓名" prop="name">
            <el-input v-model="ruleForm.name"  type="name" autocomplete="off" />
            </el-form-item>
            <el-form-item label="密码" prop="pass">
            <el-input v-model="ruleForm.pass"  type="password" autocomplete="off" />
            </el-form-item>

            <el-form-item>
            <el-button  class="login-btn" type="primary" @click="submitForm(ruleFormRef)"
                >登录</el-button
            >
            <el-button class="login-btn" @click="resetForm(ruleFormRef)">重置</el-button>
            </el-form-item>
        </el-form>
    </div>
</template>

<script setup lang="ts">
import { reactive, ref } from 'vue'
import type { FormInstance, FormRules } from 'element-plus'

const ruleFormRef = ref<FormInstance>()

const rules = reactive<FormRules>({
  name: [
    {
      required: true,
      trigger: 'blur',
    },
    {
      min: 3,
      max: 5,
      message: 'Length should be 3 to 5',
      trigger: 'blur',
    },
  ],
  pass: [
    {
      required: true,
      trigger: 'blur',
    },
    {
      min: 3,
      max: 5,
      message: 'Length should be 6 to 8',
      trigger: 'blur',
    },
  ]
});



const ruleForm = reactive({
  pass: '',
  name: '',
})


const submitForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
      console.log('submit!')
    } else {
      console.log('error submit!')
      return false
    }
  })
}

const resetForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.resetFields()
}
</script>

<style scoped  lang="scss">
    .login-box{
        width: 100%;
        height: 100%;
        background:url("../assets/bg.png");
        padding: 1px;
        text-align: center;
        .demo-ruleForm{
            width: 500px;
            background-color: white;
            margin:100px auto;
            padding: 20px;
            border-radius: 20px;
        }

        .login-btn{
            width: 40%;

        }

        h2{
            margin-bottom: 16px;
        }
    }
</style>

使用ts对数据类型进行限制

新建一个文件夹type用于数据存放

export interface LoginForm{
    pass:string,
    name:string,
}

export class LoginData{
    ruleForm:LoginForm={pass:"",name:""}
}

在之前对pass name的数据定义中,并没有规范类型

在定义类型之后:双向绑定

登录请求

axios中文网|axios API 中文文档 | axios

 npm install axios --save-dev  

新建 request/index.ts    使用index.ts的好处

https://juejin.cn/post/7221004205271646245

index.ts

import axios from "axios";

const mockType = 'cbzMock'  // fastMock
const baseURL = mockType === 'cbzMock' ? 'https://mock.presstime.cn/mock/63569fbbbee0a00099ca48a1/api/vue-ts-mall-demo' : 'https://www.fastmock.site/mock/bf1fcb3c2e2945669c2c8d0ecb8009b8/api'
//创建axios实例
const service = axios.create({
    baseURL: baseURL,
    timeout: 5000,
    headers: {
        "Content-type" : "application/json;charset=utf-8"
    }
})

//请求拦截
service.interceptors.request.use((config) => {
    config.headers = config.headers || {}
    if(localStorage.getItem("token")){
        config.headers.token = localStorage.getItem("token") || ""
    }
    return config
})

//响应拦截
service.interceptors.response.use(({ data }) => {
    const code : number = data.data.code
    if(code != 200){
        return Promise.reject(data)
    }
    return data
},(err) => {
    console.log(err)
})

export default service

api.ts

import service from "@/request/index";
import {LoginData} from "@/type/login";

// 登录接口
export function login(data: LoginData) {
    return service({
        url: "/login",
        method: "POST",
        data
    })
}

// 商品列表接口
export function getGoodsList(){
    return service({
        url: "/getGoodsList",
        method: "GET"
    })
}

// 用户列表接口
export function getUserList(){
    return service({
        url: "/getUserList",
        method: "GET"
    })
}

// 角色列表接口
export function getRoleList(){
    return service({
        url: "/getRoleList",
        method: "GET"
    })
}

// 权限列表接口
export function getAuthorityList(){
    return service({
        url: "/getAuthorityList",
        method: "GET"
    })
}

登录操作

const submitForm = (formEl: FormInstance | undefined) => {
  if (!formEl) return
  formEl.validate((valid) => {
    if (valid) {
      console.log('submit!')
      //假装成功!
      login(ruleForm).then( (res)=>console.log(res) ).catch( (err)=>{ 
        console.log(err)
        //登录成功,切换到主页面
        router.replace({ name:'mainview'});
    }
    
    );
    } else {
      console.log('error submit!')
      return false
    }
  })
}

主页面


 

布局容器

https://element-plus.org/zh-CN/component/container.html

header 

<template>

    <div>
        main view
    </div>
    <div class="common-layout">
    <el-container>
      <el-header>
        <el-row :gutter="20">
            <el-col :span="4">   <img src="../assets/logo.png" alt="" class="icon-logo">  <div class="grid-content ep-bg-purple" /></el-col>
            <el-col :span="16"> <h2 class="title">后台管理系统</h2> <div class="grid-content ep-bg-purple" /></el-col>
            <el-col :span="4"> <span class="quit">退出登录</span>  <div class="grid-content ep-bg-purple" /></el-col>
        </el-row>

      </el-header>
      <el-container>
        <el-aside width="200px">Aside</el-aside>
        <el-main>Main</el-main>
      </el-container>
    </el-container>
  </div>

</template>

<script setup lang="ts">

</script>

<style scoped  lang="scss">
.el-header{
    height: 80px;
    background: #666;
    .icon-logo{
        height: 80px;
    }
    .title ,.quit{
        text-align: center;
        height: 80px;
        line-height: 80px;
    }

}
</style>

 height 和line-height 的设置https://www.cnblogs.com/pwindy/p/13026176.html

实现上下居中的对齐,如果不设置line-height ,。则会居上

Aside

如何实现侧边栏一直到底部:

<template>

    <div>
        main view
    </div>
    <div class="common-layout">
    <el-container>
      <el-header>
        <el-row :gutter="20">
            <el-col :span="4">   <img src="../assets/logo.png" alt="" class="icon-logo">  <div class="grid-content ep-bg-purple" /></el-col>
            <el-col :span="16"> <h2 class="title">后台管理系统</h2> <div class="grid-content ep-bg-purple" /></el-col>
            <el-col :span="4"> <span class="quit">退出登录</span>  <div class="grid-content ep-bg-purple" /></el-col>
        </el-row>

      </el-header>
      <el-container>
        <el-aside width="200px">
            <el-col :span="120">
                <el-menu
                    active-text-color="#ffd04b"
                    background-color="#545c64"
                    class="el-menu-vertical-demo"
                    default-active="2"
                    text-color="#fff"
                >
                    <el-menu-item index="2">
                    <el-icon><icon-menu /></el-icon>
                    <span>商品列表</span>
                    </el-menu-item>
                </el-menu>
            </el-col>
        </el-aside>
        <el-main>Main</el-main>
      </el-container>
    </el-container>
  </div>

</template>

<script setup lang="ts">
import {
  Menu as IconMenu,
  Setting,
} from '@element-plus/icons-vue'
const handleOpen = (key: string, keyPath: string[]) => {
  console.log(key, keyPath)
}
const handleClose = (key: string, keyPath: string[]) => {
  console.log(key, keyPath)
}
</script>

<style scoped  lang="scss">
.el-header{
    height: 80px;
    background: #666;
    .icon-logo{
        height: 80px;
    }
    .title ,.quit{
        text-align: center;
        height: 80px;
        line-height: 80px;
    }
}

.el-aside{
    .el-menu{

        height: calc(100vh - 80px);
    }

}
</style>

可以通过计算:100vh即 100%的垂直视口 - header高度80px

.el-aside{
    .el-menu{

        height: calc(100vh - 80px);
    }

}

动态路由

<template>
    <div class="common-layout">
    <el-container>
      <el-header>
        <el-row :gutter="20">
            <el-col :span="4">   <img src="../assets/logo.png" alt="" class="icon-logo">  <div class="grid-content ep-bg-purple" /></el-col>
            <el-col :span="16"> <h2 class="title">后台管理系统</h2> <div class="grid-content ep-bg-purple" /></el-col>
            <el-col :span="4"> <span class="quit">退出登录</span>  <div class="grid-content ep-bg-purple" /></el-col>
        </el-row>

      </el-header>
      <el-container>
        <el-aside width="120px">
                <el-menu
                    active-text-color="#ffd04b"
                    background-color="#545c64"
                    class="el-menu-vertical-demo"
                    default-active="2"
                    text-color="#fff"
                    router
                >
                <!--router开启路由模式 可以通过标签的index 进行跳转-->
                    <el-menu-item :index="item.path"    v-for="item in subRouterList" :key="item.path">
                    <span>{{item.meta.title}}</span>
                    </el-menu-item>
                </el-menu>
        </el-aside>
        <!--设置路由出口-->
        <el-main>  
            <router-view></router-view>
        </el-main>
      </el-container>
    </el-container>
  </div>

</template>

<script setup lang="ts">
import {
} from '@element-plus/icons-vue'

import { useRouter } from 'vue-router';
const router = useRouter();
const subRouterList = router.getRoutes().filter( v=>
v.meta.isShow)
console.log(subRouterList)

</script>

<style scoped  lang="scss">
.el-header{
    height: 80px;
    background: #666;
    .icon-logo{
        height: 80px;
    }
    .title ,.quit{
        text-align: center;
        height: 80px;
        line-height: 80px;
    }
}

.el-aside{
    .el-menu{
        height: calc(100vh - 80px);
    }
}

</style>

子路由设置:children

import { createRouter, createWebHistory, RouteRecordRaw } from 'vue-router'
import GoodsView from '@/views/GoodsView.vue'
import LoginView from '../views/LoginView.vue'
import MainView from '../views/MainView.vue'
import UserView from '@/views/UserView.vue'
const routes: Array<RouteRecordRaw> = [
  {
    path: '/mainview',
    name: 'mainview',
    component: MainView,
    children:[
      {
        path:'goods',
        name:'goods',
        meta:{
          isShow:true,
          title:"商品列表"
        },
        component:GoodsView
      },
      {
        path:'user',
        name:'user',
        meta:{
          isShow:true,
          title:"用户列表"
        },
        component:UserView
      }
    ]
  },
 {
    path: '/login',
    name: 'login',
    component:LoginView
  }
]

const router = createRouter({
  history: createWebHistory(process.env.BASE_URL),
  routes
})

export default router

商品页面

搜索

列表

分页展示

列表数据的获取:

数据定义:

export interface Goods{
    id:number,
    userId:number,
    title:string,
    introduce:string,
}

interface SelectData{
    id:number,
    userId:number,
    title:string,
    introduce:string,
    curPage:number,
    count:number,
    pageSize:number,
}

export class GoodsPages{
  // 被选择的数据, 查询时用
  selected_data:SelectData ={        
    userId: 0,
    id: 0,
    title: "",
    introduce: "",
    curPage: 1,
    count: 0,
    pageSize: 10};
  // 展示的商品数据
  goods_list: Goods[] = []
}

数据获取:

<script setup lang="ts">
import { computed, onMounted } from 'vue';
import { getGoodsList } from '@/request/api';
import {GoodsPages } from '@/type/goods';
import { reactive } from 'vue'

//定义数据
const goods_data = reactive(new GoodsPages())

//当前页数据
const curPagaData = reactive(  {
    comList:computed( ()=>{
        return goods_data.goods_list.slice((goods_data.selected_data.curPage-1)*10,goods_data.selected_data.curPage*10);
    })

} )
    
onMounted(  ()=>{
    console.log('onMounted');
     //请求数据
    getGoodsList()
        .then( (res)=>{   
            goods_data.goods_list = res.data.data;
            console.log('goodsList',goods_data.goods_list)     
        })
        .catch( (err)=>{
            console.log(err) 
        })
    }
)


</script>

分页展示逻辑:

<div>
          curPagaData.comList 是列表当前页展示的数据
        <el-table :data=curPagaData.comList border style="width: 100%">
            <el-table-column prop="id" label="id" width="180" />   使用列表中的字段与  每一列标题 
            <el-table-column prop="title" label="title" width="180" />
            <el-table-column prop="introduce" label="introduce" />
        </el-table>

         分页展示
        <el-pagination layout="prev, pager, next" 
        v-model:page-size=goods_data.selected_data.pageSize      页面的大小:设置为10
        v-model:current-page=goods_data.selected_data.curPage     当前是第几页
        :total=goods_data.goods_list.length />   总页数:是请求到的列表的总数
    </div>

查询逻辑

    <div class="select-box">
        <el-form :inline="true" :model="goods_data.selected_data" class="demo-form-inline">
           <el-form-item label="用户Title">
            <el-input v-model="goods_data.selected_data.title" placeholder="用户Title" clearable />
            </el-form-item>  
            <el-form-item>
            <el-button type="primary" @click="onSubmit">查询</el-button>
            </el-form-item>
        </el-form>

    </div>


//查询数据
const onSubmit = () => {
  console.log('submit! suc',goods_data.selected_data.title)
   //如果是空的,则使用原来的数据
   if (goods_data.selected_data.title === ''){
    goods_data.goods_list = last_data;
    goods_data.selected_data.curPage=1;
    return;
   }

  //过滤数据
  let filterArry:Goods[]=[];
  //过滤数据
  filterArry = goods_data.goods_list.filter( (value)=>{
    return value.title.indexOf(goods_data.selected_data.title) !== -1
  } );


  goods_data.goods_list = filterArry;
  goods_data.selected_data.curPage=1;
}



onMounted(  ()=>{
    getGoodsList()
        .then( (res)=>{   
            goods_data.goods_list = res.data.data;
            //记录当前的数据,用于恢复
            last_data = goods_data.goods_list;
            console.log('goodsList',goods_data.goods_list)     
        })
        .catch( (err)=>{
            console.log(err) 
        })
    }
)

用户列表

展示

自定义列模版:展示用户角色

 <template #default="scope">
                <el-text class="mx-1"   v-for="item in scope.row.role"  :key="item.role"> {{item.roleName +" "}}</el-text>         

选择器 

数据定义:

/*
获取用户列表接口 GET  /getUserList
请求报文:无
响应报文:
{
    "data": {
        "code": 200,
        "data": [
            {
                "id": 1,
                "nickName": "小明",
                "userName": "小明",
                "role": [
                    {
                        "role": 1,
                        "roleName": "管理员"
                    },
                    {
                        "role": 2,
                        "roleName": "普通用户"
                    }
                ]
            },
            {
                "id": 2,
                "nickName": "红红",
                "userName": "红红",
                "role": [
                    {
                        "role": 1,
                        "roleName": "管理员"
                    }
                ]
            },
            {
                "id": 3,
                "nickName": "绿绿",
                "userName": "绿绿",
                "role": [
                    {
                        "role": 2,
                        "roleName": "普通用户"
                    }
                ]
            }
        ]
    }
}

获取角色列表接口 GET  /getRoleList
请求报文:无
响应报文:
{
    "data": {
        "code": 200,
        "data": [
            {
                "roleName": "管理员",
                "roleId": 1,
                "authority": [
                    1,
                    2,
                    4,
                    5,
                    6,
                    7,
                    8,
                    9,
                    11,
                    13,
                    14,
                    15,
                    16
                ]
            },
            {
                "roleName": "普通用户",
                "roleId": 2,
                "authority": [
                    1,
                    3,
                    4,
                    6,
                    7,
                    8,
                    9,
                    11,
                    12,
                    13
                ]
            }
        ]
    }
}

*/

interface RoloInfo{
    role:number,
    roleName:string,
}

interface UserInfo{
    id:number,
    nickName:string,
    userName:string
    role:RoloInfo[],
}

interface RoleType{
    roleName:string,
    roleId:number,
    authority:Array<number>[],
}


interface QueryUser{
    nickName: string,  // 用户别名
    role: number  // 角色编号
}

export class UserPage{
    roleList:RoleType[]=[];
    userList:UserInfo[]=[];
    selectedData:QueryUser={nickName:'',role:0}
}

vue:

<template>
    <div class="select-box">
        <el-form :inline="true" :model="userPage.selectedData" class="demo-form-inline">
           <el-form-item label="用户Title">
            <el-input v-model="userPage.selectedData.nickName" placeholder="用户nickName" clearable />
            </el-form-item> 
            <el-form-item label="用户roleid">
                <el-select v-model="userPage.selectedData.role" placeholder="全部" style="width: 240px">
                    <el-option
                        :key="0"
                        label="全部"
                        :value="0"
                    />
                    <el-option
                        v-for="item in userPage.roleList"
                        :key="item.roleId"
                        :label="item.roleName"
                        :value="item.roleId"
                    />
                </el-select>
            </el-form-item>           
            <el-form-item>
            <el-button type="primary" @click="onSubmit">查询</el-button>
            </el-form-item>
        </el-form>

    </div>

    <div>
        <el-table :data=userPage.userList border style="width: 100%">
            <el-table-column prop="id" label="编号" width="180" />
            <el-table-column prop="nickName" label="用户昵称" width="180" />
            <el-table-column prop="role" label="用户角色" >
                <template #default="scope">
                <el-text class="mx-1"   v-for="item in scope.row.role"  :key="item.role"> {{item.roleName +" "}}</el-text>             
 
                </template>
            </el-table-column>
        </el-table>

    </div>
</template>

<script setup lang="ts">
import { getRoleList, getUserList } from '@/request/api';
import { UserInfo, UserPage } from '@/type/userinfo';
import { onMounted, reactive } from 'vue';

const userPage = reactive(new UserPage())
let lastUserList:UserInfo[]=[];

onMounted(()=>{
    getUserList().then(

    (res)=>{
        userPage.userList = res.data.data;
        lastUserList =userPage.userList;
        console.log("userList",userPage.userList);
    }
    )

    getRoleList().then(
        (res)=>{
            userPage.roleList =res.data.data;
            console.log("roleList",userPage.roleList);
        }
    )
})


const onSubmit=()=>{
    console.log('onsubmit',userPage.selectedData.role,userPage.selectedData.nickName);
    if (userPage.selectedData.role===0&& userPage.selectedData.nickName===''){

        userPage.userList = lastUserList;
        return;
    }

    let list:UserInfo[]= userPage.userList.filter(
    (value)=>{
        let found = false;

        if (userPage.selectedData.role===0){
            return value.nickName.indexOf(userPage.selectedData.nickName)!=-1;

        }

        if (userPage.selectedData.nickName===''){
            for(let i=0;i<value.role.length;++i){
                if (value.role[i].role === userPage.selectedData.role){
                    return true;
                }

            }
        }

        if (value.nickName.indexOf(userPage.selectedData.nickName)!=-1){
            for(let i=0;i<value.role.length;++i){
                if (value.role[i].role === userPage.selectedData.role){
                    return true;
                }

            }

        }
        return found;
    }

    );


    userPage.userList = list;
}

</script>

<style scoped>

</style>

编辑

编辑按钮

           <el-table-column prop="role" label="操作" >
                <template #default="scope">
                    <el-button type="primary"  @click="handleEditUser(scope.row)">编辑</el-button>
                </template> 
            </el-table-column>

弹出编辑框


    <!-- 编辑用户的弹出窗-->
  <el-dialog v-model="userPage.editShow" title="编辑用户信息">
    <el-form :model="userPage.editUser">
      <el-form-item label="用户昵称" label-width="120px">
        <el-input v-model="userPage.editUser.nickName" autocomplete="off" />
      </el-form-item>

      <el-form-item label="用户角色" label-width="120px">
        <el-select multiple v-model="userPage.editUser.role" class="m-2" size="large" placeholder="请选择角色">
          <el-option
              v-for="item in userPage.roleList"
              :key="item.roleId"
              :label="item.roleName"
              :value="item.roleId"
          />
        </el-select>
      </el-form-item>

    </el-form>
    <template #footer>
      <span class="dialog-footer">
        <el-button @click="userPage.editShow = false">取消</el-button>
        <el-button type="primary" @click="ensureEditUser">修改</el-button>
      </span>
    </template>
  </el-dialog>

数据结构

// 用户编辑接口
export interface UserEdit {
    id: number,  // 用户id
    nickName: string,  // 用户昵称
    role: number[],   // 用户角色
    userName: string  // 用户名
}


export class UserPage{
    roleList:RoleType[]=[];
    userList:UserInfo[]=[];
    selectedData:QueryUser={nickName:'',role:0}

    editShow = false  // 是否显示编辑用户弹出窗
    // 编辑用户时用到的对象
    editUser: UserEdit = {
        id: 0,
        nickName: "",
        role: [],
        userName: ""
    }
}

// 编辑用户弹窗
const handleEditUser = (row: UserInfo) => {
    userPage.editShow = true
    userPage.editUser = {
        id: row.id,
        nickName: row.nickName,
        role: row.role.map((value) => value.role),
        userName: ""
      }
}

const ensureEditUser = () => {
    console.log(userPage.editUser)
    userPage.editShow = false;
    let obj= userPage.userList.find( (value)=>{ value.id === userPage.editUser.id})


    for(let i=0;i<userPage.userList.length;++i){
        if (userPage.editUser.id === userPage.userList[i].id){
            userPage.userList[i].nickName= userPage.editUser.nickName;
            userPage.userList[i].role =[];
            for(let item of userPage.roleList){
                if (userPage.editUser.role.find( (value)=>( value === item.roleId) )){
                    userPage.userList[i].role.push({
                        role:item.roleId,
                        roleName:item.roleName
                    })
                }
            }
        }
    }

 
   console.log(userPage.userList)  
}

查询

let lastUserList:UserInfo[]=[];
const onSubmit=()=>{
    console.log('onsubmit',userPage.selectedData.role,userPage.selectedData.nickName);
    if (userPage.selectedData.role===0&& userPage.selectedData.nickName===''){

        userPage.userList = lastUserList;
        return;
    }

    let list:UserInfo[]= userPage.userList.filter(
    (value)=>{
        let found = false;

        if (userPage.selectedData.role===0){
            return value.nickName.indexOf(userPage.selectedData.nickName)!=-1;

        }

        if (userPage.selectedData.nickName===''){
            for(let i=0;i<value.role.length;++i){
                if (value.role[i].role === userPage.selectedData.role){
                    return true;
                }

            }
        }

        if (value.nickName.indexOf(userPage.selectedData.nickName)!=-1){
            for(let i=0;i<value.role.length;++i){
                if (value.role[i].role === userPage.selectedData.role){
                    return true;
                }

            }

        }
        return found;
    }

    );


    userPage.userList = list;
}

代码

通过百度网盘分享的文件:src.zip
链接:https://pan.baidu.com/s/1p9YR2W0-DuIZs1_UJwDh6g?pwd=kdhs 
提取码:kdhs

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

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

相关文章

AI大模型微调实战训练营,文旅对话 知识库 大模型实战(模型参数微调)

一、引言 随着人工智能技术的飞速发展&#xff0c;AI大模型在各个领域的应用日益广泛。其中&#xff0c;大模型微调作为一种强大的工具&#xff0c;能根据特定任务定制化模型性能&#xff0c;尤其在自然语言处理&#xff08;NLP&#xff09;中&#xff0c;文旅对话和知识库构建…

eclipse使用 笔记02

创建一个项目&#xff1a; 【File-->New-->Dynamic Web Project】 进入页面&#xff1a; Project name为项目命名 Target runtime&#xff1a;选择自己所对应的版本 finish创建成功&#xff1a; 创建成功后的删除操作&#xff1a; 创建前端界面&#xff1a; 【注意&a…

二叉树的层序遍历 II

题目链接 二叉树的层序遍历 II 题目描述 注意点 树中节点数目在范围 [0, 2000] 内-1000 < Node.val < 1000 解答思路 根据队列先进先出的特点层序遍历所有的节点&#xff08;从左到右&#xff09;&#xff0c;又因为需要自底向上的输出层序遍历的结果&#xff0c;所…

2-100 基于matlab的水果识别

基于matlab的水果识别。从面积特征、似圆形特征&#xff0c;颜色(rgb值和hsv值)特征对图像中的梨子、苹果、桃子、香蕉和菠萝进行特征提取&#xff0c;边缘检测识别&#xff0c;最后按照筛选出来的特征对水果进行识别。程序已调通&#xff0c;可直接运行。 下载源程序请点链接…

机器学习算法与实践_03概率论与贝叶斯算法笔记

1、概率论基础知识介绍 人工智能项目本质上是一个统计学项目&#xff0c;是通过对 样本 的分析&#xff0c;来评估/估计 总体 的情况&#xff0c;与数学知识相关联 高等数学 ——> 模型优化 概率论与数理统计 ——> 建模思想 线性代数 ——> 高性能计算 在机器学…

EI-BISYNCH协议,欧陆2000系列设备读取数据

EI-Bisynch是一种基于ANSI X3.28-2.5 A4标准的专有协议&#xff0c;用于消息框架。尽管其名称中包含“Bisynch”&#xff0c;但它实际上是一种基于ASCII的异步协议。数据通过7位数据位、偶校验和1个停止位进行传输。 4.1 术语解释 4.1.1 地址 每个仪器都有一个可配置的地址&…

Leetcode面试经典150题-172.阶乘后的零

给定一个整数 n &#xff0c;返回 n! 结果中尾随零的数量。 提示 n! n * (n - 1) * (n - 2) * ... * 3 * 2 * 1 示例 1&#xff1a; 输入&#xff1a;n 3 输出&#xff1a;0 解释&#xff1a;3! 6 &#xff0c;不含尾随 0示例 2&#xff1a; 输入&#xff1a;n 5 输出&a…

linux之mysql安装

1:mysql安装包下载 下载地址 可私信我直接获取安装包 2:linux下wget命令下载 下载地址 wget https://dev.mysql.com/get/Downloads/MySQL-5.7/mysql-5.7.24-linux-glibc2.12-x86_64.tar.gz3:手动安装 将自己的安装包上传到对应的位置 解压 压缩包 使用命令 tar -zxvf mysql-5.7…

chorme浏览器 您的连接不是私密连接

‌当浏览器显示“您的连接不是私密连接&#xff0c;攻击者可能会试图从 localhost 窃取您的信息&#xff08;例如&#xff1a;密码、消息或信用卡信息&#xff09;”的警告时&#xff0c;这通常意味着您正在尝试访问的网站的安全证书存在问题&#xff0c;可能是因为它使用的是自…

Windows安装启动:stable-diffusion-webui,AIGC大模型文生图、文生视频,Python

Windows安装启动:stable-diffusion-webui&#xff0c;AIGC大模型文生图、文生视频&#xff0c;Python stable-diffusion-webui是github上的AIGC开源项目&#xff0c;地址&#xff1a; https://github.com/AUTOMATIC1111/stable-diffusion-webuihttps://github.com/AUTOMATIC1…

移动技术开发:简单文本编辑器

1 实验名称 简单文本编辑器 2 实验目的 掌握基本布局管理器的使用方法和基本控件的使用方法&#xff0c;以及事件监听处理的使用方法 3 实验源代码 布局文件代码&#xff1a; <?xml version"1.0" encoding"utf-8"?> <LinearLayout xmlns:an…

图片压缩格式自适应,真的很省流量!

导语 图片&#xff0c;作为信息传递的重要载体&#xff0c;其格式日益多样化。不管是 PC 端还是移动端&#xff0c;图片一直都是流量消耗的大户。在互联网的应用中&#xff0c;用户会上传大量的图片&#xff0c;而且访问频繁&#xff0c;如果这些图片都以传统方式存在服务器磁盘…

用AI制作专属欧美漫画头像!FLUX大模型-漫画情侣lora应用教程

​ ​ 新上线了一个漫画风格的lora《漫画情侣&#xff08;欧美黄金时代风&#xff09;v1.0》 感兴趣的朋友可以去下载使用&#xff0c;下载是免费的。 下面跟大家说一下这个lora的特点、使用方法以及这个lora的延伸应用&#xff1a;欧美漫画头像制作 lora风格特点 欧美漫画/人…

Leetcode面试经典150题-97.交错字符串

给定三个字符串 s1、s2、s3&#xff0c;请你帮忙验证 s3 是否是由 s1 和 s2 交错 组成的。 两个字符串 s 和 t 交错 的定义与过程如下&#xff0c;其中每个字符串都会被分割成若干 非空 子字符串 &#xff1a; s s1 s2 ... snt t1 t2 ... tm|n - m| < 1交错 是…

C++入门基础知识八

1.介绍new与delete 1.malloc和free是函数&#xff0c;new和delete是操作符 2.malloc申请的空间不会初始化&#xff0c;new可以初始化 3.malloc申请空间失败时&#xff0c;返回的是NULL&#xff0c;因此必须判空&#xff0c;new不需要&#xff0c;但是new需要捕获异常 4.申请…

【例题】lanqiao4403 希尔排序模板题

插入排序每次只能将数据移动一位。 已知插入排序代码为&#xff1a; def insert_sort(a):for i in range(1,len(a)):ji-1while j>0 and a[j]>a[i]:a[j1]a[j]j-1a[j1]a[i]return a希尔排序在插入排序的基础上&#xff0c;将数据移动n/2,n/4,…,1位。 for i in range(ga…

某东不固定大小旋转验证码识别

注意,本文只提供学习的思路,严禁违反法律以及破坏信息系统等行为,本文只提供思路 如有侵犯,请联系作者下架 旋转验证码基本是旋转小图到一定的角度去匹配大图的,通常的旋转验证码,中间缺口图部分大小固定,但是在某东上,大小不固定,部分数据集如下: 结合之前的旋转验证…

09.20 C++对C的扩充以及C++中的封装、SeqList

SeqList.h #ifndef SEQLIST_H #define SEQLIST_H#include <iostream> #include<memory.h> #include<stdlib.h> #include<string.h>using namespace std;//typedef int datatype; //类型重命名 using datatype int;//封装一个顺序表 class Seq…

.ipynb 图解介绍,轻松入门,提升效率

目录 01 使用jupyter遇到的问题1.1 Python requires ipykernel installed or requires an update 1.1.1 查询所有内核 1.1.2 选择对应的Python版本 02 理解jupyter规则 2.1 系统命令 01 使用jupyter遇到的问题 1.1 Python requires ipykernel installed or requires an up…

MyBatis 基本操作 - XML版

目录 配置xml文件 一&#xff0c;查询 - Select 1.1 全列查询 1.2 赋值问题 二&#xff0c;新增 - insert 2.1 使用对象插入 2.2 获取主键 三&#xff0c;删除 - delete 四&#xff0c;修改 - update 配置xml文件 <?xml version"1.0" encoding"U…