8 Vue 开发方案

MobileNet V3 图像分类 MobileNet V3 阅读详情

通用需求


axios 封装

封装 axios 请求
import axios from 'axios' // 导入 axios

// 第一种: 直接配置在 axios 上(无法配置多个)
axios.defaults.baseURL = 'http://ttapi.research.itcast.cn/'

// 第二种: 使用 create 方法创建一个 axios 实例化对象(能够配置多个)
// 1. 设置基准地址并暴露(request.js)
const request = axios.create({
  baseURL: 'http://ttapi.research.itcast.cn/' // 基础路径
})
export default request

// 2. 针对不同组件暴露不同的方法(xxx.js)
import request from './request.js'
export const getUserInfoApi = () => {
  return request({
    method: 'GET',
    url: '/user'
  })
}

// 3. 集中暴露(index.js)
import {getUserInfoApi} from './xxx.js'

export default getUserInfoApi = getUserInfoApi

设置 axios 请求/拦截器
import axios from 'axios'
import router from '@/router'
import { Message } from 'element-ui'
import store from '@/store'
import { isTimeOut } from '@/utils/auth.js'

const timeOut = 3600 * 1000 // 秒

// 创建 axios 实例对象
const request = axios.create({
  baseURL: process.env.VUE_APP_BASE_API, // 请求基准地址
  timeout: 10 * 1000 // 请求超时(秒)
})

// 请求拦截器
request.interceptors.request.use(config => {
  // 判断是否存在 token
  if (store.getters.token) {
    // 判断时间戳是否过期,如果过期则清空登录信息,返回登录页
    if (isTimeOut(timeOut)) {
      // 通过判断说明已超时,删除登录信息,主动跳转登录也
      store.dispatch('user/logout') // 清空登录信息
      router.push('/login') // 跳转登录页
      return Promise.reject(new Error('登录超时'))
    }

    config.headers['Authorization'] = `Bearer ${store.getters.token}` // 将 token 添加到请求头中
  }
  return config // 必须返回请求对象
}, error => {
  return Promise.reject(error) // 返回错误对象
})

// 响应拦截器
request.interceptors.response.use(response => {
  const { success, message, data } = response.data // 解构数据(axios 默认包了一层data)
  // 判断返回状态
  if (success) {
    return data // 业务成功,返回数据
  }
  Message.error(message) // 提示错误信息
  return Promise.reject(new Error(message)) // 返回错误对象
}, error => {
  // 判断错误对象的 token 是否超时
  if (error.response && error.response.data && error.response.data.code === 10002) {
    store.dispatch('user/logout') // 清空数据
    router.push('/login')
  } else {
    Message.error(error.message) // 提示错误对象信息
  }
  return Promise.reject(error) // 返回错误对象
})

export default request

页面适配

移动端 rem 适配方案

PostCSS CSS处理器

PostCSS 是一个处理 CSS 的处理工具,本身功能比较单一,它主要负责解析 CSS 代码,再交由插件来进行处理,它的插件体系非常强大,所能进行的操作是多种多样的
PostCSS 一般不单独使用,而是与已有的构建工具进行集成
Vue CLI 默认集成了 PostCSS,并且默认开启了 autoprefixer 插件

Vue CLI 内部使用了 PostCSS,可以通过 .postcssrc 或任何 postcss-load-config 支持的配置源来配置 PostCSS。也可以通过 vue.config.js 中的 css.loaderOptions.postcss 配置 postcss-loader
默认开启了 autoprefixer。如果要配置目标浏览器,可使用 package.json 的 browserslist 字段。

目前 PostCSS 已经有 200 多个功能各异的插件。开发人员也可以根据项目的需要,开发出自己的 PostCSS 插件

1. 利用 lib-flexible 动态设置 rem 基准值
npm i amfe-flexible // 安装

// 自行配置可以如此书写 scss
@function rem($px) {
  @return calc($px / 37.5) + rem;
}

width: rem(100);

2. 使用 postcss-pxtorem 将 px 转为 rem
npm install postcss-pxtorem -D // 安装

.postcssrc.js // 配置文件
module.exports = {
  plugins: {
    'autoprefixer': { // 此配置 Vue/cli 默认配置,可以省略
      browsers: ['Android >= 4.0', 'iOS >= 8']
    },
    'postcss-pxtorem': {
      rootValue: 37.5, // 根据根字号配置
      propList: ['*'] // 需要转换的属性: 所有属性
    }
  }
}

3. 如何解决自身设计稿与 UI 组件设置不同

因为 rem 适配方案本质上是根据设计稿像素的十分之一来进行设定,而 UI 组件是固定的 375 ==> 37.5,这样就会导致不匹配的情况

.postcssrc.js // 配置文件
module.exports = {
  plugins: {
    'postcss-pxtorem': {
      rootValue({ file}) {
        return file.indexOf('vant') !== -1 ? 37.5 : 75 // 根据判断是否为 UI 组件设置大小(vant 37.5; 自身: 75)
      }
      propList: ['*'] // 需要转换的属性: 所有属性
    }
  }
}

模拟数据

登录加密

1. 安装插件

npm install crypto-js

2. 创建工具类

import CryptoJS from 'crypto-js'

// 需要和后端一致
const KEY = CryptoJS.enc.Utf8.parse('1234567890123456')
const IV = CryptoJS.enc.Utf8.parse('1234567890123456')

export default {
  /**
   * 加密
   * @param {*} word
   * @param {*} keyStr
   * @param {*} ivStr
   */
  encrypt(word, keyStr, ivStr) {
    let key = KEY
    let iv = IV
    if (keyStr) {
      key = CryptoJS.enc.Utf8.parse(keyStr)
      iv = CryptoJS.enc.Utf8.parse(ivStr)
    }
    let srcs = CryptoJS.enc.Utf8.parse(word)
    var encrypted = CryptoJS.AES.encrypt(srcs, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.ZeroPadding
    })
    return CryptoJS.enc.Base64.stringify(encrypted.ciphertext)
  },

  /**
   * 解密
   * @param {*} word
   * @param {*} keyStr
   * @param {*} ivStr
   */
  decrypt(word, keyStr, ivStr) {
    let key = KEY
    let iv = IV

    if (keyStr) {
      key = CryptoJS.enc.Utf8.parse(keyStr)
      iv = CryptoJS.enc.Utf8.parse(ivStr)
    }

    let base64 = CryptoJS.enc.Base64.parse(word)
    let src = CryptoJS.enc.Base64.stringify(base64)

    let decrypt = CryptoJS.AES.decrypt(src, key, {
      iv: iv,
      mode: CryptoJS.mode.CBC,
      padding: CryptoJS.pad.ZeroPadding
    })

    let decryptedStr = decrypt.toString(CryptoJS.enc.Utf8)
    return decryptedStr.toString()
  }
}

3. 引入并加密

import aes from '@/utils/aes'

let encryptionPassword = aes.encrypt(password)

Vue 脚手架代理

方案一: 简易配置

// vue.config.js 配置
devServer: {
  proxy:"http://localhost:5000"
}

方案二: 具体配置

// vue.config.js 配置
module.exports = {
    devServer: {
      proxy: {
      '/api1': {// 匹配所有以 '/api1'开头的请求路径
        target: 'http://localhost:5000',// 代理目标的基础路径
        changeOrigin: true,
        pathRewrite: {'^/api1': ''}
      },
      '/api2': {// 匹配所有以 '/api2'开头的请求路径
        target: 'http://localhost:5001',// 代理目标的基础路径
        changeOrigin: true,
        pathRewrite: {'^/api2': ''}
      }
    }
  }
}
/*
   changeOrigin设置为true时,服务器收到的请求头中的host为: localhost:5000
   changeOrigin设置为false时,服务器收到的请求头中的host为: localhost:8080
   changeOrigin默认值为true
*/

后台管理系统需求


登录

import { getToken, setToken, removeToken, setTimestamp } from '@/utils/auth.js'
import { loginAPI, getUserInfoAPI, getUserDetailByIdAPI } from '@/api/index.js'
import { resetRouter } from '@/router'

const state = {
  token: getToken(), // 用户 token
  userInfo: {} // 用户基本信息(不能设置为null,映射时访问null中的属性将报错)
}

const mutations = {
  // * 设置 token 并持久化
  setToken(state, token) {
    state.token = token // 保存状态
    setToken(token) // 数据持久化
  },

  // * 删除 token 并重置持久化
  removeToken() {
    state.token = null // 重置状态
    removeToken() // 清空 token 数据持久化
  },

  // * 设置用户信息
  setUserInfo(state, data) {
    state.userInfo = data // 保存数据
  },

  // * 设置用户信息
  removeUserInfo() {
    state.userInfo = {} // 清空数据
  }
}

const actions = {
  // * 异步登录
  async login(context, data) {
    const result = await loginAPI(data) // 调用后端接口请求数据
    context.commit('setToken', result) // 保存token
    // 此时已经获取到了 token ,加上时间戳,主动介入
    setTimestamp() // 设置时间戳
  },

  // * 异步获取用户信息
  async getUserInfo(context) {
    const result = await getUserInfoAPI() // 获取用户基本信息
    const baseInfo = await getUserDetailByIdAPI(result.userId) // 用户员工基本信息
    const baseResult = { ...result, ...baseInfo } // 合并数据
    context.commit('setUserInfo', baseResult) // 设置用户基本信息
    return baseResult // 返回合并数据(为权限控制做准备)
  },

  // * 退出登录
  logout(context) {
    context.commit('removeToken') // 删除 token
    context.commit('removeUserInfo') // 删除用户信息

    resetRouter() // 重置路由表(去除动态路由权限)
    context.dispatch('permission/setRoutes', [], { root: true }) // 情况权限路由数据
  }
}

export default {
  namespaced: true,
  state,
  mutations,
  actions
}

权限管理

权限是对特定资源的访问许可,所谓权限控制,也就是确保用户只能访问到被分配的资源,而前端权限归根结底是请求的发起权,请求的发起可能有下面两种形式触发
触发有页面加载触发和页面上的按钮点击触发,总的来说所有的请求发起都触发自前端路由或视图,所以我们可以从这两方面入手,对触发权限的源头进行控制

最终实现

  • 路由方面,用户登录后只能看到自己有权访问的导航菜单,也只能访问自己有权访问的路由地址,否则将跳转4xx提示页
  • 视图方面,用户只能看到自己有权浏览的内容和有权操作的控件
  • 最后再加上请求控制作为最后一道防线,路由可能配置失误,按钮可能忘了加权限,这种时候请求控制可以用来兜底,越权请求将在前端被拦截

实现方案

  • 接口权限: 接口权限目前一般采用jwt的形式来验证,没有通过的话一般返回401,跳转到登录页面重新进行登录,具体实现在于后端
  • 按钮权限:
    • 方案一: 通过 v-if 来判断控制是否能够点击
    • 方案二: 通过自定义指令通过权限鉴权,通过后端返回的权限数据判断对应的按钮是否可以点击
  • 菜单权限:
    • 方案一: 菜单与路由分离,菜单由后端返回,路由跳转时判断跳转信息是否在对应的权限菜单中来控制菜单访问权限
      • 缺点1: 菜单需要与路由做–对应,前端添加了新功能,需要通过菜单管理功能添加新的菜单,如果菜单配置的不对会导致应用不能正常使用
      • 缺点2: 全局路由守卫里,每次路由跳转都要做判断
    • 方案二: 菜单和路由都由后端返回,前端统一定义路由组件,在将后端返回路由通过addRoutes动态挂载之间,需要将数据处理一下,将component字段换为真正的组件
      • 缺点1: 全局路由守卫里,每次路由跳转都要做判断
      • 缺点2: 前后端的配合要求更高
  • 路由权限:
    • 方案一: 初始化就挂载所有的路由,通过标识数据在每次路由跳转时判断用户是否有权限来访问此页面
      • 缺点1: 加载所有的路由,如果路由很多,而用户并不是所有的路由都有权限访问,对性能会有影响。
      • 缺点2: 全局路由守卫里,每次路由跳转都要做权限判断。
      • 缺点3: 菜单信息写死在前端,要改个显示文字或权限信息,需要重新编译
      • 缺点4: 菜单跟路由耦合在一起,定义路由的时候还有添加菜单显示标题,图标之类的信息,而且路由不一定作为菜单显示,还要多加字段进行标识
    • 方案二: 初始化的时候先挂载不需要权限控制的路由,比如登录页,404等错误页。如果用户通过URL进行强制访问,则会直接进入404,相当于从源头上做了控制,登录后,获取用户的权限信息,然后筛选有权限访问的路由,在全局路由守卫里进行调用addRoutes添加路由
      • 缺点1: 全局路由守卫里,每次路由跳转都要做判断
      • 缺点2: 菜单信息写死在前端,要改个显示文字或权限信息,需要重新编译
      • 缺点3: 菜单跟路由耦合在一起,定义路由的时候还有添加菜单显示标题,图标之类的信息,而且路由不一定作为菜单显示,还要多加字段进行标识

路由权限设置

import router from '@/router' // 引入 router 实例
import store from '@/store' // 引入 vuex 实例
import NProgress from 'nprogress' // 引入一份进度条插件
import 'nprogress/nprogress.css' // 引入进度条样式

// 白名单路径
const whilePath = ['/login', '/404']

NProgress.configure({ showSpinner: false }) // NProgress 关闭顶部加载状态

// 路由前置守卫
router.beforeEach(async(to, from, next) => {
  NProgress.start() // 开启进度条
  // 判断有无 token
  if (store.getters.token) {
    // 有 token 做免登陆功能
    if (to.path === '/login') {
      next('/') // 免登录到主页
    } else {
      // 请求用户数据,但要先判断用户数据是否存在
      if (!store.getters.userId) {
        // 因为获取用户数据是异步任务,所有需要使用 await 暂停函数运行
        const { roles } = await store.dispatch('user/getUserInfo') // 用户数据不存在获取用户数据
        // 此时用户数据已经获取,获取路由权限(actions 是异步操作)
        console.log(roles.menus)
        const asyncRoute = await store.dispatch('permission/filterRoutes', roles.menus)
        // 动态添加路由规则
        router.addRoutes([...asyncRoute, { path: '*', redirect: '/404', hidden: true }])
        // 使用动态添加路由规则后需要手动 next(地址) 不然会报错
        next(to.path)
      } else {
        next() // 其余直接放行
      }
    }
  } else {
    // 判断路径是否在白名单中
    if (whilePath.includes(to.path)) {
      next() // 在白名单,直接放行
    } else {
      next('/login') // 不在白名单,强制调整登录页
    }
  }

  NProgress.done() // 强制停止进度条,防止手动切换地址时不经过后置守卫而导致的错误
})

// 路由后置守卫
router.afterEach((to, from) => {
  NProgress.done() // 关闭进度条
})

密码学系列3-Elgamal加密及其IND-CPA安全性证明 但这没有任何影响,敌手本身就只能知道公钥,他并没有能力知道挑战者是否知道对应的私钥。所以上述整个游戏就是一个模拟实验,敌手无法区分挑战者运行的是这个模拟实验,还是真正的按照第一节的算法构造的实验(挑战者知道私钥…为什么合起来的时候有1/2:因为T既可能是随机的也可能是g^{ab},这两种情况概率为1/2。能够攻破Elgamal加密方案,那么挑战者利用敌手的能力构建下面游戏,来求解困难性问题DDH。就是挑战者选的随机数,虽然挑战者自己也不知道。),否则挑战者输出0,作为DDH的回答。 阅读详情

相关推荐

避开模板匹配的坑:OpenCVSharp中边缘梯度算法的优化实践

本文深入探讨了OpenCVSharp中边缘梯度算法在模板匹配中的优化实践,解决了传统方法在尺度变化、角度旋转和光照差异下的局限性。通过Sobel算子提取边缘梯度特征,结合轮廓检测和多尺度匹配策略,显著提升了匹配的鲁棒性和准确性。文章还分享了并行计算、内存访问优化等实战技巧,适用于工业检测和自动化识别场景。

http9protocoller的博客 198

二手交易平台避坑指南:SpringBoot+Vue开发中遇到的8个典型问题及解决方案

本文详细解析了使用SpringBoot+Vue开发二手交易平台时常见的8个技术难题及解决方案,包括文件上传处理、跨域问题、交易状态机设计、实时消息通知、Elasticsearch优化、分布式事务处理、敏感词过滤和性能监控。通过源码示例和实战经验,帮助开发者高效避坑,提升开发效率。

weixin_29313547的博客 403

使用 Python+PaddleOCR 实现图文识别:从入门到精通

在当今数字化时代,图文识别技术的应用越来越广泛,如文档数字化、信息提取等。PaddleOCR 是百度开源的一款强大的 OCR 工具包,它集成了多种先进的算法和模型,能够高效准确地进行图文识别。本文将详细介绍如何使用 PaddleOCR 和 Python 实现图文识别,并给出具体的代码和步骤。

爱搬砖的程序猿 5474

Vue-8.Vue项目配置详解

Vue项目配置详解

yueerba126的博客 1079

RoCE Overlay

1. RoCE over vxlan 配置vxlan封装的RoCE流量,可以在PF switchdev模式下利用ovs bridge,或直接设置tc rules。下面将基于一对NIC互联的服务器介绍两种方式的使用,并分析封装后的数据包结构。 1.1. 基本配置 - VF与switchdev 首先创建VF,并为两个host设置PF的switchdev模式。使用ovs bridge或tc rules,...

sunshuying1010的博客 3063

uniapp | 基于高德地图实现位置选择功能(安卓端)

在uni-app项目中实现地图位置选择功能的解决方案。由于uni.chooseLocation功能受限,采用高德地图API自主开发。系统由父组件poiMap.vue(负责展示和跳转)和子组件poiBox.vue(核心地图逻辑)构成,通过父子组件通信传递位置数据。关键技术包括:1)使用AMapLoader动态加载地图SDK;2)集成PositionPicker实现拖拽选点;3)异步加载AMapUI插件;4)通过事件监听获取位置详情(地址/经纬度)。

大胆尝试,小心实践 733

VUE 8

优化:由 stores/index.js 统一导出,导入路径统一 `./stores`,而且仓库维护在 stores/modules 中。- 优化:由 stores 统一维护,在 stores/index.js 中完成 pinia 初始化,交付 main.js 使用。官方文档: https://element-plus.org/zh-CN/guide/quickstart.html。- 现在:初始化代码在 main.js 中,仓库代码在 stores 中,代码分散职能不单一。

2401_88624699的博客 683

杰理可视化SDK开发-杰理AC1123N芯片SDK开发笔记合集

该文档主要描述 AC112N开发相关的使用说明和注意事项,收集并持续更新开发调试过程中的相关疑问和解答,对SDK介绍文档做一个补充说明。写作人:李永奉,参考项目MD-026H; AC112N-SDK项目帮助文档在杰理开发者平台(JL DP)'帮助'处进入,如本文档有与后续帮助文档或工具注释说明冲突,以后者为标准。

李永奉的博客 182

VUE---8.表单&选项

v-model:value="data数据" 简写 v-model="data数据"A: 与输入框内容进行关联, 获取的是内容B: 单个属性名 txt:''A: 需要配合value属性使用, 获取value属性的值B: 单个属性名 rad:""A: 获取多选框的checked属性(布尔值) true选择 false未选择B: 单个属性名 che:""...

xi_xi_123456的博客 539

1篇2章1节:在 Mac 上安装 Python,从环境检查到工具配置的完整指南

Python 是当今最流行的高级编程语言之一,广泛应用于数据分析、人工智能、自动化脚本和 Web 开发。虽然 macOS 曾自带 Python,但从 macOS 12.3 开始,系统不再默认提供可直接使用的版本,因此需要手动安装。本文将详细讲解如何在 Mac 上安装最新版本的 Python,如何验证安装是否成功,以及如何配置 IDLE 和 Python Launcher 等工具,为日常开发和学习打下坚实基础。即便你是完全的新手,也能按步骤完成环境搭建。

MD Code 848

OpenCV计算机视觉实战(11)——边缘检测详解

在本节中,我们系统介绍了三大经典边缘检测算子,包括 Sobel 算子:一阶导数平衡了噪声抑制与边缘提取,结合方向信息可用于纹理分析与车道检测;Laplacian 算子:二阶导数对微小亮度突变尤为敏感,配合零交叉和细化技术,可精确捕捉任意方向的细节边缘;Canny 算法:集成多阶段处理与双阈值策略,通过多尺度融合与自适应阈值优化,达到抗噪与细节兼顾的卓越效果。

qq_30167691的博客 4375

vue-8:Vuex状态管理模式库 + map辅助函数简写

vue-8:Vuex状态管理模式库 + map辅助函数简写

qq_60839348的博客 613

嵌入式工程师必学(9):USB 3.0协议理解

USB3.0和USB2.0相比,在线缆上从4根线(Vbus、GND、D+、D-)变为了8根线(Vbus、GND、D+、D-、SSRX+\SSRX-\SSTX+\SSTX-),可见增加的4根线都是和超速相关的,新增加的超速有两类,分别为:超速Gen1(5.0Gbps),超速+Gen2(10Gbps),还兼容USB2.0的3类速率:low-speed(1.5Mbps),full-speed(12Mbps),andhigh-speed(480Mbps)。从设计可以看出,USB3....

码农17年的博客 1万+

Vue-8-组件双向传值

看着别人写的组件,各种知识点不懂,难以理解其中的逻辑,实在没法工作,今天学习下组件传值,子组件既能接收父组件的值,也能返回更新后的值给父组件。刚好最近看了Cursor,下载试用了下,真是太好用了,对于我这种前端小白来说,大大提升了学习的效率。本次复习的关键知识点为组件双向绑定,有如下两个知识点。

2401_86113453的博客 430

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

深度学习工具包 DeepLearningToolbox

深度学习工具包Deprecation notice.-----This toolbox is outdated and no longer maintained.There are much better tools available for deep learning than this toolbox, e.g. [Theano](http://deeplearning.net/software/theano/), [torch](http://torch.ch/) or [tensorflow](http://www.tensorflow.org/)I would suggest you use one of the tools mentioned above rather than use this toolbox.Best, Rasmus.DeepLearnToolbox================A Matlab toolbox for Deep Learning.Deep Learning is a new subfield of machine learning that focuses on learning deep hierarchical models of data.It is inspired by the human brain's apparent deep (layered, hierarchical) architecture.A good overview of the theory of Deep Learning theory is[Learning Deep Architectures for AI](http://www.iro.umontreal.ca/~bengioy/papers/ftml_book.pdf)For a more informal introduction, see the following videos by Geoffrey Hinton and Andrew Ng.* [The Next Generation of Neural Networks](http://www.youtube.com/watch?v=AyzOUbkUf3M) (Hinton, 2007)* [Recent Developments in Deep Learning](http://www.youtube.com/watch?v=VdIURAu1-aU) (Hinton, 2010)* [Unsupervised Feature Learning and Deep Learning](http://www.youtube.com/watch?v=ZmNOAtZIgIk) (Ng, 2011)If you use this toolbox in your research please cite [Prediction as a candidate for learning deep hierarchical models of data](http://www2.imm.dtu.dk/pubdb/views/publication_details.php?id=6284)```@MASTERSTHESIS\{IMM2012-06284, author = "R. B. Palm", title = "Prediction as a candidate for learning deep hierarchical models of data", year = "2012",}```Contact: rasmusbergpalm at gmail dot comDirectories included in the toolbox-----------------------------------`NN/` - A library for Feedforward Backpropagation Neural Networks`CNN/` - A library for Convolutional Neural Networks`DBN/` - A library for Deep Belief Networks`SAE/` - A library for Stacked Auto-Encoders`CAE/` - A library for Convolutional Auto-Encoders`util/` - Utility functions used by the libraries`data/` - Data used by the examples`tests/` - unit tests to verify toolbox is workingFor references on each library check REFS.mdSetup-----1. Download.2. addpath(genpath('DeepLearnToolbox'));Example: Deep Belief Network---------------------```matlabfunction test_example_DBNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit RBM and visualize its weightsrand('state',0)dbn.sizes = [100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);figure; visualize(dbn.rbm{1}.W'); % Visualize the RBM weights%% ex2 train a 100-100 hidden unit DBN and use its weights to initialize a NNrand('state',0)%train dbndbn.sizes = [100 100];opts.numepochs = 1;opts.batchsize = 100;opts.momentum = 0;opts.alpha = 1;dbn = dbnsetup(dbn, train_x, opts);dbn = dbntrain(dbn, train_x, opts);%unfold dbn to nnnn = dbnunfoldtonn(dbn, 10);nn.activation_function = 'sigm';%train nnopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.10, 'Too big error');```Example: Stacked Auto-Encoders---------------------```matlabfunction test_example_SAEload mnist_uint8;train_x = double(train_x)/255;test_x = double(test_x)/255;train_y = double(train_y);test_y = double(test_y);%% ex1 train a 100 hidden unit SDAE and use it to initialize a FFNN% Setup and train a stacked denoising autoencoder (SDAE)rand('state',0)sae = saesetup([784 100]);sae.ae{1}.activation_function = 'sigm';sae.ae{1}.learningRate = 1;sae.ae{1}.inputZeroMaskedFraction = 0.5;opts.numepochs = 1;opts.batchsize = 100;sae = saetrain(sae, train_x, opts);visualize(sae.ae{1}.W{1}(:,2:end)')% Use the SDAE to initialize a FFNNnn = nnsetup([784 100 10]);nn.activation_function = 'sigm';nn.learningRate = 1;nn.W{1} = sae.ae{1}.W{1};% Train the FFNNopts.numepochs = 1;opts.batchsize = 100;nn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.16, 'Too big error');```Example: Convolutional Neural Nets---------------------```matlabfunction test_example_CNNload mnist_uint8;train_x = double(reshape(train_x',28,28,60000))/255;test_x = double(reshape(test_x',28,28,10000))/255;train_y = double(train_y');test_y = double(test_y');%% ex1 Train a 6c-2s-12c-2s Convolutional neural network %will run 1 epoch in about 200 second and get around 11% error. %With 100 epochs you'll get around 1.2% errorrand('state',0)cnn.layers = { struct('type', 'i') %input layer struct('type', 'c', 'outputmaps', 6, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %sub sampling layer struct('type', 'c', 'outputmaps', 12, 'kernelsize', 5) %convolution layer struct('type', 's', 'scale', 2) %subsampling layer};cnn = cnnsetup(cnn, train_x, train_y);opts.alpha = 1;opts.batchsize = 50;opts.numepochs = 1;cnn = cnntrain(cnn, train_x, train_y, opts);[er, bad] = cnntest(cnn, test_x, test_y);%plot mean squared errorfigure; plot(cnn.rL);assert(er<0.12, 'Too big error');```Example: Neural Networks---------------------```matlabfunction test_example_NNload mnist_uint8;train_x = double(train_x) / 255;test_x = double(test_x) / 255;train_y = double(train_y);test_y = double(test_y);% normalize[train_x, mu, sigma] = zscore(train_x);test_x = normalize(test_x, mu, sigma);%% ex1 vanilla neural netrand('state',0)nn = nnsetup([784 100 10]);opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samples[nn, L] = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.08, 'Too big error');%% ex2 neural net with L2 weight decayrand('state',0)nn = nnsetup([784 100 10]);nn.weightPenaltyL2 = 1e-4; % L2 weight decayopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex3 neural net with dropoutrand('state',0)nn = nnsetup([784 100 10]);nn.dropoutFraction = 0.5; % Dropout fraction opts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex4 neural net with sigmoid activation functionrand('state',0)nn = nnsetup([784 100 10]);nn.activation_function = 'sigm'; % Sigmoid activation functionnn.learningRate = 1; % Sigm require a lower learning rateopts.numepochs = 1; % Number of full sweeps through dataopts.batchsize = 100; % Take a mean gradient step over this many samplesnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex5 plotting functionalityrand('state',0)nn = nnsetup([784 20 10]);opts.numepochs = 5; % Number of full sweeps through datann.output = 'softmax'; % use softmax outputopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, train_x, train_y, opts);[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');%% ex6 neural net with sigmoid activation and plotting of validation and training error% split training data into training and validation datavx = train_x(1:10000,:);tx = train_x(10001:end,:);vy = train_y(1:10000,:);ty = train_y(10001:end,:);rand('state',0)nn = nnsetup([784 20 10]); nn.output = 'softmax'; % use softmax outputopts.numepochs = 5; % Number of full sweeps through dataopts.batchsize = 1000; % Take a mean gradient step over this many samplesopts.plot = 1; % enable plottingnn = nntrain(nn, tx, ty, opts, vx, vy); % nntrain takes validation set as last two arguments (optionally)[er, bad] = nntest(nn, test_x, test_y);assert(er < 0.1, 'Too big error');```[![Bitdeli Badge](https://d2weczhvl823v0.cloudfront.net/rasmusbergpalm/deeplearntoolbox/trend.png)](https://bitdeli.com/free "Bitdeli Badge")

YOLOv8 Web前端界面开发:Vue.js集成方案

通过结合YOLOv8的高效目标检测能力与Vue.js的响应式前端框架,构建可交互的Web级AI应用。利用Docker实现环境统一,前后端分离架构提升开发效率,支持实时检测、动态渲染与跨平台访问,打造可落地的可视化智能系统。

weixin_36173034的博客 457

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

原创全新打包工具Parcel零配置VueJS开发脚手架

parcel-vue 一个基于Parcel打包工具的 VueJS急速开发脚手架解决方案,强烈建议使用node8.0以上 项目地址: https://github.com/w3c-king/p... 初始化项目 $ git clone https://github.com/w3c-king/parcel-vue.git 安装依赖 $ cd ...

weixin_34228662的博客 103

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

常见问题解答:Vue File Agent开发者必知的8个解决方案

Vue File Agent作为Vue JS生态中功能全面且美观的文件上传组件,在实际开发中难免会遇到各种技术挑战。本文整理了开发者最常遇到的8个问题及解决方案,帮助你快速解决集成过程中的痛点,提升文件上传功能的稳定性和用户体验。 ## 1. 如何限制上传文件的大小和类型? 文件验证是上传功能的基础需求,Vue File Agent提供了灵活的配置选项来限制文件大小和类型。通过设置`maxSi

gitblog_00463的博客 859

基于RuoYi-Vue 3.8.8和Dataroom 2.0.0 集成开发的物联网可视化平台。基于Vue的大屏可视化设计器,前后端一体化解决方案,几十种炫酷图表,支持多种数据来源接入,适用于大屏、

基于RuoYi-Vue 3.8.8和Dataroom 2.0.0 集成开发的物联网可视化平台。🔥基于Vue的大屏可视化设计器,前后端一体化解决方案,几十种炫酷图表,支持多种数据来源接入,适用于大屏、低代码、BI场景,使用简单,代码完全开源。

jonehoo的博客 2675

vue 始终在元素底部,使用Vue.js滚动到div的底部

I have a Vue component with several elements in it. I want to automatically scroll to the bottom of that element when a method in the component is called (basically, do the same as in Scroll to bottom...

weixin_39849930的博客 204

vue 始终在元素底部_使用Vue.js滚动到div的底部

I have a Vue component with several elements in it. I want to automatically scroll to the bottom of that element when a method in the component is called (basically, do the same as in Scroll to bottom...

weixin_39813574的博客 203

企业级应用开发架构优化:基于.NET 8与Vue 3的全栈低代码解决方案

在数字化转型的浪潮中,企业应用开发面临多重技术挑战。随着业务复杂度的提升,传统开发模式在数据库兼容性、前后端协作效率和代码复用性方面逐渐显现瓶颈。VOL.Framework作为基于.NET 8与Vue 3技术栈的企业级低代码平台,通过创新的架构设计和自动化工具链,为开发团队提供了可扩展、高性能的解决方案。本文将深入分析该框架的技术实现原理、核心模块设计以及在实际生产环境中的应用实践。 ## 架构

gitblog_00855的博客 1026

Vue3 + ThinkPHP8 + PHP8.x 生态与 Swoole 增强方案对比分析

​​​​​​​​。

琼楼玉宇 1048

VOL.Framework:企业数字化转型的“效率革命“,300%开发加速的.NET 8 + Vue 3低代码方案

在企业数字化转型浪潮中,技术团队正面临前所未有的效率挑战。传统开发模式下,70%的研发资源消耗在重复的CRUD编码上,而业务需求的变化速度却日益加快。VOL.Framework作为基于.NET 8 + Vue 3技术栈的全栈低代码解决方案,正在重新定义企业级应用的开发范式,让开发团队真正实现"开发即部署"的现代化工作流。 ## 企业开发效率的"三重困境"诊断 ### 技术债务堆积如山 传统分层

gitblog_00681的博客 621

基于.NET 8+SqlSugar+Vue3的企业级通用权限开发框架:现代化后台系统快速构建方案

Admin.NET是一个基于.NET 8和Vue3的现代化通用权限开发框架,采用Furion和SqlSugar技术栈构建,专为中小企业快速开发平台设计。该框架实现了前后端分离架构,集成了多租户、动态API、任务调度、打印服务等高级功能,支持国产化软硬件环境,完全符合等保和密评要求。通过模块化插件式开发模式,开发者可以快速构建复杂的企业管理系统,同时保持代码的清晰结构和易维护性。 ## 为什么需要

gitblog_00847的博客 260

计算机毕业设计ssm基于vuejs的二手车交易平台ue120系统+程序+源码+lw+远程部署

springboot基于springboot的影视资讯管理系统。springboot基于web的数码产品应用平台设计与实现。springboot基于springboot的社会公益平台。ssm基于HTML的“牧经校园疫情防控网站”的设计与实现。JSP图书在线借阅系统的设计与实现sqlserver。JSP宠物食品店系统的设计与实现sqlserver。jsp会议管理系统的设计与实现sqlserver。ssm基于SSM高校教师个人主页网站的设计与实现。ssm基于JAVA的OA办公系统的设计与实现。...

m0_71813017的博客 365

通义千问1.5-1.8B-Chat-GPTQ-Int4在Vue3前端开发中的集成方案

本文介绍了如何在星图GPU平台上自动化部署通义千问1.5-1.8B-Chat-GPTQ-Int4镜像,并详细阐述了将其集成到Vue3前端应用中的方案。该方案通过前后端分离架构,使开发者能够快速构建具备智能对话功能的Web应用,例如智能客服或辅助写作工具,从而提升用户体验与开发效率。

weixin_33562004的博客 352
上一篇: 7 Vue3
下一篇: 9 Vue 框架生态
taciturn丶
博客等级 码龄9年 471粉丝 33原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

taciturn丶

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值