Browse Source

上传

master
前端-胡立永 4 months ago
parent
commit
16c96a32d4
22 changed files with 506 additions and 114 deletions
  1. +1
    -1
      App.vue
  2. +2
    -2
      api/api.js
  3. +48
    -0
      api/model/index.js
  4. +56
    -0
      api/model/info.js
  5. +7
    -11
      api/model/login.js
  6. +20
    -0
      api/model/vip.js
  7. +2
    -2
      components/config/PrivacyAgreementPoup.vue
  8. +2
    -2
      config.js
  9. +4
    -0
      main.js
  10. +1
    -1
      manifest.json
  11. +14
    -0
      mixins/configList.js
  12. +13
    -9
      pages.json
  13. +3
    -0
      pages/index/cart.vue
  14. +3
    -0
      pages/index/center.vue
  15. +117
    -37
      pages/index/index.vue
  16. +136
    -17
      pages/index/member.vue
  17. +8
    -9
      pages_order/auth/wxLogin.vue
  18. +5
    -2
      pages_order/auth/wxUserInfo.vue
  19. +1
    -1
      pages_order/components/address/addressList.vue
  20. +46
    -0
      pages_order/home/Worknotice.vue
  21. BIN
      static/image/member/a.png
  22. +17
    -20
      store/store.js

+ 1
- 1
App.vue View File

@ -1,9 +1,9 @@
<script>
export default {
onLaunch: function() {
this.$store.commit('initConfig')
},
onShow: function() {
// this.$store.commit('initConfig')
},
onHide: function() {
}


+ 2
- 2
api/api.js View File

@ -5,7 +5,7 @@ import utils from '../utils/utils.js'
let limit = {}
let debounce = {}
const models = []
const models = ['login', 'index', 'vip', 'info']
const config = {
// 示例
@ -14,7 +14,7 @@ const config = {
// limit : 1000
// },
getConfig : {url : '/api/getConfig', method : 'GET', limit : 500},
getConfig : {url : '/config_common/getConfig', method : 'GET', limit : 500},
}


+ 48
- 0
api/model/index.js View File

@ -0,0 +1,48 @@
// 首页相关接口
const api = {
// 获取首页轮播图
getRiceBanner: {
url: '/rice_index/getRiceBanner',
method: 'GET',
},
// 获取首页常规产品
getRiceCommonProductList: {
url: '/rice_index/getRiceCommonProductList',
method: 'GET',
},
// 获取首页跳转图标
getRiceIconList: {
url: '/rice_index/getRiceIconList',
method: 'GET',
},
// 获取首页新闻详情
getRiceNewsDetail: {
url: '/rice_index/getRiceNewsDetail',
method: 'GET',
},
// 获取首页新闻列表
getRiceNewsList: {
url: '/rice_index/getRiceNewsList',
method: 'GET',
},
// 获取首页公告列表
getRiceNoticeList: {
url: '/rice_index/getRiceNoticeList',
method: 'GET',
},
// 获取首页商品详情
getRiceProductDetail: {
url: '/rice_index/getRiceProductDetail',
method: 'GET',
},
// 获取首页体验产品
getRiceProductList: {
url: '/rice_index/getRiceProductList',
method: 'GET',
},
}
export default api

+ 56
- 0
api/model/info.js View File

@ -0,0 +1,56 @@
// 个人相关接口
const api = {
// 获取地址列表带分页
getAddressPageList: {
url: '/rice_info/getAddressPageList',
method: 'GET',
limit : 500,
auth : true,
},
// 获取购物车信息列表带分页
getCartPageList: {
url: '/rice_info/getCartPageList',
method: 'GET',
limit : 500,
auth : true,
},
// 获取粉丝列表带分页
getFansPageList: {
url: '/rice_info/getFansPageList',
method: 'GET',
limit : 500,
auth : true,
},
// 获取相关介绍
getInfoIntroduce: {
url: '/rice_info/getInfoIntroduce',
method: 'GET',
limit : 500,
auth : true,
},
// 获取个人邀请码
getInviteCode: {
url: '/rice_info/getInviteCode',
method: 'GET',
limit : 500,
auth : true,
},
// 获取订单列表带分页
getOrderPageList: {
url: '/rice_info/getOrderPageList',
method: 'GET',
limit : 500,
auth : true,
},
// 获取流水记录带分页
getWaterPageList: {
url: '/rice_info/getWaterPageList',
method: 'GET',
limit : 500,
auth : true,
},
}
export default api

+ 7
- 11
api/model/login.js View File

@ -5,28 +5,24 @@
const api = {
// 微信登录接口
wxLogin: {
url: '/login/login',
method: 'POST',
url: '/login_common/appletLogin',
method: 'GET',
limit : 500,
showLoading : true,
},
// 修改个人信息接口
updateInfo: {
url: '/info/updateInfo',
url: '/info_common/updateInfo',
method: 'POST',
auth: true,
limit : 500,
showLoading : true,
},
//隐私政策
getPrivacyPolicy: {
url: '/login/getPrivacyPolicy',
method: 'GET',
},
//用户协议
getUserAgreement: {
url: '/login/getUserAgreement',
// 获取个人信息
getInfo: {
url: '/info_common/getInfo',
method: 'GET',
auth: true,
},
}

+ 20
- 0
api/model/vip.js View File

@ -0,0 +1,20 @@
// vip相关接口
const api = {
// 获取会员权益列表
getRiceVipList: {
url: '/rice_vip/getRiceVipList',
method: 'GET',
},
// 申请成为会员
applyRiceVip: {
url: '/rice_vip/applyRiceVip',
method: 'POST',
limit : 500,
auth : true,
showLoading : true,
},
}
export default api

+ 2
- 2
components/config/PrivacyAgreementPoup.vue View File

@ -10,7 +10,7 @@
</view>
<view class="content_pri">
<view class="text">
欢迎来到三只青蛙小程序!我们根据最新的法律法规监管政策要求更新了用户协议隐私政策,请您认真阅读
欢迎来到{{ configList.logo_name }}!我们根据最新的法律法规监管政策要求更新了用户协议隐私政策,请您认真阅读
</view>
</view>
<view class="config">
@ -18,7 +18,7 @@
<view class="content">
<view style="display: flex;">
<!-- <uv-checkbox size="30rpx" :name="1"></uv-checkbox> -->
同意<text @click="goToPrivacy">三只青蛙小程序隐私政策</text>
同意<text @click="goToPrivacy">{{ configList.logo_name }}隐私政策</text>
</view>
<view class="">
以及<text @click="goToPrivacy">用户协议</text>


+ 2
- 2
config.js View File

@ -13,10 +13,10 @@ const type = 'dev'
// 环境配置
const config = {
dev : {
baseUrl : 'http://www.gcosc.fun:82',
baseUrl : 'https://admin.szqwdgidm.com/rice-admin',
},
prod : {
baseUrl : 'http://xxx.xxx.xxx/xxx',
baseUrl : 'https://admin.szqwdgidm.com/rice-admin',
}
}


+ 4
- 0
main.js View File

@ -14,6 +14,10 @@ import store from '@/store/store'
import './config'
import './utils/index.js'
import mixinConfigList from '@/mixins/configList.js'
Vue.mixin(mixinConfigList)
//组件注册
import configPopup from '@/components/config/configPopup.vue'
import navbar from '@/components/base/navbar.vue'


+ 1
- 1
manifest.json View File

@ -52,7 +52,7 @@
"quickapp" : {},
/* */
"mp-weixin" : {
"appid" : "wxe7ae8cbe1673834c",
"appid" : "wx0839bc52e7849c13",
"setting" : {
"urlCheck" : false
},


+ 14
- 0
mixins/configList.js View File

@ -0,0 +1,14 @@
import { mapState } from 'vuex'
export default {
data() {
return {
}
},
computed: {
...mapState(['configList']),
},
methods: {
}
}

+ 13
- 9
pages.json View File

@ -2,19 +2,22 @@
"pages": [{
"path": "pages/index/index",
"style": {
"navigationBarTitleText": ""
"navigationBarTitleText": "",
"enablePullDownRefresh": true
}
},
{
"path": "pages/index/order",
"style": {
"navigationBarTitleText": ""
"navigationBarTitleText": "",
"enablePullDownRefresh": true
}
},
{
"path": "pages/index/category",
"style": {
"navigationBarTitleText": ""
"navigationBarTitleText": "",
"enablePullDownRefresh": true
}
},
{
@ -23,12 +26,13 @@
"navigationBarTitleText": ""
}
},
// {
// "path": "pages/index/cart",
// "style": {
// "navigationBarTitleText": ""
// }
// },
{
"path": "pages/index/cart",
"style": {
"navigationBarTitleText": "",
"enablePullDownRefresh": true
}
},
{
"path": "pages/index/member",
"style": {


+ 3
- 0
pages/index/cart.vue View File

@ -83,7 +83,9 @@
<script>
import tabber from '@/components/base/tabbar.vue'
import mixinsList from '@/mixins/list.js'
export default {
mixins : [mixinsList],
components: {
tabber,
},
@ -115,6 +117,7 @@
unit : '120*40*75【桌子尺寸】',
},
],
mixinsListApi : 'getCartPageList',
}
},
computed: {


+ 3
- 0
pages/index/center.vue View File

@ -129,6 +129,9 @@
data() {
return {}
},
onShow() {
this.$store.commit('getUserInfo')
},
methods: {}
}
</script>


+ 117
- 37
pages/index/index.vue View File

@ -6,7 +6,7 @@
<view class="bg-color"></view>
<view class="page-title">
三只青蛙
{{ configList.index_title }}
</view>
<view class="search">
@ -14,7 +14,10 @@
</view>
<view class="swipe">
<uv-swiper :list="bannerList" indicator height="320rpx" keyName="url"></uv-swiper>
<uv-swiper
:list="bannerList"
indicator height="320rpx"
keyName="image"></uv-swiper>
</view>
<view class="notice">
@ -26,13 +29,13 @@
<uv-grid-item v-for="(item,index) in baseList" :key="index" @click="$utils.navigateTo(item.path)">
<image :src="item.image" mode=""></image>
<text class="menu-text">{{item.title}}</text>
</uv-grid-item>
</uv-grid>
</view>
<view class="map">
<image src="../../static/image/home/8.png" mode="aspectFill" />
{{ configList.index_center_image }}
<image :src="configList.index_center_image" mode="aspectFill" />
</view>
<view class="commodity"
@ -45,15 +48,17 @@
</view>
</view>
<view class="centre">
<view class="boxs">
<view class="boxs"
:key="index"
v-for="(item, index) in riceProductList">
<view class="box-text">
<view>三只青蛙低GI大米</view>
<view>5斤每盒*3</view>
<text class="text1">225</text>
<text class="text2">原价375</text>
<view>{{ item.title }}</view>
<view>{{ item.sku }}</view>
<text class="text1">{{ item.price }}</text>
<text class="text2">原价{{ item.oldPrice }}</text>
</view>
<view class="box-img">
<image src="../../static/logo.png" mode="aspectFill"></image>
<image :src="item.image" mode="aspectFill"></image>
</view>
</view>
</view>
@ -65,20 +70,22 @@
<view class="box">
<view class="top">
<view class="top-text">
<view>Experience the product</view>
<view>Conventional product</view>
<view>常规产品 ___ _</view>
</view>
</view>
<view class="centre">
<view class="boxs">
<view class="boxs"
:key="index"
v-for="(item, index) in commonProductList">
<view class="box-text">
<view>三只青蛙低GI大米</view>
<view>5斤每盒*3</view>
<text class="text1">225</text>
<text class="text2">原价375</text>
<view>{{ item.title }}</view>
<view>{{ item.sku }}</view>
<text class="text1">{{ item.price }}</text>
<text class="text2">原价{{ item.oldPrice }}</text>
</view>
<view class="box-img">
<image src="../../static/logo.png" mode="aspectFill"></image>
<image :src="item.image" mode="aspectFill"></image>
</view>
</view>
</view>
@ -89,7 +96,7 @@
<view class="box">
<view class="top">
<view class="top-text">
<view>Experience the product</view>
<view>News trends</view>
<view>新闻动态 ___ _</view>
</view>
<view class="top1" @click="$utils.navigateTo('/pages_order/home/journalism')">
@ -97,13 +104,16 @@
</view>
</view>
<view class="centre">
<view class="boxs">
<view class="boxs"
:key="index"
v-for="(item, index) in newList"
>
<view class="images">
<image src="../../static/image/home/9.png" mode="aspectFill"></image>
<image :src="item.image" mode="aspectFill"></image>
</view>
<view class="box-fone">
<view>新闻标题</view>
<view>说明文字说明文字说明文字说明文字说明文字</view>
<view>{{ item.title }}</view>
<view>{{ item.title }}</view>
</view>
</view>
</view>
@ -113,7 +123,7 @@
<view class="qr">
<view class="scan">扫码关注公众号</view>
<view class="qr-scan">
<image src="../../static/image/home/10.png" mode="aspectFill"></image>
<image :src="configList.down_image" mode="aspectFill"></image>
</view>
<view class="qr-bottom">
<view>保存公众号二维码图片</view>
@ -143,16 +153,7 @@
return {
area: '长沙',
notice: '长沙市刘师傅在服务过程中客户投诉“服务过程中有不文明的行为”.....',
bannerList: [{
url: 'https://cdn.uviewui.com/uview/swiper/swiper3.png',
},
{
url: 'https://cdn.uviewui.com/uview/swiper/swiper2.png',
},
{
url: 'https://cdn.uviewui.com/uview/swiper/swiper3.png',
},
],
bannerList: [],
baseList: [{
image: '/static/image/home/0.png',
title: '关于我们',
@ -181,7 +182,7 @@
},
{
image: '/static/image/home/6.png',
title: '企合作',
title: '企合作',
},
{
image: '/static/image/home/7.png',
@ -190,15 +191,84 @@
],
productList: [],
keyword: '',
commonProductList : [],//
riceProductList : [],//
newList : [],//
}
},
computed: {},
methods: {}
onShow() {
this.getBanner()
this.getRiceNoticeList()
this.getRiceCommonProductList()
this.getRiceProductList()
this.getRiceNewsList()
this.getRiceIconList()
},
onPullDownRefresh() {
this.getBanner()
this.getRiceNoticeList()
this.getRiceCommonProductList()
this.getRiceProductList()
this.getRiceNewsList()
},
methods: {
//
getBanner(){
this.$api('getRiceBanner', res => {
if(res.code == 200){
this.bannerList = res.result
}
})
},
//
getRiceNoticeList(){
this.$api('getRiceNoticeList', res => {
if(res.code == 200){
this.notice = res.result.content
}
})
},
//
getRiceCommonProductList(){
this.$api('getRiceCommonProductList', res => {
uni.stopPullDownRefresh()
if(res.code == 200){
this.commonProductList = res.result
}
})
},
//
getRiceProductList(){
this.$api('getRiceProductList', res => {
if(res.code == 200){
this.riceProductList = res.result
}
})
},
//
getRiceNewsList(){
this.$api('getRiceNewsList', res => {
if(res.code == 200){
this.newList = res.result.records
}
})
},
//
getRiceIconList(){
this.$api('getRiceIconList', res => {
if(res.code == 200){
this.newList = res.result.records
}
})
},
},
}
</script>
<style scoped lang="scss">
.page {
position: relative;
.bg-color {
width: 100%;
position: absolute;
@ -334,6 +404,7 @@
.centre {
margin: 40rpx 20rpx;
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
@ -341,6 +412,8 @@
display: flex;
width: 100%;
align-items: center;
justify-content: center;
margin-top: 10rpx;
.images {
width: 180rpx;
@ -353,12 +426,11 @@
width: 100%;
height: 100%;
}
}
.box-fone {
margin-left: 20rpx;
flex: 1;
view:nth-child(1) {
font-size: 36rpx;
color: #474747;
@ -375,6 +447,14 @@
.box-img {
flex: 1;
}
.box-img{
height: 220rpx;
image{
width: 100%;
height: 100%;
}
}
.box-text {
view:nth-child(1) {


+ 136
- 17
pages/index/member.vue View File

@ -3,14 +3,38 @@
<navbar title="会员" />
<view class="swipe">
<uv-swiper :list="bannerList" indicator height="320rpx" keyName="url"></uv-swiper>
<uv-swiper
:list="bannerList"
indicator
height="320rpx"
keyName="image"></uv-swiper>
</view>
<view class="vip">
<view class="title1">
限时活动
</view>
<view class="title2">
会员套餐
</view>
<view class="box-content">
{{ configList.vip_text }}
</view>
<view class="di">
<view class="pad">
1000/999
</view>
<view class="submitOpen">
开通会员
</view>
</view>
</view>
<view class="middle">
<view class="rights">会员权益</view>
<view class="middle-one">会员条件一次性购买50斤大米即成为会员50斤*20/=1000元会员权益</view>
<view class="middle-one">会员条件{{ configList.vip_rloe }}</view>
<view class="middle-boxs">
<!-- <view class="middle-boxs">
<view class="middle-two-1">权益一</view>
<view class="middle-box">
<view class="middlex-minBox">
@ -51,7 +75,7 @@
<view class="middle-boxs">
<view class="middle-two-3">权益三</view>
<view class="middle-two-1">权益三</view>
<view class="middle-box">
<view class="middlex-minBox">
<view>所推荐朋友购买产品及今后产生复购</view>
@ -65,12 +89,50 @@
<view class="img">
<image src="../../static/image/member/3.png" mode="aspectFill"></image>
</view>
</view>
</view> -->
<template
v-for="(item, index) in vipInfoList">
<view class="middle-boxs"
v-if="index % 2 == 0"
:key="index">
<view class="middle-two-1">{{ item.title }}</view>
<view class="middle-box">
<view class="middlex-minBox">
<uv-parse :content="item.details"></uv-parse>
</view>
</view>
<view class="img">
<image :src="item.image" mode="aspectFill"></image>
</view>
</view>
<view class="middle-boxs"
v-else
:key="index">
<view style="padding: 20rpx;"></view>
<view class="middle-two-2">{{ item.title }}</view>
<view class="middle-box">
<view class="middlex-minBox-2">
<uv-parse :content="item.details"></uv-parse>
</view>
</view>
<view class="img-2">
<image :src="item.image" mode="aspectFill"></image>
</view>
</view>
</template>
<view class="middle-bottom">
<!-- <view class="middle-bottom">
<view>*仅限前</view>
<text>1000</text>
<view>充值会员</view>
</view> -->
<view class="middle-bottom">
{{ configList.vip_text }}
</view>
</view>
@ -87,17 +149,31 @@
},
data() {
return {
bannerList: [{
url: 'https://cdn.uviewui.com/uview/swiper/swiper3.png',
},
{
url: 'https://cdn.uviewui.com/uview/swiper/swiper2.png',
},
{
url: 'https://cdn.uviewui.com/uview/swiper/swiper3.png',
},
],
bannerList: [],
vipInfoList: [],
};
},
onShow() {
this.getBanner()
this.getRiceVipList()
},
methods : {
//
getBanner(){
this.$api('getRiceBanner', res => {
if(res.code == 200){
this.bannerList = res.result
}
})
},
//
getRiceVipList(){
this.$api('getRiceVipList', res => {
if(res.code == 200){
this.vipInfoList = res.result
}
})
},
}
}
</script>
@ -113,6 +189,49 @@
border-radius: 20rpx;
margin: 20rpx;
}
.vip{
background: url(/static/image/member/a.png);
background-size: 100% 100%;
margin: 20rpx;
position: relative;
color: #000;
padding-bottom: 10rpx;
.title1{
padding: 10rpx 60rpx;
}
.title2{
position: absolute;
left: 300rpx;
top: 30rpx;
}
.box-content{
background-color: #00000013;
padding: 50rpx;
margin: 40rpx;
text-align: center;
border-radius: 20rpx;
font-size: 50rpx;
font-weight: 900;
margin-bottom: 0;
}
.di{
display: flex;
justify-content: space-between;
padding: 20rpx;
align-items: flex-end;
.pad{
font-size: 26rpx;
}
.submitOpen{
padding: 20rpx 40rpx;
border-radius: 40rpx;
background-color: #F6CD59;
color: #fff;
font-size: 26rpx;
}
}
}
.middle {
margin: 20rpx;
@ -157,7 +276,7 @@
.middle-two-2 {
position: absolute;
top: 10rpx;
right: 0;
right: 20rpx;
}
.middle-box {


+ 8
- 9
pages_order/auth/wxLogin.vue View File

@ -1,10 +1,10 @@
<template>
<view class="login">
<view class="logo">
<!-- <image src="/static/image/login/logo.png" mode=""></image> -->
<image :src="configList.logo_image" mode=""></image>
</view>
<view class="title">
欢迎使用三只青蛙小程序
欢迎使用{{ configList.logo_name }}
</view>
<view class="btn mt"
@click="wxLogin">
@ -32,13 +32,13 @@
<uv-checkbox
size="40rpx"
icon-size="30rpx"
activeColor="#FD5100"
activeColor="#A3D250"
:name="1"
></uv-checkbox>
阅读并同意我们的<text @click="$refs.popup.open('getPrivacyPolicy')">服务协议与隐私条款</text>
阅读并同意我们的<text @click="$refs.popup.open('user_xy')">用户协议</text>
</view>
<view class="">
以及<text @click="$refs.popup.open('getUserAgreement')">个人信息保护指引</text>
以及<text @click="$refs.popup.open('user_ys')">隐私政策</text>
</view>
</view>
</uv-checkbox-group>
@ -89,11 +89,10 @@
.logo{
height: 140rpx;
width: 140rpx;
background-color: #ddd;
border-radius: 30rpx;
image{
width: 80rpx;
height: 80rpx;
height: 140rpx;
width: 140rpx;
border-radius: 30rpx;
}
margin-bottom: 20rpx;
}


+ 5
- 2
pages_order/auth/wxUserInfo.vue View File

@ -1,7 +1,7 @@
<template>
<view class="login">
<view class="title">
三只青蛙小程序
{{ configList.logo_name }}
</view>
<view class="title">
申请获取你的头像昵称
@ -74,7 +74,10 @@
return
}
self.$api('infoUpdateInfo', self.userInfo, res => {
self.$api('updateInfo', {
avatarUrl : self.userInfo.headImage,
nickName : self.userInfo.nickName
}, res => {
if (res.code == 200) {
uni.switchTab({
url:'/pages/index/index'


+ 1
- 1
pages_order/components/address/addressList.vue View File

@ -90,7 +90,7 @@
//
getAddressList() {
return new Promise((success, fail) => {
this.$api('addressPage', this.queryParams, res => {
this.$api('getAddressPageList', this.queryParams, res => {
if (res.code == 200) {
this.addressList = res.result.records || [];
this.total = res.result.total || 0;


+ 46
- 0
pages_order/home/Worknotice.vue View File

@ -0,0 +1,46 @@
<template>
<!-- 公告 -->
<view class="page">
<navbar title="公告" leftClick @leftClick="$utils.navigateBack" />
<view style="padding: 20rpx;">
<uv-parse :content="NewsById.content"></uv-parse>
</view>
</view>
</template>
<script>
export default {
data() {
return {
NewsById : {},
id : 0,
}
},
onLoad(args) {
this.id = args.id
this.queryNewsById()
},
methods: {
//-id
queryNewsById(){
this.$api('queryNewsById', {
newsId : this.id
}, res =>{
if(res.code == 200){
this.NewsById = res.result
}
})
},
}
}
</script>
<style scoped lang="scss">
.page {
}
</style>

BIN
static/image/member/a.png View File

Before After
Width: 1420  |  Height: 870  |  Size: 27 KiB

+ 17
- 20
store/store.js View File

@ -8,33 +8,30 @@ import api from '@/api/api.js'
//Vuex.Store 构造器选项
const store = new Vuex.Store({
state: {
configList: [], //配置列表
shop : false,
configList: {}, //配置列表
userInfo : {}, //用户信息
},
getters: {
// 角色 true为水洗店 false为酒店
userShop(state){
return state.shop
}
},
mutations: {
// 初始化配置
initConfig(state){
// api('getConfig', res => {
// if(res.code == 200){
// state.configList = res.result
// }
// })
let config = ['getPrivacyPolicy', 'getUserAgreement']
config.forEach(k => {
api(k, res => {
if (res.code == 200) {
state.configList[k] = res.result
}
})
api('getConfig', res => {
if(res.code == 200){
res.result.forEach(n => {
state.configList[n.keyName] = n.keyContent
})
}
})
// let config = ['getPrivacyPolicy', 'getUserAgreement']
// config.forEach(k => {
// api(k, res => {
// if (res.code == 200) {
// state.configList[k] = res.result
// }
// })
// })
},
login(state){
uni.showLoading({
@ -71,7 +68,7 @@ const store = new Vuex.Store({
})
},
getUserInfo(state){
api('infoGetInfo', res => {
api('getInfo', res => {
if(res.code == 200){
state.userInfo = res.result
}


Loading…
Cancel
Save