Commit ce9f49f4 authored by hanfeng's avatar hanfeng

增加app更新管理

parent ea7e89a3
......@@ -2,13 +2,13 @@ import fetch from 'utils/fetch';
export function getMembers() {
return fetch({
url: 'api/admin/member/Manage/getMembers',
url: 'api/admin/member/manage/getMembers',
method: 'get'
});
}
export function delMembershipGrade(id) {
return fetch({
url: 'api/admin/member/Manage/delMembershipGrade/'+id,
url: 'api/admin/member/manage/delMembershipGrade/'+id,
method: 'delete'
});
}
......
import fetch from 'utils/fetch';
export function getList() {
export function getAppVersions(query) {
return fetch({
url: '/api/app/version',
method: 'get'
url: '/api/app/version/background/getAppVersions',
method: 'post',
data:query
});
}
export function insertAppVersion(obj) {
return fetch({
url: '/api/app/version/background/add',
method: 'post',
data:obj
});
}
export function updateAppVersion(obj) {
return fetch({
url: '/api/app/version/background/update',
method: 'put',
data:obj
});
}
export function removeAppVersion(id) {
return fetch({
url: '/api/app/version/background/remove/'+id,
method: 'post',
});
}
export function getAppVersion(id) {
return fetch({
url: '/api/app/version/background/getAppVersion/'+id,
method: 'get',
});
}
......@@ -437,7 +437,7 @@ export const asyncRouterMap = [{
{
path: '/appManagement',
component: Layout,
name: 'app版本管理',
name: 'app管理',
icon: 'setting',
authority: 'appManagement',
children: [
......
<template>
<div class="app-container calendar-list-container">
<div>
<el-button class="filter-item" style="margin-bottom: 10px;" @click="newMembershipGrade"
type="primary" icon="edit">添加会员等级
<div class="filter-container">
<el-form ref="queryForm" :model="query" label-width="100px">
<el-row>
<el-col :span="4">
<el-form-item label="版本名称">
<el-input v-model.number="query.versionName" placeholder="版本名称"></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="版本号">
<el-input v-model.number="query.version" placeholder="版本号"></el-input>
</el-form-item>
</el-col>
<el-col :span="4">
<el-form-item label="更新内容">
<el-input v-model.number="query.content" placeholder="更新内容"></el-input>
</el-form-item>
</el-col>
</el-row>
</el-form>
<el-button class="filter-item" type="primary" v-waves icon="search" @click="handleFilter">搜索</el-button>
<el-button class="filter-item" style="margin-bottom: 10px;" @click="newAppVersion"
type="primary" icon="edit">添加新版本
</el-button>
</div>
<el-table :key='tableKey' :data="list" v-loading.body="listLoading" border fit highlight-current-row
style="width: 100%">
<el-table-column width="205" align="center" label="等级序号">
<el-table-column width="100" align="center" label="系统类型">
<template scope="scope">
<span>{{scope.row.sysType}}</span>
</template>
</el-table-column>
<el-table-column width="100" align="center" label="版本号">
<template scope="scope">
<span>{{scope.row.level}}</span>
<span>{{scope.row.version}}</span>
</template>
</el-table-column>
<el-table-column width="205" align="center" label="名称">
<el-table-column width="100" align="center" label="版本名称">
<template scope="scope">
<span>{{scope.row.name}}</span>
<span> {{scope.row.versionName}}</span>
</template>
</el-table-column>
<el-table-column width="205" align="center" label="图标">
<el-table-column width="100" align="center" label="包的大小">
<template scope="scope">
<span> <img class="image" :src="scope.row.icon"/></span>
<span>{{scope.row.packagesize}}</span>
</template>
</el-table-column>
<el-table-column width="205" align="center" label="折扣">
<el-table-column width="220" align="center" label="下载地址">
<template scope="scope">
<span>{{scope.row.discount}}</span>
<span><p><font size="1" face="arial">{{scope.row.downloadUrl}}</font></p></span>
</template>
</el-table-column>
<el-table-column width="205" align="center" label="免费天数">
<el-table-column width="200" align="center" label="上传时间">
<template scope="scope">
<span>{{scope.row.number}}</span>
<span>{{scope.row.crtTime}}</span>
</template>
</el-table-column>
<el-table-column width="205" align="center" label="价格">
<el-table-column width="150" align="center" label="是否可下载/强制下载">
<template scope="scope">
<span>{{scope.row.price}}</span>
<span>{{scope.row.downloadSwitch}}/{{scope.row.isCompel}}</span>
</template>
</el-table-column>
<el-table-column width="205" align="center" label="有效期">
<el-table-column width="581" align="center" label="版本详情">
<template scope="scope">
<span>{{scope.row.endDate}}</span>
<span><p><font size="1" face="arial">{{scope.row.content}}</font></p></span>
</template>
</el-table-column>
<el-table-column align="center" label="操作" width="212">
<el-table-column align="center" label="操作" width="200">
<template scope="scope">
<el-button size="small" type="primary" @click="compileAppUpload(scope.row)">编辑
</el-button>
<el-button size="small" type="danger" @click="delMembership(scope.row)">删除
</el-button>
</template>
</el-table-column>
</el-table>
<div v-show="!listLoading" class="pagination-container">
<el-pagination @size-change="handleSizeChange" @current-change="handleCurrentChange"
:current-page.sync="query.page" :page-sizes="[10,20,30, 50]" :page-size="query.limit"
layout="total, sizes, prev, pager, next, jumper" :total="total"></el-pagination>
</div>
<div>
<el-dialog :title="modalTitle" :visible.sync="versionPopup" :before-close="handleDialogClose">
<el-form :model="versionRow" ref="appVersion" label-width="150px">
<el-row>
<el-col :span="10">
<el-form-item label="适用系统" prop="sysType">
<el-radio-group size="large" v-model="versionRow.sysType">
<el-radio-button style="margin-bottom: 10px;" label="0">安卓</el-radio-button>
<el-radio-button style="margin-bottom: 10px;" label="1">iOS</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="版本号" prop="version">
<el-input type="text" v-model="versionRow.version" placeholder="请填版本号"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="版本名称" prop="versionName">
<el-input type="text" v-model="versionRow.versionName" placeholder="版本名称"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="权重" prop="weigh">
<el-input type="text" v-model="versionRow.weigh"
placeholder="请填权重"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="下载地址" prop="downloadUrl">
<el-input type="text" v-model="versionRow.downloadUrl" placeholder="请填下载地址"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="包大小" prop="packagesize">
<el-input type="text" v-model="versionRow.packagesize" placeholder="请填价格"></el-input>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="是否可下载" prop="downloadSwitch">
<el-radio-group size="large" v-model="versionRow.downloadSwitch">
<el-radio-button style="margin-bottom: 10px;" label="0">可下载</el-radio-button>
<el-radio-button style="margin-bottom: 10px;" label="1">不可下载</el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="是否强制更新" prop="isCompel">
<el-radio-group size="large" v-model="versionRow.isCompel">
<el-radio-button style="margin-bottom: 10px;" label="0"></el-radio-button>
<el-radio-button style="margin-bottom: 10px;" label="1"></el-radio-button>
</el-radio-group>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="10">
<el-form-item label="上传包" prop="upload">
<el-upload
multiple="false"
class="upload-demo"
action=""
:on-preview="handlePreview"
:on-remove="handleRemove"
:file-list="fileList">
<el-button size="small" type="primary">点击上传</el-button>
<div slot="tip" class="el-upload__tip">只能上传apk/ipa文件,且不超过500kb</div>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-tabs v-model="activeName" type="card">
<el-tab-pane label="详情" name="first">
<div class="editor-container" v-if="activeName=='first'">
<UE :editorId="activeName" :defaultMsg="versionRow.content" :config=config ref="ue"
@ready="editorReadyEvent"></UE>
</div>
</el-tab-pane>
</el-tabs>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancelSetAppVersion()">取消</el-button>
<el-button type="primary" v-if="modalTitle=='创建'" @click="insertAppVersion()">确 定</el-button>
<el-button type="primary" v-else @click="updateAppVersion()">确 定</el-button>
</div>
</el-dialog>
</div>
</div>
</template>
<script>
import {mapGetters} from 'vuex';
import {getToken} from 'src/utils/auth';
import {
getAppVersions,
insertAppVersion,
updateAppVersion,
removeAppVersion,
getAppVersion
} from 'src/api/appManagement/version'
import {timestamp2Date} from 'src/utils/dateUtils';
import UE from '../../modal/Ueditor';//百度ue富文本
export default {
name: 'membershipGrade',
name: 'appUpload',
components: {
UE
},
data() {
return {
versionRow: {
sysType: 0,
version: undefined,
versionName: undefined,
weigh: undefined,
downloadUrl: undefined,
packagesize: undefined,
downloadSwitch: 1,
isCompel: 0,
content: ""
},
activeName: "",
versionPopup: false,
modalTitle: '创建',
list: [],
config: {
initialFrameWidth: null,
initialFrameHeight: 350
},
listLoading: true,
tableKey: 0,
BASE_API: process.env.BASE_API,
query: {
limit: 10,
page: 1,
versionName: undefined,
version: undefined,
content: undefined
},
total: null,
sysTypeObj: {
0: '安卓',
1: 'IOS'
},
isCompelObj: {
0: '否',
1: '是'
},
downloadSwitchObj: {
0: '可下载',
1: '不可下载'
},
}
},
......@@ -80,94 +276,95 @@
},
methods: {
getList() {
getMembers().then(
console.log(JSON.stringify(this.query))
getAppVersions(this.query).then(
res => {
for (let dataKey of res.data) {
if (dataKey.endDate == 0) {
dataKey.endDate = '半年'
} else {
dataKey.endDate = dataKey.endDate ? this.year[dataKey.endDate] : ''
}
}
this.list = res.data
this.traverse(res.data.list)
this.list = res.data.list
this.total = res.data.total;
this.listLoading = false;
}
)
},
/**
* 删除会员等级
* */
delMembership(row) {
delMembershipGrade(row.id).then(res => {
if (res.rel) {
this.$notify.success({
title: '成功',
message: `success`
})
} else {
this.$notify.warning({
title: '失败',
message: `failed`
})
traverse(list) {
for (let key of list) {
key.crtTime = key.crtTime ? null : timestamp2Date(key.crtTime)
key.downloadSwitch = this.downloadSwitchObj[key.downloadSwitch]
key.isCompel = this.isCompelObj[key.isCompel]
key.sysType = this.sysTypeObj[key.sysType]
}
},
handleSizeChange(val) {
this.query.limit = val;
this.getList();
}
,
handleCurrentChange(val) {
this.query.page = val;
this.getList();
},
handleFilter() {
this.getList()
})
},
/**
* 关闭清除
* */
cancelSetMemberArea(refName) {
this.addMembershipGrade = false
if (this.$refs[refName]) {
this.$refs[refName].resetFields()
* 新建app版本
*/
newAppVersion() {
if (this.$refs.appVersion) {
this.$refs.appVersion.resetFields()
}
this.modalTitle = '创建'
this.activeName = 'first'
this.versionPopup = true
},
/**
* 显示添加窗
* */
newMembershipGrade() {
this.addMembershipGrade = true
* 编辑窗口
*/
compileAppUpload(row) {
this.versionRow = row;
this.modalTitle = '编辑';
this.activeName = 'first';
this.versionPopup = true
},
/**
* 新建会员等级
* **/
save(refName) {
let membership = JSON.parse(JSON.stringify(this.add))
membership.endDate = membership.endDate - 1
addMembershipGrade(membership).then(
res => {
if (!res.rel) {
this.$notify.success({
title: '成功',
message: `success`
})
} else {
this.$notify.warning({
title: '失败',
message: `failed`
})
}
this.getList()
if (this.$refs[refName]) {
this.$refs[refName].resetFields()
* 点击 X 关闭对话框的回调
**/
handleDialogClose() {
this.activeName = "";
this.versionPopup = false;
},
/**
* 富文本 营地详情
* */
editorReadyEvent(instance) {
let t = this;
instance.addListener('contentChange', () => {
if (t.activeName == "first") {
t.versionRow.content = instance.getContent();
}
this.addMembershipGrade = false
});
},
cancelSetAppVersion() {
this.initialize
},
initialize() {
this.versionPopup = false;
this.versionRow = {};
this.activeName = "";
},
insertAppVersion() {
insertAppVersion(this.versionRow).then(res=>{
})
},
updateAppVersion() {
}
}
}
</script>
<style>
.image {
width: 50px;
height: 50px;
}
.mGrade .el-dialog--small {
width: 500px;
}
......
<template>
<el-dialog title="违章查询" :visible.sync="isVisible">
<el-form>
<el-row>
<el-col :span="24">
<el-form-item label="订单号">
<span>{{row.no}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="12">
<el-form-item label="订单金额">
<span>{{row.realAmount}}</span>
</el-form-item>
</el-col>
<el-col :span="12">
<el-form-item label="车牌号">
<span>{{row.vehicleNumberPlat}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="24">
<el-form-item label="用户ID/实名">
<span>{{row.userId}}</span>/<span>{{row.username}}</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="取车">
<span>{{dateFormat(row.orderRentVehicleDetail.startTime)}}</span>
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item label="交车公司">
<span>{{row.startCompanyName}}</span>
<span>({{row.orderRentVehicleDetail.startCityName}}{{row.orderRentVehicleDetail.startAddr}})</span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col :span="8">
<el-form-item label="还车">
<span>{{dateFormat(row.orderRentVehicleDetail.endTime)}}</span>
</el-form-item>
</el-col>
<el-col :span="16">
<el-form-item label="收车公司">
<span><span>{{row.endCompanyName}}</span>
<span>({{row.orderRentVehicleDetail.endCityName}}{{row.orderRentVehicleDetail.endAddr}})</span></span>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-col>
<el-form-item label="违章截图" :style="{display:'block'}">
<!--<el-upload-->
<!--action="https://xxtest.upyuns.com/api/universal/file/app/unauth/admin/upload"-->
<!--list-type="picture-card"-->
<!--:headers="getHeaderWithToken"-->
<!--:on-success="handleSuccess"-->
<!--:on-remove="handleRemove">-->
<!--<i class="el-icon-plus"></i>-->
<!--</el-upload>-->
<!--<el-dialog v-model="dialogVisible" size="tiny">-->
<!--<img width="100%" :src="dialogImageUrl" alt="">-->
<!--</el-dialog>-->
<el-upload
class="upload-demo"
:headers="getHeaderWithToken"
action="https://xxtest.upyuns.com/api/universal/file/app/unauth/admin/upload"
:on-remove="handleRemove"
:file-list="fileList2"
:on-success="handleSuccess"
list-type="picture-card">
<!--<div slot="tip" class="el-upload__tip">最多上传5张</div>-->
<i class="el-icon-plus"></i>
</el-upload>
</el-form-item>
</el-col>
</el-row>
<el-row>
<el-form-item label="违章罚款" style="display: inline-block;">
<el-input v-model="price" type="number" placeholder="请输入违章罚款金额"></el-input>
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button @click="cancel">取 消</el-button>
<el-button type="primary" @click="okHandler('form')">确 定</el-button>
</div>
</el-dialog>
</template>
<script>
import {
page,
saveOrderViolation
} from 'api/order/rentVehicle';
import {mapGetters} from 'vuex';
import {
formatDate
} from '../../../utils/dateFormattor';
import {
getToken
} from '../../../utils/auth';
import {
getOneIllegalRow
} from 'api/order/rentVehicle';
import ElRow from "element-ui/packages/row/src/row";
import ElInput from "../../../../node_modules/element-ui/packages/input/src/input.vue";
import ElCol from "element-ui/packages/col/src/col";
import ElFormItem from "../../../../node_modules/element-ui/packages/form/src/form-item.vue";
import ElForm from "../../../../node_modules/element-ui/packages/form/src/form.vue";
export default {
props: ["row"],
name: 'illegalDialog',
components: {
ElForm,
ElFormItem,
ElCol,
ElInput,
ElRow
},
data() {
return {
price: undefined,//违章罚款金额
isVisible: false,
fileList2:[],//违章截图
}
},
created() {
},
watch: {
isVisible(newValue, oldValue){
if(!newValue){
this.$emit('illegalEvent', false);
}
},
},
mounted() {
let that = this;
// if(that.row.refundStatus == 3) {
//refundStatus退款状态 0、未退款 1、已退还所有(取消订单时)2、 已退还部分(保留违章预备金)3、已退还所有押金(扣除该扣除的)
that.getOne(that.row.detailId);
// }
this.isVisible = true;
},
computed: {
...mapGetters([
'elements',
]),
getHeaderWithToken() {
return {Authorization: getToken()};
}
},
methods: {
/**
* 根据id查询一条记录
* */
getOne(id){
let t = this;
getOneIllegalRow(id).then(response => {
if(response.status == 200){
let arr = response.data.picture.split(",");
let fileList2 = [];
let p = {};
arr.map(function(item){
p = {
url: item
};
fileList2.push(p);
});
t.price = parseFloat(response.data.price);
t.fileList2 = fileList2;
t.id = response.data.id?response.data.id: undefined;
} else {
this.$notify({
title: '失败',
message: response.menu,
type: 'error',
duration: 2000
});
}
})
},
/**
* 上传成功
* */
handleSuccess(res, file) {
let c = {url: res.data};
this.fileList2.push(c);
this.showLoadingBody = false;
},
/**
* 删除违章图片
* */
handleRemove(file, fileList){
this.fileList2 = fileList;
},
/**
* 确定
* */
okHandler() {
let arr = [];
this.fileList2.map(function(item){
arr.push(item.url);
});
let params = {
picture:arr.join(","),
price:this.price,
detailId: this.row.detailId,
id: this.id
};
saveOrderViolation(params).then(response => {
if (response.status === 200) {
this.$notify({
title: '成功',
message: '创建成功',
type: 'success',
duration: 2000
});
this.$emit('illegalEvent', false);
} else {
this.$notify({
title: '创建失败',
message: '操作失败!',
type: 'error',
duration: 2000
});
}
});
},
/**
* 弹框-取消
* */
cancel() {
this.$emit('illegalEvent', false);
},
/**
* 格式化时间
* @param timestamp
* @returns {*}
*/
dateFormat(timestamp) {
let date = new Date(timestamp);//时间戳为10位需*1000,时间戳为13位的话不需乘1000
return formatDate(date, 'yyyy-MM-dd hh:mm:ss');
},
}
}
</script>
<style>
.el-form-item__content{
display: inline-block;
}
</style>
......@@ -115,12 +115,11 @@
<i v-else class="el-icon-plus avatar-uploader-icon"
style="lineHeight:100px;width:300px;height: 100px;border: 1px dashed #ccc;"></i>
</el-upload>
<!-- https://xxtest.upyuns.com-->
</el-form-item>
</el-row>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" @click="cancelSetMemberArea('membershipGrade')">取消</el-button>
<el-button @click="cancelSetMemberArea('membershipGrade')">取消</el-button>
<el-button type="primary" @click="save('membershipGrade')">确 定</el-button>
</div>
</el-dialog>
......@@ -219,6 +218,7 @@
},
methods: {
getList() {
this.listLoading= true
getMembers().then(
res => {
for (let dataKey of res.data) {
......@@ -260,9 +260,9 @@
* */
cancelSetMemberArea(refName) {
this.addMembershipGrade = false
if (this.$refs[refName]) {
this.$refs[refName].resetFields()
}
this.add={}
console.log(JSON.stringify(this.add))
},
/**
* 显示添加窗
......
......@@ -318,14 +318,14 @@
<el-radio-group v-model="validityType">
<el-radio-button style="margin-bottom: 10px;" label="无"></el-radio-button>
<el-radio-button style="margin-bottom: 10px;"label="永久"></el-radio-button>
<el-radio-button style="margin-bottom: 10px;"label="自定义"></el-radio-button>
<el-radio-button style="margin-bottom: 10px;"label="自定义" ></el-radio-button>
</el-radio-group>
<dir></dir>
<div class="block" v-if="validityType=='自定义'">
<el-date-picker
v-model="validTime"
type="datetime"
placeholder="请选择注册时间范围">
placeholder="请选择会员有效期">
</el-date-picker>
</div>
</el-form-item>
......@@ -520,6 +520,7 @@
UploadMembershipList,
saveNewMemberObject
} from 'src/api/admin/UserMember/index';
import {formatDate} from "../../../utils/dateFormattor";
export default {
name: 'appUser',
......@@ -797,7 +798,6 @@
this.listQuery.registrationTimeBegin = this.listQuery.registrationDate ? (new Date(this.listQuery.registrationDate[0]).getTime()) / 1000 : null
this.listQuery.registrationTimeEnd = this.listQuery.registrationDate ? (new Date(this.listQuery.registrationDate[1]).getTime()) / 1000 : null
alert(JSON.stringify(this.listQuery))
this.getList();
}
,
......@@ -964,7 +964,6 @@
this.orderQuery.userId = this.saveUserId
let query = JSON.parse(JSON.stringify(this.orderQuery))
query.status = query.status ? query.status - 1 : null
// alert(JSON.stringify(query))
page(query).then(
res => {
......@@ -1055,6 +1054,13 @@
if (bool==='1'){
this.statusBoolean=true
}
},
setDate(){
alert(this.validTime)
if(!this.validTime){
let date = new Date();//时间戳为10位需*1000,时间戳为13位的话不需乘1000
this.validTime= formatDate(date, 'yyyy-MM-dd hh:mm:ss');
}
}
}
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment