diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json index 582561b..472ec0d 100644 --- a/.hbuilderx/launch.json +++ b/.hbuilderx/launch.json @@ -1,16 +1,24 @@ -{ // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ - // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 - "version": "0.0", - "configurations": [{ - "app-plus" : - { - "launchtype" : "local" - }, - "default" : - { - "launchtype" : "local" - }, - "type" : "uniCloud" - } +{ + // launch.json 配置了启动调试时相关设置,configurations下节点名称可为 app-plus/h5/mp-weixin/mp-baidu/mp-alipay/mp-qq/mp-toutiao/mp-360/ + // launchtype项可配置值为local或remote, local代表前端连本地云函数,remote代表前端连云端云函数 + "version" : "0.0", + "configurations" : [ + { + "app-plus" : { + "launchtype" : "local" + }, + "default" : { + "launchtype" : "local" + }, + "type" : "uniCloud" + }, + { + "playground" : "custom", + "type" : "uni-app:app-android" + }, + { + "playground" : "custom", + "type" : "uni-app:app-ios" + } ] } diff --git a/App.vue b/App.vue index b5d8f5c..26a6b9a 100644 --- a/App.vue +++ b/App.vue @@ -2,6 +2,11 @@ export default { onLaunch: function(info) { console.log('App Launch'); + uni.sendHostEvent('log',info, (ret) => { + //发送消息成功回调 + console.log('消息成功app' + JSON.stringify(info)); + + }); if (info.referrerInfo?.extraData?.uniMP) { uni.setStorageSync('uniMP', info.referrerInfo?.extraData?.uniMP); uni.setStorageSync('APP_token', info.referrerInfo?.extraData?.token); @@ -24,4 +29,5 @@ diff --git a/api/api.js b/api/api.js new file mode 100644 index 0000000..91ca6fd --- /dev/null +++ b/api/api.js @@ -0,0 +1,85 @@ +import request from "@/config/request.js"; +import requesta from "@/config/requesta.js"; + +export function xuiat(data) { + return request.post(`xun_fei/tts`, data); +} + +export function feiiat(data) { + return request.post(`xun_fei/iat`, data); +} + +export function iatWss(data) { + return request.post(`xun_fei/iatWss`, data); +} +// http://chat.lihaink.cn/index/tts +//文字转语音 +export function ttWss(data) { + return requesta.post(`index/tts`, data); +} + +//图片识别 +export function ttocr(data) { + return request.post(`xun_fei/ocr`, data); +} + + + + +// base64 转 二进制流(blob) +export function dataURLtoBlob(dataurl) { + // console.log(dataurl); + // let str = "data:audio/wav;base64," + dataurl.slice(2) + // console.log(str); + let mime = "audio/wav" + // var arr = str.split(","), + // mime = arr[0].match(/:(.*?);/), + // let bstr = atob(arr[1]) + let bstr = atob(dataurl) + let n = bstr.length + let u8arr = new Uint8Array(n); + while (n--) { + u8arr[n] = bstr.charCodeAt(n); + } + console.log(u8arr) + // return new Blob([u8arr], { + // type: mime, + // }); +} + + +// -防抖 +export function debounce(fn, wait) { + let delay = wait || 500 + let timer + return function() { + let args = arguments; + if (timer) { + clearTimeout(timer) + console.log('拦截') + } + let callNow = !timer + timer = setTimeout(() => { + console.log('发送') + timer = null + }, delay) + if (callNow) fn.apply(this, args) + } +} + +// -节流 +export function throttle(fn, wait) { + let delay = wait || 500 + let timer = null + return function() { + if (timer) { + console.log('拦截'); + return + } + timer = setTimeout(() => { + console.log('发送'); + fn.apply(this, arguments) + timer = null + }, delay) + } +} \ No newline at end of file diff --git a/components/content-top/index.vue b/components/content-top/index.vue new file mode 100644 index 0000000..02b9206 --- /dev/null +++ b/components/content-top/index.vue @@ -0,0 +1,92 @@ + + + + + \ No newline at end of file diff --git a/components/qiqb-share/img/1.png b/components/qiqb-share/img/1.png new file mode 100644 index 0000000..519a4a9 Binary files /dev/null and b/components/qiqb-share/img/1.png differ diff --git a/components/qiqb-share/img/2.png b/components/qiqb-share/img/2.png new file mode 100644 index 0000000..c80f941 Binary files /dev/null and b/components/qiqb-share/img/2.png differ diff --git a/components/qiqb-share/img/3.png b/components/qiqb-share/img/3.png new file mode 100644 index 0000000..4fd5260 Binary files /dev/null and b/components/qiqb-share/img/3.png differ diff --git a/components/qiqb-share/img/close.png b/components/qiqb-share/img/close.png new file mode 100644 index 0000000..2f1bca0 Binary files /dev/null and b/components/qiqb-share/img/close.png differ diff --git a/components/qiqb-share/qiqb-share.vue b/components/qiqb-share/qiqb-share.vue new file mode 100644 index 0000000..99a775d --- /dev/null +++ b/components/qiqb-share/qiqb-share.vue @@ -0,0 +1,595 @@ + + + + + \ No newline at end of file diff --git a/components/qiqb-share/qiqb-share1.vue b/components/qiqb-share/qiqb-share1.vue new file mode 100644 index 0000000..0dc3ca9 --- /dev/null +++ b/components/qiqb-share/qiqb-share1.vue @@ -0,0 +1,444 @@ + + + + + + \ No newline at end of file diff --git a/config/app.js b/config/app.js new file mode 100644 index 0000000..fcdb9e7 --- /dev/null +++ b/config/app.js @@ -0,0 +1,44 @@ + +let httpApi + +// 在打包之前请检查当前环境是否正确 +const env = 'dev'; // 开发 +// const env = 'prod'; // 生产 +// const env = 'prew'; // 预上线 + +switch (env) { + case 'prod': + httpApi = 'https://worker-task.lihaink.cn' // 生产 + + break; + case 'prew': + httpApi ='https://preview-worker-task.lihaink.cn' //预发布环境 + + break; + default: + httpApi = "https://ceshi-worker-task.lihaink.cn" // 测试 + httpApione = "https://chat.lihaink.cn" // 测试 + +} + + + +module.exports = { + // 请求域名 格式: https://您的域名 + + HTTP_REQUEST_URL: httpApi, + HTTP_REQUEST_URL_ONE: httpApione, + HEADER: { + 'content-type': 'application/json', + //#ifdef MP + 'Form-type': 'routine', + //#endif + //#ifdef APP-PLUS + 'Form-type': 'app', + //#endif + }, + // 回话密钥名称 请勿修改此配置 + TOKENNAME: 'X-Token', + // 缓存时间 0 永久 + EXPIRE: 0, +}; \ No newline at end of file diff --git a/config/request.js b/config/request.js new file mode 100644 index 0000000..9c2cada --- /dev/null +++ b/config/request.js @@ -0,0 +1,79 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +import { + HTTP_REQUEST_URL, + HEADER, + TOKENNAME +} from '@/config/app'; + + + + + +/** + * 发送请求 + */ +function baseRequest(url, method, data, { + noAuth = false, + noVerify = false +}) { + let Url = HTTP_REQUEST_URL, + header = HEADER; + + + + // if (store.state.app.token) header[TOKENNAME] = 'Bearer ' + store.state.app.token; + + return new Promise((reslove, reject) => { + uni.request({ + url: Url + '/api/' + url, + method: method || 'GET', + header: header, + data: data || {}, + success: (res) => { + // #ifdef APP-PLUS + + + // #endif + if (noVerify) + reslove(res.data, res); + else if (res.data.status == 200) + reslove(res.data, res); + else if ([410000, 410001, 410002, 40000].indexOf(res.data.status) !== -1) { + + reject(res.data); + }else if (res.data.code == 0||1) { + + reslove(res.data, res); + } else if (res.data.status == 501) { + uni.reLaunch({ + url: '/pages/error/index' + }) + reject(res.data); + } else + reject(res.data.message || '系统错误'); + }, + fail: (message) => { + console.log(message,'3333333333'); + reject('请求失败'); + } + }) + }); +} + +const request = {}; + +['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => { + request[method] = (api, data, opt) => baseRequest(api, method, data, opt || {}) +}); + + + +export default request; \ No newline at end of file diff --git a/config/requesta.js b/config/requesta.js new file mode 100644 index 0000000..50d1a90 --- /dev/null +++ b/config/requesta.js @@ -0,0 +1,80 @@ +// +---------------------------------------------------------------------- +// | CRMEB [ CRMEB赋能开发者,助力企业发展 ] +// +---------------------------------------------------------------------- +// | Copyright (c) 2016~2021 https://www.crmeb.com All rights reserved. +// +---------------------------------------------------------------------- +// | Licensed CRMEB并不是自由软件,未经许可不能去掉CRMEB相关版权 +// +---------------------------------------------------------------------- +// | Author: CRMEB Team +// +---------------------------------------------------------------------- +import { + HTTP_REQUEST_URL_ONE, + HEADER, + TOKENNAME +} from '@/config/app'; + + + + + +/** + * 发送请求 + */ +function baseRequest(url, method, data, { + noAuth = false, + noVerify = false +}) { + let Url = HTTP_REQUEST_URL_ONE, + header = HEADER; + + + + // if (store.state.app.token) header[TOKENNAME] = 'Bearer ' + store.state.app.token; + + return new Promise((reslove, reject) => { + uni.request({ + url: Url + '/' + url, + method: method || 'GET', + header: header, + data: data || {}, + success: (res) => { + + // #ifdef APP-PLUS + console.log('app', Url + '/api/' + url, res.data); + + // #endif + if (noVerify) + reslove(res.data, res); + else if (res.data.status == 200) + reslove(res.data, res); + else if ([410000, 410001, 410002, 40000].indexOf(res.data.status) !== -1) { + + reject(res.data); + }else if (res.data.code == 0||res.data.code ==1) { + + reslove(res.data, res); + } else if (res.data.status == 501) { + uni.reLaunch({ + url: '/pages/error/index' + }) + reject(res.data); + } else + reject(res.data.message || '系统错误'); + }, + fail: (message) => { + console.log(message,'3333333333'); + reject('请求失败'); + } + }) + }); +} + +const request = {}; + +['options', 'get', 'post', 'put', 'head', 'delete', 'trace', 'connect'].forEach((method) => { + request[method] = (api, data, opt) => baseRequest(api, method, data, opt || {}) +}); + + + +export default request; \ No newline at end of file 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/manifest.json b/manifest.json index ed10878..7f0759a 100644 --- a/manifest.json +++ b/manifest.json @@ -17,26 +17,34 @@ "delay" : 0 }, /* 模块配置 */ - "modules" : {}, + "modules" : { + "Record" : {}, + "Speech" : {}, + "Camera" : {} + }, /* 应用发布信息 */ "distribute" : { /* android打包配置 */ "android" : { "permissions" : [ - "", - "", - "", - "", - "", + "", "", "", + "", "", - "", - "", + "", "", - "", "", - "", + "", + "", + "", + "", + "", + "", + "", + "", + "", + "", "" ], "abiFilters" : [ "armeabi-v7a", "arm64-v8a", "x86" ] @@ -47,7 +55,25 @@ }, /* SDK配置 */ "sdkConfigs" : { - "ad" : {} + "ad" : {}, + "speech" : {}, + "share" : {} + } + }, + "nativePlugins" : { + "YL-SpeechRecognition" : { + "__plugin_info__" : { + "name" : "YL-SpeechRecognition-语音合成,语音听写,基于科大讯飞,双端 - [试用版,仅用于自定义调试基座]", + "description" : "语音合成,语音听写,基于科大讯飞,双端(QQ:453503875,微信同)", + "platforms" : "Android,iOS", + "url" : "https://ext.dcloud.net.cn/plugin?id=9512", + "android_package_name" : "", + "ios_bundle_id" : "", + "isCloud" : true, + "bought" : 0, + "pid" : "9512", + "parameters" : {} + } } } }, @@ -55,7 +81,7 @@ "quickapp" : {}, /* 小程序特有相关 */ "mp-weixin" : { - "appid" : "", + "appid" : "wx3267f87bc81f2890", "setting" : { "urlCheck" : false }, diff --git a/pages.json b/pages.json index e53160a..488ed3c 100644 --- a/pages.json +++ b/pages.json @@ -3,7 +3,8 @@ { "path": "pages/index/index", "style": { - "navigationBarTitleText": "种植分析", + "navigationBarTitleText": "农业咨询", + "navigationStyle": "custom", "bounce": "none" // "softinputMode": "adjustResize" } diff --git a/pages/index/index.vue b/pages/index/index.vue index 522f82b..89ae551 100644 --- a/pages/index/index.vue +++ b/pages/index/index.vue @@ -1,710 +1,2090 @@ \ No newline at end of file diff --git a/pages/index/index1.vue b/pages/index/index1.vue new file mode 100644 index 0000000..723ac0d --- /dev/null +++ b/pages/index/index1.vue @@ -0,0 +1,2239 @@ + + + + + \ No newline at end of file diff --git a/static/icon/ai.gif b/static/icon/ai.gif new file mode 100644 index 0000000..e6aedd8 Binary files /dev/null and b/static/icon/ai.gif differ diff --git a/static/icon/ai1.png b/static/icon/ai1.png new file mode 100644 index 0000000..3bcf4bd Binary files /dev/null and b/static/icon/ai1.png differ diff --git a/static/icon/ai10.png b/static/icon/ai10.png new file mode 100644 index 0000000..ec4e960 Binary files /dev/null and b/static/icon/ai10.png differ diff --git a/static/icon/ai2.png b/static/icon/ai2.png new file mode 100644 index 0000000..830459e Binary files /dev/null and b/static/icon/ai2.png differ diff --git a/static/icon/ai3.png b/static/icon/ai3.png new file mode 100644 index 0000000..37587d8 Binary files /dev/null and b/static/icon/ai3.png differ diff --git a/static/icon/ai6.png b/static/icon/ai6.png new file mode 100644 index 0000000..d8047ea Binary files /dev/null and b/static/icon/ai6.png differ diff --git a/static/icon/ai7.png b/static/icon/ai7.png new file mode 100644 index 0000000..c35cc75 Binary files /dev/null and b/static/icon/ai7.png differ diff --git a/static/icon/ai8.png b/static/icon/ai8.png new file mode 100644 index 0000000..d77f724 Binary files /dev/null and b/static/icon/ai8.png differ diff --git a/static/icon/ai9.png b/static/icon/ai9.png new file mode 100644 index 0000000..dd8870c Binary files /dev/null and b/static/icon/ai9.png differ diff --git a/static/icon/airight.png b/static/icon/airight.png new file mode 100644 index 0000000..559b51f Binary files /dev/null and b/static/icon/airight.png differ diff --git a/static/icon/bg1.png b/static/icon/bg1.png new file mode 100644 index 0000000..14862c2 Binary files /dev/null and b/static/icon/bg1.png differ diff --git a/static/icon/den.png b/static/icon/den.png new file mode 100644 index 0000000..ac54fa1 Binary files /dev/null and b/static/icon/den.png differ diff --git a/static/icon/fa.png b/static/icon/fa.png new file mode 100644 index 0000000..fbbbf57 Binary files /dev/null and b/static/icon/fa.png differ diff --git a/static/icon/fa1.png b/static/icon/fa1.png new file mode 100644 index 0000000..2bf0771 Binary files /dev/null and b/static/icon/fa1.png differ diff --git a/static/icon/fb1.png b/static/icon/fb1.png new file mode 100644 index 0000000..786e3f3 Binary files /dev/null and b/static/icon/fb1.png differ diff --git a/static/icon/fb2.png b/static/icon/fb2.png new file mode 100644 index 0000000..a953406 Binary files /dev/null and b/static/icon/fb2.png differ diff --git a/static/icon/hua.png b/static/icon/hua.png new file mode 100644 index 0000000..ff85566 Binary files /dev/null and b/static/icon/hua.png differ diff --git a/static/icon/ioc.gif b/static/icon/ioc.gif new file mode 100644 index 0000000..44e50fe Binary files /dev/null and b/static/icon/ioc.gif differ diff --git a/static/icon/jia.png b/static/icon/jia.png new file mode 100644 index 0000000..be93493 Binary files /dev/null and b/static/icon/jia.png differ diff --git a/static/icon/output/Apifox-Agent-Chrome/adapter.js b/static/icon/output/Apifox-Agent-Chrome/adapter.js new file mode 100644 index 0000000..a3a7d6a --- /dev/null +++ b/static/icon/output/Apifox-Agent-Chrome/adapter.js @@ -0,0 +1,6 @@ +!function(){"use strict"; +/*! + * vtils v2.59.0 + * (c) Jay Fong (https://github.com/fjc0k) + * Released under the MIT License. + */var e,t,r,n=function(){this.listeners=Object.create(null)};function s(e){return new Promise((t,r)=>{const n=new FileReader;n.onload=()=>{t(function(e,t,r){let n="";const s=new Uint8Array(e),o=s.byteLength;for(let e=0;er(e),n.readAsArrayBuffer(e)})}function o(e,t,r){return new Promise((n,s)=>{const o=new FileReader;o.onload=()=>{n(o.result)},o.onerror=e=>s(e);const a=new Blob([e]);"dataUrl"===t&&o.readAsDataURL(a),"text"===t&&o.readAsText(a,r)})}n.prototype.on=function(e,t){var r=this;this.listeners[e]||(this.listeners[e]=[]);var n=this.listeners[e];return-1===n.indexOf(t)&&n.push(t),function(){return r.off(e,t)}},n.prototype.once=function(e,t){var r=this.on(e,(function(){for(var e=[],n=arguments.length;n--;)e[n]=arguments[n];r(),t.apply(void 0,e)}));return r},n.prototype.off=function(e,t){if(t){var r=this.listeners[e],n=r.indexOf(t);n>-1&&r.splice(n,1)}else delete this.listeners[e]},n.prototype.emit=function(e){for(var t=[],r=arguments.length-1;r-- >0;)t[r]=arguments[r+1];return(this.listeners[e]||[]).map((function(e){return e.apply(void 0,t)}))},function(e){e.open="open",e.closed="closed",e.leftOpenRightClosed="leftOpenRightClosed",e.leftClosedRightOpen="leftClosedRightOpen"}(e||(e={})),function(e){e.css="css",e.js="js",e.img="img",e.video="video",e.audio="audio"}(t||(t={})),function(e){e.desc="desc",e.asc="asc"}(r||(r={}));let a=0;const i=new n;document.addEventListener("__APP_AGENT_HTTP_RESPONSE_LISTENER__",e=>{const t=JSON.parse(JSON.stringify(e.detail||{}));t.response.arrayBuffer=e.detail.response.arrayBuffer,i.emit("response",t)}),document.addEventListener("__APP_AGENT_HTTP_RESPONSE_START_LISTENER__",e=>{const t=JSON.parse(JSON.stringify(e.detail||{}));i.emit("onstart",t)}),document.addEventListener("__APP_AGENT_HTTP_RESPONSE_DATA_LISTENER__",e=>{const t=JSON.parse(JSON.stringify(e.detail||{}));i.emit("ondata",t)});window.foxAgentCrossRequestVersion=function(){return{version:"0.0.1"}},window.foxAgentCrossRequest=async function(e){const t=e.headers["Content-Type"]||e.headers["content-type"]||e.headers["Content-type"]||"text/plain",r=null==e.data?void 0:(e=>"application/x-www-form-urlencoded"===e?"form":e.startsWith("multipart/form-data")?"file":"application/json"===e?"json":"application/x-msgpack"===e?"arraybuffer":"raw")(t);let n;n="arraybuffer"===r?{__ARRAY_BUFFER_KEY__:!0,data:Array.from(e.data)}:"file"!==r?e.data:{__APP_AGENT_FILE_BODY__:!0,...e.data||{},...Object.fromEntries(await Promise.all(Object.entries(e.files||{}).map(async([e,t])=>Array.isArray(t)?[e,await Promise.all(t.map(s))]:[e,t&&await s(t)])))};const d=`${location.href}____${a++}`,u=i.on("onstart",async({id:t,request:r,response:n})=>{var s;t===d&&(null===(s=e.onstart)||void 0===s||s.call(e,{request:r,response:n}),u())}),l=i.on("ondata",async({id:t,data:r})=>{var n;t===d&&(null===(n=e.ondata)||void 0===n||n.call(e,r))}),c=i.on("response",async({id:t,response:r})=>{if(t===d){if(r.error)return e.error("",void 0,new Error(r.error.message)),c(),u(),void l();const t={header:r.headers,status:r.status,statusText:r.statusText,body:r.arrayBuffer,getBodyAsDataUrl:async()=>o(r.arrayBuffer,"dataUrl"),async getBodyAsText(){var e;return o(r.arrayBuffer,"text",(null===(e=(r.headers["content-type"]||"").match(/charset=(.*)\b/i))||void 0===e?void 0:e[1])||"utf-8")}},n={req:e,res:t,runTime:(new Date).getTime()};r.ok?e.success(t.body,t.header,n):e.error(t.statusText,t.header,n),c(),u(),l()}}),{timeout:_=3e5}=e;return document.dispatchEvent(new CustomEvent("__APP_AGENT_HTTP_REQUEST_LISTENER__",{detail:{id:d,options:{url:e.url,method:e.method,headers:{...e.headers,"Content-Type":t},requestBodyType:r,requestBody:n},runtimeOptions:{requestId:d,timeout:_}}})),{version:"0.0.1",requestId:d,abort:()=>{document.dispatchEvent(new CustomEvent("__APP_AGENT_HTTP_REQUEST_ABORT_LISTENER__",{detail:{id:d,runtimeOptions:{requestId:d,timeout:_}}}))}}}}(); diff --git a/static/icon/output/Apifox-Agent-Chrome/background.js b/static/icon/output/Apifox-Agent-Chrome/background.js new file mode 100644 index 0000000..467ffe0 --- /dev/null +++ b/static/icon/output/Apifox-Agent-Chrome/background.js @@ -0,0 +1,7 @@ +!function(){"use strict";function e(e){if(!e||"object"!=typeof e)return!1;var t=Object.getPrototypeOf(e);if(null===t)return!0;var o=t.constructor;return"function"==typeof o&&o instanceof o}var t,o,n;!function(e){e.open="open",e.closed="closed",e.leftOpenRightClosed="leftOpenRightClosed",e.leftClosedRightOpen="leftClosedRightOpen"}(t||(t={})),function(e){e.css="css",e.js="js",e.img="img",e.video="video",e.audio="audio"}(o||(o={})),function(e){e.desc="desc",e.asc="asc"}(n||(n={}));const r={},s=t=>e(t)?!0===t.__APP_AGENT_BASE64_FILE__?function(e){const t=atob(e.base64);let o=t.length;const n=new Uint8Array(o);for(;o--;)n[o]=t.charCodeAt(o);return new File([n],e.name,{type:e.type})}(t):JSON.stringify(t):t;chrome.runtime.onMessage.addListener((t,o,n)=>{ +/*! + * vtils v2.59.0 + * (c) Jay Fong (https://github.com/fjc0k) + * Released under the MIT License. + */ +var a;return(a=async()=>{var a,i,c,d;switch(t.type){case"__APP_AGENT_BACKGROUND_HTTP_REQUEST__":const _=null===(a=o.tab)||void 0===a?void 0:a.id;if(e(t.options.body)&&!0===t.options.body.__APP_AGENT_FILE_BODY__){const{__APP_AGENT_FILE_BODY__:e,...o}=t.options.body,n=new FormData;for(const[e,t]of Object.entries(o))Array.isArray(t)?t.forEach(t=>n.append(e,s(t))):n.append(e,s(t));t.options.body=n;const r=t.options.headers;r&&delete r["Content-Type"]}if(e(t.options.body)&&!0===t.options.body.__ARRAY_BUFFER_KEY__){const{data:e}=t.options.body;t.options.body=new Uint8Array(e).buffer,t.options.headers}const l=new URL(t.options.url).origin;t.options.headers&&(t.options.headers["Referrer-Policy"]="no-referrer, strict-origin-when-cross-origin",t.options.headers.Referer=l,t.options.headers.Origin=l,t.options.mode="cors",delete t.options.headers.cookie);const p=new AbortController,{requestId:u=0,timeout:f=3e4}=null!==(i=t.runtimeOptions)&&void 0!==i?i:{},y=setTimeout(()=>p.abort(),f);r[u]={abortId:y,abortController:p};const h=await fetch(t.options.url,{...t.options,redirect:"follow",signal:p.signal});clearTimeout(y);const A=new Headers(h.headers),b=A.get("x-app-agent-http-headers");if(null!=b){A.delete("x-app-agent-http-headers");for(const[e,t]of Object.entries(JSON.parse(b)))A.set(e,t)}const T=Object.fromEntries(A.entries()),E="file",g=T["content-type"]||"application/octet-stream";let P=new Uint8Array;h.body?(_&&chrome.tabs.sendMessage(_,{type:"__APP_AGENT_HTTP_RESPONSE_START_LISTENER__",id:u,request:{url:t.options.url},response:{headers:T,status:h.status,statusText:h.statusText,url:h.url,ok:h.ok,redirected:h.redirected,type:h.type}}),await async function(e,t,o){const n=(e,t)=>{const o=new Uint8Array(e.length+t.length);return o.set(e,0),o.set(t,e.length),o};let r=new Uint8Array;const s=e.getReader();for(;;){const{done:e,value:a}=await s.read();if(e){o(r);break}r=n(r,a),t(a)}}(h.body,e=>{_&&chrome.tabs.sendMessage(_,{type:"__APP_AGENT_HTTP_RESPONSE_DATA_LISTENER__",id:u,data:[...e]})},e=>{P=e})):P=await h.arrayBuffer(),delete r[u];const m=function(e,t,o){let n="";const r=new Uint8Array(e),s=r.byteLength;for(let e=0;e{n({error:{message:String(e)}})}),!0}),chrome.action.onClicked.addListener((function(e){chrome.tabs.create({url:"https://app.apifox.com"})}))}(); diff --git a/static/icon/output/Apifox-Agent-Chrome/logo-128.png b/static/icon/output/Apifox-Agent-Chrome/logo-128.png new file mode 100644 index 0000000..c1e72fc Binary files /dev/null and b/static/icon/output/Apifox-Agent-Chrome/logo-128.png differ diff --git a/static/icon/output/Apifox-Agent-Chrome/logo-96.png b/static/icon/output/Apifox-Agent-Chrome/logo-96.png new file mode 100644 index 0000000..f2086c9 Binary files /dev/null and b/static/icon/output/Apifox-Agent-Chrome/logo-96.png differ diff --git a/static/icon/output/Apifox-Agent-Chrome/manifest.json b/static/icon/output/Apifox-Agent-Chrome/manifest.json new file mode 100644 index 0000000..250d26b --- /dev/null +++ b/static/icon/output/Apifox-Agent-Chrome/manifest.json @@ -0,0 +1,41 @@ +{ + "name": "Apifox Browser Extension", + "description": "API 文档、API 调试、API Mock、API 自动化测试", + "version": "1.0.6", + "manifest_version": 3, + "icons": { + "96": "logo-96.png", + "128": "logo-128.png" + }, + "permissions": [], + "host_permissions": [ + "*://*/" + ], + "background": { + "service_worker": "background.js" + }, + "action": { + "default_title": "Apifox", + "default_icon": "logo-96.png" + }, + "web_accessible_resources": [ + { + "matches": [ + "*://*/*" + ], + "resources": [ + "adapter.js" + ] + } + ], + "content_scripts": [ + { + "matches": [ + "*://*/*" + ], + "js": [ + "runtime.js" + ] + } + ] +} \ No newline at end of file diff --git a/static/icon/output/Apifox-Agent-Chrome/runtime.js b/static/icon/output/Apifox-Agent-Chrome/runtime.js new file mode 100644 index 0000000..b6e22eb --- /dev/null +++ b/static/icon/output/Apifox-Agent-Chrome/runtime.js @@ -0,0 +1 @@ +!function(){"use strict";function e(e,t,n){return new Promise((r,a)=>{const o=new FileReader;o.onload=()=>{r(o.result)},o.onerror=e=>a(e);const s=function(e){const t=atob(e.base64);let n=t.length;const r=new Uint8Array(n);for(;n--;)r[n]=t.charCodeAt(n);return new File([r],e.name,{type:e.type})}(e);"dataUrl"===t?o.readAsDataURL(s):"arrayBuffer"===t?o.readAsArrayBuffer(s):o.readAsText(s,n)})}!function(e){const t=document.createElement("script");t.src=chrome.runtime.getURL(e),t.onload=()=>t.remove(),(document.head||document.documentElement).appendChild(t)}("adapter.js"),chrome.runtime.onMessage.addListener(e=>{e&&"object"==typeof e&&"string"==typeof e.type&&["__APP_AGENT_HTTP_RESPONSE_START_LISTENER__","__APP_AGENT_HTTP_RESPONSE_DATA_LISTENER__"].includes(e.type)&&document.dispatchEvent(new CustomEvent(e.type,{detail:e}))}),document.addEventListener("__APP_AGENT_HTTP_REQUEST_LISTENER__",async t=>{var n;const r=t.detail||{};let a;try{a=await async function(t,n){const r={url:t.url,method:t.method.toUpperCase(),headers:t.headers||{},body:t.requestBody};return await new Promise((t,a)=>{chrome.runtime.sendMessage({type:"__APP_AGENT_BACKGROUND_HTTP_REQUEST__",options:r,runtimeOptions:n},(async function(n){null==n?a(chrome.runtime.lastError):null!=n.error?a(n.error):(n.data.arrayBuffer=await e(n.data.base64File,"arrayBuffer",n.data.base64File.type),t(n.data))}))})}(r.options,r.runtimeOptions)}catch(e){a={error:{message:String(null!==(n=e.message)&&void 0!==n?n:e)}}}document.dispatchEvent(new CustomEvent("__APP_AGENT_HTTP_RESPONSE_LISTENER__",{detail:{id:r.id,response:a}}))}),document.addEventListener("__APP_AGENT_HTTP_REQUEST_ABORT_LISTENER__",async e=>{const{runtimeOptions:t}=JSON.parse(JSON.stringify(e.detail||{}));chrome.runtime.sendMessage({type:"__APP_AGENT_HTTP_REQUEST_ABORT_LISTENER__",runtimeOptions:t})})}(); diff --git a/test.js b/test.js new file mode 100644 index 0000000..fd1413f --- /dev/null +++ b/test.js @@ -0,0 +1,141 @@ + $.ajax({ +                url: host, +                data: data, +                type: "POST", +                dataType: "json", +                headers: headers, +                complete: () => { +                    let message = ai.lastMessage(chat); +                    if (!chat.loading || message.id !== lastId) { +                        return; +                    } +                    chat.lastChunkIndex = 0; +                    chat.loading = false; +                    lastMessage.completed = true; +                    ai.saveData(); +                }, +                success: function (res) { +                    let message = ai.lastMessage(chat); +                    if (!chat.loading || message.id !== lastId) { +                        return; +                    } +                    if (res && res.error && res.error.message) { +                        ai.lastMessage(chat).choices[0].delta.content = res.error.message; +                    } else if (res && res.data && res.data[0] && res.data[0].url) { +                        ai.lastMessage(chat).choices[0].delta.content = `![](${res.data[0].url})`; +                    } else { +                        console.log(res); +                    } +                }, +                xhr: this.xhrOnProgress(function (event) { +                    let message = ai.lastMessage(chat); +                    // 已经取消 +                    if (!chat.loading || message.id !== lastId) { +                        return; +                    } +                    const xhr = event.target; +                    const {responseText} = xhr; +                    let thunks = responseText.substring(chat.lastChunkIndex); +                    chat.lastChunkIndex = responseText.length; +                    const arr = thunks.split("\n"); +                    arr.forEach(function (chunk) { +                        if (chunk === "") return; +                        chunk = chunk.substring(6).trim(); +                        if (chunk === "" || chunk === "[DONE]") return; +                        tr + + + + + + +// uni.request({ + // url: 'https://ceshi-worker-task.lihaink.cn/api/xun_fei/chat?content=uniapp中js的回调有哪些', + // method: 'GET', + // responseType: 'arraybuffer', + // success: res => { + // console.log(res); + // }, + // fail: err => { + // // 处理请求失败 + // console.error(err); + // } + // }); + + // let that = this; + // this.talkList.push({ + // "id":new Date().getTime(), + // "content":'', + // "type":2, + // "pic":"/static/avatar.png" + // }); + // var xhr = new XMLHttpRequest(); + // xhr.open('GET', 'https://ceshi-worker-task.lihaink.cn/api/xun_fei/chat?content=uniapp中js的回调有哪些', true); // 设置请求方法、URL 和是否异步 + + // xhr.setRequestHeader('Content-Type', 'application/json'); // 设置请求头 + + // xhr.onreadystatechange = function() { + // console.log('请求成功:', xhr.responseText); + // that.talkList[that.talkList.length-1].content += xhr.responseText; + // }; + // xhr.send(); + + // fetch('https://ceshi-worker-task.lihaink.cn/api/xun_fei/chat?content=uniapp中js的回调有哪些') + // .then(response => response.body) + // .then(data => { + // // 在这里处理返回的数据 + // console.log(data); + // }) + // .catch(error => { + // // 在这里处理请求错误 + // console.error(error); + // }); + + // let that = this; + // this.talkList.push({ + // "id":new Date().getTime(), + // "content":'', + // "type":2, + // "pic":"/static/avatar.png" + // }); + // axios({ + // method: 'get', + // url: 'https://ceshi-worker-task.lihaink.cn/api/xun_fei/chat?content=uniapp中js的回调有哪些', + // responseType: 'text' + // }) + // .then(response => { + + // response.data.on('data', (chunk) => { + // // 处理流数据的逻辑 + // console.log(chunk); + // }); + + // response.data.on('end', () => { + // // 数据接收完成的逻辑 + // console.log('完成'); + // }); + + // }); + // fetch('https://ceshi-worker-task.lihaink.cn/api/xun_fei/chat?content=uniapp中js的回调有哪些') // 通过fetch获取一个Response对象 + // .then(response => response.body.getReader()) // 获取ReadableStreamDefaultReader对象 + // .then(reader => { + // function read() { + // return reader.read().then(({ done, value }) => { + // if (done) { + // console.log('读取完成'); + // return; + // } + + // const decoder = new TextDecoder(); + // console.log(decoder.decode(value)); + // that.talkList[that.talkList.length-1].content += decoder.decode(value); + // // console.log(value); // 输出读取到的数据 + // // 继续读取下一块数据 + // return read(); + // }); + // } + + // return read(); // 开始读取数据 + // }) + // .catch(error => console.error(error)); + // return ; \ No newline at end of file diff --git a/uni_modules/uni-popup/changelog.md b/uni_modules/uni-popup/changelog.md new file mode 100644 index 0000000..99454ba --- /dev/null +++ b/uni_modules/uni-popup/changelog.md @@ -0,0 +1,37 @@ +## 1.6.2(2021-08-24) +- 新增 支持国际化 +## 1.6.1(2021-07-30) +- 优化 vue3下事件警告的问题 +## 1.6.0(2021-07-13) +- 组件兼容 vue3,如何创建vue3项目,详见 [uni-app 项目支持 vue3 介绍](https://ask.dcloud.net.cn/article/37834) +## 1.5.0(2021-06-23) +- 新增 mask-click 遮罩层点击事件 +## 1.4.5(2021-06-22) +- 修复 nvue 平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.4(2021-06-18) +- 修复 H5平台中间弹出后,点击内容,再点击遮罩无法关闭的Bug +## 1.4.3(2021-06-08) +- 修复 错误的 watch 字段 +- 修复 safeArea 属性不生效的问题 +- 修复 点击内容,再点击遮罩无法关闭的Bug +## 1.4.2(2021-05-12) +- 新增 组件示例地址 +## 1.4.1(2021-04-29) +- 修复 组件内放置 input 、textarea 组件,无法聚焦的问题 +## 1.4.0 (2021-04-29) +- 新增 type 属性的 left\right 值,支持左右弹出 +- 新增 open(String:type) 方法参数 ,可以省略 type 属性 ,直接传入类型打开指定弹窗 +- 新增 backgroundColor 属性,可定义主窗口背景色,默认不显示背景色 +- 新增 safeArea 属性,是否适配底部安全区 +- 修复 App\h5\微信小程序底部安全区占位不对的Bug +- 修复 App 端弹出等待的Bug +- 优化 提升低配设备性能,优化动画卡顿问题 +- 优化 更简单的组件自定义方式 +## 1.2.9(2021-02-05) +- 优化 组件引用关系,通过uni_modules引用组件 +## 1.2.8(2021-02-05) +- 调整为uni_modules目录规范 +## 1.2.7(2021-02-05) +- 调整为uni_modules目录规范 +- 新增 支持 PC 端 +- 新增 uni-popup-message 、uni-popup-dialog扩展组件支持 PC 端 diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js new file mode 100644 index 0000000..6ef26a2 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + this.$once('hook:beforeDestroy', () => { + document.removeEventListener('keyup', listener) + }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue new file mode 100644 index 0000000..291634c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-dialog/uni-popup-dialog.vue @@ -0,0 +1,263 @@ + + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue new file mode 100644 index 0000000..f4c85e2 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-message/uni-popup-message.vue @@ -0,0 +1,143 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue new file mode 100644 index 0000000..705902d --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup-share/uni-popup-share.vue @@ -0,0 +1,185 @@ + + + + diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/en.json b/uni_modules/uni-popup/components/uni-popup/i18n/en.json new file mode 100644 index 0000000..7f1bd06 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/en.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "cancel", + "uni-popup.ok": "ok", + "uni-popup.placeholder": "pleace enter", + "uni-popup.title": "Hint", + "uni-popup.shareTitle": "Share to" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/index.js b/uni_modules/uni-popup/components/uni-popup/i18n/index.js new file mode 100644 index 0000000..de7509c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/index.js @@ -0,0 +1,8 @@ +import en from './en.json' +import zhHans from './zh-Hans.json' +import zhHant from './zh-Hant.json' +export default { + en, + 'zh-Hans': zhHans, + 'zh-Hant': zhHant +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json new file mode 100644 index 0000000..5e3003c --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hans.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "确定", + "uni-popup.placeholder": "请输入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json new file mode 100644 index 0000000..13e39eb --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/i18n/zh-Hant.json @@ -0,0 +1,7 @@ +{ + "uni-popup.cancel": "取消", + "uni-popup.ok": "確定", + "uni-popup.placeholder": "請輸入", + "uni-popup.title": "提示", + "uni-popup.shareTitle": "分享到" +} diff --git a/uni_modules/uni-popup/components/uni-popup/keypress.js b/uni_modules/uni-popup/components/uni-popup/keypress.js new file mode 100644 index 0000000..62dda46 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/keypress.js @@ -0,0 +1,45 @@ +// #ifdef H5 +export default { + name: 'Keypress', + props: { + disable: { + type: Boolean, + default: false + } + }, + mounted () { + const keyNames = { + esc: ['Esc', 'Escape'], + tab: 'Tab', + enter: 'Enter', + space: [' ', 'Spacebar'], + up: ['Up', 'ArrowUp'], + left: ['Left', 'ArrowLeft'], + right: ['Right', 'ArrowRight'], + down: ['Down', 'ArrowDown'], + delete: ['Backspace', 'Delete', 'Del'] + } + const listener = ($event) => { + if (this.disable) { + return + } + const keyName = Object.keys(keyNames).find(key => { + const keyName = $event.key + const value = keyNames[key] + return value === keyName || (Array.isArray(value) && value.includes(keyName)) + }) + if (keyName) { + // 避免和其他按键事件冲突 + setTimeout(() => { + this.$emit(keyName, {}) + }, 0) + } + } + document.addEventListener('keyup', listener) + // this.$once('hook:beforeDestroy', () => { + // document.removeEventListener('keyup', listener) + // }) + }, + render: () => {} +} +// #endif diff --git a/uni_modules/uni-popup/components/uni-popup/popup.js b/uni_modules/uni-popup/components/uni-popup/popup.js new file mode 100644 index 0000000..c4e5781 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/popup.js @@ -0,0 +1,26 @@ + +export default { + data() { + return { + + } + }, + created(){ + this.popup = this.getParent() + }, + methods:{ + /** + * 获取父元素实例 + */ + getParent(name = 'uniPopup') { + let parent = this.$parent; + let parentName = parent.$options.name; + while (parentName !== name) { + parent = parent.$parent; + if (!parent) return false + parentName = parent.$options.name; + } + return parent; + }, + } +} diff --git a/uni_modules/uni-popup/components/uni-popup/uni-popup.vue b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue new file mode 100644 index 0000000..59698b7 --- /dev/null +++ b/uni_modules/uni-popup/components/uni-popup/uni-popup.vue @@ -0,0 +1,403 @@ + + + + diff --git a/uni_modules/uni-popup/package.json b/uni_modules/uni-popup/package.json new file mode 100644 index 0000000..1385af7 --- /dev/null +++ b/uni_modules/uni-popup/package.json @@ -0,0 +1,89 @@ +{ + "id": "uni-popup", + "displayName": "uni-popup 弹出层", + "version": "1.6.2", + "description": " Popup 组件,提供常用的弹层", + "keywords": [ + "uni-ui", + "弹出层", + "弹窗", + "popup", + "弹框" + ], + "repository": "https://github.com/dcloudio/uni-ui", + "engines": { + "HBuilderX": "" + }, + "directories": { + "example": "../../temps/example_temps" + }, + "dcloudext": { + "category": [ + "前端组件", + "通用组件" + ], + "sale": { + "regular": { + "price": "0.00" + }, + "sourcecode": { + "price": "0.00" + } + }, + "contact": { + "qq": "" + }, + "declaration": { + "ads": "无", + "data": "无", + "permissions": "无" + }, + "npmurl": "https://www.npmjs.com/package/@dcloudio/uni-ui" + }, + "uni_modules": { + "dependencies": [ + "uni-transition" + ], + "encrypt": [], + "platforms": { + "cloud": { + "tcb": "y", + "aliyun": "y" + }, + "client": { + "App": { + "app-vue": "y", + "app-nvue": "y" + }, + "H5-mobile": { + "Safari": "y", + "Android Browser": "y", + "微信浏览器(Android)": "y", + "QQ浏览器(Android)": "y" + }, + "H5-pc": { + "Chrome": "y", + "IE": "y", + "Edge": "y", + "Firefox": "y", + "Safari": "y" + }, + "小程序": { + "微信": "y", + "阿里": "y", + "百度": "y", + "字节跳动": "y", + "QQ": "y" + }, + "快应用": { + "华为": "u", + "联盟": "u" + }, + "Vue": { + "vue2": "y", + "vue3": "u" + } + } + } + } +} diff --git a/uni_modules/uni-popup/readme.md b/uni_modules/uni-popup/readme.md new file mode 100644 index 0000000..7c4de64 --- /dev/null +++ b/uni_modules/uni-popup/readme.md @@ -0,0 +1,296 @@ + + +## Popup 弹出层 +> **组件名:uni-popup** +> 代码块: `uPopup` +> 关联组件:`uni-popup-dialog`,`uni-popup-message`,`uni-popup-share`,`uni-transition` + + +弹出层组件,在应用中弹出一个消息提示窗口、提示框等 + + +> **注意事项** +> 为了避免错误使用,给大家带来不好的开发体验,请在使用组件前仔细阅读下面的注意事项,可以帮你避免一些错误。 +> - 组件需要依赖 `sass` 插件 ,请自行手动安装 +> - `uni-popup-message` 、 `uni-popup-dialog` 等扩展ui组件,需要和 `uni-popup` 配套使用,暂不支持单独使用 +> - `nvue` 中使用 `uni-popup` 时,尽量将组件置于其他元素后面,避免出现层级问题 +> - `uni-popup` 并不能完全阻止页面滚动,可在打开 `uni-popup` 的时候手动去做一些处理,禁止页面滚动 +> - 如果想在页面渲染完毕后就打开 `uni-popup` ,请在 `onReady` 或 `mounted` 生命周期内调用,确保组件渲染完毕 +> - 在微信小程序开发者工具中,启用真机调试,popup 会延时出现,是因为 setTimeout 在真机调试中的延时问题导致的,预览和发布小程序不会出现此问题 +> - 使用 `npm` 方式引入组件,如果确认引用正确,但是提示未注册组件或显示不正常,请尝试重新编译项目 +> - `uni-popup` 中尽量不要使用 `scroll-view` 嵌套过多的内容,可能会影响组件的性能,导致组件无法打开或者打开卡顿 +> - `uni-popup` 不会覆盖原生 tabbar 和原生导航栏 +> - 组件支持 nvue ,需要在 `manifest.json > app-plus` 节点下配置 `"nvueStyleCompiler" : "uni-app"` +> - 如使用过程中有任何问题,或者您对uni-ui有一些好的建议,欢迎加入 uni-ui 交流群:871950839 + + + +### 安装方式 + +本组件符合[easycom](https://uniapp.dcloud.io/collocation/pages?id=easycom)规范,`HBuilderX 2.5.5`起,只需将本组件导入项目,在页面`template`中即可直接使用,无需在页面中`import`和注册`components`。 + +如需通过`npm`方式使用`uni-ui`组件,另见文档:[https://ext.dcloud.net.cn/plugin?id=55](https://ext.dcloud.net.cn/plugin?id=55) + + +### 基本用法 + +**示例** + +```html + +底部弹出 Popup +``` + +```javascript +export default { + methods:{ + open(){ + // 通过组件定义的ref调用uni-popup方法 ,如果传入参数 ,type 属性将失效 ,仅支持 ['top','left','bottom','right','center'] + this.$refs.popup.open('top') + } + } +} + +``` + +### 设置主窗口背景色 + +在大多数场景下,并不需要设置 `background-color` 属性,因为`uni-popup`的主窗口默认是透明的,在向里面插入内容的时候 ,样式完全交由用户定制,如果设置了背景色 ,例如 `uni-popup-dialog` 中的圆角就很难去实现,不设置背景色,更适合用户去自由发挥。 + +而也有特例,需要我们主动去设置背景色,例如 `type = 'bottom'` 的时候 ,在异型屏中遇到了底部安全区问题(如 iphone 11),因为 `uni-popup`的主要内容避开了安全区(设置`safe-area:true`),导致底部的颜色我们无法自定义,这时候使用 `background-color` 就可以解决这个问题。 + +**示例** + +```html + +底部弹出 Popup +``` + +### 禁用打开动画 +在某些场景 ,可能不希望弹层有动画效果 ,只需要将 `animation` 属性设置为 `false` 即可以关闭动画。 + +**示例** + +```html + +中间弹出 Popup +``` + +### 禁用点击遮罩关闭 +默认情况下,点击遮罩会自动关闭`uni-popup`,如不想点击关闭,只需将`mask-click`设置为`false`,这时候要关闭`uni-popup`,只能手动调用 `close` 方法。 + +**示例** + +```html + + + Popup + + +``` + +```javascript +export default { + data() { + return {} + }, + onReady() {}, + methods: { + open() { + this.$refs.popup.open('top') + }, + close() { + this.$refs.popup.close() + } + } +} + +``` + +## API + +### Popup Props + +|属性名|类型|默认值|说明| +|:-:|:-:|:-:|:-:| +|animation|Boolean|true|是否开启动画| +|type|String|'center'|弹出方式| +|mask-click|Boolean|true|蒙版点击是否关闭弹窗| +|background-color|String|'none'|主窗口背景色| +|safe-area|Boolean|true|是否适配底部安全区| + +#### Type Options + +|属性名|说明| +|:-:| :-:| +|top|顶部弹出 | +|center|居中弹出| +|bottom|底部弹出| +|left|左侧弹出| +|right|右侧弹出| +|message|预置样式 :消息提示| +|dialog|预置样式 :对话框| +|share|预置样式 :底部弹出分享示例 | + + +### Popup Methods + +|方法称名 |说明|参数| +|:-:|:-:|:-:| +|open|打开弹出层|open(String:type) ,如果参数可代替 type 属性| +|close|关闭弹出层 |-| + + +### Popup Events + +|事件称名|说明|返回值| +|:-:|:-:|:-:| +|change|组件状态发生变化触发|e={show: true|false,type:当前模式}| +|maskClick|点击遮罩层触发|-| + + +## 扩展组件说明 +`uni-popup` 其实并没有任何样式,只提供基础的动画效果,给用户一个弹出层解决方案,仅仅是这样并不能满足开发需求,所以我们提供了三种基础扩展样式 + +### uni-popup-message 提示信息 + +将 `uni-popup` 的`type`属性改为 `message`,并引入对应组件即可使用消息提示 ,*该组件不支持单独使用* + +**示例** + +```html + + + +``` + +### PopupMessage Props + +|属性名|类型|默认值|说明| +|:-:|:-:|:-:|:-:| +|type|String|success|消息提示主题| +|message|String|-|消息提示文字| +|duration|Number|3000|消息显示时间,超过显示时间组件自动关闭,设置为0 将不会关闭,需手动调用 close 方法关闭| + +#### Type Options + +|属性名|说明| +|:-:| :-:| +|success|成功 | +|warn|警告| +|error|失败| +|info|消息| + +### PopupMessage Slots + +|名称|说明| +|:-:|:-:| +|default|消息内容,会覆盖 message 属性| + +### uni-popup-dialog 对话框 + +将 `uni-popup` 的`type`属性改为 `dialog`,并引入对应组件即可使用对话框 ,*该组件不支持单独使用* + +**示例** + +```html + + + + +``` + +```javascript +export default { + methods: { + open() { + this.$refs.popup.open() + }, + /** + * 点击取消按钮触发 + * @param {Object} done + */ + close() { + // TODO 做一些其他的事情,before-close 为true的情况下,手动执行 close 才会关闭对话框 + // ... + this.$refs.popup.close() + }, + /** + * 点击确认按钮触发 + * @param {Object} done + * @param {Object} value + */ + confirm(value) { + // 输入框的值 + // console.log(value) + // TODO 做一些其他的事情,手动执行 close 才会关闭对话框 + // ... + this.$refs.popup.close() + } + } +} +``` + +### PopupDialog Props + +|属性名|类型|默认值|说明| +|:-:|:-:|:-:|:-:| +|type|String|success|对话框标题主题,可选值: success/warn/info/error| +|mode|String|base| 对话框模式,可选值:base(提示对话框)/input(可输入对话框)| +|title|String|-|对话框标题| +|content|String|-|对话框内容,base模式下生效| +|value| String\Number|-|输入框默认值,input模式下生效| +|placeholder|String|-|输入框提示文字,input模式下生效| +|before-close|Boolean|false | 是否拦截按钮事件,如为true,则不会关闭对话框,关闭需要手动执行 uni-popup 的 close 方法| + +#### PopupDialog Events + +|事件称名 |说明|返回值| +|:-:|:-:|:-:| +|close|点击dialog取消按钮触发|-| +|confirm|点击dialog确定按钮触发|e={value:input模式下输入框的值}| + +### PopupDialog Slots + +|名称|说明| +|:-:|:-:| +|default|自定义内容,回覆盖原有的内容显示| + +### uni-popup-share 分享示例 + +分享示例,不作为最终可使用的组件,只做为样式组件,供用户自行修改,`后续的开发计划是实现实际的分享逻辑,参数可配置`。 + +将 `uni-popup` 的 `type` 属性改为 `share`,并引入对应组件即可使用 ,*该组件不支持单独使用* + +**示例** + +```html + + + +``` + +### PopupShare Props + +|属性名|类型|默认值|说明| +|:-:|:-:|:-:| :-: | +|title|String|-|分享弹窗标题| +|before-close|Boolean|false | 是否拦截按钮事件,如为true,则不会关闭对话框,关闭需要手动执行 uni-popup 的 close 方法| + +### PopupShare Events + +|事件称名|说明|返回值| +|:-:|:-:|:-:| +|select|选择触发|e = {item,index}:所选参数| + +**Tips** +- share 分享组件,只是作为一个扩展示例,如果需要修改数据源,请到组件内修改 + +## 帮助 +在使用中如遇到无法解决的问题,请提 [Issues](https://github.com/dcloudio/uni-ui/issues) 给我们。 + + + +## 组件示例 + +点击查看:[https://hellouniapp.dcloud.net.cn/pages/extUI/popup/popup](https://hellouniapp.dcloud.net.cn/pages/extUI/popup/popup) \ No newline at end of file