Merge branch 'lx-test' of gitee.com:cabbage_qd/web-base-admin into lx-online
This commit is contained in:
commit
b9e513426d
170
README.md
170
README.md
|
@ -1,3 +1,173 @@
|
|||
# iOS商城APP上线审核材料模版
|
||||
|
||||
## 📖 概述
|
||||
|
||||
这是一套完整的iOS商城类APP上线审核所需的材料模版,帮助开发者快速准备App Store审核所需的各种文档和说明。
|
||||
|
||||
## 📁 文件清单
|
||||
|
||||
| 文件名 | 用途说明 | 必需程度 |
|
||||
|--------|----------|----------|
|
||||
| `隐私政策模版.md` | 用户隐私保护政策 | ✅ 必需 |
|
||||
| `用户协议模版.md` | 用户服务条款和协议 | ✅ 必需 |
|
||||
| `退换货政策模版.md` | 商品退换货规则说明 | ✅ 必需 |
|
||||
| `应用描述模版.md` | App Store应用描述和截图说明 | ✅ 必需 |
|
||||
| `测试账号说明.md` | 提供给审核团队的测试指南 | ✅ 必需 |
|
||||
| `技术文档说明.md` | 应用技术架构和实现说明 | 📋 推荐 |
|
||||
| `审核材料清单.md` | 完整的材料准备清单 | 📋 参考 |
|
||||
| `README.md` | 本说明文档 | 📋 参考 |
|
||||
|
||||
## 🚀 快速开始
|
||||
|
||||
### 1. 下载使用
|
||||
- 直接下载所有模版文件到本地
|
||||
- 根据实际业务情况修改模版内容
|
||||
- 替换所有 `[插入内容]` 占位符为真实信息
|
||||
|
||||
### 2. 必填信息
|
||||
需要替换的占位符包括:
|
||||
- `[应用名称]` - 您的应用实际名称
|
||||
- `[公司名称]` - 您的公司全称
|
||||
- `[插入日期]` - 当前日期
|
||||
- `[插入邮箱地址]` - 客服邮箱
|
||||
- `[插入电话号码]` - 客服电话
|
||||
- `[插入公司地址]` - 公司注册地址
|
||||
|
||||
### 3. 使用步骤
|
||||
1. **第一步**:阅读 `审核材料清单.md`,了解所需材料
|
||||
2. **第二步**:按照清单准备基础资质文件
|
||||
3. **第三步**:使用模版文件,填写完整信息
|
||||
4. **第四步**:准备应用截图和图标
|
||||
5. **第五步**:设置测试环境和账号
|
||||
6. **第六步**:提交审核
|
||||
|
||||
## 📋 详细说明
|
||||
|
||||
### 法律文件模版
|
||||
|
||||
#### 隐私政策模版
|
||||
- **用途**:说明应用如何收集、使用、保护用户个人信息
|
||||
- **重要性**:App Store强制要求,必须提供
|
||||
- **自定义点**:根据实际收集的数据类型调整内容
|
||||
|
||||
#### 用户协议模版
|
||||
- **用途**:规定用户使用应用的权利和义务
|
||||
- **重要性**:保护公司和用户双方权益
|
||||
- **自定义点**:根据业务模式调整条款内容
|
||||
|
||||
#### 退换货政策模版
|
||||
- **用途**:明确商品退换货的条件和流程
|
||||
- **重要性**:电商类应用必备,保护消费者权益
|
||||
- **自定义点**:根据商品类型调整退换货规则
|
||||
|
||||
### 技术文档
|
||||
|
||||
#### 应用描述模版
|
||||
- **用途**:App Store应用页面的描述文案
|
||||
- **重要性**:影响用户下载决策和ASO排名
|
||||
- **自定义点**:突出应用特色功能和优势
|
||||
|
||||
#### 测试账号说明
|
||||
- **用途**:为审核团队提供测试指导
|
||||
- **重要性**:确保审核顺利进行
|
||||
- **自定义点**:提供真实可用的测试流程
|
||||
|
||||
#### 技术文档说明
|
||||
- **用途**:向审核团队说明技术实现
|
||||
- **重要性**:帮助审核团队理解应用架构
|
||||
- **自定义点**:突出安全性和合规性措施
|
||||
|
||||
## ⚠️ 重要注意事项
|
||||
|
||||
### 合规要求
|
||||
1. **真实性**:所有信息必须真实有效
|
||||
2. **完整性**:确保所有必需信息都已填写
|
||||
3. **一致性**:各文档间的信息要保持一致
|
||||
4. **时效性**:确保联系方式和证件在有效期内
|
||||
|
||||
### 特殊提醒
|
||||
1. **商品合规**:确保销售商品符合相关法律法规
|
||||
2. **支付合规**:明确不使用App Store内购系统
|
||||
3. **数据安全**:重视用户隐私和数据保护
|
||||
4. **客服体系**:建立完善的售后服务机制
|
||||
|
||||
## 🔧 自定义指南
|
||||
|
||||
### 根据业务类型调整
|
||||
|
||||
#### 垂直电商(如:美妆、服装)
|
||||
- 突出专业性和品质保证
|
||||
- 详细说明商品认证和质量标准
|
||||
- 针对特定人群优化用户协议
|
||||
|
||||
#### 综合电商平台
|
||||
- 强调商品丰富性和便民服务
|
||||
- 详细说明平台入驻商家管理
|
||||
- 完善多品类退换货政策
|
||||
|
||||
#### 跨境电商
|
||||
- 说明海关和税收相关问题
|
||||
- 详细说明物流和配送政策
|
||||
- 增加汇率和支付说明
|
||||
|
||||
### 根据目标用户调整
|
||||
|
||||
#### 面向企业用户(B2B)
|
||||
- 增加企业资质验证说明
|
||||
- 详细说明批量采购和发票服务
|
||||
- 完善企业级安全保障措施
|
||||
|
||||
#### 面向个人用户(B2C)
|
||||
- 强调用户体验和便民服务
|
||||
- 详细说明个人信息保护措施
|
||||
- 增加用户教育和帮助内容
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
### 常见问题
|
||||
1. **Q: 审核被拒怎么办?**
|
||||
A: 根据审核反馈调整相应文档,重新提交审核
|
||||
|
||||
2. **Q: 需要提供哪些企业资质?**
|
||||
A: 参考审核材料清单,根据业务类型准备相应证件
|
||||
|
||||
3. **Q: 测试账号如何设置?**
|
||||
A: 按照测试账号说明文档配置测试环境
|
||||
|
||||
### 获取帮助
|
||||
- 查阅Apple开发者文档
|
||||
- 咨询专业的App上架服务商
|
||||
- 参考同类应用的成功案例
|
||||
|
||||
## 📈 版本更新记录
|
||||
|
||||
### v1.0.0 (初始版本)
|
||||
- 提供完整的法律文件模版
|
||||
- 包含技术文档和测试指南
|
||||
- 涵盖商城类APP的基本需求
|
||||
|
||||
### 后续更新计划
|
||||
- 根据App Store审核规则变化更新模版
|
||||
- 增加更多行业特定的模版内容
|
||||
- 提供多语言版本模版
|
||||
|
||||
## 📝 免责声明
|
||||
|
||||
1. 本模版仅供参考,使用前请结合实际业务情况进行调整
|
||||
2. 法律文件建议经过专业律师审核
|
||||
3. 审核规则可能变化,请以Apple官方最新要求为准
|
||||
4. 使用本模版产生的任何后果由使用者自行承担
|
||||
|
||||
## 📄 许可协议
|
||||
|
||||
本模版集合采用 MIT 许可协议,您可以自由使用、修改和分发。
|
||||
|
||||
---
|
||||
|
||||
**🌟 祝您的应用审核顺利通过,早日上线成功!**
|
||||
|
||||
如有问题或建议,欢迎提出反馈意见。
|
||||
|
||||
**信息管理**
|
||||
会员信息 Member
|
||||
团队信息
|
||||
|
|
|
@ -25,13 +25,13 @@ function getNestedValue(obj, path) {
|
|||
// 替换文件内容
|
||||
function replaceContent(content) {
|
||||
// 替换模板中的 $t('key')
|
||||
content = content.replace(
|
||||
/(?<!this\.|that\.)\$t\(['"]([^'"]+)['"]\)/g,
|
||||
(match, key) => {
|
||||
const value = getNestedValue(zhCN, key)
|
||||
return value ? `'${value}'` : match
|
||||
}
|
||||
)
|
||||
// content = content.replace(
|
||||
// /(?<!this\.|that\.)\$t\(['"]([^'"]+)['"]\)/g,
|
||||
// (match, key) => {
|
||||
// const value = getNestedValue(zhCN, key)
|
||||
// return value ? `'${value}'` : match
|
||||
// }
|
||||
// )
|
||||
|
||||
// 替换 JavaScript 中的 this.$t('key')
|
||||
content = content.replace(/this\.\$t\(['"]([^'"]+)['"]\)/g, (match, key) => {
|
||||
|
|
|
@ -64,6 +64,14 @@ export function supplierProduct(params) {
|
|||
})
|
||||
}
|
||||
|
||||
// 供应商类型
|
||||
export function getCustTypeList(params) {
|
||||
return request({
|
||||
url: '/system/pub/enums/supply-type',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
// 供应商管理列表
|
||||
export function getSupplierList(params) {
|
||||
return request({
|
||||
|
|
|
@ -0,0 +1,58 @@
|
|||
|
||||
import request from '@/utils/request'
|
||||
|
||||
// 新零售门票活动-列表
|
||||
export function ticketList(params) {
|
||||
return request({
|
||||
url: '/activity/manage/ticket/list',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
// 新零售门票活动-新增
|
||||
export function ticketSave(data) {
|
||||
return request({
|
||||
url: '/activity/manage/ticket/save',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 新零售门票活动-修改
|
||||
export function ticketUpdate(data) {
|
||||
return request({
|
||||
url: '/activity/manage/ticket/update',
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
||||
// 新零售门票活动-删除
|
||||
export function delTicket(id) {
|
||||
return request({
|
||||
url: '/activity/manage/ticket/' + id,
|
||||
method: 'delete'
|
||||
})
|
||||
}
|
||||
// 获取单条门票活动
|
||||
export function getOneTicket(id) {
|
||||
return request({
|
||||
url: '/activity/manage/ticket/getOne/' + id,
|
||||
method: 'get'
|
||||
})
|
||||
}
|
||||
// 会员消费赠送-查看
|
||||
export function memberConsumeRule(params) {
|
||||
return request({
|
||||
url: '/activity/manage/member-consume-rule/detail',
|
||||
method: 'get',
|
||||
params
|
||||
})
|
||||
}
|
||||
|
||||
// 自助购票-列表
|
||||
export function ticketQuery(data) {
|
||||
return request({
|
||||
url: '/sale/manage/ticket/query?pageNum=' + data.pageNum + '&pageSize=' + data.pageSize,
|
||||
method: 'post',
|
||||
data
|
||||
})
|
||||
}
|
|
@ -8,7 +8,7 @@ import Vue from 'vue'
|
|||
import Router from 'vue-router'
|
||||
import i18n from '@/assets/i18n/index'
|
||||
Vue.use(Router)
|
||||
|
||||
import { tickets } from './module/tickets'
|
||||
/* Layout */
|
||||
import Layout from '@/layout'
|
||||
import ParentView from '@/components/ParentView'
|
||||
|
@ -1820,6 +1820,7 @@ export const constantRoutes = [
|
|||
name: 'Activity',
|
||||
meta: { title: '营销管理', icon: 'yx', icon1: 'yxSel' },
|
||||
children: [
|
||||
...tickets,
|
||||
{
|
||||
path: 'giftGoods',
|
||||
name: 'GiftGoods',
|
||||
|
|
|
@ -0,0 +1,40 @@
|
|||
import ParentView from '@/components/ParentView'
|
||||
export const tickets = [
|
||||
{
|
||||
path: 'ticket',
|
||||
name: 'Ticket',
|
||||
component: ParentView,
|
||||
hidden: false,
|
||||
children: [
|
||||
{
|
||||
path: 'ticketList',
|
||||
name: 'TicketList',
|
||||
component: () => import('@/views/marketing/ticket/index'),
|
||||
meta: { title: '门票活动' },
|
||||
hidden: false
|
||||
},
|
||||
{
|
||||
path: 'addTicket',
|
||||
name: 'AddTicket',
|
||||
component: () => import('@/views/marketing/ticket/addTicket'),
|
||||
meta: { title: '基本信息' },
|
||||
hidden: true
|
||||
}
|
||||
]
|
||||
},
|
||||
{
|
||||
path: 'ticketQuery',
|
||||
name: 'TicketQuery',
|
||||
component: ParentView,
|
||||
hidden: false,
|
||||
children: [
|
||||
{
|
||||
path: 'ticketQueryList',
|
||||
name: 'TickeQuerytList',
|
||||
component: () => import('@/views/marketing/ticketQueryList/index'),
|
||||
meta: { title: '自助购票' },
|
||||
hidden: false
|
||||
}
|
||||
]
|
||||
}
|
||||
]
|
|
@ -0,0 +1,462 @@
|
|||
<template>
|
||||
<div class="page">
|
||||
<div class="topbox">
|
||||
<div
|
||||
v-for="(item, index) in topList"
|
||||
:key="index"
|
||||
class="levelList_i"
|
||||
:class="tabActive == item.id ? 'act' : ''"
|
||||
@click.prevent="handleLink(item.id)"
|
||||
>
|
||||
{{ item.name }}
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- <div class="main_a"> -->
|
||||
<div class="main">
|
||||
<div v-show="tabActive == 0">
|
||||
<div class="tit">{{ '基本信息' }}</div>
|
||||
<div class="xian" />
|
||||
<el-form
|
||||
ref="ruleForm"
|
||||
:model="ruleForm"
|
||||
:rules="rules"
|
||||
label-width="auto"
|
||||
class="demo-ruleForm"
|
||||
>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="'活动名称'" prop="actName">
|
||||
<el-input
|
||||
v-model="ruleForm.actName"
|
||||
clearable
|
||||
:disabled="lookOver"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="隶属体系" prop="pkVertex">
|
||||
<!-- <imageUpload v-model="ruleForm.pkVertex" /> -->
|
||||
<el-select v-model="ruleForm.pkVertex" placeholder="全部" clearable multiple>
|
||||
<el-option
|
||||
v-for="item in vertexList"
|
||||
:key="item.pkId"
|
||||
:label="item.vertexName"
|
||||
:value="item.pkId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="16">
|
||||
<el-form-item :label="'活动说明'" prop="actExplain">
|
||||
<el-input
|
||||
v-model="ruleForm.actExplain"
|
||||
type="textarea"
|
||||
:rows="6"
|
||||
placeholder="请输入活动说明"
|
||||
:disabled="lookOver"
|
||||
/>
|
||||
<!-- <editor
|
||||
ref="sptwEditor"
|
||||
v-model="ruleForm.actExplain"
|
||||
:read-only="lookOver"
|
||||
:min-height="196"
|
||||
:upload-url="uploadImgUrl"
|
||||
/> -->
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="'活动封面'" prop="actCover">
|
||||
<imageUpload v-model="ruleForm.actCover" />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="$t('门票金额')" required>
|
||||
<el-input
|
||||
v-model="ruleForm.payMoney"
|
||||
:disabled="lookOver"
|
||||
clearable
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="$t('数量')" required>
|
||||
<el-input
|
||||
v-model="ruleForm.quantity"
|
||||
:disabled="lookOver"
|
||||
clearable
|
||||
type="number"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="$t('限购数量')" required>
|
||||
<el-input
|
||||
v-model="ruleForm.limitQuantity"
|
||||
:disabled="lookOver"
|
||||
clearable
|
||||
type="number"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="'活动时间'" prop="ruleFormTime">
|
||||
<el-date-picker
|
||||
v-model="ruleForm.ruleFormTime"
|
||||
:disabled="lookOver"
|
||||
value-format="yyyy-MM-dd"
|
||||
type="daterange"
|
||||
:range-separator="'至'"
|
||||
:start-placeholder="'开始日期'"
|
||||
:end-placeholder="'结束日期'"
|
||||
@change="changeTime"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="'展示时间'" prop="ruleFormTime1">
|
||||
<el-date-picker
|
||||
v-model="ruleForm.ruleFormTime1"
|
||||
:disabled="lookOver"
|
||||
value-format="yyyy-MM-dd"
|
||||
type="daterange"
|
||||
:range-separator="'至'"
|
||||
:start-placeholder="'开始日期'"
|
||||
:end-placeholder="'结束日期'"
|
||||
@change="changeTime1"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
<!-- <directUpdata v-show="tabActive==2"
|
||||
ref="directUpdata"></directUpdata> -->
|
||||
</div>
|
||||
<div v-show="controlType != 4" class="footer">
|
||||
<el-button size="small" class="cancelBtn" @click="cancel">
|
||||
{{ '取消' }}
|
||||
</el-button>
|
||||
<el-button size="small" class="sureBtn" @click="submit('ruleForm')">
|
||||
{{ '确认' }}
|
||||
</el-button>
|
||||
</div>
|
||||
<!-- </div> -->
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import Editor from '@/components/Editor'
|
||||
|
||||
import * as api from '@/api/ticket.js'
|
||||
import ImageUpload from '@/components/ImageUpload'
|
||||
import { vertexList } from '@/api/settle.js'
|
||||
// import directUpdata from '@/views/marketing/benefitsGift/directUpdata'
|
||||
export default {
|
||||
name: 'AddTicket',
|
||||
components: {
|
||||
ImageUpload,
|
||||
// directUpdata,
|
||||
Editor
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
tabActive: 0,
|
||||
uploadImgUrl: process.env.VUE_APP_BASE_API + '/system/upload',
|
||||
ruleForm: {
|
||||
payMoney: '',
|
||||
quantity: '',
|
||||
pkVertex: '',
|
||||
limitQuantity: '',
|
||||
ruleFormTime: [],
|
||||
ruleFormTime1: []
|
||||
},
|
||||
vertexList: [],
|
||||
rules: {
|
||||
actName: [
|
||||
{ required: true, message: this.$t('请输入活动名称'), trigger: 'blur' }
|
||||
],
|
||||
actExplain: [
|
||||
{ required: true, message: this.$t('请输入活动说明'), trigger: 'blur' }
|
||||
],
|
||||
actCover: [
|
||||
{ required: true, message: this.$t('请上传活动封面'), trigger: 'change' }
|
||||
],
|
||||
payMoney: [
|
||||
{ required: true, message: this.$t('请输入金额'), trigger: 'blur' }
|
||||
],
|
||||
quantity: [
|
||||
{ required: true, message: this.$t('请输入数量'), trigger: 'blur' },
|
||||
{ type: 'number', min: 1, max: 999999, message: this.$t('数量必须在1~999999之间'), trigger: 'blur' }
|
||||
],
|
||||
limitQuantity: [
|
||||
{ required: true, message: this.$t('请输入限购数量'), trigger: 'blur' },
|
||||
{ type: 'number', min: 1, max: 999999, message: this.$t('限购数量必须在1~999999之间'), trigger: 'blur' }
|
||||
],
|
||||
ruleFormTime: [
|
||||
{ required: true, message: this.$t('请输入活动时间'), trigger: 'change' }
|
||||
],
|
||||
ruleFormTime1: [
|
||||
{ required: true, message: this.$t('请输入展示时间'), trigger: 'change' }
|
||||
]
|
||||
},
|
||||
lookOver: false,
|
||||
pkId: '',
|
||||
controlType: '',
|
||||
addData: {}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// (1=新增,2=修改,3=删除)4查看
|
||||
if (
|
||||
this.$route.query.controlType == 4 ||
|
||||
this.$route.query.controlType == 3
|
||||
) {
|
||||
this.lookOver = true
|
||||
} else {
|
||||
this.lookOver = false
|
||||
}
|
||||
this.controlType = this.$route.query.controlType
|
||||
this.pkId = this.$route.query.pkId || ''
|
||||
this.getVertexList()
|
||||
if (this.pkId) {
|
||||
this.getDetails()
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
getVertexList() {
|
||||
vertexList().then((res) => {
|
||||
this.vertexList = res.data
|
||||
})
|
||||
},
|
||||
cancel() {
|
||||
this.$router.go(-1)
|
||||
},
|
||||
getDetails() {
|
||||
api.getOneTicket(this.pkId).then((res) => {
|
||||
this.addData = res.data
|
||||
this.$set(this.ruleForm, 'actName', res.data.actName)
|
||||
this.$set(this.ruleForm, 'actExplain', res.data.actExplain)
|
||||
this.$set(this.ruleForm, 'actCover', res.data.actCover)
|
||||
this.ruleForm.pkId = res.data.pkId
|
||||
|
||||
// 处理时间字段,去掉时分秒部分,只保留日期
|
||||
const formatDateOnly = (datetime) => {
|
||||
if (!datetime) return ''
|
||||
return datetime.split(' ')[0] // 去掉时分秒,只保留日期部分
|
||||
}
|
||||
|
||||
this.ruleForm.actStartDate = formatDateOnly(res.data.actStartDate)
|
||||
this.ruleForm.actEndDate = formatDateOnly(res.data.actEndDate)
|
||||
this.ruleForm.disStartDate = formatDateOnly(res.data.disStartDate)
|
||||
this.ruleForm.disEndDate = formatDateOnly(res.data.disEndDate)
|
||||
|
||||
this.ruleForm.payMoney = res.data.payMoney
|
||||
this.ruleForm.quantity = res.data.quantity
|
||||
this.ruleForm.limitQuantity = res.data.limitQuantity
|
||||
this.ruleForm.pkVertex = res.data.pkVertex ? res.data.pkVertex.split(',').map(item => Number(item)) : []
|
||||
this.$set(this.ruleForm, 'ruleFormTime', [
|
||||
this.ruleForm.actStartDate,
|
||||
this.ruleForm.actEndDate
|
||||
])
|
||||
this.$set(this.ruleForm, 'ruleFormTime1', [
|
||||
this.ruleForm.disStartDate,
|
||||
this.ruleForm.disEndDate
|
||||
])
|
||||
// let that = this;
|
||||
// setTimeout(() => {
|
||||
// that.getCheck();
|
||||
// }, 50);
|
||||
})
|
||||
},
|
||||
// 切换tab
|
||||
handleLink(id) {
|
||||
this.tabActive = id
|
||||
},
|
||||
changeTime(val) {
|
||||
this.ruleForm.actStartDate = val[0]
|
||||
this.ruleForm.actEndDate = val[1]
|
||||
},
|
||||
changeTime1(val) {
|
||||
this.ruleForm.disStartDate = val[0]
|
||||
this.ruleForm.disEndDate = val[1]
|
||||
},
|
||||
|
||||
submit() {
|
||||
this.$refs['ruleForm'].validate((valid) => {
|
||||
if (valid) {
|
||||
let params = {}
|
||||
|
||||
// 处理时间格式,补充时分秒
|
||||
const formatDateTime = (date, isEndTime = false) => {
|
||||
if (!date) return ''
|
||||
const timeStr = isEndTime ? ' 23:59:59' : ' 00:00:00'
|
||||
return date + timeStr
|
||||
}
|
||||
|
||||
params = {
|
||||
...this.ruleForm,
|
||||
pkVertex: this.ruleForm.pkVertex ? this.ruleForm.pkVertex.join(',') : '',
|
||||
// 处理活动时间,补充时分秒
|
||||
actStartDate: formatDateTime(this.ruleForm.actStartDate, false),
|
||||
actEndDate: formatDateTime(this.ruleForm.actEndDate, true),
|
||||
// 处理展示时间,补充时分秒
|
||||
disStartDate: formatDateTime(this.ruleForm.disStartDate, false),
|
||||
disEndDate: formatDateTime(this.ruleForm.disEndDate, true)
|
||||
}
|
||||
|
||||
if (this.controlType == 1) {
|
||||
api.ticketSave(params).then((res) => {
|
||||
if (res.code == 200) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
})
|
||||
this.$router.push({
|
||||
path: 'TicketList'
|
||||
})
|
||||
}
|
||||
})
|
||||
} else {
|
||||
api.ticketUpdate(params).then((res) => {
|
||||
if (res.code == 200) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
})
|
||||
this.$router.push({
|
||||
path: 'TicketList'
|
||||
})
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.page {
|
||||
padding: 20px;
|
||||
background: #f9f9f9;
|
||||
font-size: 14px;
|
||||
|
||||
.main_a {
|
||||
height: calc(100vh - 144px);
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.main {
|
||||
background: #ffffff;
|
||||
border-radius: 8px;
|
||||
// height: calc(100vh - 124px);
|
||||
box-shadow: 0px 2px 20px 0px rgba(238, 238, 238, 0.5);
|
||||
}
|
||||
|
||||
::v-deep .el-select {
|
||||
width: 100%;
|
||||
}
|
||||
}
|
||||
|
||||
.footer {
|
||||
height: 68px;
|
||||
background: #ffffff;
|
||||
box-shadow: 0px -3px 20px 0px rgba(204, 204, 204, 0.5);
|
||||
// margin: 0 20px;
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
|
||||
.thebtn1 {
|
||||
background: #3181e5;
|
||||
color: #ffffff;
|
||||
padding: 9px 45px;
|
||||
}
|
||||
|
||||
.thebtn2 {
|
||||
background: #cccccc;
|
||||
color: #ffffff;
|
||||
padding: 9px 45px;
|
||||
}
|
||||
}
|
||||
|
||||
.tit {
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
color: #333333;
|
||||
padding: 0 20px;
|
||||
border-left: 5px solid #c8161d;
|
||||
margin: 20px 0 10px 0;
|
||||
}
|
||||
|
||||
.xian {
|
||||
height: 1px;
|
||||
background: rgba(0, 0, 0, 0.1);
|
||||
}
|
||||
|
||||
.demo-ruleForm {
|
||||
padding: 20px 0;
|
||||
}
|
||||
|
||||
::v-deep .el-date-editor--datetimerange {
|
||||
width: auto !important;
|
||||
}
|
||||
|
||||
.flexed {
|
||||
display: flex;
|
||||
}
|
||||
|
||||
.flexed_l {
|
||||
margin-right: 20px;
|
||||
}
|
||||
|
||||
.topbox {
|
||||
align-items: center;
|
||||
padding: 0px 0 5px 0;
|
||||
display: flex;
|
||||
// background: skyblue;
|
||||
.levelList_i {
|
||||
padding: 4px 15px;
|
||||
margin-left: 20px;
|
||||
position: relative;
|
||||
cursor: pointer;
|
||||
min-width: 88px;
|
||||
// height: 28px;
|
||||
border-radius: 17px;
|
||||
border: 1px solid #cccccc;
|
||||
font-size: 12px;
|
||||
font-family: MicrosoftYaHei;
|
||||
text-align: center;
|
||||
// line-height: 28px;
|
||||
}
|
||||
|
||||
.act {
|
||||
color: #ffffff;
|
||||
background: #c8161d;
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-form-item {
|
||||
margin-bottom: 20px !important;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,335 @@
|
|||
<template>
|
||||
<div class="page">
|
||||
<topBar
|
||||
v-if="topList.length > 0"
|
||||
:top-list="topList"
|
||||
:moren="moren"
|
||||
/>
|
||||
<div class="main">
|
||||
<div class="form_all">
|
||||
<el-form ref="select" :model="select" label-width="auto">
|
||||
<el-row :gutter="40">
|
||||
<!-- 一层 -->
|
||||
<el-col :span="4">
|
||||
<el-form-item :label="'活动名称'">
|
||||
<el-input v-model="select.actName" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item :label="$t('活动时间')">
|
||||
<el-date-picker
|
||||
v-model="creationTime"
|
||||
value-format="yyyy-MM-dd HH:mm:ss"
|
||||
type="datetimerange"
|
||||
:range-separator="'至'"
|
||||
:start-placeholder="'开始日期'"
|
||||
:end-placeholder="'结束日期'"
|
||||
@change="changeTime"
|
||||
/>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-button type="primary" size="small" @click="getDataList">
|
||||
{{ '搜索' }}</el-button>
|
||||
<el-button size="small" class="resetBtn" @click="reset">
|
||||
{{ '重置' }}</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="main_a">
|
||||
<div class="mainbtn">
|
||||
<el-button
|
||||
v-hasButtons="['TourismActAdd']"
|
||||
size="small"
|
||||
class="addBtn"
|
||||
@click="openDig"
|
||||
>{{ '添加' }}</el-button>
|
||||
</div>
|
||||
<div class="maintable">
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
:data="tableData"
|
||||
style="width: 100%"
|
||||
height="710px"
|
||||
:header-cell-style="{ background: '#EEEEEE' }"
|
||||
:row-class-name="tableRowClassName"
|
||||
@selection-change="handleSelectionChange"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="actName"
|
||||
width="160"
|
||||
:label="'活动名称'"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="actCover"
|
||||
:label="$t('活动封面')"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<img
|
||||
style="width: 48px; height: 48px"
|
||||
:src="scope.row.actCover"
|
||||
alt=""
|
||||
>
|
||||
</template>
|
||||
</el-table-column>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="payMoney"
|
||||
width="120"
|
||||
:label="$t('门票金额')"
|
||||
/>
|
||||
|
||||
<el-table-column align="center" prop="quantity" :label="$t('数量')" width="120" />
|
||||
|
||||
<el-table-column align="center" prop="limitQuantity" :label="$t('限购数量')" width="120" />
|
||||
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="actStartDate"
|
||||
width="160"
|
||||
:label="$t('活动开始时间')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="actEndDate"
|
||||
width="160"
|
||||
:label="$t('活动结束时间')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="disStartDate"
|
||||
width="160"
|
||||
:label="$t('活动显示开始时间')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="disEndDate"
|
||||
width="160"
|
||||
:label="$t('活动显示结束时间')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="time"
|
||||
:label="'操作'"
|
||||
fixed="right"
|
||||
>
|
||||
<template slot-scope="scope">
|
||||
<el-button
|
||||
type="text"
|
||||
style="color: #48b2fd"
|
||||
size="small"
|
||||
@click="toFixed(scope.row.pkId, 4)"
|
||||
>
|
||||
{{ '查看' }}
|
||||
</el-button>
|
||||
<el-button
|
||||
v-hasButtons="['TourismActUp']"
|
||||
type="text"
|
||||
style="color: #f3a900"
|
||||
size="small"
|
||||
@click="toFixed(scope.row.pkId, 2)"
|
||||
>
|
||||
{{ '修改' }}
|
||||
</el-button>
|
||||
<el-button
|
||||
v-hasButtons="['TourismActDel']"
|
||||
type="text"
|
||||
size="small"
|
||||
style="color: #c8161d"
|
||||
@click="toFixed(scope.row.pkId, 3)"
|
||||
>
|
||||
{{ '删除' }}
|
||||
</el-button>
|
||||
</template>
|
||||
</el-table-column>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<pagination
|
||||
v-show="total > 0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getDataList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import topBar from '@/components/topBar'
|
||||
import * as api from '@/api/ticket.js'
|
||||
export default {
|
||||
name: 'Bzpz',
|
||||
components: {
|
||||
topBar
|
||||
},
|
||||
filters: {
|
||||
isAgree(val) {
|
||||
if (!val) {
|
||||
return '允许'
|
||||
} else {
|
||||
return '禁止'
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
creationTime: [],
|
||||
creationTime1: [],
|
||||
creationTime2: [],
|
||||
select: {},
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 50
|
||||
},
|
||||
addOrEdit: '',
|
||||
total: 0,
|
||||
dialogVisible: false,
|
||||
tableData: [],
|
||||
loading: false,
|
||||
moren: 'ticketList',
|
||||
topList: [
|
||||
{
|
||||
name: '门票活动',
|
||||
path: 'ticketList'
|
||||
}
|
||||
],
|
||||
form: {
|
||||
name: ''
|
||||
}
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// 获取列表
|
||||
this.getDataList()
|
||||
},
|
||||
methods: {
|
||||
// 重置
|
||||
reset() {
|
||||
this.select = {}
|
||||
this.creationTime = []
|
||||
this.creationTime1 = []
|
||||
this.creationTime2 = []
|
||||
this.getDataList()
|
||||
},
|
||||
|
||||
changeTime(val) {
|
||||
this.select.actStartDate = val ? val[0] : ''
|
||||
this.select.actEndDate = val ? val[1] : ''
|
||||
},
|
||||
// 点击修改
|
||||
toFixed(id, index) {
|
||||
if (index == 3) {
|
||||
this.$confirm('是否确认删除该活动?', '提示', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
})
|
||||
.then(() => {
|
||||
api.delTicket(id).then((res) => {
|
||||
if (res.code == 200) {
|
||||
this.$message({
|
||||
message: res.msg,
|
||||
type: 'success'
|
||||
})
|
||||
this.getDataList()
|
||||
}
|
||||
})
|
||||
})
|
||||
.catch(() => {})
|
||||
} else {
|
||||
this.$router.push({
|
||||
path: 'AddTicket',
|
||||
query: {
|
||||
pkId: id,
|
||||
controlType: index
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
|
||||
openDig() {
|
||||
this.$router.push({
|
||||
path: 'AddTicket',
|
||||
query: {
|
||||
controlType: 1
|
||||
}
|
||||
})
|
||||
},
|
||||
|
||||
// 获取列表
|
||||
getDataList() {
|
||||
this.loading = true
|
||||
api
|
||||
.ticketList(Object.assign({}, this.queryParams, this.select))
|
||||
.then((res) => {
|
||||
this.tableData = res.rows
|
||||
this.total = res.total
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
tableRowClassName({ row, rowIndex }) {
|
||||
if (rowIndex % 2 == 1) {
|
||||
return 'warning-row'
|
||||
} else if (rowIndex % 2 == 0) {
|
||||
return 'success-row'
|
||||
}
|
||||
return ''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
::v-deep .el-table .warning-row {
|
||||
background: #f9f9f9;
|
||||
}
|
||||
|
||||
::v-deep .el-table .success-row {
|
||||
background: #ffffff;
|
||||
}
|
||||
::v-deep .el-table thead {
|
||||
color: #000000;
|
||||
}
|
||||
::v-deep .el-select {
|
||||
width: 100%;
|
||||
}
|
||||
.page {
|
||||
padding: 20px;
|
||||
background: #f9f9f9;
|
||||
font-size: 14px;
|
||||
.main {
|
||||
// background: #ffffff;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
.main_a {
|
||||
background: #fff;
|
||||
border-radius: 8px;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
box-shadow: 0px 2px 20px 0px rgba(238, 238, 238, 0.5);
|
||||
}
|
||||
.mainbtn {
|
||||
padding: 0;
|
||||
}
|
||||
.maintable {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
::v-deep .el-date-editor.el-input,
|
||||
.el-date-editor.el-input__inner {
|
||||
width: 100%;
|
||||
}
|
||||
.form_all {
|
||||
padding: 0 20px;
|
||||
margin-bottom: 10px;
|
||||
background: #fff;
|
||||
}
|
||||
</style>
|
|
@ -0,0 +1,373 @@
|
|||
<template>
|
||||
<div class="page">
|
||||
<topBar
|
||||
v-if="topList.length > 0"
|
||||
:top-list="topList"
|
||||
:moren="moren"
|
||||
/>
|
||||
<div class="main">
|
||||
<div class="form_all">
|
||||
<el-form ref="select" :model="select" label-width="auto">
|
||||
<el-row :gutter="40">
|
||||
<el-col :span="4">
|
||||
<el-form-item label="会员编号">
|
||||
<el-input v-model="select.memberCode" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="会员姓名">
|
||||
<el-input v-model="select.memberName" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
|
||||
<el-col :span="4">
|
||||
<el-form-item label="活动名称">
|
||||
<el-input v-model="select.actName" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="订单编号">
|
||||
<el-input v-model="select.orderCode" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="姓名">
|
||||
<el-input v-model="select.buyName" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-form-item label="手机号">
|
||||
<el-input v-model="select.phone" clearable />
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="隶属体系">
|
||||
<el-select
|
||||
v-model="select.pkTeamListStr"
|
||||
multiple
|
||||
placeholder="请选择"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in options"
|
||||
:key="item.pkId"
|
||||
:label="item.vertexName"
|
||||
:value="item.pkId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="8">
|
||||
<el-form-item label="隶属团队">
|
||||
<el-select
|
||||
v-model="select.pkTeamCodeListStr"
|
||||
multiple
|
||||
placeholder="请选择"
|
||||
>
|
||||
<el-option
|
||||
v-for="item in teamNameList"
|
||||
:key="item.pkId"
|
||||
:label="`${item.vertexName}--${item.teamName} `"
|
||||
:value="item.pkId"
|
||||
/>
|
||||
</el-select>
|
||||
</el-form-item>
|
||||
</el-col>
|
||||
<el-col :span="4">
|
||||
<el-button type="primary" size="small" @click="getDataList">
|
||||
{{ '搜索' }}</el-button>
|
||||
<el-button size="small" class="resetBtn" @click="reset">
|
||||
{{ '重置' }}</el-button>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-form>
|
||||
</div>
|
||||
<div class="main_a">
|
||||
<div class="mainbtn">
|
||||
<el-button
|
||||
v-hasButtons="['TicketQueryExport']"
|
||||
size="small"
|
||||
class="addBtn"
|
||||
@click="handleExport"
|
||||
>导出</el-button>
|
||||
</div>
|
||||
<div class="maintable">
|
||||
<el-table
|
||||
v-loading="loading"
|
||||
:data="tableData"
|
||||
style="width: 100%"
|
||||
height="710px"
|
||||
:header-cell-style="{ background: '#EEEEEE' }"
|
||||
:row-class-name="tableRowClassName"
|
||||
@selection-change="handleSelectionChange"
|
||||
>
|
||||
<el-table-column type="selection" width="55" />
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="actName"
|
||||
width="150"
|
||||
:label="'活动名称'"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="actStartDate"
|
||||
width="150"
|
||||
:label="$t('门票开始日期')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="actEndDate"
|
||||
width="150"
|
||||
:label="$t('门票结束日期')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="memberCode"
|
||||
:label="$t('会员编号')"
|
||||
min-width="120"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="memberName"
|
||||
:label="$t('会员姓名')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="orderCode"
|
||||
:label="$t('订单编号')"
|
||||
min-width="170"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="orderAmount"
|
||||
:label="$t('订单金额')"
|
||||
min-width="150"
|
||||
/>
|
||||
<el-table-column align="center" prop="price" :label="$t('单价')" />
|
||||
<!-- <el-table-column align="center" prop="quantity" :label="$t('数量')">
|
||||
</el-table-column> -->
|
||||
<el-table-column align="center" prop="buyName" :label="$t('姓名')" />
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="phone"
|
||||
width="150"
|
||||
:label="$t('手机号')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="idCard"
|
||||
width="190"
|
||||
:label="$t('身份证号')"
|
||||
/>
|
||||
<el-table-column align="center" prop="sexVal" :label="$t('性别')" />
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="clothSize"
|
||||
:label="$t('尺码')"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="cohabitant"
|
||||
:label="$t('同住人')"
|
||||
min-width="150"
|
||||
/>
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="emergencyPhone"
|
||||
width="150"
|
||||
:label="$t('紧急联系人')"
|
||||
/>
|
||||
<el-table-column align="center" prop="vertexName" label="隶属体系" width="120" />
|
||||
<el-table-column align="center" prop="teamName" label="隶属团队" />
|
||||
<el-table-column
|
||||
align="center"
|
||||
prop="creationTime"
|
||||
label="支付时间"
|
||||
width="160"
|
||||
/>
|
||||
</el-table>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<pagination
|
||||
v-show="total > 0"
|
||||
:total="total"
|
||||
:page.sync="queryParams.pageNum"
|
||||
:limit.sync="queryParams.pageSize"
|
||||
@pagination="getDataList"
|
||||
/>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import topBar from '@/components/topBar'
|
||||
import * as api from '@/api/ticket.js'
|
||||
import { vertexList, memberTeam } from '@/api/settle.js'
|
||||
export default {
|
||||
name: 'Bzpz',
|
||||
components: {
|
||||
topBar
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
creationTime: [],
|
||||
creationTime1: [],
|
||||
creationTime2: [],
|
||||
select: {},
|
||||
// 查询参数
|
||||
queryParams: {
|
||||
pageNum: 1,
|
||||
pageSize: 50
|
||||
},
|
||||
addOrEdit: '',
|
||||
total: 0,
|
||||
dialogVisible: false,
|
||||
tableData: [],
|
||||
loading: false,
|
||||
moren: 'ticketQueryList',
|
||||
topList: [
|
||||
{
|
||||
name: '自助购票',
|
||||
path: 'ticketQueryList'
|
||||
}
|
||||
],
|
||||
form: {
|
||||
name: ''
|
||||
},
|
||||
actStatus: [],
|
||||
teamNameList: [],
|
||||
options: []
|
||||
}
|
||||
},
|
||||
mounted() {
|
||||
// 获取下拉
|
||||
this.getData()
|
||||
// 获取列表
|
||||
this.getDataList()
|
||||
},
|
||||
methods: {
|
||||
// 重置
|
||||
reset() {
|
||||
this.select = {}
|
||||
this.creationTime = []
|
||||
this.creationTime1 = []
|
||||
this.creationTime2 = []
|
||||
this.getDataList()
|
||||
},
|
||||
getData() {
|
||||
vertexList().then((res) => {
|
||||
this.options = res.data
|
||||
})
|
||||
memberTeam().then((res) => {
|
||||
this.teamNameList = res.rows
|
||||
})
|
||||
},
|
||||
changeTime(val) {
|
||||
this.select.actStartDate = val ? val[0] : ''
|
||||
this.select.actEndDate = val ? val[1] : ''
|
||||
},
|
||||
handleClose() {
|
||||
this.dialogVisible = false
|
||||
this.$refs['form'].clearValidate()
|
||||
this.$refs['form'].resetFields()
|
||||
},
|
||||
// 获取列表
|
||||
getDataList() {
|
||||
this.loading = true
|
||||
api
|
||||
.ticketQuery(Object.assign({}, this.queryParams, this.select))
|
||||
.then((res) => {
|
||||
this.tableData = res.rows
|
||||
this.total = res.total
|
||||
this.loading = false
|
||||
})
|
||||
},
|
||||
handleSelectionChange(val) {},
|
||||
/** 导出按钮操作 */
|
||||
handleExport() {
|
||||
this.$confirm('是否确认导出所有数据项?', '警告', {
|
||||
confirmButtonText: '确定',
|
||||
cancelButtonText: '取消',
|
||||
type: 'warning'
|
||||
}).then((_) => {
|
||||
this.download(
|
||||
'/sale/manage/ticket/export',
|
||||
Object.assign(
|
||||
{},
|
||||
{
|
||||
actType: 22
|
||||
},
|
||||
this.queryParams,
|
||||
this.select
|
||||
),
|
||||
`自助购票${new Date().getTime()}.xlsx`
|
||||
)
|
||||
})
|
||||
},
|
||||
tableRowClassName({ row, rowIndex }) {
|
||||
if (rowIndex % 2 == 1) {
|
||||
return 'warning-row'
|
||||
} else if (rowIndex % 2 == 0) {
|
||||
return 'success-row'
|
||||
}
|
||||
return ''
|
||||
}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
::v-deep .el-table .warning-row {
|
||||
background: #f9f9f9;
|
||||
}
|
||||
|
||||
::v-deep .el-table .success-row {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
::v-deep .el-table thead {
|
||||
color: #000000;
|
||||
}
|
||||
|
||||
::v-deep .el-select {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.page {
|
||||
padding: 20px;
|
||||
background: #f9f9f9;
|
||||
font-size: 14px;
|
||||
|
||||
.main {
|
||||
// background: #ffffff;
|
||||
border-radius: 8px;
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
|
||||
.main_a {
|
||||
background: #fff;
|
||||
border-radius: 8px;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
box-shadow: 0px 2px 20px 0px rgba(238, 238, 238, 0.5);
|
||||
}
|
||||
|
||||
.mainbtn {
|
||||
padding: 0;
|
||||
}
|
||||
|
||||
.maintable {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
::v-deep .el-date-editor.el-input,
|
||||
.el-date-editor.el-input__inner {
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
.form_all {
|
||||
padding: 0 20px;
|
||||
margin-bottom: 10px;
|
||||
background: #fff;
|
||||
}
|
||||
</style>
|
|
@ -351,6 +351,12 @@ export default {
|
|||
site.areaList().then((res) => {
|
||||
this.areaData = res.data
|
||||
})
|
||||
this.getCustTypeList()
|
||||
},
|
||||
getCustTypeList() {
|
||||
api.getCustTypeList().then((res) => {
|
||||
this.custTypeList = res.data
|
||||
})
|
||||
},
|
||||
reset() {
|
||||
this.select = {}
|
||||
|
|
|
@ -0,0 +1,203 @@
|
|||
# iOS商城APP审核材料清单
|
||||
|
||||
## 📋 必备文档清单
|
||||
|
||||
### ✅ 法律合规文件
|
||||
- [ ] 隐私政策(已提供模版)
|
||||
- [ ] 用户服务协议(已提供模版)
|
||||
- [ ] 退换货政策(已提供模版)
|
||||
- [ ] 营业执照副本
|
||||
- [ ] 税务登记证明
|
||||
- [ ] 组织机构代码证(如需要)
|
||||
|
||||
### ✅ 特殊经营许可(根据商品类型选择)
|
||||
- [ ] 食品经营许可证(销售食品)
|
||||
- [ ] 药品经营许可证(销售药品/保健品)
|
||||
- [ ] 化妆品生产许可证(销售化妆品)
|
||||
- [ ] 出版物经营许可证(销售图书音像)
|
||||
- [ ] 3C认证证书(销售电子产品)
|
||||
- [ ] 其他行业特殊许可证
|
||||
|
||||
### ✅ 应用基本信息
|
||||
- [ ] 应用名称(无侵权)
|
||||
- [ ] 应用描述(已提供模版)
|
||||
- [ ] 关键词列表
|
||||
- [ ] 应用分类选择
|
||||
- [ ] 年龄分级设置
|
||||
- [ ] 支持的设备类型
|
||||
|
||||
## 🖼️ 视觉素材清单
|
||||
|
||||
### ✅ 应用图标
|
||||
- [ ] 1024x1024px PNG格式图标
|
||||
- [ ] 无圆角、无透明背景
|
||||
- [ ] 符合Apple设计规范
|
||||
|
||||
### ✅ 应用截图
|
||||
**iPhone截图:**
|
||||
- [ ] 6.5寸屏幕截图(至少3张,最多10张)
|
||||
- [ ] 5.5寸屏幕截图(至少3张,最多10张)
|
||||
|
||||
**iPad截图(如支持):**
|
||||
- [ ] 12.9寸屏幕截图
|
||||
- [ ] 11寸屏幕截图
|
||||
|
||||
**截图内容要求:**
|
||||
- [ ] 首页展示图
|
||||
- [ ] 商品详情页
|
||||
- [ ] 购物车/结算页
|
||||
- [ ] 订单管理页
|
||||
- [ ] 个人中心页
|
||||
|
||||
### ✅ 应用预览视频(可选但推荐)
|
||||
- [ ] 最长30秒的演示视频
|
||||
- [ ] 展示核心购物流程
|
||||
- [ ] 高质量录制,无水印
|
||||
|
||||
## 💳 支付相关文件
|
||||
|
||||
### ✅ 支付合规说明
|
||||
- [ ] 不使用App Store内购的说明文档
|
||||
- [ ] 第三方支付平台合作协议
|
||||
- [ ] 支付流程安全说明
|
||||
- [ ] 支付数据保护措施
|
||||
|
||||
### ✅ 发票系统
|
||||
- [ ] 电子发票功能说明
|
||||
- [ ] 税务合规证明
|
||||
- [ ] 发票开具流程文档
|
||||
|
||||
## 🔧 技术文档
|
||||
|
||||
### ✅ 应用功能说明
|
||||
- [ ] 详细功能列表
|
||||
- [ ] 技术架构说明
|
||||
- [ ] 第三方服务集成列表
|
||||
- [ ] API接口文档(主要功能)
|
||||
|
||||
### ✅ 数据安全文档
|
||||
- [ ] 数据加密方案
|
||||
- [ ] 用户信息保护措施
|
||||
- [ ] 服务器安全证书
|
||||
- [ ] 数据存储位置说明
|
||||
|
||||
### ✅ 测试相关(已提供模版)
|
||||
- [ ] 测试账号和密码
|
||||
- [ ] 测试流程指南
|
||||
- [ ] 测试商品信息
|
||||
- [ ] 测试环境说明
|
||||
|
||||
## 📞 客服支持
|
||||
|
||||
### ✅ 客服体系
|
||||
- [ ] 客服联系方式(电话、邮箱)
|
||||
- [ ] 在线客服功能
|
||||
- [ ] 客服工作时间说明
|
||||
- [ ] 常见问题解答
|
||||
|
||||
### ✅ 售后服务
|
||||
- [ ] 售后服务流程
|
||||
- [ ] 质量保证说明
|
||||
- [ ] 投诉处理机制
|
||||
- [ ] 纠纷解决方案
|
||||
|
||||
## 🏢 企业资质
|
||||
|
||||
### ✅ 基本企业信息
|
||||
- [ ] 公司全称
|
||||
- [ ] 注册地址
|
||||
- [ ] 法定代表人信息
|
||||
- [ ] 联系电话和邮箱
|
||||
- [ ] 公司官网(如有)
|
||||
|
||||
### ✅ 开发者账号
|
||||
- [ ] Apple Developer账号(已注册并激活)
|
||||
- [ ] 开发者协议签署
|
||||
- [ ] 银行账户信息(用于收款)
|
||||
|
||||
## 📱 应用技术要求
|
||||
|
||||
### ✅ 应用文件
|
||||
- [ ] 最终的IPA安装包
|
||||
- [ ] 应用符合iOS最新版本要求
|
||||
- [ ] 通过基本功能测试
|
||||
- [ ] 无明显Bug和崩溃
|
||||
|
||||
### ✅ 权限说明
|
||||
- [ ] 位置权限使用说明
|
||||
- [ ] 相机权限使用说明
|
||||
- [ ] 推送通知权限说明
|
||||
- [ ] 其他敏感权限的使用说明
|
||||
|
||||
## 📊 营销材料
|
||||
|
||||
### ✅ 推广素材(可选)
|
||||
- [ ] 宣传文案
|
||||
- [ ] 产品宣传图
|
||||
- [ ] 媒体报道(如有)
|
||||
- [ ] 用户评价截图
|
||||
|
||||
## ⚠️ 特别注意事项
|
||||
|
||||
### ✅ 内容审核
|
||||
- [ ] 确保所有商品合法合规
|
||||
- [ ] 避免违禁品展示
|
||||
- [ ] 商品描述真实准确
|
||||
- [ ] 价格标注清晰
|
||||
|
||||
### ✅ 功能完整性
|
||||
- [ ] 购物流程完整可用
|
||||
- [ ] 支付功能正常运行
|
||||
- [ ] 退换货功能可操作
|
||||
- [ ] 客服功能响应正常
|
||||
|
||||
### ✅ 用户体验
|
||||
- [ ] 界面设计符合iOS规范
|
||||
- [ ] 操作流程简单直观
|
||||
- [ ] 加载速度适中
|
||||
- [ ] 错误提示友好
|
||||
|
||||
## 📝 提交前自检清单
|
||||
|
||||
### ✅ 文档准备
|
||||
- [ ] 所有必备文档已准备完毕
|
||||
- [ ] 文档中的占位符已替换为实际信息
|
||||
- [ ] 法律文件经过法务审核
|
||||
- [ ] 联系方式均为有效联系方式
|
||||
|
||||
### ✅ 应用测试
|
||||
- [ ] 完整购物流程测试通过
|
||||
- [ ] 支付功能测试正常
|
||||
- [ ] 各种异常情况处理得当
|
||||
- [ ] 在不同设备上测试通过
|
||||
|
||||
### ✅ 合规检查
|
||||
- [ ] 隐私政策与实际数据收集一致
|
||||
- [ ] 用户协议覆盖所有使用场景
|
||||
- [ ] 退换货政策符合法律要求
|
||||
- [ ] 营业资质在有效期内
|
||||
|
||||
## 📅 时间规划建议
|
||||
|
||||
### 准备阶段(2-4周)
|
||||
- 第1周:准备法律文件和企业资质
|
||||
- 第2周:制作视觉素材和应用描述
|
||||
- 第3周:准备技术文档和测试环境
|
||||
- 第4周:最终审核和提交准备
|
||||
|
||||
### 提交阶段(1-2周)
|
||||
- 应用上传和信息填写:1-2天
|
||||
- 等待审核:3-7天
|
||||
- 处理审核反馈:1-3天
|
||||
|
||||
## 💡 成功提示
|
||||
|
||||
1. **提前准备**:尽早准备各种资质和许可证
|
||||
2. **保持真实**:所有信息必须真实有效
|
||||
3. **注重细节**:小细节往往决定审核成败
|
||||
4. **及时沟通**:保持邮箱和电话畅通
|
||||
5. **耐心等待**:审核需要时间,避免频繁催促
|
||||
|
||||
---
|
||||
|
||||
**📞 如有疑问,请保留此清单作为参考,并在准备过程中逐项核对。**
|
|
@ -0,0 +1,141 @@
|
|||
# App Store 应用描述模版
|
||||
|
||||
## 应用基本信息
|
||||
|
||||
### 应用名称
|
||||
**[应用名称]** - 您的购物新选择
|
||||
|
||||
### 副标题(30字符以内)
|
||||
优质商品 便捷购物 贴心服务
|
||||
|
||||
### 应用描述
|
||||
|
||||
**【核心功能】**
|
||||
|
||||
🛍️ **精选商品** - 严选优质商品,品质保障,让您放心购买
|
||||
📱 **便捷购物** - 简洁界面设计,一键下单,购物从未如此简单
|
||||
🚚 **快速配送** - 多种配送方式,急速到达,满足您的不同需求
|
||||
💰 **优惠活动** - 每日特价,限时折扣,让您享受更多实惠
|
||||
🔒 **安全支付** - 多种支付方式,银行级安全保障,交易更安全
|
||||
⭐ **品质服务** - 专业客服团队,7×24小时在线,随时为您服务
|
||||
|
||||
**【主要特色】**
|
||||
|
||||
✅ 商品分类清晰,快速找到心仪商品
|
||||
✅ 个性化推荐,发现更多惊喜好物
|
||||
✅ 实时订单跟踪,掌握配送进度
|
||||
✅ 7天无理由退货,购物无忧保障
|
||||
✅ 会员积分系统,购物越多越划算
|
||||
✅ 收藏夹功能,随时关注心愿商品
|
||||
|
||||
**【适用人群】**
|
||||
|
||||
👨👩👧👦 注重品质生活的家庭用户
|
||||
💼 追求效率的职场精英
|
||||
🎓 喜欢网购的年轻用户
|
||||
👴👵 寻求便捷的中老年用户
|
||||
|
||||
**【为什么选择我们】**
|
||||
|
||||
• 商品质量严格把控,假一赔十承诺
|
||||
• 价格透明公道,不定期优惠活动
|
||||
• 配送覆盖全国,部分地区当日达
|
||||
• 退换货政策灵活,售后服务完善
|
||||
• 界面简洁易用,操作简单便捷
|
||||
|
||||
立即下载,开启您的品质购物之旅!
|
||||
|
||||
### 关键词(100字符以内)
|
||||
购物,商城,电商,网购,优惠,特价,品质,快递,服务,安全
|
||||
|
||||
### 应用分类
|
||||
主分类:购物
|
||||
次分类:购物
|
||||
|
||||
### 年龄分级
|
||||
4+ (适合所有年龄)
|
||||
|
||||
## 应用截图说明
|
||||
|
||||
### iPhone 截图(6.5寸)
|
||||
1. **首页展示** - 展示精美的首页设计,包含轮播图、分类导航、推荐商品
|
||||
2. **商品详情** - 显示商品详细页面,包含高清图片、详细描述、用户评价
|
||||
3. **购物车** - 展示购物车功能,商品管理、价格计算、结算流程
|
||||
4. **订单管理** - 显示订单列表,包含不同状态的订单和操作按钮
|
||||
5. **个人中心** - 展示用户个人信息、设置选项、服务功能
|
||||
|
||||
### iPhone 截图(5.5寸)
|
||||
同6.5寸截图内容,适配5.5寸屏幕尺寸
|
||||
|
||||
### iPad 截图(如支持iPad)
|
||||
展示iPad适配的界面设计,突出大屏幕的优势
|
||||
|
||||
## 应用预览视频脚本
|
||||
|
||||
**时长:25-30秒**
|
||||
|
||||
### 分镜脚本
|
||||
1. **开场(3秒)** - 应用logo动画,简洁标题
|
||||
2. **首页浏览(5秒)** - 展示首页滑动,商品分类浏览
|
||||
3. **商品选择(6秒)** - 点击商品,查看详情,加入购物车
|
||||
4. **下单流程(8秒)** - 购物车结算,选择地址,支付成功
|
||||
5. **订单跟踪(5秒)** - 查看订单状态,物流信息
|
||||
6. **结尾(3秒)** - 应用名称,下载提示
|
||||
|
||||
### 配音文案
|
||||
"发现好物,一触即达。[应用名称],让购物更简单,让生活更美好。立即下载,开启品质购物新体验!"
|
||||
|
||||
## 版本更新说明模版
|
||||
|
||||
### 新版本特性
|
||||
- 🎉 全新界面设计,购物体验更流畅
|
||||
- 🔍 优化搜索功能,快速找到心仪商品
|
||||
- 💳 新增支付方式,支付更便捷
|
||||
- 🚚 物流信息实时更新,配送状态随时掌握
|
||||
- 🐛 修复已知问题,提升应用稳定性
|
||||
|
||||
### Bug修复
|
||||
- 修复了购物车偶尔显示异常的问题
|
||||
- 优化了商品图片加载速度
|
||||
- 修复了支付过程中的偶发闪退
|
||||
- 改进了推送通知的及时性
|
||||
|
||||
## 审核说明文档
|
||||
|
||||
### 应用类型说明
|
||||
本应用是一个综合性电子商务平台,为用户提供商品浏览、购买、支付、配送等服务。
|
||||
|
||||
### 主要功能
|
||||
1. 商品展示和搜索
|
||||
2. 购物车和订单管理
|
||||
3. 第三方支付集成
|
||||
4. 用户账户管理
|
||||
5. 客服和售后服务
|
||||
|
||||
### 盈利模式
|
||||
- 商品销售佣金
|
||||
- 广告位展示
|
||||
- 会员服务费用
|
||||
- 物流配送服务
|
||||
|
||||
### 目标用户
|
||||
面向18岁以上的成年用户,提供便捷的购物服务。
|
||||
|
||||
### 合规声明
|
||||
- 严格遵守《电子商务法》等相关法律法规
|
||||
- 建立完善的商品质量管控体系
|
||||
- 保护用户个人信息和支付安全
|
||||
- 提供完善的售后服务保障
|
||||
|
||||
## 填写说明
|
||||
|
||||
请在提交前将所有 `[插入内容]` 的占位符替换为实际信息:
|
||||
|
||||
- `[应用名称]` - 您的应用实际名称
|
||||
- `[公司名称]` - 您的公司全称
|
||||
- `[插入日期]` - 当前日期
|
||||
- `[插入邮箱地址]` - 客服邮箱
|
||||
- `[插入电话号码]` - 客服电话
|
||||
- `[插入公司地址]` - 公司注册地址
|
||||
|
||||
根据您的实际业务情况调整内容,确保描述准确反映应用功能和特色。
|
|
@ -0,0 +1,451 @@
|
|||
# 技术文档说明
|
||||
|
||||
## 应用基本信息
|
||||
|
||||
### 应用概述
|
||||
- **应用名称**:[应用名称]
|
||||
- **应用类型**:iOS原生电商购物应用
|
||||
- **开发语言**:Swift / Objective-C
|
||||
- **最低支持版本**:iOS 12.0
|
||||
- **目标设备**:iPhone、iPad(通用应用)
|
||||
|
||||
### 技术栈
|
||||
- **前端框架**:UIKit / SwiftUI
|
||||
- **网络请求**:URLSession / Alamofire
|
||||
- **图片缓存**:SDWebImage / Kingfisher
|
||||
- **数据库**:Core Data / SQLite
|
||||
- **支付SDK**:支付宝SDK、微信支付SDK、银联SDK
|
||||
- **推送服务**:APNs (Apple Push Notification Service)
|
||||
|
||||
## 应用架构设计
|
||||
|
||||
### 整体架构
|
||||
```
|
||||
┌─────────────────────────────────────┐
|
||||
│ 表现层 (UI Layer) │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │ 商品展示 │ │ 购物车 │ │ 个人中心 │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ │
|
||||
├─────────────────────────────────────┤
|
||||
│ 业务逻辑层 (Service) │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │ 商品服务 │ │ 订单服务 │ │ 用户服务 │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ │
|
||||
├─────────────────────────────────────┤
|
||||
│ 数据访问层 (Data) │
|
||||
│ ┌─────────┐ ┌─────────┐ ┌─────────┐ │
|
||||
│ │ 网络请求 │ │ 本地存储 │ │ 缓存管理 │ │
|
||||
│ └─────────┘ └─────────┘ └─────────┘ │
|
||||
└─────────────────────────────────────┘
|
||||
```
|
||||
|
||||
### 模块划分
|
||||
1. **用户模块**:注册、登录、个人信息管理
|
||||
2. **商品模块**:商品展示、搜索、分类浏览
|
||||
3. **购物车模块**:商品添加、数量管理、结算
|
||||
4. **订单模块**:订单创建、支付、状态跟踪
|
||||
5. **支付模块**:多种支付方式集成
|
||||
6. **客服模块**:在线客服、帮助中心
|
||||
|
||||
## 核心功能实现
|
||||
|
||||
### 1. 用户认证系统
|
||||
```swift
|
||||
// 用户登录流程
|
||||
class UserAuthService {
|
||||
func login(phone: String, code: String) -> Promise<User> {
|
||||
// 1. 验证手机号格式
|
||||
// 2. 发送登录请求到服务器
|
||||
// 3. 获取用户token
|
||||
// 4. 保存用户信息到本地
|
||||
// 5. 返回用户对象
|
||||
}
|
||||
|
||||
func logout() {
|
||||
// 清除本地用户数据和token
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 商品数据管理
|
||||
```swift
|
||||
// 商品数据模型
|
||||
struct Product {
|
||||
let id: String
|
||||
let name: String
|
||||
let price: Decimal
|
||||
let images: [String]
|
||||
let description: String
|
||||
let category: Category
|
||||
}
|
||||
|
||||
// 商品服务
|
||||
class ProductService {
|
||||
func fetchProducts(page: Int) -> Promise<[Product]> {
|
||||
// 分页获取商品列表
|
||||
}
|
||||
|
||||
func searchProducts(keyword: String) -> Promise<[Product]> {
|
||||
// 商品搜索功能
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 购物车实现
|
||||
```swift
|
||||
// 购物车管理
|
||||
class ShoppingCart {
|
||||
private var items: [CartItem] = []
|
||||
|
||||
func addItem(_ product: Product, quantity: Int) {
|
||||
// 添加商品到购物车
|
||||
}
|
||||
|
||||
func removeItem(_ productId: String) {
|
||||
// 从购物车移除商品
|
||||
}
|
||||
|
||||
func calculateTotal() -> Decimal {
|
||||
// 计算购物车总价
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 4. 订单处理流程
|
||||
```swift
|
||||
// 订单创建和处理
|
||||
class OrderService {
|
||||
func createOrder(items: [CartItem], address: Address) -> Promise<Order> {
|
||||
// 1. 验证商品库存
|
||||
// 2. 计算总价和运费
|
||||
// 3. 创建订单记录
|
||||
// 4. 返回订单信息
|
||||
}
|
||||
|
||||
func processPayment(order: Order, paymentMethod: PaymentMethod) -> Promise<PaymentResult> {
|
||||
// 调用相应的支付SDK处理支付
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 第三方服务集成
|
||||
|
||||
### 1. 支付服务
|
||||
**支付宝集成:**
|
||||
```swift
|
||||
import AlipaySDK
|
||||
|
||||
class AlipayService {
|
||||
func processPayment(orderInfo: String) {
|
||||
AlipaySDK.defaultService().payOrder(orderInfo, fromScheme: "yourapp") { result in
|
||||
// 处理支付结果
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
**微信支付集成:**
|
||||
```swift
|
||||
import WechatOpenSDK
|
||||
|
||||
class WeChatPayService {
|
||||
func processPayment(req: PayReq) {
|
||||
WXApi.send(req) { success in
|
||||
// 处理支付结果
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 推送通知
|
||||
```swift
|
||||
import UserNotifications
|
||||
|
||||
class PushNotificationService {
|
||||
func registerForPushNotifications() {
|
||||
UNUserNotificationCenter.current().requestAuthorization(options: [.alert, .sound, .badge]) { granted, error in
|
||||
if granted {
|
||||
DispatchQueue.main.async {
|
||||
UIApplication.shared.registerForRemoteNotifications()
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
func handlePushNotification(_ userInfo: [AnyHashable: Any]) {
|
||||
// 处理收到的推送通知
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 图片加载和缓存
|
||||
```swift
|
||||
import SDWebImage
|
||||
|
||||
// 商品图片加载
|
||||
imageView.sd_setImage(with: URL(string: imageUrl),
|
||||
placeholderImage: UIImage(named: "placeholder"),
|
||||
options: [.progressiveLoad, .retryFailed])
|
||||
```
|
||||
|
||||
## 数据存储方案
|
||||
|
||||
### 1. 本地数据库设计
|
||||
使用Core Data进行本地数据存储:
|
||||
|
||||
```swift
|
||||
// 用户信息实体
|
||||
@objc(User)
|
||||
class User: NSManagedObject {
|
||||
@NSManaged var id: String
|
||||
@NSManaged var phone: String
|
||||
@NSManaged var nickname: String
|
||||
@NSManaged var avatar: String?
|
||||
}
|
||||
|
||||
// 购物车商品实体
|
||||
@objc(CartItem)
|
||||
class CartItem: NSManagedObject {
|
||||
@NSManaged var productId: String
|
||||
@NSManaged var quantity: Int32
|
||||
@NSManaged var addedAt: Date
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 缓存策略
|
||||
```swift
|
||||
class CacheManager {
|
||||
private let imageCache = NSCache<NSString, UIImage>()
|
||||
private let dataCache = NSCache<NSString, NSData>()
|
||||
|
||||
// 图片缓存
|
||||
func cacheImage(_ image: UIImage, forKey key: String) {
|
||||
imageCache.setObject(image, forKey: NSString(string: key))
|
||||
}
|
||||
|
||||
// 数据缓存
|
||||
func cacheData(_ data: Data, forKey key: String) {
|
||||
dataCache.setObject(data as NSData, forKey: NSString(string: key))
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 网络通信设计
|
||||
|
||||
### 1. API接口规范
|
||||
```swift
|
||||
// 网络请求基类
|
||||
class APIClient {
|
||||
private let baseURL = "https://api.yourapp.com"
|
||||
private let session = URLSession.shared
|
||||
|
||||
func request<T: Codable>(_ endpoint: APIEndpoint) -> Promise<T> {
|
||||
// 构建请求
|
||||
// 发送网络请求
|
||||
// 解析响应数据
|
||||
// 错误处理
|
||||
}
|
||||
}
|
||||
|
||||
// API端点枚举
|
||||
enum APIEndpoint {
|
||||
case login(phone: String, code: String)
|
||||
case getProducts(page: Int, category: String?)
|
||||
case createOrder(items: [CartItem], address: Address)
|
||||
case getOrderDetail(orderId: String)
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 网络错误处理
|
||||
```swift
|
||||
enum NetworkError: Error {
|
||||
case invalidURL
|
||||
case noData
|
||||
case decodingError
|
||||
case serverError(code: Int, message: String)
|
||||
case networkUnavailable
|
||||
}
|
||||
|
||||
class ErrorHandler {
|
||||
static func handle(_ error: NetworkError) {
|
||||
switch error {
|
||||
case .networkUnavailable:
|
||||
// 显示网络不可用提示
|
||||
case .serverError(let code, let message):
|
||||
// 显示服务器错误信息
|
||||
default:
|
||||
// 显示通用错误提示
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 安全措施
|
||||
|
||||
### 1. 数据加密
|
||||
```swift
|
||||
// HTTPS通信
|
||||
// 敏感数据本地存储加密
|
||||
class SecurityManager {
|
||||
func encryptSensitiveData(_ data: String) -> String {
|
||||
// 使用AES加密敏感数据
|
||||
}
|
||||
|
||||
func validateCertificate(_ trust: SecTrust) -> Bool {
|
||||
// SSL证书验证
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 用户认证
|
||||
```swift
|
||||
class TokenManager {
|
||||
private let tokenKey = "user_access_token"
|
||||
|
||||
func saveToken(_ token: String) {
|
||||
// 安全存储用户token
|
||||
let keychain = Keychain(service: "com.yourapp.keychain")
|
||||
keychain[tokenKey] = token
|
||||
}
|
||||
|
||||
func getToken() -> String? {
|
||||
let keychain = Keychain(service: "com.yourapp.keychain")
|
||||
return keychain[tokenKey]
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 性能优化
|
||||
|
||||
### 1. 图片优化
|
||||
- 使用WebP格式图片减少网络传输
|
||||
- 实现图片懒加载和预加载
|
||||
- 图片压缩和尺寸适配
|
||||
|
||||
### 2. 内存管理
|
||||
```swift
|
||||
class MemoryManager {
|
||||
func clearImageCache() {
|
||||
SDImageCache.shared.clearMemory()
|
||||
}
|
||||
|
||||
func handleMemoryWarning() {
|
||||
// 清理不必要的缓存数据
|
||||
// 释放不活跃的视图控制器
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 3. 网络优化
|
||||
- 请求合并和批处理
|
||||
- 数据压缩传输
|
||||
- 智能缓存策略
|
||||
|
||||
## 测试策略
|
||||
|
||||
### 1. 单元测试
|
||||
```swift
|
||||
class ProductServiceTests: XCTestCase {
|
||||
var productService: ProductService!
|
||||
|
||||
override func setUp() {
|
||||
super.setUp()
|
||||
productService = ProductService()
|
||||
}
|
||||
|
||||
func testFetchProducts() {
|
||||
// 测试商品获取功能
|
||||
}
|
||||
|
||||
func testSearchProducts() {
|
||||
// 测试商品搜索功能
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. UI测试
|
||||
```swift
|
||||
class ShoppingFlowUITests: XCTestCase {
|
||||
func testCompleteShoppingFlow() {
|
||||
let app = XCUIApplication()
|
||||
app.launch()
|
||||
|
||||
// 1. 测试商品浏览
|
||||
// 2. 测试添加到购物车
|
||||
// 3. 测试结算流程
|
||||
// 4. 测试支付流程
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 监控和分析
|
||||
|
||||
### 1. 崩溃监控
|
||||
```swift
|
||||
// 集成崩溃监控SDK
|
||||
import Crashlytics
|
||||
|
||||
class CrashMonitor {
|
||||
func setupCrashlytics() {
|
||||
Crashlytics.crashlytics().setUserID(currentUser.id)
|
||||
Crashlytics.crashlytics().setCustomValue(currentUser.phone, forKey: "user_phone")
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 性能监控
|
||||
```swift
|
||||
class PerformanceMonitor {
|
||||
func trackAPIResponse(endpoint: String, duration: TimeInterval) {
|
||||
// 记录API响应时间
|
||||
}
|
||||
|
||||
func trackPageLoadTime(page: String, duration: TimeInterval) {
|
||||
// 记录页面加载时间
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
## 部署和发布
|
||||
|
||||
### 1. 构建配置
|
||||
```swift
|
||||
// 不同环境的配置
|
||||
enum Environment {
|
||||
case development
|
||||
case staging
|
||||
case production
|
||||
|
||||
var baseURL: String {
|
||||
switch self {
|
||||
case .development:
|
||||
return "https://dev-api.yourapp.com"
|
||||
case .staging:
|
||||
return "https://staging-api.yourapp.com"
|
||||
case .production:
|
||||
return "https://api.yourapp.com"
|
||||
}
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### 2. 版本管理
|
||||
- 遵循语义化版本控制
|
||||
- 自动化构建和部署流程
|
||||
- A/B测试支持
|
||||
|
||||
## 维护和更新
|
||||
|
||||
### 1. 热更新支持
|
||||
- 动态配置远程获取
|
||||
- 非关键功能的动态更新
|
||||
- 紧急修复机制
|
||||
|
||||
### 2. 向后兼容
|
||||
- API版本控制
|
||||
- 渐进式功能升级
|
||||
- 旧版本支持策略
|
||||
|
||||
---
|
||||
|
||||
**注意:此文档为技术实现的概述,具体实现细节需要根据实际项目需求进行调整和完善。**
|
|
@ -0,0 +1,171 @@
|
|||
# 审核材料格式转换指南
|
||||
|
||||
## 📋 转换清单
|
||||
|
||||
### 1. 法律文件转换(隐私政策、用户协议、退换货政策)
|
||||
|
||||
#### 步骤1:Markdown转HTML
|
||||
使用在线工具或命令行工具转换:
|
||||
|
||||
**在线工具推荐:**
|
||||
- [Markdown to HTML](https://markdowntohtml.com/)
|
||||
- [Dillinger](https://dillinger.io/)
|
||||
|
||||
**命令行工具:**
|
||||
```bash
|
||||
# 使用pandoc转换
|
||||
pandoc 隐私政策模版.md -o privacy-policy.html
|
||||
|
||||
# 使用markdown-it
|
||||
markdown-it 隐私政策模版.md > privacy-policy.html
|
||||
```
|
||||
|
||||
#### 步骤2:部署网页
|
||||
将HTML文件上传到您的网站:
|
||||
- 推荐路径:`https://yourwebsite.com/privacy-policy.html`
|
||||
- 确保链接可正常访问
|
||||
- 建议使用HTTPS协议
|
||||
|
||||
#### 步骤3:在App Store Connect中填写链接
|
||||
```
|
||||
隐私政策网址:https://yourwebsite.com/privacy-policy.html
|
||||
用户协议网址:https://yourwebsite.com/user-agreement.html
|
||||
退换货政策:https://yourwebsite.com/return-policy.html
|
||||
```
|
||||
|
||||
### 2. 应用描述转换
|
||||
|
||||
#### 从模版复制内容到App Store Connect:
|
||||
1. 打开`应用描述模版.md`
|
||||
2. 复制"应用描述"部分的内容
|
||||
3. 登录App Store Connect
|
||||
4. 在应用信息页面粘贴内容
|
||||
5. 注意字符限制(4000字符)
|
||||
|
||||
#### 关键词设置:
|
||||
```
|
||||
从模版复制:购物,商城,电商,网购,优惠,特价,品质,快递,服务,安全
|
||||
粘贴到:App Store Connect > 关键词字段
|
||||
注意:总共不超过100个字符
|
||||
```
|
||||
|
||||
### 3. 测试说明转换
|
||||
|
||||
#### 将测试说明内容整理为文本:
|
||||
1. 打开`测试账号说明.md`
|
||||
2. 提取关键信息:
|
||||
- 测试账号和密码
|
||||
- 测试流程要点
|
||||
- 特殊注意事项
|
||||
|
||||
#### 在App Store Connect中填写:
|
||||
位置:**应用审核 > 审核信息 > 备注**
|
||||
|
||||
```
|
||||
测试账号:testuser001
|
||||
测试密码:Test123456
|
||||
测试流程:
|
||||
1. 使用测试账号登录
|
||||
2. 浏览商品并添加到购物车
|
||||
3. 使用沙盒支付环境完成购买
|
||||
4. 查看订单状态和物流信息
|
||||
|
||||
注意:所有支付使用沙盒环境,无真实扣费
|
||||
```
|
||||
|
||||
### 4. 截图和素材准备
|
||||
|
||||
#### 截图要求:
|
||||
- **iPhone 6.5寸**:1284 x 2778 像素
|
||||
- **iPhone 5.5寸**:1242 x 2208 像素
|
||||
- **格式**:PNG 或 JPG
|
||||
- **数量**:至少3张,最多10张
|
||||
|
||||
#### 截图内容建议(按顺序):
|
||||
1. 首页展示
|
||||
2. 商品详情页
|
||||
3. 购物车页面
|
||||
4. 订单管理页面
|
||||
5. 个人中心页面
|
||||
|
||||
#### 应用图标:
|
||||
- **尺寸**:1024 x 1024 像素
|
||||
- **格式**:PNG
|
||||
- **要求**:无圆角,无透明背景
|
||||
|
||||
### 5. 网页部署建议
|
||||
|
||||
#### 简单HTML模版:
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="zh-CN">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>隐私政策 - [应用名称]</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: Arial, sans-serif;
|
||||
line-height: 1.6;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 20px;
|
||||
}
|
||||
h1, h2, h3 { color: #333; }
|
||||
p { margin-bottom: 10px; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<!-- 这里粘贴转换后的HTML内容 -->
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
#### 部署选项:
|
||||
1. **自有服务器**:上传到您的网站
|
||||
2. **GitHub Pages**:免费静态网页托管
|
||||
3. **云服务**:阿里云、腾讯云等
|
||||
4. **CDN**:确保全球访问速度
|
||||
|
||||
### 6. 检查清单
|
||||
|
||||
#### 提交前确认:
|
||||
- [ ] 所有链接可正常访问
|
||||
- [ ] 法律文件内容完整无误
|
||||
- [ ] 应用描述符合App Store规范
|
||||
- [ ] 测试账号可正常使用
|
||||
- [ ] 截图清晰且符合尺寸要求
|
||||
- [ ] 联系方式真实有效
|
||||
|
||||
#### 常见错误避免:
|
||||
- ❌ 法律文件链接返回404错误
|
||||
- ❌ 测试账号密码错误
|
||||
- ❌ 截图包含个人隐私信息
|
||||
- ❌ 应用描述包含违规词汇
|
||||
- ❌ 联系邮箱无法正常接收邮件
|
||||
|
||||
## 🚀 快速操作流程
|
||||
|
||||
### 1小时快速转换:
|
||||
1. **15分钟**:使用在线工具转换法律文件为HTML
|
||||
2. **15分钟**:上传HTML到网站并测试链接
|
||||
3. **15分钟**:在App Store Connect填写应用信息
|
||||
4. **15分钟**:准备测试说明和截图
|
||||
|
||||
### 工具推荐:
|
||||
- **Markdown转HTML**:[markdowntohtml.com](https://markdowntohtml.com/)
|
||||
- **网页托管**:[GitHub Pages](https://pages.github.com/)
|
||||
- **截图工具**:Xcode Simulator
|
||||
- **图片压缩**:[TinyPNG](https://tinypng.com/)
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如遇到格式转换问题:
|
||||
1. 检查HTML语法是否正确
|
||||
2. 确认网页链接可访问
|
||||
3. 验证字符编码为UTF-8
|
||||
4. 测试移动设备兼容性
|
||||
|
||||
---
|
||||
|
||||
**重要提醒:提交审核前,请务必测试所有链接和功能的可用性!**
|
|
@ -0,0 +1,182 @@
|
|||
# 用户服务协议
|
||||
|
||||
**生效日期:[插入日期]**
|
||||
|
||||
## 1. 协议接受
|
||||
|
||||
欢迎使用[应用名称](以下简称"本应用"或"我们")!
|
||||
|
||||
在您注册成为用户前,请您仔细阅读本《用户服务协议》(以下简称"本协议")。请您务必审慎阅读、充分理解各条款内容,特别是免除或者限制责任的条款。
|
||||
|
||||
**您点击"同意"或"注册"按钮,即表示您已阅读并同意遵守本协议的全部条款。**
|
||||
|
||||
## 2. 服务说明
|
||||
|
||||
### 2.1 服务描述
|
||||
本应用是一个[商城类型描述,如:综合性电商平台],为用户提供商品浏览、购买、支付、配送等电子商务服务。
|
||||
|
||||
### 2.2 服务范围
|
||||
- 商品信息展示
|
||||
- 在线下单购买
|
||||
- 支付服务对接
|
||||
- 订单管理
|
||||
- 物流配送
|
||||
- 售后服务
|
||||
- 客户服务
|
||||
|
||||
### 2.3 服务变更
|
||||
我们保留随时修改或中断服务的权利,修改或中断服务不需对您或第三方承担责任。
|
||||
|
||||
## 3. 用户注册
|
||||
|
||||
### 3.1 注册条件
|
||||
- 具有完全民事行为能力的自然人
|
||||
- 具有合法经营资格的法人或其他组织
|
||||
- 未被本应用限制或禁止使用服务
|
||||
|
||||
### 3.2 注册信息
|
||||
- 您应提供真实、准确、完整的注册信息
|
||||
- 您有义务及时更新注册信息
|
||||
- 如提供虚假信息,我们有权拒绝提供服务
|
||||
|
||||
### 3.3 账户安全
|
||||
- 您有责任保管好自己的账户和密码
|
||||
- 您应对账户下的所有活动承担责任
|
||||
- 发现账户被盗用应立即通知我们
|
||||
|
||||
## 4. 用户行为规范
|
||||
|
||||
### 4.1 合法使用
|
||||
您在使用本应用时应当遵守法律法规,不得:
|
||||
- 发布违法违规信息
|
||||
- 侵犯他人知识产权
|
||||
- 进行欺诈、虚假交易
|
||||
- 恶意刷单或评价
|
||||
- 传播病毒或恶意代码
|
||||
|
||||
### 4.2 禁止行为
|
||||
- 破解、修改应用程序
|
||||
- 利用应用从事违法活动
|
||||
- 干扰应用正常运营
|
||||
- 盗用他人账户
|
||||
- 发布垃圾信息
|
||||
|
||||
### 4.3 违规后果
|
||||
违反本协议的用户,我们有权采取以下措施:
|
||||
- 警告提醒
|
||||
- 限制功能使用
|
||||
- 暂停账户服务
|
||||
- 永久封禁账户
|
||||
- 追究法律责任
|
||||
|
||||
## 5. 商品和交易
|
||||
|
||||
### 5.1 商品信息
|
||||
- 商品信息由商家提供,我们尽力确保准确性
|
||||
- 商品图片仅供参考,以实物为准
|
||||
- 商品价格可能随时调整
|
||||
|
||||
### 5.2 订单处理
|
||||
- 订单提交后不代表交易成立
|
||||
- 我们有权审核订单并决定是否接受
|
||||
- 库存不足时我们会及时通知您
|
||||
|
||||
### 5.3 支付方式
|
||||
- 支持多种支付方式
|
||||
- 支付成功后订单生效
|
||||
- 支付信息由第三方支付机构处理
|
||||
|
||||
### 5.4 配送服务
|
||||
- 配送范围和时间以页面显示为准
|
||||
- 配送费用根据商品和地址计算
|
||||
- 特殊情况可能影响配送时效
|
||||
|
||||
## 6. 退换货政策
|
||||
|
||||
### 6.1 退货条件
|
||||
- 商品质量问题
|
||||
- 商品与描述不符
|
||||
- 7天无理由退货(法律规定的除外商品)
|
||||
|
||||
### 6.2 退货流程
|
||||
1. 在线申请退货
|
||||
2. 客服审核通过
|
||||
3. 寄回商品
|
||||
4. 验收合格后退款
|
||||
|
||||
### 6.3 不支持退货的情况
|
||||
- 个人定制商品
|
||||
- 鲜活易腐商品
|
||||
- 已拆封的音像制品、软件
|
||||
- 其他法律规定不宜退货的商品
|
||||
|
||||
## 7. 知识产权
|
||||
|
||||
### 7.1 平台权利
|
||||
本应用的商标、版权、专利等知识产权归我们所有,未经许可不得使用。
|
||||
|
||||
### 7.2 用户内容
|
||||
- 您保证拥有上传内容的合法权利
|
||||
- 您授权我们使用您上传的内容
|
||||
- 侵犯他人权益的,您承担全部责任
|
||||
|
||||
## 8. 免责声明
|
||||
|
||||
### 8.1 系统风险
|
||||
- 网络中断、系统故障等不可抗力因素
|
||||
- 黑客攻击、病毒侵害等安全风险
|
||||
- 第三方服务商的服务中断
|
||||
|
||||
### 8.2 交易风险
|
||||
- 商品质量由商家负责
|
||||
- 配送延误、遗失等风险
|
||||
- 支付风险由支付机构承担
|
||||
|
||||
### 8.3 责任限制
|
||||
在法律允许的范围内,我们的赔偿责任不超过用户的直接损失。
|
||||
|
||||
## 9. 隐私保护
|
||||
|
||||
我们按照《隐私政策》保护您的个人信息,《隐私政策》是本协议的重要组成部分。
|
||||
|
||||
## 10. 协议修改
|
||||
|
||||
### 10.1 修改权利
|
||||
我们保留随时修改本协议的权利。
|
||||
|
||||
### 10.2 通知方式
|
||||
协议修改后将在应用内公布,重大修改会通过邮件或短信通知。
|
||||
|
||||
### 10.3 生效时间
|
||||
修改后的协议自公布之日起生效。
|
||||
|
||||
## 11. 争议解决
|
||||
|
||||
### 11.1 协商解决
|
||||
发生争议时,双方应友好协商解决。
|
||||
|
||||
### 11.2 法律适用
|
||||
本协议适用中华人民共和国法律。
|
||||
|
||||
### 11.3 管辖法院
|
||||
争议由[公司所在地]人民法院管辖。
|
||||
|
||||
## 12. 其他条款
|
||||
|
||||
### 12.1 协议效力
|
||||
本协议部分条款无效不影响其他条款的效力。
|
||||
|
||||
### 12.2 协议解释
|
||||
本协议的解释权归我们所有。
|
||||
|
||||
### 12.3 联系方式
|
||||
如有疑问,请联系客服:
|
||||
- 邮箱:[插入邮箱地址]
|
||||
- 电话:[插入电话号码]
|
||||
- 在线客服:应用内客服功能
|
||||
|
||||
---
|
||||
|
||||
**[公司名称]**
|
||||
**地址:[插入公司地址]**
|
||||
**最后更新日期:[插入日期]**
|
|
@ -0,0 +1,185 @@
|
|||
# 退换货政策
|
||||
|
||||
**生效日期:[插入日期]**
|
||||
|
||||
## 1. 总则
|
||||
|
||||
为了保障消费者合法权益,规范退换货服务,我们制定本退换货政策。本政策适用于通过[应用名称]购买的所有商品。
|
||||
|
||||
## 2. 7天无理由退货
|
||||
|
||||
### 2.1 适用范围
|
||||
根据《消费者权益保护法》,除特殊商品外,消费者有权自收到商品之日起7日内无理由退货。
|
||||
|
||||
### 2.2 退货条件
|
||||
- 商品完好,包装完整
|
||||
- 不影响二次销售
|
||||
- 标签、吊牌等齐全
|
||||
- 赠品一并退回
|
||||
|
||||
### 2.3 不适用7天无理由退货的商品
|
||||
- 消费者定制的商品
|
||||
- 鲜活易腐的商品
|
||||
- 在线下载或者消费者拆封的音像制品、计算机软件等数字化商品
|
||||
- 交付的报纸、期刊
|
||||
- 其他根据商品性质并经消费者在购买时确认不宜退货的商品
|
||||
|
||||
## 3. 质量问题退换货
|
||||
|
||||
### 3.1 适用情况
|
||||
- 商品存在质量缺陷
|
||||
- 商品与网站描述不符
|
||||
- 商品在运输过程中损坏
|
||||
- 收到错误商品
|
||||
|
||||
### 3.2 处理方式
|
||||
- 免费退货并全额退款
|
||||
- 免费换货(同款或等价商品)
|
||||
- 维修服务(适用于电子产品等)
|
||||
|
||||
### 3.3 时效要求
|
||||
- 签收后15日内提出申请
|
||||
- 特殊商品按照三包规定执行
|
||||
|
||||
## 4. 退换货流程
|
||||
|
||||
### 4.1 申请退换货
|
||||
1. 登录应用,进入"我的订单"
|
||||
2. 选择需要退换货的订单
|
||||
3. 点击"申请退换货"
|
||||
4. 填写退换货原因和相关信息
|
||||
5. 上传商品照片(如有质量问题)
|
||||
6. 提交申请
|
||||
|
||||
### 4.2 审核处理
|
||||
1. 系统自动或客服人工审核(1-2个工作日)
|
||||
2. 审核通过后生成退货单号
|
||||
3. 系统发送退货地址和注意事项
|
||||
|
||||
### 4.3 寄回商品
|
||||
1. 按照要求包装商品
|
||||
2. 贴上退货单号标签
|
||||
3. 选择快递公司寄回
|
||||
4. 保留快递单号备查
|
||||
|
||||
### 4.4 验收退款
|
||||
1. 我们收到商品后进行验收(1-3个工作日)
|
||||
2. 验收合格后进行退款处理
|
||||
3. 退款原路返回(3-7个工作日到账)
|
||||
|
||||
## 5. 运费政策
|
||||
|
||||
### 5.1 7天无理由退货
|
||||
- 消费者承担退货运费
|
||||
- 如因商品质量问题,由我们承担运费
|
||||
|
||||
### 5.2 质量问题退换货
|
||||
- 我们承担往返运费
|
||||
- 提供免费上门取件服务(部分地区)
|
||||
|
||||
### 5.3 运费补偿
|
||||
- 符合条件的退换货,我们承担实际运费
|
||||
- 运费补偿通过原支付方式返还
|
||||
|
||||
## 6. 特殊商品政策
|
||||
|
||||
### 6.1 食品类商品
|
||||
- 过期、变质商品可无条件退换
|
||||
- 临近保质期商品购买前请注意
|
||||
- 特价促销食品不支持7天无理由退货
|
||||
|
||||
### 6.2 服装鞋帽
|
||||
- 支持7天无理由退货
|
||||
- 退货时请保持商品及包装完好
|
||||
- 不得有异味、污渍等影响二次销售的情况
|
||||
|
||||
### 6.3 电子产品
|
||||
- 享受国家三包政策
|
||||
- 激活使用后不支持7天无理由退货
|
||||
- 质量问题可享受维修、更换、退货服务
|
||||
|
||||
### 6.4 图书音像
|
||||
- 未拆封图书支持7天无理由退货
|
||||
- 已拆封图书仅支持质量问题退换
|
||||
- 音像制品拆封后不支持退货
|
||||
|
||||
### 6.5 化妆品
|
||||
- 未开封化妆品支持7天无理由退货
|
||||
- 已使用化妆品仅支持质量问题退换
|
||||
- 过敏等个人原因不属于质量问题
|
||||
|
||||
## 7. 退款方式和时间
|
||||
|
||||
### 7.1 退款方式
|
||||
- 原路退回:退款到原支付账户
|
||||
- 余额退款:退款到应用账户余额
|
||||
- 银行转账:特殊情况下的退款方式
|
||||
|
||||
### 7.2 退款时间
|
||||
- 支付宝、微信:1-3个工作日
|
||||
- 银行卡:3-7个工作日
|
||||
- 信用卡:7-15个工作日
|
||||
|
||||
### 7.3 退款金额
|
||||
- 商品金额:全额退款
|
||||
- 运费:根据责任方承担
|
||||
- 优惠券:按照使用规则处理
|
||||
|
||||
## 8. 不予退换的情况
|
||||
|
||||
### 8.1 超过时限
|
||||
- 超过7天无理由退货期限
|
||||
- 超过质量问题退换期限
|
||||
|
||||
### 8.2 商品问题
|
||||
- 商品已使用且非质量问题
|
||||
- 商品包装破损影响二次销售
|
||||
- 缺少必要配件或赠品
|
||||
|
||||
### 8.3 人为损坏
|
||||
- 消费者人为损坏商品
|
||||
- 私自维修或改装
|
||||
- 超出正常使用范围的损耗
|
||||
|
||||
## 9. 争议处理
|
||||
|
||||
### 9.1 协商解决
|
||||
- 消费者可通过客服热线协商
|
||||
- 客服工作时间:9:00-21:00
|
||||
- 在线客服24小时服务
|
||||
|
||||
### 9.2 投诉渠道
|
||||
- 应用内投诉功能
|
||||
- 客服邮箱:[插入邮箱地址]
|
||||
- 投诉电话:[插入电话号码]
|
||||
|
||||
### 9.3 第三方调解
|
||||
- 消费者协会调解
|
||||
- 工商部门投诉
|
||||
- 法律途径解决
|
||||
|
||||
## 10. 特别说明
|
||||
|
||||
### 10.1 政策更新
|
||||
我们保留根据法律法规和经营需要修改本政策的权利,修改后将及时公布。
|
||||
|
||||
### 10.2 最终解释权
|
||||
本政策的最终解释权归[公司名称]所有。
|
||||
|
||||
### 10.3 法律依据
|
||||
本政策依据《消费者权益保护法》、《产品质量法》等相关法律法规制定。
|
||||
|
||||
## 11. 联系我们
|
||||
|
||||
如果您对退换货政策有任何疑问,请联系我们:
|
||||
|
||||
- 客服热线:[插入电话号码]
|
||||
- 在线客服:应用内客服功能
|
||||
- 客服邮箱:[插入邮箱地址]
|
||||
- 工作时间:周一至周日 9:00-21:00
|
||||
|
||||
---
|
||||
|
||||
**[公司名称]**
|
||||
**地址:[插入公司地址]**
|
||||
**最后更新日期:[插入日期]**
|
|
@ -0,0 +1,142 @@
|
|||
# 隐私政策
|
||||
|
||||
**生效日期:[插入日期]**
|
||||
|
||||
## 1. 引言
|
||||
|
||||
欢迎使用[应用名称](以下简称"我们"或"本应用")。我们深知个人信息对您的重要性,并会尽全力保护您的个人信息安全可靠。我们致力于维持您对我们的信任,恪守以下原则,保护您的个人信息:权责一致原则、目的明确原则、选择同意原则、最少够用原则、确保安全原则、主体参与原则、公开透明原则等。
|
||||
|
||||
## 2. 我们收集的信息
|
||||
|
||||
### 2.1 账户信息
|
||||
- 手机号码(用于注册和登录)
|
||||
- 邮箱地址(可选,用于账户找回)
|
||||
- 用户名和头像(用于个人资料展示)
|
||||
|
||||
### 2.2 订单信息
|
||||
- 收货地址信息
|
||||
- 订单商品信息
|
||||
- 支付信息(不包含银行卡密码)
|
||||
- 交易记录
|
||||
|
||||
### 2.3 设备信息
|
||||
- 设备型号、操作系统版本
|
||||
- 设备标识符(IDFA、IDFV等)
|
||||
- IP地址和位置信息
|
||||
- 应用使用日志
|
||||
|
||||
### 2.4 其他信息
|
||||
- 客服沟通记录
|
||||
- 用户反馈和评价
|
||||
- 推送通知设置
|
||||
|
||||
## 3. 信息使用目的
|
||||
|
||||
我们收集和使用您的个人信息仅用于以下目的:
|
||||
|
||||
### 3.1 提供基本服务
|
||||
- 账户注册、登录和管理
|
||||
- 订单处理和商品配送
|
||||
- 客户服务和售后支持
|
||||
- 支付处理和交易完成
|
||||
|
||||
### 3.2 改善用户体验
|
||||
- 个性化推荐
|
||||
- 应用功能优化
|
||||
- 用户行为分析
|
||||
- 产品和服务改进
|
||||
|
||||
### 3.3 安全保障
|
||||
- 账户安全验证
|
||||
- 防范欺诈行为
|
||||
- 系统安全监控
|
||||
- 争议解决
|
||||
|
||||
## 4. 信息共享和披露
|
||||
|
||||
我们不会向第三方出售、出租或以其他方式披露您的个人信息,除非:
|
||||
|
||||
### 4.1 经您同意
|
||||
在获得您明确同意的情况下
|
||||
|
||||
### 4.2 服务提供
|
||||
- 配送服务商(仅提供必要的配送信息)
|
||||
- 支付服务商(仅提供必要的支付信息)
|
||||
- 云服务提供商(在严格的数据保护协议下)
|
||||
|
||||
### 4.3 法律要求
|
||||
- 法律法规要求
|
||||
- 政府部门要求
|
||||
- 司法程序需要
|
||||
|
||||
## 5. 信息存储和保护
|
||||
|
||||
### 5.1 存储地点
|
||||
您的个人信息主要存储在中华人民共和国境内
|
||||
|
||||
### 5.2 存储期限
|
||||
- 账户信息:账户存续期间
|
||||
- 交易信息:法律规定的期限
|
||||
- 日志信息:不超过6个月
|
||||
|
||||
### 5.3 安全措施
|
||||
- 数据加密传输和存储
|
||||
- 访问权限控制
|
||||
- 安全审计和监控
|
||||
- 定期安全评估
|
||||
|
||||
## 6. 您的权利
|
||||
|
||||
### 6.1 访问权
|
||||
您有权了解我们收集、使用您个人信息的情况
|
||||
|
||||
### 6.2 更正权
|
||||
发现个人信息错误时,您有权要求我们更正
|
||||
|
||||
### 6.3 删除权
|
||||
在特定情况下,您有权要求我们删除您的个人信息
|
||||
|
||||
### 6.4 撤回同意
|
||||
您有权撤回对个人信息处理的同意
|
||||
|
||||
## 7. 未成年人保护
|
||||
|
||||
我们非常重视未成年人的个人信息保护:
|
||||
- 不主动收集14周岁以下儿童的个人信息
|
||||
- 如需收集,将征得父母或监护人同意
|
||||
- 建立专门的未成年人个人信息保护规则
|
||||
|
||||
## 8. 第三方服务
|
||||
|
||||
本应用可能包含第三方服务,包括但不限于:
|
||||
- 地图服务
|
||||
- 支付服务
|
||||
- 推送服务
|
||||
- 统计分析服务
|
||||
|
||||
请注意这些第三方服务有自己的隐私政策,我们建议您仔细阅读。
|
||||
|
||||
## 9. 跨境传输
|
||||
|
||||
如需向境外传输您的个人信息,我们将:
|
||||
- 征得您的明确同意
|
||||
- 确保接收方具备足够的数据保护水平
|
||||
- 采取必要的安全保障措施
|
||||
|
||||
## 10. 隐私政策更新
|
||||
|
||||
我们可能适时修订本隐私政策,修订后的政策将在应用内公布。重大变更时,我们会通过显著方式通知您。
|
||||
|
||||
## 11. 联系我们
|
||||
|
||||
如果您对本隐私政策有任何疑问,请通过以下方式联系我们:
|
||||
|
||||
- 邮箱:[插入邮箱地址]
|
||||
- 电话:[插入电话号码]
|
||||
- 地址:[插入公司地址]
|
||||
- 在线客服:应用内客服功能
|
||||
|
||||
---
|
||||
|
||||
**[公司名称]**
|
||||
**最后更新日期:[插入日期]**
|
Loading…
Reference in New Issue