邹畅 3 years ago
parent
commit
547cce94bb
3 changed files with 640 additions and 91 deletions
  1. 16
      src/api/userInfoApi.js
  2. 578
      src/views/nested/menu1/index.vue
  3. 137
      src/views/user/index.vue

16
src/api/userInfoApi.js

@ -96,3 +96,19 @@ export function queryTipsDetail(id) {
data:{id}
})
}
//获取用户信息
export function queryUserInfo(data) {
return request({
url: 'system/user/cusList',
method: 'post',
data
})
}
//修改用户信息
export function updateUserInfo(data) {
return request({
url: 'system/user/update',
method: 'post',
data
})
}

578
src/views/nested/menu1/index.vue

@ -157,6 +157,7 @@
</el-form-item>
<h3 class="form-title">开本流程</h3>
<el-table
v-if="type != 'view'"
:header-cell-style="{ background: '#eee', color: '#606266' }"
:data="ruleForm.processesList"
border
@ -198,7 +199,29 @@
</template>
</el-table-column>
</el-table>
<div style="margin-top:15px;">
<el-table
v-if="type == 'view'"
:header-cell-style="{ background: '#eee', color: '#606266' }"
:data="ruleForm.processesList"
border
style="width: 90%;margin-left:30px;"
>
<el-table-column
align="center"
type="index"
label="序号"
width="50"
/>
<el-table-column align="center" property="title" label="流程标题">
</el-table-column>
<el-table-column align="center" property="code" label="流程编号">
</el-table-column>
<el-table-column align="center" property="introduction" label="简介">
</el-table-column>
<el-table-column align="center" property="sort" label="排序">
</el-table-column>
</el-table>
<div style="margin-top:15px;" v-if="type != 'view'">
<el-button
type="success"
style="height:36px;width:100px;margin-left:30px;color:#fff;background:#33DB99"
@ -209,12 +232,55 @@
<h3 class="form-title">剧本资源</h3>
<el-form-item label="图片" prop="imgUrls" style="width: 100%;">
<el-radio-group v-model="radioImg" @change="changeImg">
<el-radio label="1">本地上传</el-radio>
<el-radio label="2">网易云地址</el-radio>
<el-radio :label="1">本地上传</el-radio>
<el-radio :label="2">网易云地址</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="radioImg == 2" style="width: 100%;" class="urlTable">
<el-form-item v-if="radioImg == 1">
<div v-for="(item, i) in imgData" :key="i" class="imgdata">
<el-image
style="width: 146px; height: 146px"
:src="item"
fit="fill"
>
</el-image>
<div class="imgdialog">
<p>
<i class="el-icon-zoom-in" style="font-size: 20px"></i>
<i
class="el-icon-delete"
@click="deldialogimg(item, i, 'img')"
style="font-size: 20px; padding-left: 30px"
></i>
</p>
</div>
<div class="sz_container" style="text-align:center">
<el-button size="mini" type="text" @click="setLc(item, 'img')"
>关联流程</el-button
>
</div>
</div>
<el-upload
class="avatar-uploader"
style="float:left;margin-left:60px"
action
list-type="picture-card"
:show-file-list="false"
:http-request="labeluploadimg"
>
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="" />
</el-dialog>
</el-form-item>
<el-form-item
v-if="radioImg == 2"
style="width: 100%;"
class="urlTable"
>
<el-table
v-if="type != 'view'"
:data="ruleForm.radioImg"
border
style="width: 80%;margin-left:100px;"
@ -247,10 +313,10 @@
placeholder="请选择流程"
>
<el-option
v-for="item in lcData"
v-for="item in ruleForm.processesList"
:key="item.value"
:label="item.title"
:value="item.id"
:value="item.code"
>
</el-option>
</el-select>
@ -258,13 +324,37 @@
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button type="text" size="mini" @click="Del(scope.$index)"
<el-button type="text" size="mini" @click="DelImg(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<div style="margin-top:15px;">
<el-table
v-if="type == 'view'"
:data="ruleForm.radioImg"
border
style="width: 80%;margin-left:100px;"
>
<el-table-column
align="center"
type="index"
label="序号"
width="50"
/>
<el-table-column align="center" property="title" label="资源标题" />
<el-table-column align="center" property="url" label="资源URL" />
<el-table-column
align="center"
property="processId"
label="关联流程"
>
<template slot-scope="scope">
{{ mapForChannel(scope.row.processId) }}
</template>
</el-table-column>
</el-table>
<div style="margin-top:15px;" v-if="type != 'view'">
<el-button
type="success"
style="height:36px;width:100px;margin-left:30px;color:#fff;background:#33DB99"
@ -275,12 +365,55 @@
</el-form-item>
<el-form-item label="音频" prop="imgUrls" style="width: 100%;">
<el-radio-group v-model="radioMusic" @change="changeMusic">
<el-radio label="1">本地上传</el-radio>
<el-radio label="2">网易云地址</el-radio>
<el-radio :label="1">本地上传</el-radio>
<el-radio :label="2">网易云地址</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="radioMusic == 2" style="width: 100%;" class="urlTable">
<el-form-item v-if="radioMusic == 1">
<div v-for="(item, i) in musicData" :key="i" class="imgdata">
<el-image
style="width: 146px; height: 146px"
:src="item"
fit="fill"
>
</el-image>
<div class="imgdialog">
<p>
<i class="el-icon-zoom-in" style="font-size: 20px"></i>
<i
class="el-icon-delete"
@click="deldialogimg(item, i, 'mnusic')"
style="font-size: 20px; padding-left: 30px"
></i>
</p>
</div>
<div class="sz_container" style="text-align:center">
<el-button size="mini" type="text" @click="setLc(item, 'music')"
>关联流程</el-button
>
</div>
</div>
<el-upload
class="avatar-uploader"
style="float:left;margin-left:60px"
action
list-type="picture-card"
:show-file-list="false"
:http-request="labeluploadmusic"
>
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="" />
</el-dialog>
</el-form-item>
<el-form-item
v-if="radioMusic == 2"
style="width: 100%;"
class="urlTable"
>
<el-table
v-if="type != 'view'"
:data="ruleForm.radioMusic"
border
style="width: 80%;margin-left:100px;"
@ -313,10 +446,10 @@
placeholder="请选择流程"
>
<el-option
v-for="item in lcData"
v-for="item in ruleForm.processesList"
:key="item.value"
:label="item.title"
:value="item.id"
:value="item.code"
>
</el-option>
</el-select>
@ -324,13 +457,40 @@
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button type="text" size="mini" @click="DelMusic(scope.$index)"
<el-button
type="text"
size="mini"
@click="DelMusic(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<div style="margin-top:15px;">
<el-table
v-if="type == 'view'"
:data="ruleForm.radioMusic"
border
style="width: 80%;margin-left:100px;"
>
<el-table-column
align="center"
type="index"
label="序号"
width="50"
/>
<el-table-column align="center" property="title" label="资源标题" />
<el-table-column align="center" property="url" label="资源URL" />
<el-table-column
align="center"
property="processId"
label="关联流程"
>
<template slot-scope="scope">
{{ mapForChannel(scope.row.processId) }}
</template>
</el-table-column>
</el-table>
<div style="margin-top:15px;" v-if="type != 'view'">
<el-button
type="success"
style="height:36px;width:100px;margin-left:30px;color:#fff;background:#33DB99"
@ -341,12 +501,55 @@
</el-form-item>
<el-form-item label="视频" prop="imgUrls" style="width: 100%;">
<el-radio-group v-model="radioVideo" @change="changeVideo">
<el-radio label="1">本地上传</el-radio>
<el-radio label="2">网易云地址</el-radio>
<el-radio :label="1">本地上传</el-radio>
<el-radio :label="2">网易云地址</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item v-if="radioVideo == 2" style="width: 100%;" class="urlTable">
<el-form-item v-if="radioVideo == 1">
<div v-for="(item, i) in videoData" :key="i" class="imgdata">
<el-image
style="width: 146px; height: 146px"
:src="item"
fit="fill"
>
</el-image>
<div class="imgdialog">
<p>
<i class="el-icon-zoom-in" style="font-size: 20px"></i>
<i
class="el-icon-delete"
@click="deldialogimg(item, i, 'video')"
style="font-size: 20px; padding-left: 30px"
></i>
</p>
</div>
<div class="sz_container" style="text-align:center">
<el-button size="mini" type="text" @click="setLc(item, 'video')"
>关联流程</el-button
>
</div>
</div>
<el-upload
class="avatar-uploader"
style="float:left;margin-left:60px"
action
list-type="picture-card"
:show-file-list="false"
:http-request="labeluploadvideo"
>
<i class="el-icon-plus"></i>
</el-upload>
<el-dialog :visible.sync="dialogVisible">
<img width="100%" :src="dialogImageUrl" alt="" />
</el-dialog>
</el-form-item>
<el-form-item
v-if="radioVideo == 2"
style="width: 100%;"
class="urlTable"
>
<el-table
v-if="type != 'view'"
:data="ruleForm.radioVideo"
border
style="width: 80%;margin-left:100px;"
@ -379,10 +582,10 @@
placeholder="请选择流程"
>
<el-option
v-for="item in lcData"
v-for="item in ruleForm.processesList"
:key="item.value"
:label="item.title"
:value="item.id"
:value="item.code"
>
</el-option>
</el-select>
@ -390,13 +593,40 @@
</el-table-column>
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button type="text" size="mini" @click="DelVideo(scope.$index)"
<el-button
type="text"
size="mini"
@click="DelVideo(scope.$index)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<div style="margin-top:15px;">
<el-table
v-if="type == 'view'"
:data="ruleForm.radioVideo"
border
style="width: 80%;margin-left:100px;"
>
<el-table-column
align="center"
type="index"
label="序号"
width="50"
/>
<el-table-column align="center" property="title" label="资源标题" />
<el-table-column align="center" property="url" label="资源URL" />
<el-table-column
align="center"
property="processId"
label="关联流程"
>
<template slot-scope="scope">
{{ mapForChannel(scope.row.processId) }}
</template>
</el-table-column>
</el-table>
<div v-if="type != 'view'" style="margin-top:15px;">
<el-button
type="success"
style="height:36px;width:100px;margin-left:30px;color:#fff;background:#33DB99"
@ -412,7 +642,34 @@
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="dialog.Visible = false"> </el-button>
<el-button type="primary" @click="subMit"> </el-button>
<el-button v-if="type != 'view'" type="primary" @click="subMit"
> </el-button
>
</span>
</el-dialog>
<!-- 关联流程 -->
<el-dialog
title="关联流程"
:visible.sync="process.Visible"
width="30%"
center
>
<el-form>
<el-form-item label="关联流程">
<el-select v-model="processId" clearable placeholder="请选择流程">
<el-option
v-for="item in ruleForm.processesList"
:key="item.value"
:label="item.title"
:value="item.code"
>
</el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="process.Visible = false"> </el-button>
<el-button type="primary" @click="subMitLc"> </el-button>
</span>
</el-dialog>
</div>
@ -456,14 +713,13 @@ export default {
Visible: false
},
ruleForm: {
resource: "1",
processesList: [],
imgUrl: "",
data: [],
radioImg:[],
radioMusic:[],
radioVideo:[],
resourcesList:[]
imgUrls: [],
radioImg: [],
radioMusic: [],
radioVideo: [],
resourcesList: []
},
dialogVisible: false,
active: "",
@ -473,9 +729,19 @@ export default {
dialogImageUrl: "",
dataImg: [],
lcData: [],
radioImg:"1",
radioMusic:'1',
radioVideo:"1"
radioImg: "1",
radioMusic: "1",
radioVideo: "1",
type: "add",
imgData: [],
musicData: [],
videoData: [],
processId: "",
process: {
Visible: false
},
list: {},
typeUrl: ""
};
},
mounted() {
@ -483,6 +749,13 @@ export default {
this.queryFindList();
},
methods: {
mapForChannel(e) {
for (var i = 0; i < this.lcData.length; i++) {
if (this.lcData[i].id == e) {
return this.lcData[i].title;
}
}
},
//
async queryList() {
this.loading = true;
@ -529,34 +802,67 @@ export default {
let res = await queryJbDetail(id);
console.log(res, "详情");
this.ruleForm = res.data;
this.ruleForm.radioImg = [];
this.ruleForm.radioMusic = [];
this.ruleForm.radioVideo = [];
let a = res.data.resourcesList.map(n => {
if (n.mediaType == 1) {
this.ruleForm.radioImg.push(n);
this.radioImg = n.sourceType;
}
if (n.mediaType == 2) {
this.ruleForm.radioMusic.push(n);
this.radioMusic = n.sourceType;
}
if (n.mediaType == 3) {
this.ruleForm.radioVideo.push(n);
this.radioVideo = n.sourceType;
}
});
console.log(this.ruleForm, "处理后详情");
} catch (err) {
console.log(err);
}
},
//
handleAdd() {
this.ruleForm = {
processesList: [],
imgUrl: "",
radioImg: [],
radioMusic: [],
radioVideo: [],
resourcesList: []
};
this.radioMusic = 1;
this.radioVideo = 1;
this.radioImg = 1;
this.dialog.Visible = true;
this.type = "add";
this.dialog.title = "新增剧本";
},
async subMit() {
this.ruleForm.imgUrl = this.dataImg.join(",");
this.ruleForm.resourcesList = this.ruleForm.resourcesList.concat(this.ruleForm.radioImg).concat(this.ruleForm.radioMusic).concat(this.ruleForm.radioVideo)
this.ruleForm.resourcesList = this.ruleForm.resourcesList
.concat(this.ruleForm.radioImg)
.concat(this.ruleForm.radioMusic)
.concat(this.ruleForm.radioVideo);
console.log(this.ruleForm, "参数");
try{
let res = await addJbInfo(this.ruleForm)
if (res.code == 200) {
this.$message.success("新增成功");
this.dialog.Visible = false
this.queryList();
} else {
this.$message({
message: res.msg,
type: "error"
});
}
}catch(err){
console.log(err)
}
// try {
// let res = await addJbInfo(this.ruleForm);
// if (res.code == 200) {
// this.$message.success("");
// this.dialog.Visible = false;
// this.queryList();
// } else {
// this.$message({
// message: res.msg,
// type: "error"
// });
// }
// } catch (err) {
// console.log(err);
// }
},
//
handleEdit(row) {
@ -568,6 +874,8 @@ export default {
//
handleView(row) {
this.queryListDetail(row.id);
this.type = "view";
this.dialog.Visible = true;
},
//
async hanDel(row) {
@ -653,6 +961,16 @@ export default {
this.dialogVisible = true;
this.dialogImageUrl = this.ruleForm.imgUrls[e];
},
//
DelImg(index) {
this.ruleForm.radioImg.splice(index, 1);
},
DelMusic(index) {
this.ruleForm.radioMusic.splice(index, 1);
},
DelVideo(index) {
this.ruleForm.radioVideo.splice(index, 1);
},
//
deldialogimg(index) {
this.ruleForm.imgUrls.splice(index, 1);
@ -673,32 +991,143 @@ export default {
this.radioVideo = val;
},
//
handleAddImg(){
handleAddImg() {
this.ruleForm.radioImg.push({
title: "",
url: "",
processId:'',
mediaType:1,
sourceType:this.radioImg
processId: "",
mediaType: 1,
sourceType: this.radioImg
});
},
handleAddMusic() {
this.ruleForm.radioMusic.push({
title: "",
url: "",
processId:'',
mediaType:2,
sourceType:this.radioMusic
processId: "",
mediaType: 2,
sourceType: this.radioMusic
});
},
handleAddVideo() {
this.ruleForm.radioVideo.push({
title: "",
url: "",
processId:'',
mediaType:3,
sourceType:this.radioVideo
processId: "",
mediaType: 3,
sourceType: this.radioVideo
});
},
//
labeluploadimg({ file }) {
const formdata = new FormData();
formdata.append("file", file);
formdata.append("type", "product");
uploadFile(formdata).then(res => {
this.imgData.push(res.data.wjUrl);
// this.ruleForm.radioImg.push({
// title:'',
// url: res.data.wjUrl,
// mediaType: 1,
// sourceType: this.radioImg
// });
});
},
labeluploadmusic({ file }) {
const formdata = new FormData();
formdata.append("file", file);
formdata.append("type", "product");
uploadFile(formdata).then(res => {
this.musicData.push(res.data.wjUrl);
// this.ruleForm.radioMusic.push({
// title:'',
// url: res.data.wjUrl,
// mediaType: 2,
// sourceType: this.radioMusic
// });
});
},
labeluploadvideo({ file }) {
const formdata = new FormData();
formdata.append("file", file);
formdata.append("type", "product");
uploadFile(formdata).then(res => {
this.videoData.push(res.data.wjUrl);
// this.ruleForm.radioVideo.push({
// title:'',
// url: res.data.wjUrl,
// mediaType: 3,
// sourceType: this.radioVideo
// });
});
},
//
deldialogimg(item, index, type) {
console.log(index, type);
if (type == "img") {
this.imgData.splice(index, 1);
}
if (type == "music") {
this.musicData.splice(index, 1);
}
if (type == "video") {
this.videoData.splice(index, 1);
}
console.log(item);
delFile({ wjUrl: item }).then(res => {
if (res.code == 200) {
this.$message.success("删除成功");
}
});
},
//
setLc(item, type) {
this.list = item;
this.typeUrl = type;
console.log(this.typeUrl);
this.processId = "";
this.process.Visible = true;
},
subMitLc() {
this.process.Visible = false;
if (this.typeUrl == "img") {
let data = {
title: "",
url: this.list,
processId: this.processId,
mediaType: 1,
sourceType: this.radioImg
};
this.ruleForm.radioImg.push(data);
}
if (this.typeUrl == "music") {
let data = {
title: "",
url: this.list,
processId: this.processId,
mediaType: 2,
sourceType: this.radioMusic
};
this.ruleForm.radioMusic.push(data);
}
if (this.typeUrl == "video") {
let data = {
title: "",
url: this.list,
processId: this.processId,
mediaType: 3,
sourceType: this.radioVideo
};
this.ruleForm.radioVideo.push(data);
}
console.log(
this.ruleForm.radioImg,
this.ruleForm.radioVideo,
this.ruleForm.radioMusic
);
}
}
};
@ -749,3 +1178,36 @@ export default {
width: 100%;
}
</style>
<style lang="scss" scope>
.imgdata {
position: relative;
// display: inline-block;
float: left;
margin-left: 60px;
.imgdialog {
width: 146px;
height: 146px;
display: none;
position: absolute;
background: rgba(127, 127, 127, 0.5);
top: 0;
left: 0;
justify-content: space-between;
align-content: center;
p {
margin: auto;
i {
cursor: pointer;
color: white;
}
}
}
}
.imgdata:hover .imgdialog {
display: flex !important;
}
</style>

137
src/views/user/index.vue

@ -2,49 +2,92 @@
<div style="padding:30px;">
<!-- 搜索栏 -->
<div class="search">
<el-form :inline="true" :model="searchForm">
<el-form :inline="true">
<el-form-item label="用户昵称:" style="margin-right:50px;">
<el-input v-model="searchForm.date" placeholder="请输入剧本标题" />
<el-input
v-model="queryParams.query.nickName"
placeholder="请输入剧本标题"
/>
</el-form-item>
<el-form-item label="用户编号:" style="margin-right:50px;">
<el-input v-model="searchForm.name" placeholder="请输入工作室" />
<el-input
v-model="queryParams.query.code"
placeholder="请输入工作室"
/>
</el-form-item>
<el-form-item label="联系电话:" style="margin-right:50px;">
<el-input v-model="searchForm.label" placeholder="请输入标签" />
<el-input
v-model="queryParams.query.phonenumber"
placeholder="请输入标签"
/>
</el-form-item>
<el-form-item label="注册时间:" style="margin-right:50px;">
<el-date-picker
v-model="searchForm.time"
v-model="queryParams.query.time"
type="daterange"
align="right"
unlink-panels
range-separator="至"
start-placeholder="开始日期"
end-placeholder="结束日期"
:picker-options="pickerOptions"
/>
</el-form-item>
</el-form>
<div class="search-button">
<el-button size="medium" type="primary" style="height:36px;width:100px;">搜索</el-button>
<el-button size="medium" style="margin-left:20px;height:36px;width:100px;">重置</el-button>
<el-button size="medium" type="primary" style="height:36px;width:100px;"
>搜索</el-button
>
<el-button
size="medium"
style="margin-left:20px;height:36px;width:100px;"
>重置</el-button
>
</div>
</div>
<!-- 列表 -->
<div class="content">
<el-table ref="singleTable" :data="tableData" border style="width: 100%">
<el-table
v-loading="loading"
ref="singleTable"
:data="tableData"
border
style="width: 100%"
>
<el-table-column align="center" type="index" label="序号" width="50" />
<el-table-column align="center" property="date" label="昵称" />
<el-table-column align="center" property="name" label="编号" />
<el-table-column align="center" property="label" label="联系电话" />
<el-table-column align="center" property="time" label="注册时间" />
<el-table-column align="center" property="avatar" label="头像">
<template slot-scope="scope">
<div>
<img :src="scope.row.avatar" alt="" />
</div>
</template>
</el-table-column>
<el-table-column align="center" property="nickName" label="昵称" />
<el-table-column align="center" property="code" label="编号" />
<el-table-column
align="center"
property="phonenumber"
label="联系电话"
/>
<el-table-column
align="center"
property="createTime"
label="注册时间"
/>
<el-table-column align="center" property="level" label="用户等级" />
<el-table-column align="center" property="remark" label="备注" />
<el-table-column align="center" label="操作">
<template slot-scope="scope">
<el-button type="text" size="mini" @click="handleEdit(scope.row)">修改等级</el-button>
<el-button type="text" size="mini" @click="handleEdit(scope.row)"
>修改等级</el-button
>
</template>
</el-table-column>
</el-table>
<pagination
v-show="total > 0"
:total="total"
:page.sync="queryParams.pageNum"
:limit.sync="queryParams.pageSize"
@pagination="queryUserInfo"
/>
</div>
<!-- 新增表单 -->
<el-dialog title="编辑用户" :visible.sync="dialog.Visible">
@ -66,47 +109,75 @@
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="dialog.Visible = false"> </el-button>
<el-button type="primary" @click="dialog.Visible = false"> </el-button>
<el-button type="primary" @click="dialog.Visible = false"
> </el-button
>
</div>
</el-dialog>
</div>
</template>
<script>
import { queryUserInfo, updateUserInfo } from "@/api/userInfoApi.js";
export default {
data() {
return {
searchForm: {},
tableData: [
{
date: '玩家1',
name: 'A001',
label: '13333333333',
time: '2021-09-01 12:00:00',
level: '一级用户'
loading: true,
queryParams: {
pageNum: 1,
pageSize: 15,
query: {
nickName: undefined,
code: undefined,
phonenumber: undefined
},
params: {
beginTime: undefined,
endTime: undefined
}
],
},
total: 0,
tableData: [],
form: {},
dialog: {
Visible: false
}
}
};
},
mounted() {
this.queryUserInfo();
},
methods: {
//
async queryUserInfo() {
this.loading = true;
try {
let res = await queryUserInfo(this.queryParams);
console.log(res)
if(res.code == 200){
this.loading = false;
this.tableData = res.data.rows;
this.total = res.data.total;
}
} catch (err) {
console.log(err);
}
},
//
handleEdit(row) {
this.dialog.Visible = true
this.form = row
this.dialog.Visible = true;
this.form = row;
}
}
}
};
</script>
<style scoped>
.content {
background: #fff;
margin-top:15px;
margin-top: 15px;
}
.add-button{
margin-top:15px;
.add-button {
margin-top: 15px;
}
.search-button {
display: flex;

Loading…
Cancel
Save