From 2406816eb47812d3805c185f6120d8f7bf0273eb Mon Sep 17 00:00:00 2001 From: liaoxinyu Date: Tue, 2 Apr 2024 18:02:13 +0800 Subject: [PATCH] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E8=B5=84=E8=AE=AF=E4=B8=AD?= =?UTF-8?q?=E5=BF=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.js | 4 +- js_sdk/mmmm-image-tools/index.js | 196 ++++++++++++++ js_sdk/mmmm-image-tools/package.json | 11 + pages.json | 2 + pages/category/consulting/detail.vue | 64 ++++- pages/category/consulting/list.vue | 190 +++++++++++--- pages/category/index.vue | 36 +-- pages/user/shopcart/index.vue | 12 +- uni_modules/q-previewImage/changelog.md | 24 ++ .../q-previewImage/q-previewImage.vue | 136 ++++++++++ uni_modules/q-previewImage/package.json | 81 ++++++ uni_modules/q-previewImage/readme.md | 244 ++++++++++++++++++ utils/json/information.json | 93 +++++++ utils/json/readmore.json | 13 + 14 files changed, 1029 insertions(+), 77 deletions(-) create mode 100644 js_sdk/mmmm-image-tools/index.js create mode 100644 js_sdk/mmmm-image-tools/package.json create mode 100644 uni_modules/q-previewImage/changelog.md create mode 100644 uni_modules/q-previewImage/components/q-previewImage/q-previewImage.vue create mode 100644 uni_modules/q-previewImage/package.json create mode 100644 uni_modules/q-previewImage/readme.md create mode 100644 utils/json/information.json create mode 100644 utils/json/readmore.json diff --git a/config.js b/config.js index 1aa3ac1..87db025 100644 --- a/config.js +++ b/config.js @@ -12,8 +12,8 @@ module.exports = { // product env // apiUrl: "http://10.24.4.14:80/", // apiUrl: "http://10.24.4.156/", - apiUrl: "./kk/", - // apiUrl: "http://192.168.66.219:8081/kk/", + // apiUrl: "./kk/", + apiUrl: "http://192.168.66.219:8081/kk/", /** * 是否启用商城设置缓存 diff --git a/js_sdk/mmmm-image-tools/index.js b/js_sdk/mmmm-image-tools/index.js new file mode 100644 index 0000000..acf40bc --- /dev/null +++ b/js_sdk/mmmm-image-tools/index.js @@ -0,0 +1,196 @@ +function getLocalFilePath(path) { + if (path.indexOf('_www') === 0 || path.indexOf('_doc') === 0 || path.indexOf('_documents') === 0 || path.indexOf('_downloads') === 0) { + return path + } + if (path.indexOf('file://') === 0) { + return path + } + if (path.indexOf('/storage/emulated/0/') === 0) { + return path + } + if (path.indexOf('/') === 0) { + var localFilePath = plus.io.convertAbsoluteFileSystem(path) + if (localFilePath !== path) { + return localFilePath + } else { + path = path.substr(1) + } + } + return '_www/' + path +} + +function dataUrlToBase64(str) { + var array = str.split(',') + return array[array.length - 1] +} + +var index = 0 +function getNewFileId() { + return Date.now() + String(index++) +} + +function biggerThan(v1, v2) { + var v1Array = v1.split('.') + var v2Array = v2.split('.') + var update = false + for (var index = 0; index < v2Array.length; index++) { + var diff = v1Array[index] - v2Array[index] + if (diff !== 0) { + update = diff > 0 + break + } + } + return update +} + +export function pathToBase64(path) { + return new Promise(function(resolve, reject) { + if (typeof window === 'object' && 'document' in window) { + if (typeof FileReader === 'function') { + var xhr = new XMLHttpRequest() + xhr.open('GET', path, true) + xhr.responseType = 'blob' + xhr.onload = function() { + if (this.status === 200) { + let fileReader = new FileReader() + fileReader.onload = function(e) { + resolve(e.target.result) + } + fileReader.onerror = reject + fileReader.readAsDataURL(this.response) + } + } + xhr.onerror = reject + xhr.send() + return + } + var canvas = document.createElement('canvas') + var c2x = canvas.getContext('2d') + var img = new Image + img.onload = function() { + canvas.width = img.width + canvas.height = img.height + c2x.drawImage(img, 0, 0) + resolve(canvas.toDataURL()) + canvas.height = canvas.width = 0 + } + img.onerror = reject + img.src = path + return + } + if (typeof plus === 'object') { + plus.io.resolveLocalFileSystemURL(getLocalFilePath(path), function(entry) { + entry.file(function(file) { + var fileReader = new plus.io.FileReader() + fileReader.onload = function(data) { + resolve(data.target.result) + } + fileReader.onerror = function(error) { + reject(error) + } + fileReader.readAsDataURL(file) + }, function(error) { + reject(error) + }) + }, function(error) { + reject(error) + }) + return + } + if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) { + wx.getFileSystemManager().readFile({ + filePath: path, + encoding: 'base64', + success: function(res) { + resolve('data:image/png;base64,' + res.data) + }, + fail: function(error) { + reject(error) + } + }) + return + } + reject(new Error('not support')) + }) +} + +export function base64ToPath(base64) { + return new Promise(function(resolve, reject) { + if (typeof window === 'object' && 'document' in window) { + base64 = base64.split(',') + var type = base64[0].match(/:(.*?);/)[1] + var str = atob(base64[1]) + var n = str.length + var array = new Uint8Array(n) + while (n--) { + array[n] = str.charCodeAt(n) + } + return resolve((window.URL || window.webkitURL).createObjectURL(new Blob([array], { type: type }))) + } + var extName = base64.split(',')[0].match(/data\:\S+\/(\S+);/) + if (extName) { + extName = extName[1] + } else { + reject(new Error('base64 error')) + } + var fileName = getNewFileId() + '.' + extName + if (typeof plus === 'object') { + var basePath = '_doc' + var dirPath = 'uniapp_temp' + var filePath = basePath + '/' + dirPath + '/' + fileName + if (!biggerThan(plus.os.name === 'Android' ? '1.9.9.80627' : '1.9.9.80472', plus.runtime.innerVersion)) { + plus.io.resolveLocalFileSystemURL(basePath, function(entry) { + entry.getDirectory(dirPath, { + create: true, + exclusive: false, + }, function(entry) { + entry.getFile(fileName, { + create: true, + exclusive: false, + }, function(entry) { + entry.createWriter(function(writer) { + writer.onwrite = function() { + resolve(filePath) + } + writer.onerror = reject + writer.seek(0) + writer.writeAsBinary(dataUrlToBase64(base64)) + }, reject) + }, reject) + }, reject) + }, reject) + return + } + var bitmap = new plus.nativeObj.Bitmap(fileName) + bitmap.loadBase64Data(base64, function() { + bitmap.save(filePath, {}, function() { + bitmap.clear() + resolve(filePath) + }, function(error) { + bitmap.clear() + reject(error) + }) + }, function(error) { + bitmap.clear() + reject(error) + }) + return + } + if (typeof wx === 'object' && wx.canIUse('getFileSystemManager')) { + var filePath = wx.env.USER_DATA_PATH + '/' + fileName + wx.getFileSystemManager().writeFile({ + filePath: filePath, + data: dataUrlToBase64(base64), + encoding: 'base64', + success: function() { + resolve(filePath) + }, + fail: function(error) { + reject(error) + } + }) + return + } + reject(new Error('not support')) + }) +} \ No newline at end of file diff --git a/js_sdk/mmmm-image-tools/package.json b/js_sdk/mmmm-image-tools/package.json new file mode 100644 index 0000000..e8b9c0a --- /dev/null +++ b/js_sdk/mmmm-image-tools/package.json @@ -0,0 +1,11 @@ +{ + "id": "mmmm-image-tools", + "name": "image-tools", + "version": "1.4.0", + "description": "图像转换工具,可用于图像和base64的转换", + "keywords": [ + "base64", + "保存", + "图像" + ] +} \ No newline at end of file diff --git a/pages.json b/pages.json index f64d130..dce29f7 100644 --- a/pages.json +++ b/pages.json @@ -45,6 +45,8 @@ "path": "pages/category/consulting/list", "style": { "navigationBarTitleText": "资讯中心", + "navigationBarBackgroundColor": "#1c223b", + "navigationBarTextStyle": "white", "enablePullDownRefresh" : false } }, diff --git a/pages/category/consulting/detail.vue b/pages/category/consulting/detail.vue index b52d988..b04c0de 100644 --- a/pages/category/consulting/detail.vue +++ b/pages/category/consulting/detail.vue @@ -4,13 +4,13 @@ - + @@ -22,9 +22,11 @@ {{list.contextTitle}} 无标题信息 + 发布时间:{{list.contextCreationTime}} - + + @@ -57,6 +59,9 @@ import * as CategoryApi from '@/api/category' import Empty from '@/components/empty' import Secondary from './../components/secondary' import { rpx2px,base64ToUint8Array} from '@/utils/util' +import readmore from 'utils/json/readmore.json' +// 以下路径需根据项目实际情况填写 +import {pathToBase64,base64ToPath} from '@/js_sdk/mmmm-image-tools/index.js' //分页大小 let limit=4; @@ -78,6 +83,7 @@ export default { informationList: [], // 分类列表 list: [], + // list: readmore.data, // 分类模板设置 setting: {}, // 正在加载中 @@ -92,6 +98,8 @@ export default { scrollTop: 0, // 分类id contextId: '', + // 图片列表 + imgList:[] } }, @@ -121,6 +129,32 @@ export default { this.setListHeight() }, methods: { + previewImage(){ + // 富文本全部内容 + let richText = this.list.context + // 获取 img 标签数组 + let tagsImage = richText.match(/]+>/g) + let base64Arr = [] + for (let i = 0; i < tagsImage.length; i++) { + tagsImage[i].replace(/]*src=['"]([^'"]+)[^>]*>/gi, function(match, capture) { + base64Arr.push(capture) + }) + } + // 数组倒序 从第一张开始预览 + // base64Arr = base64Arr.reverse() + // console.log(base64Arr) + // 串行,base64转换成临时url + base64Arr.reduce((promise, path) => promise.then(res => base64ToPath(path).then(base64 => (res.push(base64), res))), Promise.resolve([])).then(res => { + // 临时url + this.imgList = res + this.$nextTick(()=>{ + this.$refs.previewImage.open(res); // 传入当前选中的图片地址(小程序必须添加$nextTick,解决组件首次加载无图) + }) + }) + .catch(error => { + console.error(error) + }) + }, // 设置列表内容的高度 setListHeight() { const { windowHeight } = uni.getSystemInfoSync() @@ -149,13 +183,13 @@ export default { // 资讯中心 getConsultingContextSelection() { const app = this - CategoryApi.consultingContextSelection().then(res=>{ - if (res.resultCode == '00000000') { - app.informationList = res.data - } else { - app.$error('获取资讯信息失败') - } - }) + // CategoryApi.consultingContextSelection().then(res=>{ + // if (res.resultCode == '00000000') { + // app.informationList = res.data + // } else { + // app.$error('获取资讯信息失败') + // } + // }) }, } } @@ -200,7 +234,7 @@ page { width: 100%; .cate-cont { - width: 96%; + width: 100%; height: 100%; padding: 16rpx; margin-top: 20rpx; @@ -220,9 +254,15 @@ page { border-radius: 10rpx; padding: 0rpx 20rpx 0rpx 20rpx; color: #0b0b0b; - background-color: #a8a8a8; + font-size: 30rpx; + // background-color: #a8a8a8; text-align: center; } + .cate-cont-time{ + text-align: center; + margin-top: 30rpx; + margin-bottom: 30rpx; + } } } diff --git a/pages/category/consulting/list.vue b/pages/category/consulting/list.vue index 1d15f4c..359b6a2 100644 --- a/pages/category/consulting/list.vue +++ b/pages/category/consulting/list.vue @@ -1,16 +1,30 @@