diff --git a/.gitignore b/.gitignore
index 45dca11..46ca683 100644
--- a/.gitignore
+++ b/.gitignore
@@ -1,5 +1,6 @@
.DS_Store
node_modules
+unpackage*
/dist
.hbuilderx
diff --git a/.hbuilderx/launch.json b/.hbuilderx/launch.json
index 582561b..f83558e 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" : "standard",
+ "type" : "uni-app:app-android"
+ },
+ {
+ "playground" : "custom",
+ "type" : "uni-app:app-ios"
+ }
]
}
diff --git a/api/api.js b/api/api.js
new file mode 100644
index 0000000..29f717d
--- /dev/null
+++ b/api/api.js
@@ -0,0 +1,55 @@
+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 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/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..853df22
--- /dev/null
+++ b/components/qiqb-share/qiqb-share.vue
@@ -0,0 +1,742 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 分享至
+ 长按海报可转发分享
+
+
+ 保存图片
+
+
+ 取消
+
+
+
+
+
+
\ 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..4bac5f7
--- /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
+ // 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||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..df13df9
--- /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 72fd697..5d70fb9 100644
--- a/manifest.json
+++ b/manifest.json
@@ -1,6 +1,6 @@
{
- "name" : "养殖分析",
- "appid" : "__UNI__EEA7DC9",
+ "name" : "农业咨询",
+ "appid" : "__UNI__3A527D1",
"description" : "",
"versionName" : "1.0.0",
"versionCode" : "100",
@@ -17,7 +17,11 @@
"delay" : 0
},
/* 模块配置 */
- "modules" : {},
+ "modules" : {
+ "Record" : {},
+ "Speech" : {},
+ "Camera" : {}
+ },
/* 应用发布信息 */
"distribute" : {
/* android打包配置 */
@@ -47,7 +51,9 @@
},
/* SDK配置 */
"sdkConfigs" : {
- "ad" : {}
+ "ad" : {},
+ "speech" : {},
+ "share" : {}
}
}
},
@@ -55,7 +61,7 @@
"quickapp" : {},
/* 小程序特有相关 */
"mp-weixin" : {
- "appid" : "",
+ "appid" : "wx3267f87bc81f2890",
"setting" : {
"urlCheck" : false
},
diff --git a/pages.json b/pages.json
index 7b90ae6..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 aa1b7e2..dac1628 100644
--- a/pages/index/index.vue
+++ b/pages/index/index.vue
@@ -1,717 +1,2115 @@
-
- {{ajax.loadText}}
-
-
-
-
-
-
-
-
-
-
- |
-
-
-
-
-
-
-
-
-
-
-
-
- 中断连接
-
-
-
-
-
-
-
-
-
-
-
-
+
+
+
+
+
+
+ 农业咨询
+
+
+
+
+
+ {{ajax.loadText}}
+
+
+
+
+
+
+ 您好!
+
+
+ 您可以和我说任何有关农业的问题。
+ 例如下面的问题,赶快试试吧!
+
+
+ 下方输入:
+
+ 冬季怎么保存蔬菜
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 正在快速生成答案
+
+
+
+
+
+
+
+
+
+ 正在快速生成答案
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ 中断连接
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ {{btnStatus==0? "按住说话":btnStatus==1? "说话中...": btnStatus==2? "松开手指发送录音": "上划取消"}}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ 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/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