提交 371270e5 编写于 作者: D DCloud_LXH

chore: init

上级
node_modules
docs/.vuepress/dist
.DS_Store
**/sitemap.xml
docs-lite
dist
\ No newline at end of file
# uni-app x 是什么?
> HBuilderX3.9+
uni-app x,是下一代 uni-app,是一个跨平台应用开发引擎。
uni-app x 没有使用js和webview,它基于 uts 语言。在App端,uts在iOS编译为swift、在Android编译为kotlin,完全达到了原生应用的功能、性能。
可以下载打包后的[hello uni-app x](https://web-assets.dcloud.net.cn/unidoc/zh/uni-app-x/hello-uniappx.apk)的apk来体验。(通过显示界面元素边界可知界面都是原生UI,解包后也不会看到js引擎,里面的html文件是示例中演示web-view组件所用)
<div class="quick">
<div style="margin-top: 20px;justify-content: space-around;">
<a
href="https://web-assets.dcloud.net.cn/unidoc/zh/uni-app-x/hello-uniappx.apk"
target="_blank"
style="display: flex; align-items: center;flex-direction: column;margin: 0 5px 20px;width:160px;"
one-link-mark="yes"
>
<div class="barcode-img-box">
<img
src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app-x/hello-uniappx-apkqrcode.png"
width="160"
loading="lazy"
/>
</div>
<b>hello uni-app x</b>
</a>
</div>
</div>
hello uni-app x的源码见:[https://gitcode.net/dcloud/hello-uni-app-x](https://gitcode.net/dcloud/hello-uni-app-x)
uni-app x 是一个庞大的工程,它包括uts语言、uvue渲染引擎、uni的组件和API、以及扩展机制。
## 文档编写注意事项
1. 右侧导航仅支持二级、三级、四级
2. 文档如有标题,必须从一级或二级开始,不允许只有三级,没有二级的情况;也不允许先有三级、后有二级的情况;
3. FAQ、注意事项、常见问题,要放在文档最下方,不要穿插在文档中间位置
4. 容器书写方式,支持:`tip``warning``danger``details(在 IE / Edge 中不生效)` [详情](https://vuepress.vuejs.org/zh/guide/markdown.html#%E8%87%AA%E5%AE%9A%E4%B9%89%E5%AE%B9%E5%99%A8)
```md
::: warning 注意
- 认证凭证有效期为`30分钟`
- 当余额全部被冻结时,会出现有余额但无法调用服务的情况
:::
```
![](https://web-assets.dcloud.net.cn/unidoc/zh/action_temp.jpg)
5. 代码语法高亮支持:`js``javascript``ts``typescript``objc(Objective-C)``kt(Kotlin)``cs(C#)``cpp(C++)`等。[详情](https://prismjs.com/#supported-languages)
6. 支持流程图:
```mermaid
sequenceDiagram
actor user as 用户端
participant cf as 云函数/云对象
participant service as 认证服务
activate user
user->>+user: 获取设备信息metaInfo
user->>+cf: 提交姓名、身份证号、metaInfo获取certifyId
cf->>+service: 提交姓名、身份证号、metaInfo获取certifyId
service-->>-cf: 返回certifyId
cf-->>-user: 返回certifyId
user->>+service: 调用sdk进行刷脸认证
service-->>-user: 返回认证结果
user->>+cf: 请求校验认证结果
cf->>+service: 请求认证结果
service-->>-cf: 返回认证结果
cf-->>-user: 返回最终实人认证结果
deactivate user
```
![](https://web-assets.dcloud.net.cn/unidoc/zh/doc_mermaid.jpg)
7. 代码支持行高亮 [详情](https://vuepress.vuejs.org/zh/guide/markdown.html#%E4%BB%A3%E7%A0%81%E5%9D%97%E4%B8%AD%E7%9A%84%E8%A1%8C%E9%AB%98%E4%BA%AE)
![](https://web-assets.dcloud.net.cn/unidoc/zh/docs_code_color.jpg)
8. 标题(Badge)组件 [详情](https://vuepress.vuejs.org/zh/guide/using-vue.html#badge)
![](https://web-assets.dcloud.net.cn/unidoc/zh/docs_bage_component.jpg)
9. 可使用模板语法 [详情](https://vuepress.vuejs.org/zh/guide/using-vue.html#%E6%A8%A1%E6%9D%BF%E8%AF%AD%E6%B3%95)
![](https://web-assets.dcloud.net.cn/unidoc/zh/docs_temp_code.jpg)
10. 图片点击放大 `img.class="zooming"`
```html
<img class="zooming" src="xxx">
```
11. md 支持书写属性。`#{`:左定界符,与 markdown 语法之间不能有空格;`}` 右定界符
```md
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app-multiport.jpg)#{.zooming data=abc width=100 height=100}
```
渲染为:
```html
<img src="https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app-multiport.jpg" class="zooming" data="abc" width="100" height="100" />
```
12. 路径注意
- _sidebar.md是左侧导航,其中路径写https路径,可打开新页签。如左侧导航里引用了本产品目录之外的文档,需写成这种方式
- 每个产品目录下均有一个static目录,在其中提交图片视频等静态资源。引用static下的静态资源时,路径可以是"../static"、"./static",不能写"static/"。
- 书写文档时应注意特殊符号的编写与换行:
- `###` 下应有空行
- `内容 **加粗** 内容` 两边需要有空格
- 在书写方括号 `[]` 时要注意使用转义字符 `\`,或者使用 `\`\`` 包裹,否则会被识别为链接,导致链接失效
13. md 表格支持行、列合并
- 行列合并
```md
|资源分类 |资源细项 |售价(元) |
|:-: |:-: |:-: |
|云函数 #{rowspan=3}|资源使用量(GBs) |0.000110592|
|调用次数(万次) |0.0133 |
|出网流量(GB) |0.8 |
|云数据库 #{rowspan=3}|容量(GB/天) |0.07 |
|读操作使用量(万RU) |0.015 |
|写操作使用量(万RU) |0.05 |
|云存储 #{rowspan=4}|容量(GB/天) |0.0043 |
|下载操作次数(万次) |0.01 |
|上传操作次数(万次) |0.01 |
|CDN 流量(GB) |0.18 |
|前端网站托管 #{rowspan=2}|容量(GB/天) |0.0043 |
|流量(GB)|0.18 |
|售价(元/月)#{colspan=2} |5 |
```
## 文档 Algolia 使用限额
Included Quota:
- Records: 1,000,000
- Operations: 1,000,000
Included Features:
- Analytics Api
- Search Analytics
- Events Analytics
- 90 Days Analytics Retention
- AI Synonyms
- Dynamic Reranking
Advanced Team Management
- Crawler UI
- Query Suggestion
- Facet Display
- Natural Language Processing (NLP)
- Synonyms 10,000/index
Size Limits:
- maxRecordSize 100KB
- maximum application size 100GB
- maxNbIndices 1,000
AI Synonyms and Dynamic Reranking:need to send click events (via insights) to leverage Dynamic Reranking.
dist
\ No newline at end of file
<template>
<div class="banner">
<div class="slider">
<span class="slider-btn slider-btn-left"></span>
<span class="slider-btn slider-btn-right"></span>
<div class="slider-group">
<template v-for="item in images">
<div class="slider-item" :key="item">
<img :src="item" />
</div>
</template>
</div>
</div>
</div>
</template>
<script>
var sliderTime;
export default {
data() {
return {
images: [
'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/case6.png',
'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/case2.png',
'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/case1.png',
'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/case3.png',
'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/case4.png',
],
};
},
mounted() {
this.StartBanner();
},
beforeDestroy() {
clearInterval(sliderTime);
},
methods: {
StartBanner() {
var banner = document.querySelector('.banner'),
slider = document.querySelector('.slider-group'),
sliderItems = document.querySelectorAll('.slider-item'),
sliderLength = sliderItems.length;
var bannerWidth = null,
index = 1; //slider下标
var arrowLeft = document.querySelector('.slider-btn-left'),
arrowRight = document.querySelector('.slider-btn-right');
//创建dots
var sliderDots = document.createElement('div');
sliderDots.className = 'slider-dots';
var dots = '<span class="dot active" data-num="0"></span>';
for (var i = 1; i < sliderLength; i++) {
dots += '<span class="dot" data-num="' + i + '"></span>';
}
sliderDots.innerHTML = dots;
document.querySelector('.slider').appendChild(sliderDots);
//在第一个前、最后一个后各加一个item
var last_item = document.createElement('div'),
next_item = document.createElement('div');
last_item.className = 'slider-item';
last_item.innerHTML = sliderItems[sliderItems.length - 1].innerHTML;
slider.insertBefore(last_item, sliderItems[0]);
next_item.className = 'slider-item';
next_item.innerHTML = sliderItems[0].innerHTML;
slider.appendChild(next_item);
sliderItems = document.querySelectorAll('.slider-item');
function setSlider() {
bannerWidth = banner.offsetWidth;
for (var i = 0, length = sliderItems.length; i < length; i++) {
sliderItems[i].style.width = bannerWidth + 'px';
}
slider.style.width = sliderItems.length * bannerWidth + 'px';
slider.style.transition = 'transform 0ms';
slider.style.transform = 'translate(' + -index * bannerWidth + 'px, 0px)';
}
setSlider();
window.onresize = setSlider;
sliderTime = setInterval(sliderStart, 5000);
function sliderStart() {
//开始轮播)
/* if(!~location.pathname.indexOf($docsify.banner)){
clearInterval(sliderTime);
return;
} */
index += 1;
if (index < 0 || index > sliderLength + 1) {
index = index < 0 ? 0 : sliderLength + 1;
}
slider.style.transition = 'transform 300ms';
document.querySelector('.active.dot').classList.remove('active');
var dotIndex = index > sliderLength ? 0 : index < 1 ? sliderLength - 1 : index - 1;
sliderDots.children[dotIndex].classList.add('active');
slider.style.transform = 'translate(' + -index * bannerWidth + 'px, 0px)';
setTimeout(function () {
if (index > sliderLength || index < 1) {
index = index > sliderLength ? 1 : sliderLength;
slider.style.transition = 'transform 0ms';
slider.style.transform = 'translate(' + -index * bannerWidth + 'px, 0px)';
}
}, 300);
}
var mouseClearSlider = false;
sliderDots.addEventListener('mouseover', function (e) {
showArrow();
if (e.target.tagName === 'SPAN') {
mouseClearSlider = true;
clearInterval(sliderTime);
if (e.target.className === 'dot') {
slider.style.transition = 'transform 300ms';
document.querySelector('.active.dot').classList.remove('active');
e.target.classList.add('active');
index = Number(e.target.dataset.num) + 1;
slider.style.transform = 'translate(' + -index * bannerWidth + 'px, 0px)';
}
return;
}
if (mouseClearSlider) {
mouseClearSlider = false;
clearInterval(sliderTime);
sliderTime = setInterval(sliderStart, 5000);
}
});
sliderDots.addEventListener('mouseout', function (e) {
hideArrow();
if (mouseClearSlider) {
mouseClearSlider = false;
clearInterval(sliderTime);
sliderTime = setInterval(sliderStart, 5000);
}
});
// 处理 banner 的两个箭头
document.querySelector('.slider').addEventListener('mouseover', showArrow);
document.querySelector('.slider').addEventListener('mouseout', hideArrow);
arrowLeft.addEventListener('mouseover', showArrow);
arrowLeft.addEventListener('mouseout', hideArrow);
arrowRight.addEventListener('mouseover', showArrow);
arrowRight.addEventListener('mouseout', hideArrow);
function showArrow() {
//显示箭头
arrowLeft.style.display = 'block';
arrowRight.style.display = 'block';
// var scroll_left = document.documentElement.scrollLeft;
// arrowLeft.style.left = scroll_left + "px";
// arrowRight.style.right = document.documentElement.scrollWidth - document.documentElement.clientWidth - scroll_left +
// 'px';
}
function hideArrow() {
//隐藏箭头
arrowLeft.style.display = 'none';
arrowRight.style.display = 'none';
}
arrowLeft.addEventListener('click', function () {
index -= 2;
clearInterval(sliderTime);
sliderStart();
sliderTime = setInterval(sliderStart, 5000);
});
arrowRight.addEventListener('click', function () {
clearInterval(sliderTime);
sliderStart();
sliderTime = setInterval(sliderStart, 5000);
});
},
},
};
</script>
<style>
/* banner */
.banner {
width: 100%;
margin: 0 auto;
overflow: hidden;
}
.banner .slider {
position: relative;
width: 100%;
overflow: hidden;
}
.banner .slider-btn {
position: absolute;
cursor: pointer;
width: 41px;
height: 69px;
top: 50%;
transform: translateY(-50%);
-webkit-transform: translateY(-50%);
z-index: 20;
display: none;
background-image: url(https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/arrow.png);
}
.banner .slider-btn.slider-btn-left {
left: 0;
}
.banner .slider-btn.slider-btn-right {
right: 0;
background-position-x: 41px;
}
.banner .slider-item {
float: left;
width: 100%;
}
.banner .slider .slider-dots {
display: none;
position: absolute;
line-height: 0;
left: 50%;
bottom: 5px;
transform: translateX(-50%);
-webkit-transform: translateX(-50%);
text-align: center;
font-size: 0;
}
.banner .slider .dot {
display: inline-block;
margin: 0 5px;
width: 10px;
height: 10px;
border-radius: 50%;
background: #ccc;
cursor: pointer;
}
.banner .slider .dot.active {
width: 30px;
border-radius: 10px;
background: rgb(225, 114, 0);
}
</style>
<template>
<div></div>
</template>
<script>
export default {
data() {
return {
contentFrame: [],
};
},
mounted() {
if (this.$isServer) return;
const visibleHeight =
document.documentElement.clientHeight - document.querySelector('.sub-navbar').clientHeight;
const contentRef = document.querySelector('.page .theme-default-content');
const renderUl = () => {
const contentChildren = contentRef.children;
[...contentChildren].forEach((child, index) => {
if (child.nodeName === 'UL') {
const ulHeight = child.clientHeight;
const ulOffsetTop = child.offsetTop;
const isVisible = visibleHeight + window.scrollY > ulOffsetTop - 500;
const isOver = window.scrollY > ulOffsetTop + ulHeight
child.style.height = `${ulHeight}px`;
if (!isVisible || isOver) {
const _ul = document.createDocumentFragment();
[...child.children].forEach(item => _ul.appendChild(item));
(!this.contentFrame[index] || !this.contentFrame[index].children.length) &&
(this.contentFrame[index] = _ul);
} else {
if (this.contentFrame[index]) {
[...this.contentFrame[index].children].forEach(item => child.appendChild(item));
}
}
}
});
};
if (contentRef) {
contentRef.style.height = contentRef.clientHeight;
renderUl();
window.addEventListener('scroll', renderUl);
}
},
};
</script>
const path = require('path');
const { slugify } = require('@vuepress/shared-utils')
const highlight = require('@vuepress/markdown/lib/highlight')
const translatePlugin = require('./markdown/translate')
const headerPlugin = require('./markdown/header')
const createSidebar = require('./markdown/createSidebar')
const { simplifySlugText, tabs, getFormattedDate } = require('./utils')
const copyOptions = require('./config/copy');
const nowString = getFormattedDate();
const changeLoaderOptions = (options, key = 'name') => {
if (options && options[key]) options[key] = `${nowString}/${options[key]}`;
return options;
};
const config = {
theme: 'vuepress-theme-uni-app-test',
title: 'uniCloud',
description: 'uniCloud Document',
evergreen: process.env.NODE_ENV === 'development',
head: [
['link', {
rel: 'shortcut icon',
type: 'image/x-icon',
href: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/icon.png?v=1556263038788'
}],
['meta', {
name: 'viewport', content: 'width=device-width, initial-scale=1.0, user-scalable=0, minimum-scale=1.0, maximum-scale=1.0'
}],
['meta', {
name: 'keywords', content: '数字天堂,前端开发,web开发,小程序开发,跨平台,跨平台开发,跨端开发,混合开发,serverless,云开发,云函数'
}],
['script', { src: 'https://hm.baidu.com/hm.js?fe3b7a223fc08c795f0f4b6350703e6f' }],
['script', { src: '/miku-delivery-1.2.1.js' }],
['script', { src: `/js/miku.js?${Date.now()}&v=${Date.now()}&version=${Date.now()}` }]
],
locales: {
'/': {
lang: 'zh-CN',
}
},
themeConfig: {
titleLogo: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-app.png',
logo: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/logo.png',
sidebar: createSidebar(tabs),
sidebarDepth: 0,
nextLinks: false,
prevLinks: false,
repo: 'dcloudio/uni-app',
docsRepo: 'https://gitcode.net/dcloud/unidocs-uni-app-x',
docsBranch: 'master',
docsDir: 'docs',
editLinks: true,
editLinkText: '帮助我们改善此页面!',
lastUpdated: '上次更新',
// smoothScroll: true,
search: false,
algolia: {
apiKey: '2fdcc4e76c8e260671ad70065e60b2e7',
indexName: 'zh-uniapp',
appId: 'PQIR5NL8CZ',
searchParameters: { hitsPerPage: 50 }
},
isDevelopment: process.env.NODE_ENV === 'development'
},
markdown: {
// toc: { includeLevel: [1, 2, 3, 4] },
slugify (str) {
if (typeof str !== 'string') return ''
let slug = str
if (slug.includes('@')) {
let array = slug.split('@')
slug = array.length > 1 ? array[array.length - 1] : str
} else {
slug = simplifySlugText(slug.toLowerCase()).trim()
}
return slugify(slug)
},
extractHeaders: ['h1', 'h2', 'h3', 'h4'],
chainMarkdown (config) {
const extensionMap = {
uts: 'ts'
}
config.options.highlight((str, lang) => {
const extension = extensionMap[lang]
return highlight(str, extension || lang)
})
config
.plugin('translate')
.use(translatePlugin)
.end()
.plugin('convert-header')
.use(headerPlugin)
.end()
.plugin('normallize-link')
.use(require('./markdown/normallizeLink'))
.end()
.plugin('img-add-attrs')
.use(require('./markdown/img-add-attrs'))
.end()
.plugin('attrs')
.use(require('markdown-it-attrs'),[{
leftDelimiter: '#{',
rightDelimiter: '}'
}])
.end()
.plugin('task-lists')
.use(require('markdown-it-task-lists'))
.end()
.plugin('inject-json-to-md')
.use(require('./markdown/inject-json-to-md'))
.end()
.plugin('markdown-it-raw-table')
.use(require('markdown-it-raw-table'))
}
},
chainWebpack (config, isServer) {
config.resolve.alias.set(
'@theme-config',
path.resolve(process.cwd(), 'docs/.vuepress/config')
)
if (!isServer && process.env.NODE_ENV === 'production') {
config.output.filename(`${nowString}/${config.output.get('filename')}`); //输出文件名
config.module.rule('images').use('url-loader').tap(changeLoaderOptions);
config.module.rule('fonts').use('url-loader').tap(changeLoaderOptions);
config.module.rule('media').use('url-loader').tap(changeLoaderOptions);
config.module.rule('svg').use('file-loader').tap(changeLoaderOptions);
const extract_css_plugin = config.plugin('extract-css');
const extract_css_plugin_args = extract_css_plugin.get('args');
if (extract_css_plugin_args) {
extract_css_plugin.set(
'args',
extract_css_plugin_args.map(item =>
changeLoaderOptions(item, 'filename')
)
);
}
}
},
patterns: ['**/!(_sidebar).md', '**/*.vue'],
plugins: [
["vuepress-plugin-juejin-style-copy", copyOptions],
[
'named-chunks',
{
layoutChunkName: (layout) => 'layout-' + layout.componentName,
pageChunkName: page => {
const _context = page._context
const pageHeaders = (page.headers || []).map(item => item.title).join(',')
if (pageHeaders) {
const originDescription = page.frontmatter.description || ''
page.frontmatter = {
...page.frontmatter,
description: `${_context.siteConfig.description ? `${_context.siteConfig.description},` : ''}${pageHeaders}${originDescription ? `,${originDescription}` : ''}`.slice(0, 150),
}
}
const pagePath = page.path.indexOf('.html') === -1 ? page.path + 'index' : page.path
const curPath = 'docs/' + pagePath.replace('docs/', '').substring(1).replace(/\.html/g, "")
return curPath
}
}
]
],
/**
*
* @param {string} path path: js 资源文件路径
* @param {string} type type: 资源文件类型,取值有 script 等
* @returns
*/
shouldPrefetch: (path, type) => {
if (type === 'script') return path.includes('vendors~') || path.includes('layout-') || path.includes('index.')
return false
}
}
module.exports = config
\ No newline at end of file
// 此处需要使用 commonjs
module.exports = {
copyText: '复制代码',
tip: { content: "复制成功", title: "" },
visibleTip: true,
}
\ No newline at end of file
export default {
footNavList: [
{
title: '开发产品',
content: [
{
subTitle: 'HBuilderX',
url: 'https://www.dcloud.io/hbuilderx.html',
},
{
subTitle: 'uni-app',
url: 'https://uniapp.dcloud.net.cn/',
},
{
subTitle: 'uni-app x',
url: 'https://uniapp.dcloud.net.cn/',
},
{
subTitle: 'uniCloud',
url: 'https://uniapp.dcloud.net.cn/uniCloud/README',
},
{
subTitle: 'uniMPsdk',
url: 'https://nativesupport.dcloud.net.cn/',
},
{
subTitle: '5+Runtime',
url: 'https://www.dcloud.io/runtime.html',
},
{
subTitle: 'wap2app',
url: 'https://www.dcloud.io/wap2app.html?platform=wap2app',
},
{
subTitle: 'MUI',
url: 'https://www.dcloud.io/mui.html',
},
{
subTitle: 'uni-id',
url: 'https://uniapp.dcloud.net.cn/uniCloud/uni-id',
},
{
subTitle: 'uni-search',
url: 'https://ext.dcloud.net.cn/plugin?id=3851',
},
{
subTitle: 'uniPay',
url: 'https://uniapp.dcloud.net.cn/uniCloud/unipay',
},
{
subTitle: 'uniPush',
url: 'https://uniapp.dcloud.net.cn/unipush',
},
{
subTitle: 'uni-verify',
url: 'https://uniapp.dcloud.io/univerify',
},
{
subTitle: 'uni实人认证',
url: 'https://uniapp.dcloud.net.cn/uniCloud/frv/intro.html',
},
{
subTitle: 'sms',
url: 'https://uniapp.dcloud.net.cn/uniCloud/send-sms',
},
{
subTitle: 'uni-starter',
url: 'https://ext.dcloud.net.cn/plugin?id=5057',
},
{
subTitle: 'uni-admin',
url: 'https://uniapp.dcloud.net.cn/uniCloud/admin',
},
{
subTitle: 'uni-upgrade-center',
url: 'https://uniapp.dcloud.io/uniCloud/upgrade-center',
},
{
subTitle: 'uni-im',
url: 'https://uniapp.dcloud.net.cn/uniCloud/uni-im',
},
{
subTitle: 'uni-ai',
url: 'https://uniapp.dcloud.net.cn/uniCloud/uni-ai',
},
{
subTitle: 'uni-cms',
url: 'https://uniapp.dcloud.net.cn/uniCloud/uni-cms',
},
],
},
],
aboutusList: [
{
title: '运营产品',
content: [
{
subTitle: 'uni-AD',
url: 'https://uniad.dcloud.net.cn/login',
},
{
subTitle: 'uni统计',
url: 'https://tongji.dcloud.net.cn/',
},
{
subTitle: 'uni发行',
url: 'https://www.dcloud.io/dportal.html',
},
{
subTitle: 'uni安全专题',
url: 'https://uniapp.dcloud.net.cn/tutorial/safe.html',
},
],
},
/* {
'title': '',
'content': []
}, */
{
title: '开发者服务',
content: [
{
subTitle: '问答社区',
url: 'https://ask.dcloud.net.cn/explore/',
},
{
subTitle: '开发者后台',
url: 'https://dev.dcloud.net.cn/',
},
],
},
{
title: '技术文档',
content: [
{
subTitle: 'uni-app文档',
url: 'https://uniapp.dcloud.io/',
},
{
subTitle: 'uniCloud文档',
url: 'https://uniapp.dcloud.io/uniCloud/README',
},
{
subTitle: '原生开发者支持文档',
url: 'https://nativesupport.dcloud.net.cn/',
},
{
subTitle: 'HBuilder文档',
url: 'https://hx.dcloud.net.cn/',
},
],
},
{
title: '生态服务',
content: [
{
subTitle: '插件市场',
url: 'https://ext.dcloud.net.cn/',
},
{
subTitle: 'OAuth用户开放平台',
url: 'https://open.dcloud.net.cn/pages/login/login',
},
],
},
],
aboutus: {
title: '关于我们',
content: [
{
subTitle: 'DCloud官网',
url: 'https://dcloud.io/',
},
{
subTitle: '案例',
url: 'https://uniapp.dcloud.io/case',
},
{
subTitle: '需求墙',
url: 'https://dev.dcloud.net.cn/wish/?channel=uniapp',
},
{
subTitle: '许可协议',
url: 'https://ask.dcloud.net.cn/article/35623',
},
{
subTitle: '加入我们',
url: 'https://www.dcloud.io/hr/',
},
{
subTitle: '赞助我们',
url: 'https://dev.dcloud.net.cn/sponsor/',
},
],
},
concatus: {
title: '联系我们',
content: [
{
subTitle: '商务合作:bd@dcloud.io',
url: 'mailto:bd@dcloud.io',
},
{
subTitle: '广告合作:uniad@dcloud.io',
url: 'mailto:uniad@dcloud.io',
},
],
},
domainImg: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/jgwab.png',
beian:
'http://www.beian.gov.cn/portal/registerSystemInfo?recordcode=11010802035340',
};
export const LOCALE_ZH_HANS = 'zh-CN'
export const LOCALE_EN = 'en-US'
\ No newline at end of file
/**
* text
* target
* link // 有协议时是外链
* items
* type // link、links。
* rel
* needOutbound // 是否显示外链图标
*/
export const navbar = [
{
text: 'uniCloud',
type: 'link',
link: '/'
},
{
text: 'uni-app',
link: 'https://uniapp.dcloud.io/',
type: "link",
target: '_blank',
needOutbound: false
},
{
text: 'uni-app x',
link: 'https://uniapp.dcloud.io/uni-app-x/',
type: "link",
target: '_blank',
needOutbound: false
},
{
text: 'HBuilder',
link: 'https://hx.dcloud.net.cn/',
type: "link",
target: '_blank',
needOutbound: false
},
{
text: 'uni 小程序 sdk',
link: 'https://nativesupport.dcloud.net.cn/README',
type: "link",
target: '_blank',
needOutbound: false
},
/* {
text: '问答社区',
link: 'https://ask.dcloud.net.cn/explore/',
type: "link",
target: '_blank',
needOutbound: false
},
{
text: '插件市场',
type: "link",
target: '_blank',
link: 'https://ext.dcloud.net.cn/',
needOutbound: false
} */
]
export const navbarLanguage = {
default: 0,
items: [
{
text: '简体中文'
}
]
}
const routerMap = {
'/uniCloud/database': '/clientdb.html',
'/uniCloud/uni-clientDB': '/clientdb.html',
'/uniCloud/uni-id-summary': '/uniCloud/uni-id/summary.html',
'/uniCloud/uni-id-pages': '/uniCloud/uni-id/redirect.html',
'/uniCloud/uni-id-common': '/uniCloud/uni-id/cloud-common.html',
'/uniCloud/uni-id': '/uniCloud/uni-id/old.html',
'/uniCloud/': '/'
};
export default ({ fullPath, path, hash }) => {
fullPath = decodeURIComponent(fullPath);
const matchFullPath =
routerMap[fullPath.replace('?id=', '#').replace('.html', '')];
if (matchFullPath) {
return {
path: matchFullPath,
replace: true,
};
}
const matchPath = routerMap[path] || routerMap[path.replace('.html', '')];
if (matchPath) {
return {
path: matchPath,
hash,
replace: true,
};
}
if (
path.indexOf('/app-') === 0 ||
path.indexOf('/android-') === 0 ||
path.indexOf('/ios-') === 0
) {
return {
path: `/tutorial${path}`,
hash,
replace: true,
};
}
const routerMapKeys = Object.keys(routerMap);
let returnPathConfig = null;
routerMapKeys.forEach(key => {
if (
path.indexOf(key) === 0 &&
routerMap[key].indexOf(key) !== 0 &&
routerMap[key] !== path
) {
return (returnPathConfig = {
path: path.replace(key, routerMap[key]),
hash,
replace: true,
});
}
});
if (returnPathConfig) return returnPathConfig;
};
export default {
category: [
{
text: 'uniCloud',
type: 'algolia',
},
{
text: '问答社区',
tag: 'ask',
type: 'link',
link: 'https://ask.dcloud.net.cn/search/q-'
},
{
text: '插件市场',
tag: 'ext',
type: 'link',
link: 'https://ext.dcloud.net.cn/search?q='
},
{
text: '原生开发文档',
type: 'link',
link: 'https://nativesupport.dcloud.net.cn/?s=',
},
{
text: 'HBuilderX 文档',
type: 'link',
link: 'https://hx.dcloud.net.cn/?s=',
},
],
translations: {
searchBox: {
buttonText: '取消',
placeholder: '搜索内容',
searchBy: '搜索提供者'
},
resultsScreen: {
resultsText: '${resultHits}个相关结果',
noResultsText: '没有找到${categoryText}相关内容',
askNoResultsText: '以下为${categoryText}相关内容'
}
}
}
\ No newline at end of file
import uniCloud from './uniCloud';
export default {
"/": uniCloud,
weChatOfficialAccountImg: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/weixin.jpg'
}
export default {
contactItems: [{
name: 'uniCloud Web控制台',
url: 'https://unicloud.dcloud.net.cn',
imageUrl: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/cloud@2x.jpg'
},
{
name: '插件市场',
url: 'https://ext.dcloud.net.cn/',
imageUrl: 'https://img-cdn-aliyun.dcloud.net.cn/dev/img/ext/favicon.png'
},
{
name: 'ask问答社区',
url: 'https://ask.dcloud.net.cn/explore/',
imageUrl: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/d@2x.png'
},
{
name: 'uniAD',
url: 'https://uniad.dcloud.net.cn',
imageUrl: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uniad-520.png'
},
{
name: 'uni统计',
url: 'https://tongji.dcloud.net.cn/',
imageUrl: 'https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/uni-tongji-icon.png'
}
],
qq_group: [{
"number": "1012245137",
"state": 1,
attendance: 2000,
"prefix": "群1"
},
{
"number": "749911289",
"state": 1,
attendance: 1000,
"prefix": "群2"
},
{
"number": "599819864",
"state": 1,
attendance: 1000,
"prefix": "群3"
},
{
"number": "641753405",
"state": 1,
attendance: 1000,
"prefix": "群4"
},
{
"number": "806429316",
"state": 1,
attendance: 2000,
"prefix": "群5"
},
{
"number": "741357947",
"state": 0,
"prefix": "群6",
joinQQGroupHref: 'https://qm.qq.com/cgi-bin/qm/qr?k=GmOeLLMnc5WcgNllzKEsq7UG0Oq-8DHp&jump_from=webapi&authKey=LL8+4dkOgBwUqJ8aapXJD2/tOSi/PFO5ZAuhr7eD7obfLtXEvGsFvhGjC8pj2PfM'
}
]
}
\ No newline at end of file
export default {
onThisPage: '本页导读',
collapseText: '展示全部',
expandText: '收起目录'
}
\ No newline at end of file
function createMarkdownArray(contents = [], childrenName = 'children') {
const markdownArray = []
let itemCatch = {}
for (let index = 0; index < contents.length; index++) {
const item = contents[index];
if (itemCatch.parent) {
if (item.level === itemCatch.level) {
const child = {
...item,
parent: itemCatch.parent
};
itemCatch.parent[childrenName].push(child)
delete itemCatch.parent
itemCatch = child
continue
} else if (item.level > itemCatch.level) {
const child = {
...item,
parent: itemCatch
};
(itemCatch[childrenName] || (itemCatch[childrenName] = [])).push(child)
itemCatch = child
} else {
const parent = itemCatch.parent
delete itemCatch.parent
itemCatch = parent
index--
continue
}
} else {
if (typeof itemCatch.level === 'undefined' || item.level === itemCatch.level) {
itemCatch = item
markdownArray.push(itemCatch)
} else {
const child = {
...item,
parent: itemCatch
};
(itemCatch[childrenName] || (itemCatch[childrenName] = [])).push(child)
itemCatch = child
continue
}
}
}
// 移除最后一项 parent 节点,防止循环引用报错
(function removeParent(childs = []) {
childs.forEach(child => {
if (child.parent) delete child.parent
if (child[childrenName]) removeParent(child[childrenName])
})
})(markdownArray[markdownArray.length - 1][childrenName])
return markdownArray
}
module.exports = createMarkdownArray
\ No newline at end of file
const fs = require('fs')
const path = require('path')
const MarkdownIt = require('markdown-it');
const createMarkdownArray = require('./createMarkdownArray')
const { isExternal } = require('../utils')
const createSiteMap = require('./createSiteMap');
const links = []
function parseBar(tab, file, options) {
const textName = options.text || 'text'
const linkName = options.link || 'link'
const contents = []
new MarkdownIt()
.parse(fs.readFileSync(file, { encoding: 'utf-8' }).replace(/<!--([\s\S]*?)-->/g, ""))
.forEach(token => {
if (token.type === 'inline') {
let text
let link
let config = {}
token.children.forEach(child => {
switch (child.type) {
case 'text':
text = text || child.content
break;
case 'link_open':
link = link || new Map(child.attrs).get('href')
break;
case 'code_inline':
try {
config = JSON.parse(child.content)
} catch (error) { }
break;
default:
break;
}
})
if (link && !isExternal(link)) {
if (!link.startsWith('/')) {
const linkFirstItem = link.split('/')[0]
if (tab.indexOf(linkFirstItem) === -1) {
link = path.join(tab, link).replace(/\\/g, '/')
}
}
link = path.join('/', link.replace(/\.md\b/, '')
.replace(/\bREADME\b/, '')
.replace(/\/index/, '/')
.replace(/\?id=/, '#'))
.replace(/\\/g, '/')
links.push(link)
}
contents.push({
level: token.level,
[textName]: text,
[linkName]: link,
...config
})
}
})
return createMarkdownArray(contents, options.children)
}
module.exports = function (tabs = []) {
const sidebar = {}
tabs.forEach(tab => {
sidebar[tab] = parseBar(tab, path.join(__dirname, '../../', tab, '_sidebar.md'), {
text: 'title',
link: 'path'
})
})
createSiteMap(links, () => links.length = 0)
return tabs.length ? sidebar : false
}
\ No newline at end of file
const fs = require('fs')
const path = require('path')
const domain = 'https://zh.uniapp.dcloud.io'
const xmlBefore = `<?xml version="1.0" encoding="UTF-8"?>
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
`
const xmlAfter = `\n</urlset>`
module.exports = (links, callback = () => { }) => {
const xmlItems = links.map(url => {
return ` <url>
<loc>${domain + url}</loc>
</url>`
}).join('\n')
const rootPath = path.resolve(__dirname, '../public')
const staticExists = fs.existsSync(rootPath)
if (!staticExists) fs.mkdirSync(rootPath)
fs.writeFile(
path.resolve(rootPath, 'sitemap.xml'),
xmlBefore + xmlItems + xmlAfter,
{ encoding: 'utf-8' },
callback
)
}
\ No newline at end of file
function parseHeader(tokens) {
tokens.forEach((t, i) => {
if (t.type === 'heading_open' && /h\d/.test(t.tag)) {
const token = tokens[i + 1]
const title = token.content
const res = title.match(/\s*(.+?)@(.+?)\s*$/)
if (res) {
token.content = res[1]
for (let i = 0, array = token.children, l = array.length; i < l; i++) {
const token = array[l - 1 - i]
if (token.type === 'text') {
const title = token.content
const res = title.match(/(.*)@.+/)
if (res) {
token.content = res[1]
break
}
}
}
}
}
})
return tokens
}
module.exports = md => {
md.parse = (function (mdParse) {
return function (src, ...array) {
return parseHeader(mdParse.bind(this)(src, ...array))
}
})(md.parse)
}
module.exports = function (md, opts) {
md.core.ruler.after('inline', 'image-attrs', function (state) {
state.tokens.forEach(function (blockToken) {
if (blockToken.type === 'html_block') {
replaceHTML(blockToken, addLoadingAttr, state.env);
}
if (blockToken.type === 'inline' && blockToken.children) {
blockToken.children.forEach(function (token) {
const type = token.type;
if (type === 'html_inline') {
replaceHTML(token, addLoadingAttr, state.env);
}
if (type === 'image') {
const src = token.attrGet('src');
if (!token.attrGet('loading') && matchSrc(src)) {
token.attrPush(['loading', 'lazy']);
}
}
});
}
});
return false;
});
};
/**
*
* @param {Record<string,any>} attribs
*/
function addLoadingAttr(attribs) {
if (matchSrc(attribs.src) && !attribs.loading) {
attribs.loading = 'lazy';
}
}
/**
*
* @param {string} [src] img src
* @returns
*/
function matchSrc(src) {
return typeof src === 'string'
? src.indexOf('qiniu-web-assets.dcloud.net.cn') > -1
: false;
}
function replaceNodes(nodes, replace, env, token) {
if (!nodes) return;
for (let i = 0; i < nodes.length; i++) {
const node = nodes[i];
if (node.attribs) {
if (node.name === 'img' && node.attribs.src) {
replace(node.attribs);
}
}
replaceNodes(node.children, replace, env, token);
}
}
function replaceHTML(token, replace, env) {
const htmlparser = require('htmlparser2');
const serializer = require('dom-serializer');
const dom = new htmlparser.parseDocument(token.content, {
recognizeCDATA: true,
recognizeSelfClosing: true,
});
replaceNodes(dom.children, replace, env, token);
token.content = serializer.render(dom, { encodeEntities: 'utf8' });
}
let cssJson = {};
let utsJson = {};
let utsApiJson = {};
let utsComJson = {};
let utsUnicloudApiJson = {};
let customTypeJson = {};
let vueJson = {};
let manifestJson = {};
let pagesJson = {};
let specialStringJson = {};
let pageInstanceJson = {};
try {
cssJson = require('../utils/cssJson.json');
} catch (error) {}
try {
utsJson = require('../utils/utsJson.json');
} catch (error) {}
try {
utsApiJson = require('../utils/utsApiJson.json');
} catch (error) {}
try {
utsComJson = require('../utils/utsComJson.json');
} catch (error) {}
try {
utsUnicloudApiJson = require('../utils/utsUnicloudApiJson.json');
} catch (error) {}
try {
customTypeJson = require('../utils/customTypeJson.json');
} catch (error) {}
try {
vueJson = require('../utils/vueJson.json');
} catch (error) {}
try {
manifestJson = require('../utils/manifestJson.json');
} catch (error) {}
try {
pagesJson = require('../utils/pagesJson.json');
} catch (error) {}
try {
specialStringJson = require('../utils/specialStringJson.json');
} catch (error) {}
try {
pageInstanceJson = require('../utils/pageInstanceJson.json');
} catch (error) {}
function getRegExp(key) {
return new RegExp(`<!--\\s*${key}.([\\w\\W]+[^\\s])\\s*-->`)
}
const getJSON = text => {
let match = text.match(getRegExp('CSSJSON'));
if (match) {
return {
match,
json: cssJson,
};
}
match = text.match(getRegExp('UTSJSON'));
if (match) {
return {
match,
json: utsJson,
};
}
match = text.match(getRegExp('UTSAPIJSON'));
if (match) {
return {
match,
json: utsApiJson,
};
}
match = text.match(getRegExp('UTSCOMJSON'));
if (match) {
return {
match,
json: utsComJson,
};
}
match = text.match(getRegExp('UTSUNICLOUDAPIJSON'));
if (match) {
return {
match,
json: utsUnicloudApiJson,
};
}
match = text.match(getRegExp('CUSTOMTYPEJSON'));
if (match) {
return {
match,
json: customTypeJson,
};
}
match = text.match(getRegExp('VUEJSON'));
if (match) {
return {
match,
json: vueJson,
};
}
match = text.match(getRegExp('MANIFESTJSON'));
if (match) {
return {
match,
json: manifestJson,
};
}
match = text.match(getRegExp('PAGESJSON'));
if (match) {
return {
match,
json: pagesJson,
};
}
match = text.match(getRegExp('SPECIALSTRINGJSON'));
if (match) {
return {
match,
json: specialStringJson,
};
}
match = text.match(getRegExp('PAGEINSTANCE'));
if (match) {
return {
match,
json: pageInstanceJson,
};
}
return {
match: null,
json: {},
};
};
module.exports = function (md, opts) {
if (Object.keys(cssJson) === 0) return false;
md.core.ruler.after('inline', 'merge-css', function (state) {
const ids = []
let idIdx = 1
for (let index = 0; index < state.tokens.length; index++) {
const blockToken = state.tokens[index];
if (blockToken.type === 'html_block') {
const { match, json } = getJSON(blockToken.content);
if (match) {
const jsonPath = match[1];
const path = jsonPath.split('.');
let temp = json;
path.forEach(key => {
if (!temp) return false;
temp = temp[key];
});
if (!temp) continue;
const parseTokens = md.parse(temp);
parseTokens.forEach(token => {
if (token.type === 'heading_open') {
const id = token.attrGet('id')
if(ids.includes(id)) {
token.attrSet('id', `${id}_${idIdx++}`)
} else {
ids.push(id)
}
}
})
state.tokens.splice(index, 1, ...parseTokens);
index = index + parseTokens.length - 1;
// blockToken.content = temp
}
}
}
return false;
});
};
const fs = require('fs')
const folderNames = []
fs.readdirSync('docs').forEach(item => {
fs.lstatSync(`docs/${item}`).isDirectory() && folderNames.push(item)
})
function isExternal(path) {
return /^[a-z]+:/i.test(path)
}
function normalizeLink(url) {
if (!url.startsWith('/') && folderNames.some(item => url.split('/')[0] === item)) {
return '/' + url
}
return url
}
module.exports = function (md) {
md.normalizeLink = (function (oldNormalizeLink) {
return function (url) {
url = isExternal(url)
? url
: normalizeLink(url)
.replace(/\.md\b/, '')
.replace(/\bREADME\b/, '')
.replace(/\/index/, '/')
.replace(/\?id=/, '#')
.replace(/\\/g, '/')
return oldNormalizeLink.bind(this)(url)
}
})(md.normalizeLink)
}
\ No newline at end of file
module.exports = md => {
md.parse = (function (mdParse) {
return function (src, ...array) {
return mdParse.bind(this)(src, ...array)
}
})(md.parse)
md.render = (function (mdRender) {
return function (src, ...array) {
return mdRender.bind(this)(src, ...array)
}
})(md.render)
}
mikuDelivery.initProxy('/miku-delivery-sw-1.2.1.js', {
/** appID 和 appSalt 由七牛配置提供*/
app: {
appID: 'r5v5l8yhuips0xwv',
appSalt: 'ejhqsncr0hrwcadkfrsh07n3p6wxt9q3'
},
/** 需要被代理的域名列表,域名需要提前在七牛创建完成,由七牛配置 ecdn 功能 */
domains: ['qiniu-web-assets.dcloud.net.cn'],
// debug: true
})
\ No newline at end of file
此差异已折叠。
此差异已折叠。
<?xml version="1.0" encoding="utf-8" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 20010904//EN" "http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd"><svg xmlns="http://www.w3.org/2000/svg" width="788" height="332" xmlns:xlink="http://www.w3.org/1999/xlink"><source><![CDATA[Created with Raphaël 2.1.2开发者开发者uni–open–bridgeuni–open–bridgeuni–open–bridge–commonuni–open–bridge–common微信服务器微信服务器Redis和数据库Redis和数据库服务器http定时请求(1小时)获取 access_token返回 access_tokenuniCloud引入公共模块]]></source><desc style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Created with Raphaël 2.1.2</desc><defs style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"><path stroke-linecap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block-obj454" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><marker id="raphael-marker-endblock55-obj455" markerHeight="5" markerWidth="5" orient="auto" refX="2.5" refY="2.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"><use xlink:href="#raphael-marker-block-obj454" transform="rotate(180 2.5 2.5) scale(1,1)" stroke-width="1.0000" fill="#000" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use></marker><path stroke-linecap="round" d="M6,1 1,3.5 6,6" id="raphael-marker-open-obj453" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><marker id="raphael-marker-endopen77-obj456" markerHeight="7" markerWidth="7" orient="auto" refX="4" refY="3.5" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"><use xlink:href="#raphael-marker-open-obj453" transform="rotate(180 3.5 3.5) scale(1,1)" stroke-width="1.0000" fill="none" stroke="#000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></use></marker></defs><rect x="10" y="20" width="68" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="20" y="30" width="48" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="44" y="38" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">开发者</tspan></text><rect x="10" y="276" width="68" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="20" y="286" width="48" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="44" y="294" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">开发者</tspan></text><path fill="none" stroke="#000000" d="M44,56L44,276" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="98" y="20" width="156" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="108" y="30" width="136" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="176" y="38" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">uni–open–bridge</tspan></text><rect x="98" y="276" width="156" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="108" y="286" width="136" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="176" y="294" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">uni–open–bridge</tspan></text><path fill="none" stroke="#000000" d="M176,56L176,276" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="274" y="20" width="220" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="284" y="30" width="200" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="384" y="38" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">uni–open–bridge–common</tspan></text><rect x="274" y="276" width="220" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="284" y="286" width="200" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="384" y="294" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">uni–open–bridge–common</tspan></text><path fill="none" stroke="#000000" d="M384,56L384,276" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="514" y="20" width="100" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="524" y="30" width="80" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="564" y="38" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">微信服务器</tspan></text><rect x="514" y="276" width="100" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="524" y="286" width="80" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="564" y="294" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">微信服务器</tspan></text><path fill="none" stroke="#000000" d="M564,56L564,276" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="634" y="20" width="124" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="644" y="30" width="104" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="696" y="38" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Redis和数据库</tspan></text><rect x="634" y="276" width="124" height="36" r="0" rx="0" ry="0" fill="none" stroke="#000000" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><rect x="644" y="286" width="104" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="696" y="294" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">Redis和数据库</tspan></text><path fill="none" stroke="#000000" d="M696,56L696,276" stroke-width="2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="70" y="73" width="80" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="110" y="81" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">服务器http</tspan></text><path fill="none" stroke="#000000" d="M44,92C44,92,146.93215203285217,92,171.0066153256921,92" stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj455)" stroke-dasharray="6,2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="220" y="109" width="120" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="280" y="117" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">定时请求(1小时)</tspan></text><path fill="none" stroke="#000000" d="M176,128C176,128,347.3347256183624,128,378.999859234842,128" stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj455)" stroke-dasharray="0" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="406" y="145" width="136" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="474" y="153" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">获取 access_token</tspan></text><path fill="none" stroke="#000000" d="M384,164C384,164,529.9265899658203,164,558.9979028105736,164" stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj455)" stroke-dasharray="0" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="406" y="181" width="136" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="474" y="189" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">返回 access_token</tspan></text><path fill="none" stroke="#000000" d="M564,200C564,200,405.63203716278076,200,385.9906980218366,200" stroke-width="2" marker-end="url(#raphael-marker-endopen77-obj456)" stroke-dasharray="6,2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="0" y="0" width="0" height="0" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="540" y="225" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="225" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></tspan></text><path fill="none" stroke="#000000" d="M384,220C384,220,667.435546875,220,694.0076293945312,220" stroke-width="2" marker-end="url(#raphael-marker-endopen77-obj456)" stroke-dasharray="0" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path><rect x="134" y="237" width="160" height="16" r="0" rx="0" ry="0" fill="#ffffff" stroke="none" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></rect><text x="214" y="245" text-anchor="middle" font="10px &quot;Arial&quot;" stroke="none" fill="#000000" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0); text-anchor: middle; font: 16px &quot;Andale Mono&quot;, monospace;" font-size="16px" font-family="Andale Mono, monospace"><tspan dy="6" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">uniCloud引入公共模块</tspan></text><path fill="none" stroke="#000000" d="M44,256C44,256,336.9430818557739,256,378.9964344268665,256" stroke-width="2" marker-end="url(#raphael-marker-endblock55-obj455)" stroke-dasharray="6,2" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);"></path></svg>
\ No newline at end of file
此差异已折叠。
此差异已折叠。
function isExternal(path) {
return /^[a-z]+:/i.test(path)
}
function simplifySlugText(text) {
// 移除方法后面的括号及里面的内容
if (text.match(/^uni/) && text.match(/\)$/)) {
text = text.replace(/^uni/, '').replace(/\(.*\)$/, '');
}
// 处理部分非uni开头方法的括号内容,主要是会出现多参数的情况。
if (text.match(/\([\w+\s+\[\],]+\)$/)) {
text = text.replace(/\([\w+\s+\[\],]+\)$/, '');
}
return text;
}
function getFormattedDate() {
const now = new Date();
const year = now.getFullYear();
const month = (now.getMonth() + 1).toString().padStart(2, '0');
const day = now.getDate().toString().padStart(2, '0');
const hours = now.getHours().toString().padStart(2, '0');
const minutes = now.getMinutes().toString().padStart(2, '0');
const seconds = now.getSeconds().toString().padStart(2, '0');
const formattedDate = `${year}-${month}-${day}_${hours}-${minutes}-${seconds}`;
return formattedDate;
}
// 顺序有要求,会影响 for 循环匹配侧边栏
const tabs = [
'/'
]
module.exports = {
isExternal,
simplifySlugText,
getFormattedDate,
tabs: process.env.DOCS_LITE ? [] : tabs
}
\ No newline at end of file
{"manifest":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| appid | string | - | [DCloud AppID 使用说明](https://ask.dcloud.net.cn/article/35907) |\n| name | string | - | 应用名称 |\n| description | string | - | 应用描述 |\n| versionName | string | - | 应用版本名称 |\n| versionCode | integer | - | 应用版本号,必须是整数,取值范围1~2147483647;升级时必须高于上一次设置的值。 |\n| locale | '' | - | 默认语言 |\n| fallbackLocale | '' | - | 默认回退语言 |\n| uni-app-x | [uni-app-x 配置项列表](#manifest-uni-app-x) | - | 存在uni-app-x节点则表示为uni-app x项目 |\n| app | [app 配置项列表](#manifest-app) | - | App端(原生App)配置 |","description":"[配置指南](http://uniapp.dcloud.io/manifest)"},"manifest_uni-app-x":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| flex-direction | 'row' \\| 'row-reverse' \\| 'column' \\| 'column-reverse' | column | uvue页面默认flex排列方向 |","description":"存在uni-app-x节点则表示为uni-app x项目"},"manifest_app":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| distribute | [distribute 配置项列表](#app-distribute) | - | App端发布配置 |","description":"App端(原生App)配置"},"app_distribute":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| syncDebug | boolean | - | 是否为自定义调试基座 |\n| icons | [icons 配置项列表](#distribute-icons) | - | iOS、Android应用图标配置。云打包后生效,建议在HBuilderX中 manifest.json 的可视化界面操作,不推荐手动在源码视图中修改。 |\n| android | [android 配置项列表](#distribute-android) | - | App-Android端发布配置 |\n| ios | [ios 配置项列表](#distribute-ios) | - | IOS配置 |","description":"App端发布配置"},"distribute_icons":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| android | [android 配置项列表](#icons-android) | - | Android图标配置 |\n| ios | [ios 配置项列表](#icons-ios) | - | iOS图标配置 |","description":"iOS、Android应用图标配置。云打包后生效,建议在HBuilderX中 manifest.json 的可视化界面操作,不推荐手动在源码视图中修改。"},"icons_android":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| hdpi | string | - | 高分屏设备程序图标,分辨率要求72x72 |\n| xhdpi | string | - | 720P高分屏设备程序图标,分辨率要求96x96 |\n| xxhdpi | string | - | 1080P高分屏设备程序图标,分辨率要求144x144 |\n| xxxhdpi | string | - | 2K屏设备程序图标,分辨率要求192x192 |"},"icons_ios":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| appstore | string | - | 提交app store使用的图标 1024x1024 |\n| iphone | [iphone 配置项列表](#ios-iphone) | - | iPhone图标配置 |\n| ipad | [ipad 配置项列表](#ios-ipad) | - | iPad图标配置 |"},"ios_iphone":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| app@2x | string | - | iOS9.0+ 程序图标(2x) |\n| app@3x | string | - | iOS9.0+ 程序图标(3x) |\n| spotlight@2x | string | - | iOS9.0+ Spotlight图标(2x) |\n| spotlight@3x | string | - | iOS9.0+ Spotlight图标(3x) |\n| settings@2x | string | - | iOS9.0+ Settings设置图标(2x) |\n| settings@3x | string | - | iOS9.0+ Settings设置图标(3x) |\n| notification@2x | string | - | iOS9.0+ 通知栏图标(2x) |\n| notification@3x | string | - | iOS9.0+ 通知栏图标(3x) |"},"ios_ipad":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| app | string | - | iOS9.0+ 程序图标 |\n| app@2x | string | - | iOS9.0+ 程序图标(2x) |\n| proapp@2x | string | - | iOS9.0+ 程序图标(3x) |\n| spotlight | string | - | iOS9.0+ Spotlight图标 |\n| spotlight@2x | string | - | iOS9.0+ Spotlight图标(2x) |\n| settings | string | - | iOS9.0+ Settings设置图标 |\n| settings@2x | string | - | iOS9.0+ Settings设置图标(2x) |\n| notification | string | - | iOS9.0+ 通知栏图标 |\n| notification@2x | string | - | iOS9.0+ 通知栏图标(2x) |"},"distribute_android":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| minSdkVersion | integer | 21 | 应用兼容的最低Android版本(API等级);[参考文档](https://uniapp.dcloud.io/tutorial/app-android-minsdkversion) |\n| targetSdkVersion | integer | 30 | 应用适配的目标Android版本(API等级),部分应用市场要求设置较高的targetSdkVersion才能提交审核;[参考文档](https://uniapp.dcloud.io/tutorial/app-android-targetsdkversion) |\n| abiFilters | Array\\<'armeabi-v7a' \\| 'arm64-v8a' \\| 'x86' \\| 'x86_64'> | [\"arm64-v8a\"\\] | [参考文档](https://uniapp.dcloud.io/tutorial/app-android-abifilters) |","description":"App-Android端发布配置"},"distribute_ios":{"table":"| 属性 | 类型 | 默认值 | 描述 |\n| :- | :- | :- | :- |\n| appid | string | - | iOS Bundle ID |"},"tutorial":"## 参见\n[相关 Bug](https://issues.dcloud.net.cn/?mid=collocation.manifest_json)"}
\ No newline at end of file
{"lifeCycle":{"name":"页面生命周期","compatibility":"| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| onInit | x | x | x | x | x | x |\n| onLoad | 5.0 | √ | √ | 10.0 | √ | x |\n| onShow | 5.0 | √ | √ | 10.0 | √ | x |\n| onReady | 5.0 | √ | √ | 10.0 | √ | x |\n| onHide | 5.0 | √ | √ | 10.0 | √ | x |\n| onUnload | 5.0 | √ | √ | 10.0 | √ | x |\n| onPullDownRefresh | 5.0 | √ | √ | 10.0 | √ | x |\n| onReachBottom | 5.0 | √ | √ | 10.0 | √ | x |\n| onShareAppMessage | x | x | x | x | x | x |\n| onShareTimeline | x | x | x | x | x | x |\n| onAddToFavorites | x | x | x | x | x | x |\n| onPageScroll | 5.0 | √ | √ | 10.0 | √ | x |\n| onResize | 5.0 | √ | √ | 10.0 | √ | x |\n| onTabItemTap | 5.0 | √ | x | 10.0 | √ | x |\n| onNavigationBarButtonTap | 5.0 | √ | x | 10.0 | √ | x |\n| onBackPress | 5.0 | √ | √ | 10.0 | √ | x |\n| onNavigationBarSearchInputChanged | 5.0 | √ | x | 10.0 | √ | x |\n| onNavigationBarSearchInputConfirmed | 5.0 | √ | x | 10.0 | √ | x |\n| onNavigationBarSearchInputClicked | 5.0 | √ | x | 10.0 | √ | x |"}}
\ No newline at end of file
{"pages":{"compatibility":"**pages.json 兼容性** \n| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| globalStyle | 5.0 | √ | √ | 10.0 | √ | x |\n| pages | 5.0 | √ | √ | 10.0 | √ | x |\n| tabBar | 5.0 | √ | √ | 10.0 | √ | x |\n| condition | 5.0 | √ | √ | 10.0 | √ | x |\n| easycom | 5.0 | 2.5.5+ | √ | 10.0 | 2.5.5+ | x |","table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| globalStyle | [globalStyle 配置项列表](#pages-globalstyle) | - | 否 | - |\n| pages | Array\\<[PagesOptionsPage](#pagesoptionspage)> | - | 是 | 页面路径及窗口表现 |\n| tabBar | [tabBar 配置项列表](#pages-tabbar) | - | 否 | - |\n| condition | [condition 配置项列表](#pages-condition) | - | 否 | - |\n| easycom | [easycom 配置项列表](#pages-easycom) | - | 否 | 组件自动引入规则 |"},"pages_globalStyle":{"compatibility":"**globalStyle 兼容性** \n| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| navigationBarBackgroundColor | 5.0 | √ | √ | 10.0 | √ | x |\n| navigationBarTextStyle | 5.0 | √ | √ | 10.0 | √ | x |\n| navigationBarTitleText | 5.0 | √ | √ | 10.0 | √ | x |\n| navigationStyle | 5.0 | 2.0.3+ | √ | 10.0 | 2.0.3+ | x |\n| enablePullDownRefresh | 5.0 | √ | √ | 10.0 | √ | x |","table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| navigationBarBackgroundColor | string (string.ColorString) | APP与H5为#F8F8F8,小程序平台请参考相应小程序文档 | 否 | 导航栏背景颜色(同状态栏背景色) |\n| navigationBarTextStyle | 'white' \\| 'black' | black | 否 | 导航栏标题颜色,仅支持 black/white(支付宝小程序不支持,请使用 [my.setNavigationBar](https://opendocs.alipay.com/mini/api/xwq8e6))。 |\n| navigationBarTitleText | string | - | 否 | 导航栏标题文字内容 |\n| navigationStyle | 'default' \\| 'custom' | default | 否 | 导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages.md?id=customnav)。 |\n| enablePullDownRefresh | boolean | false | 否 | 是否开启下拉刷新,详见[页面生命周期](/tutorial/page.md?id=lifecycle)。 |"},"PagesOptionsPage":{"compatibility":"**PagesOptionsPage 兼容性** \n| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| path | 5.0 | √ | √ | 10.0 | √ | x |\n| style | 5.0 | √ | √ | 10.0 | √ | x |","table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| path | string (string.PageURIString) | - | 是 | 配置页面路径 |\n| style | [style 配置项列表](#pagesoptionspage-style) | - | 否 | - |"},"PagesOptionsPage_style":{"compatibility":"**style 兼容性** \n| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| navigationBarBackgroundColor | 5.0 | √ | √ | 10.0 | √ | x |\n| navigationBarTextStyle | 5.0 | √ | √ | 10.0 | √ | x |\n| navigationBarTitleText | 5.0 | √ | √ | 10.0 | √ | x |\n| navigationStyle | 5.0 | 2.0.3+ | √ | 10.0 | 2.0.3+ | x |\n| enablePullDownRefresh | 5.0 | √ | √ | 10.0 | √ | x |","table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| navigationBarBackgroundColor | string (string.ColorString) | APP与H5为#F8F8F8,小程序平台请参考相应小程序文档 | 否 | 导航栏背景颜色(同状态栏背景色) |\n| navigationBarTextStyle | 'white' \\| 'black' | black | 否 | 导航栏标题颜色,仅支持 black/white |\n| navigationBarTitleText | string | - | 否 | 导航栏标题文字内容 |\n| navigationStyle | 'default' \\| 'custom' | default | 否 | 导航栏样式,仅支持 default/custom。custom即取消默认的原生导航栏,需看[使用注意](/collocation/pages.md?id=customnav)。 |\n| enablePullDownRefresh | boolean | false | 否 | 是否开启下拉刷新,详见[页面生命周期](/tutorial/page.md#lifecycle)。 |\n| h5 | [h5 配置项列表](#style-h5) | - | 否 | - |\n| mp-alipay | [mp-alipay 配置项列表](#style-mp-alipay) | - | 否 | - |"},"style_h5":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| titleNView | [titleNView 配置项列表](#h5-titlenview) | - | 否 | - |\n| pullToRefresh | [pullToRefresh 配置项列表](#h5-pulltorefresh) | - | 否 | - |"},"h5_titleNView":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| backgroundColor | string (string.ColorString) | #f7f7f7 | 否 | 背景颜色,颜色值格式为\"#RRGGBB\"。 |\n| buttons | array | - | 否 | 自定义按钮,参考 [buttons](/collocation/pages.md?id=h5-titlenview-buttons)。 |\n| titleColor | string (string.ColorString) | #000000 | 否 | 标题文字颜色 |\n| titleText | string | - | 否 | 标题文字内容 |\n| titleSize | string | - | 否 | 标题文字字体大小 |\n| type | 'default' \\| 'transparent' | default | 否 | 导航栏样式。\"default\"-默认样式;\"transparent\"-透明渐变。 |\n| searchInput | object | - | 否 | 导航栏上的搜索框样式,详见:[searchInput](/collocation/pages.md?id=h5-searchinput)。 |"},"h5_pullToRefresh":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| support | boolean | - | 否 | 是否开启窗口的下拉刷新功能 |\n| color | string (string.ColorString) | - | 否 | 颜色值格式为\"#RRGGBB\",仅\"circle\"样式下拉刷新支持此属性。 |\n| type | 'default' \\| 'circle' | - | 否 | 下拉刷新控件样式 |\n| height | string | - | 否 | 窗口的下拉刷新控件进入刷新状态的拉拽高度。支持百分比,如\"10%\";像素值,如\"50px\"。 |\n| range | string | - | 否 | 窗口可下拉拖拽的范围。支持百分比,如\"10%\";像素值,如\"50px\"。 |\n| offset | string | - | 否 | 下拉刷新控件的起始位置。仅对\"circle\"样式下拉刷新控件有效,用于定义刷新控件下拉时的起始位置。支持百分比,如\"10%\";像素值,如\"50px\"。 |\n| contentdown | [contentdown 配置项列表](#pulltorefresh-contentdown) | - | 否 | - |\n| contentover | [contentover 配置项列表](#pulltorefresh-contentover) | - | 否 | - |\n| contentrefresh | [contentrefresh 配置项列表](#pulltorefresh-contentrefresh) | - | 否 | - |"},"pullToRefresh_contentdown":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| caption | string | - | 否 | 下拉刷新控件上显示的标题内容 |"},"pullToRefresh_contentover":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| caption | string | - | 否 | 下拉刷新控件上显示的标题内容 |"},"pullToRefresh_contentrefresh":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| caption | string | - | 否 | 下拉刷新控件上显示的标题内容 |"},"style_mp-alipay":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| allowsBounceVertical | 'YES' \\| 'NO' | YES | 否 | 是否允许向下拉拽。支持 YES / NO |\n| transparentTitle | 'always' \\| 'auto' \\| 'none' | none | 否 | 导航栏透明设置。支持 always 一直透明 / auto 滑动自适应 / none 不透明 |\n| titlePenetrate | 'YES' \\| 'NO' | No | 否 | 导航栏点击穿透 |\n| showTitleLoading | 'YES' \\| 'NO' | No | 否 | 是否进入时显示导航栏的 loading。支持 YES / NO |\n| titleImage | string | - | 否 | 导航栏图片地址,替换导航栏标题,必须为https的图片链接地址 |\n| backgroundImageUrl | string (string.ImageURIString) | - | 否 | 下拉露出显示的背景图链接 |\n| backgroundImageColor | string (string.ColorString) | - | 否 | 下拉露出显示的背景图底色 |\n| gestureBack | 'YES' \\| 'NO' | No | 否 | 支付宝小程序 iOS 用,是否支持手势返回。支持 YES / NO |\n| enableScrollBar | 'YES' \\| 'NO' | YES | 否 | 支付宝小程序 Android 用,是否显示 WebView 滚动条。支持 YES / NO。 |"},"pages_tabBar":{"compatibility":"**tabBar 兼容性** \n| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| color | 5.0 | √ | √ | 10.0 | √ | x |\n| selectedColor | 5.0 | √ | √ | 10.0 | √ | x |\n| backgroundColor | 5.0 | √ | √ | 10.0 | √ | x |\n| list | 5.0 | √ | √ | 10.0 | √ | x |\n| backgroundImage | 5.0 | √ | √ | 10.0 | √ | x |\n| backgroundRepeat | 5.0 | √ | √ | 10.0 | √ | x |\n| redDotColor | 5.0 | √ | √ | 10.0 | √ | x |","table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| color | string (string.ColorString) | - | 是 | tab 上的文字默认颜色 |\n| selectedColor | string (string.ColorString) | - | 是 | tab 上的文字选中时的颜色 |\n| backgroundColor | string (string.ColorString) | - | 是 | tab 的背景色 |\n| list | Array\\<[PagesOptionsTabbarList](#pagesoptionstabbarlist)> | - | 是 | tab 的列表,详见 list 属性说明,最少2个、最多5个 tab |\n| backgroundImage | string | - | 否 | 设置背景图片,优先级高于 backgroundColor |\n| backgroundRepeat | 'repeat' \\| 'repeat-x' \\| 'repeat-y' \\| 'no-repeat' | no-repeat | 否 | 设置标题栏的背景图平铺方式 |\n| redDotColor | string (string.ColorString) | - | 否 | tabbar上红点颜色 |"},"PagesOptionsTabbarList":{"compatibility":"**PagesOptionsTabbarList 兼容性** \n| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| iconfont | 5.0 | 3.4.4+ | √ | 10.0 | 3.4.4+ | x |\n| pagePath | 5.0 | √ | √ | 10.0 | √ | x |\n| text | 5.0 | √ | √ | 10.0 | √ | x |\n| iconPath | 5.0 | √ | √ | 10.0 | √ | x |\n| selectedIconPath | 5.0 | √ | √ | 10.0 | √ | x |\n| visible | 5.0 | 3.2.10+ | √ | 10.0 | 3.2.10+ | x |","table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| iconfont | [iconfont 配置项列表](#pagesoptionstabbarlist-iconfont) | - | 否 | 字体图标,优先级高于 iconPath |\n| pagePath | string (string.PageURIString) | - | 是 | 页面路径,必须在 pages 中先定义 |\n| text | string | - | 是 | tab 上按钮文字,在 App 和 H5 平台为非必填。例如中间可放一个没有文字的+号图标 |\n| iconPath | string (string.ImageURIString) | - | 否 | 图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px,当 position 为 top 时,此参数无效,不支持网络图片,不支持字体图标 |\n| selectedIconPath | string (string.ImageURIString) | - | 否 | 选中时的图片路径,icon 大小限制为40kb,建议尺寸为 81px * 81px ,当 position 为 top 时,此参数无效 |\n| visible | string | - | 否 | 该项是否显示,默认显示 |"},"PagesOptionsTabbarList_iconfont":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| text | string | - | 否 | 字库 Unicode 码 |\n| selectedText | string | - | 否 | 选中后字库 Unicode 码 |\n| fontSize | string | - | 否 | 字体图标字号(px) |\n| color | string (string.ColorString) | - | 否 | 字体图标颜色 |\n| selectedColor | string (string.ColorString) | - | 否 | 字体图标选中颜色 |","description":"字体图标,优先级高于 iconPath"},"pages_condition":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| current | number | - | 是 | 当前激活的模式,list节点的索引值。 |\n| list | Array\\<[PagesConditionItem](#pagesconditionitem)> | - | 是 | 启动模式列表 |"},"PagesConditionItem":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| name | string | - | 是 | 启动模式名称 |\n| path | string (string.PageURIString) | - | 是 | 启动页面路径 |\n| query | string | - | 否 | 启动参数,可在页面的 onLoad 函数里获得 |"},"pages_easycom":{"table":"| 属性 | 类型 | 默认值 | 必填 | 描述 |\n| :- | :- | :- | :- | :- |\n| autoscan | boolean | true | 否 | 是否开启自动扫描,开启后将会自动扫描符合components/组件名称/组件名称.vue/uvue目录结构的组件 |\n| custom | object | - | 否 | 以正则方式自定义组件匹配规则。如果autoscan不能满足需求,可以使用custom自定义匹配规则 |","description":"组件自动引入规则"},"tutorial":"## 参见\n[相关 Bug](https://issues.dcloud.net.cn/?mid=collocation.pages_json)"}
\ No newline at end of file
{"specialString":{"name":"### 特殊 String @special-string","table":"| 名称 | 描述 |\n| :- | :- |\n| AttrString | 元素上的属性 |\n| AttrValueString | 元素上某个属性的值 |\n| ClassString | 元素全局属性`class`的值 |\n| IDString | 元素全局属性`id`的值 |\n| HTMLEventString | 元素上的事件 |\n| ColorString | CSS颜色的值 |\n| RequireCommonString | 提示common模块 以及js文件路径 |\n| VueI18NKeyString | 国际化翻译的key值 |\n| VueDataString | vue默认参数data中的属性名称 |\n| VueRefString | vue组件中ref属性的值 |\n| VuexDispatchString | vuex 中 actions 的名称 |\n| VuexCommitString | vuex 中 mutations 的名称 |\n| PageURIString | vue, nvue, uvue页面文件的文件路径(根据项目自动匹配) |\n| NPageURIString | nvue页面文件的文件路径 |\n| UPageURIString | uvue页面文件的文件路径, 仅在uniappx中生效 |\n| VideoIdString | video 组件的 id, 仅在uniappx中生效 |\n| WebviewIdString | web-view 组件的 id, 仅在uniappx中生效 |\n| ParentFieldString | uniCloud db schema中parentKey的值 |\n| SchemaFieldString | uniCloud db schema中required数组的值 |\n| ValidateFunctionString | uniCloud db schema中validateFunction的值 |\n| CloudFunctionString | uniCloud 云函数名 |\n| CloudObjectString | uniCloud 云对象名 |\n| DBCollectionString | uniCloud 数据库集合的名称 |\n| DBFieldString | uniCloud 数据库字段名称 |\n| JQLString | uniCloud 数据库要操作的集合, 要查询的字段 |\n| cssPropertyString | CSS属性的名称 |\n| cssPropertyValueString | CSS某个属性的值 |\n| cssSelectorString | CSS选择器的名称 |\n| URIString | 任意文件的文件路径 |\n| CSSURIString | css文件的文件路径(后缀为`.css`的文件路径) |\n| JSURIString | js文件的文件路径(后缀为`.js`的文件路径) |\n| HTMLURIString | html文件的文件路径(后缀为`.html`的文件路径) |\n| MarkdownURIString | markdown文件的文件路径(后缀为`.md`的文件路径) |\n| ScriptImportURIString | js, ts, uts引用文件或模块的文件路径(支持vue,nvue,uvue中script标签内容), 例: `import xxx from 'xxx'` |\n| CssImportURIString | css文件可以引用的文件的文件路径, 后缀为`[\".css\"\\]`的文件路径 例: `@import url('xxx.css')` |\n| ScssImportURIString | scss文件可以引用的文件的文件路径, 后缀为`[\".scss\", \".css\"\\]`的文件路径, 例: `@import 'xxx.scss'` |\n| LessImportURIString | less文件可以引用的文件的文件路径, 后缀为`[\".less\", \".css\"\\]`的文件路径, 例: `@import 'xxx.less'` |\n| FontURIString | 字体文件的文件路径 |\n| ImageURIString | 图片文件的文件路径 |\n| AudioURIString | 音频文件的文件路径 |\n| VideoURIString | 视频文件的文件路径 |"}}
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
{
"application": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| app.component() | 5.0 | √ | √ | 10.0 | √ | x |\n| app.directive() | 5.0 | √ | x | 10.0 | √ | x |\n| app.use() | 5.0 | √ | x | 10.0 | √ | x |\n| app.mixin() | 5.0 | √ | x | 10.0 | √ | x |\n| app.provide() | 5.0 | √ | x | 10.0 | √ | x |\n| app.config | 5.0 | √ | √ | 10.0 | √ | x |\n| app.config.errorHandler | 5.0 | √ | x | 10.0 | √ | x |\n| app.config.warnHandler | 5.0 | √ | x | 10.0 | √ | x |\n| app.config.performance | 5.0 | √ | x | 10.0 | √ | x |\n| app.config.globalProperties | 5.0 | √ | x | 10.0 | √ | x |\n| app.config.optionMergeStrategies | 5.0 | √ | x | 10.0 | √ | x |"
},
"general": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| nextTick() | 5.0 | x | √ | 10.0 | x | x |\n| defineComponent() | 5.0 | x | x | 10.0 | x | x |\n| defineAsyncComponent() | 5.0 | x | x | 10.0 | x | x |"
},
"reactivity_core": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| ref() | 5.0 | √ | √ | 10.0 | √ | x |\n| computed() | 5.0 | √ | x | 10.0 | √ | x |\n| reactive() | 5.0 | √ | √ | 10.0 | √ | x |\n| readonly() | 5.0 | √ | x | 10.0 | √ | x |\n| watchEffect() | 5.0 | √ | x | 10.0 | √ | x |\n| watch() | 5.0 | √ | x | 10.0 | √ | x |"
},
"reactivity_utilities": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| isRef() | 5.0 | √ | x | 10.0 | √ | x |\n| unref() | 5.0 | √ | x | 10.0 | √ | x |\n| toRef() | 5.0 | √ | x | 10.0 | √ | x |\n| toRefs() | 5.0 | √ | x | 10.0 | √ | x |\n| isProxy() | 5.0 | √ | x | 10.0 | √ | x |\n| isReactive() | 5.0 | √ | x | 10.0 | √ | x |\n| isReadonly() | 5.0 | √ | x | 10.0 | √ | x |"
},
"reactivity_advanced": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| shallowRef() | 5.0 | √ | x | 10.0 | √ | x |\n| triggerRef() | 5.0 | √ | x | 10.0 | √ | x |\n| customRef() | 5.0 | √ | x | 10.0 | √ | x |\n| shallowReactive() | 5.0 | √ | x | 10.0 | √ | x |\n| shallowReadonly() | 5.0 | √ | x | 10.0 | √ | x |\n| toRaw() | 5.0 | √ | x | 10.0 | √ | x |\n| markRaw() | 5.0 | √ | x | 10.0 | √ | x |"
},
"options_state": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| data | 5.0 | √ | √ | 10.0 | √ | x |\n| props | 5.0 | √ | √ | 10.0 | √ | x |\n| computed | 5.0 | √ | √ | 10.0 | √ | x |\n| methods | 5.0 | √ | √ | 10.0 | √ | x |\n| watch | 5.0 | √ | √ | 10.0 | √ | x |\n| emits | 5.0 | √ | √ | 10.0 | √ | x |"
},
"options_rendering": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| template | 5.0 | x | x | 10.0 | x | x |\n| render | 5.0 | x | x | 10.0 | x | x |"
},
"options_lifecycle": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| beforeCreate | 5.0 | √ | √ | 10.0 | √ | x |\n| created | 5.0 | √ | √ | 10.0 | √ | x |\n| beforeMount | 5.0 | √ | √ | 10.0 | √ | x |\n| mounted | 5.0 | √ | √ | 10.0 | √ | x |\n| beforeUpdate | 5.0 | √ | √ | 10.0 | √ | x |\n| updated | 5.0 | √ | √ | 10.0 | √ | x |\n| beforeUnmount | 5.0 | √ | √ | 10.0 | √ | x |\n| unmounted | 5.0 | √ | √ | 10.0 | √ | x |\n| errorCaptured | 5.0 | √ | x | 10.0 | √ | x |\n| renderTracked | 5.0 | √ | x | 10.0 | √ | x |\n| renderTriggered | 5.0 | √ | x | 10.0 | √ | x |\n| activated | 5.0 | √ | x | 10.0 | √ | x |\n| deactivated | 5.0 | √ | x | 10.0 | √ | x |"
},
"options_composition": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| provide | 5.0 | √ | x | 10.0 | √ | x |\n| inject | 5.0 | √ | x | 10.0 | √ | x |\n| mixins | 5.0 | √ | x | 10.0 | √ | x |\n| extends | 5.0 | √ | x | 10.0 | √ | x |"
},
"options_misc": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| name | 5.0 | √ | √ | 10.0 | √ | x |\n| inheritAttrs | 5.0 | √ | √ | 10.0 | √ | x |\n| components | 5.0 | √ | √ | 10.0 | √ | x |\n| directives | 5.0 | √ | x | 10.0 | √ | x |"
},
"component_instance": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| $data | 5.0 | √ | √ | 10.0 | √ | x |\n| $props | 5.0 | √ | √ | 10.0 | √ | x |\n| $el | 5.0 | x | √ | 10.0 | x | x |\n| $options | 5.0 | √ | √ | 10.0 | √ | x |\n| $parent | 5.0 | √ | √ | 10.0 | √ | x |\n| $root | 5.0 | √ | √ | 10.0 | √ | x |\n| $slots | 5.0 | x | √ | 10.0 | √ | x |\n| $refs | 5.0 | √ | √ | 10.0 | √ | x |\n| $attrs | 5.0 | √ | √ | 10.0 | √ | x |\n| $watch() | 5.0 | √ | √ | 10.0 | √ | x |\n| $emit | 5.0 | √ | √ | 10.0 | √ | x |\n| $forceUpdate | 5.0 | √ | x | 10.0 | √ | x |\n| $nextTick | 5.0 | √ | √ | 10.0 | √ | x |\n| $callMethod | 5.0 | x | √ | 10.0 | x | x |"
},
"directives": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| v-text | 5.0 | √ | √ | 10.0 | √ | x |\n| v-html | 5.0 | √ | x | 10.0 | √ | x |\n| v-show | 5.0 | √ | √ | 10.0 | √ | x |\n| v-if | 5.0 | √ | √ | 10.0 | √ | x |\n| v-else | 5.0 | √ | √ | 10.0 | √ | x |\n| v-else-if | 5.0 | √ | √ | 10.0 | √ | x |\n| v-for | 5.0 | √ | √ | 10.0 | √ | x |\n| v-on | 5.0 | √ | √ | 10.0 | √ | x |\n| v-bind | 5.0 | √ | √ | 10.0 | √ | x |\n| v-model | 5.0 | √ | √ | 10.0 | √ | x |\n| v-slot | 5.0 | √ | √ | 10.0 | √ | x |\n| v-pre | 5.0 | √ | x | 10.0 | √ | x |\n| v-once | 5.0 | √ | x | 10.0 | √ | x |\n| v-memo | 5.0 | x | x | 10.0 | x | x |\n| v-cloak | 5.0 | x | x | 10.0 | x | x |"
},
"components": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| \\<Transition> | 5.0 | x | x | 10.0 | x | x |\n| \\<TransitionGroup> | 5.0 | x | x | 10.0 | x | x |\n| \\<KeepAlive> | 5.0 | x | x | 10.0 | x | x |\n| \\<Teleport> | 5.0 | x | x | 10.0 | x | x |"
},
"special_elements": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| \\<component> | 5.0 | √ | x | 10.0 | √ | x |\n| \\<slot> | 5.0 | √ | √ | 10.0 | √ | x |\n| \\<template> | 5.0 | √ | √ | 10.0 | √ | x |"
},
"special_attributes": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| key | 5.0 | √ | √ | 10.0 | √ | x |\n| ref | 5.0 | √ | √ | 10.0 | √ | x |\n| is | 5.0 | √ | x | 10.0 | √ | x |"
},
"render_function": {
"compatibility": "| | 安卓系统版本 | 安卓 uni-app | 安卓 uni-app-x | iOS 系统版本 | iOS uni-app | iOS uni-app-x |\n| :- | :- | :- | :- | :- | :- | :- |\n| h() | 5.0 | x | x | 10.0 | x | x |\n| resolveComponent() | 5.0 | x | √ | 10.0 | x | x |\n| resolveDirective() | 5.0 | x | x | 10.0 | x | x |\n| withDirectives() | 5.0 | x | √ | 10.0 | x | x |"
}
}
\ No newline at end of file
此差异已折叠。
* [什么是uniCloud](README.md)
* [快速上手](quickstart.md)
* [免费版和商用版](price.md)
* 基本概念
* [服务空间](concepts/space.md)
* [数据库](concepts/database.md)
* [云函数/云对象](concepts/cloudfunction.md)
* 云函数/云对象
* [综述](cf-functions.md)
* [云对象](cloud-obj.md)
* [普通云函数(callFunction)](cf-callfunction.md)
* [云公共模块](cf-common.md)
* [定时触发](trigger.md)
* [云函数URL化](http.md)
* [IP防刷](ip-filter.md)
* [安全网络](secure-network.md)
* [云函数请求中的中间状态通知通道](sse-channel.md)
* 云数据库
* [云数据库入门](hellodb.md)
* [DB Schema表结构](schema.md)
* [DB Schema扩展(数据库触发器)](jql-schema-ext.md)
* [openDB](opendb)
* [数据库索引](db-index.md)
* [JQL语法](jql.md)
* [客户端通过JQL操作数据库](clientdb.md)
* [unicloud-db前端组件](unicloud-db.md)
* [云函数通过JQL操作数据库](jql-cloud.md)
* [JQL调试器](jql-runner.md)
* [schema2code自动生成代码](schema2code.md)
* [性能优化](db-performance.md)
* [缓存JQL查询到redis](jql-cache-redis.md)
* [JQL常用运算方法](jql-operator-example.md)
* [云函数通过传统方式操作数据库](cf-database.md)
* [获取集合的引用](cf-database.md?id=get-collection)
* [新增文档](cf-database.md?id=add)
* [查询文档](cf-database.md?id=query)
* [删除文档](cf-database.md?id=remove)
* [更新文档](cf-database.md?id=update)
* [GEO地理位置](cf-database.md?id=geo)
* [事务](cf-database.md?id=transaction)
* [聚合操作](cf-database-aggregate.md)
* [数据库操作符](cf-database-dbcmd.md)
* [数据库运算方法](cf-database-aggregate-operator.md)
* 云存储
* [云存储API](storage.md)
* [腾讯云自定义登录](authentication.md)
* [腾讯云权限管理](policy-tcb.md)
* [阿里云CDN安全策略](cdn-security-policy.md)
* uni-id用户体系
* [综述](./uni-id/summary.md)
* [客户端-uni-app](./uni-id/app.md)
* [客户端-uni-app x](./uni-id/app-x.md)
* [云对象](./uni-id/cloud-object.md)
* [uni-id-common](./uni-id/cloud-common.md)
* [老版uni-id 3.x文档](./uni-id/old.md)
* uni手机号一键登录
* [费用说明](uni-login/price.md)
* [开通服务](uni-login/service.md)
* [开发文档](uni-login/dev.md)
* uni实人认证
* [简介](frv/intro.md)
* [费用说明](frv/price.md)
* [开通服务](frv/service.md)
* [开发文档](frv/dev.md)
* 短信服务
* [费用说明](sms/price.md)
* [开通服务](sms/service.md)
* [开发文档](sms/dev.md)
* uni-ai
* [简介](uni-ai-intro.md)
* [开发文档](uni-ai.md)
* [计费网关](uni-ai-buy.md)
* Redis扩展库
* [简介](redis-introduction.md)
* [费用说明](redis-buy.md)
* [开发文档](redis.md)
* Push扩展库(socket)
* [业务文档](https://uniapp.dcloud.net.cn/unipush-v2.html)
* 开发文档
* [服务端api](uni-cloud-push/api.md)
* [uni-app客户端api](https://uniapp.dcloud.net.cn/api/plugins/push.md)
* [uni-app x客户端api](https://uniapp.dcloud.net.cn/uni-app-x/api/push.html)
* [uni-push、uni-id、uni统计的协作](uni-cloud-push/mate.md)
* [扩展参数](uni-cloud-push/options.md)
* [运行与调试](rundebug.md)
<!-- * [日志输出](cf-logger.md) -->
* [发行](publish.md)
* [前端网页托管](hosting.md)
* [客户端API](client-sdk.md)
* [系统错误码](system-error.md)
* [web控制台](https://unicloud.dcloud.net.cn)
* 重要开源库```{"collapsable": false}```
* [uni-config-center 配置中心](uni-config-center.md)
* [uni-starter](uni-starter.md)
* [uni-admin](admin.md)
* [uni-upgrade-center App升级中心](upgrade-center.md)
* uni-pay 统一支付```{"collapsable": true}```
* * [uni-pay 云端一体页面模板](uni-pay.md)
* * [uni-pay 公共模块](unipay.md)
* [uni-cms 内容管理](uni-cms.md)
* [uni-ai-chat ai聊天示例](uni-ai-chat.md)
* [uni-im 即时通信](uni-im.md)
* [uSearch 云端一体搜索](https://ext.dcloud.net.cn/plugin?id=3851)
* [uni-captcha 图形验证码](uni-captcha.md)
* [uni-sec-check 内容安全](uni-sec-check.md)
* [统一发行页面](uni-portal.md)
* [uni-cloud-router](uni-cloud-router.md)
* [uni-open-bridge 微信支付宝等三方凭据管理](uni-open-bridge.md)
* [uni-cloud-s2s 传统服务器与uniCloud安全通信](uni-cloud-s2s.md)
* [uni-subscribemsg 订阅消息发送](uni-subscribemsg.md)
* uni-map 地图```{"collapsable": true}```
* * [uni-map-common 公共模块](uni-map-common.md)
* * [unicloud-map 云端一体组件](unicloud-map.md)
* * [unicloud-map 管理端](unicloud-map-admin.md)
* * [unicloud-city-select 城市选择组件](unicloud-city-select.md)
* [案例](resource.md)
* [开发者使用反馈](feedback.md)
* [DCloud行业认证服务商](https://ask.dcloud.net.cn/article/39388)
* [学习资料](learning.md)
* [常见问题](faq.md)
* [已知问题](known-issue.md)
* [微信云开发转uniCloud](wx2unicloud.md)
<!-- * [阿里云公测版迁移正式版](aliyun-migrate-business.md) -->
* [uniCloud产品服务协议](agreement.md)
* [更新日志](release.md)
此差异已折叠。
此差异已折叠。
此差异已折叠。
**本功能的主要作用是前端删除云存储的文件,并不推荐这种用法。**
**本功能仅腾讯云支持**
腾讯云提供了一套自己的用户权限,这套系统和uni-id不同,不支持编程,不能用于业务系统的真实账户。仅用于云存储的前端管理。
在腾讯云的概念里,默认情况下所有用户都是通过匿名登录访问云存储的,自定义登录提供了在云端区分用户身份的能力。开启腾讯云自定义登录后,每个用户会在腾讯云的后台有一个身份标记,从前端上传文件到云存储时,腾讯云会自动给文件加入这个标记。如果同时在云存储权限配置里配置了仅创建者可写,则前端可以直接删除这个云存储,删除时腾讯云会自动校验文件上传者的userId和当前用户的userId一致时才允许删除。
在微信小程序云的开发中,自定义登录还可以用于前端操作数据库。
但因为腾讯云提供的这套方案不够灵活和完善,uniCloud单独做了[uni-id](uni-id/summary.md)用于完善的账户体系,单独做了[clientDB](clientdb.md),用于完善快捷的前端操作数据库。
所以目前腾讯云的自定义登录功能,在uniCloud中的价值只剩下前端删除云存储。DCloud不建议开发者这么用,前端直传云存储不需要腾讯云自定义登录,而删除云存储,还是应该在云端进行。
## 名词解释
- Ticket(票据):由云函数调用`auth.createTicket`返回的票据,用于客户端使用票据进行登录操作
- 匿名登录:用户未进行登录操作的状态
- 短期访问令牌:用户身份的凭证(access token),调用`signInWithTicket`或者`linkAndRetrieveDataWithTicket`之后会自动进行存储
## 云函数接口
### uniCloud.customAuth@cloud-custom-auth
**重要:自HBuilderX 2.9.12起,此接口由uniCloud.auth调整为uniCloud.customAuth,短时间内仍会兼容uniCloud.auth**
获取登录对象
**示例代码**
```js
const auth = uniCloud.customAuth()
```
### auth.createTicket@cloud-create-ticket
云端根据用户id创建票据用于客户端登录到对应的云厂商
**接口形式**
```js
auth.createTicket(String uid, Object options)
```
**参数说明**
|字段 |类型 |是否必填 |说明 |
|:-: |:-: |:-: |:-: |
|uid |string |是 |应用内的用户唯一id |
|options.refresh|number |否 |access_token的刷新时间,默认一小时 |
|options.expire |number |否 |access_token的过期时间 |
**示例代码**
```js
let uid = '123456';
const ticket = uniCloud.customAuth().createTicket(uid, {
refresh: 10 * 60 * 1000 // 每十分钟刷新一次登录态, 默认为一小时
});
```
### auth.getUserInfo@cloud-get-user-info
任何方式登录成功后,可以调用 `getUserInfo` 获得用户的身份信息。
**响应参数**
|字段 |类型 |是否必备 |说明 |
|:-: |:-: |:-: |:-: |
|uid |string |是 |用户在云厂商的唯一ID |
|customUserId |string |否 |用户使用自定义登录传入的用户Id |
**示例代码**
```js
const {
uid,
customUserId
} = await auth.getUserInfo()
```
## 客户端接口
### uniCloud.customAuth@custom-auth
**重要:自HBuilderX 2.9.12起,此接口由uniCloud.auth调整为uniCloud.customAuth,短时间内仍会兼容uniCloud.auth**
获取登录对象
**示例代码**
```js
const auth = uniCloud.customAuth()
```
<!-- ## auth.signInAnonymously()
进行匿名登录,详细描述参考[匿名登录](#匿名登录)
**示例代码**
```js
const auth = uniCloud.customAuth()
auth.signInAnonymously()
``` -->
### auth.signInWithTicket@signinwithticket
使用云函数接口createTicket返回的票据进行登录,详细描述参考[登录流程](#cloudtoken)
**示例代码**
```js
auth.signInWithTicket('YourTicket').then(() => {
// 获取用户信息
return auth.getUserInfo()
})
.then(userInfo => {
//...
})
```
### auth.getLoginState@get-login-state
开发者可以通过 `getLoginState()` 来获取当前的登录状态,调用 `getLoginState()` 后,SDK 会识别本地是否有登录状态,如果有,则会尝试刷新登录状态,若刷新登录状态成功,则会返回新的登录状态,否则返回 `undefined`
**示例代码**
```js
auth.getLoginState().then(loginState => {
if (loginState) {
// 登录态有效
} else {
// 没有登录态,或者登录态已经失效
}
})
```
### auth.getUserInfo@get-user-info
任何方式登录成功后,可以调用 `getUserInfo` 获得用户的身份信息。
**响应参数**
|字段 |类型 |是否必备 |说明 |
|:-: |:-: |:-: |:-: |
|uid |string |是 |用户在云厂商的唯一ID |
|customUserId |string |否 |用户使用自定义登录传入的用户Id |
**示例代码**
```js
auth.signInWithTicket('YourTicket').then(() => {
// 获取用户信息
return auth.getUserInfo()
})
.then(userInfo => {
//...
})
```
## 登录流程@cloudtoken
`uniCloud`允许开发者使用特定的登录凭据`Ticket`对用户进行身份认证。开发者可以使用`服务端 SDK`来创建`Ticket`,并且将`Ticket`传入到应用内,然后调用`signInWithTicket()`获得登录态。
### 第一步:获取私钥文件
登录uniCloud控制台[uniCloud控制台](http://unicloud.dcloud.net.cn/),在`自定义登录`中,点击“生成并下载”
**注意:重复生成私钥会使之前生成的私钥失效,并导致用户登录状态失效**
![uniCloud下载私钥](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/custom-login-secret.jpg)
### 第二步:使用云函数创建登录凭据
获取私钥文件(`credentials.json`)之后,放在需要生成`Ticket`的云函数内`index.js`同级即可
`服务端 SDK`内置了生成`Ticket`的接口,开发者需要提供一个自定义的`customUserId`作为用户的**唯一身份标识**`Ticket`有效期为**5分钟**,过期则失效。
每个用户的`customUserId`不能相同,每次用户重新登录时,原有的登录态将会失效。
**Ticket一般在验证了用户名密码成功之后下发**
```js
let customUserId = '123456';
const ticket = uniCloud.customAuth().createTicket(customUserId, {
refresh: 10 * 60 * 1000 // 每十分钟刷新一次登录态, 默认为一小时
});
// 然后把 ticket 发送给客户端
```
### 第三步:客户端上使用Ticket登录
创建`Ticket`之后,开发者应将`Ticket`发送至客户端,然后使用`客户端SDK`提供的 `signInWithTicket()` 登录`uniCloud`
```js
auth.signInWithTicket(ticket).then(() => {
// 登录成功
})
```
## 匿名登录
uniCloud允许开发者使用匿名登录的方式进行静默授权,可以避免强制登录。在匿名状态下可正常的调用uniCloud的资源,开发者同时可以配合安全规则针对匿名用户制定对应的访问限制。
#### 匿名用户重新登录
匿名用户如果要重新使用开发者提供的身份登录,可以调用`auth.signInWithTicket`来进行。[参考](#signinwithticket)
#### 匿名用户转化为正式用户
目前uniCloud支持将匿名用户转化为正式用户,此转正用户将会继承匿名用户在云端创建的资源,流程如下:
1. 首先需要按照[登录流程](#cloudtoken)搭建获取自定义登录凭证`ticket`的服务;
2. 客户端请求接口获取自定义登录凭证`ticket`**请注意**,此`ticket`必须未注册过uniCloud,换句话说,匿名用户只能转化为新的uniCloud用户;
3. 客户端调用`auth.linkAndRetrieveDataWithTicket`API,如下:
```js
// 调用此API之前需先请求接口获取到ticket
auth.linkAndRetrieveDataWithTicket(ticket).then(res => {
// 转正成功
}).catch(err => {
// 转正失败会抛出错误
});
```
## 登录授权相关事件及钩子函数
### Event: 'loginStateExpire'
当登录态失效时,会触发这个事件,开发者可以在这个事件回调内,尝试重新登录 uniCloud。
```js
auth.onLoginStateExpire(() => {
// 尝试重新登录
});
```
### Event: 'refreshAccessToken'
JS SDK 会在登录态生效期间,自动刷新和维护短期访问令牌(access token),每次成功刷新时会触发此事件。
对于两种登录态并存(uniCloud、自身业务登录态)的应用,这个事件可以用于同步登录态之间的状态。
```js
auth.onAccessTokenRefreshed(() => {
// 此时 uniCloud 短期访问令牌已经刷新,可以尝试刷新自身业务的登录态
})
```
### Auth.shouldRefreshAccessToken(callback)
`shouldRefreshAccessToken` 接收一个 `callback` 函数,并且会在刷新短期访问令牌前调用此 `callback` 函数,根据返回值决定是否要刷新短期访问令牌。
对于两种登录态并存(uniCloud、自身业务登录态)的应用,可以在 `callback` 内判断自身业务登录态是否失效,从而决定是否续期 uniCloud 的短期访问令牌。
```js
auth.shouldRefreshAccessToken(() => {
if (/* 自身业务登录态还有效 */) {
return true;
} else {
return false;
}
});
```
此差异已折叠。
此差异已折叠。
#### 云函数公用模块
云函数支持公共模块。多个云函数的共享部分,可以抽离为公共模块,然后被多个云函数引用。
> 版本要求:HBuilderX 2.6.6+
以下面的目录结构为例,介绍一下如何使用。
```
cloudfunctions
├─common // 云函数公用模块目录
| └─hello-common // 云函数公用模块
| ├─package.json
| └─index.js // 公用模块代码,可以不使用index.js,修改 package.json 内的 main 字段可以指定此文件名
└─use-common // 使用公用模块的云函数
├─package.json // 在 use-common 目录执行 npm init -y 生成
└─index.js // 云函数入口文件
```
**创建并引入公用模块**
1.`cloudfunctions`目录下创建`common`目录
2.`common`目录右键创建公用模块目录(本例中为`hello-common`,见下方示例图),会自动创建入口`index.js`文件和`package.json`**不要修改此package.json的name字段**
3.`hello-common`右键上传公用模块
4. 在云函数上右键选择`管理公共模块依赖`,添加依赖的公共模块
![管理公共模块依赖](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/manage-common.png)
公共模块依赖其他公共模块同理
![创建公用模块](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/create-common-module.jpg)
**注意事项**
- 如果要更新所有依赖某公用模块的云函数,可以在`common`目录下的公用模块目录(本例中为`hello-common`)右键选择`更新依赖本模块的云函数`
- 公用模块命名不可与nodejs内置模块重名
- 从插件市场导入或者其他地方复制项目可能会导致`npm install`创建的软链接失效,如果遇到这种情况请删除`node_modules``package-lock.json`重新`npm install`
![更新公用模块](https://img.cdn.aliyun.dcloud.net.cn/uni-app/uniCloud/update-common-module.jpg)
**使用公用模块**
仍以上面的目录为例,在公用模块内`exports`,在云函数内`require`即可。示例代码如下:
```js
// common/hello-common/index.js
function getVersion() {
return '0.0.1'
}
module.exports = {
getVersion,
secret: 'your secret'
}
```
```js
// use-common/index.js
'use strict';
const {
secret,
getVersion
} = require('hello-common')
exports.main = async (event, context) => {
let version = getVersion()
return {
secret,
version
}
}
```
如果仅需要导出一个function还可以使用以下写法
```js
// common/hello-common/index.js
module.exports = function(e){
return e
}
```
```js
// use-common/index.js
'use strict';
const echo = require('hello-common')
exports.main = async (event, context) => {
let eventEcho = echo(event)
return {
eventEcho
}
}
```
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
## 打印日志
云函数内使用`console.log``console.info``console.warn``console.error`四种方式打印日志。
HBuilderX中查看日志的教程在 [快速上手章节](/uniCloud/quickstart?id=rundebug)
云函数日志会在云端保存7天。
自2022年10月25号之后新开通的服务空间默认关闭了云端日志(在腾讯云的计费模式下,日志是额外收费的),uniCloud web控制台即将提供手动开启腾讯云云函数日志及修改日志保存时长功能
\ No newline at end of file
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
## 业务开通
1. 登录[uniCloud web控制台](https://unicloud.dcloud.net.cn/)
2. 选择一个服务空间
3. 选择左侧 云存储 - 扩展存储菜单,开通
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/ext-storage/439.png)
4. 绑定自定义域名
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/ext-storage/440.png)
5. 等待域名绑定
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/ext-storage/441.png)
6. 设置域名cname
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/ext-storage/443.png)
7. 完成,进入扩展存储管理页面
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/ext-storage/444.png)
## 业务充值
### 充值保证金
扩展存储是延迟计费的,使用前需要先充值200元保证金,用于欠费的担保。保证金是账号级的、可在不同业务间复用,若你在使用其他uniCloud服务时 ,已充值保证金,则无需重复充值。
在uniCloud web控制台前往【费用中心】-【按量余额充值】充值保证金(若保证金账户余额≥200元则无需充值)
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/429.png)
### 充值余额
在uniCloud web控制台前往【费用中心】-【按量余额充值】充值扩展存储余额
![](https://qiniu-web-assets.dcloud.net.cn/unidoc/zh/3707/428.png)
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
此差异已折叠。
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册