文生圖項目總結

文生圖

image.png

功能點

  • 頁面進來獲取背景圖url和圖片寬高(根據比例和手機屏幕處理過的寬高)
  • 渲染圖片(背景圖最后生成圖片模糊,換成img展示解決)
  • 添加多個文字,編輯文字內容,拖拽改變文字位置,刪除文字
  • 編輯文字內容,顏色,字體,大小
  • 生成圖片預覽
  • 轉發圖片給好友、保存

bug點

  • 使用背景圖最后生成圖片模糊,換成img展示解決
  • 圖片必須轉成base64格式,最后才能保存,否則不顯示(例如二維碼和背景圖)

拖拽插件

多個文字框時,點擊改變isActive控制編輯狀態框的顯示隱藏

  • 只保留一個clicked 事件
  • 在外層添加時間.stop 重置數組激活狀態為false

整個頁面分為上中下三部分,中間可滾動

  • 整體100vh ,采用縱向flex布局
  • 上下區域高度不固定,下面樣式設置直接寫,不采用彈窗形式
  • 中間區域 overflow-y: auto;高度超出會自動有滾動條
  • 中間圖片豎圖頂部會遮擋,不能使用center布局即可

解決不同圖片尺寸都要居中顯示,切最后生成圖片又得是圖片區域

  • 采用父盒子 flex:center,內層盒子居中顯示:橫圖可以,超高豎圖頂部會有遮擋;所以判斷豎圖就定義寬90%,高度auto
  • 根據圖片比例動態計算寬高,動態設置內層盒子的寬高;盒子里放圖片和文字
  • 假如是9:16 的圖片,固定一個高度,計算固定寬度;其他比例寬度為手機屏幕寬度,高度計算

刪除其中一個位置會跑到上個位置

  • 拖拽left、top賦值,刪除加個show變量false隱藏,不直接刪除這一項

添加文字后,第一次點擊聚焦拖拽框,文字會移動到左上角的位置

  • 添加文字,給了一個默認left、top值讓文字顯示在中間
  • 但是拖拽組件沒有設置初始偏移量 x、y
  • 保持初始偏移量和添加文字默認位置一致即可解決

vcolorpicker顏色選取插件

切換字體字體包

  • vue獲取文件夾下所有字體包 生成數組:字體包的名字和下拉選擇名字保持一致
  • 類名定義為font-索引值
  • 這樣下拉選中得到索引,動態綁定類名即可切換字體

vue瀑布流插件vue-masonry

第二版小程序

  • 第一版公眾號無法實現轉發圖片給好友,只能分享公眾號;所以修改為小程序
  • 小程序沒有找到拖拽插件,所以打算用uniapp生成小程序
  • 結果uniapp也沒有拖拽插件,最終使用uniapp 嵌入H5頁面(編輯賀卡頁面)
  • uniapp打包小程序弊端:使用uview插件占內存較大很快就超了2M
  • 于是采用分包,主包只放tabbar頁面,分包可以有多個,但是總限制8M,每個包限制2M
  • 分包可以鍵自己的圖片文件夾和插件
  • 上線要在編輯器上點擊發行,才會運行在生產環境
let url = ''
let url1 = ''
let url2 = ''
if (process.env.NODE_ENV === 'development') {console.log('開發環境')url = 'http://192.168.0.19:9888'url1 = 'http://192.168.2.89:8080'url2 = 'http://192.168.0.19:9888'
} else {console.log('生產環境')url = 'https://wst.maitewang.com/stage-api'url1 = 'https://wst.maitewang.com'url2 = 'https://wst.maitewang.com/stage-api'
}export const baseUrl = url;
export const h5Url = url1;
export const imgUrl = url2;
  • 小程序發布之后,H5會有緩存,大概5個小時左右會更新;小程序24小時會基本更新所有用戶

uniapp 打包小程序并嵌入H5注意事項

小程序里邊嵌入H5 使用 web-view

  • 上線需要配置業務域名,即H5訪問地址
  • 域名必須使用https;域名不能帶端口號;需要下載文件放服務器上
  • web-view會緩存,修改H5之后,線上不會變; 在過一段時間(時間不定,一天或者幾小時,無明顯規律)是可以進行緩存刷新的:有需要的解決
  • 可以ngix配置不緩存html文件,即可解決;還有靜態資源的緩存比較麻煩
  • 將微信從后臺退出再打開并重新進入小程序;

uniapp可以直接調取微信小程序轉發圖片api

  • 轉發有發送朋友和保存相冊功能
  • 發送朋友的圖片下面可以帶小程序的連接,但是對小程序類別有要求,不是所有的都可以
  • 如果類別不符合不能配置轉發帶鏈接,否則轉發功能也會調不起來
  • 上傳、下載功能需要配置上傳下載接口域名

小程序和H5互相跳轉并傳參

  • 小程序跳轉H5直接在鏈接之后?拼接參數
    -<web-view class="menu" v-if="query" :src="h5Url+'/#/detail?query='+ query"></web-view>
  • 跳轉參數加密 encodeURIComponent(JSON.stringify(query))
  • H5在mounted接收參數并解密JSON.parse(decodeURIComponent(this.$route.query.query))
  • H5跳轉小程序
 let path = `/page_subject/detail/share?imgURL=${path1}&width=${this.width}&height=${this.height}&id=${this.id}`wx.miniProgram.navigateTo({url: path,success() {Toast.clear();},fail() {Toast('跳轉失敗');}, //小程序地址});

小程序右上角三個點的分享小程序默認分享好友和朋友圈都是灰色的

  • 需要寫代碼開啟
  • 如果每個頁面都需要分享,寫一個公共的js文件,采用MiXin 混入的方式

新建公共share.js文件

export default {data() {return {share: {title: '快來一起制作新年賀卡吧~',// bug:require本地圖片分包之后圖片就顯示不出來了// 不設置圖片,默認展示頁面 // imageUrl: 'https://ossweb-img.qq.com/images/lol/web201310/skin/big10001.jpg',path: '/pages/home/index'}}},onLoad: function() {wx.showShareMenu({withShareTicket: true,menus: ["shareAppMessage", "shareTimeline"]})},onShareAppMessage(res) { //發送給朋友return {title: this.share.title,imageUrl: this.share.imageUrl,path: this.share.path}},onShareTimeline(res) { //分享到朋友圈return {title: this.share.title,imageUrl: this.share.imageUrl,path: this.share.path}},
}

main.js文件混入

import share from './common/share.js'
Vue.mixin(share)

頁面內想單獨覆蓋分享的文字和圖片,可在頁面內重寫data

data() {return {share: {title: '快來一起制作新年賀卡吧~',// bug:require本地圖片分包之后圖片就顯示不出來了// 不設置圖片,默認展示頁面 // imageUrl: 'https://ossweb-img.qq.com/images/lol/web201310/skin/big10001.jpg',path: '/pages/home/index'}}},

H5禁止默認的長按轉發事件

  • 給圖片設置 img{ pointer-events:none; }
  • 如果圖片有點擊事件,點擊事件不會觸發,可以將點擊事件加載img的外層盒子上

開啟微信小程序圖片默認長按事件

  • 小程序<image>默認沒有長按識別事件
  • 在圖片標簽上添加屬性 show-menu-by-longpress

圖片列表使用骨架屏

1707040601850.png

  • 圖片加載過程會出現沒有高度,所以效果不是很好
  • 監聽圖片加載@load,加載之前顯示灰色骨架屏,加載成功顯示圖片
  • bug:在下拉刷新,重新調取接口后@load不執行
  • 解決:下拉刷新,先清空數組,在重新調取接口
<view v-show="!item.isLoading"></view>
<image v-show="item.isLoading" :src="baseUrl + item.img" @load="imgLoad(index)"></image>
// load回調證明圖片加載完成
imgLoad(index) {this.imgList[index].isLoading = true;
},

首頁關注我們頁面內任意拖動

image.png

  • movable-area 可以放在最外層
  • movable-view是movable-area的直接子元素
  • movable-area必須設置寬高,子元素只會在這個區域內移動
  • movable-area設置寬高會占位置,可以position: absolute就會不占位置
  • movable-view會隨著頁面向上滾動而上去,使用position: fixed即可不動
<!-- 可拖拽關注 -->
<movable-area :style="{ width:`${screenWidth - 52}px`, height: `${screenHeight - 50}px`}" class="focusBox"><movable-view :x="screenWidth - 52" :y="screenHeight / 2" direction="all" @click="isFocus = true" class="focus"><image src="../../static/icon/focus.png" alt="" class="focusImg"></image></movable-view>
</movable-area>.focusBox {position: absolute;.focus {position: fixed;z-index: 999;.focusImg {width: 112rpx;height: 108rpx;}}

小程序編輯頁面

http://192.168.2.89:8080/#/detail?query=%7B%22url%22%3A%22%2Fprofile%2Fupload%2F2024%2F01%2F25%2F123_20240125204643A031.jpg%22,%22id%22%3A22%7D

<template><view><web-view class="menu" v-if="query" :src="h5Url+'/#/detail?query='+ query"></web-view></view>
</template><script>import {h5Url,} from '../../common/http.js'export default {data() {return {query: '',h5Url: '',}},onLoad(options) {console.log('query', JSON.parse(decodeURIComponent(options.query)))this.query = options.querythis.h5Url = h5Urlconsole.log(1111, this.h5Url + '/#/detail?query=' + this.query)// this.getWidth(url).finally(() => {// 	this.query = encodeURIComponent(JSON.stringify({// 		url: url,// 		width: this.width,// 		height: this.height// 	}))// 	console.log(55555, {// 			url: url,// 			width: this.width,// 			height: this.height// 		},// 		this.query, h5Url + '/#/detail?query=' + this.query)// })},methods: {// 獲取圖片寬高getWidth(url1) {let _this = thisreturn new Promise((resolve, reject) => {let screenWidth = wx.getSystemInfoSync().windowWidth; // 獲取當前窗口的寬度uni.getImageInfo({src: url,success(image) {console.log(222222, image.width, image.height);let imgRate = image.width / image.height;console.log(33333, Number((screenWidth / imgRate).toFixed()));if (imgRate <= 0.5625) {_this.width = 315;_this.height = 560;} else {_this.width = screenWidth;_this.height = Number((screenWidth / imgRate).toFixed());}resolve()},fail(err) {console.log(44444, err)_this.width = 310;_this.height = 551;reject()}});})},}}
</script><style scoped lang="scss"></style>

H5編輯頁面

<template><div class="w100 vh100 flex flex-column bg-black"><div class="flex_r white bg-black w100 pd-30"><img src="../assets/img/share.png" alt="" style="width: 18px;margin-right: 6px;"><div @click="preview">轉發</div></div><div @click.stop="onDeactivated" style="width: 100%; overflow-y: auto;" class="bg-black flex-1"><!-- :style="{ width: `${width}px`, height: `${height}px` }" --><div style="width: 85%;" class="imgBox relative" :class="height > 550 ? 'top' : 'middle'"><img :src="url" alt="" class="w100 h100" style="display: block;pointer-events:none"><div v-for="(item, i) in arr" :key="i"><!-- clicked - 單擊組件時activated - 單擊組件時調用,以顯示句柄deactivated - 用戶單擊組件外部的任何位置時調用,以便將其停用resizing - 組件調整大小時resizestop - 組件停止調整大小時dragging - 拖動組件時dragstop - 組件停止拖動時調用@deactivated="onDeactivated":parentLimitation="true" --><VueDragResize v-if="item.show" :sticks="['mr', 'br', 'bm', 'bl',]" :isActive="item.isEdit" :w="190" :h="80":x="70" :y="200" :z="999" @resizing="resize" @dragging="resize" @clicked="onActivated(i)" contentClass="box":style="{ 'left': item.left + 'px', 'top': item.top + 'px', }"><p class="absolute gushi":style="{ 'color': item.color, 'font-size': item.size + 'px', 'opacity': item.opacity / 100, 'font-family': item.family, 'font-weight': item.bold, }">{{ item.text }}</p></VueDragResize></div><!-- 二維碼 --><img :src="code" alt="" class="absolute code" :class="width < height ? 'center' : 'right'"></div></div><div class="w100 bg-white"><div class="flex bg pd-30 plr-60" :class="isIos ? 'pb-50' : ''" v-show="!index"><div @click="add" class="flex_l"><img src="../assets/img/add.png" alt="" style="width: 16px;height: 16px;"><div class="ml-6">藏頭詩</div></div><div @click="add1" class="flex_l"><img src="../assets/img/add1.png" alt="" style="width: 22px;height: 22px;"><div class="ml-6">添加祝福語</div></div><div @click="changeImg" class="flex_l"><img src="../assets/img/add2.png" alt="" style="width: 22px;height: 22px;"><div class="ml-6">更換背景</div></div></div><div class="flex bg pd-30" v-show="index"><div @click="del" class="mr-20 flex_l"><img src="../assets/img/del.png" alt="" style="width: 18px;height: 18px;"><div class="ml-6">刪除</div></div><div @click="action = 2" :class="action == 2 ? 'red' : ''" class="mr-20 flex_l"><img v-if="action == 2" src="../assets/img/edit-1.png" alt="" style="width: 18px;height: 18px;"><img v-else src="../assets/img/edit.png" alt="" style="width: 18px;height: 18px;"><div class="ml-6">編輯</div></div><div @click="action = 3" :class="action == 3 ? 'red' : ''" class="mr-20 flex_l"><img v-if="action == 3" src="../assets/img/color-1.png" alt="" style="width: 18px;height: 18px;"><img v-else src="../assets/img/color.png" alt="" style="width: 18px;height: 18px;"><div class="ml-6">顏色</div></div><div @click="action = 4" :class="action == 4 ? 'red' : ''" class="mr-20 flex_l"><img v-if="action == 4" src="../assets/img/size-1.png" alt="" style="width: 18px;height: 18px;"><img v-else src="../assets/img/size.png" alt="" style="width: 18px;height: 18px;"><div class="ml-6">樣式</div></div><div v-if="action" @click="finish" class="flex_l"><img src="../assets/img/finish.png" alt="" style="width: 18px;height: 18px;"><div class="ml-6">完成</div></div></div><div class="pd-30 pb-40" v-if="action == 1"><!-- show-word-limit --><van-field v-model.trim="message" placeholder="輸入藏頭詞:例如新年快樂(10字以內)" clearable type="textarea" autosize rows="1"maxlength="10"><template #button><van-button size="small" type="info" class="solo" @click="getPoetry">生成</van-button></template></van-field></div><div class="pd-30 pb-40" v-if="action == 2 || action == 5"><van-field v-model="arr[index].text" placeholder="" clearable type="textarea" autosize rows="1" /></div><div class="pd-30 pb-40" v-if="action == 3"><div class="flex mr-30 mb-30"><div>透明度</div><van-slider v-model="arr[index].opacity" :min="0" :max="100" style="width: 80%;" active-color="#E94467" /></div><div class="flex flex-wrap"><div class="mlr-12 mt-4"><colorPicker v-model="arr[index].color" /></div><div v-for="(  color, indexs  ) in   colors  " :key="indexs" class="color-option":style="{ backgroundColor: color, border: '1px solid #fff5f6' }" @click="selectColor(color)":class="{ active: color === arr[index].color, }"></div></div></div><div class="pd-30 pb-40" v-if="action == 4"><div class="flex mb-30"><div>字體大小</div><van-slider v-model="arr[index].size" :min="10" :max="80" class="flex-1 mlr-30" active-color="#E94467" /><div @click="changeBold(arr[index].bold)" :class="{ 'bold': arr[index].bold == 700 }" class="red">加粗</div></div><div class="flex_l flex-top"><div class="mr-20">選擇字體</div><div style="max-height: 100px;overflow-y: auto;" class="flex-1"><div v-for="(item, i ) in fonts" :key="i" :style="{ 'font-family': 'font-' + (i + 1) }" @click="selectFont(i)":class="{ 'size-42 red': 'font-' + (i + 1) === arr[index].family }" class="mb-10">{{item }}</div></div></div></div><div class="plr-30  pb-40" v-if="action == 5"><div class="flex_l flex-top"><div style="max-height: 100px;overflow-y: auto;" class="flex-1"><div v-for="(  item, i  ) in   texts  " :key="i" @click="selectText(item)":class="{ 'size-36 red': item === arr[index].text }" class="mb-16">{{item }}</div></div></div></div></div><!-- 更換背景圖組件 --><changeImg ref="changeImgRef" @getImg="getImg"></changeImg></div>
</template><script>
import { Toast, Dialog } from 'vant';
import wx from 'weixin-js-sdk';
import VueDragResize from 'vue-drag-resize';
import html2canvas from "html2canvas";
import changeImg from '../components/changeImg.vue';
export default {name: 'app',components: {VueDragResize,changeImg,},data() {return {id: '', //圖片idurl: '', // 背景圖width: 315,height: 560,message: "", //藏頭詩提示語arr: [], // 文字index: '', // 當前編輯的文字索引action: null, // 1 藏頭詩  2 編輯文字  3 顏色  4 樣式  5 添加祝福語//  ['#fff', '#000000', '#F9E0C6', '#F4C68C', '#F08400', '#F08080', '#FFA07A', '#F44336', '#E91E63', '#F012BE', '#9C27B0', '#673AB7', '#7B68EE', '#3F51B5', '#2196F3',//   '#03A9F4', '#00BCD4', '#009688', '#2ECC40', '#4CAF50', '#8BC34A', '#FFEB3B',//   '#FFFF00', '#FFDC00', '#FFC107', '#FF851B','#FF5722', '#795548', '#9E9E9E', '#607D8B'],colors:['#000000', '#FFFFFF', '#F9E0C6', '#FDF6C0', '#F4C68C', '#FFA07A', '#F08080', '#F08400', '#E85500', '#FEC140', '#E6FF00', '#879D13', '#37A75D', '#2ECC40', '#149125','#009688', '#29C2BA', '#298CFE', '#3F51B5', '#7B68EE', '#9C27B0', '#E91E63','#FC0015', '#C00503', '#8A1F01', '#940304',],fonts: [],texts: ['新年快樂', '新春到了,愿你快樂,幸福平安!', '祝你新年快樂,喜事連連!', '恭祝萬事順,幸福不止步', '春節到來之際,送上我最真摯的祝福:新年快樂!','新的一年,祝你永懷善意,清澈明朗,無憂無慮,平安順遂,吉祥圓滿。','新年新氣象,祝福財氣旺,祝君事業有成,合家歡樂,步步高升!','歲杪春臨,辭舊迎新,專此恭祝:吾師尊長,兄姊好友,新歲維祺,萬事勝意。','新的一年,愿你永懷善意,清澈明朗,無憂無慮,平安順遂,吉祥如意。','歲末將至,敬頌冬綏 。平安喜樂,萬事勝意。歲歲常歡愉,年年皆勝意。','日邁月征,朝暮輪轉,愿新年勝舊年,歡愉且勝意,萬事盡可期。','大財,小財,意外財,財源滾滾;親情,友情,愛情,情情如意官運;福運,財運,桃花運,運運亨通。','新的一年,愿你將遇之人皆為摯友,愿你去往之地皆為熱土。天高地闊,萬事勝意。人海滄滄,順遂無憂。','祝你在新的一年里 無疾病侵擾,無歲月白頭,無枯木羈絆。四時春秋平安度過,萬千山水得以一游。','新年到,放鞭炮:一響鴻運照;二響憂愁拋;三響煩惱消;四響財運到;五響收入高;六響身體好;七響心情妙;八響平安罩;九響幸福繞;十響事業節節高!','祈家事平和,花朝月夕多勝意。愿人間芳華,歲歲年年長安康。樂親朋,歲無憂,新春快樂。','裁雪為畫,揉風作詩。愿歲月溫柔,點點滴滴成全人間悲喜;愿你畢生歡愉,朝朝暮暮造就星河奔騰。'],imgURL: '',w: 0,h: 0,code: '', // 二維碼isIos: false,}},mounted() {console.log(this.appSource())this.isIos = Boolean(this.appSource() == 'ios')console.log(JSON.parse(decodeURIComponent(this.$route.query.query)))let query = JSON.parse(decodeURIComponent(this.$route.query.query))this.url = '/stage-api' + query.urlthis.id = query.idthis.getBase64(this.url)let code = require('../assets/img/code.png')this.getBase64Code(code)// 字體//參數:1.路徑;2.是否遍歷子目錄;3.正則表達式const files = require.context("../assets/fonts", true).keys();this.fonts = files.map(item => item.split('-')[1].split('.')[0])console.log(files.map(item => item.split('-')[1].split('.')[0]));// ['思源黑體', '包圖小白體', '峰廣明銳體', '豆豆字體', '站酷慶科黃油體', '銳字真言體', '卓健橄欖簡體', '演示悠然小楷', '優設標題黑', '沐瑤隨心手寫體', '青柳隸書', '演示佛系體', '優設好身體', '優設鯊魚菲特健康體', '阿朱泡泡體', '阿里巴巴普惠體', '龐門正道標題體', '傳奇特戰體', '思源宋體', '清松手寫體', '龔帆免費體', '851力量體', '赤薔薇灰姑娘', '可愛少女體', '胖胖豬肉體', '千圖小兔體']},methods: {//判斷安卓和iosappSource() {const u = navigator.userAgent;const isiOS = !!u.match(/\(i[^;]+;( U;)? CPU.+Mac OS X/);if (isiOS) {return "ios";} else {return "android";}},getBase64(src) {var image = new Image();image.crossOrigin = '*'; // 支持跨域圖片image.src = src + '?v=' + Math.random(); // 處理緩存image.onload = () => {var base64 = this.getBase64Image(image);this.url = base64}},getBase64Image(img) {var canvas = document.createElement("canvas");canvas.width = img.width;canvas.height = img.height;var ctx = canvas.getContext("2d");ctx.drawImage(img, 0, 0, img.width, img.height);var dataURL = canvas.toDataURL("image/png"); // 可選其他值 image/jpegreturn dataURL;},//  本地二維碼轉base64getBase64Code(imgUrl) {window.URL = window.URL || window.webkitURL;const xhr = new XMLHttpRequest();xhr.open("get", imgUrl, true);xhr.responseType = "blob";xhr.onload = () => {if (xhr.status == 200) {//得到一個blob對象const blob = xhr.response;const oFileReader = new FileReader();oFileReader.readAsDataURL(blob);oFileReader.onloadend = e => {this.code = e.target.result;//base64編碼 };}};xhr.send();},add() {this.action = 1},getPoetry() {if (!this.message) {this.$toast({message: '請輸入藏頭詞'})} else {Toast.loading({message: '生成中...',forbidClick: true,});this.$axios.get('/stage-api/system/management/getMessages?messages=' + this.message).then(res => {console.log(res.msg)if (!res.msg) {Toast.clear();Dialog.alert({title: '溫馨提示',message: '未獲取到相關藏頭,請更換提示語重新生成',}).then(() => {// on close});} else {this.message = ''this.arr.push({text: res.msg,color: '#FFFFFF',size: 24,opacity: 100,family: 'font-3',bold: 400,isEdit: false,show: true,top: 200,left: 70,})this.index = (this.arr.length - 1) + ''this.action = 2Toast.clear();}})}},add1() {this.arr.push({text: '新年快樂',color: '#FFFFFF',size: 28,opacity: 100,family: 'font-12',bold: 400,isEdit: false,show: true,top: 200,left: 70,})this.index = (this.arr.length - 1) + ''this.action = 5},changeImg() {this.$refs.changeImgRef.init()},getImg(query) {this.url = '/stage-api' + query.urlthis.id = query.idthis.getBase64(this.url)},finish() {this.onDeactivated()},del() {this.$set(this.arr[this.index], 'show', false)this.onDeactivated()},selectColor(color) {this.$set(this.arr[this.index], 'color', color)},selectFont(i) {this.$set(this.arr[this.index], 'family', 'font-' + (i + 1))},selectText(item) {this.$set(this.arr[this.index], 'text', item)},changeBold(flag) {this.$set(this.arr[this.index], 'bold', flag == 700 ? 400 : 700)},// 拖拽時可以確定元素位置resize(newRect) {this.w = newRect.width;this.h = newRect.height;this.$set(this.arr[this.index], 'top', newRect.top)this.$set(this.arr[this.index], 'left', newRect.left)},onActivated(i) {console.log('點擊了' + i,)this.arr.forEach((el, index) => {if (index == i) {this.index = i + ''this.$set(this.arr[index], 'isEdit', true)this.action = 2} else {this.$set(this.arr[index], 'isEdit', false)}});},onDeactivated() {this.index = nullthis.action = nullthis.arr.forEach((el, index) => {this.$set(this.arr[index], 'isEdit', false)});},preview() {this.onDeactivated()Toast.loading({message: '生成中...',forbidClick: true,loadingType: 'spinner',});setTimeout(() => {html2canvas(document.querySelector('.imgBox'), {backgroudColor: null,scale: 3, // 1125}).then(canvas => {let imgUrl = canvas.toDataURL('image/png');// console.log(imgUrl);this.imgURL = imgUrl;   //base64格式// 構建FormData對象,通過該對象存儲要上傳的文件const formData = new FormData();// 遍歷當前臨時文件List,將上傳文件添加到FormData對象中formData.append('baseName', this.imgURL);this.$axios.post('/stage-api/system/management/upload', formData).then(res => {console.log(88877, res.fileName)let path1 = res.fileNamelet path = `/page_subject/detail/share?imgURL=${path1}&width=${this.width}&height=${this.height}&id=${this.id}`wx.miniProgram.navigateTo({url: path,success() {Toast.clear();},fail() {Toast('跳轉失敗');}, //小程序地址});}).catch(err => {console.log(999, err)})})}, 100);},}
}
</script>
<style scoped lang="scss">
.imgBox {// margin-left: 30px;background: #000 url('') no-repeat center center;background-size: 100% 100%;&.top {left: 50%;top: 0%;transform: translateX(-50%);}&.middle {left: 50%;top: 50%;transform: translate(-50%, -50%);}
}.color-option {width: 60px;height: 60px;margin: 8px;border-radius: 50%;
}.color-option.active {border: 2px solid #FFFFFF;
}::v-deep .m-colorPicker .colorBtn {width: 50px;height: 50px;
}::v-deep .box .vdr-stick {width: 35px !important;height: 35px !important;// background: #E94467;border: 1px solid #fff;border-radius: 50%;background: linear-gradient(221.12deg, #FB3568 0%, #FF8B6B 100%);&.vdr-stick-br {bottom: -16px !important;right: -15px !important;}&.vdr-stick-mr {right: -15px !important;}&.vdr-stick-bm {bottom: -16px !important;}&.vdr-stick-bl {bottom: -16px !important;}
}img.code {width: 100px;height: 100px;bottom: 20px;&.right {width: 100px;height: 100px;right: 20px;}&.center {left: 50%;transform: translateX(-50%);}
}.van-cell {border: 1px solid #ccc;
}::v-deep.m-colorPicker {border: 1px solid #ccc;
}.gushi {animation: test 2s;left: 0;top: 0;
}@keyframes test {0% {left: 0px;top: 1000px;}50% {transform: scale(1.5);left: 0px;bottom: 300px;}// 100% {//   left: 0;//   top: 0;// }
}::v-deep .solo.van-button--info {color: #fff;background-color: #E94467;border: 1px solid #E94467;
}
</style>

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/712084.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/712084.shtml
英文地址,請注明出處:http://en.pswp.cn/news/712084.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

上云還是下云,最大挑戰是什么?| 對話章文嵩、畢玄、王小瑞

近半年來&#xff0c;公有云領域頻頻發生阿里云、滴滴等平臺崩潰事件&#xff0c;與此同時&#xff0c;馬斯克的“X 下云省錢”言論引起了廣泛關注&#xff0c;一時間&#xff0c;“上云”和“下云”成為熱議話題。在最近舉辦的 AutoMQ 云原生創新論壇上&#xff0c;AutoMQ 聯合…

大數據可視化python01

import pandas as pd import matplotlib.pyplot as plt# 設置中文改寫字體 plt.rcParams[font.sans-serif] [SimHei]# 讀取數據 data pd.read_csv(C:/Users/wzf/Desktop/讀取數據進行數據可視化練習/實訓作業練習/瓜果類單位面積產量.csv ,encoding utf-8)#輸出 print(data)…

springcloud alibaba組件簡介

一、Nacos 服務注冊中心/統一配置中心 1、介紹 Nacos是一個配置中心&#xff0c;也是一個服務注冊與發現中心。 1.1、配置中心的好處&#xff1a; &#xff08;1&#xff09;配置數據脫敏 &#xff08;2&#xff09;防止出錯&#xff0c;方便管理 &#xff08;3&#xff…

一本通 1403:素數對

在判斷素數對的兩個數是否都為素數時可以只判斷數的一半 #include<bits/stdc.h> using namespace std; bool su(int a,int b){ for(int i2;i<sqrt(a);i){ if(a%i0){ return 0; } } for(int i2;i<sqrt(b);i){ if(…

AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境等應用

原文鏈接&#xff1a;AI大預言模型——ChatGPT在地學、GIS、氣象、農業、生態、環境等應用 一開啟大模型 1 開啟大模型 1)大模型的發展歷程與最新功能 2)大模型的強大功能與應用場景 3)國內外經典大模型&#xff08;ChatGPT、LLaMA、Gemini、DALLE、Midjourney、Stable Di…

Java底層自學大綱_中間件原理篇

中間件原理專題_自學大綱所屬類別學習主題建議課時&#xff08;h&#xff09; A Web服務器Tomcat8原理分析001 Tomcat8底層架構模式2.5 A Web服務器Tomcat8原理分析002 Tomcat8底層源碼深度分析2.5 A Web服務器Tomcat8原理分析003 站在微服務架構角度優化Tomcat82.5 B 分布…

SpringMVC基礎概述

目錄 MVC核心組件RequestMapping注解域對象共享數據視圖RESTful請求與響應HttpMessageConverter請求響應 攔截器配置異常處理基于配置的異常處理基于注解的異常處理 配置類與注解配置MVC執行流程 Spring MVC是Spring Framework提供的Web組件&#xff0c;全稱是Spring Web MVC&a…

ConcurrentHashMap的演進:從Java 8之前到Java 17的實現原理深度剖析

目錄 一、引言二、Java 8之前的ConcurrentHashMap1、內部結構與初始化2、Segment類3、并發控制4、擴容與重哈希5、總結 三、Java 8中的ConcurrentHashMap1、數據結構2、并發控制2.1. CAS操作2.2. synchronized同步塊 3、哈希計算與定位4、擴容與重哈希5、總結 四、Java 17中的C…

廣汽埃安工廠:蔚來汽車的造車工廠有哪些?

具體來說&#xff0c;理想汽車目前在常州僅有一家汽車制造工廠。 一期項目于2017年12月竣工&#xff0c;2019年12月投產&#xff0c;年產能10萬輛/年。 同時&#xff0c;正在規劃二期工程。 產能將增至20萬輛/年。 此外&#xff0c;理想還計劃接管現代汽車在北京順義的第一家工…

抖音小店怎么開店注冊?別在全網找教程了,2024年最新開店教程來了

大家好&#xff0c;我是電商糖果 想開一家抖音小店&#xff0c;不會開&#xff0c;也不懂需要準備哪些材料。 在網上扒拉了一堆教程&#xff0c;不知道應該聽哪個&#xff1f; 害怕店鋪開錯了&#xff0c;后續還要關店。 有這些擔心的朋友&#xff0c;看到這篇文章的時候&a…

工業現場網絡性能評估方案

最近要去一個工廠排查網絡和電腦卡頓的問題,為此&#xff0c;我準備了以下的方案&#xff0c;在現場以抓包和網絡監控的方式來排查。 1.評估流程 為了評估Linux系統的網絡負荷&#xff0c;并使用tcpdump來捕獲數據包進行分析&#xff0c;您需要遵循以下幾個步驟&#xff1a; …

自動化搭建---環境搭建與配置

1. 確定所需環境 與項目團隊和開發人員詳細溝通&#xff0c;了解項目的具體環境需求。這可能包括操作系統版本、數據庫類型&#xff08;如MySQL、PostgreSQL等&#xff09;、Web服務器&#xff08;如Apache、Nginx等&#xff09;以及其他依賴軟件。 2. 安裝操作系統 根據項目…

數據倉庫與數據挖掘概述

目錄 一、數據倉庫概述 &#xff08;一&#xff09;從傳統數據庫到數據倉庫 &#xff08;二&#xff09;數據倉庫的4個特征 &#xff08;三&#xff09;數據倉庫系統 &#xff08;四&#xff09;數據倉庫系統體系結構 &#xff08;五&#xff09;數據倉庫數據的粒度與組織…

論文閱讀_代碼生成模型_CodeGeeX

英文名稱: CodeGeeX: A Pre-Trained Model for Code Generation with Multilingual Evaluations on HumanEval-X 中文名稱: CodeGeeX&#xff1a;一種用于代碼生成的預訓練模型&#xff0c;并在HumanEval-X上進行多語言評估 鏈接: https://arxiv.org/abs/2303.17568 代碼: http…

無處不在的智慧:嵌入式系統引領智能生活

無處不在的智慧&#xff1a;嵌入式系統引領智能生活 嵌入式系統作為智能生活的重要組成部分&#xff0c;正逐漸滲透到我們的日常生活中&#xff0c;引領著智能生活的發展。以下將從多個方面對嵌入式系統在智能生活中的引領作用進行詳細論述。 智能家居中的嵌入式系統應用 嵌…

訓練1 : 老頭

以前用blender做的特效 總結 頭發很費時間, 需要參考和練習眼窩周邊結構還有些待準確把握從光與影中揣摩輪廓形狀 從少量面掌握大體, 從多數面雕刻細節

terminal下環境不統一導致的程序報錯(powersell改cmd)

1.報錯現象 在terminal下利用命令行執行代碼顯示運行環境缺包&#xff1a; 但將命令中的參數寫入參數文件&#xff0c;運行train.py時&#xff0c;程序可以正常運行&#xff1a; 直接運行train.py:程序可用&#xff1a; 2.原因分析 參考文章 控制臺環境和項目環境不一致問…

【Mysql】InnoDB 中 B+ 樹索引的注意事項

一、根頁面萬年不動 在之前的文章里&#xff0c;為了方便理解&#xff0c;都是先畫存儲用戶記錄的葉子節點&#xff0c;然后再畫出存儲目錄項記錄的內節點。 但實際上 B 樹的行成過程是這樣的&#xff1a; 每當為某個表創建一個 B 樹索引&#xff0c;都會為這個索引創建一個根…

C++高級面試題:請解釋 C++ 中的標準模板庫(STL)及其常見組件

請解釋 C 中的標準模板庫&#xff08;STL&#xff09;及其常見組件 C 標準模板庫&#xff08;Standard Template Library&#xff0c;STL&#xff09;是 C 標準庫的一部分&#xff0c;提供了豐富的通用數據結構和算法實現&#xff0c;以及許多與數據處理相關的工具。STL 中的組…

循環隊列的實現

文章目錄 循環隊列的概念循環隊列的實現循環隊列的判空和判滿鏈表or數組 循環隊列的概念 設計你的循環隊列實現。 循環隊列是一種線性數據結構&#xff0c;其操作表現基于 FIFO&#xff08;先進先出&#xff09;原則并且隊尾被連接在隊首之后以形成一個循環。它也被稱為“環形緩…