Commit 1dc5d143 authored by 李鹏's avatar 李鹏

Merge branch 'dev' into 'master'

Dev

See merge request alpha/sun!3
parents 7fea4922 c670db20
# Byte-compiled / optimized / DLL files
__pycache__/
*.py[cod]
# vim
*.swp
# C extensions
*.so
# VIM
*.swp
# Distribution / packaging
.Python
env/
build/
develop-eggs/
# dist/
downloads/
.vscode
eggs/
# lib/
lib64/
parts/
sdist/
var/
*.egg-info/
.installed.cfg
*.egg
# PyInstaller
# Usually these files are written by a python script from a template
# before PyInstaller builds the exe, so as to inject date/other infos into it.
*.manifest
*.spec
# Installer logs
pip-log.txt
pip-delete-this-directory.txt
# Unit test / coverage reports
htmlcov/
.tox/
.coverage
.cache
nosetests.xml
coverage.xml
# Translations
*.mo
*.pot
# Django stuff:
*.log
# Sphinx documentation
docs/_build/
# PyBuilder
target/
# NodeJS
node_modules/
# First Page of VUE
templates/index.html
# Env
.env/
.idea/
.vscode/
/local/
media/
.env
# Mac
.DS_Store
# Personal Ignore
# Chuncheng
fire.sh
# Project
ascle/settings.py
log/.django.request.log.swp
fe-dist/
celerybeat-schedule.db
celerybeat.pid
dump.rdb
ascle/rpcd.json
.env
jmanage.py
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/16
from django.conf import settings
from utils.base import APIView
from utils.user_util import make_password
from utils.logger import error_logger
class AccountList(APIView):
def get(self, request):
page = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
try:
data = self.rpc['venus/sun/account/list'](offset=(page - 1) * limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'获取账户列表失败,%s', e)
raise
return data
def post(self, request):
ids = request.POST.get('ids', '').split()
type = request.POST.get('type', '')
updates = {}
if type == 'offline':
updates['is_online'] = 0
else:
updates['is_online'] = 1
try:
self.rpc['venus/sun/account/batch/update'](updates=updates, ids=ids).unwrap()
except Exception as e:
error_logger.error(u'上下线更新失败,%s', e)
raise
return {
"message": "更新成功"
}
class AccountUpdateOrCreateView(APIView):
def get(self, request):
id = request.GET.get('id')
try:
data = self.rpc['venus/sun/account/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取账户%s失败, %s' %(id, e))
raise
return {'data': data}
def post(self, request):
id = request.POST.get('id')
data = {
'username': request.POST.get('username'),
'email': request.POST.get('email'),
'password': make_password(request.POST.get('password')),
'phone': request.POST.get('phone'),
'nick_name': request.POST.get('nick_name'),
'is_staff': True,
}
try:
data = self.rpc['venus/sun/account/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'编辑账户%s失败,%s' % (id, e))
raise
return data
class LoginView(APIView):
def get(self, request):
"""
获取用户信息
:param request:
:return:
"""
try:
data = self.rpc['venus/sun/account/get_user_info']().unwrap()
data.update({
'avatar': settings.AVATAR
})
if data['is_staff']:
data.update({'roles': ['staff']})
else:
data.update({'roles': ['anonymous']})
except Exception as e:
error_logger.error(u'获取用户信息失败,%s' % (id, e))
raise
return {'data': data}
def post(self, request):
"""
登陆
:param request:
:return:
"""
username = request.POST.get('username')
password = request.POST.get('password')
try:
data = self.rpc['venus/sun/account/login'](username=username, password=password).unwrap()
if data['success'] or all([username == settings.USERNAME, password == settings.PASSWORD]):
ret = {
'id': data['id'],
'avatar': settings.AVATAR,
'name': data['username'],
'session_key': data['session'],
'success': 1,
}
else:
ret = {
'id': data['id'],
'avatar': settings.AVATAR,
'name': '',
'session_key': data['session'],
'success': 0,
'message': data['message'],
}
except Exception as e:
error_logger.error(u'登陆失败%s', e)
raise
if data['is_staff']:
ret.update({'roles': ['staff']})
else:
ret.update({'roles': ['anonymous']})
return {
'data': ret
}
class LogoutView(APIView):
def post(self, request):
self.rpc['venus/sun/account/logout']().unwrap()
return {
'session_key': ''
}
class ResetPasswordView(APIView):
def post(self, request):
id = request.POST.get('id')
password = make_password(settings.OPERATOR_PASSWORD)
try:
self.rpc['venus/sun/account/reset_password'](id=id, password=password).unwrap()
except Exception as e:
error_logger.error(u'%s重置密码失败%s'%(id, e))
raise
return {
'message': '操作成功'
}
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
import json
from utils.base import APIView
from utils.logger import error_logger
class GroupListView(APIView):
def get(self, request):
star_id = request.GET.get('star_id')
user_id = request.GET.get('user_id')
offset = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filters = self.handle_filter(request.GET.get('filter', ""))
if star_id:
filters.update({'star_id': star_id})
if user_id:
filters.update({'user_id': user_id})
try:
data = self.rpc['venus/sun/group/list'](filters=filters, offset=(offset-1)*limit, limit=limit).unwrap()
except Exception as e:
error_logger.error(u'获取小组列表失败%s' , e)
raise
return data
def post(self, request):
ids = request.POST.get('ids', '').split()
type = request.POST.get('type')
updates = {}
if type == 'offline':
updates['is_online'] = False
elif type == 'is_recommend':
updates['is_recommend'] = True
else:
updates['is_online'] = True
try:
self.rpc['venus/sun/group/batch/update'](updates=updates, ids=ids).unwrap()
except Exception as e:
error_logger.error(u'批量更新失败%s', e)
raise
return {
"message": "更新成功"
}
class GroupUpdateOrCreate(APIView):
def get(self, request):
id = request.GET.get('id').split(':')[0]
try:
data = self.rpc['venus/sun/group/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取%s用户信息失败%s'%(id, e))
raise
return data
def post(self, request):
id = request.POST.get('id')
star_ids = list(map(lambda x: x.split(":")[0], json.loads(request.POST.get('star', '[]'))))
group_user_ids = list(map(lambda x: x.split(":")[0], json.loads(request.POST.get('group_users', '[]'))))
data = {
'name': request.POST.get('name', ''),
'description': request.POST.get('description', ''),
'creator_id': request.POST.get('user', '').split(':')[0],
'celebrity_ids': star_ids,
'is_online': int(request.POST.get('is_online', 0)),
'is_recommend': int(request.POST.get('is_recommend', 0)),
'group_user_ids':group_user_ids,
'icon': request.POST.get('icon', '')[:-2]
}
try:
self.rpc['venus/sun/group/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'编辑%s用户信息失败%s' % (id, e))
raise
return {
'message': '更新成功'
}
class GroupRelatedUser(APIView):
def get(self, request):
id = request.GET.get('id')
offset = int(request.GET.get('page', 0))
count = int(request.GET.get('limit', 10))
filters = {'group_id': id}
try:
data = self.rpc['venus/sun/group/user/list'](filters=filters, offset=(offset - 1) * count, limit=count).unwrap()
except Exception as e:
error_logger.error(u'获取小组用户信息失败%s' , e)
raise
return data
class GroupRelatedUserGET(APIView):
def get(self, request):
id = request.GET.get('id', '').split(':')[0]
try:
data = self.rpc['venus/sun/group/user/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取小组用户信息失败%s', e)
raise
return [data, ]
def post(self, request):
group_id = request.POST.get('group_id')
user_id = request.POST.get('user_id')
data = {
'role_id': request.POST.get('original_group_identify'),
}
try:
self.rpc['venus/sun/group/user/edit'](id=group_id, user_id=user_id, data=data).unwrap()
except Exception as e:
error_logger.error(u'编辑小组用户%s信息失败%s'%(user_id, e))
raise
return
\ No newline at end of file
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
import json
from utils.base import APIView
from alpha_types.venus import PICK_TYPE
from utils.logger import error_logger
class PickListView(APIView):
def get(self, request):
offset = int(request.GET.get('page', 1))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
try:
data = self.rpc['venus/sun/pick/list'](offset=(offset - 1) * limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'获取pick列表失败%s', e)
raise
return data
def post(self, request):
ids = request.POST.get('ids', '').split()
type = request.POST.get('type', '')
updates = {}
if type == 'offline':
updates['is_online'] = 0
else:
updates['is_online'] = 1
try:
self.rpc['venus/sun/pick/batch/update'](updates=updates, ids=ids).unwrap()
except Exception as e:
error_logger.error(u'批量更新pick列表失败%s', e)
raise
return {
"message": "更新成功"
}
class UpdateOrCreateView(APIView):
def get(self, request):
id = request.GET.get('id')
try:
data = self.rpc['venus/sun/pick/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取%s-pcik信息失败%s' %(id, e))
raise
return {'data': data}
def post(self, request):
id = request.POST.get('id', '')
pick_group_ids = list(set(map(lambda x: x.split(":")[0], json.loads(request.POST.get('pick_group', '[]')))))
city_ids = list(set(map(lambda x: x.split(":")[0], json.loads(request.POST.get('city', '[]')))))
position = request.POST.get('position')
gender = request.POST.get('gender')
pick_type = request.POST.get('pick_type')
data_dict = {
'gender': '',
'gender_value': '',
}
if gender == '全部':
data_dict['gender'] = 2
elif gender == '男':
data_dict['gender'] = 0
elif gender == '女':
data_dict['gender'] = 1
else:
data_dict['gender'] = gender
if pick_type == '明星打榜':
data_dict['pick_type'] = 1
elif pick_type == 'PICK帖子':
data_dict['pick_type'] = 0
else:
data_dict['pick_type'] = pick_type
data = {
'name': request.POST.get('name'),
'desc': request.POST.get('desc'),
'gender': data_dict['gender'] if id else gender,
'region': city_ids,
'pick_type': data_dict['pick_type'] if id else pick_type,
'pick_group': pick_group_ids,
'is_online': int(request.POST.get('is_online')),
}
if position:
data.update({"position": position})
try:
self.rpc['venus/sun/pick/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'编辑%s-pcik信息失败%s' % (id, e))
raise
return {
'message': '操作成功'
}
class PickUserListView(APIView):
def get(self, request):
pick_id = request.GET.get('id', 0)
pick_type = int(request.GET.get('pick_type_origin', 0))
offset = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filters = {
'pick_id': pick_id
}
dispatch_rpc_endpoint = {
PICK_TYPE.CELEBRITY: 'venus/sun/pick/celebrity/list',
PICK_TYPE.TOPIC: 'venus/sun/pick/topic/list'
}
# try:
# data = self.rpc['venus/sun/pick/get'](id=pick_id).unwrap()
# pick_type = data['pick_type_origin']
# except:
# pick_type = 0
try:
data = self.rpc[dispatch_rpc_endpoint[pick_type]](offset=(offset - 1) * limit, limit=limit, filters=filters).unwrap()
except Exception as e:
error_logger.error(u'获取%s-pcik信息失败%s' % (pick_id, e))
raise
return data
def post(self, request):
celebrity_id = request.POST.get('celebrity_id', '')
fake_pick_nums = request.POST.get('fake_pick_nums', 0)
topic_id = request.POST.get('topic_id', '')
try:
self.rpc['venus/sun/pick/add_fake_pick_nums'](celebrity_id=celebrity_id, topic_id=topic_id, pick_nums=fake_pick_nums).unwrap()
except Exception as e:
error_logger.error(u'增加fake_pick_num失败%s' ,e)
raise
return {
'message': '操作失败'
}
class PickTopicView(APIView):
def get(self, request):
pick_id = request.GET.get('id', 0)
offset = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filters = {
'pick_id': pick_id
}
try:
data = self.rpc['venus/sun/pick/topic/list'](
offset=(offset - 1) * limit,
limit=limit,
filters=filters
).unwrap()
except Exception as e:
raise e
return data
def post(self, request):
topic_id = request.POST.get('topic_id').split(":")[0]
pick_id = request.POST.get('pick_id')
del_ids = json.loads(request.POST.get('del_ids', '""'))
try:
data = self.rpc['venus/sun/pick/pick_topic'](topic_id=topic_id, pick_id=pick_id, del_ids=del_ids).unwrap()
except Exception as e:
raise e
return data
class PickCelebrityListView(APIView):
def get(self, request):
pick_id = request.GET.get('id', 0)
offset = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filters = {
'pick_id': pick_id
}
try:
data = self.rpc['venus/sun/pick/celebrity/list'](
offset=(offset - 1) * limit,
limit=limit,
filters=filters
).unwrap()
except Exception as e:
raise e
return data
def post(self, request):
celebrity_id = request.POST.get('celebrity_id').split(":")[0]
pick_id = request.POST.get('pick_id')
del_ids = json.loads(request.POST.get('del_ids', '""'))
try:
data = self.rpc['venus/sun/pick/pick_celebrity'](celebrity_id=celebrity_id, pick_id=pick_id, del_ids=del_ids).unwrap()
except Exception as e:
error_logger.error(u'操作失败%s', e)
raise
return data
\ No newline at end of file
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
from utils.base import APIView
from utils.time_utils import analysis_time
from utils.logger import error_logger
class PushListView(APIView):
def get(self, request):
page = int(request.GET.get('page', 1))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
try:
data = self.rpc['venus/sun/push/list'](offset=(page-1) * limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'获取push列表失败%s', e)
raise
return data
class PushUpdateOrCreateView(APIView):
def get(self, request):
id = request.GET.get('id')
try:
data = self.rpc['venus/sun/push/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取%s-push信息失败%s' %(id, e))
raise
return {'data': data}
def post(self, request):
id = request.POST.get('id', '')
creator_id = request.POST.get('creator_id')
push_time = analysis_time(request.POST.get('push_time', 0))
group_topic_id = request.POST.get('group_topic_id', '')
icon = request.POST.get('icon', '')
if icon.endswith('-w'):
icon = request.POST.get('icon', '')[:-2]
url = request.POST.get('url', '')
if url == '推送帖子':
url = 'alpha://topic_detail?topic_id='
elif url == '推送小组':
url = 'alpha://group_detail?group_id='
full_url = url + group_topic_id
data = {
'url': full_url,
'push_time': push_time,
'icon': icon,
'content': request.POST.get('content', ''),
'title': request.POST.get('title', ''),
'creator_id': creator_id
}
try:
rep = self.rpc['venus/sun/push/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'创建/编辑%s-push信息失败%s' % (id, e))
raise
return {
"message": '更新成功',
"id": rep['id']
}
class EffectPushTaskView(APIView):
def get(self, request):
push_task_id = request.GET.get('id')
try:
self.rpc['venus/sun/push/effect_push_task'](id=push_task_id).unwrap()
except Exception as e:
error_logger.error(u'%s-push生效失败%s' % (push_task_id, e))
raise
return {
'message': '操作成功'
}
\ No newline at end of file
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/17
from utils.base import APIView
class GroupSearchView(APIView):
def get(self, request):
name = request.GET.get('name')
try:
data = self.rpc['venus/sun/group/search'](name=name).unwrap()
except Exception as e:
raise e
return {
'data': ['{id}:{name}'.format(id=search_data['id'], name=search_data['name']) for search_data in data]
}
class CountrySearchView(APIView):
def get(self, request):
name = request.GET.get('name')
try:
data = self.rpc['venus/sun/country/search'](name=name).unwrap()
except Exception as e:
raise e
return {
'data': ['{id}:{name}'.format(id=search_data['id'], name=search_data['name']) for search_data in data]
}
class UserSearchView(APIView):
def get(self, request):
name = request.GET.get('name')
try:
data = self.rpc['venus/sun/user/search'](name=name).unwrap()
except Exception as e:
raise e
return {
'data': ['{id}:{name}'.format(id=search_data['id'], name=search_data['name']) for search_data in data]
}
class TagSearchView(APIView):
def get(self, request):
name = request.GET.get('name')
try:
data = self.rpc['venus/sun/tag/search'](name=name).unwrap()
except Exception as e:
raise e
return {
'data': ['{id}:{name}'.format(id=search_data['id'], name=search_data['name']) for search_data in data]
}
class CelebritySearchView(APIView):
def get(self, request):
name = request.GET.get('name')
try:
data = self.rpc['venus/sun/celebrity/search'](name=name).unwrap()
except Exception as e:
raise e
return {
'data': ['{id}:{name}'.format(id=search_data['id'], name=search_data['name']) for search_data in data]
}
class CitySearchView(APIView):
def get(self, request):
name = request.GET.get('name')
try:
data = self.rpc['venus/sun/city/search'](name=name).unwrap()
except Exception as e:
raise e
return {
'data': ['{id}:{name}'.format(id=search_data['id'], name=search_data['name']) for search_data in data]
}
class TopicSearchView(APIView):
def get(self, request):
name = request.GET.get('name')
try:
data = self.rpc['venus/sun/topic/search'](name=name).unwrap()
except Exception as e:
raise e
return {
'data': ['{id}:{name}'.format(id=search_data['id'], name=search_data['name']) for search_data in data]
}
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
import json
from utils.base import APIView
from utils.logger import error_logger
class CelebrityListView(APIView):
def get(self, request):
page = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
try:
data = self.rpc['venus/sun/celebrity/list'](offset=(page-1)*limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'获取明星列表失败%s', e)
raise
return data
def post(self, request):
ids = request.POST.get('ids', '').split()
type = request.POST.get('type', '')
updates = {}
if type == 'offline':
updates['is_online'] = 0
else:
updates['is_online'] = 1
try:
self.rpc['venus/sun/celebrity/batch/update'](updates=updates, ids=ids).unwrap()
except Exception as e:
error_logger.error(u'批量更新明星列表失败%s', e)
raise
return {
"message": "更新成功"
}
class CelebrityUpdateOrCreate(APIView):
def get(self, request):
id = request.GET.get('id')
try:
data = self.rpc['venus/sun/celebrity/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取%d明星信息失败%s' %(id, e))
raise
return {'data': data}
def post(self, request):
id = request.POST.get('id', '')
gender = request.POST.get('gender')
group_ids = list(set(map(lambda x: x.split(":")[0], json.loads(request.POST.get('groups', '[]')))))
updates = {
'gender': ''
}
if not id:
updates['gender'] = int(gender)
else:
if gender == '男':
updates['gender'] = 0
elif gender == '女':
updates['gender'] = 1
data = {
'name': request.POST.get('name'),
'gender': updates['gender'],
'city_id': request.POST.get('city').split(":")[0],
'is_online': int(request.POST.get('is_online')),
'desc': request.POST.get('description'),
'portrait': request.POST.get('avatar')[:-2],
'group_ids': group_ids,
}
try:
self.rpc['venus/sun/celebrity/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'创建/编辑%d明星信息失败%s' % (id, e))
raise
return {
'message': '更新成功'
}
class CelebrityRelatedGroup(APIView):
def get(self, request):
id = request.GET.get('id')
offset = int(request.GET.get('page', 0))
count = int(request.GET.get('limit', 10))
filters = {'star_id': id, 'is_online': True}
try:
data = self.rpc['venus/sun/group/list'](filters=filters, offset=(offset-1) * count, limit=count).unwrap()
except Exception as e:
error_logger.error(u'获取%d明星小组信息失败%s' % (id, e))
raise
return data
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/17
import json
from utils.base import APIView
from utils.logger import error_logger
class TagListView(APIView):
def get(self, request):
offset = int(request.GET.get('offset', 1))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
try:
data = self.rpc['venus/sun/tag/list'](offset=(offset-1) * limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'获取标签列表失败%s', e)
raise
return data
def post(self, request):
ids = request.POST.get('ids', '').split()
type = request.POST.get('type', '')
updates = {}
if type == 'offline':
updates['is_online'] = False
else:
updates['is_online'] = True
try:
self.rpc['venus/sun/tag/batch/update'](updates=updates, ids=ids).unwrap()
except Exception as e:
error_logger.error(u'批量更新标签列表失败%s', e)
raise
return {
"message": "更新成功"
}
class TagUpdateOrCreateView(APIView):
def get(self, request):
id = request.GET.get('id')
try:
data = self.rpc['venus/sun/tag/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取标签%d信息失败%s'%(id, e))
raise
if not data:
data = {}
else:
pass
return {'data': data}
def post(self, request):
id = request.POST.get('id')
down_tags = list(set(map(lambda x: x.split(":")[0], json.loads((request.POST.get('down_tags', '[]'))))))
up_tags = list(set(map(lambda x: x.split(":")[0], json.loads((request.POST.get('up_tags', '[]'))))))
data = {
'name': request.POST.get('name'),
'description': request.POST.get('description'),
'down_tags': down_tags,
'up_tags': up_tags,
}
try:
data = self.rpc['venus/sun/tag/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'创建/编辑标签%d信息失败%s' % (id, e))
raise
return data
\ No newline at end of file
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/20
from django.middleware.csrf import get_token
from utils.base import APIView
from gm_upload.utils.qiniu_tool import QiniuTool
qiniu_video = {
'domain': 'video-static.igengmei.com',
'bucket': 'video',
}
class QiniuToken(APIView):
def get(self, request):
token = QiniuTool.get_token(qiniu_video['bucket'])
return {
'token': token
}
\ No newline at end of file
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
import json
from utils.base import APIView
from utils.time_utils import analysis_time
from utils.logger import error_logger
class TopicListView(APIView):
def get(self, request):
user_id = request.GET.get('user_id', '')
group_id = request.GET.get('group_id', '')
offset = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
if user_id:
filter.update({'user_id': user_id})
if group_id:
filter.update({'group_id': group_id})
try:
data = self.rpc['venus/sun/topic/list'](offset=(offset - 1) * limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'获取帖子列表失败%s', e)
raise
return data
class TopicUpdateOrCreateView(APIView):
def get(self, request):
id = request.GET.get('id')
try:
data = self.rpc['venus/sun/topic/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取%s-帖子信息失败%s' %(id, e))
raise
return {'data': data}
def post(self, request):
id = request.POST.get('id', '')
posting_time = analysis_time(request.POST.get('posting_time', 0))
topic_images = list(map(lambda x: x[:-2], json.loads(request.POST.get('topic_images', []))))
tag_ids = list(map(lambda x: x.split(':')[0], json.loads(request.POST.get('tags', '[]'))))
data = {
'topic_images': topic_images,
'video_url': request.POST.get('video_url', ''),
'posting_time': posting_time,
'content': request.POST.get('content', ''),
'content_level': request.POST.get('content_level', ''),
'group_id': request.POST.get('group', '').split(':')[0],
'user_id': request.POST.get('user', '').split(':')[0],
'star_id': request.POST.get('star', '').split(':')[0],
'tag_ids': tag_ids,
'is_online': int(request.POST.get('is_online')),
}
try:
self.rpc['venus/sun/topic/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'创建/编辑%s-帖子信息失败%s' % (id, e))
raise
return {
'message': '更新成功'
}
class ReplyUpdateOrCreateView(APIView):
def get(self, request):
id = request.GET.get('id')
offset = int(request.GET.get('page', 0))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
filter.update({'topic_id': id})
try:
data = self.rpc['venus/sun/topic/reply/list'](offset=(offset-1) * limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'回复帖子失败%s' , e)
raise
return data
def post(self, request):
reply_ids = json.loads(request.POST.get('reply_ids', []))
try:
self.rpc['venus/sun/topic/reply/batch_delete'](ids=reply_ids).unwrap()
except Exception as e:
error_logger.error(u'批量更新帖子失败%s', e)
raise
return {
'message': '操作成功'
}
class ReplyCreate(APIView):
def post(self, request):
request.POST.get('be_replied_id', None)
data = {
'user_id': request.POST.get('user_id').split(':')[0],
'replied_id': request.POST.get("replied_id", None),
'topic_id': request.POST.get("topic_id", None),
'content': request.POST.get('content'),
'replied_user_id': request.POST.get('replied_user_id', None)
}
try:
data = self.rpc['venus/sun/topic/reply/edit'](id=None, data=data).unwrap()
except Exception as e:
error_logger.error(u'编辑帖子失败%s', e)
raise
return {'data': data}
class TopicListBatchUpdate(APIView):
def post(self, request):
ids = request.POST.get('ids', '').split()
type = request.POST.get('type')
updates = {}
if type == 'offline':
updates['is_online'] = False
else:
updates['is_online'] = True
try:
self.rpc['venus/sun/topic/batch/update'](updates=updates, ids=ids).unwrap()
except Exception as e:
error_logger.error(u'批量更新帖子失败%s', e)
raise
return {
"message": "更新成功"
}
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/19
from utils.base import APIView
from gm_upload import upload
class FileUpload(APIView):
args_POST = {
'img_type': {
'access': int,
},
}
def post(self, request):
image_type = self.args_post.get('uploadType')
image = request.FILES.get('file')
data = image.read()
full_image_url = upload(data, img_type=int(image_type)) + '-w'
return {
'file_url': full_image_url
}
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
from django.conf.urls import url
from .pick import *
from .push import *
from .group import *
from .user import *
from .topic import *
from .star import *
from .account import *
from .search import *
from .tag import *
from .upload import *
from .token import *
urlpatterns = [
# 登陆,注销相关
url(r'^account/login$', LoginView.as_view()),
url(r'^account/logout$', LogoutView.as_view()),
url(r'^account/get$', LoginView.as_view()),
url(r'^account/reset_password', ResetPasswordView.as_view()),
url(r'^account/list$', AccountList.as_view()),
url(r'^account/list/update$', AccountList.as_view()),
url(r'^account/detail$', AccountUpdateOrCreateView.as_view()),
url(r'^account/create$', AccountUpdateOrCreateView.as_view()),
# user相关
url(r'^user/list$', UserListView.as_view()),
url(r'^user/list/update$', UserListView.as_view()),
url(r'^user/get$', UserUpdateOrCreate.as_view()),
url(r'^user/create$', UserUpdateOrCreate.as_view()),
url(r'^user/group/list$', UserGroupView.as_view()),
# group相关
url(r'^group/list$', GroupListView.as_view()),
url(r'^group/list/update$', GroupListView.as_view()),
url(r'^group/get$', GroupUpdateOrCreate.as_view()),
url(r'^group/create$', GroupUpdateOrCreate.as_view()),
url(r'^group/user/list$', GroupRelatedUser.as_view()),
url(r'^group/user/get$', GroupRelatedUserGET.as_view()),
url(r'^group/user/edit_group_identify', GroupRelatedUserGET.as_view()),
# topic相关
url(r'^topic/list$', TopicListView.as_view()),
url(r'^topic/detail$', TopicUpdateOrCreateView.as_view()),
url(r'^topic/create$', TopicUpdateOrCreateView.as_view()),
url(r'^topic/batch_update$', TopicListBatchUpdate.as_view()),
url(r'^topic/reply/list$', ReplyUpdateOrCreateView.as_view()),
url(r'^topic/reply/batch_delete$', ReplyUpdateOrCreateView.as_view()),
url(r'^topic/reply/create$', ReplyCreate.as_view()),
# star相关
url(r'^celebrity/list$', CelebrityListView.as_view()),
url(r'^celebrity/list/update$', CelebrityListView.as_view()),
url(r'^celebrity/create$', CelebrityUpdateOrCreate.as_view()),
url(r'^celebrity/detail$', CelebrityUpdateOrCreate.as_view()),
url(r'^celebrity/celebrity_related_group_info', CelebrityRelatedGroup.as_view()),
# push相关
url(r'^push/list$', PushListView.as_view()),
url(r'^push/create', PushUpdateOrCreateView.as_view()),
url(r'^push/detail', PushUpdateOrCreateView.as_view()),
url(r'^push/effect_push', EffectPushTaskView.as_view()),
# pick相关
url(r'^pick/list$', PickListView.as_view()),
url(r'^pick/list/update$', PickListView.as_view()),
url(r'^pick/create$', UpdateOrCreateView.as_view()),
url(r'^pick/detail/', UpdateOrCreateView.as_view()),
url(r'^pick/topic/list$', PickTopicView.as_view()),
url(r'^pick/celebrity/list$', PickCelebrityListView.as_view()),
url(r'^pick/add_fake_pick_nums$', PickUserListView.as_view()),
url(r'^pick/topic', PickTopicView.as_view()),
url(r'^pick/celebrity', PickCelebrityListView.as_view()),
url(r'^pick/del_celebrity', PickCelebrityListView.as_view()),
url(r'^pick/del_topic', PickTopicView.as_view()),
# 标签相关
url(r'^tag/list$', TagListView.as_view()),
url(r'^tag/list/update$', TagListView.as_view()),
url(r'^tag/create$', TagUpdateOrCreateView.as_view()),
url(r'^tag/detail$', TagUpdateOrCreateView.as_view()),
]
search_urlpatterns = [
url(r'search/group$', GroupSearchView.as_view()),
url(r'search/country', CountrySearchView.as_view()),
url(r'search/user', UserSearchView.as_view()),
url(r'search/tag', TagSearchView.as_view()),
url(r'search/celebrity', CelebritySearchView.as_view()),
url(r'search/city', CitySearchView.as_view()),
url(r'search/topic', TopicSearchView.as_view()),
]
common_urlpatterns = [
url(r"^file/upload$", FileUpload.as_view()),
url(r"^get_token/$", QiniuToken.as_view()),
]
urlpatterns += search_urlpatterns
urlpatterns += common_urlpatterns
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
import json
from django.conf import settings
from utils.base import APIView
from django.contrib.auth.hashers import make_password
from utils.logger import error_logger
class UserListView(APIView):
def get(self, request):
group_id = request.GET.get('group_id', '')
page = int(request.GET.get('page', 1))
limit = int(request.GET.get('limit', 10))
filter = self.handle_filter(request.GET.get('filter', ""))
if group_id:
filter.update({'group_id': group_id})
try:
data = self.rpc['venus/sun/user/list'](offset=(page-1)*limit, limit=limit, filters=filter).unwrap()
except Exception as e:
error_logger.error(u'获取用户列表失败%s', e)
raise
return data
def post(self, request):
ids = json.loads(request.POST.get('ids', '[]'))
type = request.POST.get('type', '')
updates = {}
if type == 'recommend':
updates['is_recommend'] = 1
else:
pass
try:
self.rpc['venus/sun/user/batch/update'](updates=updates, ids=ids).unwrap()
except Exception as e:
error_logger.error(u'批量更新user列表失败%s', e)
raise
return {
"message": "更新成功"
}
class UserUpdateOrCreate(APIView):
def get(self, request):
id = request.GET.get('id')
try:
data = self.rpc['venus/sun/user/get'](id=id).unwrap()
except Exception as e:
error_logger.error(u'获取%s用户详情失败%s'%(id, e))
raise
return data
def post(self, request):
id = request.POST.get('id', '')
user_id = request.POST.get('user_id', '')
tag_ids = list(map(lambda x: x.split(":")[0], json.loads(request.POST.get('tags', '[]'))))
password = make_password(settings.PUPPET_PASSWORD, None, 'pbkdf2_sha256')
data = {
'user_id': user_id,
'password': password,
'is_recommend': int(request.POST.get('is_recommend')),
'profile_pic': request.POST.get('avatar')[:-2],
'nick_name': request.POST.get('nick_name'),
'tag_ids': tag_ids,
'is_puppet': int(request.POST.get('is_puppet')),
'city_id': request.POST.get('city', '').split(":")[0],
'phone': request.POST.get('phone'),
'email': request.POST.get('email'),
'gender': request.POST.get('gender'),
}
try:
self.rpc['venus/sun/user/edit'](id=id, data=data).unwrap()
except Exception as e:
error_logger.error(u'创建/编辑%s用户详情失败%s' % (id, e))
raise
return {
'message': '更新成功'
}
class UserGroupView(APIView):
def get(self, request):
user_id = request.GET.get('id')
offset = int(request.GET.get('page', 0))
count = int(request.GET.get('limit', 10))
filters = {'user_id': user_id}
try:
data = self.rpc['venus/sun/group/user/list'](filters=filters, offset=(offset - 1) * count, limit=count).unwrap()
except Exception as e:
error_logger.error(u'获取小组用户详情失败%s' , e)
raise
return data
\ No newline at end of file
#!/usr/bin/env python
import os
import sys
if __name__ == "__main__":
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sun.settings")
try:
from django.core.management import execute_from_command_line
except ImportError:
# The above import may fail for some other reason. Ensure that the
# issue is really that Django is missing to avoid masking other
# exceptions on Python 2.
try:
import django
except ImportError:
raise ImportError(
"Couldn't import Django. Are you sure it's installed and "
"available on your PYTHONPATH environment variable? Did you "
"forget to activate a virtual environment?"
)
raise
execute_from_command_line(sys.argv)
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
from django.core.cache import cache
from django.core.exceptions import PermissionDenied
import helios.rpc
from helios.rpc.object_mapping import SimpleMapper
import gm_logging.django.middleware
from django.conf import settings
from utils.logger import auth_logger, log_error
switch_key = lambda s, d: "SESSION_SWITCH:{}::{}".format(s, d)
rpc_invoker = helios.rpc.create_default_invoker(debug=settings.DEBUG).with_config(dump_curl=settings.DEBUG)
simple_mapper = SimpleMapper()
rpc_mapper = rpc_invoker.with_config(object_mapper=simple_mapper)
class MiddlewareMixin(object):
def __init__(self, get_response=None):
self.get_response = get_response
super(MiddlewareMixin, self).__init__()
def __call__(self, request):
response = None
if hasattr(self, 'process_request'):
response = self.process_request(request)
if not response:
response = self.get_response(request)
if hasattr(self, 'process_response'):
response = self.process_response(request, response)
return response
class RPC(object):
def __init__(self, session, request):
self.rpc_invoker = rpc_invoker.with_config(
session_key=session,
client_info=gm_logging.django.middleware.get_client_info_of_request(request),
)
self.origin = self.rpc_invoker
self.mapper = self.rpc_invoker.with_config(object_mapper=simple_mapper)
class RPCSetupMiddleware(MiddlewareMixin):
def process_request(self, request):
ori_session = request.COOKIES.get(settings.USER_COOKIE_NAME, '')
request.login_session = ori_session
rpc = RPC(request=request, session=ori_session)
request.rpc = rpc
return None
## sun
vu 前端代码本地调试
brew install npm
npm install
npm run dev
\ No newline at end of file
Django==1.11
Jinja2==2.9.6
gevent==1.3.7
gunicorn==19.7.0
greenlet==0.4.15
git+ssh://git@git.wanmeizhensuo.com/backend/helios.git@master
git+ssh://git@git.wanmeizhensuo.com/backend/gm-types.git@master
git+ssh://git@git.wanmeizhensuo.com/backend/gm-upload.git@v0.74
git+ssh://git@git.wanmeizhensuo.com/backend/gm-protocol.git@master
git+ssh://git@git.wanmeizhensuo.com/backend/gm-config.git@v0.1.3
git+ssh://git@git.wanmeizhensuo.com/backend/gm-logging.git@v0.7.8
git+ssh://git@git.wanmeizhensuo.com/backend/gm-dataquery.git@v0.2.10
git+ssh://git@git.wanmeizhensuo.com/system/gm-tracer.git@v0.1.2
git+ssh://git@git.wanmeizhensuo.com/alpha/alpha-types.git@dev
\ No newline at end of file
# coding=utf-8
import os
LOG_DIR = '/data/log/sun/app/'
# https://docs.djangoproject.com/en/2.1/topics/logging#configuring-logging
LOGGING = {
'version': 1,
'disable_existing_loggers': False,
'formatters': {
'verbose': {
'format': '%(asctime)s %(levelname)s %(module)s.%(funcName)s Line:%(lineno)d %(message)s'
},
'simple': {
'format': '%(levelname)s %(message)s'
},
'profile': {
'format': '%(asctime)s %(message)s'
},
'raw': {
'format': '%(message)s'
},
},
'handlers': {
'null': {
'level': 'DEBUG',
'class': 'logging.NullHandler',
},
'console': {
'level': 'DEBUG',
'class': 'logging.StreamHandler',
'formatter': 'verbose'
},
'default': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'default.log'),
'formatter': 'verbose',
},
'info_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'info.log'),
'formatter': 'verbose',
},
'error_handler': {
'level': 'ERROR',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'error.log'),
'formatter': 'verbose',
},
'profile_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'profile.log'),
'formatter': 'profile',
},
'exception_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'exception.log'),
'formatter': 'verbose',
},
'tracer_handler': {
'level': 'INFO',
'class': 'logging.handlers.RotatingFileHandler',
'filename': os.path.join(LOG_DIR, 'tracer.log'),
'formatter': 'raw',
},
},
'loggers': {
'django': {
'handlers': ['default'],
'propagate': True,
'level': 'INFO',
},
'django.request': {
'handlers': ['error_handler'],
'level': 'ERROR',
'propagate': False,
},
'info_logger': {
'handlers': ['info_handler', 'console'],
'level': 'DEBUG',
'propagate': False,
},
'error_logger': {
'handlers': ['error_handler'],
'level': 'ERROR',
'propagate': False,
},
'profile_logger': {
'handlers': ['profile_handler'],
'level': 'INFO',
'propagate': False,
},
'exception_logger': {
'handlers': ['exception_handler'],
'level': 'ERROR',
'propagate': False,
},
'gm_tracer.subscribe': {
'handlers': ['tracer_handler'],
'propagate': False,
'level': 'INFO'
},
}
}
"""
Django settings for sun project.
Generated by 'django-admin startproject' using Django 1.10.
For more information on this file, see
https://docs.djangoproject.com/en/1.10/topics/settings/
For the full list of settings and their values, see
https://docs.djangoproject.com/en/1.10/ref/settings/
"""
import os
from .settings_local import *
from .log_settings import *
# Build paths inside the project like this: os.path.join(BASE_DIR, ...)
BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/1.10/howto/deployment/checklist/
# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'dgqfy+r!$(egc81kc%#8#l$=y)qzrxp_*5577=q7(^ooi74)oi'
# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = True
ALLOWED_HOSTS = ["*"]
# Application definition
INSTALLED_APPS = [
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'api',
]
MIDDLEWARE = [
'django.middleware.security.SecurityMiddleware',
'django.contrib.sessions.middleware.SessionMiddleware',
'django.middleware.common.CommonMiddleware',
# 'django.middleware.csrf.CsrfViewMiddleware',
'django.contrib.auth.middleware.AuthenticationMiddleware',
'django.contrib.messages.middleware.MessageMiddleware',
'middleware.rpc.RPCSetupMiddleware',
'django.middleware.clickjacking.XFrameOptionsMiddleware',
]
ROOT_URLCONF = 'sun.urls'
SENTRY_CELERY_ENDPOINT = 'http://45b0ef6a79204d6988b59c32c9dd4bef:fa018677fb4f49be88d2ba61cdc7ee32@sentry.igengmei.com/135'
GM_UPLOAD_ENV = "alpha"
TEMPLATES = [
{
'BACKEND': 'django.template.backends.django.DjangoTemplates',
'DIRS': [os.path.join(BASE_DIR, 'templates')]
,
'APP_DIRS': True,
'OPTIONS': {
'context_processors': [
'django.template.context_processors.debug',
'django.template.context_processors.request',
'django.contrib.auth.context_processors.auth',
'django.contrib.messages.context_processors.messages',
],
},
},
]
WSGI_APPLICATION = 'sun.wsgi.application'
# Database
# https://docs.djangoproject.com/en/1.10/ref/settings/#databases
# DATABASES = {
# 'default': {
# 'ENGINE': 'django.db.backends.sqlite3',
# 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
# }
# }
# Password validation
# https://docs.djangoproject.com/en/1.10/ref/settings/#auth-password-validators
AUTH_PASSWORD_VALIDATORS = [
{
'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
},
{
'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
},
]
# Internationalization
# https://docs.djangoproject.com/en/1.10/topics/i18n/
LANGUAGE_CODE = 'en-us'
TIME_ZONE = 'UTC'
USE_I18N = True
USE_L10N = True
USE_TZ = True
# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/1.10/howto/static-files/
STATIC_URL = '/static/'
PAGE_SIZE = 10
USER_COOKIE_NAME = 'session_key'
STATIC_ROOT = os.path.join(BASE_DIR, 'static')
STATICFILES_DIRS = [
os.path.join(BASE_DIR, 'static'),
os.path.join(BASE_DIR, 'vu', 'dist', 'static'),
]
# 图片上传
QINIU_ACCESS_KEY = "UPCOYIJkZOMcdd9FDzpBqYjzWUh55fBpVi3AhWpL"
QINIU_SECRET_KEY = "z5YvpDDSam_JE345Z8J_f3TufzelOW2VOGNoBl9e"
QINIU_HOST = "http://wanmeizhensuo.qiniudn.com/"
QINIU_SCOPE = 'wanmeizhensuo'
# 超级管理员
USERNAME = 'admin'
PASSWORD = 'admin'
# 管理员头像
AVATAR = 'https://wpimg.wallstcn.com/f778738c-e4f8-4870-b634-56703b4acafe.gif'
# 马甲用户密码
PUPPET_PASSWORD = 123456
# 重置运营管理登陆密码
OPERATOR_PASSWORD = 123456
\ No newline at end of file
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/15
"""sun URL Configuration
The `urlpatterns` list routes URLs to views. For more information please see:
https://docs.djangoproject.com/en/1.10/topics/http/urls/
Examples:
Function views
1. Add an import: from my_app import views
2. Add a URL to urlpatterns: url(r'^$', views.home, name='home')
Class-based views
1. Add an import: from other_app.views import Home
2. Add a URL to urlpatterns: url(r'^$', Home.as_view(), name='home')
Including another URLconf
1. Import the include() function: from django.conf.urls import url, include
2. Add a URL to urlpatterns: url(r'^blog/', include('blog.urls'))
"""
from django.conf.urls import url, include
# from django.contrib import admin
urlpatterns = [
# url(r'^admin/', admin.site.urls),
url(r'^api/', include('api.urls')),
]
"""
WSGI config for sun project.
It exposes the WSGI callable as a module-level variable named ``application``.
For more information on this file, see
https://docs.djangoproject.com/en/1.10/howto/deployment/wsgi/
"""
import os
from django.core.wsgi import get_wsgi_application
os.environ.setdefault("DJANGO_SETTINGS_MODULE", "sun.settings")
application = get_wsgi_application()
This diff is collapsed.
#!/usr/bin/env python
# -*- coding:utf-8 -*-
#
# Author : RobertDing
# E-mail : robertdingx@gmail.com
# Date : 16/03/25 11:55:13
# Desc : 异常类
#
from __future__ import absolute_import, division, with_statement
from gm_types.ascle.error import ERROR
from gm_types.artemis.error import ERROR as ARTEMIS_ERROR
from gm_types.error import ERROR as GAIA_ERROR
class SunException(Exception):
"""
医生后台普通错误
"""
def __init__(self, code=0, message=None, data=None):
self.code = code
self.message = message or ERROR.getDesc(code) or GAIA_ERROR.getDesc(code) or ARTEMIS_ERROR.getDesc(code)
super().__init__(self.code, self.message)
# -*- coding: UTF-8 -*-
import os
import logging
import traceback
from django.conf import settings
from raven.contrib.django.raven_compat.models import client
APP_LOG_DIR = '/data/log/sun/app'
info_logger = logging.getLogger('info_logger')
error_logger = logging.getLogger('error_logger')
auth_logger = logging.getLogger('auth_logger')
profile_logger = logging.getLogger("profile_logger")
request_logger = logging.getLogger('request_logger')
exception_logger = logging.getLogger('exception_logger')
def log_error():
msg = traceback.format_exc()
if settings.DEBUG:
info_logger.debug(msg)
error_logger.error(traceback.format_exc())
client.captureException()
#! /usr/bin/env python
# -*- coding: utf-8 -*-
# __author__ = "chenwei"
# Date: 2018/11/19
import pytz
import time
import random
from datetime import datetime
def utc_to_local(utc_time_str, utc_format='%Y-%m-%dT%H:%M:%SZ'):
"""
UTCS时间转换为时间戳
:param utc_time_str: 2016-07-31T16:00:00Z
:param utc_format:
:return: 1542816000
"""
local_tz = pytz.timezone('Asia/Shanghai')
local_format = "%Y-%m-%d %H:%M:%S"
utc_dt = datetime.strptime(utc_time_str, utc_format)
local_dt = utc_dt.replace(tzinfo=pytz.utc).astimezone(local_tz)
time_str = local_dt.strftime(local_format)
return int(time.mktime(time.strptime(time_str, local_format)))
def unix_time_to_datetime(stamp):
"""
时间戳转化为datetime类型
:param stamp:
:return:
"""
return datetime.fromtimestamp(stamp)
def utc_to_datetime(utc_time_str):
"""
utc时间转化为datetime
:param utc_time_str:
:return:
"""
time_stamp = utc_to_local(utc_time_str)
return unix_time_to_datetime(time_stamp)
def datetime_toString(dt):
return dt.strftime("%Y-%m-%d %H:%M:%S")
def analysis_time(time):
"""
:param time:
:return:
"""
try:
target_time = unix_time_to_datetime(int(float(time)) / 1000)
except ValueError:
target_time = utc_to_datetime(time[:-5] + 'Z')
return datetime_toString(target_time)
def generate_id():
nowTime = datetime.now().strftime("%Y%m%d%H%M%S") # 生成当前时间
randomNum = random.randint(0, 100); # 生成的随机整数n,其中0<=n<=100
if randomNum <= 10:
randomNum = str(0) + str(randomNum)
uniqueNum = str(nowTime) + str(randomNum)
return uniqueNum
#!/usr/bin/env python
# coding=utf-8
import re
import datetime
import json
from django.conf import settings
from django.http import JsonResponse
from django.contrib.auth.hashers import make_password
from django.http.response import HttpResponseBadRequest
from utils.logger import auth_logger
def require_login(request, origin=''):
"""
医生后台和app的返回需要登陆的方式不一样
@param: origin 需要登录发生的位置来源
!!!!! 这个方法只能结合 return 一起使用
"""
if 'api/client' in request.path_info:
# TODO Skyler 这个暂时这么处理,之后需要换种方式处理
login_require = HttpResponseBadRequest(status=403)
else:
login_require = JsonResponse({
'error': 401,
'message': '需要登录',
'data': None,
})
# 打印日志
info_msg = '!ascle {origin} {path} {session} {doctor_id} _dd:{target_uid}'
auth_logger.info(info_msg.format(
origin=origin,
path=request.path,
session=request.COOKIES.get(settings.USER_COOKIE_NAME, '-'),
doctor_id=getattr(request, 'doctor_user', {}).get('doctor', {}).get('id', '-'),
target_uid=request.GET.get('_dd', '-'),
))
return login_require
def make_password(password):
"""生成密码hash
"""
return make_password(password, None, 'pbkdf2_sha256')
{
"presets": [
["env", {
"modules": false,
"targets": {
"browsers": ["> 1%", "last 2 versions", "not ie <= 8"]
}
}],
"stage-2"
],
"plugins": ["transform-vue-jsx", "transform-runtime"],
"env": {
"development":{
"plugins": ["dynamic-import-node"]
}
}
}
# http://editorconfig.org
root = true
[*]
charset = utf-8
indent_style = space
indent_size = 2
end_of_line = lf
insert_final_newline = true
trim_trailing_whitespace = true
[*.md]
insert_final_newline = false
trim_trailing_whitespace = false
build/*.js
config/*.js
src/assets
module.exports = {
root: true,
parserOptions: {
parser: 'babel-eslint',
sourceType: 'module'
},
env: {
browser: true,
node: true,
es6: true,
},
extends: ['plugin:vue/recommended', 'eslint:recommended'],
// add your custom rules here
//it is base on https://github.com/vuejs/eslint-config-vue
rules: {
"vue/max-attributes-per-line": [2, {
"singleline": 10,
"multiline": {
"max": 1,
"allowFirstLine": false
}
}],
"vue/name-property-casing": ["error", "PascalCase"],
'accessor-pairs': 2,
'arrow-spacing': [2, {
'before': true,
'after': true
}],
'block-spacing': [2, 'always'],
'brace-style': [2, '1tbs', {
'allowSingleLine': true
}],
'camelcase': [0, {
'properties': 'always'
}],
'comma-dangle': [2, 'never'],
'comma-spacing': [2, {
'before': false,
'after': true
}],
'comma-style': [2, 'last'],
'constructor-super': 2,
'curly': [2, 'multi-line'],
'dot-location': [2, 'property'],
'eol-last': 2,
'eqeqeq': [2, 'allow-null'],
'generator-star-spacing': [2, {
'before': true,
'after': true
}],
'handle-callback-err': [2, '^(err|error)$'],
'indent': [2, 2, {
'SwitchCase': 1
}],
'jsx-quotes': [2, 'prefer-single'],
'key-spacing': [2, {
'beforeColon': false,
'afterColon': true
}],
'keyword-spacing': [2, {
'before': true,
'after': true
}],
'new-cap': [2, {
'newIsCap': true,
'capIsNew': false
}],
'new-parens': 2,
'no-array-constructor': 2,
'no-caller': 2,
'no-console': 'off',
'no-class-assign': 2,
'no-cond-assign': 2,
'no-const-assign': 2,
'no-control-regex': 0,
'no-delete-var': 2,
'no-dupe-args': 2,
'no-dupe-class-members': 2,
'no-dupe-keys': 2,
'no-duplicate-case': 2,
'no-empty-character-class': 2,
'no-empty-pattern': 2,
'no-eval': 2,
'no-ex-assign': 2,
'no-extend-native': 2,
'no-extra-bind': 2,
'no-extra-boolean-cast': 2,
'no-extra-parens': [2, 'functions'],
'no-fallthrough': 2,
'no-floating-decimal': 2,
'no-func-assign': 2,
'no-implied-eval': 2,
'no-inner-declarations': [2, 'functions'],
'no-invalid-regexp': 2,
'no-irregular-whitespace': 2,
'no-iterator': 2,
'no-label-var': 2,
'no-labels': [2, {
'allowLoop': false,
'allowSwitch': false
}],
'no-lone-blocks': 2,
'no-mixed-spaces-and-tabs': 2,
'no-multi-spaces': 2,
'no-multi-str': 2,
'no-multiple-empty-lines': [2, {
'max': 1
}],
'no-native-reassign': 2,
'no-negated-in-lhs': 2,
'no-new-object': 2,
'no-new-require': 2,
'no-new-symbol': 2,
'no-new-wrappers': 2,
'no-obj-calls': 2,
'no-octal': 2,
'no-octal-escape': 2,
'no-path-concat': 2,
'no-proto': 2,
'no-redeclare': 2,
'no-regex-spaces': 2,
'no-return-assign': [2, 'except-parens'],
'no-self-assign': 2,
'no-self-compare': 2,
'no-sequences': 2,
'no-shadow-restricted-names': 2,
'no-spaced-func': 2,
'no-sparse-arrays': 2,
'no-this-before-super': 2,
'no-throw-literal': 2,
'no-trailing-spaces': 2,
'no-undef': 2,
'no-undef-init': 2,
'no-unexpected-multiline': 2,
'no-unmodified-loop-condition': 2,
'no-unneeded-ternary': [2, {
'defaultAssignment': false
}],
'no-unreachable': 2,
'no-unsafe-finally': 2,
'no-unused-vars': [2, {
'vars': 'all',
'args': 'none'
}],
'no-useless-call': 2,
'no-useless-computed-key': 2,
'no-useless-constructor': 2,
'no-useless-escape': 0,
'no-whitespace-before-property': 2,
'no-with': 2,
'one-var': [2, {
'initialized': 'never'
}],
'operator-linebreak': [2, 'after', {
'overrides': {
'?': 'before',
':': 'before'
}
}],
'padded-blocks': [2, 'never'],
'quotes': [2, 'single', {
'avoidEscape': true,
'allowTemplateLiterals': true
}],
'semi': [2, 'never'],
'semi-spacing': [2, {
'before': false,
'after': true
}],
'space-before-blocks': [2, 'always'],
'space-before-function-paren': [2, 'never'],
'space-in-parens': [2, 'never'],
'space-infix-ops': 2,
'space-unary-ops': [2, {
'words': true,
'nonwords': false
}],
'spaced-comment': [2, 'always', {
'markers': ['global', 'globals', 'eslint', 'eslint-disable', '*package', '!', ',']
}],
'template-curly-spacing': [2, 'never'],
'use-isnan': 2,
'valid-typeof': 2,
'wrap-iife': [2, 'any'],
'yield-star-spacing': [2, 'both'],
'yoda': [2, 'never'],
'prefer-const': 2,
'no-debugger': process.env.NODE_ENV === 'production' ? 2 : 0,
'object-curly-spacing': [2, 'always', {
objectsInObjects: false
}],
'array-bracket-spacing': [2, 'never']
}
}
.DS_Store
node_modules/
npm-debug.log*
yarn-debug.log*
yarn-error.log*
**/*.log
test/unit/coverage
test/e2e/reports
selenium-debug.log
# Editor directories and files
.idea
.vscode
*.suo
*.ntvs*
*.njsproj
*.sln
package-lock.json
// https://github.com/michael-ciniawsky/postcss-load-config
module.exports = {
"plugins": {
"postcss-import": {},
"postcss-url": {},
// to edit target browsers: use "browserslist" field in package.json
"autoprefixer": {}
}
}
language: node_js
node_js: stable
script: npm run test
notifications:
email: false
MIT License
Copyright (c) 2017-present PanJiaChen
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
# 测试
\ No newline at end of file
<p align="center">
<img width="320" src="https://wpimg.wallstcn.com/ecc53a42-d79b-42e2-8852-5126b810a4c8.svg">
</p>
<p align="center">
<a href="https://github.com/vuejs/vue">
<img src="https://img.shields.io/badge/vue-2.5.10-brightgreen.svg" alt="vue">
</a>
<a href="https://github.com/ElemeFE/element">
<img src="https://img.shields.io/badge/element--ui-2.3.2-brightgreen.svg" alt="element-ui">
</a>
<a href="https://travis-ci.org/PanJiaChen/vue-element-admin" rel="nofollow">
<img src="https://travis-ci.org/PanJiaChen/vue-element-admin.svg?branch=master" alt="Build Status">
</a>
<a href="https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE">
<img src="https://img.shields.io/github/license/mashape/apistatus.svg" alt="license">
</a>
<a href="https://github.com/PanJiaChen/vue-element-admin/releases">
<img src="https://img.shields.io/github/release/PanJiaChen/vue-element-admin.svg" alt="GitHub release">
</a>
<a href="https://gitter.im/vue-element-admin/discuss">
<img src="https://badges.gitter.im/Join%20Chat.svg" alt="gitter">
</a>
<a href="https://panjiachen.gitee.io/vue-element-admin-site/zh/donate">
<img src="https://img.shields.io/badge/%24-donate-ff69b4.svg" alt="donate">
</a>
</p>
简体中文 | [English](./README.md)
## 简介
[vue-element-admin](http://panjiachen.github.io/vue-element-admin) 是一个后台集成解决方案,它基于 [vue](https://github.com/vuejs/vue)[element](https://github.com/ElemeFE/element)。它使用了最新的前端技术栈,内置了 i18 国际化解决方案,动态路由,权限验证,提炼了典型的业务模型,提供了丰富的功能组件,它可以帮助你快速搭建企业级中后台产品原型。相信不管你的需求是什么,本项目都能帮助到你。
- [在线访问](http://panjiachen.github.io/vue-element-admin)
- [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)
- [Gitter 讨论组](https://gitter.im/vue-element-admin/discuss)
- [Wiki](https://github.com/PanJiaChen/vue-element-admin/wiki)
- [Donate](https://panjiachen.github.io/vue-element-admin-site/zh/donate/)
- [Gitee](https://panjiachen.gitee.io/vue-element-admin/) 国内用户可访问该地址在线预览
- [国内访问文档](https://panjiachen.gitee.io/vue-element-admin-site/zh/) 方便没翻墙的用户查看文档
**本项目的定位是后台集成方案,不适合当基础模板来开发。**
- 模板建议使用: [vue-admin-template](https://github.com/PanJiaChen/vue-admin-template)
- 桌面端: [electron-vue-admin](https://github.com/PanJiaChen/electron-vue-admin)
- Typescript版: [vue-typescript-admin-template](https://github.com/Armour/vue-typescript-admin-template) (鸣谢: [@Armour](https://github.com/Armour))
群主 **[圈子](https://jianshiapp.com/circles/1209)** 楼主会经常分享一些技术相关的东西,或者加入[qq 群](https://github.com/PanJiaChen/vue-element-admin/issues/602)
**注意:该项目使用 element-ui@2.3.0+ 版本,所以最低兼容 vue@2.5.0+**
**从`v3.8.0`开始使用`webpack4`。所以若还想使用`webpack3`开发,请使用该分支[webpack3](https://github.com/PanJiaChen/vue-element-admin/tree/webpack3)**
**该项目不支持低版本浏览器(如 ie),有需求请自行添加 polyfill [详情](https://github.com/PanJiaChen/vue-element-admin/wiki#babel-polyfill)**
## 前序准备
你需要在本地安装 [node](http://nodejs.org/)[git](https://git-scm.com/)。本项目技术栈基于 [ES2015+](http://es6.ruanyifeng.com/)[vue](https://cn.vuejs.org/index.html)[vuex](https://vuex.vuejs.org/zh-cn/)[vue-router](https://router.vuejs.org/zh-cn/)[axios](https://github.com/axios/axios)[element-ui](https://github.com/ElemeFE/element),所有的请求数据都使用[Mock.js](https://github.com/nuysoft/Mock)模拟,提前了解和学习这些知识会对使用本项目有很大的帮助。
同时配套一个系列的教程文章,如何从零构建后一个完整的后台项目,建议大家先看完这些文章再来实践本项目
- [手摸手,带你用 vue 撸后台 系列一(基础篇)](https://juejin.im/post/59097cd7a22b9d0065fb61d2)
- [手摸手,带你用 vue 撸后台 系列二(登录权限篇)](https://juejin.im/post/591aa14f570c35006961acac)
- [手摸手,带你用 vue 撸后台 系列三 (实战篇)](https://juejin.im/post/593121aa0ce4630057f70d35)
- [手摸手,带你用 vue 撸后台 系列四(vueAdmin 一个极简的后台基础模板)](https://juejin.im/post/595b4d776fb9a06bbe7dba56)
- [手摸手,带你封装一个 vue component](https://segmentfault.com/a/1190000009090836)
- [手摸手,带你优雅的使用 icon](https://juejin.im/post/59bb864b5188257e7a427c09)
- [手摸手,带你用合理的姿势使用 webpack4(上)](https://juejin.im/post/5b56909a518825195f499806)
- [手摸手,带你用合理的姿势使用 webpack4(下)](https://juejin.im/post/5b5d6d6f6fb9a04fea58aabc)
**如有问题请先看上述使用文档和文章,若不能满足,欢迎 issue 和 pr**
<p align="center">
<img width="900" src="https://wpimg.wallstcn.com/a5894c1b-f6af-456e-82df-1151da0839bf.png">
</p>
## 功能
```
- 登录 / 注销
- 权限验证
- 页面权限
- 指令权限
- 二步登录
- 多环境发布
- dev sit stage prod
- 全局功能
- 国际化多语言
- 多种动态换肤
- 动态侧边栏(支持多级路由嵌套)
- 动态面包屑
- 快捷导航(标签页)
- Svg Sprite 图标
- 本地mock数据
- Screenfull全屏
- 自适应收缩侧边栏
- 编辑器
- 富文本
- Markdown
- JSON 等多格式
- Excel
- 导出excel
- 导出zip
- 导入excel
- 前端可视化excel
- 表格
- 动态表格
- 拖拽表格
- 树形表格
- 内联编辑
- 错误页面
- 401
- 404
- 組件
- 头像上传
- 返回顶部
- 拖拽Dialog
- 拖拽Select
- 拖拽看板
- 列表拖拽
- SplitPane
- Dropzone
- Sticky
- CountTo
- 综合实例
- 错误日志
- Dashboard
- 引导页
- ECharts 图表
- Clipboard(剪贴复制)
- Markdown2html
```
## 开发
```bash
# 克隆项目
git clone https://github.com/PanJiaChen/vue-element-admin.git
# 安装依赖
npm install
# 建议不要用 cnpm 安装 会有各种诡异的bug 可以通过如下操作解决 npm 下载速度慢的问题
npm install --registry=https://registry.npm.taobao.org
# 启动服务
npm run dev
```
浏览器访问 http://localhost:9527
## 发布
```bash
# 构建测试环境
npm run build:sit
# 构建生产环境
npm run build:prod
```
## 其它
```bash
# --report to build with bundle size analytics
npm run build:prod
# --generate a bundle size analytics. default: bundle-report.html
npm run build:prod --generate_report
# --preview to start a server in local to preview
npm run build:prod --preview
# lint code
npm run lint
# auto fix
npm run lint -- --fix
```
更多信息请参考 [使用文档](https://panjiachen.github.io/vue-element-admin-site/zh/)
## Changelog
Detailed changes for each release are documented in the [release notes](https://github.com/PanJiaChen/vue-element-admin/releases).
## Online Demo
[在线 Demo](http://panjiachen.github.io/vue-element-admin)
## Donate
如果你觉得这个项目帮助到了你,你可以帮作者买一杯果汁表示鼓励 :tropical_drink:
![donate](https://panjiachen.github.io/donate/donation.png)
[Paypal Me](https://www.paypal.me/panfree23)
## Browsers support
Modern browsers and Internet Explorer 10+.
| [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/edge/edge_48x48.png" alt="IE / Edge" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>IE / Edge | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/firefox/firefox_48x48.png" alt="Firefox" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Firefox | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/chrome/chrome_48x48.png" alt="Chrome" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Chrome | [<img src="https://raw.githubusercontent.com/alrra/browser-logos/master/src/safari/safari_48x48.png" alt="Safari" width="24px" height="24px" />](http://godban.github.io/browsers-support-badges/)</br>Safari |
| --------- | --------- | --------- | --------- |
| IE10, IE11, Edge| last 2 versions| last 2 versions| last 2 versions
## License
[MIT](https://github.com/PanJiaChen/vue-element-admin/blob/master/LICENSE)
Copyright (c) 2017-present PanJiaChen
'use strict'
require('./check-versions')()
const ora = require('ora')
const rm = require('rimraf')
const path = require('path')
const chalk = require('chalk')
const webpack = require('webpack')
const config = require('../config')
const webpackConfig = require('./webpack.prod.conf')
var connect = require('connect')
var serveStatic = require('serve-static')
const spinner = ora(
'building for ' + process.env.env_config + ' environment...'
)
spinner.start()
rm(path.join(config.build.assetsRoot, config.build.assetsSubDirectory), err => {
if (err) throw err
webpack(webpackConfig, (err, stats) => {
spinner.stop()
if (err) throw err
process.stdout.write(
stats.toString({
colors: true,
modules: false,
children: false,
chunks: false,
chunkModules: false
}) + '\n\n'
)
if (stats.hasErrors()) {
console.log(chalk.red(' Build failed with errors.\n'))
process.exit(1)
}
console.log(chalk.cyan(' Build complete.\n'))
console.log(
chalk.yellow(
' Tip: built files are meant to be served over an HTTP server.\n' +
" Opening index.html over file:// won't work.\n"
)
)
if (process.env.npm_config_preview) {
const port = 9526
const host = 'http://localhost:' + port
const basePath = config.build.assetsPublicPath
const app = connect()
app.use(
basePath,
serveStatic('./dist', {
index: ['index.html', '/']
})
)
app.listen(port, function() {
console.log(
chalk.green(`> Listening at http://localhost:${port}${basePath}`)
)
})
}
})
})
'use strict'
const chalk = require('chalk')
const semver = require('semver')
const packageConfig = require('../package.json')
const shell = require('shelljs')
function exec(cmd) {
return require('child_process')
.execSync(cmd)
.toString()
.trim()
}
const versionRequirements = [
{
name: 'node',
currentVersion: semver.clean(process.version),
versionRequirement: packageConfig.engines.node
}
]
if (shell.which('npm')) {
versionRequirements.push({
name: 'npm',
currentVersion: exec('npm --version'),
versionRequirement: packageConfig.engines.npm
})
}
module.exports = function() {
const warnings = []
for (let i = 0; i < versionRequirements.length; i++) {
const mod = versionRequirements[i]
if (!semver.satisfies(mod.currentVersion, mod.versionRequirement)) {
warnings.push(
mod.name +
': ' +
chalk.red(mod.currentVersion) +
' should be ' +
chalk.green(mod.versionRequirement)
)
}
}
if (warnings.length) {
console.log('')
console.log(
chalk.yellow(
'To use this template, you must update following to modules:'
)
)
console.log()
for (let i = 0; i < warnings.length; i++) {
const warning = warnings[i]
console.log(' ' + warning)
}
console.log()
process.exit(1)
}
}
'use strict'
const path = require('path')
const config = require('../config')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const packageConfig = require('../package.json')
exports.assetsPath = function(_path) {
const assetsSubDirectory =
process.env.NODE_ENV === 'production'
? config.build.assetsSubDirectory
: config.dev.assetsSubDirectory
return path.posix.join(assetsSubDirectory, _path)
}
exports.cssLoaders = function(options) {
options = options || {}
const cssLoader = {
loader: 'css-loader',
options: {
sourceMap: options.sourceMap
}
}
const postcssLoader = {
loader: 'postcss-loader',
options: {
sourceMap: options.sourceMap
}
}
// generate loader string to be used with extract text plugin
function generateLoaders(loader, loaderOptions) {
const loaders = []
// Extract CSS when that option is specified
// (which is the case during production build)
if (options.extract) {
loaders.push(MiniCssExtractPlugin.loader)
} else {
loaders.push('vue-style-loader')
}
loaders.push(cssLoader)
if (options.usePostCSS) {
loaders.push(postcssLoader)
}
if (loader) {
loaders.push({
loader: loader + '-loader',
options: Object.assign({}, loaderOptions, {
sourceMap: options.sourceMap
})
})
}
return loaders
}
// https://vue-loader.vuejs.org/en/configurations/extract-css.html
return {
css: generateLoaders(),
postcss: generateLoaders(),
less: generateLoaders('less'),
sass: generateLoaders('sass', {
indentedSyntax: true
}),
scss: generateLoaders('sass'),
stylus: generateLoaders('stylus'),
styl: generateLoaders('stylus')
}
}
// Generate loaders for standalone style files (outside of .vue)
exports.styleLoaders = function(options) {
const output = []
const loaders = exports.cssLoaders(options)
for (const extension in loaders) {
const loader = loaders[extension]
output.push({
test: new RegExp('\\.' + extension + '$'),
use: loader
})
}
return output
}
exports.createNotifierCallback = () => {
const notifier = require('node-notifier')
return (severity, errors) => {
if (severity !== 'error') return
const error = errors[0]
const filename = error.file && error.file.split('!').pop()
notifier.notify({
title: packageConfig.name,
message: severity + ': ' + error.name,
subtitle: filename || '',
icon: path.join(__dirname, 'logo.png')
})
}
}
'use strict'
module.exports = {
//You can set the vue-loader configuration by yourself.
}
'use strict'
const path = require('path')
const utils = require('./utils')
const config = require('../config')
const { VueLoaderPlugin } = require('vue-loader')
const vueLoaderConfig = require('./vue-loader.conf')
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
module.exports = {
context: path.resolve(__dirname, '../'),
entry: {
app: './src/main.js'
},
output: {
path: config.build.assetsRoot,
filename: '[name].js',
publicPath:
process.env.NODE_ENV === 'production'
? config.build.assetsPublicPath
: config.dev.assetsPublicPath
},
resolve: {
extensions: ['.js', '.vue', '.json'],
alias: {
'@': resolve('src')
}
},
module: {
rules: [
{
test: /\.vue$/,
loader: 'vue-loader',
options: vueLoaderConfig
},
{
test: /\.js$/,
loader: 'babel-loader?cacheDirectory',
include: [
resolve('src'),
resolve('test'),
resolve('node_modules/webpack-dev-server/client')
]
},
{
test: /\.svg$/,
loader: 'svg-sprite-loader',
include: [resolve('src/icons')],
options: {
symbolId: 'icon-[name]'
}
},
{
test: /\.(png|jpe?g|gif|svg)(\?.*)?$/,
loader: 'url-loader',
exclude: [resolve('src/icons')],
options: {
limit: 10000,
name: utils.assetsPath('img/[name].[hash:7].[ext]')
}
},
{
test: /\.(mp4|webm|ogg|mp3|wav|flac|aac)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('media/[name].[hash:7].[ext]')
}
},
{
test: /\.(woff2?|eot|ttf|otf)(\?.*)?$/,
loader: 'url-loader',
options: {
limit: 10000,
name: utils.assetsPath('fonts/[name].[hash:7].[ext]')
}
}
]
},
plugins: [new VueLoaderPlugin()],
node: {
// prevent webpack from injecting useless setImmediate polyfill because Vue
// source contains it (although only uses it if it's native).
setImmediate: false,
// prevent webpack from injecting mocks to Node native modules
// that does not make sense for the client
dgram: 'empty',
fs: 'empty',
net: 'empty',
tls: 'empty',
child_process: 'empty'
}
}
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const FriendlyErrorsPlugin = require('friendly-errors-webpack-plugin')
const portfinder = require('portfinder')
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
const HOST = process.env.HOST
const PORT = process.env.PORT && Number(process.env.PORT)
const devWebpackConfig = merge(baseWebpackConfig, {
mode: 'development',
module: {
rules: utils.styleLoaders({
sourceMap: config.dev.cssSourceMap,
usePostCSS: true
})
},
// cheap-module-eval-source-map is faster for development
devtool: config.dev.devtool,
// these devServer options should be customized in /config/index.js
devServer: {
clientLogLevel: 'warning',
historyApiFallback: true,
hot: true,
compress: true,
host: HOST || config.dev.host,
port: PORT || config.dev.port,
open: config.dev.autoOpenBrowser,
overlay: config.dev.errorOverlay
? { warnings: false, errors: true }
: false,
publicPath: config.dev.assetsPublicPath,
proxy: config.dev.proxyTable,
quiet: true, // necessary for FriendlyErrorsPlugin
watchOptions: {
poll: config.dev.poll
}
},
plugins: [
new webpack.DefinePlugin({
'process.env': require('../config/dev.env')
}),
new webpack.HotModuleReplacementPlugin(),
// https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: 'index.html',
template: 'index.html',
inject: true,
favicon: resolve('favicon.ico'),
title: 'vue-element-admin',
templateParameters: {
BASE_URL: config.dev.assetsPublicPath + config.dev.assetsSubDirectory,
},
}),
]
})
module.exports = new Promise((resolve, reject) => {
portfinder.basePort = process.env.PORT || config.dev.port
portfinder.getPort((err, port) => {
if (err) {
reject(err)
} else {
// publish the new Port, necessary for e2e tests
process.env.PORT = port
// add port to devServer config
devWebpackConfig.devServer.port = port
// Add FriendlyErrorsPlugin
devWebpackConfig.plugins.push(
new FriendlyErrorsPlugin({
compilationSuccessInfo: {
messages: [
`Your application is running here: http://${
devWebpackConfig.devServer.host
}:${port}`
]
},
onErrors: config.dev.notifyOnErrors
? utils.createNotifierCallback()
: undefined
})
)
resolve(devWebpackConfig)
}
})
})
'use strict'
const path = require('path')
const utils = require('./utils')
const webpack = require('webpack')
const config = require('../config')
const merge = require('webpack-merge')
const baseWebpackConfig = require('./webpack.base.conf')
const CopyWebpackPlugin = require('copy-webpack-plugin')
const HtmlWebpackPlugin = require('html-webpack-plugin')
const ScriptExtHtmlWebpackPlugin = require('script-ext-html-webpack-plugin')
const MiniCssExtractPlugin = require('mini-css-extract-plugin')
const OptimizeCSSAssetsPlugin = require('optimize-css-assets-webpack-plugin')
const UglifyJsPlugin = require('uglifyjs-webpack-plugin')
function resolve(dir) {
return path.join(__dirname, '..', dir)
}
const env = require('../config/' + process.env.env_config + '.env')
// For NamedChunksPlugin
const seen = new Set()
const nameLength = 4
const webpackConfig = merge(baseWebpackConfig, {
mode: 'production',
module: {
rules: utils.styleLoaders({
sourceMap: config.build.productionSourceMap,
extract: true,
usePostCSS: true
})
},
devtool: config.build.productionSourceMap ? config.build.devtool : false,
output: {
path: config.build.assetsRoot,
filename: utils.assetsPath('js/[name].[chunkhash:8].js'),
chunkFilename: utils.assetsPath('js/[name].[chunkhash:8].js')
},
plugins: [
// http://vuejs.github.io/vue-loader/en/workflow/production.html
new webpack.DefinePlugin({
'process.env': env
}),
// extract css into its own file
new MiniCssExtractPlugin({
filename: utils.assetsPath('css/[name].[contenthash:8].css'),
chunkFilename: utils.assetsPath('css/[name].[contenthash:8].css')
}),
// generate dist index.html with correct asset hash for caching.
// you can customize output by editing /index.html
// see https://github.com/ampedandwired/html-webpack-plugin
new HtmlWebpackPlugin({
filename: config.build.index,
template: 'index.html',
inject: true,
favicon: resolve('favicon.ico'),
title: 'vue-element-admin',
templateParameters: {
BASE_URL: config.build.assetsPublicPath + config.build.assetsSubDirectory,
},
minify: {
removeComments: true,
collapseWhitespace: true,
removeAttributeQuotes: true
// more options:
// https://github.com/kangax/html-minifier#options-quick-reference
}
// default sort mode uses toposort which cannot handle cyclic deps
// in certain cases, and in webpack 4, chunk order in HTML doesn't
// matter anyway
}),
new ScriptExtHtmlWebpackPlugin({
//`runtime` must same as runtimeChunk name. default is `runtime`
inline: /runtime\..*\.js$/
}),
// keep chunk.id stable when chunk has no name
new webpack.NamedChunksPlugin(chunk => {
if (chunk.name) {
return chunk.name
}
const modules = Array.from(chunk.modulesIterable)
if (modules.length > 1) {
const hash = require('hash-sum')
const joinedHash = hash(modules.map(m => m.id).join('_'))
let len = nameLength
while (seen.has(joinedHash.substr(0, len))) len++
seen.add(joinedHash.substr(0, len))
return `chunk-${joinedHash.substr(0, len)}`
} else {
return modules[0].id
}
}),
// keep module.id stable when vender modules does not change
new webpack.HashedModuleIdsPlugin(),
// copy custom static assets
new CopyWebpackPlugin([
{
from: path.resolve(__dirname, '../static'),
to: config.build.assetsSubDirectory,
ignore: ['.*']
}
])
],
optimization: {
splitChunks: {
chunks: 'all',
cacheGroups: {
libs: {
name: 'chunk-libs',
test: /[\\/]node_modules[\\/]/,
priority: 10,
chunks: 'initial' // 只打包初始时依赖的第三方
},
elementUI: {
name: 'chunk-elementUI', // 单独将 elementUI 拆包
priority: 20, // 权重要大于 libs 和 app 不然会被打包进 libs 或者 app
test: /[\\/]node_modules[\\/]element-ui[\\/]/
},
commons: {
name: 'chunk-commons',
test: resolve('src/components'), // 可自定义拓展你的规则
minChunks: 3, // 最小公用次数
priority: 5,
reuseExistingChunk: true
}
}
},
runtimeChunk: 'single',
minimizer: [
new UglifyJsPlugin({
uglifyOptions: {
mangle: {
safari10: true
}
},
sourceMap: config.build.productionSourceMap,
cache: true,
parallel: true
}),
// Compress extracted CSS. We are using this plugin so that possible
// duplicated CSS from different components can be deduped.
new OptimizeCSSAssetsPlugin()
]
}
})
if (config.build.productionGzip) {
const CompressionWebpackPlugin = require('compression-webpack-plugin')
webpackConfig.plugins.push(
new CompressionWebpackPlugin({
asset: '[path].gz[query]',
algorithm: 'gzip',
test: new RegExp(
'\\.(' + config.build.productionGzipExtensions.join('|') + ')$'
),
threshold: 10240,
minRatio: 0.8
})
)
}
if (config.build.generateAnalyzerReport || config.build.bundleAnalyzerReport) {
const BundleAnalyzerPlugin = require('webpack-bundle-analyzer')
.BundleAnalyzerPlugin
if (config.build.bundleAnalyzerReport) {
webpackConfig.plugins.push(
new BundleAnalyzerPlugin({
analyzerPort: 8080,
generateStatsFile: false
})
)
}
if (config.build.generateAnalyzerReport) {
webpackConfig.plugins.push(
new BundleAnalyzerPlugin({
analyzerMode: 'static',
reportFilename: 'bundle-report.html',
openAnalyzer: false
})
)
}
}
module.exports = webpackConfig
module.exports = {
NODE_ENV: '"development"',
ENV_CONFIG: '"dev"',
BASE_API: '""'
}
'use strict'
// Template version: 1.2.6
// see http://vuejs-templates.github.io/webpack for documentation.
const path = require('path')
var proxyTable = require('../mock/proxy')
module.exports = {
dev: {
// Paths
assetsSubDirectory: 'static',
assetsPublicPath: '/',
proxyTable: proxyTable,
// Various Dev Server settings
// can be overwritten by process.env.HOST
// if you want dev by ip, please set host: '0.0.0.0'
host: 'localhost',
port: 9527, // can be overwritten by process.env.PORT, if port is in use, a free one will be determined
autoOpenBrowser: true,
errorOverlay: true,
notifyOnErrors: false,
poll: false, // https://webpack.js.org/configuration/dev-server/#devserver-watchoptions-
// Use Eslint Loader?
// If true, your code will be linted during bundling and
// linting errors and warnings will be shown in the console.
useEslint: true,
// If true, eslint errors and warnings will also be shown in the error overlay
// in the browser.
showEslintErrorsInOverlay: false,
/**
* Source Maps
*/
// https://webpack.js.org/configuration/devtool/#development
devtool: 'cheap-source-map',
// CSS Sourcemaps off by default because relative paths are "buggy"
// with this option, according to the CSS-Loader README
// (https://github.com/webpack/css-loader#sourcemaps)
// In our experience, they generally work as expected,
// just be aware of this issue when enabling this option.
cssSourceMap: false
},
build: {
// Template for index.html
index: path.resolve(__dirname, '../dist/index.html'),
// Paths
assetsRoot: path.resolve(__dirname, '../dist'),
assetsSubDirectory: 'static',
/**
* You can set by youself according to actual condition
* You will need to set this if you plan to deploy your site under a sub path,
* for example GitHub pages. If you plan to deploy your site to https://foo.github.io/bar/,
* then assetsPublicPath should be set to "/bar/".
* In most cases please use '/' !!!
*/
assetsPublicPath: '/',
/**
* Source Maps
*/
productionSourceMap: false,
// https://webpack.js.org/configuration/devtool/#production
devtool: 'source-map',
// Gzip off by default as many popular static hosts such as
// Surge or Netlify already gzip all static assets for you.
// Before setting to `true`, make sure to:
// npm install --save-dev compression-webpack-plugin
productionGzip: false,
productionGzipExtensions: ['js', 'css'],
// Run the build command with an extra argument to
// View the bundle analyzer report after build finishes:
// `npm run build:prod --report`
// Set to `true` or `false` to always turn it on or off
bundleAnalyzerReport: process.env.npm_config_report || false,
// `npm run build:prod --generate_report`
generateAnalyzerReport: process.env.npm_config_generate_report || false
}
}
module.exports = {
NODE_ENV: '"production"',
ENV_CONFIG: '"prod"',
BASE_API: '""'
}
module.exports = {
NODE_ENV: '"production"',
ENV_CONFIG: '"sit"',
BASE_API: '""'
}
<!DOCTYPE html><html><head><meta charset=utf-8><meta http-equiv=X-UA-Compatible content="IE=edge,chrome=1"><meta name=renderer content=webkit><meta name=viewport content="width=device-width,initial-scale=1,maximum-scale=1,user-scalable=no"><title>更美社区后台</title><link rel="shortcut icon" href=/favicon.ico><link href=/static/css/chunk-elementUI.e8091cad.css rel=stylesheet><link href=/static/css/chunk-libs.825f9043.css rel=stylesheet><link href=/static/css/app.1aeb4577.css rel=stylesheet></head><body><script src=/static/tinymce4.7.5/tinymce.min.js></script><script src=/static/jquery.min.js></script><script src=/static/webuploader.min.js></script><div id=app></div><script>!function(e){function n(n){for(var u,t,o=n[0],h=n[1],f=n[2],d=0,b=[];d<o.length;d++)t=o[d],r[t]&&b.push(r[t][0]),r[t]=0;for(u in h)Object.prototype.hasOwnProperty.call(h,u)&&(e[u]=h[u]);for(k&&k(n);b.length;)b.shift()();return a.push.apply(a,f||[]),c()}function c(){for(var e,n=0;n<a.length;n++){for(var c=a[n],u=!0,t=1;t<c.length;t++){var h=c[t];0!==r[h]&&(u=!1)}u&&(a.splice(n--,1),e=o(o.s=c[0]))}return e}var u={},t={runtime:0},r={runtime:0},a=[];function o(n){if(u[n])return u[n].exports;var c=u[n]={i:n,l:!1,exports:{}};return e[n].call(c.exports,c,c.exports,o),c.l=!0,c.exports}o.e=function(e){var n=[];t[e]?n.push(t[e]):0!==t[e]&&{"chunk-11a3":1,"chunk-5ee7":1,"chunk-93d2":1,"chunk-b3a9":1,"chunk-commons":1,"chunk-08bc":1,"chunk-1f33":1,"chunk-2301":1,"chunk-2407":1,"chunk-28ba":1,"chunk-296d":1,"chunk-2b93":1,"chunk-2b9c":1,"chunk-35eb":1,"chunk-42c8":1,"chunk-1fa9":1,"chunk-4daa":1,"chunk-5ae3":1,"chunk-6e60":1,"chunk-70ee":1,"chunk-7121":1,"chunk-9e04":1,"chunk-a437":1,"chunk-bc2a":1,"chunk-bc2b":1,"chunk-d3e2":1}[e]&&n.push(t[e]=new Promise(function(n,c){for(var u="static/css/"+({"chunk-commons":"chunk-commons"}[e]||e)+"."+{"7zzA":"31d6cfe0",JEtC:"31d6cfe0","chunk-11a3":"985b1424","chunk-5ee7":"0d13629a","chunk-93d2":"12515bbe","chunk-b3a9":"66fca14e","chunk-commons":"f5305ad7","chunk-08bc":"f8811db7","chunk-1f33":"c77fe721","chunk-2301":"15c8db86","00Qp":"31d6cfe0",x10K:"31d6cfe0","chunk-2407":"0d8f2d67","chunk-28ba":"a6ffd0c5","chunk-296d":"8c117e3c","chunk-2b93":"4f2debcc","chunk-2b9c":"4f2debcc","chunk-35eb":"c95fdf1d","chunk-42c8":"961bb2d2","chunk-1fa9":"0fa94f55",SoCV:"31d6cfe0",VwWe:"31d6cfe0","chunk-4daa":"f7255857","chunk-5ae3":"4b6e2bd4","chunk-6e60":"f2f81116","chunk-70ee":"685373e8",Q2Zf:"31d6cfe0",ZMmy:"31d6cfe0","chunk-7121":"748763fd","chunk-9e04":"5f2d5129","/P8B":"31d6cfe0",Gbeq:"31d6cfe0","chunk-a437":"f2f81116","chunk-bc2a":"32735a21","chunk-bc2b":"32735a21","chunk-d3e2":"0d8f2d67"}[e]+".css",t=o.p+u,r=document.getElementsByTagName("link"),a=0;a<r.length;a++){var h=(d=r[a]).getAttribute("data-href")||d.getAttribute("href");if("stylesheet"===d.rel&&(h===u||h===t))return n()}var f=document.getElementsByTagName("style");for(a=0;a<f.length;a++){var d;if((h=(d=f[a]).getAttribute("data-href"))===u||h===t)return n()}var k=document.createElement("link");k.rel="stylesheet",k.type="text/css",k.onload=n,k.onerror=function(n){var u=n&&n.target&&n.target.src||t,r=new Error("Loading CSS chunk "+e+" failed.\n("+u+")");r.request=u,c(r)},k.href=t,document.getElementsByTagName("head")[0].appendChild(k)}).then(function(){t[e]=0}));var c=r[e];if(0!==c)if(c)n.push(c[2]);else{var u=new Promise(function(n,u){c=r[e]=[n,u]});n.push(c[2]=u);var a,h=document.getElementsByTagName("head")[0],f=document.createElement("script");f.charset="utf-8",f.timeout=120,o.nc&&f.setAttribute("nonce",o.nc),f.src=function(e){return o.p+"static/js/"+({"chunk-commons":"chunk-commons"}[e]||e)+"."+{"7zzA":"acd9b7e4",JEtC:"d582661d","chunk-11a3":"0550dd47","chunk-5ee7":"f07e3c68","chunk-93d2":"093c634c","chunk-b3a9":"4da6a2b6","chunk-commons":"5cca9b47","chunk-08bc":"75d5e9a2","chunk-1f33":"487348bb","chunk-2301":"716ff23b","00Qp":"805ee71d",x10K:"cf7e5bba","chunk-2407":"7d753408","chunk-28ba":"54dbf286","chunk-296d":"976ba779","chunk-2b93":"6ccfa9b8","chunk-2b9c":"7de75cb3","chunk-35eb":"bcd66a61","chunk-42c8":"d921bceb","chunk-1fa9":"5d1e7f27",SoCV:"49bd7f8a",VwWe:"37520311","chunk-4daa":"db907712","chunk-5ae3":"8aab3341","chunk-6e60":"7790d972","chunk-70ee":"e2041fce",Q2Zf:"159a6cad",ZMmy:"fbf2ec27","chunk-7121":"ff31279d","chunk-9e04":"65c83460","/P8B":"7f6807b2",Gbeq:"42306eb5","chunk-a437":"ae104760","chunk-bc2a":"250e391a","chunk-bc2b":"0134d652","chunk-d3e2":"e408c971"}[e]+".js"}(e),a=function(n){f.onerror=f.onload=null,clearTimeout(d);var c=r[e];if(0!==c){if(c){var u=n&&("load"===n.type?"missing":n.type),t=n&&n.target&&n.target.src,a=new Error("Loading chunk "+e+" failed.\n("+u+": "+t+")");a.type=u,a.request=t,c[1](a)}r[e]=void 0}};var d=setTimeout(function(){a({type:"timeout",target:f})},12e4);f.onerror=f.onload=a,h.appendChild(f)}return Promise.all(n)},o.m=e,o.c=u,o.d=function(e,n,c){o.o(e,n)||Object.defineProperty(e,n,{enumerable:!0,get:c})},o.r=function(e){"undefined"!=typeof Symbol&&Symbol.toStringTag&&Object.defineProperty(e,Symbol.toStringTag,{value:"Module"}),Object.defineProperty(e,"__esModule",{value:!0})},o.t=function(e,n){if(1&n&&(e=o(e)),8&n)return e;if(4&n&&"object"==typeof e&&e&&e.__esModule)return e;var c=Object.create(null);if(o.r(c),Object.defineProperty(c,"default",{enumerable:!0,value:e}),2&n&&"string"!=typeof e)for(var u in e)o.d(c,u,function(n){return e[n]}.bind(null,u));return c},o.n=function(e){var n=e&&e.__esModule?function(){return e.default}:function(){return e};return o.d(n,"a",n),n},o.o=function(e,n){return Object.prototype.hasOwnProperty.call(e,n)},o.p="/",o.oe=function(e){throw console.error(e),e};var h=window.webpackJsonp=window.webpackJsonp||[],f=h.push.bind(h);h.push=n,h=h.slice();for(var d=0;d<h.length;d++)n(h[d]);var k=f;c()}([]);</script><script src=/static/js/chunk-elementUI.9e82bb46.js></script><script src=/static/js/chunk-libs.726e3331.js></script><script src=/static/js/app.a0faa1e7.js></script></body></html>
\ No newline at end of file
This diff is collapsed.
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-9b558caa]{padding-right:100px}.cancel-btn[data-v-9b558caa]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.wscn-http404-container[data-v-5f60752c]{-webkit-transform:translate(-50%,-50%);transform:translate(-50%,-50%);position:absolute;top:40%;left:50%}.wscn-http404[data-v-5f60752c]{position:relative;width:1200px;padding:0 50px;overflow:hidden}.wscn-http404 .pic-404[data-v-5f60752c]{position:relative;float:left;width:600px;overflow:hidden}.wscn-http404 .pic-404__parent[data-v-5f60752c]{width:100%}.wscn-http404 .pic-404__child[data-v-5f60752c]{position:absolute}.wscn-http404 .pic-404__child.left[data-v-5f60752c]{width:80px;top:17px;left:220px;opacity:0;-webkit-animation-name:cloudLeft-data-v-5f60752c;animation-name:cloudLeft-data-v-5f60752c;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}.wscn-http404 .pic-404__child.mid[data-v-5f60752c]{width:46px;top:10px;left:420px;opacity:0;-webkit-animation-name:cloudMid-data-v-5f60752c;animation-name:cloudMid-data-v-5f60752c;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1.2s;animation-delay:1.2s}.wscn-http404 .pic-404__child.right[data-v-5f60752c]{width:62px;top:100px;left:500px;opacity:0;-webkit-animation-name:cloudRight-data-v-5f60752c;animation-name:cloudRight-data-v-5f60752c;-webkit-animation-duration:2s;animation-duration:2s;-webkit-animation-timing-function:linear;animation-timing-function:linear;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards;-webkit-animation-delay:1s;animation-delay:1s}@-webkit-keyframes cloudLeft-data-v-5f60752c{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@keyframes cloudLeft-data-v-5f60752c{0%{top:17px;left:220px;opacity:0}20%{top:33px;left:188px;opacity:1}80%{top:81px;left:92px;opacity:1}to{top:97px;left:60px;opacity:0}}@-webkit-keyframes cloudMid-data-v-5f60752c{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@keyframes cloudMid-data-v-5f60752c{0%{top:10px;left:420px;opacity:0}20%{top:40px;left:360px;opacity:1}70%{top:130px;left:180px;opacity:1}to{top:160px;left:120px;opacity:0}}@-webkit-keyframes cloudRight-data-v-5f60752c{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}@keyframes cloudRight-data-v-5f60752c{0%{top:100px;left:500px;opacity:0}20%{top:120px;left:460px;opacity:1}80%{top:180px;left:340px;opacity:1}to{top:200px;left:300px;opacity:0}}.wscn-http404 .bullshit[data-v-5f60752c]{position:relative;float:left;width:300px;padding:30px 0;overflow:hidden}.wscn-http404 .bullshit__oops[data-v-5f60752c]{font-size:32px;line-height:40px;color:#1482f0;margin-bottom:20px;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__headline[data-v-5f60752c],.wscn-http404 .bullshit__oops[data-v-5f60752c]{font-weight:700;opacity:0;-webkit-animation-name:slideUp-data-v-5f60752c;animation-name:slideUp-data-v-5f60752c;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__headline[data-v-5f60752c]{font-size:20px;line-height:24px;color:#222;margin-bottom:10px;-webkit-animation-delay:.1s;animation-delay:.1s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-5f60752c]{font-size:13px;line-height:21px;color:grey;margin-bottom:30px;-webkit-animation-delay:.2s;animation-delay:.2s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}.wscn-http404 .bullshit__info[data-v-5f60752c],.wscn-http404 .bullshit__return-home[data-v-5f60752c]{opacity:0;-webkit-animation-name:slideUp-data-v-5f60752c;animation-name:slideUp-data-v-5f60752c;-webkit-animation-duration:.5s;animation-duration:.5s}.wscn-http404 .bullshit__return-home[data-v-5f60752c]{display:block;float:left;width:110px;height:36px;background:#1482f0;border-radius:100px;text-align:center;color:#fff;font-size:14px;line-height:36px;cursor:pointer;-webkit-animation-delay:.3s;animation-delay:.3s;-webkit-animation-fill-mode:forwards;animation-fill-mode:forwards}@-webkit-keyframes slideUp-data-v-5f60752c{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}@keyframes slideUp-data-v-5f60752c{0%{-webkit-transform:translateY(60px);transform:translateY(60px);opacity:0}to{-webkit-transform:translateY(0);transform:translateY(0);opacity:1}}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-c865e982]{padding-right:100px}.cancel-btn[data-v-c865e982]{position:absolute;right:15px;top:10px}
\ No newline at end of file
This diff is collapsed.
.editor-slide-upload[data-v-39480e6e]{margin-bottom:20px}.editor-slide-upload[data-v-39480e6e] .el-upload--picture-card{width:100%}.tinymce-container[data-v-261f5e1f]{position:relative}.tinymce-container[data-v-261f5e1f] .mce-fullscreen{z-index:10000}.tinymce-textarea[data-v-261f5e1f]{visibility:hidden;z-index:-1}.editor-custom-btn-container[data-v-261f5e1f]{position:absolute;right:4px;top:4px}.fullscreen .editor-custom-btn-container[data-v-261f5e1f]{z-index:10000;position:fixed}.editor-upload-btn[data-v-261f5e1f]{display:inline-block}.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.createPost-container[data-v-846b83ca]{position:relative}.createPost-container .createPost-main-container[data-v-846b83ca]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-846b83ca]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-846b83ca]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-846b83ca]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-846b83ca]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-846b83ca]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-846b83ca]{display:inline-block}.createPost-container .word-counter[data-v-846b83ca]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
.createPost-container[data-v-935f1c50]{position:relative}.createPost-container .createPost-main-container[data-v-935f1c50]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-935f1c50]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-935f1c50]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-935f1c50]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-935f1c50]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-935f1c50]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-935f1c50]{display:inline-block}.createPost-container .word-counter[data-v-935f1c50]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-7af7e800]{padding-right:100px}.cancel-btn[data-v-7af7e800]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-4df02fb8]{padding-right:100px}.cancel-btn[data-v-4df02fb8]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.createPost-container[data-v-61de98ac]{position:relative}.createPost-container .createPost-main-container[data-v-61de98ac]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-61de98ac]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-61de98ac]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-61de98ac]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-61de98ac]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-61de98ac]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-61de98ac]{display:inline-block}.createPost-container .word-counter[data-v-61de98ac]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
.createPost-container[data-v-61de98ac]{position:relative}.createPost-container .createPost-main-container[data-v-61de98ac]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-61de98ac]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-61de98ac]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-61de98ac]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-61de98ac]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-61de98ac]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-61de98ac]{display:inline-block}.createPost-container .word-counter[data-v-61de98ac]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-05e1b33c]{padding-right:100px}.cancel-btn[data-v-05e1b33c]{position:absolute;right:15px;top:10px}
\ No newline at end of file
This diff is collapsed.
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-b7fc3d5a]{padding-right:100px}.cancel-btn[data-v-b7fc3d5a]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-41cbc122]{padding-right:100px}.cancel-btn[data-v-41cbc122]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.dashboard-editor-container[data-v-4e4e7308]{padding:32px;background-color:#f0f2f5}.dashboard-editor-container .chart-wrapper[data-v-4e4e7308]{background:#fff;padding:16px 16px 0;margin-bottom:32px}.pan-item[data-v-4178e1ea]{width:200px;height:200px;border-radius:50%;display:inline-block;position:relative;cursor:default;-webkit-box-shadow:0 1px 3px rgba(0,0,0,.2);box-shadow:0 1px 3px rgba(0,0,0,.2)}.pan-info-roles-container[data-v-4178e1ea]{padding:20px;text-align:center}.pan-thumb[data-v-4178e1ea]{width:100%;height:100%;background-size:100%;border-radius:50%;overflow:hidden;position:absolute;-webkit-transform-origin:95% 40%;transform-origin:95% 40%;-webkit-transition:all .3s ease-in-out;transition:all .3s ease-in-out}.pan-thumb[data-v-4178e1ea]:after{content:"";width:8px;height:8px;position:absolute;border-radius:50%;top:40%;left:95%;margin:-4px 0 0 -4px;background:radial-gradient(ellipse at center,#0e0e0e 0,#7d7e7d 100%);-webkit-box-shadow:0 0 1px hsla(0,0%,100%,.9);box-shadow:0 0 1px hsla(0,0%,100%,.9)}.pan-info[data-v-4178e1ea]{position:absolute;width:inherit;height:inherit;border-radius:50%;overflow:hidden;-webkit-box-shadow:inset 0 0 0 5px rgba(0,0,0,.05);box-shadow:inset 0 0 0 5px rgba(0,0,0,.05)}.pan-info h3[data-v-4178e1ea]{color:#fff;text-transform:uppercase;position:relative;letter-spacing:2px;font-size:18px;margin:0 60px;padding:22px 0 0;height:85px;font-family:Open Sans,Arial,sans-serif;text-shadow:0 0 1px #fff,0 1px 2px rgba(0,0,0,.3)}.pan-info p[data-v-4178e1ea]{color:#fff;padding:10px 5px;font-style:italic;margin:0 30px;font-size:12px;border-top:1px solid hsla(0,0%,100%,.5)}.pan-info p a[data-v-4178e1ea]{display:block;color:#333;width:80px;height:80px;background:hsla(0,0%,100%,.3);border-radius:50%;color:#fff;font-style:normal;font-weight:700;text-transform:uppercase;font-size:9px;letter-spacing:1px;padding-top:24px;margin:7px auto 0;font-family:Open Sans,Arial,sans-serif;opacity:0;-webkit-transition:opacity .3s ease-in-out .2s,background .2s linear 0s,-webkit-transform .3s ease-in-out .2s;transition:opacity .3s ease-in-out .2s,background .2s linear 0s,-webkit-transform .3s ease-in-out .2s;transition:transform .3s ease-in-out .2s,opacity .3s ease-in-out .2s,background .2s linear 0s;transition:transform .3s ease-in-out .2s,opacity .3s ease-in-out .2s,background .2s linear 0s,-webkit-transform .3s ease-in-out .2s;-webkit-transform:translateX(60px) rotate(90deg);transform:translateX(60px) rotate(90deg)}.pan-info p a[data-v-4178e1ea]:hover{background:hsla(0,0%,100%,.5)}.pan-item:hover .pan-thumb[data-v-4178e1ea]{-webkit-transform:rotate(-110deg);transform:rotate(-110deg)}.pan-item:hover .pan-info p a[data-v-4178e1ea]{opacity:1;-webkit-transform:translateX(0) rotate(0deg);transform:translateX(0) rotate(0deg)}.emptyGif[data-v-a99b3d02]{display:block;width:45%;margin:0 auto}.dashboard-editor-container[data-v-a99b3d02]{background-color:#e3e3e3;min-height:100vh;padding:50px 60px 0}.dashboard-editor-container .pan-info-roles[data-v-a99b3d02]{font-size:12px;font-weight:700;color:#333;display:block}.dashboard-editor-container .info-container[data-v-a99b3d02]{position:relative;margin-left:190px;height:150px;line-height:200px}.dashboard-editor-container .info-container .display_name[data-v-a99b3d02]{font-size:48px;line-height:48px;color:#212121;position:absolute;top:25px}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.createPost-container[data-v-5bc74864]{position:relative}.createPost-container .createPost-main-container[data-v-5bc74864]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-5bc74864]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-5bc74864]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-5bc74864]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-5bc74864]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-5bc74864]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-5bc74864]{display:inline-block}.createPost-container .word-counter[data-v-5bc74864]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.createPost-container[data-v-40a811a0]{position:relative}.createPost-container .createPost-main-container[data-v-40a811a0]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-40a811a0]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-40a811a0]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-40a811a0]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-40a811a0]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-40a811a0]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-40a811a0]{display:inline-block}.createPost-container .word-counter[data-v-40a811a0]{width:40px;position:absolute;right:-10px;top:0}.edit-input[data-v-40a811a0]{padding-right:100px}.cancel-btn[data-v-40a811a0]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.edit-input[data-v-152dff15]{padding-right:100px}.cancel-btn[data-v-152dff15]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.errPage-container[data-v-24c0cb68]{width:800px;max-width:100%;margin:100px auto}.errPage-container .pan-back-btn[data-v-24c0cb68]{background:#008489;color:#fff;border:none!important}.errPage-container .pan-gif[data-v-24c0cb68]{margin:0 auto;display:block}.errPage-container .pan-img[data-v-24c0cb68]{display:block;margin:0 auto;width:100%}.errPage-container .text-jumbo[data-v-24c0cb68]{font-size:60px;font-weight:700;color:#484848}.errPage-container .list-unstyled[data-v-24c0cb68]{font-size:14px}.errPage-container .list-unstyled li[data-v-24c0cb68]{padding-bottom:5px}.errPage-container .list-unstyled a[data-v-24c0cb68]{color:#008489;text-decoration:none}.errPage-container .list-unstyled a[data-v-24c0cb68]:hover{text-decoration:underline}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.createPost-container[data-v-2a769c6a]{position:relative}.createPost-container .createPost-main-container[data-v-2a769c6a]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-2a769c6a]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-2a769c6a]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-2a769c6a]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-2a769c6a]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-2a769c6a]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-2a769c6a]{display:inline-block}.createPost-container .word-counter[data-v-2a769c6a]{width:40px;position:absolute;right:-10px;top:0}.edit-select[data-v-2a769c6a]{padding-right:50px}.cancel-btn[data-v-2a769c6a]{position:absolute;right:15px;top:10px}
\ No newline at end of file
.waves-ripple{position:absolute;border-radius:100%;background-color:rgba(0,0,0,.15);background-clip:padding-box;pointer-events:none;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;-webkit-transform:scale(0);transform:scale(0);opacity:1}.waves-ripple.z-active{opacity:0;-webkit-transform:scale(2);transform:scale(2);-webkit-transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,-webkit-transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out;transition:opacity 1.2s ease-out,transform .6s ease-out,-webkit-transform .6s ease-out}.createPost-container[data-v-5bc74864]{position:relative}.createPost-container .createPost-main-container[data-v-5bc74864]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-5bc74864]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-5bc74864]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-5bc74864]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-5bc74864]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-5bc74864]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-5bc74864]{display:inline-block}.createPost-container .word-counter[data-v-5bc74864]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
@supports (-webkit-mask:none) and (not (cater-color:#fff)){.login-container .el-input input{color:#fff}.login-container .el-input input:first-line{color:#eee}}.login-container .el-input{display:inline-block;height:47px;width:85%}.login-container .el-input input{background:transparent;border:0;-webkit-appearance:none;border-radius:0;padding:12px 5px 12px 15px;color:#eee;height:47px;caret-color:#fff}.login-container .el-input input:-webkit-autofill{-webkit-box-shadow:0 0 0 1000px #283443 inset!important;-webkit-text-fill-color:#fff!important}.login-container .el-form-item{border:1px solid hsla(0,0%,100%,.1);background:rgba(0,0,0,.1);border-radius:5px;color:#454545}.login-container[data-v-323c0aa2]{position:fixed;height:100%;width:100%;background-color:#2d3a4b}.login-container .login-form[data-v-323c0aa2]{position:absolute;left:0;right:0;width:520px;max-width:100%;padding:35px 35px 15px;margin:120px auto}.login-container .tips[data-v-323c0aa2]{font-size:14px;color:#fff;margin-bottom:10px}.login-container .tips span[data-v-323c0aa2]:first-of-type{margin-right:16px}.login-container .svg-container[data-v-323c0aa2]{padding:6px 5px 6px 15px;color:#889aa4;vertical-align:middle;width:30px;display:inline-block}.login-container .title-container[data-v-323c0aa2]{position:relative}.login-container .title-container .title[data-v-323c0aa2]{font-size:26px;color:#eee;margin:0 auto 40px;text-align:center;font-weight:700}.login-container .title-container .set-language[data-v-323c0aa2]{color:#fff;position:absolute;top:5px;right:0}.login-container .show-pwd[data-v-323c0aa2]{position:absolute;right:10px;top:7px;font-size:16px;color:#889aa4;cursor:pointer;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}.login-container .thirdparty-button[data-v-323c0aa2]{position:absolute;right:35px;bottom:28px}
\ No newline at end of file
.createPost-container[data-v-6d16f681]{position:relative}.createPost-container .createPost-main-container[data-v-6d16f681]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-6d16f681]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-6d16f681]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-6d16f681]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-6d16f681]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-6d16f681]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-6d16f681]{display:inline-block}.createPost-container .word-counter[data-v-6d16f681]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
.createPost-container[data-v-6d16f681]{position:relative}.createPost-container .createPost-main-container[data-v-6d16f681]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-6d16f681]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-6d16f681]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-6d16f681]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-6d16f681]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-6d16f681]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-6d16f681]{display:inline-block}.createPost-container .word-counter[data-v-6d16f681]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
.material-input__component .material-input-bar[data-v-f03f6b9c]:after,.material-input__component .material-input-bar[data-v-f03f6b9c]:before{content:"";height:1px;width:0;bottom:0;position:absolute;-webkit-transition:all .2s ease;transition:all .2s ease}.material-input__component[data-v-f03f6b9c]{margin-top:36px;position:relative}.material-input__component [data-v-f03f6b9c]{-webkit-box-sizing:border-box;box-sizing:border-box}.material-input__component .iconClass .material-input__icon[data-v-f03f6b9c]{position:absolute;left:0;line-height:16px;color:#2196f3;top:12px;width:30px;height:16px;font-size:16px;font-weight:400;pointer-events:none}.material-input__component .iconClass .material-label[data-v-f03f6b9c]{left:30px}.material-input__component .iconClass .material-input[data-v-f03f6b9c]{text-indent:30px}.material-input__component .material-input[data-v-f03f6b9c]{font-size:16px;padding:12px 12px 2px 6px;display:block;width:100%;border:none;line-height:1;border-radius:0}.material-input__component .material-input[data-v-f03f6b9c]:focus{outline:none;border:none;border-bottom:1px solid transparent}.material-input__component .material-label[data-v-f03f6b9c]{font-weight:400;position:absolute;pointer-events:none;left:0;top:0;-webkit-transition:all .2s ease;transition:all .2s ease;font-size:18px}.material-input__component .material-input-bar[data-v-f03f6b9c]{position:relative;display:block;width:100%}.material-input__component .material-input-bar[data-v-f03f6b9c]:before{left:50%}.material-input__component .material-input-bar[data-v-f03f6b9c]:after{right:50%}.material-input__component.material--disabled .material-input[data-v-f03f6b9c]{border-bottom-style:dashed}.material-input__component.material--raised .material-label[data-v-f03f6b9c]{top:-28px;left:0;font-size:16px;font-weight:700}.material-input__component.material--active .material-input-bar[data-v-f03f6b9c]:after,.material-input__component.material--active .material-input-bar[data-v-f03f6b9c]:before{width:50%}.material-input__component[data-v-f03f6b9c]{background:#fff}.material-input__component .material-input[data-v-f03f6b9c]{background:none;color:#000;text-indent:0;border-bottom:1px solid #e0e0e0}.material-input__component .material-label[data-v-f03f6b9c]{color:#9e9e9e}.material-input__component .material-input-bar[data-v-f03f6b9c]:after,.material-input__component .material-input-bar[data-v-f03f6b9c]:before{background:#2196f3}.material-input__component.material--active .material-label[data-v-f03f6b9c]{color:#2196f3}.material-input__component.material--has-errors.material--active .material-label[data-v-f03f6b9c]{color:#f44336}.material-input__component.material--has-errors .material-input-bar[data-v-f03f6b9c]:after,.material-input__component.material--has-errors .material-input-bar[data-v-f03f6b9c]:before{background:transparent}.pagination-container[data-v-b7be0e7e]{background:#fff;padding:32px 16px}.pagination-container.hidden[data-v-b7be0e7e]{display:none}.upload-container[data-v-44d9c0f7]{width:100%;position:relative}.upload-container[data-v-44d9c0f7]:after{content:"";display:table;clear:both}.upload-container .image-uploader[data-v-44d9c0f7]{width:35%;float:left}.upload-container .image-preview[data-v-44d9c0f7]{width:200px;height:200px;position:relative;border:1px dashed #d9d9d9;float:left;margin-left:50px}.upload-container .image-preview .image-preview-wrapper[data-v-44d9c0f7]{position:relative;width:100%;height:100%}.upload-container .image-preview .image-preview-wrapper img[data-v-44d9c0f7]{width:100%;height:100%}.upload-container .image-preview .image-preview-action[data-v-44d9c0f7]{position:absolute;width:100%;height:100%;left:0;top:0;cursor:default;color:#fff;opacity:0;font-size:20px;background-color:rgba(0,0,0,.5);-webkit-transition:opacity .3s;transition:opacity .3s;cursor:pointer;text-align:center;line-height:200px}.upload-container .image-preview .image-preview-action .el-icon-delete[data-v-44d9c0f7]{font-size:36px}.upload-container .image-preview:hover .image-preview-action[data-v-44d9c0f7]{opacity:1}.upload-container .image-app-preview[data-v-44d9c0f7]{width:320px;height:180px;position:relative;border:1px dashed #d9d9d9;float:left;margin-left:50px}.upload-container .image-app-preview .app-fake-conver[data-v-44d9c0f7]{height:44px;position:absolute;width:100%;text-align:center;line-height:64px;color:#fff}
\ No newline at end of file
.createPost-container[data-v-935f1c50]{position:relative}.createPost-container .createPost-main-container[data-v-935f1c50]{padding:40px 45px 20px 50px}.createPost-container .createPost-main-container .postInfo-container[data-v-935f1c50]{position:relative;margin-bottom:10px}.createPost-container .createPost-main-container .postInfo-container[data-v-935f1c50]:after{content:"";display:table;clear:both}.createPost-container .createPost-main-container .postInfo-container .postInfo-container-item[data-v-935f1c50]{float:left}.createPost-container .createPost-main-container .editor-container[data-v-935f1c50]{min-height:500px;margin:0 0 30px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container[data-v-935f1c50]{text-align:right;margin-right:10px}.createPost-container .createPost-main-container .editor-container .editor-upload-btn-container .editor-upload-btn[data-v-935f1c50]{display:inline-block}.createPost-container .word-counter[data-v-935f1c50]{width:40px;position:absolute;right:-10px;top:0}
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
/*! normalize.css v7.0.0 | MIT License | github.com/necolas/normalize.css */html{line-height:1.15;-ms-text-size-adjust:100%;-webkit-text-size-adjust:100%}body{margin:0}article,aside,footer,header,nav,section{display:block}h1{font-size:2em;margin:.67em 0}figcaption,figure,main{display:block}figure{margin:1em 40px}hr{-webkit-box-sizing:content-box;box-sizing:content-box;height:0;overflow:visible}pre{font-family:monospace,monospace;font-size:1em}a{background-color:transparent;-webkit-text-decoration-skip:objects}abbr[title]{border-bottom:none;text-decoration:underline;-webkit-text-decoration:underline dotted;text-decoration:underline dotted}b,strong{font-weight:inherit;font-weight:bolder}code,kbd,samp{font-family:monospace,monospace;font-size:1em}dfn{font-style:italic}mark{background-color:#ff0;color:#000}small{font-size:80%}sub,sup{font-size:75%;line-height:0;position:relative;vertical-align:baseline}sub{bottom:-.25em}sup{top:-.5em}audio,video{display:inline-block}audio:not([controls]){display:none;height:0}img{border-style:none}svg:not(:root){overflow:hidden}button,input,optgroup,select,textarea{font-family:sans-serif;font-size:100%;line-height:1.15;margin:0}button,input{overflow:visible}button,select{text-transform:none}[type=reset],[type=submit],button,html [type=button]{-webkit-appearance:button}[type=button]::-moz-focus-inner,[type=reset]::-moz-focus-inner,[type=submit]::-moz-focus-inner,button::-moz-focus-inner{border-style:none;padding:0}[type=button]:-moz-focusring,[type=reset]:-moz-focusring,[type=submit]:-moz-focusring,button:-moz-focusring{outline:1px dotted ButtonText}fieldset{padding:.35em .75em .625em}legend{-webkit-box-sizing:border-box;box-sizing:border-box;color:inherit;display:table;max-width:100%;padding:0;white-space:normal}progress{display:inline-block;vertical-align:baseline}textarea{overflow:auto}[type=checkbox],[type=radio]{-webkit-box-sizing:border-box;box-sizing:border-box;padding:0}[type=number]::-webkit-inner-spin-button,[type=number]::-webkit-outer-spin-button{height:auto}[type=search]{-webkit-appearance:textfield;outline-offset:-2px}[type=search]::-webkit-search-cancel-button,[type=search]::-webkit-search-decoration{-webkit-appearance:none}::-webkit-file-upload-button{-webkit-appearance:button;font:inherit}details,menu{display:block}summary{display:list-item}canvas{display:inline-block}[hidden],template{display:none}#nprogress{pointer-events:none}#nprogress .bar{background:#29d;position:fixed;z-index:1031;top:0;left:0;width:100%;height:2px}#nprogress .peg{display:block;position:absolute;right:0;width:100px;height:100%;-webkit-box-shadow:0 0 10px #29d,0 0 5px #29d;box-shadow:0 0 10px #29d,0 0 5px #29d;opacity:1;-webkit-transform:rotate(3deg) translateY(-4px);transform:rotate(3deg) translateY(-4px)}#nprogress .spinner{display:block;position:fixed;z-index:1031;top:15px;right:15px}#nprogress .spinner-icon{width:18px;height:18px;-webkit-box-sizing:border-box;box-sizing:border-box;border-color:#29d transparent transparent #29d;border-style:solid;border-width:2px;border-radius:50%;-webkit-animation:nprogress-spinner .4s linear infinite;animation:nprogress-spinner .4s linear infinite}.nprogress-custom-parent{overflow:hidden;position:relative}.nprogress-custom-parent #nprogress .bar,.nprogress-custom-parent #nprogress .spinner{position:absolute}@-webkit-keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg)}to{-webkit-transform:rotate(1turn)}}@keyframes nprogress-spinner{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}to{-webkit-transform:rotate(1turn);transform:rotate(1turn)}}
\ No newline at end of file
This diff is collapsed.
(window.webpackJsonp=window.webpackJsonp||[]).push([["00Qp"],{"00Qp":function(e,t,n){"use strict";n.r(t);var i={name:"EditUser",components:{UserDetail:n("ipnt").a}},s=n("KHd+"),a=Object(s.a)(i,function(){var e=this.$createElement;return(this._self._c||e)("user-detail",{attrs:{"is-edit":!0}})},[],!1,null,null,null);a.options.__file="edit.vue";t.default=a.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["7zzA"],{"7zzA":function(e,r,n){"use strict";n.r(r);var t={beforeCreate:function(){var e=this.$route,r=e.params,n=e.query,t=r.path;this.$router.replace({path:"/"+t,query:n})},render:function(e){return e()}},o=n("KHd+"),u=Object(o.a)(t,void 0,void 0,!1,null,null,null);u.options.__file="index.vue";r.default=u.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["Gbeq"],{Gbeq:function(e,t,n){"use strict";n.r(t);var i={name:"EditGroup",components:{GroupDetail:n("oRVZ").a}},o=n("KHd+"),s=Object(o.a)(i,function(){var e=this.$createElement;return(this._self._c||e)("group-detail",{attrs:{"is-edit":!0}})},[],!1,null,null,null);s.options.__file="edit.vue";t.default=s.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["JEtC"],{JEtC:function(o,n,i){"use strict";i.r(n);var e={name:"AuthRedirect",created:function(){var o=window.location.search.slice(1);window.opener.location.href=window.location.origin+"/login#"+o,window.close()}},t=i("KHd+"),c=Object(t.a)(e,void 0,void 0,!1,null,null,null);c.options.__file="authredirect.vue";n.default=c.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["/P8B"],{"/P8B":function(e,t,n){"use strict";n.r(t);var o={name:"CreateGroup",components:{GroupDetail:n("oRVZ").a}},a=n("KHd+"),r=Object(a.a)(o,function(){var e=this.$createElement;return(this._self._c||e)("group-detail",{attrs:{"is-edit":!1}})},[],!1,null,null,null);r.options.__file="create.vue";t.default=r.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["Q2Zf"],{Q2Zf:function(t,e,i){"use strict";i.r(e);var n={name:"EditPick",components:{PickDetail:i("tThj").a}},s=i("KHd+"),a=Object(s.a)(n,function(){var t=this.$createElement;return(this._self._c||t)("pick-detail",{attrs:{"is-edit":!0}})},[],!1,null,null,null);a.options.__file="edit.vue";e.default=a.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["SoCV"],{SoCV:function(e,t,n){"use strict";n.r(t);var i={name:"CreateTopic",components:{TopicDetail:n("epjT").a}},o=n("KHd+"),a=Object(o.a)(i,function(){var e=this.$createElement;return(this._self._c||e)("topic-detail",{attrs:{"is-edit":!1}})},[],!1,null,null,null);a.options.__file="create.vue";t.default=a.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["VwWe"],{VwWe:function(e,t,i){"use strict";i.r(t);var n={name:"EditTopic",components:{TopicDetail:i("epjT").a}},o=i("KHd+"),s=Object(o.a)(n,function(){var e=this.$createElement;return(this._self._c||e)("topic-detail",{attrs:{"is-edit":!0}})},[],!1,null,null,null);s.options.__file="edit.vue";t.default=s.exports}}]);
\ No newline at end of file
(window.webpackJsonp=window.webpackJsonp||[]).push([["ZMmy"],{ZMmy:function(e,t,n){"use strict";n.r(t);var i={name:"CreatePick",components:{PickDetail:n("tThj").a}},a=n("KHd+"),c=Object(a.a)(i,function(){var e=this.$createElement;return(this._self._c||e)("pick-detail",{attrs:{"is-edit":!1}})},[],!1,null,null,null);c.options.__file="create.vue";t.default=c.exports}}]);
\ No newline at end of file
This source diff could not be displayed because it is too large. You can view the blob instead.
(window.webpackJsonp=window.webpackJsonp||[]).push([["chunk-08bc"],{UTJy:function(t,e,n){},Y5bG:function(t,e,n){"use strict";n.d(e,"a",function(){return a}),Math.easeInOutQuad=function(t,e,n,i){return(t/=i/2)<1?n/2*t*t+e:-n/2*(--t*(t-2)-1)+e};var i=window.requestAnimationFrame||window.webkitRequestAnimationFrame||window.mozRequestAnimationFrame||function(t){window.setTimeout(t,1e3/60)};function a(t,e,n){var a=document.documentElement.scrollTop||document.body.parentNode.scrollTop||document.body.scrollTop,l=t-a,s=0;e=void 0===e?500:e;!function t(){s+=20,function(t){document.documentElement.scrollTop=t,document.body.parentNode.scrollTop=t,document.body.scrollTop=t}(Math.easeInOutQuad(s,a,l,e)),s<e?i(t):n&&"function"==typeof n&&n()}()}},"Z+4/":function(t,e,n){"use strict";n.r(e);var i=n("giwc"),a=n("Mz3J"),l=n("ZySA"),s={name:"PushList",components:{Pagination:a.a},directives:{waves:l.a},data:function(){return{list:null,total:0,listLoading:!0,multipleSelection:[],del_list:[],listQuery:{page:0,limit:10,filter:{value:"",key:""}},SearchTypeOptions:[{key:"id",display_name:"推送ID"},{key:"title",display_name:"推送标题"},{key:"content",display_name:"推送内容"}]}},created:function(){this.getList()},methods:{getList:function(){var t=this;this.listLoading=!0,Object(i.c)(this.listQuery).then(function(e){t.list=e.data.data.data,t.total=e.data.data.total,t.listLoading=!1})},handleSelectionChange:function(t){this.multipleSelection=t},handleSizeChange:function(t){this.listQuery.limit=t,this.getList()},handleCurrentChange:function(t){this.listQuery.page=t,this.getList()},handleFilter:function(){this.listQuery.page=1,this.getList()},handleCreate:function(){this.$router.push("/push/create")}}},o=(n("hBk3"),n("KHd+")),r=Object(o.a)(s,function(){var t=this,e=t.$createElement,n=t._self._c||e;return n("div",{staticClass:"app-container"},[n("div",{staticClass:"filter-container"},[n("el-input",{staticClass:"filter-item",staticStyle:{width:"200px"},attrs:{placeholder:"搜素"},nativeOn:{keyup:function(e){return"button"in e||!t._k(e.keyCode,"enter",13,e.key,"Enter")?t.handleFilter(e):null}},model:{value:t.listQuery.filter.value,callback:function(e){t.$set(t.listQuery.filter,"value",e)},expression:"listQuery.filter.value"}}),t._v(" "),n("el-select",{staticClass:"filter-item",staticStyle:{width:"110px"},attrs:{placeholder:"搜索字段",clearable:""},model:{value:t.listQuery.filter.key,callback:function(e){t.$set(t.listQuery.filter,"key",e)},expression:"listQuery.filter.key"}},t._l(t.SearchTypeOptions,function(t){return n("el-option",{key:t.key,attrs:{label:t.display_name,value:t.key}})})),t._v(" "),n("el-button",{directives:[{name:"waves",rawName:"v-waves"}],staticClass:"filter-item",attrs:{type:"primary",icon:"el-icon-search"},on:{click:t.handleFilter}},[t._v("搜索")]),t._v(" "),n("el-button",{staticClass:"filter-item",staticStyle:{"margin-left":"10px"},attrs:{type:"primary",icon:"el-icon-edit"},on:{click:t.handleCreate}},[t._v("创建")])],1),t._v(" "),n("el-table",{directives:[{name:"loading",rawName:"v-loading",value:t.listLoading,expression:"listLoading"}],ref:"multipleTable",staticStyle:{width:"100%"},attrs:{data:t.list,border:"",fit:"","highlight-current-row":""},on:{"selection-change":t.handleSelectionChange}},[n("el-table-column",{attrs:{align:"center",label:"推送ID"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("router-link",{staticClass:"link-type",attrs:{to:"/push/edit/"+e.row.id}},[n("span",[t._v(t._s(e.row.id))])])]}}])}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"推送标题"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("span",[t._v(t._s(e.row.title))])]}}])}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"推送内容"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("span",[t._v(t._s(e.row.content))])]}}])}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"推送时间"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("span",[t._v(t._s(e.row.push_time))])]}}])}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"创建时间"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("span",[t._v(t._s(e.row.create_time))])]}}])}),t._v(" "),n("el-table-column",{attrs:{align:"center",label:"创建用户"},scopedSlots:t._u([{key:"default",fn:function(e){return[n("span",[t._v(t._s(e.row.user.name))])]}}])})],1),t._v(" "),n("pagination",{directives:[{name:"show",rawName:"v-show",value:t.total>0,expression:"total>0"}],staticStyle:{"margin-left":"250px"},attrs:{total:t.total,page:t.listQuery.page,limit:t.listQuery.limit},on:{"update:page":function(e){t.$set(t.listQuery,"page",e)},"update:limit":function(e){t.$set(t.listQuery,"limit",e)},pagination:t.getList}})],1)},[],!1,null,"9b558caa",null);r.options.__file="list.vue";e.default=r.exports},ZySA:function(t,e,n){"use strict";var i=n("P2sY"),a=n.n(i),l=(n("jUE0"),{bind:function(t,e){t.addEventListener("click",function(n){var i=a()({},e.value),l=a()({ele:t,type:"hit",color:"rgba(0, 0, 0, 0.15)"},i),s=l.ele;if(s){s.style.position="relative",s.style.overflow="hidden";var o=s.getBoundingClientRect(),r=s.querySelector(".waves-ripple");switch(r?r.className="waves-ripple":((r=document.createElement("span")).className="waves-ripple",r.style.height=r.style.width=Math.max(o.width,o.height)+"px",s.appendChild(r)),l.type){case"center":r.style.top=o.height/2-r.offsetHeight/2+"px",r.style.left=o.width/2-r.offsetWidth/2+"px";break;default:r.style.top=(n.pageY-o.top-r.offsetHeight/2-document.documentElement.scrollTop||document.body.scrollTop)+"px",r.style.left=(n.pageX-o.left-r.offsetWidth/2-document.documentElement.scrollLeft||document.body.scrollLeft)+"px"}return r.style.backgroundColor=l.color,r.className="waves-ripple z-active",!1}},!1)}}),s=function(t){t.directive("waves",l)};window.Vue&&(window.waves=l,Vue.use(s)),l.install=s;e.a=l},giwc:function(t,e,n){"use strict";n.d(e,"c",function(){return a}),n.d(e,"a",function(){return l}),n.d(e,"d",function(){return s}),n.d(e,"b",function(){return o});var i=n("t3Un");function a(t){return Object(i.a)({url:"/api/push/list",method:"get",params:t})}function l(t){return Object(i.a)({url:"/api/push/create",method:"post",data:t})}function s(t){return Object(i.a)({url:"/api/push/detail",method:"get",params:{id:t}})}function o(t){return Object(i.a)({url:"/api/push/effect_push",method:"get",params:{id:t}})}},hBk3:function(t,e,n){"use strict";var i=n("UTJy");n.n(i).a},jUE0:function(t,e,n){}}]);
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
This diff is collapsed.
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