Compare commits

...

22 Commits

Author SHA1 Message Date
liaozetao
613482ee59 修改窗口长度滚动 2024-01-23 16:28:56 +08:00
liaozetao
77f44c5632 修改loading尺寸 2024-01-23 16:16:06 +08:00
liaozetao
79ba685d1c 修改高度 2024-01-23 16:08:39 +08:00
liaozetao
6bceeba4ed 修改大小 2024-01-23 15:50:05 +08:00
liaozetao
bfdcd11f1e 补充 2024-01-23 15:34:56 +08:00
liaozetao
4461999ab2 新增loading图 2024-01-23 15:33:40 +08:00
liaozetao
d7a50984d8 修改时间长度 2024-01-23 15:12:36 +08:00
liaozetao
548bb814f5 去除添加功能 2024-01-23 15:06:09 +08:00
liaozetao
f8a7b6ee2d 修復鏈接回線問題 2024-01-19 16:13:52 +08:00
liaozetao
a366e4485c 修改鏈接展示邏輯 2024-01-19 16:10:05 +08:00
liaozetao
5f7d0edd0d 修改上傳按鈕邏輯 2024-01-19 16:04:13 +08:00
liaozetao
687f0f84b6 修改刪除按鈕邏輯 2024-01-19 15:58:29 +08:00
liaozetao
a91b5c062f 打印日誌 2024-01-19 15:52:43 +08:00
liaozetao
451de44db2 清空鏈接處理 2024-01-19 15:47:35 +08:00
liaozetao
c7273dce2b 修復編輯回線 2024-01-19 15:42:57 +08:00
liaozetao
d32dfcb627 修復查詢問題 2024-01-19 15:36:27 +08:00
liaozetao
be5f65d0d8 修改上傳組件按鈕 2024-01-19 15:24:05 +08:00
liaozetao
ae0bbcb43e 刪除多餘代碼 2024-01-19 15:19:03 +08:00
liaozetao
5d1b39e53c 修改上傳組件 2024-01-19 15:14:23 +08:00
liaozetao
13fa7433c6 修復view name問題 2024-01-19 14:50:43 +08:00
liaozetao
356175e2ab 修复报错 2024-01-19 10:12:54 +08:00
liaozetao
4a6c6d5b1c 新增官网配置页面 2024-01-18 15:53:16 +08:00
5 changed files with 551 additions and 2 deletions

View File

@@ -23,6 +23,41 @@ export const uploadFile = id => {
});
};
export const uploadQiNiuFile = (file) => {
console.log(file);
let formData = new FormData();
formData.append('file', file);
return new Promise((resolve, reject) => {
request.post('/admin/qiniu/upload/file', formData).then(res => {
resolve(res);
}).catch(e => {
reject(e);
});
});
};
export const uploadTencentFile = id => {
return new Promise((resolve, reject) => {
$.ajaxFileUpload({
fileElementId: id,
url: '/admin/upload/tencent/file',
type: 'post',
dataType: 'json',
secureuri: false,
async: true,
submitType: 'ajax',
success: function (res) {
resolve(res);
},
error: function (res, status, e) {
console.error(res);
console.error(status);
reject(e);
}
});
});
};
export const uploadGift = (file) => {
let formData = new FormData();
console.log(file);

View File

@@ -0,0 +1,18 @@
import request from '@/utils/request';
export const getOfficialConfigList = query => {
return request({
url: '/admin/official/config/list',
method: 'get',
params: query
});
};
export const saveOfficialConfig = data => {
return request({
url: '/admin/official/config/save',
headers:{"Content-Type": 'application/x-www-form-urlencoded'},
method: 'post',
data: data
});
}

View File

@@ -0,0 +1,9 @@
import request from '@/utils/request';
export const browseFor30Days = query => {
return request({
url: '/admin/official/browse/record/browseFor30Days',
method: 'get',
params: query
});
};

View File

@@ -99,14 +99,13 @@
</div>
<div class="modal fade loading" style="background: #00000040;" tabindex="-1" role="dialog"
aria-labelledby="loadingModalLabel" aria-hidden="true" data-backdrop="static" data-keyboard="false">
<div class="loadingGif" style="position: fixed;"><img :src="loading"></div>
<div class="loadingGif" style="position: fixed; left:50%; top:50%;"><img src="https://img.zcool.cn/community/0111345d94b0b8a801211d53cbd04d.gif" style="width: 10%;"></div>
</div>
</template>
<script>
import store from '@/store';
import { getStore } from '@/utils/store';
import loading from '@/assets/images/loading.gif';
export default {
name: 'MaintainerView',

View File

@@ -0,0 +1,488 @@
<template>
<section class="content">
<div class="box box-danger">
<div class="box-body">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1 id="itemTitle"></h1>
</section>
<!-- .content -->
<section class="content">
<div id="configTable"></div>
</section><!-- .content -->
</div>
<div class="box-body" style="height:150%;">
<!-- Content Header (Page header) -->
<section class="content-header">
<h1 id="browseTitle">官网访问数据-最近30天</h1>
</section>
<!-- .content -->
<div id="browseTable"></div>
</div>
</div>
</section>
<div class="modal fade" id="editModal" tabindex="-1" role="dialog" aria-labelledby="modalLabel" style="height: 100%; overflow: hidden; overflow: scroll;">
<div class="modal-dialog" role="document">
<div class="modal-content">
<div class="modal-header">
<button type="button" class="close" data-dismiss="modal" aria-label="Close">
<span aria-hidden="true">&times;</span>
</button>
<h4 class="modal-title" id="modalLabel">H5官网配置</h4>
</div>
<div class="modal-body">
<form class="form-horizontal">
<input type="hidden" name="id" v-model="officialConfig.id" />
<div class="form-group">
<label class="col-sm-3 control-label">iOS下载配置</label>
<div class="col-sm-8">
</div>
</div>
<div class="form-group">
<label for="iosVersion" class="col-sm-3 control-label">iOS版本号:</label>
<div class="col-sm-8">
<input type="text" class="form-control validate[required]" name="categoryCode" id="categoryCode"
v-model="officialConfig.iosVersion" />
</div>
</div>
<div class="form-group">
<label for="iosSkipType" class="col-sm-3 control-label">iOS跳转类型:</label>
<div class="col-sm-8">
<select name="iosSkipType" id="iosSkipType" class="form-control" data-btn-class="btn-warning" v-model="officialConfig.iosSkipType">
<option value="0">AppStore</option>
<option value="1">其它H5链接</option>
</select>
</div>
</div>
<div class="form-group">
<label for="iosSkipUrl" class="col-sm-3 control-label">iOS跳转链接:</label>
<div class="col-sm-8">
<input type="text" class="form-control validate[required]" name="iosSkipUrl" id="iosSkipUrl"
v-model="officialConfig.iosSkipUrl" />
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">Android下载配置</label>
<div class="col-sm-8">
</div>
</div>
<div class="form-group">
<label for="androidVersion" class="col-sm-3 control-label">Android版本号:</label>
<div class="col-sm-8">
<input type="text" class="form-control validate[required]" name="androidVersion" id="androidVersion"
v-model="officialConfig.androidVersion" />
</div>
</div>
<div class="form-group">
<label for="androidSkipType" class="col-sm-3 control-label">Android跳转类型:</label>
<div class="col-sm-8">
<select name="androidSkipType" id="androidSkipType" class="form-control" data-btn-class="btn-warning" v-model="officialConfig.androidSkipType">
<option value="0">GooglePlay</option>
<option value="1">直接下载Apk</option>
</select>
</div>
</div>
<div class="form-group" v-if="officialConfig.androidSkipType == 0">
<label for="androidSkipUrl" class="col-sm-3 control-label">Android跳转链接:</label>
<div class="col-sm-8">
<input type="text" class="form-control validate[required]" name="androidSkipUrl" id="androidSkipUrl"
v-model="officialConfig.androidSkipUrl" />
</div>
</div>
<div class="form-group">
<label for="androidNormalUrl" class="col-sm-3 control-label">Android常规包:</label>
<div class="col-sm-8">
<input type="file" id="normalFile" name="uploadFile" @change="changeFile($event)" v-if="officialConfig.androidNormalUrl == ''"/>
<span class="btn col-sm-4" id="normalUploadInfo" style="color:red;">{{ officialConfig.androidNormalUrl }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-8">
<button class="btn btn-default col-sm-4" type="button" id="normalUploadBtn" @click="uploadNormal" v-if="officialConfig.androidNormalUrl == ''">上传</button>
<button class="btn btn-danger col-sm-4" type="button" id="normalDelBtn" @click="delNormal" v-if="officialConfig.androidNormalUrl != ''">删除</button>
</div>
</div>
<div class="form-group">
<label for="androidReserveUrl" class="col-sm-3 control-label">Android备用包:</label>
<div class="col-sm-8">
<input type="file" id="reserveFile" name="uploadFile" v-if="officialConfig.androidReserveUrl == ''"/>
<span class="btn col-sm-4" id="reserveUploadInfo" style="color:red;">{{ officialConfig.androidReserveUrl }}</span>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label"></label>
<div class="col-sm-8">
<button class="btn btn-default col-sm-4" type="button" id="reserveUploadBtn" @click="uploadReserve" v-if="officialConfig.androidReserveUrl == ''">上传</button>
<button class="btn btn-danger col-sm-4" type="button" id="reserveDelBtn" @click="delReserve" v-if="officialConfig.androidReserveUrl != ''">删除</button>
</div>
</div>
<div class="form-group">
<label class="col-sm-3 control-label">联系方式配置</label>
<div class="col-sm-8">
</div>
</div>
<div class="form-group">
<label for="contact0" class="col-sm-3 control-label">Wechat:</label>
<div class="col-sm-8">
<input type="text" class="form-control validate[required]" name="contact0" id="contact0"
v-model="officialConfig.contact0" />
</div>
</div>
<div class="form-group">
<label for="contact1" class="col-sm-3 control-label">Line:</label>
<div class="col-sm-8">
<input type="text" class="form-control validate[required]" name="contact1" id="contact1"
v-model="officialConfig.contact1" />
</div>
</div>
<div class="form-group">
<label for="contact2" class="col-sm-3 control-label">Email:</label>
<div class="col-sm-8">
<input type="text" class="form-control validate[required]" name="contact2" id="contact2"
v-model="officialConfig.contact2" />
</div>
</div>
</form>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-default" data-dismiss="modal">关闭</button>
<button type="button" class="btn btn-primary" id="save">保存</button>
</div>
</div>
</div>
</div>
</template>
<script>
import TableHelper from '@/utils/bootstrap-table-helper';
import { getOfficialConfigList, saveOfficialConfig } from '@/api/official/officialConfig';
import { browseFor30Days } from '@/api/official/officialRecord';
import { uploadQiNiuFile, uploadTencentFile } from '@/api/common/upload';
import { showLoading, hideLoading, apiResult, formatTime } from '@/utils/maintainer';
export default {
name: 'OfficialConfigView',
data() {
return {
files: {},
configColumns: [
{ field: 'iosVersion', title: 'iOS版本号', align: 'center', width: '15%' },
{
field: 'iosSkipType',
title: 'iOS跳转类型',
align: 'center',
width: '15%',
formatter: function (val, row, index) {
let value = '';
if (val == 0) {
value = 'AppStore';
} else {
value = '其它H5链接';
}
return value;
}
},
{ field: 'iosSkipUrl', title: 'iOS跳转链接', align: 'center', width: '15%' },
{ field: 'androidVersion', title: 'Android版本号', align: 'center', width: '15%' },
{
field: 'androidSkipType',
title: 'Android跳转类型',
align: 'center',
width: '15%',
formatter: function (val, row, index) {
let value = '';
if (val == 0) {
value = 'GooglePlay';
} else if (val == 1) {
value = '直接下载Apk';
}
return value;
}
},
{
field: 'android',
title: 'Android跳转链接',
align: 'center',
width: '15%',
formatter: function (val, row, index) {
let value = 'GooglePlay';
if (row.androidSkipUrl) {
value += row.androidSkipUrl;
} else {
value += '无';
}
value += '<br/>';
value += '常规包:';
if (row.androidNormalUrl) {
value += row.androidNormalUrl;
} else {
value += '无';
}
value += '<br/>';
value += '备用包:';
if (row.androidReserveUrl) {
value += row.androidReserveUrl;
} else {
value += '无';
}
value += '<br/>';
return value;
}
},
{
field: 'contact',
title: '联系方式',
align: 'center',
width: '15%',
formatter: function (val, row, index) {
let value = '';
value += 'Wechat';
if (row.contact0) {
value += row.contact0;
} else {
value += '无';
}
value += '<br/>';
value += 'Line';
if (row.contact1) {
value += row.contact1;
} else {
value += '无';
}
value += '<br/>';
value += 'Email';
if (row.contact2) {
value += row.contact2;
} else {
value += '无';
}
return value;
}
},
{
field: 'id',
title: '操作',
align: 'center',
width: '15%',
formatter: function (val, row, index) {
$('#itemTitle').html('<label class="col-sm-6 control-label">上次更新时间:' + formatTime(row.updateTime) + '</label>');
let value = '<button class="btn btn-sm btn-success opt-edit" data-id="' + val + '" data-index="' + index + '">编辑</button>';
return value;
}
}
],
browseColumns: [
{ field: 'dateTime', title: '日期', align: 'center', width: '15%' },
{ field: 'clientUv', title: '无线官网UV', align: 'center', width: '15%' },
{ field: 'clientPv', title: '无线官网PV', align: 'center', width: '15%' },
{ field: 'iosDownloadPv', title: '无线 iOS下载点击次数', align: 'center', width: '15%' },
{ field: 'androidDownloadPv', title: '无线 安卓下载点击次数', align: 'center', width: '15%' },
{ field: 'pcUv', title: 'PC官网UV', align: 'center', width: '15%' },
{ field: 'pcPv', title: 'PC官网PV', align: 'center', width: '15%' },
{ field: 'pcIosDownloadPv', title: 'PC iOS下载点击次数', align: 'center', width: '15%' },
{ field: 'pcAndroidDownloadPv', title: 'PC 安卓下载点击次数', align: 'center', width: '15%' },
],
officialConfig: {
id: 0,
iosVersion: '',
iosSkipType: 0,
iosSkipUrl: '',
androidVersion: '',
androidSkipType: 0,
androidSkipUrl: '',
androidNormalUrl: '',
androidReserveUrl: '',
contact0: '',
contact1: '',
contact2: '',
},
};
},
created() {
this.init();
this.getBrowse();
},
methods: {
changeFile(event) {
console.log(event);
let target = event.target;
let id = target.id;
this.files[id] = target.files[0];
},
uploadNormal() {
let $this = this;
showLoading();
uploadQiNiuFile($this.files['normalFile']).then(res => {
let path = res.data;
console.log(path);
if (path) {
$this.officialConfig.androidNormalUrl = path;
}
hideLoading();
}).catch(e => {
console.error(e);
hideLoading();
});
},
uploadReserve() {
let $this = this;
let file = $('#reserveFile').val();
if (file && file.length > 0) {
showLoading();
uploadTencentFile('reserveFile').then(res => {
let path = res.data;
if (path) {
$this.officialConfig.androidReserveUrl = path;
}
}).finally(() => {
hideLoading();
});
}
},
init() {
this.$nextTick(function () {
let $this = this;
$this.initTable();
$('#addBtn').click(function () {
$this.add();
});
$('#configTable').on('click', '.opt-edit', function () {
$this.edit(this);
});
$('#save').click(function () {
$this.save();
});
});
},
initTable() {
let $this = this;
TableHelper.destroy('#configTable');
$('#configTable').bootstrapTable({
columns: $this.configColumns,
cache: false,
striped: true,
showRefresh: false,
pageSize: 10,
pagination: true,
pageList: [1, 10, 20, 30, 50],
search: false,
sidePagination: 'server',
queryParamsType: 'undefined',
queryParams: function queryParams(params) {
var param = {
pageNum: params.pageNumber,
pageSize: params.pageSize,
};
return param;
},
ajax:function(request){
getOfficialConfigList(request.data).then(res => {
let data = res.data;
request.success({
'rows': data,
'total': data.length,
});
});
},
toolbar: '#toolbar',
});
TableHelper.destroy('#browseTable');
$('#browseTable').bootstrapTable({
columns: $this.browseColumns,
cache: false,
striped: true,
showRefresh: false,
search: false,
pageSize: 10,
pagination: true,
pageList: [1, 10, 20, 30, 50],
sidePagination: "client",
queryParamsType: "undefined",
});
},
getBrowse() {
browseFor30Days().then(res => {
let data = res.data;
TableHelper.load('#browseTable', data);
});
},
delNormal() {
this.officialConfig.androidNormalUrl = '';
},
delReserve() {
this.officialConfig.androidReserveUrl = '';
},
add() {
this.officialConfig.id = 0;
this.officialConfig.iosVersion = '';
this.officialConfig.iosSkipType = 0;
this.officialConfig.iosSkipUrl = '';
this.officialConfig.androidVersion = '';
this.officialConfig.androidSkipType = 0;
this.officialConfig.androidSkipUrl = '';
this.officialConfig.androidNormalUrl = '';
this.officialConfig.androidReserveUrl = '';
this.officialConfig.contact0 = '';
this.officialConfig.contact1 = '';
this.officialConfig.contact2 = '';
this.show();
},
edit(obj) {
const index = $(obj).data('index');
const record = TableHelper.getData('#configTable')[index];
this.officialConfig.id = record.id;
this.officialConfig.iosVersion = record.iosVersion;
this.officialConfig.iosSkipType = record.iosSkipType;
this.officialConfig.iosSkipUrl = record.iosSkipUrl;
this.officialConfig.androidVersion = record.androidVersion;
this.officialConfig.androidSkipType = record.androidSkipType;
this.officialConfig.androidSkipUrl = record.androidSkipUrl;
this.officialConfig.androidNormalUrl = record.androidNormalUrl;
this.officialConfig.androidReserveUrl = record.androidReserveUrl;
this.officialConfig.contact0 = record.contact0;
this.officialConfig.contact1 = record.contact1;
this.officialConfig.contact2 = record.contact2;
this.show();
},
show() {
$('#normalFile').attr('src', '');
$('#reserveFile').attr('src', '');
$('#editModal').modal('show');
},
save() {
let data = {
id: new Number(this.officialConfig.id),
iosVersion: this.officialConfig.iosVersion,
iosSkipType: new Number(this.officialConfig.iosSkipType),
iosSkipUrl: this.officialConfig.iosSkipUrl,
androidVersion: this.officialConfig.androidVersion,
androidSkipType: new Number(this.officialConfig.androidSkipType),
androidSkipUrl: this.officialConfig.androidSkipUrl,
androidNormalUrl: this.officialConfig.androidNormalUrl,
androidReserveUrl: this.officialConfig.androidReserveUrl,
contact0: this.officialConfig.contact0,
contact1: this.officialConfig.contact1,
contact2: this.officialConfig.contact2,
};
if (data.id == 0) {
data.id = null;
}
if (!(data.androidNormalUrl != '') && !(data.androidReserveUrl != '')) {
$("#tipMsg").text("android未配置apk包");
$("#tipModal").modal('show');
return;
}
saveOfficialConfig(data).then(res => {
console.log(res);
apiResult(res);
TableHelper.doRefresh('#configTable');
TableHelper.doRefresh('#browseTable');
$('#editModal').modal('hide');
});
},
},
}
</script>
<style scoped></style>