Browse Source

微信小程序优化

master
xuhuajiao 3 weeks ago
parent
commit
a604ae8a35
  1. 4
      .env.development
  2. 122
      src/views/weChatMiniProgram/baseSetting.vue
  3. 4
      src/views/weChatMiniProgram/bookrecommend.vue
  4. 268
      src/views/weChatMiniProgram/module/wecharQrCode.vue

4
.env.development

@ -3,8 +3,8 @@ ENV = 'development'
# 接口地址 # 接口地址
# 许镇-本地服地址 # 许镇-本地服地址
VUE_APP_BASE_API = 'http://192.168.99.63:14000'
# VUE_APP_BASE_API = 'https://wechatapi.aiyxlib.com'
# VUE_APP_BASE_API = 'http://192.168.99.63:14000'
VUE_APP_BASE_API = 'https://wechatapi.aiyxlib.com'
VUE_APP_WECHAT_URL = 'https://wechatapi.aiyxlib.com' VUE_APP_WECHAT_URL = 'https://wechatapi.aiyxlib.com'

122
src/views/weChatMiniProgram/baseSetting.vue

@ -5,7 +5,6 @@
<div class="config-item"> <div class="config-item">
<div class="config-item-main"> <div class="config-item-main">
<span class="data-title">数据接口</span> <span class="data-title">数据接口</span>
<!-- 原数据接口表单 -->
<el-form ref="openForm" :model="openForm" size="small" label-width="100px"> <el-form ref="openForm" :model="openForm" size="small" label-width="100px">
<el-form-item label="域名地址" prop="open_lib_http"> <el-form-item label="域名地址" prop="open_lib_http">
<el-tooltip <el-tooltip
@ -39,7 +38,6 @@
placement="top" placement="top"
> >
<span <span
class="edit-readonly" class="edit-readonly"
@dblclick="handleDblClick('openForm', 'open_lib_appId')" @dblclick="handleDblClick('openForm', 'open_lib_appId')"
> >
@ -125,7 +123,6 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<!-- <div class="config-remarks">双击输入框可进行编辑</div> -->
</div> </div>
<div class="config-item"> <div class="config-item">
<div class="config-item-main"> <div class="config-item-main">
@ -210,9 +207,19 @@
</el-form-item> </el-form-item>
</el-form> </el-form>
</div> </div>
<!-- <div class="config-remarks">双击输入框可进行编辑</div> -->
</div> </div>
<wecharQrCode ref="wecharQrCodeRef" :is-mini-program="true" :qr-code-url="wecharQrCodeUrl" @triggerInit="initScreenSetting" @ready="onWechatQrCodeReady" />
<!-- 监听子组件 update:qrcodeurl 更新父组件本地变量 -->
<WeChatQrCode
ref="wecharQrCodeRef"
:is-mini-program="true"
:qr-code-url="wecharQrCodeUrl"
:record-id="wechatQrRecordId"
@update:qr-code-url="val => wecharQrCodeUrl = val"
@update:record-id="val => wechatQrRecordId = val"
@triggerInit="initScreenSetting"
@ready="onWechatQrCodeReady"
/>
</div> </div>
</div> </div>
</div> </div>
@ -221,16 +228,17 @@
<script> <script>
import { FetchInitScreenSetting, FetchEditScreenSetting } from '@/api/digitalScreen/index' import { FetchInitScreenSetting, FetchEditScreenSetting } from '@/api/digitalScreen/index'
import { mapGetters } from 'vuex' import { mapGetters } from 'vuex'
import wecharQrCode from '../digitalScreen/module/wecharQrCode'
import WeChatQrCode from './module/wecharQrCode'
export default { export default {
name: 'WeChatMiniProgram', name: 'WeChatMiniProgram',
components: { components: {
wecharQrCode
WeChatQrCode
}, },
data() { data() {
return { return {
wecharQrCodeUrl: null, wecharQrCodeUrl: null,
wechatQrRecordId: null,
openForm: { openForm: {
open_lib_http: null, open_lib_http: null,
open_lib_appId: null, open_lib_appId: null,
@ -272,22 +280,23 @@ export default {
...mapGetters([ ...mapGetters([
'baseApi', 'baseApi',
'user' 'user'
])
},
created() {
]),
imgHttpsUrl() {
if (process.env.NODE_ENV === 'production') {
return (window.g && window.g.ApiUrl) || ''
} else {
return process.env.VUE_APP_WECHAT_URL
}
}
}, },
mounted() { mounted() {
this.$nextTick(() => {
this.initScreenSetting() this.initScreenSetting()
})
}, },
methods: { //
methods: {
initScreenSetting() { initScreenSetting() {
FetchInitScreenSetting({ 'libcode': this.user.fonds.fondsNo }).then(res => { FetchInitScreenSetting({ 'libcode': this.user.fonds.fondsNo }).then(res => {
Object.values(res).forEach(item => { Object.values(res).forEach(item => {
const { code, context } = item
//
const { code, context, id } = item
if (code === 'open_lib_http') { if (code === 'open_lib_http') {
this.openForm.open_lib_http = context this.openForm.open_lib_http = context
} else if (code === 'open_lib_appId') { } else if (code === 'open_lib_appId') {
@ -299,31 +308,36 @@ export default {
} else if (code === 'opac_url') { } else if (code === 'opac_url') {
this.openForm.opac_url = context this.openForm.opac_url = context
} }
//
if (code === 'vx_mini_appId') { if (code === 'vx_mini_appId') {
this.vxForm.vx_mini_appId = context this.vxForm.vx_mini_appId = context
} else if (code === 'vx_mini_secret') { } else if (code === 'vx_mini_secret') {
this.vxForm.vx_mini_secret = context this.vxForm.vx_mini_secret = context
} }
//
if (code === 'op_user') { if (code === 'op_user') {
this.adminForm.op_user = context this.adminForm.op_user = context
} }
//
if (code === 'wechar_qr_code') {
this.wecharQrCodeUrl = this.baseApi + '/api/fileRelevant/getImg?imgType=1&imgId=' + context
if (code === 'wechat_qr_code') {
this.wechatQrRecordId = id
console.log('id', id)
// context
console.log('context', context)
// this.wecharQrCodeUrl = context ? this.baseApi + '/files/' + context : null
this.wecharQrCodeUrl = context ? this.imgHttpsUrl + '/files/' + context : null
} }
}) })
}).catch(() => {
//
this.$nextTick(() => {
if (this.$refs.wecharQrCodeRef) {
this.$refs.wecharQrCodeRef.reloadImage()
}
})
}).catch((err) => {
console.error('大屏配置初始化失败', err)
}) })
}, },
onWechatQrCodeReady() { onWechatQrCodeReady() {
this.$refs.wecharQrCodeRef.reloadImage()
// readyreloadImageinitScreenSettingnextTick
}, },
//
handleDblClick(formName, field) { handleDblClick(formName, field) {
this.originalValues[formName][field] = this[formName][field] this.originalValues[formName][field] = this[formName][field]
this.editStatus[formName][field] = true this.editStatus[formName][field] = true
@ -338,71 +352,29 @@ export default {
this.saveEdit(formName, field) this.saveEdit(formName, field)
} }
}, },
saveEdit(formName, field) {
console.log(this.user)
async saveEdit(formName, field) {
const code = field const code = field
const context = this[formName][field] const context = this[formName][field]
const libcode = this.user.fonds.fondsNo const libcode = this.user.fonds.fondsNo
const remarks = '' const remarks = ''
if (!context && context !== 0) { if (!context && context !== 0) {
//
this.$message.warning(`${this.getFieldLabel(formName, field)}不能为空`) this.$message.warning(`${this.getFieldLabel(formName, field)}不能为空`)
this.rollbackValue(formName, field) this.rollbackValue(formName, field)
return return
} }
// 3.
const submitParam = { code, context, libcode, remarks } const submitParam = { code, context, libcode, remarks }
// 4.
FetchEditScreenSetting(submitParam)
.then(() => {
try {
await FetchEditScreenSetting(submitParam)
this.$message.success(`${this.getFieldLabel(formName, field)}更新成功`) this.$message.success(`${this.getFieldLabel(formName, field)}更新成功`)
//
// if (formName === 'title') {
// this.originalTitle = this.screen_title
// this.originalValues.title = this.screen_title
// } else if (formName === 'specialFields' && field.startsWith('show') && field !== 'show_screen') {
// // originalTime
// const screenItem = this.screenItems.find(item => item.code === field)
// if (screenItem) {
// screenItem.originalTime = context
// }
// this.originalValues[formName][field] = context
// } else if (formName !== 'specialFields' || field !== 'show_screen') {
// this.originalValues[formName][field] = context
// }
})
.catch(() => {
this.originalValues[formName][field] = context
} catch (err) {
this.$message.error(`${this.getFieldLabel(formName, field)}更新失败`) this.$message.error(`${this.getFieldLabel(formName, field)}更新失败`)
this.rollbackValue(formName, field) this.rollbackValue(formName, field)
})
}
}, },
//
rollbackValue(formName, field) { rollbackValue(formName, field) {
if (this.originalValues[formName]?.[field] !== undefined) { if (this.originalValues[formName]?.[field] !== undefined) {
if (formName === 'title') {
this.screen_title = this.originalValues[formName][field]
} else if (formName === 'specialFields' && field.startsWith('show') && field !== 'show_screen') {
//
const screenItem = this.screenItems.find(item => item.code === field)
if (screenItem) {
screenItem.time = this.originalValues[formName][field]
screenItem.originalTime = this.originalValues[formName][field]
}
} else if (formName === 'specialFields') {
this[field] = this.originalValues[formName][field]
} else {
this[formName][field] = this.originalValues[formName][field] this[formName][field] = this.originalValues[formName][field]
//
if (formName === 'librarySettingForm') {
const originalChecked = this.originalValues[formName][`${field}_checked`]
if (originalChecked !== undefined) {
this[formName][`${field}_checked`] = originalChecked
}
}
}
} }
}, },
getFieldLabel(formName, field) { getFieldLabel(formName, field) {

4
src/views/weChatMiniProgram/bookrecommend.vue

@ -31,7 +31,7 @@
<el-table-column label="著者" prop="author" /> <el-table-column label="著者" prop="author" />
<el-table-column label="出版社" prop="publisher" /> <el-table-column label="出版社" prop="publisher" />
<el-table-column label="ISBN" prop="isbn" /> <el-table-column label="ISBN" prop="isbn" />
<el-table-column label="分类号" prop="classNo" />
<el-table-column label="分类号" prop="callnos" />
<el-table-column label="出版年份" prop="publisherdate" /> <el-table-column label="出版年份" prop="publisherdate" />
<el-table-column label="上传时间" prop="create_time" width="160"> <el-table-column label="上传时间" prop="create_time" width="160">
<template slot-scope="scope"> <template slot-scope="scope">
@ -64,7 +64,7 @@
<span>ISBN</span><p>{{ detailData.isbn || '-' }}</p> <span>ISBN</span><p>{{ detailData.isbn || '-' }}</p>
</div> </div>
<div class="detail-item"> <div class="detail-item">
<span>分类号</span><p>{{ detailData.classNo || '-' }}</p>
<span>分类号</span><p>{{ detailData.callnos || '-' }}</p>
</div> </div>
<div class="detail-item"> <div class="detail-item">
<span>出版日期</span><p>{{ detailData.publisherdate || '-' }}</p> <span>出版日期</span><p>{{ detailData.publisherdate || '-' }}</p>

268
src/views/weChatMiniProgram/module/wecharQrCode.vue

@ -0,0 +1,268 @@
<template>
<div class="config-item">
<div class="config-item-main">
<span class="data-title">二维码</span>
<div class="upload-item" style="margin-bottom: 20px;">
<p>公众号二维码</p>
<div style="display: flex; justify-content: flex-start;">
<div class="image-container">
<!-- loading遮罩 -->
<div v-if="isLoadingImg" class="image-loading">
<div class="spinner" />
<span class="loading-text">加载中...</span>
</div>
<img
v-show="!isLoadingImg"
:key="imageKey"
style="display: block; height: 120px; margin-right: 15px; transition: opacity 0.3s ease-in-out;"
:src="currentQrCodeUrl"
:class="{ 'image-loaded': !isLoadingImg && currentQrCodeUrl }"
alt="公众号二维码"
@load="handleImageLoad"
@error="handleImageError"
>
<!-- 错误提示 -->
<div v-if="imageError && !isLoadingImg" class="image-error">
<i class="iconfont icon-error" />
<span>加载失败</span>
</div>
</div>
<div class="upload-img-input">
<input
ref="fileInput"
type="file"
accept="image/*"
style="display: none;"
@change="changeFile($event)"
>
<div
class="upload-libImg"
:class="{ 'is-disabled': uploadLoading }"
@click="handleClickUpload"
>
<i class="iconfont icon-shangchuan2" />
<span>{{ uploadLoading ? '上传中...' : '点击上传' }}</span>
</div>
</div>
</div>
</div>
</div>
<div v-if="!isMiniProgram" class="config-remarks">二维码用于总览屏媒体屏在任意分屏编辑均可生效</div>
</div>
</template>
<script>
import { FetchEditScreenSetting } from '@/api/digitalScreen/index'
import { mapGetters } from 'vuex'
import { upload } from '@/utils/upload'
export default {
name: 'WeChatQrCode',
props: {
qrCodeUrl: {
type: String,
default: null
},
isMiniProgram: {
type: Boolean,
default: false
},
recordId: { // prop
type: [Number, String],
default: null
}
},
data() {
return {
defaultImg: require('@/assets/images/cover-bg.png'),
imageKey: 0,
localQrCodeUrl: null,
isLoadingImg: false,
imageError: false,
uploadLoading: false
}
},
computed: {
...mapGetters(['baseApi', 'user']),
currentQrCodeUrl() {
if (this.localQrCodeUrl) {
return this.localQrCodeUrl
}
if (this.qrCodeUrl) {
// url使baseApi
return this.qrCodeUrl
}
return this.defaultImg
}
},
watch: {
qrCodeUrl(newVal) {
this.localQrCodeUrl = newVal
this.reloadImage()
}
},
created() {
this.localQrCodeUrl = this.qrCodeUrl
},
mounted() {
this.$emit('ready')
},
methods: {
handleClickUpload() {
if (this.uploadLoading) return
this.$refs.fileInput.click()
},
async changeFile(e) {
const file = e.target.files[0]
this.$refs.fileInput.value = ''
if (!file) return
if (!file.type.startsWith('image/')) {
this.$message({ message: '只可上传图片', type: 'error', offset: 8 })
return
}
// 5MB
const MAX_SIZE = 5 * 1024 * 1024
if (file.size > MAX_SIZE) {
this.$message.error('图片不能超过5MB')
return
}
try {
this.uploadLoading = true
const res = await upload(this.baseApi + '/api/fileRelevant/uploadHttpsImg', file)
console.log('uploadHttpsImgres', res)
if (res.data.code === 200) {
const filePath = res.data.data
console.log('filePath', filePath)
await this.submitCover(filePath)
} else {
this.$message.error('图片上传失败')
}
} catch (err) {
console.error('上传异常:', err)
this.$message.error('图片上传失败')
} finally {
this.uploadLoading = false
}
},
async submitCover(imgUrl) {
const param = {
code: 'wechat_qr_code',
context: imgUrl,
remarks: null,
libcode: this.user.fonds.fondsNo,
id: this.recordId
}
console.log('param', param)
try {
await FetchEditScreenSetting(param)
this.$message.success('公众号二维码更新成功')
this.localQrCodeUrl = this.imgHttpsUrl + '/files/' + imgUrl
this.reloadImage()
this.$emit('update:qrCodeUrl', this.imgHttpsUrl + '/files/' + imgUrl)
this.$emit('triggerInit')
} catch (err) {
console.error('保存二维码失败', err)
this.$message.error('保存二维码失败')
throw err
}
},
reloadImage() {
this.isLoadingImg = true
this.imageError = false
this.imageKey++
},
handleImageLoad() {
this.isLoadingImg = false
this.imageError = false
},
handleImageError() {
this.isLoadingImg = false
this.imageError = true
}
}
}
</script>
<style lang="scss" scoped>
@import "~@/assets/styles/digitalScreen.scss";
.image-container {
position: relative;
min-width: 120px;
height: 120px;
}
.image-loading {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 120px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: #f5f5f5;
border-radius: 4px;
}
.spinner {
width: 20px;
height: 20px;
border: 2px solid #eee;
border-top: 2px solid #0348f3;
border-radius: 50%;
animation: spin 1s linear infinite;
margin-bottom: 8px;
}
@keyframes spin {
0% { transform: rotate(0deg); }
100% { transform: rotate(360deg); }
}
.loading-text {
font-size: 12px;
color: #666;
}
.image-loaded {
opacity: 1;
}
.image-error {
position: absolute;
top: 0;
left: 0;
width: 100%;
height: 120px;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
background-color: #f5f5f5;
border-radius: 4px;
color: #ED4A41;
font-size: 12px;
}
.image-error .icon-error {
font-size: 20px;
margin-bottom: 8px;
}
.upload-libImg {
cursor: pointer;
display: flex;
align-items: center;
gap: 4px;
}
.upload-libImg.is-disabled {
cursor: not-allowed;
color: #999;
}
</style>
Loading…
Cancel
Save