一五六、Node+Vue 使用七牛上传图片,并配置个人域名

1. 七牛云ak/sk获取

  1. 点击注册🔗开通七牛开发者帐号
  2. 如果已有账号,直接登录七牛开发者后台,点击这里🔗查看 Access Key 和 Secret Key

2. Node.js获取七牛token

安装qiniu

npm install qiniu

创建空间
在这里插入图片描述

Node获取token

const qiniu = require('qiniu');
const ACCESS_KEY = 'xxx';
const SECRET_KEY = 'xxx';
const mac = new qiniu.auth.digest.Mac(ACCESS_KEY, SECRET_KEY);const {Auth} = require('@middlewares/auth');
const AUTH_ADMIN = 16;const {Resolve} = require('@lib/helper');
const res = new Resolve();const Router = require('koa-router');const router = new Router({prefix: '/api/v1'
});// 获取token
router.post('/upload/token', new Auth(AUTH_ADMIN).m, async ctx => {const options = {scope: 'xxx', //你的存储空间名称expires: 7200};const putPolicy = new qiniu.rs.PutPolicy(options);ctx.response.status = 200;const data = {token: putPolicy.uploadToken(mac)};ctx.body = res.json(data);
});module.exports = router;

3. Vue获取token并上传图片

获取token

//src/api/upload.js
import request from '@/utils/request';// 获取上传图片token
export function getToken(params) {return request({url: '/upload/token',method: 'post',params});
}
<template><section class="wrap"><el-formref="ruleForm":model="ruleForm":rules="rules"label-width="120px"class="demo-ruleForm"><el-form-item label="标题" prop="title"><el-input v-model="ruleForm.title" /></el-form-item><el-form-item label="描述" prop="description"><el-input v-model="ruleForm.description" /></el-form-item><el-form-item label="SEO关键字" prop="seo_keyword"><el-input v-model="ruleForm.seo_keyword" /></el-form-item><el-form-item label="图片" prop="img_url"><el-uploadclass="avatar-uploader"action="https://upload-z0.qiniup.com/":show-file-list="false":data="{ token }":on-success="handleUploadSuccess"><imgv-if="ruleForm.img_url"width="80"height="80":src="ruleForm.img_url"class="avatar"/><i v-else class="el-icon-plus avatar-uploader-icon" /></el-upload></el-form-item><el-form-item label="展示" prop="status"><el-radio-group v-model="ruleForm.status"><el-radio :label="1">显示</el-radio><el-radio :label="0">隐藏</el-radio></el-radio-group></el-form-item><el-form-item label="分类" prop="category_id"><el-select v-model="ruleForm.category_id" placeholder="请选择分类"><el-optionv-for="item in categoryList":key="item.id":label="item.name":value="item.id"/></el-select></el-form-item><el-form-item label="排序" prop="sort_order"><el-input v-model="ruleForm.sort_order" /></el-form-item><el-form-item label="内容" prop="content"><mavon-editorref="md"v-model="ruleForm.content"code-style="atom-one-dark"@imgAdd="$imgAdd"@imgDel="$imgDel"/></el-form-item><el-form-item><el-button @click="resetForm('ruleForm')">重置</el-button><el-button type="primary" @click="submitForm('ruleForm')">立即创建</el-button></el-form-item></el-form></section>
</template><script>
import { mapState } from "vuex";
import { create } from "@/api/article";
import { list } from "@/api/category";
import { getToken } from "@/api/upload";
import axios from "axios";export default {name: "CategoryCreate",data() {return {token: "",categoryList: [],ruleForm: {title: "",description: "",img_url: "",seo_keyword: "",status: 1,sort_order: 1,admin_id: "",category_id: "",content: "",},rules: {title: [{ required: true, message: "请输入文章标题", trigger: "blur" }],description: [{ required: true, message: "请输入文章描述", trigger: "blur" },],img_url: [{ required: true, message: "请输入图片链接", trigger: "blur" },],seo_keyword: [{ required: true, message: "请输入 SEO 关键字", trigger: "blur" },],status: [{ required: true, message: "请输入展示状态", trigger: "blur" },],sort_order: [{ required: true, message: "请输入文章排序", trigger: "blur" },],category_id: [{ required: true, message: "请选择分类", trigger: "blur" },],content: [{ required: true, message: "请输入文章内容", trigger: "blur" },],},};},computed: {...mapState({adminInfo: (state) => state.admin.adminInfo,}),},mounted() {this.$axios = axios.create({ withCredentials: false });this.getUploadToken();this.getCategoryList();},methods: {// 获取上传tokenasync getUploadToken() {try {const res = await getToken();this.token = res.data.token;} catch (err) {console.log(err);}},// 上传图片成功回调handleUploadSuccess(file) {console.log("🚀 > handleUploadSuccess > file", file);this.ruleForm.img_url = `http://cdn.at-will.cn/${file.key}`;this.$message.success("上传成功!");},// 编辑器删除图片回调$imgDel(pos, $file) {console.log(pos, $file);},// 编辑器新增上传图片回调$imgAdd(pos, $file) {const loading = this.$loading({lock: true,text: "Loading",spinner: "el-icon-loading",background: "rgba(0, 0, 0, 0.7)",});// 第一步.将图片上传到服务器.const formdata = new FormData();formdata.append("file", $file);formdata.append("token", this.token);this.$axios({url: "https://upload-z0.qiniup.com/",method: "post",data: formdata,headers: { "Content-Type": "multipart/form-data" },}).then((res) => {const img_url = `http://cdn.at-will.cn/${res.data.key}`;this.$refs.md.$img2Url(pos, img_url);loading.close();}).catch((err) => {console.log(err);loading.close();});},// 获取分类列表async getCategoryList() {try {this.listLoading = true;const res = await list();this.categoryList = res.data.data;} catch (err) {console.log(err);} finally {this.listLoading = false;}},// 提交表单submitForm(formName) {if (this.adminInfo) {this.ruleForm.admin_id = this.adminInfo.id;}this.$refs[formName].validate(async (valid) => {if (valid) {this.createArticle();} else {console.log("error submit!!");return false;}});},// 重置表单resetForm(formName) {this.$refs[formName].resetFields();},// 创建文章async createArticle() {try {const res = await create(this.ruleForm);if (res.code === 200) {this.$msgbox.confirm("创建成功,是否退出创建文章页面", "提示", {confirmButtonText: "确定",cancelButtonText: "取消",type: "success",}).then(() => {this.$router.push("/article/index");});}} catch (err) {this.$message.error(err);}},},
};
</script><style scoped lang="scss">
.wrap {box-sizing: border-box;margin: 24px;
}
</style>
<style>
.avatar-uploader .el-upload {border: 1px dashed #d9d9d9;border-radius: 6px;cursor: pointer;position: relative;overflow: hidden;
}
.avatar-uploader .el-upload:hover {border-color: #409eff;
}
.avatar-uploader-icon {font-size: 28px;color: #8c939d;width: 178px;height: 178px;line-height: 178px;text-align: center;
}
.avatar {width: 178px;height: 178px;display: block;
}
</style>

4. 七牛云配置域名

  1. 点击七牛cdn 域名管理
  2. 添加域名,并在域名管理解析
  3. 配置域名的 CNAME

域名解析一般要半个小时,解析完要等一下才生效
在这里插入图片描述

上传图片并访问

http://cdn.at-will.cn/Fp30TD1fiuyL00qyuGuiqQwo0hNI

完整代码

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

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

相关文章

数据采集监控平台:挖掘数据价值 高效高速生产!

在当今数字化的时代&#xff0c;数据已成为企业非常宝贵的资产之一。然而&#xff0c;要充分发挥数据的潜力&#xff0c;离不开一个强大的数据采集监控平台&#xff0c;尤其是生产制造行业。它不仅是数据的收集者&#xff0c;更是洞察生产的智慧之眼&#xff0c;高效高速处理产…

第一章 应急响应- Linux入侵排查

简介 账号&#xff1a;root 密码&#xff1a;linuxruqin ssh rootIP 1.web目录存在木马&#xff0c;请找到木马的密码提交 2.服务器疑似存在不死马&#xff0c;请找到不死马的密码提交 3.不死马是通过哪个文件生成的&#xff0c;请提交文件名 4.黑客留下了木马文件&#xff0c…

使用 Flask 3 搭建问答平台(一):项目结构搭建

一、项目基本结构 二、app.py from flask import Flask import config from exts import db from models import UserModel from blueprints.qa import bp as qa_bp from blueprints.auth import bp as auth_bp# 创建一个Flask应用实例&#xff0c;__name__参数帮助Flask确定应…

聊一聊前后端权限控制 RBAC(完整流程)

介绍 RBAC&#xff08;Role-Based Access Control&#xff09;模型也就是基于角色的权限控制。 权限会分配到角色中&#xff0c;角色再分配给用户&#xff0c;这样用户就根据角色有了不同的权限。 当然&#xff0c;你可以说把权限直接挂载到用户上&#xff0c;这样不是更直接…

专业软件测评机构揭秘:移动app安全测试要点和注意事项

随着移动应用的普及和用户对信息安全的重视&#xff0c;任何一个缺乏安全性保障的应用程序都可能会被用户所抛弃。只有通过全面的安全测试&#xff0c;才能保证应用程序的安全性&#xff0c;增加用户的粘性和忠诚度&#xff0c;移动app安全测试是指对移动应用程序进行安全性评估…

【D3.js in Action 3 精译_015】1.3 D3 视角下的数据可视化最佳实践(下)

当前内容所在位置 第一部分 D3.js 基础知识 第一章 D3.js 简介 ✔️ 1.1 何为 D3.js&#xff1f;1.2 D3 生态系统——入门须知 1.2.1 HTML 与 DOM1.2.2 SVG - 可缩放矢量图形1.2.3 Canvas 与 WebGL1.2.4 CSS1.2.5 JavaScript1.2.6 Node 与 JavaScript 框架1.2.7 Observable 记事…

百川智能,摘下“大模型皇冠上的明珠”?

随着AI产业化和产业AI化成为业界共识&#xff0c;大模型的“新赛季”来了。 2024年是国产大模型全面商业化的元年&#xff0c;各地人工智能产业发展的政策密集出台。同时&#xff0c;在2024世界人工智能大会&#xff08;WAIC 2024&#xff09;上&#xff0c;各大AI厂商纷纷表示…

【Linux】基础I/O——FILE,用户缓冲区

1.FILE里的fd FILE是C语言定义的文件结构体&#xff0c;里面包含了各种文件信息。可以肯定的一点是&#xff0c;FILE结构体内一定封装了 fd 。为什么?来看接下来的思路分析&#xff1a; 1.使用系统接口的必然性   文件存储在磁盘上&#xff0c;属于外设。谁有权限访问…

【AI绘画教程】Stable Diffusion 1.5 vs 2

在本文中,我们将总结稳定扩散 1 与稳定扩散 2 辩论中的所有要点。我们将在第一部分中查看这些差异存在的实际原因,但如果您想直接了解实际差异,您可以跳下否定提示部分。让我们开始吧! Stable Diffusion 2.1 发布与1.5相比,2.1旨在解决2.0的许多相对缺点。本文的内容与理解…

<Rust><GUI>rust语言GUI库tauri体验:前、后端结合创建一个窗口并修改其样式

前言 本文是rust语言下的GUI库&#xff1a;tauri来创建一个窗口的简单演示&#xff0c;主要说明一下&#xff0c;使用tauri这个库如何创建GUI以及如何添加部件、如何编写逻辑、如何修改风格等&#xff0c;所以&#xff0c;这也是一个专栏&#xff0c;将包括tauri库的多个方面。…

filebeat生产环境配置

配置文件属性 生产配置 filebeat.inputs: - type: logenabled: truepaths: - /tmp/logs/*.log- /var/log/system.log- /var/log/wifi.logsymlinks: truejson.keys_under_root: truejson.message_key: xxxjson.add_error_key: true# 如果想卡部分日志&#xff0c;比如用时间作…

开源大语言模型完整列表概览

Large Language Model (LLM) 即大规模语言模型&#xff0c;是一种基于深度学习的自然语言处理模型&#xff0c;它能够学习到自然语言的语法和语义&#xff0c;从而可以生成人类可读的文本。 所谓"语言模型"&#xff0c;就是只用来处理语言文字&#xff08;或者符号体…

R语言优雅的把数据基线表(表一)导出到word

基线表&#xff08;Baseline Table&#xff09;是医学研究中常用的一种数据表格&#xff0c;用于在研究开始时呈现参与者的初始特征和状态。这些特征通常包括人口统计学数据、健康状况和疾病史、临床指标、实验室检测、生活方式、社会经济等。 本人在既往文章《scitb包1.6版本发…

不想填邀请码?Xinstall来帮你,一键安装无忧愁

在这个快节奏的时代&#xff0c;每一个点击都承载着用户的期待与耐心。然而&#xff0c;在下载App的过程中&#xff0c;繁琐的邀请码填写往往成为了用户体验的一大障碍。你是否也曾经因为不愿填写邀请码而放弃了一款心仪的App&#xff1f;今天&#xff0c;就让我们一起走进Xins…

【Unity美术】如何通用3Dmaxs做一个宝箱

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 专栏交流&#x1f9e7;&…

VsCode远程ssh连接失败:Could not establish connection to XXX

一、问题描述 在VsCode中按下"F1"&#xff0c;选择Remote-SSH:Connect to Host 选择一个已经配置好的SSH主机&#xff0c;比如我选择的是192.168.0.104&#xff1a; 结果提示&#xff1a;Could not establish connection to XXX 二、解决方法 观察VsCode的输出信息…

关于山东省首版次中检测报告的要求是什么

关于山东省首版次高端软件申报中的检测报告要求&#xff0c;虽然搜索结果中没有直接提供详细的具体要求&#xff0c;但可以结合一般软件检测报告的标准和要求&#xff0c;以及首版次软件申报的一般流程&#xff0c;推测可能涉及以下几个方面&#xff1a; 1. **检测机构资质**&…

有关电力电子技术的一些相关仿真和分析:⑦三相桥式电压型PWM逆变器与直接/间接法控制单相全桥结构PWM整流器(MATLAB/Siumlink仿真)

1.1 题目一要求 以三相桥式电压型PWM逆变器为对象,研究其在不同调制度下,输出电压的频谱成分变化,依据仿真波形分析其工作时序。 参数要求:三相桥式逆变电路,直流侧电压800V,调制波频率50HZ,开关频率10kHZ,阻感负载R=10Ω,L=5mH。 1.2 题目二要求 以单相全桥结构P…

数据结构之链表操作详解与示例(反转链表,合并链表,旋转链表,对链表排序)

文章目录 1. 反转链表2. 合并链表3. 旋转链表4. 对链表排序总结 链表是一种常见的基础数据结构&#xff0c;它在内存中的存储方式非常灵活。本文将详细介绍反转链表、合并链表、旋转链表以及对链表排序这四种操作&#xff0c;并提供C和C的实现示例。 1. 反转链表 反转链表意味…

可以用EasyConnect连接实验室内网,但无法连接内网才能访问的服务器,为什么?

&#x1f3c6;本文收录于《CSDN问答解答》专栏&#xff0c;主要记录项目实战过程中的Bug之前因后果及提供真实有效的解决方案&#xff0c;希望能够助你一臂之力&#xff0c;帮你早日登顶实现财富自由&#x1f680;&#xff1b;同时&#xff0c;欢迎大家关注&&收藏&…