套餐管理

This commit is contained in:
邓皓元 2018-12-20 16:22:10 +08:00
parent 4ef06721e1
commit 870d8c473b
16 changed files with 200 additions and 122 deletions

View File

@ -28,7 +28,7 @@ class PackageController extends Controller
*/
public function index()
{
$conditions = [];
$conditions = $this->request->all();
$conditions['limit'] = $this->request->get('limit', 20);
$packages = $this->packageService->index($conditions);

View File

@ -25,9 +25,11 @@ class PackageRepository extends Repository
* @var array
*/
protected $fieldSearchable = [
'id' => '=',
'name' => 'like',
'created_at' => 'like',
'id' => '=',
'type' => '=',
'sn' => 'like',
'name' => 'like',
'carrier_operator' => '=',
];
public function model()
@ -59,6 +61,22 @@ class PackageRepository extends Repository
$this->model = $this->model->whereIn('id', $conditions['id']);
}
if (isset($conditions['type'])) {
$this->model = $this->model->where('type', $conditions['type']);
}
if (isset($conditions['sn'])) {
$this->model = $this->model->where('sn', "%{$conditions['sn']}%");
}
if (isset($conditions['name'])) {
$this->model = $this->model->where('name', "%{$conditions['name']}%");
}
if (isset($conditions['carrier_operator'])) {
$this->model = $this->model->where('carrier_operator', $conditions['carrier_operator']);
}
return $this;
}
}

View File

@ -11,6 +11,29 @@ class Package extends PackageBase
public $incrementing = false;
protected $fillable = [
'id',
'parent_id',
'sn',
'name',
'type',
'carrier_operator',
'cost_price',
'guide_price',
'renewal_cost_price',
'renewal_guide_price',
'flows',
'voices',
'messages',
'has_messages',
'has_lbs',
'reset_months',
'service_months',
'effect_months',
'delay_months',
'description',
];
public function cards()
{
return $this->hasMany(Card::class, 'virtual_package_id', 'id');

View File

@ -30,6 +30,7 @@
"@vue/cli-service": "^3.0.1",
"@vue/eslint-config-standard": "^3.0.0-beta.10",
"chai": "^4.1.2",
"iview-loader": "^1.2.2",
"less": "^2.7.3",
"less-loader": "^4.0.5",
"lint-staged": "^6.0.0",

View File

@ -58,14 +58,7 @@
</div>
<div class="page-turn-wrap" v-if="list_data">
<Page
:current="Number(list_data.current_page)"
:page-size="Number(list_data.per_page)"
:total="Number(list_data.total)"
@on-change="index"
show-elevator
show-total
></Page>
<Page :current="Number(list_data.current_page)" :page-size="Number(list_data.per_page)" :total="Number(list_data.total)" @on-change="index" show-elevator show-total></Page>
</div>
<ui-edit :data="editObj.data" :show.sync="editObj.show" @add-success="index" @update-success="index(list_data.current_page)"></ui-edit>

View File

@ -10,7 +10,7 @@ export default {
params: {
name: ''
},
trashed: '',
trashed: null,
list_data: null,
editObj: {
show: false,
@ -192,7 +192,7 @@ export default {
for (let k in this.params) {
this.params[k] = '';
}
this.trashed = '';
this.trashed = null;
this.index(1);
}
}

View File

@ -51,23 +51,10 @@
</div>
<div class="page-turn-wrap" v-if="list_data">
<Page
:current="Number(list_data.current_page)"
:page-size="Number(list_data.per_page)"
:total="Number(list_data.total)"
@on-change="index"
show-elevator
show-total
></Page>
<Page :current="Number(list_data.current_page)" :page-size="Number(list_data.per_page)" :total="Number(list_data.total)" @on-change="index" show-elevator show-total></Page>
</div>
<ui-edit
:data="editObj.data"
:isUpdate.sync="editObj.isUpdate"
:show.sync="editObj.show"
@add-success="index"
@update-success="index(list_data.current_page)"
></ui-edit>
<ui-edit :data="editObj.data" :isUpdate.sync="editObj.isUpdate" :show.sync="editObj.show" @add-success="index" @update-success="index(list_data.current_page)"></ui-edit>
</div>
</template>

View File

@ -14,7 +14,6 @@ export default {
username: ''
}
},
trashed: '',
list_data: null,
editObj: {
show: false,
@ -221,7 +220,6 @@ export default {
for (let k in this.params) {
this.params[k] = '';
}
this.trashed = '';
this.index(1);
}
}

View File

@ -67,9 +67,9 @@
<li class="handle-item w-250">
<Select clearable placeholder="运营商" v-model="params.carrier_operator">
<Option :value="'0'">联通</Option>
<Option :value="'1'">移动</Option>
<Option :value="'2'">电信</Option>
<Option :value="0">联通</Option>
<Option :value="1">移动</Option>
<Option :value="2">电信</Option>
</Select>
</li>
@ -90,14 +90,7 @@
</div>
<div class="page-turn-wrap" v-if="list_data">
<Page
:current="Number(list_data.current_page)"
:page-size="Number(list_data.per_page)"
:total="Number(list_data.total)"
@on-change="index"
show-elevator
show-total
></Page>
<Page :current="Number(list_data.current_page)" :page-size="Number(list_data.per_page)" :total="Number(list_data.total)" @on-change="index" show-elevator show-total></Page>
</div>
<ui-edit :data="editObj.data" :show.sync="editObj.show" @add-success="index" @update-success="index(list_data.current_page)"></ui-edit>

View File

@ -1,18 +1,16 @@
<template>
<Modal :closable="false" :mask-closable="false" :title="data ? '编辑套餐' : '添加套餐'" @on-visible-change="visibleChange" v-model="my_show">
<div class="page-edit-wrap uinn-lr20">
<Drawer :closable="false" :mask-closable="false" :title="data ? '编辑套餐' : '添加套餐'" @on-visible-change="visibleChange" v-model="my_show" width="500">
<div class="page-edit-wrap">
<ui-loading :show="page_loading.show"></ui-loading>
<ul>
<li class="ui-list">
<div class="ui-list-title">套餐编号:</div>
<div class="ui-list-content">
<p>
<Input :disabled="data?true:false" v-model.trim="params.sn"></Input>
</p>
<Input :disabled="data ? true : false" v-model.trim="params.sn"></Input>
<ul class="common-tips-wraper umar-t5">
<li class="t-title">提示</li>
<li class="t-content">仅能输入[A-Z0-9-_]的字符,如未输入将根据规则自动生成</li>
<li class="t-content">如未输入将根据规则自动生成</li>
</ul>
</div>
</li>
@ -21,9 +19,7 @@
<span class="title-require">*</span>套餐名称:
</div>
<div class="ui-list-content">
<p>
<Input :disabled="data?true:false" v-model.trim="params.name"></Input>
</p>
<Input v-model.trim="params.name"></Input>
<ul class="common-tips-wraper umar-t5">
<li class="t-title">提示</li>
<li class="t-content">长度在2-32之间</li>
@ -35,94 +31,118 @@
<span class="title-require">*</span>运营商:
</div>
<div class="ui-list-content">
<p>
<Select v-model="params.carrier_operator">
<Option :value="'0'">联通</Option>
<Option :value="'1'">移动</Option>
<Option :value="'2'">电信</Option>
</Select>
</p>
<Select :disabled="data ? true : false" v-model="params.carrier_operator">
<Option :value="0">联通</Option>
<Option :value="1">移动</Option>
<Option :value="2">电信</Option>
</Select>
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">套餐成本价:</div>
<div class="ui-list-content">
<p>
<InputNumber :max="99999" :min="0" :step="0.01" v-model="params.cost_price"></InputNumber>()
</p>
<InputNumber :formatter="value => Number(value/100).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.cost_price"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">套餐指导价:</div>
<div class="ui-list-content">
<p>
<InputNumber :max="99999" :min="0" :step="0.01" v-model="params.guide_price"></InputNumber>()
</p>
<InputNumber :formatter="value => Number(value/100).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.guide_price"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">续费成本价:</div>
<div class="ui-list-content">
<InputNumber :formatter="value => Number(value/100).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.renewal_cost_price"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">续费指导价:</div>
<div class="ui-list-content">
<InputNumber :formatter="value => Number(value/100).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.renewal_guide_price"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">套餐流量</div>
<div class="ui-list-content">
<p>
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.flows"></InputNumber>(M)
</p>
<InputNumber :disabled="data ? true : false" :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.flows"></InputNumber>&nbsp;(M)
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">套餐语音</div>
<div class="ui-list-content">
<p>
<InputNumber :max="99999" :min="0" :step="1" v-model="params.voices"></InputNumber>(分钟)
</p>
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.voices"></InputNumber>&nbsp;分钟
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">套餐短信</div>
<div class="ui-list-content">
<p>
<InputNumber :max="99999" :min="0" :step="1" v-model="params.messages"></InputNumber>(分钟)
</p>
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.messages"></InputNumber>&nbsp;分钟
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">短信服务</div>
<div class="ui-list-content">
<p>
<Switch @on-change="switchChange" v-model="params.has_messages"/>
</p>
<Switch :false-value="0" :true-value="1" v-model="params.has_messages"/>
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">LBS服务</div>
<div class="ui-list-content">
<p>
<Switch @on-change="switchChange" v-model="params.has_lbs"/>
</p>
<Switch :false-value="0" :true-value="1" v-model="params.has_lbs"/>
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">备注:</div>
<div class="ui-list-title">重置周期</div>
<div class="ui-list-content">
<p>
<Input :maxlength="32" v-model.trim="params.remark"></Input>
</p>
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.reset_months"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">套餐周期</div>
<div class="ui-list-content">
<InputNumber :disabled="data ? true : false" :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.service_months"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">生效延迟</div>
<div class="ui-list-content">
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.effect_months"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">服务延长</div>
<div class="ui-list-content">
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="99999" :min="0" :step="1" v-model="params.delay_months"></InputNumber>&nbsp;
</div>
</li>
<li class="ui-list">
<div class="ui-list-title">说明:</div>
<div class="ui-list-content">
<Input :maxlength="255" v-model.trim="params.description"></Input>
</div>
</li>
</ul>
</div>
<footer class="ta-c" slot="footer">
<Button @click="clear" class="w-80" ghost type="primary">取消</Button>
<div class="ta-c">
<Button @click="clear" class="w-80 umar-r5" ghost type="primary">取消</Button>
<Button :loading="loading" @click="ok" class="w-80" type="primary">提交</Button>
</footer>
</Modal>
</div>
</Drawer>
</template>
<script src="./js/edit.js"></script>

View File

@ -28,9 +28,9 @@
<ul class="handle-wraper">
<li class="handle-item w-250">
<Select clearable placeholder="运营商" v-model="params.carrier_operator">
<Option :value="'0'">联通</Option>
<Option :value="'1'">移动</Option>
<Option :value="'2'">电信</Option>
<Option :value="0">联通</Option>
<Option :value="1">移动</Option>
<Option :value="2">电信</Option>
</Select>
</li>

View File

@ -1,4 +1,4 @@
import * as API from 'api/virtual/companies';
import * as API from 'api/virtual/packages';
export default {
props: {
@ -8,7 +8,7 @@ export default {
},
data: {
type: Object,
default () {
default() {
return null;
}
}
@ -21,14 +21,21 @@ export default {
params: {
sn: '',
name: '',
carrier_operator: '',
carrier_operator: 255,
cost_price: 0,
guide_price: 0,
renewal_cost_price: 0,
renewal_guide_price: 0,
flows: 0,
voices: 0,
messages: 0,
has_messages: 0,
has_lbs: 0
has_lbs: 0,
reset_months: 0,
service_months: 0,
effect_months: 0,
delay_months: 0,
description: ''
}
};
},
@ -49,15 +56,29 @@ export default {
methods: {
ok() {
if (!this.params.name) {
this.$Message.info('请填写企业名称');
this.$Message.info('请填写套餐名称');
return;
}
if (!(/[\s\S]{2,32}/.test(this.params.contacts))) {
this.$Message.info('联系人长度在2-32之间');
if (this.params.sn && !/^[A-Z0-9_]{2,32}$/.test(this.params.sn)) {
this.$Message.info('套餐编码为大写字母、数字、下划线的2-32位字符');
return;
}
if (this.params.carrier_operator === 255) {
this.$Message.info('请选择运营商');
return;
}
let type = this.$route.query.type;
if (typeof (type) === 'undefined') {
this.$Message.error('非法请求');
return;
}
this.params.type = type;
if (this.data) {
// 编辑
API.update(this.params, this.data.id).then(res => {
@ -92,14 +113,19 @@ export default {
},
clear() {
let strKeys = ['sn', 'name', 'carrier_operator', 'description'];
for (let k in this.params) {
this.params[k] = '';
if (strKeys.indexOf(k) === -1) {
this.params[k] = 0;
} else {
this.params[k] = '';
}
}
this.my_show = false;
},
switchChange(status) {
console.log(status);
console.log(this.params);
}
}
};

View File

@ -9,7 +9,7 @@ export default {
params: {
name: ''
},
trashed: '',
trashed: null,
list_data: null,
editObj: {
show: false,
@ -54,23 +54,31 @@ export default {
{
title: '套餐编号',
key: 'sn',
width: 300
width: 200
},
{
title: '套餐名称',
key: 'name'
key: 'name',
width: 120
},
{
title: '运营商',
key: 'carrier_operator_name'
key: 'carrier_operator_name',
width: 100
},
{
title: '流量值M',
key: 'flows'
key: 'flows',
width: 120
},
{
title: '套餐周期(月)',
key: 'service_months'
key: 'service_months',
width: 120
},
{
title: '说明',
key: 'description'
},
{
title: '创建时间',
@ -80,6 +88,7 @@ export default {
{
title: '操作',
key: 'action',
width: 170,
render: (h, {
row,
column,
@ -167,13 +176,7 @@ export default {
};
},
created() {
let type = this.$route.query.type;
if (typeof(type) === 'undefined') {
return this.$Message.error('非法请求');
}
this.index(1, type);
this.index(1);
},
methods: {
/**
@ -181,8 +184,15 @@ export default {
* @param {Number} page [description]
* @return {[type]} [description]
*/
index(page = 1, type = 0) {
let data = this.searchDataHandle(this.params, { page }, { 'trashed': this.trashed, 'orderBy': 'id', 'sortedBy': 'asc' });
index(page = 1) {
let type = this.$route.query.type;
if (typeof(type) === 'undefined') {
this.$Message.error('非法请求');
return;
}
let data = this.searchDataHandle(this.params, { page }, { 'type': type, 'trashed': this.trashed, 'orderBy': 'id', 'sortedBy': 'asc' });
this.isShowLoading(true);
API.index(data).then(res => {
this.isShowLoading(false);
@ -224,7 +234,7 @@ export default {
for (let k in this.params) {
this.params[k] = '';
}
this.trashed = '';
this.trashed = null;
this.index(1);
}
}

View File

@ -39,9 +39,9 @@
<ul class="handle-wraper">
<li class="handle-item w-250">
<Select clearable placeholder="运营商" v-model="params.carrier_operator">
<Option :value="'0'">联通</Option>
<Option :value="'1'">移动</Option>
<Option :value="'2'">电信</Option>
<Option :value="0">联通</Option>
<Option :value="1">移动</Option>
<Option :value="2">电信</Option>
</Select>
</li>

View File

@ -13,7 +13,6 @@ export default {
name: null,
package_name: null
},
trashed: '',
editObj: {
show: false,
isUpdate: false,

View File

@ -24,9 +24,19 @@ module.exports = {
.set('service', resolve('src/service'))
.set('util', resolve('src/service/util'))
.set('validate', resolve('src/service/validate'));
},
runtimeCompiler: true,
productionSourceMap: true
config.module
.rule('vue')
.use('iview-loader')
.loader('iview-loader')
.tap(options => {
options = {
prefix: true
};
return options;
});
}
// 这里写你调用接口的基础路径来解决跨域如果设置了代理那你本地开发环境的axios的baseUrl要写为 '' ,即空字符串
// devServer: {
// proxy: 'localhost:3000'