前端
@ -81,7 +81,7 @@ class AccountService extends Service implements JwtServiceContract
|
||||
|
||||
$rule = [
|
||||
'username' => ['username', 'between:2,12', Rule::unique($this->accountRepository->getTable(), 'username')->ignore($attributes['id']), Rule::notIn(config('domain.account.reserved_account'))],
|
||||
'nickname' => ['string', 'display_length:2,32'],
|
||||
'nickname' => ['string', 'between:2,32'],
|
||||
'mobile' => ['string', 'cn_phone', Rule::unique($this->accountRepository->getTable(), 'mobile')->ignore($attributes['id'])],
|
||||
'email' => ['string', 'email', Rule::unique($this->accountRepository->getTable(), 'email')->ignore($attributes['id'])],
|
||||
'password' => ['string'],
|
||||
|
@ -120,17 +120,18 @@ class FileService extends Service
|
||||
$disk = $disk ?: config('filesystems.default');
|
||||
|
||||
if ($input['filename']) {
|
||||
$fileModel = $this->store($file, $input, $disk);
|
||||
$fileModel = $this->store($file, $input, $disk, true);
|
||||
} else {
|
||||
$fileModel = $this->validateFileInDatabase($file, function (UploadedFile $file, string $md5) use ($input, $disk) {
|
||||
$input['filename'] = $this->generateFilePath($md5);
|
||||
return $this->store($file, $input, $disk);
|
||||
});
|
||||
}
|
||||
|
||||
if ($input['type'] && $input['typeid'] && in_array($input['type'], self::$types)) {
|
||||
$this->apply($fileModel->id, $input['type'], $input['typeid'], $input['cover'] ?? false);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return $fileModel;
|
||||
}
|
||||
@ -243,7 +244,7 @@ class FileService extends Service
|
||||
* @param string $disk
|
||||
* @return mixed
|
||||
*/
|
||||
protected function store(UploadedFile $file, $input, $disk)
|
||||
protected function store(UploadedFile $file, $input, $disk, $cover = false)
|
||||
{
|
||||
$disk = $disk ?: config('filesystems.default');
|
||||
$clientHeight = $input['height'] ?? 0;
|
||||
@ -280,7 +281,7 @@ class FileService extends Service
|
||||
'duration' => $clientDuration,
|
||||
];
|
||||
|
||||
$fileModel = $this->fileRepository->create($new);
|
||||
$fileModel = $cover ? new FileModel($new) : $this->fileRepository->create($new);
|
||||
|
||||
return $fileModel;
|
||||
}
|
||||
|
@ -26,7 +26,7 @@ class RoleRepository extends Repository
|
||||
*/
|
||||
protected $fieldSearchable = [
|
||||
'id' => '=',
|
||||
'name' => '=',
|
||||
'name' => 'like',
|
||||
'parent_id' => '=',
|
||||
];
|
||||
|
||||
|
@ -60,6 +60,7 @@ class MongoSync extends Command
|
||||
'bloc_id' => $blocs[$value['comId']] ?? 0,
|
||||
'carrier_operator' => self::$carrierOperators[$value['oType']] ?? 255,
|
||||
'activated_at' => $activated_at,
|
||||
'virtual_activated_at' => $activated_at,
|
||||
'created_at' => $value['sDate']->toDateTime()->format('Y-m-d H:i:s'),
|
||||
'updated_at' => date('Y-m-d H:i:s'),
|
||||
];
|
||||
|
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Virtual\Repositories;
|
||||
|
||||
use App\Core\Repository;
|
||||
use App\Models\Virtual\OrderFlowPackageCards as Model;
|
||||
|
||||
class OrderFlowPackageCardsRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* 是否关闭缓存
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected $cacheSkip = false;
|
||||
|
||||
/**
|
||||
* 是否开启数据转化
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $needTransform = false;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $fieldSearchable = [
|
||||
'id' => '=',
|
||||
'created_at' => 'like',
|
||||
];
|
||||
|
||||
public function model() {
|
||||
return Model::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据格式化
|
||||
*
|
||||
* @param mixed $result
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function transform($model)
|
||||
{
|
||||
return $model->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询条件
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function withConditions(array $conditions = [])
|
||||
{
|
||||
if (isset($conditions['id'])) {
|
||||
$conditions['id'] = array_wrap($conditions['id']);
|
||||
$this->model = $this->model->whereIn('id', $conditions['id']);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Virtual\Repositories;
|
||||
|
||||
use App\Core\Repository;
|
||||
use App\Models\Virtual\OrderRenewalCard as Model;
|
||||
|
||||
class OrderRenewalCardRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* 是否关闭缓存
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected $cacheSkip = false;
|
||||
|
||||
/**
|
||||
* 是否开启数据转化
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $needTransform = false;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $fieldSearchable = [
|
||||
'id' => '=',
|
||||
'created_at' => 'like',
|
||||
];
|
||||
|
||||
public function model() {
|
||||
return Model::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据格式化
|
||||
*
|
||||
* @param mixed $result
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function transform($model)
|
||||
{
|
||||
return $model->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询条件
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function withConditions(array $conditions = [])
|
||||
{
|
||||
if (isset($conditions['id'])) {
|
||||
$conditions['id'] = array_wrap($conditions['id']);
|
||||
$this->model = $this->model->whereIn('id', $conditions['id']);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace App\Domains\Virtual\Repositories;
|
||||
|
||||
use App\Core\Repository;
|
||||
use App\Models\Virtual\OrderRenewalPackageCard as Model;
|
||||
|
||||
class OrderRenewalPackageCardRepository extends Repository
|
||||
{
|
||||
/**
|
||||
* 是否关闭缓存
|
||||
*
|
||||
* @var boolean
|
||||
*/
|
||||
protected $cacheSkip = false;
|
||||
|
||||
/**
|
||||
* 是否开启数据转化
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
protected $needTransform = false;
|
||||
|
||||
/**
|
||||
* @var array
|
||||
*/
|
||||
protected $fieldSearchable = [
|
||||
'id' => '=',
|
||||
'created_at' => 'like',
|
||||
];
|
||||
|
||||
public function model() {
|
||||
return Model::class;
|
||||
}
|
||||
|
||||
/**
|
||||
* 数据格式化
|
||||
*
|
||||
* @param mixed $result
|
||||
*
|
||||
* @return mixed
|
||||
*/
|
||||
public function transform($model)
|
||||
{
|
||||
return $model->toArray();
|
||||
}
|
||||
|
||||
/**
|
||||
* 查询条件
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function withConditions(array $conditions = [])
|
||||
{
|
||||
if (isset($conditions['id'])) {
|
||||
$conditions['id'] = array_wrap($conditions['id']);
|
||||
$this->model = $this->model->whereIn('id', $conditions['id']);
|
||||
}
|
||||
|
||||
return $this;
|
||||
}
|
||||
}
|
@ -63,7 +63,7 @@ class PackageService extends Service
|
||||
{
|
||||
$attributes = array_only($attributes, array_merge(app(Package::class)->getFillable()));
|
||||
|
||||
$attributes['sn'] = $attributes['sn'] ?? CommonService::generatePackageSn($attributes['type'], $attributes['carrier_operator'], $attributes['flows'], $attributes['service_months']);
|
||||
$attributes['sn'] = $attributes['sn'] ?: CommonService::generatePackageSn($attributes['type'], $attributes['carrier_operator'], $attributes['flows'], $attributes['service_months']);
|
||||
|
||||
$rule = [
|
||||
'sn' => ['required', 'between:2,32', Rule::unique($this->packageRepository->getTable(), 'sn')->ignore($attributes['id'])],
|
||||
@ -89,7 +89,7 @@ class PackageService extends Service
|
||||
$message = [
|
||||
'sn.required' => '请输入套餐编号',
|
||||
'sn.between' => '套餐编号长度不合法',
|
||||
'sn.unique' => '套餐编号已经被其他用户所使用',
|
||||
'sn.unique' => '套餐编号已存在,请重新输入',
|
||||
'name.required' => '请输入套餐名称',
|
||||
'name.between' => '套餐名称长度不合法',
|
||||
'name.unique' => '套餐名称已经被其他用户所使用',
|
||||
|
@ -3,22 +3,43 @@ namespace App\Domains\Virtual\Services;
|
||||
|
||||
use App\Core\Service;
|
||||
use App\Models\Virtual\Order;
|
||||
use App\Models\Virtual\OrderCard;
|
||||
use Illuminate\Support\Facades\DB;
|
||||
use App\Domains\Virtual\Repositories\OrderRepository;
|
||||
use App\Domains\Virtual\Repositories\CompanyRepository;
|
||||
use App\Domains\Virtual\Repositories\OrderCardRepository;
|
||||
use App\Domains\Virtual\Repositories\OrderRenewalCardRepository;
|
||||
use App\Domains\Virtual\Repositories\OrderFlowPackageCardsRepository;
|
||||
use App\Domains\Virtual\Repositories\OrderRenewalPackageCardRepository;
|
||||
|
||||
class StatService extends Service
|
||||
{
|
||||
protected $companyRepository;
|
||||
protected $orderRepository;
|
||||
protected $orderCardRepository;
|
||||
protected $orderRenewalCardRepository;
|
||||
protected $orderRenewalPackageCardRepository;
|
||||
protected $orderFlowPackageCardsRepository;
|
||||
|
||||
/**
|
||||
* 构造函数
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
public function __construct(OrderRepository $orderRepository)
|
||||
{
|
||||
public function __construct(
|
||||
CompanyRepository $companyRepository,
|
||||
OrderRepository $orderRepository,
|
||||
OrderCardRepository $orderCardRepository,
|
||||
OrderRenewalCardRepository $orderRenewalCardRepository,
|
||||
OrderRenewalPackageCardRepository $orderRenewalPackageCardRepository,
|
||||
OrderFlowPackageCardsRepository $orderFlowPackageCardsRepository
|
||||
) {
|
||||
$this->companyRepository = $companyRepository;
|
||||
$this->orderRepository = $orderRepository;
|
||||
$this->orderCardRepository = $orderCardRepository;
|
||||
$this->orderRenewalCardRepository = $orderRenewalCardRepository;
|
||||
$this->orderRenewalPackageCardRepository = $orderRenewalPackageCardRepository;
|
||||
$this->orderFlowPackageCardsRepository = $orderFlowPackageCardsRepository;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -28,7 +49,7 @@ class StatService extends Service
|
||||
*/
|
||||
public function companyIndex(array $conditions = [])
|
||||
{
|
||||
$companies = app(CompanyRepository::class)->withConditions(array_only($conditions, ['name']))
|
||||
$companies = $this->companyRepository->withConditions(array_only($conditions, ['name']))
|
||||
->select(['id', 'name'])->applyConditions()->withTrashed()->paginate($conditions['limit']);
|
||||
|
||||
if (empty($companies)) {
|
||||
@ -37,28 +58,30 @@ class StatService extends Service
|
||||
|
||||
$groupBy = 'company_id';
|
||||
|
||||
$select = [$groupBy, DB::raw('sum(counts) as count')];
|
||||
$select = [$groupBy, DB::raw('count(*) as counts')];
|
||||
|
||||
$model = Order::select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy);
|
||||
$model = OrderCard::select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy);
|
||||
|
||||
$total = $this->orderRepository->setModel($model)->withConditions(['type' => 0])->get()->pluck('count', 'company_id')->toArray();
|
||||
$total = $this->orderCardRepository->setModel(clone $model)->get()->pluck('counts', 'company_id')->toArray();
|
||||
|
||||
$conditions = array_only($conditions, ['starttime', 'endtime']);
|
||||
|
||||
$count = $this->orderRepository->setModel($model)->withConditions(array_merge($conditions, ['type' => 0]))
|
||||
->get()->pluck('count', 'company_id')->toArray();
|
||||
$counts = $this->orderCardRepository->setModel(clone $model)->withConditions($conditions)->get()->pluck('counts', 'company_id')->toArray();
|
||||
|
||||
$renewed_count = $this->orderRepository->setModel($model)->withConditions(array_merge($conditions, ['type' => [1, 2]]))
|
||||
->get()->pluck('count', 'company_id')->toArray();
|
||||
$orderRenewalCard = $this->orderRenewalCardRepository->select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy)->get()->pluck('counts', 'company_id')->toArray();
|
||||
$orderRenewalPackage = $this->orderRenewalPackageCardRepository->select($select)->whereIn('company_id', $companies->pluck('id')->toArray())->groupBy($groupBy)->get()->pluck('counts', 'company_id')->toArray();
|
||||
|
||||
$valid_count = $this->orderRepository->setModel($model)->withConditions(array_merge($conditions, ['type' => [1, 2]]))
|
||||
->get()->pluck('count', 'company_id')->toArray();
|
||||
$renewed_counts = array_merge_sum($orderRenewalCard, $orderRenewalPackage);
|
||||
|
||||
$companies->map(function ($item) use ($total, $count, $renewed_count, $valid_count) {
|
||||
$valid_counts = $this->orderCardRepository->setModel(clone $model)->whereHas('card', function ($query) {
|
||||
return $query->whereNotNull('virtual_activated_at')->whereNull('cancelled_at');
|
||||
})->withConditions($conditions)->get()->pluck('counts', 'company_id')->toArray();
|
||||
|
||||
$companies->map(function ($item) use ($total, $counts, $renewed_counts, $valid_counts) {
|
||||
$item->total = $total[$item['id']] ?? 0;
|
||||
$item->count = $count[$item['id']] ?? 0;
|
||||
$item->renewed_count = $renewed_count[$item['id']] ?? 0;
|
||||
$item->valid_count = $valid_count[$item['id']] ?? 0;
|
||||
$item->counts = $counts[$item['id']] ?? 0;
|
||||
$item->renewed_counts = $renewed_counts[$item['id']] ?? 0;
|
||||
$item->valid_counts = $valid_counts[$item['id']] ?? 0;
|
||||
});
|
||||
|
||||
return $companies;
|
||||
|
@ -3,13 +3,14 @@
|
||||
namespace App\Models\Virtual;
|
||||
|
||||
use App\Core\Model;
|
||||
use App\Models\Card\Card;
|
||||
use App\Models\Real\OrderCard;
|
||||
use Illuminate\Database\Eloquent\SoftDeletes;
|
||||
use App\Models\Virtual\Relations\OrderRelations;
|
||||
|
||||
class Order extends Model
|
||||
{
|
||||
use SoftDeletes, OrderRelations;
|
||||
use SoftDeletes;
|
||||
|
||||
protected $table = 'virtual_orders';
|
||||
|
||||
@ -17,5 +18,18 @@ class Order extends Model
|
||||
'extends' => 'array',
|
||||
];
|
||||
|
||||
protected $dates = ['order_at'];
|
||||
public function company()
|
||||
{
|
||||
return $this->belongsTo(Company::class, 'company_id', 'id');
|
||||
}
|
||||
|
||||
public function package()
|
||||
{
|
||||
return $this->belongsTo(Package::class, 'package_id', 'id');
|
||||
}
|
||||
|
||||
public function cards()
|
||||
{
|
||||
return $this->belongsToMany(Card::class, 'virtual_order_cards', 'sim', 'sim');
|
||||
}
|
||||
}
|
||||
|
@ -12,4 +12,19 @@ class OrderCard extends Model
|
||||
use SoftDeletes, OrderRelations, HasCompositePrimaryKey;
|
||||
|
||||
protected $table = 'virtual_order_cards';
|
||||
|
||||
public function renewals()
|
||||
{
|
||||
return $this->belongsToMany(Package::class, 'virtual_order_renewal_cards', 'sim', 'package_id', 'sim', 'id');
|
||||
}
|
||||
|
||||
public function renewalPackages()
|
||||
{
|
||||
return $this->belongsToMany(Package::class, 'virtual_order_renewal_package_cards', 'sim', 'package_id', 'sim', 'id');
|
||||
}
|
||||
|
||||
public function flowPackages()
|
||||
{
|
||||
return $this->belongsToMany(Package::class, 'virtual_order_flows_package_cards', 'sim', 'package_id', 'sim', 'id');
|
||||
}
|
||||
}
|
||||
|
@ -10,5 +10,5 @@ class OrderRenewalCard extends Model
|
||||
{
|
||||
use SoftDeletes, OrderRelations;
|
||||
|
||||
protected $table = 'virtual_order_renewal_package_cards';
|
||||
protected $table = 'virtual_order_renewal_cards';
|
||||
}
|
||||
|
@ -10,5 +10,5 @@ class OrderRenewalPackageCard extends Model
|
||||
{
|
||||
use SoftDeletes, OrderRelations;
|
||||
|
||||
protected $table = 'virtual_order_renewal_cards';
|
||||
protected $table = 'virtual_order_renewal_package_cards';
|
||||
}
|
||||
|
@ -24,7 +24,7 @@ trait OrderRelations
|
||||
return $this->belongsTo(Order::class, 'order_id', 'id');
|
||||
}
|
||||
|
||||
public function cards()
|
||||
public function card()
|
||||
{
|
||||
return $this->belongsTo(Card::class, 'sim', 'sim');
|
||||
}
|
||||
|
@ -121,3 +121,25 @@ if (! function_exists('config_path')) {
|
||||
return base_path($path);
|
||||
}
|
||||
}
|
||||
|
||||
if (! function_exists('array_merge_sum')) {
|
||||
/**
|
||||
* 合并数组(相同键名相加)
|
||||
*
|
||||
* @param array $arr1
|
||||
* @param array $arr2
|
||||
* @return void
|
||||
*/
|
||||
function array_merge_sum(...$arrays)
|
||||
{
|
||||
$array = [];
|
||||
|
||||
foreach ($arrays as $item) {
|
||||
foreach ($item as $key => $value) {
|
||||
$array[$key] = isset($array[$key]) ? $array[$key] + $value : $value;
|
||||
}
|
||||
}
|
||||
|
||||
return $array;
|
||||
}
|
||||
}
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 726 B |
BIN
frontend/public/assets/logo_small.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
@ -2,7 +2,7 @@ var CONFIG = {
|
||||
title: '流量卡BOSS管理平台',
|
||||
login_background: '/assets/login_background.jpg',
|
||||
logo_big: '/assets/logo_big.png',
|
||||
logo_small: '/assets/logo_small.jpg',
|
||||
logo_small: '/assets/logo_small.png',
|
||||
url: (window.location.hostname === 'localhost') ? 'http://v.denghaoyuan.cn' : '/'
|
||||
};
|
||||
|
||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 17 KiB |
@ -47,7 +47,7 @@
|
||||
<li class="ui-list">
|
||||
<div class="ui-list-title"><span class="title-require" v-show="!data">*</span>密码:</div>
|
||||
<div class="ui-list-content">
|
||||
<div><Input type="password" v-model.trim="params.password"></Input></div>
|
||||
<div><Input type="password" v-model.trim="params.current_password"></Input></div>
|
||||
<ul class="common-tips-wraper umar-t5">
|
||||
<li class="t-title">提示</li>
|
||||
<li class="t-content">长度在6-18之间,只能包含字母、数字和下划线</li>
|
||||
|
@ -78,6 +78,7 @@ export default {
|
||||
nickname: '',
|
||||
mobile: '',
|
||||
password: '',
|
||||
current_password: '',
|
||||
confirm_password: '',
|
||||
status: 1, // 1:正常 2:禁用
|
||||
role_id: ''
|
||||
@ -120,12 +121,12 @@ export default {
|
||||
}
|
||||
|
||||
if (!this.data) {
|
||||
if (!this.params.password) {
|
||||
if (!this.params.current_password) {
|
||||
this.$Message.info('请填写密码');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isPsw(this.params.password)) {
|
||||
if (!isPsw(this.params.current_password)) {
|
||||
this.$Message.info('密码长度在6-18之间,只能包含字母、数字和下划线');
|
||||
return;
|
||||
}
|
||||
@ -135,12 +136,12 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.params.password != this.params.confirm_password) {
|
||||
if (this.params.current_password != this.params.confirm_password) {
|
||||
this.$Message.info('密码与确认密码填写不一致');
|
||||
return;
|
||||
}
|
||||
|
||||
this.params.password = md5(this.params.password);
|
||||
this.params.password = md5(this.params.current_password);
|
||||
|
||||
// 添加时
|
||||
if (this.img_list.length) {
|
||||
@ -154,8 +155,8 @@ export default {
|
||||
}
|
||||
}
|
||||
} else {
|
||||
if (this.params.password) {
|
||||
if (!isPsw(this.params.password)) {
|
||||
if (this.params.current_password) {
|
||||
if (!isPsw(this.params.current_password)) {
|
||||
this.$Message.info('密码长度在6-18之间,只能包含字母、数字和下划线');
|
||||
return;
|
||||
}
|
||||
@ -165,12 +166,12 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.params.password != this.params.confirm_password) {
|
||||
if (this.params.current_password != this.params.confirm_password) {
|
||||
this.$Message.info('密码与确认密码填写不一致');
|
||||
return;
|
||||
}
|
||||
|
||||
this.params.password = md5(this.params.password);
|
||||
this.params.password = md5(this.params.current_password);
|
||||
}
|
||||
}
|
||||
|
||||
@ -183,7 +184,7 @@ export default {
|
||||
|
||||
let data = new FormData();
|
||||
for (let k in this.params) {
|
||||
if (k != 'confirm_password') {
|
||||
if (k != 'current_password' || k != 'confirm_password') {
|
||||
if (this.params[k]) {
|
||||
data.append(k, this.params[k]);
|
||||
}
|
||||
|
@ -53,7 +53,7 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
if (!(/[\s\S]{2,32}/.test(this.params.contacts))) {
|
||||
if (this.params.contacts && !(/[\s\S]{2,32}/.test(this.params.contacts))) {
|
||||
this.$Message.info('联系人长度在2-32之间');
|
||||
return;
|
||||
}
|
||||
|
@ -40,7 +40,7 @@
|
||||
</div>
|
||||
<div class="ui-list-content">
|
||||
<div>
|
||||
<Input type="password" v-model.trim="params.password"></Input>
|
||||
<Input type="password" v-model.trim="params.current_password"></Input>
|
||||
</div>
|
||||
<ul class="common-tips-wraper umar-t5">
|
||||
<li class="t-title">提示</li>
|
||||
|
@ -79,12 +79,12 @@ export default {
|
||||
}
|
||||
|
||||
if (!this.isUpdate) {
|
||||
if (!this.params.password) {
|
||||
if (!this.params.current_password) {
|
||||
this.$Message.info('请填写密码');
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isPsw(this.params.password)) {
|
||||
if (!isPsw(this.params.current_password)) {
|
||||
this.$Message.info('密码长度在6-18之间,只能包含字母、数字和下划线');
|
||||
return;
|
||||
}
|
||||
@ -94,15 +94,15 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.params.password != this.params.confirm_password) {
|
||||
if (this.params.current_password != this.params.confirm_password) {
|
||||
this.$Message.info('密码与确认密码填写不一致');
|
||||
return;
|
||||
}
|
||||
|
||||
this.params.password = md5(this.params.password);
|
||||
this.params.password = md5(this.params.current_password);
|
||||
} else {
|
||||
if (this.params.password) {
|
||||
if (!isPsw(this.params.password)) {
|
||||
if (this.params.current_password) {
|
||||
if (!isPsw(this.params.current_password)) {
|
||||
this.$Message.info('密码长度在6-18之间,只能包含字母、数字和下划线');
|
||||
return;
|
||||
}
|
||||
@ -112,19 +112,19 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
if (this.params.password != this.params.confirm_password) {
|
||||
if (this.params.current_password != this.params.confirm_password) {
|
||||
this.$Message.info('密码与确认密码填写不一致');
|
||||
return;
|
||||
}
|
||||
|
||||
this.params.password = md5(this.params.password);
|
||||
this.params.password = md5(this.params.current_password);
|
||||
}
|
||||
}
|
||||
|
||||
let data = new FormData();
|
||||
|
||||
for (let k in this.params) {
|
||||
if (k != 'confirm_password') {
|
||||
if (k != 'current_password' || k != 'confirm_password') {
|
||||
if (this.params[k]) {
|
||||
data.append(k, this.params[k]);
|
||||
}
|
||||
|
@ -42,28 +42,28 @@
|
||||
<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.reset_months"></InputNumber> 月
|
||||
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="100000" :min="0" :step="1" v-model="params.reset_months"></InputNumber> 月
|
||||
</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> 月
|
||||
<InputNumber :disabled="data ? true : false" :formatter="value => Number(value).toFixed(0)" :max="100000" :min="0" :step="1" v-model="params.service_months"></InputNumber> 月
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list" v-if="!type">
|
||||
<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> 月
|
||||
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="100000" :min="0" :step="1" v-model="params.effect_months"></InputNumber> 月
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list" v-if="!type">
|
||||
<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> 月
|
||||
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="100000" :min="0" :step="1" v-model="params.delay_months"></InputNumber> 月
|
||||
</div>
|
||||
</li>
|
||||
|
||||
@ -84,49 +84,49 @@
|
||||
<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.flows"></InputNumber> (M)
|
||||
<InputNumber :disabled="data ? true : false" :formatter="value => Number(value).toFixed(0)" :max="999999" :min="0" :step="1" v-model="params.flows"></InputNumber> (M)
|
||||
</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.voices"></InputNumber> 分钟
|
||||
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="999999" :min="0" :step="1" v-model="params.voices"></InputNumber> 分钟
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list" v-if="params.has_messages">
|
||||
<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.messages"></InputNumber> 条
|
||||
<InputNumber :formatter="value => Number(value).toFixed(0)" :max="999999" :min="0" :step="1" v-model="params.messages"></InputNumber> 条
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list">
|
||||
<div class="ui-list-title">套餐成本价:</div>
|
||||
<div class="ui-list-content">
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.cost_price"></InputNumber> 元
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="100000" :min="0" :step="0.01" v-model="params.cost_price"></InputNumber> 元
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list">
|
||||
<div class="ui-list-title">套餐指导价:</div>
|
||||
<div class="ui-list-content">
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.guide_price"></InputNumber> 元
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="100000" :min="0" :step="0.01" v-model="params.guide_price"></InputNumber> 元
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list">
|
||||
<div class="ui-list-title">续费成本价:</div>
|
||||
<div class="ui-list-content">
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.renewal_cost_price"></InputNumber> 元
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="100000" :min="0" :step="0.01" v-model="params.renewal_cost_price"></InputNumber> 元
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list">
|
||||
<div class="ui-list-title">续费指导价:</div>
|
||||
<div class="ui-list-content">
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="99999" :min="0" :step="0.01" v-model="params.renewal_guide_price"></InputNumber> 元
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="100000" :min="0" :step="0.01" v-model="params.renewal_guide_price"></InputNumber> 元
|
||||
</div>
|
||||
</li>
|
||||
|
||||
|
@ -27,14 +27,14 @@
|
||||
<li class="ui-list">
|
||||
<div class="ui-list-title">基础价格</div>
|
||||
<div class="ui-list-content">
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="10000" :min="0" :step="0.1" v-model.trim="params.base_price"></InputNumber>
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="100000" :min="0" :step="0.1" v-model.trim="params.base_price"></InputNumber>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="ui-list">
|
||||
<div class="ui-list-title">续费价格</div>
|
||||
<div class="ui-list-content">
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="10000" :min="0" :step="0.1" v-model.trim="params.renewal_price"></InputNumber>
|
||||
<InputNumber :formatter="value => Number(value).toFixed(2)" :max="100000" :min="0" :step="0.1" v-model.trim="params.renewal_price"></InputNumber>
|
||||
</div>
|
||||
</li>
|
||||
|
||||
|
@ -210,9 +210,17 @@ export default {
|
||||
return;
|
||||
}
|
||||
|
||||
let companies = [];
|
||||
|
||||
if (this.completeCompaniesPinyinEngine) {
|
||||
this.companies = this.completeCompaniesPinyinEngine.query(value);
|
||||
companies = this.completeCompaniesPinyinEngine.query(value);
|
||||
}
|
||||
|
||||
companies = this.completeCompanies.filter(function(item) {
|
||||
return (item.name.toLowerCase().indexOf(value.toLowerCase()) !== -1) || (companies.find(element => { return element.id === item.id; }));
|
||||
});
|
||||
|
||||
this.companies = companies;
|
||||
},
|
||||
handleSearchPackages(value) {
|
||||
this.params.package_id = value;
|
||||
|
@ -27,18 +27,18 @@ export default {
|
||||
},
|
||||
{
|
||||
title: '新增用户数',
|
||||
key: 'count',
|
||||
key: 'counts',
|
||||
width: 120
|
||||
},
|
||||
{
|
||||
title: '续费用户数',
|
||||
key: 'renewed_count',
|
||||
key: 'renewed_counts',
|
||||
width: 120
|
||||
},
|
||||
{
|
||||
title: '有效用户数',
|
||||
key: 'valid_count',
|
||||
width: 120
|
||||
title: '服务期内用户数',
|
||||
key: 'valid_counts',
|
||||
width: 200
|
||||
}
|
||||
]
|
||||
};
|
||||
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 5.2 KiB |
Before Width: | Height: | Size: 726 B |
BIN
public/assets/logo_small.png
Normal file
After Width: | Height: | Size: 1.9 KiB |
@ -2,7 +2,7 @@ var CONFIG = {
|
||||
title: '流量卡BOSS管理平台',
|
||||
login_background: '/assets/login_background.jpg',
|
||||
logo_big: '/assets/logo_big.png',
|
||||
logo_small: '/assets/logo_small.jpg',
|
||||
logo_small: '/assets/logo_small.png',
|
||||
url: (window.location.hostname === 'localhost') ? 'http://v.denghaoyuan.cn' : '/'
|
||||
};
|
||||
|
||||
|
Before Width: | Height: | Size: 4.2 KiB After Width: | Height: | Size: 17 KiB |
2
public/js/app.4be850df.js
Normal file
1
public/js/app.4be850df.js.map
Normal file
2
public/js/app.66c79076.js
Normal file
1
public/js/app.66c79076.js.map
Normal file
2
public/js/chunk-309b8638.49263faf.js
Normal file
1
public/js/chunk-309b8638.49263faf.js.map
Normal file
2
public/js/chunk-309b8638.9aa84475.js
Normal file
1
public/js/chunk-309b8638.9aa84475.js.map
Normal file
@ -1 +1 @@
|
||||
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=\favicon.ico><script src=\config.js></script><title></title><link href=/css/chunk-309b8638.1194349a.css rel=prefetch><link href=/js/chunk-00ae0766.8f2466c0.js rel=prefetch><link href=/js/chunk-309b8638.a7afad3e.js rel=prefetch><link href=/css/app.36043160.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.28aa670f.js rel=preload as=script><link href=/js/chunk-vendors.02a4e5bc.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.36043160.css rel=stylesheet></head><body><noscript><strong>很抱歉,如果没有启用JavaScript,程序不能正常工作,若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.02a4e5bc.js></script><script src=/js/app.28aa670f.js></script></body></html>
|
||||
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge"><meta name=viewport content="width=device-width,initial-scale=1"><link rel=icon href=\favicon.ico><script src=\config.js></script><title></title><link href=/css/chunk-309b8638.1194349a.css rel=prefetch><link href=/js/chunk-00ae0766.8f2466c0.js rel=prefetch><link href=/js/chunk-309b8638.49263faf.js rel=prefetch><link href=/css/app.36043160.css rel=preload as=style><link href=/css/chunk-vendors.3c3b2e85.css rel=preload as=style><link href=/js/app.4be850df.js rel=preload as=script><link href=/js/chunk-vendors.02a4e5bc.js rel=preload as=script><link href=/css/chunk-vendors.3c3b2e85.css rel=stylesheet><link href=/css/app.36043160.css rel=stylesheet></head><body><noscript><strong>很抱歉,如果没有启用JavaScript,程序不能正常工作,若要继续使用请启用它。</strong></noscript><div id=app></div><script src=/js/chunk-vendors.02a4e5bc.js></script><script src=/js/app.4be850df.js></script></body></html>
|