elementui展示多张图片_vue+element ui 上传多张图片或视频-程序员宅基地

技术标签: elementui展示多张图片  

:limit="5"

action=""

accept=".jpg,.jpeg,.JPG,.JPEG,.png,.PNG"

list-type="picture-card"

:on-preview="handlePictureCardPreview"

:on-remove="handleRemove2"

:http-request="handleUploadImage"

:before-upload="beforeImageUpload"

:on-change="changeImgStatus"

:file-list="temp_img_list">

           

上传失败了!

import {VueCropper} from 'vue-cropper';

import selector from '@/components/selector'

import bus from '../common/bus.js';

import config from '../../config'

export default {

name: "edit_face_adv",

components: {

selector,

VueCropper,

},

data() {

let checkNum = (rule, value, callback) => {

if (!value) {

return callback(new Error('红包数量不能为空'));

} else {

const reg = /^\+?[1-9][0-9]*$/;

if (reg.test(value)) {

let hb_num = Math.ceil(this.adv_group.hb_budget * 1.5);

if (parseInt(value) > hb_num) {

return callback(new Error("红包数量不能超过" + hb_num + "个"))

} else {

callback();

}

} else {

return callback(new Error("请输入正确的红包数量"));

}

}

};

let checkHbBudget = (rule, value, callback) => {

if (!value) {

return callback(new Error('红包金额不能为空'));

} else {

const reg = /^\+?[1-9][0-9]*$/;

if (reg.test(value)) {

if (value < 1) {

return callback(new Error("红包金额不能小于1元"))

} else {

callback();

}

} else {

return callback(new Error("请输入正确的红包金额"));

}

}

};

return {

wxapp_id:'',

multipleSelection: [],

title: '',

form: {},

loadingData: true,

loadingText: '拼命加载中',

garden_filter_text: '',

isIndeterminate: false,

checked_garden_list: [],

checked_region_list: [],

checked_garden_num: 0,

checked_adv_list: '',

CheckedNodes: [],

region_list: [],

adv_category_list: [],

tpl_list: [],

defaultProps: {

children: 'children',

label: 'name'

},

defaultProps2: {

children: 'children',

label: 'ad_name'

},

adv_group: {},

limit: {

push_hour: 0,//推送时段的选择 0不限 1有限制

},

active_step: 1,

pickerOptions: this.api.get_time_config(),

adv_tree: [],

adv_category_select: [],

adv_list: [],

goods: {

list: [],

},

copy: {

id: '',

visible: false,

},

video: {

path: '',

visible: false,

status: 0,

file: [],

fileList: []

},

crop: {

file: '',

fileList: [],

fileName: '',

info: true, //裁剪框的大小信息

outputSize: 1, // 裁剪生成图片的质量

canScale: true, // 图片是否允许滚轮缩放

autoCrop: true, // 是否默认生成截图框

visible: false,//是否显示弹窗

fixedBox: true,// 固定截图框大小 不允许改变  可选值:true | false

cropImg: '',

imgList: [],

imgSrc: '',//图片地址

autoCropWidth: 450, // 默认生成截图框宽度

autoCropHeight: 250, // 默认生成截图框高度

fixed: true, //是否开启截图框宽高固定比例

fixedNumber: [9, 5], //截图框的宽高比例

centerBox: true,//截图框是否被限制在图片里面

enlarge: 1, // 输出图像比例

editKey: '',//当前编辑的图片在数组中的key值

},

crop2: {

file: '',

fileList: [],

fileName: '',

info: true, //裁剪框的大小信息

outputSize: 1, // 裁剪生成图片的质量

canScale: true, // 图片是否允许滚轮缩放

autoCrop: true, // 是否默认生成截图框

visible: false,//是否显示弹窗

fixedBox: true,// 固定截图框大小 不允许改变  可选值:true | false

cropImg: '',

imgList: [],

imgSrc: '',//图片地址

autoCropWidth: 200, // 默认生成截图框宽度

autoCropHeight: 200, // 默认生成截图框高度

fixed: true, //是否开启截图框宽高固定比例

fixedNumber: [1, 1], //截图框的宽高比例

centerBox: true,//截图框是否被限制在图片里面

enlarge: 1, // 输出图像比例

editKey: '',//当前编辑的图片在数组中的key值

},

imgFileName: '',

rules1: {

push_limit: [

{required: true, message: '请输入推送限制', trigger: 'blur'}

],

click_limit: [

{required: true, message: '请输入点击限制', trigger: 'blur'}

],

fee_method: [

{required: true, message: '请选择广告计费方式', trigger: 'blur'}

],

unit_price: [

{required: true, message: '请填写广告单价', trigger: 'blur'}

],

settle_method: [

{required: true, message: '请选择广告结算方式', trigger: 'blur'}

],

hb_budget: [

{required: true, validator: checkHbBudget, trigger: 'blur', min: 1}

],

hb_num_budget: [

{required: true, message: '请填写红包限领次数', trigger: 'blur'}

],

hb_day_num_budget: [

{required: true, message: '请填写红包日限领次数', trigger: 'blur'}

],

hb_total_num_budget: [

{required: true, validator: checkNum, trigger: 'blur'}

],

hb_min: [

{required: true, message: '请填写红包最小限额', trigger: 'blur'}

],

hb_max: [

{required: true, message: '请填写红包最高限额', trigger: 'blur'}

],

service_fee_percent: [

{required: true, message: '请填写该商户发放红包收取的服务费比例', trigger: 'blur'}

]

},

rules3: {

ad_name: [

{required: true, message: '请输入广告名称', trigger: 'blur'}

],

ad_link: [

{required: true, message: '请输入广告链接', trigger: 'blur'}

],

sort: [

{required: true, message: '请输入广告排序', trigger: 'blur'}

],

intro: [

{required: true, message: '请输入引导词', trigger: 'blur'}

],

cate_id: [

{required: true, message: '请选择广告分类', trigger: 'blur'}

],

type: [

{required: true, message: '请选择广告投放类型', trigger: 'blur'}

],

push_type: [

{required: true, message: '请选择广告投放类型', trigger: 'blur'}

],

theme_id: [

{required: true, message: '请选择加入主题的广告', trigger: 'blur'}

]

},

//2020.10.30新增

gardenForm:{

garden_sum:'',

},

garden_news_data:[],

show_a:0,

uploadForm:{},

temp_img_list: [], //图片列表

temp_video_list: [], //视频

filenews:'', //要上传的图片二进制参数

fileVideonews:'', //要上传的视频二进制参数

ImgdialogVisible:false,

VideodialogVisible:false,

temp_img_url:'',

temp_video_url:'',

upload_status:'',

img_num:'',

video_num:'',

upload_img_list:[], //图片参数

upload_video_list:[], //提交给后台的视频参数

postFormData:{}, //提交给后台的数据

ad_link:'', //提交到后台的参数 广告文件内容

upload_img_str: '',

upload_video_str: '',

agent_data:[], //agent数据信息

age_data:[], //年龄投放段

editData:[],

checked_garden_keys: [],

// get_band_gardens:[],

}

},

watch: {

garden_filter_text(val) {

this.$refs.tree.filter(val);

},

// checked_garden_list() {

//     this.checked_garden_num = this.checked_garden_list.length;

// },

'adv_group.fee_method': function (val) {

if (val == 0) {

this.adv_group.settle_method = 2;

}

},

'form.type': function (val) {

if (val == 4) {

this.form.push_type = 1;

this.form.is_charge = 0;

this.getAdvList();

}

if (val == 5) {

this.crop.autoCropWidth = 288;

this.crop.autoCropHeight = 557;

} else {

this.crop.autoCropWidth = 450;

this.crop.autoCropHeight = 250;

}

},

},

created() {

let adv_id = this.$route.query.adv_id;

this.adv_id = adv_id;

console.log('adv_id-----',adv_id);

//获取agent数据信息

this.getData();

if (this.$refs['form1'] !== undefined) {

this.$refs['form'].resetFields();

}

if (this.$refs['form2'] !== undefined) {

this.$refs['form'].resetFields();

}

if (this.$refs['form3'] !== undefined) {

this.$refs['form'].resetFields();

}

this.garden_filter_text = '';

},

activated() {

let adv_id = this.$route.query.adv_id;

this.adv_id = adv_id;

this.getData();

},

methods: {

// 获取广告数据

getData() {

this.handleEdit();

},

//获取年龄投放段 /api/adv/get_age_slot

get_age_slot(){

this.$post(config.wsURL+'/api/adv/get_age_slot').then((res) => {

this.age_data = res.data;

})

},

//修改

async handleEdit() {

let res = await this.$post(config.wsURL+'/api/adv/get_adv_row', {adv_id: this.adv_id});

if(!res) {

this.loadingData = false;

}

let advs = res.data.advs; //广告数据

let gardens = res.data.gardens; //小区数据

let group = res.data.group; //小区分组数据

this.crop.imgSrc = '';

if (this.$refs.tree) {

this.$refs.tree.setCheckedNodes([]);

}

this.checked_garden_list = [];

this.temp_img_list = [];

this.adv_group = {

enable: true,

start_time: group.start_time,

end_time: group.end_time,

sex_limit: String(group.sex_limit),

age_limit: String(group.age_limit),

system_limit: '',

click_limit: '0',

day_click_limit: '0',

push_limit: '0',

day_push_limit: '0',

week_push_limit: '0',

week_click_limit: '0',

unit_price: '0',

jump_limit: '1',

fee_method: String(group.fee_method),

day_budget: '0',

total_budget: group.total_budget,

buyout: '0',

settle_method: '2',

has_hb: false,

hb_range_limit: false,

hb_budget: 0,

hb_total_num_budget: 0,

hb_num_budget: 1,

hb_day_num_budget: 1,

push_hour: '',

garden_list: gardens, //选中的小区数据

time_range: [new Date(group.start_time * 1000), new Date(group.end_time * 1000)],

};

let type = String(this.$route.params.type)? String(this.$route.params.type):'1';

this.form = {

id: advs.id,

ad_name: advs.ad_name,

type: String(advs.adv_type),

cate_id: '',

cate_pid: '',

ad_link: '',

desc: '',

sort: advs.sort,

push_type: type === '6' ? true : 0,

theme_id: '',

from: 1,

video: '',

wxapp: {

url: '',

source_id: '',

top: 0,

},

intro: "查看详情",

is_wxapp:'0',

wxapp_id:'',

path:'',

act: 'edit'

};

// this.form.type= String(this.$route.params.type);

let date = new Date();

let year = date.getFullYear();

let month = date.getMonth() + 1;

let day = date.getDate();

let time = year + "-" + month + "-" + day + " " + "00:00:00";

let year2 = date.getFullYear() + 1;

let time2 = year2 + "-" + month + "-" + day + " " + "00:00:00";

let ad_str = advs.ad_link;

let ad_arr = ad_str.split(',');

for(let i=0;i

if(i === 0 && ad_str){

console.log(ad_arr[i]);

this.temp_img_list.push({

'url': ad_arr[i],

});

}else{

this.temp_img_list.push({

'url': '',

});

}

// console.log(i);

}

},

// ---------------------------- 上传文件st -------------------

//处理上传图片数据格式

handleimgStrData(){

for (let i = 0; i < this.temp_img_list.length; i++) {

let url = this.temp_img_list[i].url;

this.upload_img_list.push(url);

}

let imgStr = "";

this.upload_img_list.filter((item,i)=>{

if(i == this.upload_img_list.length-1) {

imgStr+=item;

}else{

imgStr+=item+",";

}

})

this.upload_img_str = imgStr;

},

//处理上传视频数据格式

handleVideoStrData(){

for (let i = 0; i < this.temp_video_list.length; i++) {

let url = this.temp_video_list[i].url;

this.upload_video_list.push(url);

}

let videoStr = "";

this.upload_video_list.filter((item,i)=>{

if(i == this.upload_video_list.length-1) {

videoStr+=item;

}else{

videoStr+=item+",";

}

})

this.upload_video_str = videoStr;

},

//图片放大预览

handlePictureCardPreview(file) {

this.temp_img_url = file.url;

this.ImgdialogVisible = true;

},

//删除图片

handleRemove2(file,fileList) {

for (let i = 0; i < this.temp_img_list.length; i++) {

if (this.temp_img_list[i]['uid'] === file.uid) {

this.temp_img_list.splice(i, 1)

}

}

},

//获取图片上传的总数

changeImgStatus(file, fileList){

this.img_num = fileList.length;

},

//获取视频上传的总数

changeVideoStatus(file, fileList){

this.video_num = fileList.length;

},

//上传图片前判断

beforeImageUpload(file) {

var formData = new FormData();

formData.append('file',file);

this.filenews = formData;

const isLt5M = file.size / 1024 / 1024 < 2;

if (!isLt5M) {

this.$message.error('上传图片大小不能超过 2MB!');

}

if (this.temp_img_list.length === 5) {

this.$message.error('最多上传5张图片!');

}

},

//上传图片方法

handleUploadImage(e){

const file = e.file;

const isLt1M = file.size / 1024 / 1024 <= 2;

if (!isLt1M) {

this.$message.error('上传图片大小不能超过 2MB!');

return  false;

}

this.$post(config.wsURL+'/api/cos/upload',  this.filenews).then((res) => {

if (res) {

this.temp_img_list.push({

'url': res.data.src,

});

} else {

this.$message.error("上传图片失败");

this.upload_status = 2;

}

});

return false;

},

//删除视频

handleRemoveVideo(file,fileList) {

for (let i = 0; i < this.temp_video_list.length; i++) {

if (this.temp_video_list[i]['uid'] === file.uid) {

this.temp_video_list.splice(i, 1)

}

}

},

handleVideoCardPreview(file) {

this.temp_video_url = file.url;

this.ImgdialogVisible = true;

},

beforeVideoUpload(file, fileList) {

var formData = new FormData();

formData.append('file',file);

this.fileVideonews = formData;

this.video.fileList = [];

if (!/\.(mp4|3gp|flv|avi|wmv)$/.test(file.name)) {

this.$message.error('视频类型必须是mp4,3gp,flv,avi,wmv中的一种');

this.video.fileList = [];

return false

}

if (file.size > 6291456) {

this.$message.error('视频大小不能超过6M');

this.video.fileList = [];

return false

}

this.video.file = document.querySelector('input[type=file]').files[0];

this.video.path = file.url;

this.temp_video_url = file.url;

},

//上传视频

handleUploadVideo(e) {

if (this.form.video) {

return true;

}

this.$post(config.wsURL+'/api/cos/upload',this.fileVideonews).then((res) => {

if (res) {

this.temp_video_list.push({

'url': res.data.src,

});

this.temp_video_url = res.data.src;

} else {

this.$message.error('上传视频失败!');

this.loadingData = false;

throw false;

}

});

},

// ---------------------------- 上传文件end ------------------

// 保存编辑/新增

async saveEdit() {

this.loadingText = '提交中,请等待片刻...';

this.loadingData = true;

//处理表单校验失败后,去除Loading

try {

await this.$refs['form3'].validate();

} catch (e) {

if (!e) {

this.$message.error('请填写广告完整信息!');

this.loadingData = false;

throw false;

}

}

//对推送时间段的处理

this.checkPushHour();

//对主题广告的处理

if (this.form.type === '4') {

this.getCheckedAdv();

}

this.adv_group.start_time = new Date(this.adv_group.time_range[0]).getTime() / 1000;

this.adv_group.end_time = new Date(this.adv_group.time_range[1]).getTime() / 1000;

this.form.adv_group = this.adv_group;

this.form.adv_group.garden_list = this.checked_garden_list;

//

// agent_idinteger是广告商id

// ad_namestring是广告名字

// adv_typeinteger是广告类型 1图片 2视频

// ad_linkstring是广告文件内容

// tmp_idinteger是模版id

// start_timestring是广告开始投放时间

// end_timestring是广告结束投放时间

// sex_limitinteger是性别投放限制 0无限制 1男 2女

// age_limitinteger是年龄段投放限制

// fee_methodstring是计费方式

// total_budgetstring是总预算

// band_codeobject是投放小区

//获取处理好的上传图片数据格式

this.handleimgStrData();

//获取上传视频数据

this.handleVideoStrData();

// console.log(this.upload_img_str);

// console.log(this.upload_video_str);

// return false;

if(this.form.type == 1){ //图片

this.ad_link = this.upload_img_str;

}else if(this.form.type == 2){ //视频

this.ad_link = this.upload_video_str;

}else{

this.ad_link = '';

}

// this.adv_group.time_range.join(',');

// let start_time_arr = this.adv_group.time_range[0].toString();

// let end_time_arr = this.adv_group.time_range[1].toString();

// let start_time = start_time_arr.substring(0,10);

// let end_time = end_time_arr.substring(0,10);

// console.log(this.adv_group.start_time);

// console.log(this.adv_group.end_time);

// console.log(this.form.adv_group.garden_list);

this.postFormData = {

'agent_id': this.agent_data.id,

'agent_pid': this.agent_data.pid,

'ad_name': this.form.ad_name,

'adv_type':this.form.type,

'ad_link':this.ad_link,

'tmp_id':'1',

'start_time':this.adv_group.start_time,

'end_time':this.adv_group.end_time,

'sex_limit':this.adv_group.sex_limit,

'age_limit':this.adv_group.age_limit,

'fee_method':this.adv_group.fee_method,

'total_budget':this.adv_group.total_budget,

'band_code': this.form.adv_group.garden_list,

'sort':this.form.sort,

'id' : this.adv_id,

};

console.log(this.postFormData);

// return false;

this.loadingData = false;

this.$post(config.wsURL+'/api/adv/edit',this.postFormData).then((res) => {

this.loadingData = false;

if (res.code === 1) {

this.$message.success(res.msg);

this.$router.push({name: 'face_adv',params:{tag:'edit_face_adv'}});

} else {

this.loadingData = false;

this.$message.error(res.msg);

}

})

},

handleClick(tab, event) {

},

}

}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_39853892/article/details/111512584

智能推荐

unity 物体沿某一坐标轴旋转_unity 绕一轴旋转-程序员宅基地

文章浏览阅读715次。obj.transform.Rotate(0, fRotateSpeed * Time.deltaTime, 0, Space.Self);_unity 绕一轴旋转

【测试】8bit和4bit量化对模型在MMLU数据集上准确率的影响_q4量化 mmlu-程序员宅基地

文章浏览阅读859次,点赞30次,收藏16次。下面是改变其中某个参数后在 MMLU 数据集上的准确率,可以看出即使是 4bit 对准确率影响都没有很大,首 Token 性能还可以接近原精度,还节省了大量的空间。ms,最后的测试结果还算比较接近官方的结果,以此作为 baseline 和量化后的模型权重对比推理下游任务准确率的损失情况。),4bit 量化包含两种 4bit 的数据类型 FP4 和 NF4,以及。Mistral-7B 是一个很强的 7B 开源模型,在 Mistral。)并直接在原精度(BF16)上进行推理,尝试复现出官方的准确率。_q4量化 mmlu

python——飞机大战小游戏_python小游戏代码飞机大战-程序员宅基地

文章浏览阅读2.9k次,点赞4次,收藏22次。先安装一下pygame这个库然后将素材烤入,一些飞机图片和背景需要修改一下编辑器不然会找不到草率了,貌似得再pycharm里下载pip下载的它找不到我又重新下载了一下再右面加号新建一个解释器选择本地python.exe,把公开它的库选上终于好了。_python小游戏代码飞机大战

Carla系列——4.Cara模拟器添加语义分割相机(Semantic segmentation camera)_如何使用carla仿真语义分割模型-程序员宅基地

文章浏览阅读1.8k次,点赞6次,收藏15次。本节的内容是生成一个语义分割相机,主要分为:四部分。一、初始化世界以及添加车辆二、生成语义分割相机Semantic segmentation camera三、监听语义分割相机,进行数据处理四、呈现最终效果一、初始化世界以及添加车辆这一节承接之前生成车辆的内容(Carla生成车辆).设置vehicle 为自动控制模式1.添加车辆的完整代码为:import globimport osimport sysimport timeimport randomimport._如何使用carla仿真语义分割模型

"Java:comp/env/"讲解与JNDI_comp.env.ejb.dbtableoperlocal-程序员宅基地

文章浏览阅读567次。我们在使用JNDI调用某个对象时,会有下述两种方式context.lookup(“Java:comp/env/XXX”) context.lookup(“XXX”)context.lookup(“java:comp/env/XXX”)只能用在J2EE环境,如果你自己写一个main函数,想通过context.lookup(“java:comp/env/XXX”)这样的方式_comp.env.ejb.dbtableoperlocal

2022年下半年系统架构设计师下午真题及答案解析_系统架构设计师真题-程序员宅基地

文章浏览阅读1.4w次,点赞10次,收藏63次。新系统除了保持现有的四级固定会员制度外,还需要根据用户的消费金额、偏好、重复性等相关特征动态调整商品的折扣力度,并支持在特定的活动周期内主动筛选与活动主题高度相关的用户集合,提供个性化的打折促销活动。系统的故障检测和诊断是宇航系统提高装备可靠性的主要技术之一,随着装备信息化的发展,分布式架构下的资源配置越来越多、资源布局也越来越分散,这对系统的故障检测和诊断方法提出了新的要求。因为宇航系统是一个非常复杂的系统,如果采用张工的基于解析模型的方法,这一类方法需要建立再精准数学模型的基础上来进行故障诊断。_系统架构设计师真题

随便推点

西华计算机系研究生好不好,西华大学考研难吗?一般要什么水平才可以进入?...-程序员宅基地

文章浏览阅读1.8k次。首先,申明一点:考研本身就不是一件容易的事情,在考研的过程中,找准自己的定位、学会搜集资料、搜集信息并且辅之于踏实的备考、准确的方法是至关重要的。同时,要学会坚持,不忘初心,很多同学在开始备考时,斗志昂扬,但是在进度接近尾声时,自己的志气也接近了尾声,这是万万不行的。有句话说的好:“骆驼走得慢,但终能到达终点”。我们也是,过程中,要循序渐进的进步,一步一步的坚持备考,终能到达彼岸。接下来,给大家一..._西华大学计算机考研好考吗

搭建Windows Server 2008故障转移群集-程序员宅基地

文章浏览阅读255次。本文章将详细讲述基于Windows Server 2008 R2的故障转移群集的实现,包括基本知识介绍,故障转移群集环境准备,实施过程,群集的维护等。故障转移群集可以配置使用多种不同的配置。组成群集的服务器可以是活跃状态或不活跃状态,而不同服务器可以被配置为在活跃服务器故障后立刻接管相应的资源。一般故障转移的过程只需要几分钟的时间,至于时间的长短主要取..._安装故障转移群集中的验证配置步骤,测试工作包括

【深大C语言OJ】对齐输出(格式化输出)_深大oj-程序员宅基地

文章浏览阅读748次,点赞19次,收藏9次。因为是输出部分的变化,所以我们需要调整printf函数中的内容,因为默认就是右对齐输出,所以这个可以不用管;至于占8个字符输出,将%d改为%8d即可。此题在输出整数的基础上多了两个要求,一个是每个整数占8个字符的宽度输出,一个是右对齐输出。另外还需要注意三个整数之间要用空格分开。只有一行,按照格式要求依次输出三个整数,之间以一个空格分开。读入三个整数,按每个整数占8个字符的宽度,右对齐输出它们。只有一行,包含三个整数,整数之间以一个空格分开。_深大oj

Java面试题-数据结构_数据结构面试-程序员宅基地

文章浏览阅读3.5k次,点赞3次,收藏37次。八大基本数据结构以及衍生相关数据结构_数据结构面试

JVM详解之:java class文件的密码本_java 密码本-程序员宅基地

文章浏览阅读1.1w次,点赞2次,收藏5次。一切的一切都是从javac开始的。从那一刻开始,java文件就从我们肉眼可分辨的文本文件,变成了冷冰冰的二进制文件。变成了二进制文件是不是意味着我们无法再深入的去了解java class文件了呢?答案是否定的。机器可以读,人为什么不能读?只要我们掌握java class文件的密码表,我们可以把二进制转成十六进制,将十六进制和我们的密码表进行对比,就可以轻松的解密了。下面,让我们开始这个激动人心的过程吧。_java 密码本

Android Proguard混淆打包经验总结_android proguard lambda-程序员宅基地

文章浏览阅读3.4k次,点赞10次,收藏76次。作为一名Android开发,应该了解并尝试给自己的项目进行Proguard混淆打包。项目经过Proguard混淆打包后,会发现apk包体积会变小,也就是混淆可以使得apk瘦身;并且反编译apk的时候会发现, 项目中的源码都被处理过,进一步保障了apk的安全;这就是我所理解的Proguard混淆打包的两个优点。不过,想要真正给自己的项目进行Proguard混淆打包,可不是一件容易的事情,真正尝试去做_android proguard lambda

推荐文章

热门文章

相关标签