初始提交

This commit is contained in:
wanyongkang
2020-10-04 10:30:08 +08:00
commit 3193537726
441 changed files with 171716 additions and 0 deletions

132
src/components/user/add.vue Normal file
View File

@@ -0,0 +1,132 @@
<template>
<div class="main_box screen1" v-loading="loading">
<el-breadcrumb separator-class="el-icon-arrow-right" class="ml40 xw995">
<el-breadcrumb-item>资讯管理</el-breadcrumb-item>
<el-breadcrumb-item :to="{name:'course'}">资讯列表</el-breadcrumb-item>
<el-breadcrumb-item>新建课程</el-breadcrumb-item>
</el-breadcrumb>
<el-form :model="articleModel" :rules="rules" ref="editor" class="from_box clr">
<el-form-item prop="Title" class="from_item">
<label>标题</label>
<img src="/static/img/common/main.png">
<el-input placeholder="请填标题" v-model="articleModel.Title"></el-input>
</el-form-item>
<el-form-item prop="SubTitle" class="from_item">
<label>副标题</label>
<img src="/static/img/common/main.png">
<el-input placeholder="请填副标题" v-model="articleModel.SubTitle"></el-input>
</el-form-item>
<el-form-item prop="Keyword" class="from_item">
<label class="noimh">关键字</label>
<el-input v-model="articleModel.Keyword" type="number"></el-input>
</el-form-item>
<el-form-item prop="AccessCount" class="from_item">
<label>访问人数</label>
<img src="/static/img/common/main.png">
<el-input placeholder="请填访问人数::" v-model="articleModel.AccessCount" type="number"></el-input>
</el-form-item>
<el-form-item prop="OnLine" class="from_item">
<label>发布状态:</label>
<img src="/static/img/common/main.png">
<div>
<el-switch v-model="articleModel.Publish" :active-value="1" :inactive-value="0"> </el-switch>
</div>
</el-form-item>
<el-form :inline="true">
<el-form-item prop="Thumb" class="from_item">
<label>课程封面</label>
<div class="uploadimg_box ">
<img :src="articleModel.Thumb" v-if="articleModel.Thumb!=''" class="uploadimg" @click="upload(setCover)" />
<span class="ubloadbtn" v-else>
<img src="/static/img/common/imgadd.png" @click="upload(setCover)" >
</span>
<p class="imgTip" @click="upload(setCover)" >点击更换</p>
<p class="zhu">图片大小不可超过2M
</p>
</div>
</el-form-item>
</el-form>
</el-form>
<div class="editor-container">
<UE v-model="articleModel.Content" :config='config' ref="ue"></UE>
</div>
<div class="handel_box clr">
<router-link :to="{name:'course'}" tag="input" type="button" value="返回" class="cursor"></router-link>
<input type="button" value="保存" @click="save('editor')" class="small cursor">
</div>
</div>
</template>
<script>
let that;
export default {
components: {
},
data() {
return {
articleModel:{
Publish:0,
id:0,
Thumb:'',
},
loading: false,
rules: {
Title: [this.$vaild.required("标题")],
SubTitle: [this.$vaild.required("副标题")],
// Banner: [this.$vaild.required("课程主图")],
// Cover: [this.$vaild.required("课程封面")],
},
config:{
serverUrl:this.$api.baseURL+"ueditor",
UEDITOR_HOME_URL: "/static/ueditor/",
autoHeightEnabled: false,
initialFrameHeight: 500,
},
options:[]
}
},
created() {
var query=this.$route.query;
if(query.optype==2){
this.getInfo(query.id);
}
},
methods: {
getInfo(id){
this.$api.get("course/v1/article/Get",{id:id}).then(res=>{this.articleModel=res.Data});
},
save(formName) {
var that = this;
this.$refs[formName].validate(valid => {
if (valid) {
if (that.$route.query.optype=="1") {
that.add();
} else if(that.$route.query.optype=="2") {
that.edit();
}
}
})
},
add(){
this.$api.post("course/v1/article/post",this.articleModel).then(res=>{
this.$router.push({name:"course"})
})
},
edit(){
this.$api.post("course/v1/article/put",this.articleModel).then(res=>{
this.$router.push({name:"article"})
})
},
upload(callback) {
this.$api.upload('oss/v1/ImageCloud/upload').then(res=>{
callback&&callback(res.Data);
});
},
setCover(ret) {
this.articleModel.Thumb=ret.Url;
}
}
};
</script>

View File

@@ -0,0 +1,90 @@
<template>
<div v-loading="loading">
<div class="heior_box">
<el-button size="small" type="primary" icon="el-icon-sold-out" @click="dataExport" v-if="$local.isRoot()">导出</el-button>
<div class="search-box">
<el-input v-model="searchModel.keyWord" placeholder="请输入会员号/名称" clearable size="small">
<el-button slot="append" icon="el-icon-search" @click="search"></el-button>
</el-input>
</div>
</div>
<el-table :data="retData.Data" size="medium" :height="$getHeight(300)" row-key="Id" border>
<el-table-column prop="CreateTime" label="日期"></el-table-column>
<el-table-column prop="UserName" label="用户">
<template slot-scope="scope">
<phoneHide :text="scope.row.UserName"></phoneHide>
</template>
</el-table-column>
<el-table-column prop="OperateUserName" label="操作人员"></el-table-column>
<el-table-column prop="ScoreTypeName" label="资金项目"></el-table-column>
<el-table-column prop="RestAmount1" label="操做前余额"></el-table-column>
<el-table-column prop="ScoreValue" label="金额"></el-table-column>
<el-table-column prop="RestAmount2" label="操做后余额"></el-table-column>
</el-table>
<div class="block">
<el-pagination
v-if="retData.Data.length>0"
@current-change="getAmountDetail"
:page-size="50"
:current-page.sync="searchModel.PageIndex"
layout="total,prev, pager, next"
:total="retData.TotalCount"
></el-pagination>
</div>
</div>
</template>
<script>
export default {
name: "userIndex",
components: {
cutTip: () => import("@/components/common/cutTip"),
phoneHide: () => import("@/components/common/phonehide")
},
data() {
return {
loading: false,
retData: { TotalCount: 0, Data: [] },
searchModel: {
PageIndex: 1,
keyWord: ""
},
detailAmountData: [],
formatterCreateType(row, column, cellValue, index) {
switch (cellValue) {
case 1:
return "管理员添加";
case 2:
return "用户注册";
case 3:
return "淘宝注册";
}
return "";
}
};
},
created() {
this.$store.commit("setCurrentNav", "订单管理>>资金明细");
this.getAmountDetail();
},
methods: {
search(){
this.searchModel.PageIndex=1;
this.getAmountDetail();
},
getAmountDetail() {
this.loading = true;
this.$api
.get("baseinfo/v1/user/AmountDetails", this.searchModel)
.then(res => {
this.retData = res;
this.loading = false;
});
},
dataExport(){
this.$api.getDownloadFile("/baseinfo/v1/user/ExportAmount", this.searchModel);
}
}
};
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,99 @@
<template>
<div v-loading="loading">
<div class="heior_box">
<el-button
size="small"
type="primary"
icon="el-icon-sold-out"
@click="dataExport"
v-if="$local.isRoot()"
>导出</el-button>
<div class="search-box">
<el-date-picker
size="small"
v-model="dateRange"
type="daterange"
range-separator=""
start-placeholder="开始日期"
end-placeholder="结束日期"
></el-date-picker>
<el-input
v-model="searchModel.keyWord"
placeholder="请输入订单号、用户名"
clearable
size="small"
>
<el-button slot="append" icon="el-icon-search" @click="search"></el-button>
</el-input>
</div>
</div>
<el-table :data="retData.Data" row-key="Id" border size="medium" :height="$getHeight(100)">
<el-table-column prop="CreateTime" label="创建日期" width="180"></el-table-column>
<el-table-column prop="OrderNo" label="订单号" ></el-table-column>
<el-table-column prop="TradeNo" label="支付流水号"></el-table-column>
<el-table-column prop="UserName" label="用户" width="120">
<template slot-scope="scope">
<phoneHide :text="scope.row.UserName"></phoneHide>
</template>
</el-table-column>
<el-table-column prop="OrderAmount" label="充值金额" width="180"></el-table-column>
</el-table>
<div class="block">
<el-pagination
v-if="retData.Data.length>0"
@current-change="get"
:current-page.sync="searchModel.PageIndex"
:page-size="50"
layout="total,prev, pager, next"
:total="retData.TotalCount"
></el-pagination>
</div>
</div>
</template>
<script>
export default {
name: "treeTable",
components: {
cutTip: () => import("@/components/common/cutTip"),
phoneHide: () => import("@/components/common/phonehide")
},
data() {
return {
loading: false,
options: [],
retData: { TotalCount: 0, Data: [] },
dateRange: [],
searchModel: {
PageIndex: 1,
keyWord: "",
Btime: "",
Etime: "",
}
};
},
created() {
this.$store.commit("setCurrentNav", "订单管理>>充值订单");
this.get();
},
methods: {
search() {
this.searchModel.PageIndex = 1;
this.get();
},
get() {
if (this.dateRange && this.dateRange.length == 2) {
this.searchModel.Btime = this.dateRange[0];
this.searchModel.Etime = this.dateRange[1];
}
this.$api.get("baseinfo/v1/chargeorder/page", this.searchModel).then(res => {
this.retData = res;
});
},
dataExport() {
this.$api.getDownloadFile("/baseinfo/v1/chargeorder/ExportOrder", this.searchModel);
}
}
};
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,314 @@
<template>
<div v-loading="loading">
<div class="heior_box">
<el-button size="small" type="primary" icon="el-icon-plus" @click="add">添加会员</el-button>
<el-button size="small" type="primary" icon="el-icon-sold-out" @click="dataExport" v-if="$local.isRoot()">导出</el-button>
<div class="search-box">
<el-input v-model="searchModel.keyWord" placeholder="请输入会员号/名称" clearable size="small">
<el-button slot="append" icon="el-icon-search" @click="search"></el-button>
</el-input>
</div>
</div>
<el-table :data="retData.Data" size="medium" :height="$getHeight(100)" row-key="Id" border>
<!-- <el-table-column prop="LoginCode" label="会员号" width="120px"></el-table-column> -->
<!-- <el-table-column prop="Name" label="名称"></el-table-column> -->
<el-table-column prop="LoginCode" label="会员号" width="120px">
<template slot-scope="scope">
<phoneHide :text="scope.row.LoginCode"></phoneHide>
</template>
</el-table-column>
<el-table-column prop="CreateTime" label="注册时间" width="160px"></el-table-column>
<el-table-column prop="CreateType" label="注册方式" :formatter="formatterCreateType"></el-table-column>
<!-- <el-table-column prop="ProductAccountCount" label="账号总数"></el-table-column>
<el-table-column prop="ExpiredProductAccountCount" label="过期数"></el-table-column>
<el-table-column prop="ExpiredProductAccountCount" label="未过期数"></el-table-column>-->
<!-- <el-table-column prop="ConsumeAmount" label="消费总额"></el-table-column> -->
<el-table-column prop="RestAmount" label="余额"></el-table-column>
<el-table-column prop="RestAmount" label="测试限额/领用数">
<template slot-scope="scope">
{{scope.row.TestCountLimit==0?'3':scope.row.TestCountLimit}}/{{scope.row.UseTestCount==0?'--':scope.row.UseTestCount}}
</template>
</el-table-column>
<el-table-column prop="ManagerName" label="客户经理"></el-table-column>
<el-table-column label="操作" width="400px">
<template slot-scope="scope">
<span class="handel cursor edit" @click="showUpdateTest(scope.row)">设置测试</span>
<span class="handel cursor edit" @click="showAmount(scope.row,1)" v-if="IsRoot">充值</span>
<span class="handel cursor edit" @click="showAmount(scope.row,2)">扣款</span>
<router-link :to="{name:'account',query:{userId:scope.row.Id}}">
<span class="handel cursor edit">账号</span>
</router-link>
<router-link :to="{name:'userprice',query:{id:scope.row.Id}}">
<span class="handel cursor edit">会员价</span>
</router-link>
<span class="handel cursor edit" @click="edit(scope.row)">编辑</span>
<span class="handel cursor edit" @click="showAmountDetail(scope.row)">明细</span>
<el-popover placement="bottom" trigger="hover" width="180">
<div class="popover_box">
<span>QQ号{{scope.row.QQ||'--'}}</span>
<span>微信{{scope.row.Wx||'--'}}</span>
<span>淘宝{{scope.row.TaoBao||'--'}}</span>
<span>邮箱:{{scope.row.Email||'--'}}</span>
</div>
<span class="handel cursor more" slot="reference">更多</span>
</el-popover>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination
v-if="retData.Data.length>0"
@current-change="get"
:page-size="50"
:current-page.sync="searchModel.PageIndex"
layout="total,prev, pager, next"
:total="retData.TotalCount"
></el-pagination>
</div>
<el-dialog title="会员维护" :visible.sync="showDialog" width="400px">
<el-form :model="userModel" :rules="rules" ref="inputUserForm" label-width="80px">
<el-form-item prop="LoginCode" label="登录名称">
<el-input v-model="userModel.LoginCode" :disabled="optype==2" size="small"></el-input>
</el-form-item>
<el-form-item prop="Password" label="密码">
<el-input v-model="userModel.Password" show-password size="small"></el-input>
</el-form-item>
<el-form-item prop="Phone" label="手机号">
<el-input v-model="userModel.Phone" size="small"></el-input>
</el-form-item>
<el-form-item prop="QQ" label="QQ号">
<el-input v-model="userModel.QQ" size="small"></el-input>
</el-form-item>
<el-form-item prop="Wx" label="微信">
<el-input v-model="userModel.Wx" size="small"></el-input>
</el-form-item>
<el-form-item prop="TaoBao" label="淘宝">
<el-input v-model="userModel.TaoBao" size="small"></el-input>
</el-form-item>
<el-form-item prop="Email" label="邮箱">
<el-input v-model="userModel.Email" size="small"></el-input>
</el-form-item>
<el-form-item prop="Remark" label="备注">
<el-input v-model="userModel.Remark" size="small"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('inputUserForm')"> </el-button>
<el-button type="primary" @click="save('inputUserForm')">确定</el-button>
</span>
</el-dialog>
<el-dialog
:title="amountModel.opAmountType==1?'充值':'扣费'"
:visible.sync="amountModel.showAmountDialog"
width="300px"
>
<el-form :model="amountModel" :rules="amountRules" ref="inputAmountForm" label-width="80px">
<el-form-item prop="rest" label="当前余额">
<el-input v-model="amountModel.rest" size="small" disabled></el-input>
</el-form-item>
<el-form-item prop="amount" :label="amountModel.opAmountType==1?'充值金额':'扣费金额'">
<el-input v-model="amountModel.amount" size="small" type="number"></el-input>
</el-form-item>
<el-form-item prop="attchInfo" label="备注">
<el-input v-model="amountModel.attchInfo" size="small" type="number"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('inputAmountForm')"> </el-button>
<el-button type="primary" @click="updateAmount('inputAmountForm')">确定</el-button>
</span>
</el-dialog>
<el-dialog title="测试限额设置" :visible.sync="showTestDialog" width="300px">
<el-form :model="testLimitModel" ref="inputTestForm" label-width="80px">
<el-form-item prop="limit" label="限制次数">
<el-input v-model="testLimitModel.limit" size="small" type="number"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('inputTestForm')"> </el-button>
<el-button type="primary" @click="updateTestLimit()">确定</el-button>
</span>
</el-dialog>
<el-dialog title="资金明细" :visible.sync="showDetailDialog" width="500px">
<el-table
:data="detailAmountData"
size="medium"
:height="$getHeight(300)"
row-key="Id"
border
>
<el-table-column prop="ScoreTypeName" label="资金项目"></el-table-column>
<el-table-column prop="ScoreValue" label="金额"></el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
export default {
name: "userIndex",
components: {
cutTip: () => import("@/components/common/cutTip"),
phoneHide: () => import("@/components/common/phonehide")
},
data() {
return {
isRoot:false,
loading: false,
showDialog: false,
showTestDialog: false,
showDetailDialog: false,
optype: 1, //1:添加 2编辑
userModel: {
LoginCode: "",
Phone: "",
Password: "",
Remark: ""
},
amountModel: {
rest: 0,
amount: 0,
opAmountType: 1, ////1:充值 2扣款
showAmountDialog: false,
attchInfo:''
},
testLimitModel: {
userId: 0,
limit: 3
},
retData: { TotalCount: 0, Data: [] },
searchModel: {
PageIndex: 1,
keyWord: ""
},
rules: {
LoginCode: [this.$vaild.required("登录名称")],
Phone: [this.$vaild.required("手机号")],
// Password: [this.$vaild.required("密码")]
},
amountRules: {
// amount: [{ type: 'number', message: '金额必须为数字值'}],
},
detailAmountData: [],
formatterCreateType(row, column, cellValue, index) {
switch (cellValue) {
case 1:
return "管理员添加";
case 2:
return "用户注册";
case 3:
return "淘宝注册";
}
return "";
}
};
},
created() {
this.$store.commit("setCurrentNav", "用户管理>>会员管理");
var currentUser=this.$local.getUserByCache();
this.IsRoot=currentUser.Manager.IsRootUser;
this.get();
},
methods: {
search(){
this.searchModel.PageIndex=1;
this.get();
},
get() {
this.$api.get("baseinfo/v1/user/page", this.searchModel).then(res => {
this.retData = res;
});
},
del(item) {
var that = this;
this.$confirm("确定删除?", "", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(_ => {
this.$api.post("baseinfo/v1/user/Delete?id=" + item.Id).then(res => {
that.get();
});
});
},
add() {
this.showDialog = true;
this.optype = 1;
},
edit(item) {
this.showDialog = true;
this.optype = 2;
this.userModel = clone(item);
},
resetForm(formName) {
this.$refs[formName].resetFields();
this.showDialog = false;
this.amountModel.showAmountDialog = false;
this.showTestDialog = false;
},
save(formName) {
this.$refs[formName].validate(valid => {
if (!valid) return;
if (this.optype == 1) {
this.$api.post("baseinfo/v1/user/post", this.userModel).then(res => {
this.resetForm("inputUserForm");
this.get();
});
} else {
this.$api.post("baseinfo/v1/user/put", this.userModel).then(res => {
this.resetForm("inputUserForm");
this.get();
});
}
});
},
showAmount(item, type) {
this.amountModel.rest = item.RestAmount;
this.amountModel.opAmountType = type;
this.amountModel.showAmountDialog = true;
this.amountModel.UserId = item.Id;
},
updateAmount(formName) {
this.$refs[formName].validate(valid => {
if (!valid) return;
this.$api
.post("baseinfo/v1/user/UpdateAmount", this.amountModel)
.then(res => {
this.resetForm("inputAmountForm");
this.get();
});
});
},
showUpdateTest(item) {
this.showTestDialog = true;
this.testLimitModel.UserId = item.Id;
this.testLimitModel.limit = item.TestCountLimit;
},
updateTestLimit() {
this.$api
.post("baseinfo/v1/user/UpdateTestCount", this.testLimitModel)
.then(res => {
this.resetForm("inputTestForm");
this.get();
});
},
showAmountDetail(item) {
this.showDetailDialog = true;
this.$api
.get("baseinfo/v1/user/AmountDetail?userId=" + item.Id)
.then(res => {
this.detailAmountData = res.Data;
});
},
dataExport(){
this.$api.getDownloadFile("/baseinfo/v1/user/Export");
}
}
};
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,302 @@
<template>
<div v-loading="loading">
<div class="heior_box">
<el-button size="small" type="primary" icon="el-icon-plus" @click="add">添加会员</el-button>
<div class="search-box">
<el-input v-model="searchModel.keyWord" placeholder="请输入会员号/名称" clearable size="small">
<el-button slot="append" icon="el-icon-search" @click="search"></el-button>
</el-input>
</div>
</div>
<el-table :data="retData.Data" size="medium" :height="$getHeight(100)" row-key="Id" border>
<el-table-column prop="LoginCode" label="会员号" width="120px">
<template slot-scope="scope">
<phoneHide :text="scope.row.LoginCode"></phoneHide>
</template>
</el-table-column>
<el-table-column prop="CreateTime" label="注册时间" width="160px"></el-table-column>
<el-table-column prop="CreateType" label="注册方式" :formatter="formatterCreateType"></el-table-column>
<el-table-column prop="RestAmount" label="余额"></el-table-column>
<el-table-column prop="RestAmount" label="测试限额/领用数">
<template slot-scope="scope">
{{scope.row.TestCountLimit==0?'3':scope.row.TestCountLimit}}/{{scope.row.UseTestCount==0?'--':scope.row.UseTestCount}}
</template>
</el-table-column>
<el-table-column label="操作" width="400px">
<template slot-scope="scope">
<span class="handel cursor edit" @click="showUpdateTest(scope.row)">设置测试</span>
<router-link :to="{name:'account',query:{userId:scope.row.Id}}">
<span class="handel cursor edit">账号</span>
</router-link>
<router-link :to="{name:'userprice',query:{id:scope.row.Id}}">
<span class="handel cursor edit">会员价</span>
</router-link>
<span class="handel cursor edit" @click="edit(scope.row)">编辑</span>
<span class="handel cursor edit" @click="showAmountDetail(scope.row)">明细</span>
<el-popover placement="bottom" trigger="hover" width="180">
<div class="popover_box">
<span>QQ号{{scope.row.QQ||'--'}}</span>
<span>微信{{scope.row.Wx||'--'}}</span>
<span>淘宝{{scope.row.TaoBao||'--'}}</span>
<span>邮箱:{{scope.row.Email||'--'}}</span>
</div>
<span class="handel cursor more" slot="reference">更多</span>
</el-popover>
</template>
</el-table-column>
</el-table>
<div class="block">
<el-pagination
v-if="retData.Data.length>0"
@current-change="get"
:page-size="50"
:current-page.sync="searchModel.PageIndex"
layout="total,prev, pager, next"
:total="retData.TotalCount"
></el-pagination>
</div>
<el-dialog title="会员维护" :visible.sync="showDialog" width="400px">
<el-form :model="userModel" :rules="rules" ref="inputUserForm" label-width="80px">
<el-form-item prop="LoginCode" label="登录名称">
<el-input v-model="userModel.LoginCode" :disabled="optype==2" size="small"></el-input>
</el-form-item>
<el-form-item prop="Password" label="密码">
<el-input v-model="userModel.Password" show-password size="small"></el-input>
</el-form-item>
<el-form-item prop="Phone" label="手机号">
<el-input v-model="userModel.Phone" size="small"></el-input>
</el-form-item>
<el-form-item prop="QQ" label="QQ号">
<el-input v-model="userModel.QQ" size="small"></el-input>
</el-form-item>
<el-form-item prop="Wx" label="微信">
<el-input v-model="userModel.Wx" size="small"></el-input>
</el-form-item>
<el-form-item prop="TaoBao" label="淘宝">
<el-input v-model="userModel.TaoBao" size="small"></el-input>
</el-form-item>
<el-form-item prop="Email" label="邮箱">
<el-input v-model="userModel.Email" size="small"></el-input>
</el-form-item>
<el-form-item prop="Remark" label="备注">
<el-input v-model="userModel.Remark" size="small"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('inputUserForm')"> </el-button>
<el-button type="primary" @click="save('inputUserForm')">确定</el-button>
</span>
</el-dialog>
<el-dialog
:title="amountModel.opAmountType==1?'充值':'扣费'"
:visible.sync="amountModel.showAmountDialog"
width="300px"
>
<el-form :model="amountModel" :rules="amountRules" ref="inputAmountForm" label-width="80px">
<el-form-item prop="rest" label="当前余额">
<el-input v-model="amountModel.rest" size="small" disabled></el-input>
</el-form-item>
<el-form-item prop="amount" :label="amountModel.opAmountType==1?'充值金额':'扣费金额'">
<el-input v-model="amountModel.amount" size="small" type="number"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('inputAmountForm')"> </el-button>
<el-button type="primary" @click="updateAmount('inputAmountForm')">确定</el-button>
</span>
</el-dialog>
<el-dialog title="测试限额设置" :visible.sync="showTestDialog" width="300px">
<el-form :model="testLimitModel" ref="inputTestForm" label-width="80px">
<el-form-item prop="limit" label="限制次数">
<el-input v-model="testLimitModel.limit" size="small" type="number"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm('inputTestForm')"> </el-button>
<el-button type="primary" @click="updateTestLimit()">确定</el-button>
</span>
</el-dialog>
<el-dialog title="资金明细" :visible.sync="showDetailDialog" width="500px">
<el-table
:data="detailAmountData"
size="medium"
:height="$getHeight(300)"
row-key="Id"
border
>
<el-table-column prop="ScoreTypeName" label="资金项目"></el-table-column>
<el-table-column prop="ScoreValue" label="金额"></el-table-column>
</el-table>
</el-dialog>
</div>
</template>
<script>
export default {
name: "userIndex",
components: {
cutTip: () => import("@/components/common/cutTip"),
phoneHide: () => import("@/components/common/phonehide")
},
data() {
return {
isRoot:false,
loading: false,
showDialog: false,
showTestDialog: false,
showDetailDialog: false,
optype: 1, //1:添加 2编辑
userModel: {
LoginCode: "",
Phone: "",
Password: "",
Remark: ""
},
amountModel: {
rest: 0,
amount: 0,
opAmountType: 1, ////1:充值 2扣款
showAmountDialog: false
},
testLimitModel: {
userId: 0,
limit: 3
},
retData: { TotalCount: 0, Data: [] },
searchModel: {
PageIndex: 1,
keyWord: ""
},
rules: {
LoginCode: [this.$vaild.required("登录名称")],
Phone: [this.$vaild.required("手机号")],
Password: [this.$vaild.required("密码")]
},
amountRules: {
// amount: [{ type: 'number', message: '金额必须为数字值'}],
},
detailAmountData: [],
formatterCreateType(row, column, cellValue, index) {
switch (cellValue) {
case 1:
return "管理员添加";
case 2:
return "用户注册";
case 3:
return "淘宝注册";
}
return "";
}
};
},
created() {
this.$store.commit("setCurrentNav", "用户管理>>用户查询");
var currentUser=this.$local.getUserByCache();
this.IsRoot=currentUser.Manager.IsRootUser;
},
methods: {
search(){
if(this.searchModel.keyWord==''){
this.$warn("请输入查询关键字");
return;
}
this.searchModel.PageIndex=1;
this.get();
},
get() {
this.$api.get("baseinfo/v1/user/SearchInfo", this.searchModel).then(res => {
this.retData = res;
});
},
del(item) {
var that = this;
this.$confirm("确定删除?", "", {
confirmButtonText: "确定",
cancelButtonText: "取消",
type: "warning"
}).then(_ => {
this.$api.post("baseinfo/v1/user/Delete?id=" + item.Id).then(res => {
that.get();
});
});
},
add() {
this.showDialog = true;
this.optype = 1;
},
edit(item) {
this.showDialog = true;
this.optype = 2;
this.userModel = clone(item);
},
resetForm(formName) {
this.$refs[formName].resetFields();
this.showDialog = false;
this.amountModel.showAmountDialog = false;
this.showTestDialog = false;
},
save(formName) {
this.$refs[formName].validate(valid => {
if (!valid) return;
if (this.optype == 1) {
this.$api.post("baseinfo/v1/user/post", this.userModel).then(res => {
this.resetForm("inputUserForm");
// this.get();
});
} else {
this.$api.post("baseinfo/v1/user/put", this.userModel).then(res => {
this.resetForm("inputUserForm");
// this.get();
});
}
});
},
showAmount(item, type) {
this.amountModel.rest = item.RestAmount;
this.amountModel.opAmountType = type;
this.amountModel.showAmountDialog = true;
this.amountModel.UserId = item.Id;
},
updateAmount(formName) {
this.$refs[formName].validate(valid => {
if (!valid) return;
this.$api
.post("baseinfo/v1/user/UpdateAmount", this.amountModel)
.then(res => {
this.resetForm("inputAmountForm");
this.get();
});
});
},
showUpdateTest(item) {
this.showTestDialog = true;
this.testLimitModel.UserId = item.Id;
this.testLimitModel.limit = item.TestCountLimit;
},
updateTestLimit() {
this.$api
.post("baseinfo/v1/user/UpdateTestCount", this.testLimitModel)
.then(res => {
this.resetForm("inputTestForm");
this.get();
});
},
showAmountDetail(item) {
this.showDetailDialog = true;
this.$api
.get("baseinfo/v1/user/AmountDetail?userId=" + item.Id)
.then(res => {
this.detailAmountData = res.Data;
});
},
dataExport(){
this.$api.getDownloadFile("/baseinfo/v1/user/Export");
}
}
};
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,188 @@
<template>
<div v-loading="loading">
<div class="heior_box">
<el-button
size="small"
type="primary"
icon="el-icon-sold-out"
v-if="$local.isRoot()"
@click="dataExport"
>导出</el-button>
<!-- <el-button size="small" type="primary" icon="el-icon-sold-out" @click="dataExport" v-if="$local.isRoot()">导出</el-button> -->
<div class="search-box">
<el-date-picker
size="small"
v-model="dateRange1"
type="daterange"
range-separator=""
start-placeholder="A开始日期"
end-placeholder="A结束日期"
></el-date-picker>
<el-date-picker
size="small"
v-model="dateRange2"
type="daterange"
range-separator=""
start-placeholder="B开始日期"
end-placeholder="B结束日期"
></el-date-picker>
<el-select
v-model="searchModel.profile"
clearable
size="small"
placeholder="状态"
>
<el-option v-for="item in types" :key="item.label" :label="item.label" :value="item.value"></el-option>
</el-select>
<el-input v-model="searchModel.keyWord" placeholder="请输入会员号" clearable size="small">
<el-button slot="append" icon="el-icon-search" @click="search"></el-button>
</el-input>
</div>
</div>
<el-table :data="retData.Data" size="medium" :height="$getHeight(300)"
@sort-change="sort"
row-key="Id" border>
<el-table-column prop="Profile" label="状态" width="240">
<template slot-scope="scope">
<el-dropdown size="small" split-button type="primary">
{{scope.row.UserInfo.Profile}}
<el-dropdown-menu slot="dropdown">
<el-dropdown-item @click.native="changeProfile(scope.row,'已完成')">已完成</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'高意向客户')">高意向客户</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'待跟进-消费减少')">待跟进-消费减少</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'待跟进-未购买')">待跟进-未购买</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'跟进超时-消费减少')">跟进超时-消费减少</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'跟进超时-未购买')">跟进超时-未购买</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'流失-需求减少')">流失-需求减少</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'流失-暂时不用')">流失-暂时不用</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'流失-价格问题')">流失-价格问题</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'流失-产品问题')">流失-产品问题</el-dropdown-item>
<el-dropdown-item @click.native="changeProfile(scope.row,'跟进超时')">跟进超时</el-dropdown-item>
</el-dropdown-menu>
</el-dropdown>
</template>
</el-table-column>
<el-table-column prop="UserName" label="用户">
<template slot-scope="scope">
<phoneHide :text="scope.row.UserName"></phoneHide>
</template>
</el-table-column>
<el-table-column prop="UserName" label="联系信息">
<template slot-scope="scope">
<p v-if="scope.row.UserInfo.Wx">微信:{{scope.row.UserInfo.Wx}}</p>
<p v-if="scope.row.UserInfo.QQ">QQ:{{scope.row.UserInfo.QQ}}</p>
<p v-if="scope.row.UserInfo.TaoBao">淘宝:{{scope.row.UserInfo.TaoBao}}</p>
<p v-if="scope.row.UserInfo.WangWang">旺旺:{{scope.row.UserInfo.WangWang}}</p>
</template>
</el-table-column>
<el-table-column prop="CreateTime" label="注册时间"></el-table-column>
<el-table-column prop="PrevMonthAmount" label="消费金额A" sortable="custom"></el-table-column>
<el-table-column prop="MonthAmount" label="消费金额B" sortable="custom"></el-table-column>
<el-table-column prop="AddAmount" label="对比增长金额" sortable="custom">
<!-- <template slot-scope="scope">
{{scope.row.MonthAmount-scope.row.PrevMonthAmount}}
</template> -->
</el-table-column>
<el-table-column prop="TotalAccountCount" label="账户总数" sortable="custom"></el-table-column>
<el-table-column prop="UsingAccountCount" label="使用中个数" sortable="custom"></el-table-column>
<el-table-column prop="ExpirdAccountCount" label="过期个数" sortable="custom"></el-table-column>
</el-table>
<div class="block">
<el-pagination
v-if="retData.Data.length>0"
@current-change="get"
:page-size="50"
:current-page.sync="searchModel.PageIndex"
layout="total,prev, pager, next"
:total="retData.TotalCount"
></el-pagination>
</div>
</div>
</template>
<script>
import * as dateUtil from '@/extend/js/dateFormatUtil';
export default {
name: "userIndex",
components: {
phoneHide: () => import("@/components/common/phonehide")
},
data() {
return {
loading: false,
retData: { TotalCount: 0, Data: [] },
dateRange1: [],
dateRange2: [],
searchModel: {
PageIndex: 1,
keyWord: "",
sortLable:"",
sortOrder:0,
profile:"",
},
types:[{ value: '已完成', label: '已完成'},
{ value: '高意向客户', label: '高意向客户'},
{ value: '待跟进-消费减少', label: '待跟进-消费减少'},
{ value: '待跟进-未购买', label: '待跟进-未购买'},
{ value: '跟进超时-消费减少', label: '跟进超时-消费减少'},
{ value: '跟进超时-未购买', label: '跟进超时-未购买'},
{ value: '流失-需求减少', label: '流失-需求减少'},
{ value: '流失-暂时不用', label: '流失-暂时不用'},
{ value: '流失-价格问题', label: '流失-价格问题'},
{ value: '流失-产品问题', label: '流失-产品问题'},
{ value: '跟进超时', label: '跟进超时'},
]
}
},
created() {
this.$store.commit("setCurrentNav", "用户管理>>消费统计");
this.dateRange1[0]=dateUtil.getLastMonthStartDate();
this.dateRange1[1]=dateUtil.getLastMonthCurrentDate();
this.dateRange2[0]=dateUtil.getMonthStartDate();
this.dateRange2[1]=dateUtil.getMonthCurrentDate();
this.get();
},
methods: {
sort({column, prop, order }){
console.log(column)
console.log(prop)
console.log(order)
this.searchModel.sortLable=prop;
this.searchModel.sortOrder=order=="ascending"?0:1;
this.search()
},
changeProfile(row,command){
row.UserInfo.Profile=command;
this.$api
.post("baseinfo/v1/user/UpdateProfile",{UserId:row.UserInfo.Id,Profile:command})
.then(res => {});
},
search() {
this.searchModel.PageIndex = 1;
this.get();
},
get() {
this.loading = true;
if (this.dateRange1 && this.dateRange1.length == 2) {
this.searchModel.bTime1 = this.dateRange1[0];
this.searchModel.eTime1 = this.dateRange1[1];
}
if (this.dateRange2 && this.dateRange2.length == 2) {
this.searchModel.bTime2 = this.dateRange2[0];
this.searchModel.eTime2 = this.dateRange2[1];
}
this.$api
.get("course/v1/order/UserConsumeStatistics", this.searchModel)
.then(res => {
this.retData = res;
this.loading = false;
});
},
dataExport() {
this.$api.getDownloadFile("/course/v1/order/ExportUserConsumeStatistics", this.searchModel);
}
}
};
</script>
<style scoped>
</style>

View File

@@ -0,0 +1,197 @@
<template>
<div v-loading="loading">
<div class="heior_box">
<el-button size="small" type="primary" icon="el-icon-plus" @click="showDialogDiscount=true">折扣价格</el-button>
<div class="search-box">
<el-input v-model="searchModel.keyWord" placeholder="请输入套餐名称/标题" clearable size="small">
<el-button slot="append" icon="el-icon-search" @click="get"></el-button>
</el-input>
</div>
</div>
<div>
<el-tabs tab-position="left" :style="$getStyleHeight(100)">
<el-tab-pane :label="item.Product.Name" v-for="(item,index) in product" :key="index">
<el-table
:data="item.PackageUserPrices"
row-key="Id"
border
size="medium"
:height="$getHeight(100)"
>
<el-table-column prop="Package.Name" label="套餐名称"></el-table-column>
<el-table-column prop="Package.Price" label="原价格"></el-table-column>
<el-table-column prop="UserPrice.UserPrice" label="会员价格">
<template slot-scope="scope">
{{scope.row.UserPrice.UserPrice||'--'}}
</template></el-table-column>
<el-table-column prop="UserPrice.RefundDayPrice" label="退款单价"></el-table-column>
<el-table-column prop="UserPrice.Remark" label="说明"></el-table-column>
<el-table-column prop="UserPrice.Status" label="启用状态" width="100">
<template slot-scope="scope">
<el-switch
v-model="scope.row.UserPrice.Status"
:active-value="1"
:inactive-value="0"
active-color="#13ce66"
inactive-color="#dcdfe6"
@change="changeStatus(scope.row)"
></el-switch>
</template>
</el-table-column>
<el-table-column label="操作">
<template slot-scope="scope">
<span class="handel cursor edit" @click="goEdit(scope.row)">编辑</span>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
</div>
<el-dialog title="会员价格" :visible.sync="showDialog" width="400px">
<el-form
:model="current"
:rules="rules"
ref="inputPackageForm"
label-width="80px"
>
<el-form-item prop="Name" label="套餐名称">
<el-input v-model="current.Name" size="small" disabled=""></el-input>
</el-form-item>
<el-form-item prop="Price" label="原价格">
<el-input v-model="current.Price" type="number" size="small" disabled=""></el-input>
</el-form-item>
<el-form-item prop="MinPrice" label="会员价格">
<el-input v-model="current.UserPrice" type="number" size="small"></el-input>
</el-form-item>
<el-form-item prop="RefundDayPrice" label="退款单价">
<el-input v-model="current.RefundDayPrice" type="number" size="small"></el-input>
</el-form-item>
<el-form-item prop="Remark" label="说明">
<el-input v-model="current.Remark" size="small"></el-input>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="resetForm"> </el-button>
<el-button type="primary" @click="save">确定</el-button>
</span>
</el-dialog>
<el-dialog title="价格折扣" :visible.sync="showDialogDiscount" width="300px">
<el-form
:model="current"
:rules="rules"
ref="inputPackageForm"
label-width="80px"
>
<el-form-item prop="Name" label="折扣方案">
<el-select size="small" v-model="currentDiscount.schemeId">
<el-option v-for="(item,index) in productDiscounts" :key="index" :label="item.Name" :value="item.Id"></el-option>
</el-select>
</el-form-item>
</el-form>
<span slot="footer" class="dialog-footer">
<el-button @click="showDialogDiscount=false"> </el-button>
<el-button type="primary" @click="setDiscount">确定</el-button>
</span>
</el-dialog>
</div>
</template>
<script>
export default {
name: "treeTable",
components: {},
data() {
return {
loading: false,
showDialog:false,
showDialogDiscount:false,
retData: { TotalCount: 0, Data: [] },
searchModel: {
PageIndex: 1,
keyWord: ""
},
product:[],
current: {
Name:"",
Remark:'',
Price:0,
UserPrice:0,
UserId:0,
PackageId:0,
ProductId:0,
RefundDayPrice:0,
},
rules:{},
currentDiscount:{
schemeId:null,
userId:null,
},
productDiscounts:[]
};
},
created() {
this.$store.commit("setCurrentNav", "用户管理>>会员价");
this.current.UserId=this.$route.query.id;
this.currentDiscount.userId=this.$route.query.id;
this.get();
this.getProductDiscounts();
},
methods: {
get() {
this.$api.get("course/v1/product/ProductUserPrice?userId="+this.current.UserId).then(res => {
this.product = res.Data;
});
},
getProductDiscounts(){
this.$api
.get("course/v1/scheme/page")
.then(res => {
this.productDiscounts= res.Data;
});
},
goEdit(item) {
console.log(item)
this.showDialog = true;
this.current.Name =item.Package.Name;
this.current.Price =item.Package.Price;
this.current.ProductId =item.Package.ProductId;
this.current.PackageId =item.Package.Id;
this.current.UserPrice =item.UserPrice.UserPrice;
this.current.RefundDayPrice =item.UserPrice.RefundDayPrice;
},
save() {
this.$api
.post("course/v1/product/PutUserPrice", this.current)
.then(res => {
this.resetForm();
this.get();
});
},
changeStatus(item) {
this.$api
.post("course/v1/product/SetUserPriceStatus?id=" + item.UserPrice.Id)
.then(res => {
item.Status = res.Data;
});
},
setDiscount() {
if(!this.currentDiscount.schemeId){
this.$warn('请选择方案')
return ;
}
this.$api
.post("course/v1/scheme/SetUserDiscount",this.currentDiscount)
.then(res => {
this.showDialogDiscount=false;
this.get();
});
},
resetForm() {
this.$refs["inputPackageForm"].resetFields();
this.showDialog = false;
}
}
};
</script>
<style scoped>
</style>