首次完整推送,
V:1.20240808.006
This commit is contained in:
10
uni_modules/uni-feedback/changelog.md
Normal file
10
uni_modules/uni-feedback/changelog.md
Normal file
@ -0,0 +1,10 @@
|
||||
## 1.1.1(2024-03-26)
|
||||
支持支付宝小程序云
|
||||
## 1.1.0(2022-07-13)
|
||||
新增,应用[pages_init](https://uniapp.dcloud.io/plugin/publish.html#pages-init)当导入插件到项目工程时,自动合并本插件的页面路由到项目的pages.json
|
||||
## 1.0.5(2022-07-13)
|
||||
新增,应用[pages_init](https://uniapp.dcloud.io/plugin/publish.html#pages-init)当导入插件到项目工程时,自动合并本插件的页面路由到项目的pages.json
|
||||
## 1.0.4(2021-09-26)
|
||||
为了数据安全,`opendb-feedback`表的`permission`中`delete`,`update`的值默认为`false`
|
||||
## 1.0.3(2021-08-26)
|
||||
删除多余的云函数test2
|
98
uni_modules/uni-feedback/js_sdk/validator/opendb-feedback.js
Normal file
98
uni_modules/uni-feedback/js_sdk/validator/opendb-feedback.js
Normal file
@ -0,0 +1,98 @@
|
||||
// 表单校验规则由 schema2code 生成,不建议直接修改校验规则,而建议通过 schema2code 生成, 详情: https://uniapp.dcloud.net.cn/uniCloud/schema
|
||||
|
||||
|
||||
const validator = {
|
||||
"content": {
|
||||
"rules": [
|
||||
{
|
||||
"required": true
|
||||
},
|
||||
{
|
||||
"format": "string"
|
||||
}
|
||||
],
|
||||
"label": "留言内容/回复内容"
|
||||
},
|
||||
"imgs": {
|
||||
"rules": [
|
||||
{
|
||||
"format": "array"
|
||||
},
|
||||
{
|
||||
"arrayType": "file"
|
||||
},
|
||||
{
|
||||
"maxLength": 6
|
||||
}
|
||||
],
|
||||
"label": "图片列表"
|
||||
},
|
||||
"contact": {
|
||||
"rules": [
|
||||
{
|
||||
"format": "string"
|
||||
}
|
||||
],
|
||||
"label": "联系人"
|
||||
},
|
||||
"mobile": {
|
||||
"rules": [
|
||||
{
|
||||
"format": "string"
|
||||
},
|
||||
{
|
||||
"pattern": "^\\+?[0-9-]{3,20}$"
|
||||
}
|
||||
],
|
||||
"label": "联系电话"
|
||||
}
|
||||
}
|
||||
|
||||
const enumConverter = {}
|
||||
|
||||
function filterToWhere(filter, command) {
|
||||
let where = {}
|
||||
for (let field in filter) {
|
||||
let { type, value } = filter[field]
|
||||
switch (type) {
|
||||
case "search":
|
||||
if (typeof value === 'string' && value.length) {
|
||||
where[field] = new RegExp(value)
|
||||
}
|
||||
break;
|
||||
case "select":
|
||||
if (value.length) {
|
||||
let selectValue = []
|
||||
for (let s of value) {
|
||||
selectValue.push(command.eq(s))
|
||||
}
|
||||
where[field] = command.or(selectValue)
|
||||
}
|
||||
break;
|
||||
case "range":
|
||||
if (value.length) {
|
||||
let gt = value[0]
|
||||
let lt = value[1]
|
||||
where[field] = command.and([command.gte(gt), command.lte(lt)])
|
||||
}
|
||||
break;
|
||||
case "date":
|
||||
if (value.length) {
|
||||
let [s, e] = value
|
||||
let startDate = new Date(s)
|
||||
let endDate = new Date(e)
|
||||
where[field] = command.and([command.gte(startDate), command.lte(endDate)])
|
||||
}
|
||||
break;
|
||||
case "timestamp":
|
||||
if (value.length) {
|
||||
let [startDate, endDate] = value
|
||||
where[field] = command.and([command.gte(startDate), command.lte(endDate)])
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
return where
|
||||
}
|
||||
|
||||
export { validator, enumConverter, filterToWhere }
|
90
uni_modules/uni-feedback/package.json
Normal file
90
uni_modules/uni-feedback/package.json
Normal file
@ -0,0 +1,90 @@
|
||||
{
|
||||
"id": "uni-feedback",
|
||||
"displayName": "问题反馈页面模板",
|
||||
"version": "1.1.1",
|
||||
"description": "问题反馈页面模板,方便开发者快速搭建问题反馈界面",
|
||||
"keywords": [
|
||||
"问题反馈页面模板"
|
||||
],
|
||||
"repository": "",
|
||||
"engines": {
|
||||
"HBuilderX": "^3.1.0"
|
||||
},
|
||||
"dcloudext": {
|
||||
"sale": {
|
||||
"regular": {
|
||||
"price": "0.00"
|
||||
},
|
||||
"sourcecode": {
|
||||
"price": "0.00"
|
||||
}
|
||||
},
|
||||
"contact": {
|
||||
"qq": ""
|
||||
},
|
||||
"declaration": {
|
||||
"ads": "无",
|
||||
"data": "无",
|
||||
"permissions": "无"
|
||||
},
|
||||
"npmurl": "",
|
||||
"type": "unicloud-template-page"
|
||||
},
|
||||
"uni_modules": {
|
||||
"dependencies": [
|
||||
"uni-forms",
|
||||
"uni-file-picker",
|
||||
"uni-easyinput",
|
||||
"uni-load-more",
|
||||
"uni-list",
|
||||
"uni-fab",
|
||||
"uni-link"
|
||||
],
|
||||
"encrypt": [],
|
||||
"platforms": {
|
||||
"cloud": {
|
||||
"tcb": "y",
|
||||
"aliyun": "y",
|
||||
"alipay": "y"
|
||||
},
|
||||
"client": {
|
||||
"App": {
|
||||
"app-vue": "y",
|
||||
"app-nvue": "u"
|
||||
},
|
||||
"H5-mobile": {
|
||||
"Safari": "y",
|
||||
"Android Browser": "y",
|
||||
"微信浏览器(Android)": "y",
|
||||
"QQ浏览器(Android)": "y"
|
||||
},
|
||||
"H5-pc": {
|
||||
"Chrome": "y",
|
||||
"IE": "u",
|
||||
"Edge": "y",
|
||||
"Firefox": "y",
|
||||
"Safari": "y"
|
||||
},
|
||||
"小程序": {
|
||||
"微信": "y",
|
||||
"阿里": "y",
|
||||
"百度": "y",
|
||||
"字节跳动": "y",
|
||||
"QQ": "y",
|
||||
"钉钉": "u",
|
||||
"快手": "u",
|
||||
"飞书": "u",
|
||||
"京东": "u"
|
||||
},
|
||||
"快应用": {
|
||||
"华为": "u",
|
||||
"联盟": "u"
|
||||
},
|
||||
"Vue": {
|
||||
"vue2": "y",
|
||||
"vue3": "y"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
113
uni_modules/uni-feedback/pages/opendb-feedback/detail.vue
Normal file
113
uni_modules/uni-feedback/pages/opendb-feedback/detail.vue
Normal file
@ -0,0 +1,113 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<unicloud-db ref="udb" v-slot:default="{data, loading, error, options}" :options="options" collection="opendb-feedback" field="content,imgs,contact,mobile" :where="queryWhere" :getone="true" :manual="true">
|
||||
<view v-if="error">{{error.message}}</view>
|
||||
<view v-else-if="loading">
|
||||
<uni-load-more :contentText="loadMore" status="loading"></uni-load-more>
|
||||
</view>
|
||||
<view v-else-if="data">
|
||||
<view>
|
||||
<text>留言内容/回复内容</text>
|
||||
<text>{{data.content}}</text>
|
||||
</view>
|
||||
<view>
|
||||
<text>图片列表</text>
|
||||
<template v-for="(file, j) in data.imgs">
|
||||
<uni-file-picker v-if="file.fileType == 'image'" :value="file" :file-mediatype="file.fileType" return-type="object" readonly></uni-file-picker>
|
||||
<uni-link v-else :href="file.url" :text="file.url"></uni-link>
|
||||
</template>
|
||||
</view>
|
||||
<view>
|
||||
<text>联系人</text>
|
||||
<text>{{data.contact}}</text>
|
||||
</view>
|
||||
<view>
|
||||
<text>联系电话</text>
|
||||
<text>{{data.mobile}}</text>
|
||||
</view>
|
||||
</view>
|
||||
</unicloud-db>
|
||||
<view class="btns">
|
||||
<button type="primary" @click="handleUpdate">修改</button>
|
||||
<button type="warn" class="btn-delete" @click="handleDelete">删除</button>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
// 由schema2code生成,包含校验规则和enum静态数据
|
||||
import { enumConverter } from '../../js_sdk/validator/opendb-feedback.js';
|
||||
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
queryWhere: '',
|
||||
loadMore: {
|
||||
contentdown: '',
|
||||
contentrefresh: '',
|
||||
contentnomore: ''
|
||||
},
|
||||
options: {
|
||||
// 将scheme enum 属性静态数据中的value转成text
|
||||
...enumConverter
|
||||
}
|
||||
}
|
||||
},
|
||||
onLoad(e) {
|
||||
this._id = e.id
|
||||
},
|
||||
onReady() {
|
||||
if (this._id) {
|
||||
this.queryWhere = '_id=="' + this._id + '"'
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
handleUpdate() {
|
||||
// 打开修改页面
|
||||
uni.navigateTo({
|
||||
url: './edit?id=' + this._id,
|
||||
events: {
|
||||
// 监听修改页面成功修改数据后, 刷新当前页面数据
|
||||
refreshData: () => {
|
||||
this.$refs.udb.loadData({
|
||||
clear: true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
},
|
||||
handleDelete() {
|
||||
this.$refs.udb.remove(this._id, {
|
||||
success: (res) => {
|
||||
// 删除数据成功后跳转到list页面
|
||||
uni.navigateTo({
|
||||
url: './list'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.container {
|
||||
padding: 10px;
|
||||
}
|
||||
|
||||
.btns {
|
||||
margin-top: 10px;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.btns button {
|
||||
flex: 1;
|
||||
}
|
||||
|
||||
.btn-delete {
|
||||
margin-left: 10px;
|
||||
}
|
||||
</style>
|
167
uni_modules/uni-feedback/pages/opendb-feedback/edit.vue
Normal file
167
uni_modules/uni-feedback/pages/opendb-feedback/edit.vue
Normal file
@ -0,0 +1,167 @@
|
||||
<template>
|
||||
<view class="uni-container">
|
||||
<uni-forms ref="form" :value="formData" validate-trigger="submit" err-show-type="toast">
|
||||
<uni-forms-item name="content" label="留言内容/回复内容" required>
|
||||
<textarea @input="binddata('content', $event.detail.value)" class="uni-textarea-border" v-model="formData.content" trim="right"></textarea>
|
||||
</uni-forms-item>
|
||||
<uni-forms-item name="imgs" label="图片列表">
|
||||
<uni-file-picker file-mediatype="image" :limit="6" return-type="array" v-model="formData.imgs"></uni-file-picker>
|
||||
</uni-forms-item>
|
||||
<uni-forms-item name="contact" label="联系人">
|
||||
<uni-easyinput v-model="formData.contact" trim="both"></uni-easyinput>
|
||||
</uni-forms-item>
|
||||
<uni-forms-item name="mobile" label="联系电话">
|
||||
<uni-easyinput v-model="formData.mobile" trim="both"></uni-easyinput>
|
||||
</uni-forms-item>
|
||||
<view class="uni-button-group">
|
||||
<button type="primary" class="uni-button" @click="submit">提交</button>
|
||||
</view>
|
||||
</uni-forms>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import { validator } from '../../js_sdk/validator/opendb-feedback.js';
|
||||
|
||||
const db = uniCloud.database();
|
||||
const dbCollectionName = 'opendb-feedback';
|
||||
|
||||
function getValidator(fields) {
|
||||
let result = {}
|
||||
for (let key in validator) {
|
||||
if (fields.indexOf(key) > -1) {
|
||||
result[key] = validator[key]
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export default {
|
||||
data() {
|
||||
let formData = {
|
||||
"content": "",
|
||||
"imgs": [],
|
||||
"contact": "",
|
||||
"mobile": ""
|
||||
}
|
||||
return {
|
||||
formData,
|
||||
formOptions: {},
|
||||
rules: {
|
||||
...getValidator(Object.keys(formData))
|
||||
}
|
||||
}
|
||||
},
|
||||
onLoad(e) {
|
||||
if (e.id) {
|
||||
const id = e.id
|
||||
this.formDataId = id
|
||||
this.getDetail(id)
|
||||
}
|
||||
},
|
||||
onReady() {
|
||||
this.$refs.form.setRules(this.rules)
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 触发表单提交
|
||||
*/
|
||||
submit() {
|
||||
uni.showLoading({
|
||||
mask: true
|
||||
})
|
||||
this.$refs.form.validate().then((res) => {
|
||||
this.submitForm(res)
|
||||
}).catch(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
|
||||
submitForm(value) {
|
||||
// 使用 clientDB 提交数据
|
||||
db.collection(dbCollectionName).doc(this.formDataId).update(value).then((res) => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '修改成功'
|
||||
})
|
||||
this.getOpenerEventChannel().emit('refreshData')
|
||||
setTimeout(() => uni.navigateBack(), 500)
|
||||
}).catch((err) => {
|
||||
uni.showModal({
|
||||
content: err.message || '请求服务失败',
|
||||
showCancel: false
|
||||
})
|
||||
}).finally(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
|
||||
/**
|
||||
* 获取表单数据
|
||||
* @param {Object} id
|
||||
*/
|
||||
getDetail(id) {
|
||||
uni.showLoading({
|
||||
mask: true
|
||||
})
|
||||
db.collection(dbCollectionName).doc(id).field("content,imgs,contact,mobile").get().then((res) => {
|
||||
const data = res.result.data[0]
|
||||
if (data) {
|
||||
this.formData = data
|
||||
}
|
||||
}).catch((err) => {
|
||||
uni.showModal({
|
||||
content: err.message || '请求服务失败',
|
||||
showCancel: false
|
||||
})
|
||||
}).finally(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.uni-container {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.uni-input-border,
|
||||
.uni-textarea-border {
|
||||
width: 100%;
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
border: 1px #e5e5e5 solid;
|
||||
border-radius: 5px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.uni-input-border {
|
||||
padding: 0 10px;
|
||||
height: 35px;
|
||||
|
||||
}
|
||||
|
||||
.uni-textarea-border {
|
||||
padding: 10px;
|
||||
height: 80px;
|
||||
}
|
||||
|
||||
.uni-button-group {
|
||||
margin-top: 50px;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.uni-button {
|
||||
width: 184px;
|
||||
padding: 12px 20px;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
line-height: 1;
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
70
uni_modules/uni-feedback/pages/opendb-feedback/list.vue
Normal file
70
uni_modules/uni-feedback/pages/opendb-feedback/list.vue
Normal file
@ -0,0 +1,70 @@
|
||||
<template>
|
||||
<view class="container">
|
||||
<unicloud-db ref="udb" v-slot:default="{data, pagination, loading, hasMore, error}" collection="opendb-feedback" field="content,imgs,contact,mobile">
|
||||
<view v-if="error">{{error.message}}</view>
|
||||
<view v-else-if="data">
|
||||
<uni-list>
|
||||
<uni-list-item v-for="(item, index) in data" :key="index" showArrow :clickable="true" @click="handleItemClick(item._id)">
|
||||
<template v-slot:body>
|
||||
<text>
|
||||
<!-- 此处默认显示为_id,请根据需要自行修改为其他字段 -->
|
||||
<!-- 如果使用了联表查询,请参考生成的 admin 项目中 list.vue 页面的绑定字段的写法 -->
|
||||
{{item._id}}
|
||||
</text>
|
||||
</template>
|
||||
</uni-list-item>
|
||||
</uni-list>
|
||||
</view>
|
||||
<uni-load-more :status="loading?'loading':(hasMore ? 'more' : 'noMore')"></uni-load-more>
|
||||
</unicloud-db>
|
||||
<uni-fab ref="fab" horizontal="right" vertical="bottom" :pop-menu="false" @fabClick="fabClick" />
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
export default {
|
||||
data() {
|
||||
return {
|
||||
loadMore: {
|
||||
contentdown: '',
|
||||
contentrefresh: '',
|
||||
contentnomore: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
onPullDownRefresh() {
|
||||
this.$refs.udb.loadData({
|
||||
clear: true
|
||||
}, () => {
|
||||
uni.stopPullDownRefresh()
|
||||
})
|
||||
},
|
||||
onReachBottom() {
|
||||
this.$refs.udb.loadMore()
|
||||
},
|
||||
methods: {
|
||||
handleItemClick(id) {
|
||||
uni.navigateTo({
|
||||
url: './detail?id=' + id
|
||||
})
|
||||
},
|
||||
fabClick() {
|
||||
// 打开新增页面
|
||||
uni.navigateTo({
|
||||
url: './opendb-feedback',
|
||||
events: {
|
||||
// 监听新增数据成功后, 刷新当前页面数据
|
||||
refreshData: () => {
|
||||
this.$refs.udb.loadData({
|
||||
clear: true
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
</style>
|
@ -0,0 +1,141 @@
|
||||
<template>
|
||||
<view class="uni-container">
|
||||
<uni-forms ref="form" :value="formData" validate-trigger="submit" err-show-type="toast">
|
||||
<uni-forms-item name="content" label="留言内容/回复内容" required>
|
||||
<textarea @input="binddata('content', $event.detail.value)" class="uni-textarea-border"
|
||||
v-model="formData.content" trim="right"></textarea>
|
||||
</uni-forms-item>
|
||||
<uni-forms-item name="imgs" label="图片列表">
|
||||
<uni-file-picker file-mediatype="image" :limit="6" return-type="array" v-model="formData.imgs">
|
||||
</uni-file-picker>
|
||||
</uni-forms-item>
|
||||
<uni-forms-item name="contact" label="联系人">
|
||||
<uni-easyinput v-model="formData.contact" trim="both"></uni-easyinput>
|
||||
</uni-forms-item>
|
||||
<uni-forms-item name="mobile" label="联系电话">
|
||||
<uni-easyinput v-model="formData.mobile" trim="both"></uni-easyinput>
|
||||
</uni-forms-item>
|
||||
<view class="uni-button-group">
|
||||
<button type="primary" class="uni-button" @click="submit">提交</button>
|
||||
</view>
|
||||
</uni-forms>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import {
|
||||
validator
|
||||
} from '../../js_sdk/validator/opendb-feedback.js';
|
||||
console.log(validator);
|
||||
const db = uniCloud.database();
|
||||
const dbCollectionName = 'opendb-feedback';
|
||||
|
||||
function getValidator(fields) {
|
||||
let result = {}
|
||||
for (let key in validator) {
|
||||
if (fields.indexOf(key) > -1) {
|
||||
result[key] = validator[key]
|
||||
}
|
||||
}
|
||||
return result
|
||||
}
|
||||
|
||||
export default {
|
||||
data() {
|
||||
let formData = {
|
||||
"content": "",
|
||||
"imgs": [],
|
||||
"contact": "",
|
||||
"mobile": ""
|
||||
}
|
||||
return {
|
||||
formData,
|
||||
formOptions: {},
|
||||
rules: {
|
||||
...getValidator(Object.keys(formData))
|
||||
}
|
||||
}
|
||||
},
|
||||
onReady() {
|
||||
this.$refs.form.setRules(this.rules)
|
||||
},
|
||||
methods: {
|
||||
/**
|
||||
* 触发表单提交
|
||||
*/
|
||||
submit() {
|
||||
uni.showLoading({
|
||||
mask: true
|
||||
})
|
||||
this.$refs.form.validate().then((res) => {
|
||||
this.submitForm(res)
|
||||
}).catch(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
},
|
||||
|
||||
submitForm(value) {
|
||||
// 使用 clientDB 提交数据
|
||||
db.collection(dbCollectionName).add(value).then((res) => {
|
||||
uni.showToast({
|
||||
icon: 'none',
|
||||
title: '提交成功'
|
||||
})
|
||||
this.getOpenerEventChannel().emit('refreshData')
|
||||
setTimeout(() => uni.navigateBack(), 500)
|
||||
}).catch((err) => {
|
||||
uni.showModal({
|
||||
content: err.message || '请求服务失败',
|
||||
showCancel: false
|
||||
})
|
||||
}).finally(() => {
|
||||
uni.hideLoading()
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style>
|
||||
.uni-container {
|
||||
padding: 15px;
|
||||
}
|
||||
|
||||
.uni-input-border,
|
||||
.uni-textarea-border {
|
||||
width: 100%;
|
||||
font-size: 14px;
|
||||
color: #666;
|
||||
border: 1px #e5e5e5 solid;
|
||||
border-radius: 5px;
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
.uni-input-border {
|
||||
padding: 0 10px;
|
||||
height: 35px;
|
||||
|
||||
}
|
||||
|
||||
.uni-textarea-border {
|
||||
padding: 10px;
|
||||
height: 80px;
|
||||
}
|
||||
|
||||
.uni-button-group {
|
||||
margin-top: 50px;
|
||||
/* #ifndef APP-NVUE */
|
||||
display: flex;
|
||||
/* #endif */
|
||||
justify-content: center;
|
||||
}
|
||||
|
||||
.uni-button {
|
||||
width: 184px;
|
||||
padding: 12px 20px;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
line-height: 1;
|
||||
margin: 0;
|
||||
}
|
||||
</style>
|
1
uni_modules/uni-feedback/readme.md
Normal file
1
uni_modules/uni-feedback/readme.md
Normal file
@ -0,0 +1 @@
|
||||
这是一个问题反馈客户端插件,admin端插件:[https://ext.dcloud.net.cn/plugin?id=4992](https://ext.dcloud.net.cn/plugin?id=4992)
|
@ -0,0 +1,72 @@
|
||||
{
|
||||
"bsonType": "object",
|
||||
"required": ["content"],
|
||||
"permission": {
|
||||
"create": "auth.uid != null",
|
||||
"read": true,
|
||||
"delete": false,
|
||||
"update": false
|
||||
},
|
||||
"properties": {
|
||||
"_id": {
|
||||
"description": "ID,系统自动生成"
|
||||
},
|
||||
"user_id": {
|
||||
"bsonType": "string",
|
||||
"description": "留言反馈用户ID\/回复留言用户ID,参考uni-id-users表",
|
||||
"foreignKey": "uni-id-users._id",
|
||||
"forceDefaultValue": {
|
||||
"$env": "uid"
|
||||
}
|
||||
},
|
||||
"create_date": {
|
||||
"bsonType": "timestamp",
|
||||
"title": "留言时间\/回复留言时间",
|
||||
"forceDefaultValue": {
|
||||
"$env": "now"
|
||||
}
|
||||
},
|
||||
"content": {
|
||||
"bsonType": "string",
|
||||
"title": "留言内容\/回复内容",
|
||||
"componentForEdit": {
|
||||
"name": "textarea"
|
||||
},
|
||||
"trim": "right"
|
||||
},
|
||||
"imgs": {
|
||||
"bsonType": "array",
|
||||
"arrayType": "file",
|
||||
"maxLength": 6,
|
||||
"fileMediaType": "image",
|
||||
"title": "图片列表"
|
||||
},
|
||||
"is_reply": {
|
||||
"bsonType": "bool",
|
||||
"title": "是否是回复类型"
|
||||
},
|
||||
"feedback_id": {
|
||||
"bsonType": "string",
|
||||
"title": "被回复留言ID"
|
||||
},
|
||||
"contact": {
|
||||
"bsonType": "string",
|
||||
"title": "联系人",
|
||||
"trim": "both"
|
||||
},
|
||||
"mobile": {
|
||||
"bsonType": "string",
|
||||
"title": "联系电话",
|
||||
"pattern": "^\\+?[0-9-]{3,20}$",
|
||||
"trim": "both"
|
||||
},
|
||||
"reply_count": {
|
||||
"permission": {
|
||||
"write": false
|
||||
},
|
||||
"bsonType": "int",
|
||||
"title": "被回复条数",
|
||||
"defaultValue": 0
|
||||
}
|
||||
}
|
||||
}
|
Reference in New Issue
Block a user