国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

前端之vue 根據(jù)菜單自動(dòng)生成路由(動(dòng)態(tài)配置前端路由)

這篇具有很好參考價(jià)值的文章主要介紹了前端之vue 根據(jù)菜單自動(dòng)生成路由(動(dòng)態(tài)配置前端路由)。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問(wèn)。

在需要權(quán)限控制的頁(yè)面,往往存在根據(jù)用戶來(lái)顯示菜單的情況,單獨(dú)根據(jù)用戶類型判斷顯然不是很好,如果后面用戶類型發(fā)生變化,項(xiàng)目修改維護(hù)可能就會(huì)比較麻煩,所以比較好的做法是根據(jù)后端返回的菜單動(dòng)態(tài)生成頁(yè)面路由,以達(dá)到完全權(quán)限控制的目的,并且若權(quán)限發(fā)生變化,僅需該配置數(shù)據(jù)即可

1.創(chuàng)建項(xiàng)目

首先用vue-cli3創(chuàng)建好項(xiàng)目

2.新建文件

創(chuàng)建好項(xiàng)目后,新建我們需要的文件。結(jié)構(gòu)如圖

前端動(dòng)態(tài)路由怎么配置,前端,前端,vue.js,javascript

在這里插入圖片描述

下載相關(guān)依賴包 :element-ui(菜單樣式用) 和 axios(獲取菜單用)

npm i element-ui axios --save

3.到main.js中

import Vue from 'vue'
import App from './App.vue'
import router from './router'
import elementUi from 'element-ui'
import 'element-ui/lib/theme-chalk/index.css'
Vue.use(elementUi)

Vue.config.productionTip = false

new Vue({
  router,
  render: h => h(App)
}).$mount('#app')

4.先把菜單組件寫(xiě)好,到menu.vue中

這里使用element-ui的el-menu組件

<template>
  <div class="menulist-inner">
    <el-menu
            default-active="/project"
            :default-openeds="openedMenu"
            background-color="rgba(44,55,71,1)"
            text-color="#A7BAC6"
            active-text-color="#FFFFFF"
            @select="select"
            unique-opened
            @open="open">
      <el-submenu :index="menu.path" v-for="(menu,index) in menus" :key="index">
        <template #title>
          <div class="menuTitlBox">
            <div class="rowBtween menuTitle">
              <div class="rowStart">
                <div class="iconBox" style="margin-right:10px;">
                  <i v-if="/icon/.test(menu.icon)" class="iconfont" :class="menu.icon" style="
                  color:#A7BAC6;font-size:16px;"></i>
                  
                </div>
                <span class="font16" :class="{whiteText:(!menu.children || !menu.children.length) && new RegExp(menu.path).test($route.path)}">{{menu.label}}</span>
              </div>
            </div>
            <div class="firstMenuBk" v-if="(!menu.children || !menu.children.length) && new RegExp(menu.path).test($route.path)"></div>
          </div>
        </template>
        <div class="menuItemBox rowEnd"
             v-for="(cMenu,cIndex) in menu.children"
             :key="cIndex"
             :class="{activeMenu:RegExp(cMenu.path).test($route.path)}"
             @click="select(cMenu)"
        >
          <span class="rowStart font14">{{cMenu.label}}</span>
        </div>
      </el-submenu>
    </el-menu>
  </div>
</template>

<script>
    import {mapState}from 'vuex'
    export default {
        name: "Menu",
        data() {
            return{
                menuMinHeight:0,//
                openedMenu:[],//展開(kāi)的菜單

            }
        },
        computed:{
            ...mapState(['menus'])
        },
        created(){
            let pathArr=this.$route.path.split('/')
            this.openedMenu=[`/${pathArr[1]}`]
        },
        async mounted() {

        },
        methods: {
            //中菜單
            select(cMenu){
                // console.log(cMenu)
                let {routeName}=cMenu
                this.$router.push({
                    name:routeName
                })
            },
            //菜單展開(kāi)
            open(index,indexPath){
                // console.log(indexPath)
                this.openedMenu=indexPath
                let menu=this.menus.filter(item=>item.path===index)
                // console.log(menu)
                let routeMenuInfo={}
                let time=0
                if(!menu[0] || !menu[0].children || !menu[0].children.length){
                    routeMenuInfo=menu[0]
                }else{
                    routeMenuInfo=menu[0].children[0]
                    time=500
                }
                let {path,}=routeMenuInfo
                // console.log(path)
                setTimeout(()=>{
                    this.$router.push(path)
                },time)
            },

        }
    }
</script>
<style lang="scss" scoped>
  .menulist-inner{
    min-height:calc(100vh - 50px);
    .menuItemBox{
      height:36px;
      &:hover{
        background:rgba(62,70,120,.4);
        &>span{
          color: #fff;
        }
      }
      span{
        color:#ffffff;
        flex-wrap:nowrap;
        width:150px;
        cursor:pointer;
      }
    }
    .activeMenu{
      background:rgba(62,70,120,1);
    }
  }
  .menuTitlBox{
    .menuTitle{
      position: relative;
      z-index: 10;
    }
    .firstMenuBk{
      position: absolute;
      left:0;
      top:50%;
      width:200px;
      height:56px;
      background:#3e4678;
      -webkit-transform: translateY(-50%);
      -moz-transform: translateY(-50%);
      -ms-transform: translateY(-50%);
      -o-transform: translateY(-50%);
      transform: translateY(-50%);
    }
    .whiteText{
      color:#ffffff;
    }
  }

</style>
<style>
  .el-submenu{
    position: relative;
  }
  .el-menu{
    border:none !important;
  }
  .el-submenu__icon-arrow{
    width:0;
    height:0;
    color:transparent;
  }
  .el-submenu__icon-arrow:before{
    content:'' !important;
  }
  .el-submenu__icon-arrow:before{
    content:'' !important;
  }
  .el-submenu__title{
    background:rgba(44,55,71,1) !important;
    margin-bottom:5px;
    height:46px !important;
    line-height: 46px !important;
  }

  .el-menu.el-menu--inline{
    background-color: rgba(0,0,0,.2) !important;
  }

  .menulist-inner .menuItemBox.rowEnd span{
    color: #A7BAC6;
  }
  .menulist-inner .menuItemBox.rowEnd.activeMenu span{
    color: #fff;
  }
</style>

5.注冊(cè)全局組件

將menu組件注冊(cè)為全局組件,方便需要的地方直接引入
到global-components.js文件中

/*
 全局組件引入注冊(cè)
  */

import Menu from "../global-components/menu" //菜單

export default {
    install(Vue) {
        Vue.component('Menu',Menu)
    }
};

6.到router文件夾寫(xiě)好路由模塊

6.1 base-router.js中寫(xiě)好我們需要的固定的路由
/**
 * 頁(yè)面上固定路由
 */
import Layout from '../views/layout/layout'
import Login from '../views/login/login'
import Loading from '../views/loading/loading'
const routes = [
    {
        path: '/',
        redirect: '/loading',
    },
    {
        path: '/layout',
        component:Layout,
        redirect: '/loading',
    },
    {
        path: '/login',
        name: 'Login',
        component: Login
    },
    {
        path: '/loading',
        name: 'Loading',
        component: Loading
    },
]
export default routes
6.2 lm-router.js中寫(xiě)動(dòng)態(tài)配置路由的方法
import {setUserRoutesData} from "../utils/global-methods";

const RouterPlugin = function() {
    this.$router = null
    this.$store = null
}
RouterPlugin.install = function(router, store) {
    this.$router = router
    this.$store = store
    this.$router.$lmRouter = {
        // 全局配置
        safe: this,
        // 動(dòng)態(tài)路由
        formatRoutes:function (routes) {
            let routers=setUserRoutesData(routes)
            this.safe.$router.addRoutes(routers)
            return routers
        }
    }
}
export default RouterPlugin
6.3 index.js中寫(xiě)路由入口
import Vue from 'vue'
import VueRouter from 'vue-router'
import baseRoutes from './base-router'
import store from '../store'
import LmRouter from './lm-router'


Vue.use(VueRouter)

const createRouter = () => {
    return new VueRouter({
        scrollBehavior (to, from, savedPosition) {
            if (savedPosition) {
                return savedPosition
            } else {
                return {
                    x: 0,
                    y: to.meta.savedPosition || 0
                }
            }
        },
        routes: [...baseRoutes],
        mode:'history',//
    })
}
let router = createRouter()
/**
resetRouter函數(shù)用于重置路由,每一次動(dòng)態(tài)配置路由之前要先重置路由
**/
export function resetRouter() {
    const newRouter = createRouter()
    router.matcher = newRouter.matcher // reset router
    LmRouter.install(router, store)
}
/**
當(dāng)用戶刷新頁(yè)面時(shí),路由數(shù)據(jù)會(huì)丟失,如果已經(jīng)登錄,需要重新渲染路由。渲染的路由數(shù)據(jù)在登錄時(shí)存在瀏覽器本地
**/
if(sessionStorage.getItem('hasLogin')){
    let sessionMenus=localStorage.getItem('menus')
    sessionMenus=sessionMenus ? JSON.parse(sessionMenus) : []
    let sessionRoutes=localStorage.getItem('userRoutes')
    LmRouter.install(router, store)
    sessionRoutes=sessionRoutes ? JSON.parse(sessionRoutes) : []
    router.$lmRouter.formatRoutes(sessionRoutes, true)
    store.dispatch('setUserRoutes',sessionRoutes)
    store.dispatch('setMenus',sessionMenus)
}

router.beforeEach((to, from, next) => {
    let hasLogin = sessionStorage.getItem('hasLogin')
    // console.log(to, from)
    if(to.name===from.name){
        return
    }
    console.log(hasLogin)
    if(to.name==='Login'){
        sessionStorage.clear()
        localStorage.clear()
        store.state.userRoutes=[]
        store.state.menus=[]
        next({replace:true})
        resetRouter()
        return
    }
    if (!hasLogin) {
        next({path: '/login',replace:true})
        return
    }
    next()

})
/**
 * 解決element-ui點(diǎn)擊同一個(gè)菜單報(bào)錯(cuò)
 * @type {VueRouter.push|*}
 */
const originalPush = VueRouter.prototype.push
VueRouter.prototype.push = function push(location) {
    return originalPush.call(this, location).catch(err => err)
}
export default router

7.容器頁(yè)和加載頁(yè)

大部分有二級(jí)菜單的頁(yè)面,父級(jí)頁(yè)面通常只需要路由跳轉(zhuǎn)功能,代碼一致,為了精簡(jiǎn)代碼,我們新建通用的路由容器頁(yè)面layout.vue,二級(jí)菜單路由頁(yè)面經(jīng)layout頁(yè)面跳轉(zhuǎn)

為避免用戶在瀏覽器直接輸入、粘貼路徑時(shí),或者直接訪問(wèn)頁(yè)面根路徑時(shí)找不到路由(因?yàn)橛脩艨赡芤呀?jīng)登錄了,但這是沒(méi)有已經(jīng)登錄界面),我們新建loading.vue,當(dāng)用戶粘貼路徑,或者訪問(wèn)根路徑時(shí),在loading.vue中渲染路由

7.1 layout.vue
<!--Layout-->
<template>
    <div>
        <header class="header">頭部</header>
        <div class="main">
            <div class="aside">
                <Menu/>
            </div>
            <div class="mainRight columnStart">
                <router-view></router-view>
            </div>
        </div>
    </div>
</template>

<script>
    export default {
        name: 'Layout',
    }
</script>
7.2 loading.vue
<!--加載頁(yè)面-->
<template>
    <div class="loadingBox">
        <div class="loadingContentbox columnCenter">
            <i class="el-icon-loading gray999"></i>
            <div class="gray999 font16">頁(yè)面加載中...</div>
        </div>

    </div>
</template>

<script>

    import {reqUserRoutes} from "../../api/common";
    import {setUserRoutesData,getAndFilterMenus,} from "../../utils/global-methods";

    export default {
        name: 'Loading',
        data() {
            return {}
        },
        computed: {},
        created(){
            let hasLogin = sessionStorage.getItem('hasLogin')
            if(!hasLogin){
                this.$router.replace('/login')
            }else{
                let menus=localStorage.getItem('menus')
                let userRoutes=localStorage.getItem('userRoutes')
                userRoutes=userRoutes ? JSON.parse(userRoutes) : []
                menus=menus ? JSON.parse(menus) : []
                if(!menus.length || !userRoutes.length){
                    this.getMenuRoutes()
                    return
                }
                let userInfo=getUserInfoFromLocalStorage()
                this.$store.dispatch('setUserInfo',userInfo)
                let {permissions=[]}=userInfo
                this.$store.dispatch('setPermissions',permissions)
                this.$router.replace((userRoutes[0] && userRoutes[0].path) ? userRoutes[0].path : '/404')
            }
        },
        methods: {
            //獲取菜單和路由
            async getMenuRoutes(){
                let userRoutes=await reqUserRoutes()
                console.log(userRoutes)
                let menus=getAndFilterMenus(JSON.parse(JSON.stringify(userRoutes)))
                if(!menus.length){
                    this.$router.replace('/login')
                    return
                }
                localStorage.setItem('userRoutes',JSON.stringify(userRoutes))
                localStorage.setItem('menus',JSON.stringify(menus))
                userRoutes=setUserRoutesData([...userRoutes])
                this.$store.dispatch('setUserRoutes',userRoutes)
                this.$store.dispatch('setMenus',menus)
                this.$router.addRoutes([...userRoutes])
                this.$router.replace((userRoutes[0] && userRoutes[0].path) ? userRoutes[0].path : '/404')
            }
        },

    }
</script>

<style scoped lang="scss">
    .loadingBox{
        .loadingContentbox{
            position: absolute;
            left:50%;
            top:50%;
            -webkit-transform: translate(-50%,-50%);
            -moz-transform: translate(-50%,-50%);
            -ms-transform: translate(-50%,-50%);
            -o-transform: translate(-50%,-50%);
            transform: translate(-50%,-50%);
            .el-icon-loading{
                font-size: 40px;
                margin-bottom:10px;
            }
        }
    }
</style>

8.寫(xiě)篩選菜單和路由的方法

utils,global-methods.js中寫(xiě)菜單篩選和路由數(shù)據(jù)方法
首先我們假設(shè)后端返回的數(shù)據(jù)為如下結(jié)構(gòu)(僅列出關(guān)鍵字段)

[
  {
    label:'人員管理',
    path:'/person',
    isLeftMenu:1,
    routeName:'Person',
    isContainer:1,
    children:[
     {
        label:'人員列表',
        path:'/person/person-list',
        routeName:'PersonList',
         isLeftMenu:1,
         component:'/person/person-list',
    },
     {
        label:'新增人員',
        path:'/person/person-add',
        routeName:'PersonAdd',
         component:'/person/person-add',
         isLeftMenu:0
     }
    ]
  },
    {
      label:'訂單管理',
      path:'/order',
      isLeftMenu:1,
      routeName:'Order',
       component:'/order/order',
      isContainer:0,
    }
]

其中 label 為菜單顯示標(biāo)題,path 是路由路徑,isLeftMenu用于區(qū)分是否為菜單,這里isLeftMenu=1表示是菜單,routeName路由名,isContainer用于區(qū)分路由是否經(jīng)過(guò)容器組件layout,這里isContainer=1表示使用layout容器,component用于指定組件引入的路徑
根據(jù)上面的數(shù)據(jù)結(jié)構(gòu),我們新建好對(duì)應(yīng)得vue文件
結(jié)構(gòu)如下圖:

在這里插入圖片描述

// 公共函數(shù)模塊,用import引用
// 根據(jù)日期時(shí)間值獲取字符串各是日期
import Layout from '../views/layout/layout'

//獲取并篩選菜單
export const getAndFilterMenus=(menus)=> {
    // console.log(menus)
    menus=hanldeChildAppRoute(menus)
    for(let i=0;i<menus.length;i++){
        delete menus[i].component
        //只有l(wèi)eLeftMeu=1的是菜單
        if(!parseInt(menus[i].isLeftMenu)){
            menus.splice(i,1)
            i--
        }
        if(menus[i] && menus[i].children){
            getAndFilterMenus(menus[i].children)
        }
    }
    return menus
}
//處理用戶路由數(shù)據(jù)
export const setUserRoutesData=(routes,isChild)=>{
    // console.log(routes)
    !isChild && (routes=hanldeChildAppRoute(routes))
    for(let i=0;i<routes.length;i++){
        let {component,isContainer,routeName,keepAlive}=routes[i]
        // console.log(routes[i])
        //如果指定使用路由容器組件layout,即isContainer=1,那么路由的component值就是Layout組件
        if(parseInt(isContainer)){
            routes[i].component=Layout
        }else{
        //不使用容器組件的,根據(jù)component用Import動(dòng)態(tài)引入
            routes[i].component= () => import( `../views${component}`)
        }
        routes[i].name=routeName
        /**
        如果有子路由,那就用遞歸繼續(xù)生成路由
        **/
        if((routes[i].children instanceof Array) && routes[i].children.length){
            setUserRoutesData(routes[i].children,isChild)
        }
    }
    return routes
}

9. 登錄成功后生成路由

最后看下登錄頁(yè),我們將在登錄成功后獲取菜單數(shù)據(jù),然后動(dòng)態(tài)生成頁(yè)面路由,并且通過(guò)Vue路由的addRoutes方法將路由添加到VueRouter中文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-847019.html

<template>
    <div class="login-wrap">
        <div class="loginContent">
            <div class="rowBtween loginFormBox">
                <el-form :model="loginForm" :rules="rules" ref="loginForm" class="loginForm">
                    <el-row class="loginTitleBox">
                        <span class="loginTitle font20">登錄/Login</span>
                    </el-row>
                    <el-row>
                        <lm-form-item-col :span="24" v-model.number="loginForm.username" prefix-icon="el-icon-user" placeholder="請(qǐng)輸入用戶名" prop="username" width="300"/>
                    </el-row>
                    <el-row>
                        <lm-form-item-col :span="24" type="password" v-model="loginForm.password" prefix-icon="el-icon-lock" placeholder="請(qǐng)輸入登錄密碼" prop="password" width="300"/>
                    </el-row>
                    <div class="rowCenter loginBtnBox" >
                        <div class="loginBtn rowCenter font16" @click="submitForm">
                            <span>登錄</span>
                            <div v-if="showLoading">
                                <span>中</span>
                                <i class="el-icon-loading"></i>
                            </div>
                        </div>
                    </div>
                </el-form>
            </div>
        </div>
    </div>
</template>
<script>
    import {mapState} from 'vuex'
    import axios from 'axios'
    import {reqUserRoutes} from "../../api/common";
    import {setUserRoutesData,getAndFilterMenus,} from "../../utils/global-methods";
    import {resetRouter} from '../../router'
    import baseRoutes from '../../router/base-router'
    export default {
        data() {
            return {
                loginForm: {},
                rules: {
                    username: [ { required: true, message: '請(qǐng)輸入用戶名', trigger: 'blur' } ],
                    password: [ { required: true, message: '請(qǐng)輸入密碼', trigger: 'blur' }, ],
                },//規(guī)則
                showLoading:false,//是否顯示加載
            }
        },
        methods: {
            //登錄
            async submitForm() {
                sessionStorage.clear()//清除所有緩存
                localStorage.clear()
                await this.$refs.loginForm.validate()
                this.showLoading=true
                axios({
                    url:`/login`,
                    method:'POST',
                    data:this.loginForm
                }).then(async response=>{
                    console.log(response)
                    if(response){
                        let userRoutes=await reqUserRoutes()
                        localStorage.setItem(userRoutes,JSON.stringify(userRoutes))
                        userRoutes=setUserRoutesData(JSON.parse(JSON.stringify(userRoutes)))
                        console.log(userRoutes)
                        this.$store.dispatch('setUserRoutes',JSON.parse(JSON.stringify(userRoutes)))
                        let menus=getAndFilterMenus([...baseRoutes,...JSON.parse(JSON.stringify(userRoutes))])
                        localStorage.setItem(menus,JSON.stringify(menus))
                        //重置路由
                        resetRouter()
                        // console.log(router)
                        //通過(guò)addRoutes方法添加路由
                        this.$router.addRoutes([...userRoutes])
                        // console.log(router)
                        將菜單存到vuex
                        this.$store.dispatch('setMenus',menus)
                        if(!menus.length || !userRoutes.length){
                            return
                        }
                        setTimeout(()=>{
                            router.replace(path)
                        },500)
                    }
                }).catch(error=>{
                    console.error(error)
                    this.showLoading=false
                })

            },
        },
    };
</script>
<style lang="scss" scoped>
    .login-wrap{
        position: relative;
        background:#111111;
        height:100vh;
        overflow: hidden;
        .loginContent{
            .loginFormBox{
                position: absolute;
                left:50%;
                top:50%;
                -webkit-transform: translate(-50%,-50%);
                -moz-transform: translate(-50%,-50%);
                -ms-transform: translate(-50%,-50%);
                -o-transform: translate(-50%,-50%);
                transform: translate(-50%,-50%);
                .loginForm{
                    width:300px;
                    padding:20px;
                    .loginTitleBox{
                        margin-bottom:36px;
                        .loginTitle{
                            color:#ffffff;

                        }
                    }

                    .loginBtnBox{
                        width:100%;
                        margin-top:5vh;
                        .loginBtn{
                            width:100%;
                            height:40px;
                            background:linear-gradient(90deg,rgba(15,70,193,1),rgba(0,147,168,1));
                            border-radius:4px;
                            color:#ffffff;
                            cursor:pointer;
                        }
                    }
                }
            }

        }
    }

</style>
<style>
    .login-wrap .el-input{
        border-bottom: 1px solid;
        border-image: -webkit-linear-gradient(90deg,rgba(1,233,189,1) 0%,rgba(0,124,222,1) 100%) 30 30;
        border-image: -moz-linear-gradient(90deg,rgba(1,233,189,1) 0%,rgba(0,124,222,1) 100%) 30 30;
        border-image: linear-gradient(90deg,rgba(1,233,189,1) 0%,rgba(0,124,222,1) 100%) 30 30;
    }
    .login-wrap .el-input__inner{
        background:transparent;
        -webkit-border-radius: 0;
        -moz-border-radius: 0;
        border-radius: 0;
        border:none;
        color:#ffffff;
    }
    .login-wrap .el-input-group__append{
        padding:0 !important;
        border:none !important;
        background:transparent !important;
    }

</style>

到了這里,關(guān)于前端之vue 根據(jù)菜單自動(dòng)生成路由(動(dòng)態(tài)配置前端路由)的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來(lái)自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 源生成器:根據(jù)需要自動(dòng)生成機(jī)械重復(fù)代碼

    本文概述了利用.NET Compiler Platform(“Roslyn”)SDK 附帶的 源生成器 (Source Generator)自動(dòng)生成機(jī)械重復(fù)的代碼。關(guān)于這部分的基礎(chǔ)入門(mén)知識(shí)可以在MSDN [1] 學(xué)到。 本文 默認(rèn) 已經(jīng)有一個(gè)解決方案,包含兩個(gè)項(xiàng)目。一個(gè)是普通C#項(xiàng)目,依賴于另一個(gè)源生成器項(xiàng)目。 此處以 Dependenc

    2024年02月01日
    瀏覽(94)
  • AICG,人工智能自動(dòng)生成內(nèi)容——根據(jù)文本生成圖像,視頻,音頻

    AICG,人工智能自動(dòng)生成內(nèi)容——根據(jù)文本生成圖像,視頻,音頻

    1、什么是AICG? 什么是AICG? AICG是指人工智能自動(dòng)生成內(nèi)容。 通過(guò)算法模型,將文本轉(zhuǎn)化為圖像、音頻、視頻等多種形式。 在數(shù)字時(shí)代,AICG已經(jīng)成為各種領(lǐng)域中不可或缺的一部分。 AICG的應(yīng)用場(chǎng)景 AICG在數(shù)字營(yíng)銷(xiāo)、廣告制作、電影制作等領(lǐng)域廣泛應(yīng)用。 可以用于教育、娛樂(lè)

    2024年02月14日
    瀏覽(28)
  • GO項(xiàng)目自動(dòng)化-根據(jù)庫(kù)表字段自動(dòng)生成API

    一個(gè)項(xiàng)目開(kāi)發(fā)離不開(kāi)數(shù)據(jù)庫(kù)的增刪改查,API功能也基本圍繞著表的CRUD:增加(Create)、讀取(Read)、更新(Update)和刪除(Delete)。每個(gè)表寫(xiě)一個(gè)CRUD,方法都差不多,邏輯也非常相似。 那么有沒(méi)有可能根據(jù)表結(jié)構(gòu)直接自動(dòng)化生成各個(gè)表的CRUD呢? 當(dāng)然可以,前幾篇文章已經(jīng)介紹了gola

    2024年01月15日
    瀏覽(17)
  • Hibernate根據(jù)實(shí)體類自動(dòng)生成表的方法

    這種方法需要配置 hibernate.cfg.xml 的屬性 hibernate.hbm2ddl.auto ,該屬性值的具體說(shuō)明如下: 值 說(shuō)明 update 實(shí)體對(duì)應(yīng)的表如果不存在則會(huì)創(chuàng)建。如果實(shí)體中新增加了字段,會(huì)在相應(yīng)的表中增加一列 create 每次啟動(dòng) Hibernate 都會(huì)創(chuàng)建表。在 Hiberante 啟動(dòng)時(shí),會(huì)先刪除實(shí)體對(duì)應(yīng)的表,然

    2023年04月24日
    瀏覽(13)
  • idea2023根據(jù)表自動(dòng)生成+springboot跑起來(lái)

    idea2023根據(jù)表自動(dòng)生成+springboot跑起來(lái)

    idea安裝插件 idea中顯示數(shù)據(jù)庫(kù)連接 就可以看到如下界面 選中你想生成的表,右鍵如下操作 如上就有了所有需要的后端代碼 生成后,要查看一下mapper.xml中的文件是否 正確, 若有誤請(qǐng)先去修改,例如我的版本下生成了xml文件中缺乏逗號(hào) 4. 如上寫(xiě)好后想跑起來(lái),配置pom,xml 配置

    2024年02月07日
    瀏覽(21)
  • 【效率提升-Perl腳本】根據(jù)Verilog文件自動(dòng)生成tb文件

    【效率提升-Perl腳本】根據(jù)Verilog文件自動(dòng)生成tb文件

    在數(shù)字IC設(shè)計(jì)過(guò)程中,根據(jù)頂層生成testbench時(shí)存在很多重復(fù)性工作,因此為了提高工作效率,特地開(kāi)發(fā)此腳本。 相應(yīng)的python腳本見(jiàn)鏈接: 【效率提升—Python腳本】根據(jù)Verilog文件自動(dòng)生成tb文件 學(xué)習(xí)更多IC知識(shí),請(qǐng)關(guān)注

    2024年02月13日
    瀏覽(21)
  • Vue3+Vue-Router+Element-Plus根據(jù)后端數(shù)據(jù)實(shí)現(xiàn)前端動(dòng)態(tài)路由——權(quán)限管理模塊

    Vue3+Vue-Router+Element-Plus根據(jù)后端數(shù)據(jù)實(shí)現(xiàn)前端動(dòng)態(tài)路由——權(quán)限管理模塊

    提示:文章內(nèi)容仔細(xì)看一些,或者直接粘貼復(fù)制,效果滿滿 提示:文章大概 1、項(xiàng)目:前后端分離 2、前端:基于Vite創(chuàng)建的Vue3項(xiàng)目 3、后端:沒(méi)有,模擬的后端數(shù)據(jù) 4、關(guān)于路徑“@”符號(hào)——vite.config.js 文件里修改 提示:以下是本篇文章正文內(nèi)容,下面案例可供復(fù)制粘貼使用

    2024年02月02日
    瀏覽(123)
  • R語(yǔ)言丨根據(jù)VCF文件自動(dòng)填充對(duì)其變異位點(diǎn)并生成序列fa文件

    首先提出一個(gè)問(wèn)題 : 假如有一個(gè)重測(cè)序結(jié)果VCF文件,里面包含了很多個(gè)樣本在幾百個(gè)突變位點(diǎn)(snp和iad)的基因型數(shù)據(jù),現(xiàn)在想根據(jù)這份原始數(shù)據(jù),得到一個(gè)fasta序列文件,包含每個(gè)樣品在這些位點(diǎn)的各自序列信息,應(yīng)該怎么做? 方法一:Excel手工處理 將vcf文件轉(zhuǎn)成Excel表格

    2024年02月03日
    瀏覽(14)
  • Vu3+Element-Plus根據(jù)路由配置生成菜單導(dǎo)航欄

    先看效果,整體界面結(jié)構(gòu)如下 點(diǎn)擊左側(cè)菜單欄,右側(cè)切換顯示不同頁(yè)面內(nèi)容。 Vue3使用路由–南河小站 路由配置如下: 說(shuō)明: @/layout/baseView.vue 是整體頁(yè)面結(jié)構(gòu) @/layout/rightView.vue 是公共頁(yè)面用于顯示數(shù)據(jù)內(nèi)容。 @/page/login/login.vue 是登陸頁(yè)面 右側(cè)數(shù)據(jù)內(nèi)容視圖是動(dòng)態(tài)的,其它

    2024年02月13日
    瀏覽(26)
  • 抖音無(wú)需API開(kāi)發(fā)連接Stable Diffusion,實(shí)現(xiàn)自動(dòng)根據(jù)評(píng)論區(qū)的指令生成圖像并返回

    抖音無(wú)需API開(kāi)發(fā)連接Stable Diffusion,實(shí)現(xiàn)自動(dòng)根據(jù)評(píng)論區(qū)的指令生成圖像并返回

    抖音用戶使用場(chǎng)景: 隨著AI繪圖的熱度不斷升高,許多抖音達(dá)人通過(guò)錄制視頻介紹不同的AI工具,包括產(chǎn)品背景、使用方法以及價(jià)格等,以吸引更多的用戶。其中,Stable Diffusion這款產(chǎn)品受到了許多博主達(dá)人的青睞。在介紹這款產(chǎn)品后,他們通常會(huì)鼓勵(lì)用戶進(jìn)行立即體驗(yàn),因?yàn)?/p>

    2024年02月09日
    瀏覽(24)

覺(jué)得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包