Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
55ea1e7252 | ||
|
|
b80b869dd8 | ||
|
|
7fea9743c9 | ||
|
|
c09812f85d | ||
|
|
794a8a57ad | ||
|
|
cab60da886 |
@@ -40,6 +40,7 @@ Pear Admin Flask 基于 Flask 生态的后台管理系统,该项目旨在为 p
|
||||
+ [flask](https://dormousehole.readthedocs.io/en/latest/)
|
||||
+ [flask-login](https://flask-login.readthedocs.io/en/latest/)
|
||||
+ [flask-sqlalchemy](http://www.pythondoc.com/flask-sqlalchemy/quickstart.html)
|
||||
+ [flask-restful](https://flask-restful.readthedocs.io/en/latest/)
|
||||
|
||||
|
||||
## 预览
|
||||
@@ -51,7 +52,7 @@ Pear Admin Flask 有以下几个版本:
|
||||
|
||||
[Mini 分支版本 ](https://gitee.com/pear-admin/pear-admin-flask/tree/mini/)
|
||||
|
||||
>flask 2.x + flask-sqlalchemy + 基于角色的权限管理
|
||||
>flask 2.x + flask-sqlalchemy + Flask-restful + 基于角色的权限管理
|
||||
|
||||
| | |
|
||||
|---------------------|---------------------|
|
||||
@@ -79,6 +80,9 @@ Pear Admin Flask 有以下几个版本:
|
||||
```bash
|
||||
git clone https://gitee.com/pear-admin/pear-admin-flask
|
||||
|
||||
# 进入 pear-admin-flask 代码根目录
|
||||
cd pear-admin-flask
|
||||
|
||||
# 切换分支
|
||||
git checkout mini
|
||||
```
|
||||
|
||||
@@ -1,15 +1,16 @@
|
||||
import typing as t
|
||||
|
||||
from flask import jsonify
|
||||
from flask.views import MethodView
|
||||
from flask_pydantic import validate
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from common.utils.http import success_api, fail_api, table_api
|
||||
from common.utils.http import success_api, fail_api
|
||||
from extensions import db
|
||||
from models import DepartmentModel, UserModel
|
||||
|
||||
|
||||
class DeptSchema(BaseModel):
|
||||
class DeptModel(BaseModel):
|
||||
address: t.Optional[str]
|
||||
dept_name: t.Optional[str] = Field(alias='deptName')
|
||||
email: t.Optional[str]
|
||||
@@ -38,9 +39,10 @@ class DepartmentsApi(MethodView):
|
||||
return dict(success=True, message='ok', dept=dept_data)
|
||||
|
||||
dept_data = DepartmentModel.query.order_by(DepartmentModel.sort).all()
|
||||
return table_api(
|
||||
result={
|
||||
'items': [
|
||||
# TODO dtree 需要返回状态信息
|
||||
res = {
|
||||
"status": {"code": 200, "message": "默认"},
|
||||
"data": [
|
||||
{
|
||||
'deptId': item.id,
|
||||
'parentId': item.parent_id,
|
||||
@@ -54,12 +56,12 @@ class DepartmentsApi(MethodView):
|
||||
'address': item.address,
|
||||
'create_at': item.create_at.strftime('%Y-%m-%d %H:%M:%S')
|
||||
} for item in dept_data
|
||||
],
|
||||
'total': len(dept_data)}
|
||||
, code=0)
|
||||
]
|
||||
}
|
||||
return jsonify(res)
|
||||
|
||||
@validate()
|
||||
def post(self, body: DeptSchema):
|
||||
def post(self, body: DeptModel):
|
||||
dept = DepartmentModel(
|
||||
parent_id=body.parent_id,
|
||||
dept_name=body.dept_name,
|
||||
@@ -76,7 +78,7 @@ class DepartmentsApi(MethodView):
|
||||
return success_api(message="成功")
|
||||
|
||||
@validate()
|
||||
def put(self, _id, body: DeptSchema):
|
||||
def put(self, _id, body: DeptModel):
|
||||
data = {
|
||||
"dept_name": body.dept_name,
|
||||
"sort": body.sort,
|
||||
@@ -88,9 +90,9 @@ class DepartmentsApi(MethodView):
|
||||
}
|
||||
body = DepartmentModel.query.filter_by(id=_id).update(data)
|
||||
if not body:
|
||||
return {'success': False, 'message': "更新失败", 'code': 404}
|
||||
return fail_api(message="更新失败")
|
||||
db.session.commit()
|
||||
return {'success': True, 'message': '更新成功', 'code': 200}
|
||||
return success_api(message="更新成功")
|
||||
|
||||
def delete(self, _id):
|
||||
ret = DepartmentModel.query.filter_by(id=_id).delete()
|
||||
|
||||
@@ -147,7 +147,7 @@ def make_menu_tree():
|
||||
return sorted(menu_dict.get(0), key=lambda item: item['sort'])
|
||||
|
||||
|
||||
class PowerSchema(BaseModel):
|
||||
class PowerModel(BaseModel):
|
||||
icon: str
|
||||
open_type: Optional[str] = Field(alias='openType')
|
||||
parent_id: Optional[str] = Field(alias='parentId')
|
||||
@@ -199,7 +199,7 @@ class RightsApi(MethodView):
|
||||
|
||||
class PowerApi(MethodView):
|
||||
@validate()
|
||||
def post(self, body: PowerSchema):
|
||||
def post(self, body: PowerModel):
|
||||
power = RightModel(
|
||||
icon=body.icon,
|
||||
open_type=body.open_type,
|
||||
@@ -239,7 +239,7 @@ class PowerApi(MethodView):
|
||||
return fail_api(message="删除失败")
|
||||
|
||||
@validate()
|
||||
def put(self, _id, body: PowerSchema):
|
||||
def put(self, _id, body: PowerModel):
|
||||
data = {
|
||||
"icon": body.icon,
|
||||
"open_type": body.open_type,
|
||||
|
||||
@@ -1,3 +1,5 @@
|
||||
from flask import Blueprint
|
||||
|
||||
from common import register_api
|
||||
from .file import FilePhotoAPI
|
||||
from .passport import LoginAPI
|
||||
@@ -5,4 +7,4 @@ from .passport import LoginAPI
|
||||
|
||||
def register_sys_api(api_bp):
|
||||
register_api(LoginAPI, 'login_api', '/passport/login', pk='_id', app=api_bp)
|
||||
register_api(FilePhotoAPI, 'photo_api', '/file/photo', pk='photo_id', app=api_bp)
|
||||
register_api(FilePhotoAPI, 'photo_api', '/file/photo/', pk='photo_id', app=api_bp)
|
||||
|
||||
@@ -11,7 +11,7 @@ from common.utils.rights import record_logging
|
||||
from models import UserModel
|
||||
|
||||
|
||||
class LoginSchema(BaseModel):
|
||||
class LoginModel(BaseModel):
|
||||
username: str
|
||||
password: str
|
||||
captcha: str
|
||||
@@ -25,7 +25,7 @@ class LoginAPI(MethodView):
|
||||
return make_response(render_template('index/login.html'))
|
||||
|
||||
@validate()
|
||||
def post(self, body: LoginSchema):
|
||||
def post(self, body: LoginModel):
|
||||
s_code = session.get("code", None)
|
||||
session["code"] = None
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@ def users_delete():
|
||||
return success_api(message="批量删除成功")
|
||||
|
||||
|
||||
class QuerySchema(BaseModel):
|
||||
class QueryModel(BaseModel):
|
||||
page: int = 1
|
||||
limit: int = 10
|
||||
real_name: t.Optional[str] = Field(alias='realName')
|
||||
@@ -78,7 +78,7 @@ class QuerySchema(BaseModel):
|
||||
status: t.Optional[int]
|
||||
|
||||
|
||||
class PersonSchema(BaseModel):
|
||||
class PersonModel(BaseModel):
|
||||
role_ids: str = Field(alias='roleIds')
|
||||
username: str
|
||||
real_name: str = Field(alias='realName')
|
||||
@@ -89,7 +89,7 @@ class UserApi(MethodView):
|
||||
"""修改用户数据"""
|
||||
|
||||
@validate()
|
||||
def get(self, _id, query: QuerySchema):
|
||||
def get(self, _id, query: QueryModel):
|
||||
|
||||
filters = []
|
||||
|
||||
@@ -123,7 +123,7 @@ class UserApi(MethodView):
|
||||
)
|
||||
|
||||
@validate()
|
||||
def post(self, body: PersonSchema):
|
||||
def post(self, body: PersonModel):
|
||||
"""新建单个用户"""
|
||||
|
||||
role_ids = body.role_ids.split(',')
|
||||
|
||||
@@ -3,12 +3,11 @@ from flask import Flask
|
||||
from .index import index_bp
|
||||
from .logs_view import logs_bp
|
||||
from .roles import role_bp
|
||||
from .system_view import system_bp
|
||||
from .document_view import document_bp
|
||||
|
||||
from . import department
|
||||
from . import file
|
||||
from . import rights
|
||||
from . import passport
|
||||
from . import users
|
||||
|
||||
|
||||
@@ -16,5 +15,3 @@ def init_view(app: Flask):
|
||||
app.register_blueprint(index_bp)
|
||||
app.register_blueprint(logs_bp)
|
||||
app.register_blueprint(role_bp)
|
||||
app.register_blueprint(system_bp)
|
||||
app.register_blueprint(document_bp)
|
||||
|
||||
@@ -5,11 +5,18 @@ from common.utils.rights import permission_required, view_logging_required
|
||||
from applications.view import index_bp
|
||||
|
||||
|
||||
@index_bp.get('/dept')
|
||||
@view_logging_required
|
||||
@permission_required("admin:dept:main")
|
||||
def dept_index():
|
||||
return render_template('admin/department/dept.html')
|
||||
|
||||
|
||||
@index_bp.get('/dept/add')
|
||||
@view_logging_required
|
||||
@permission_required("admin:dept:add")
|
||||
def add():
|
||||
return render_template('view/system/department_add.html')
|
||||
return render_template('admin/department/dept_add.html')
|
||||
|
||||
|
||||
@index_bp.get('/dept/edit')
|
||||
@@ -18,4 +25,4 @@ def add():
|
||||
def edit():
|
||||
dept_id = request.args.get("deptId", type=int)
|
||||
dept = DepartmentModel.query.get(dept_id)
|
||||
return render_template('view/system/department_edit.html', dept=dept)
|
||||
return render_template('admin/department/dept_edit.html', dept=dept)
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
from flask import Blueprint, render_template
|
||||
|
||||
document_bp = Blueprint('document', __name__)
|
||||
|
||||
|
||||
@document_bp.route('/component/code/index.html')
|
||||
def component_code():
|
||||
return render_template('component/code/index.html')
|
||||
|
||||
|
||||
@document_bp.route('/view/<document>/<file>')
|
||||
def document_view(document, file):
|
||||
return render_template(f'view/{document}/{file}')
|
||||
|
||||
|
||||
@document_bp.get('/login.html')
|
||||
def login_html():
|
||||
return render_template('login.html')
|
||||
@@ -8,11 +8,11 @@ from common.utils.rights import view_logging_required, permission_required
|
||||
@view_logging_required
|
||||
@permission_required("admin:file:main")
|
||||
def file_index():
|
||||
return render_template('view/system/photo.html')
|
||||
return render_template('admin/file/photo.html')
|
||||
|
||||
|
||||
@index_bp.get('/file/photo/add')
|
||||
@view_logging_required
|
||||
@permission_required("admin:file:main")
|
||||
def file_photo_add():
|
||||
return render_template('view/system/photo_add.html')
|
||||
return render_template('admin/file/photo_add.html')
|
||||
|
||||
@@ -1,78 +1,24 @@
|
||||
from flask import Blueprint, redirect, url_for
|
||||
from flask import send_file
|
||||
from flask import session, render_template
|
||||
from flask_login import current_user, logout_user, login_required
|
||||
|
||||
from common.gen_captcha import get_captcha_image
|
||||
from flask import Blueprint
|
||||
from flask import render_template
|
||||
from flask_login import login_required, current_user
|
||||
|
||||
index_bp = Blueprint('index', __name__)
|
||||
|
||||
|
||||
@index_bp.route('/')
|
||||
@index_bp.route('/admin')
|
||||
@login_required
|
||||
def index():
|
||||
return render_template('index.html')
|
||||
return render_template('index/index.html')
|
||||
|
||||
|
||||
@index_bp.route('/config/pear.config.json')
|
||||
def pear_config():
|
||||
return send_file('static/config/pear.config.json')
|
||||
|
||||
|
||||
@index_bp.route('/admin/data/menu.json')
|
||||
def menu():
|
||||
return send_file('static/admin/data/menu.json')
|
||||
|
||||
|
||||
@index_bp.route('/admin/data/message.json')
|
||||
def message():
|
||||
return send_file('static/admin/data/message.json')
|
||||
|
||||
|
||||
@index_bp.route('/view/console/console1.html')
|
||||
def console1():
|
||||
# 控制后台
|
||||
return render_template('view/console/console1.html')
|
||||
|
||||
|
||||
@index_bp.route('/view/console/console2.html')
|
||||
def console2():
|
||||
# 数据分析
|
||||
return render_template('view/console/console2.html')
|
||||
|
||||
|
||||
@index_bp.route('/view/system/theme.html')
|
||||
def theme():
|
||||
# 酸爽翻倍
|
||||
return render_template('view/system/theme.html')
|
||||
|
||||
|
||||
@index_bp.route('/view/document/core.html')
|
||||
def core():
|
||||
# 酸爽翻倍
|
||||
return render_template('view/document/core.html')
|
||||
|
||||
|
||||
@index_bp.get('/passport/getCaptcha')
|
||||
def get_captcha():
|
||||
resp, code = get_captcha_image()
|
||||
session["code"] = code
|
||||
return resp
|
||||
|
||||
|
||||
# 退出登录
|
||||
@index_bp.post('/logout')
|
||||
# 首页
|
||||
@index_bp.get('/admin/')
|
||||
@login_required
|
||||
def logout():
|
||||
logout_user()
|
||||
session.pop('permissions')
|
||||
print({"message": "注销成功", "success": True})
|
||||
return {"message": "注销成功", "success": True}
|
||||
def admin_index():
|
||||
return render_template('index/admin_index.html', user=current_user)
|
||||
|
||||
|
||||
@index_bp.get('/login')
|
||||
def login():
|
||||
if current_user.is_authenticated:
|
||||
return redirect(url_for('admin.index'))
|
||||
return render_template('login.html')
|
||||
# 控制台页面
|
||||
@index_bp.get('/admin/welcome')
|
||||
@login_required
|
||||
def welcome():
|
||||
return render_template('index/welcome.html')
|
||||
|
||||
@@ -8,6 +8,12 @@ from models import LogModel
|
||||
logs_bp = Blueprint('logs', __name__, url_prefix='/logs')
|
||||
|
||||
|
||||
@logs_bp.get('/')
|
||||
@permission_required("admin:log:main")
|
||||
def index():
|
||||
return render_template('admin/logs_temp/main.html')
|
||||
|
||||
|
||||
@logs_bp.get('/login_log')
|
||||
@permission_required("admin:log:main")
|
||||
def login_log():
|
||||
|
||||
@@ -0,0 +1,32 @@
|
||||
from flask import session, redirect, render_template, url_for
|
||||
from flask_login import login_required, logout_user, current_user
|
||||
|
||||
from common.gen_captcha import get_captcha_image
|
||||
from common.utils.http import success_api
|
||||
|
||||
# 获取验证码
|
||||
from applications.view import index_bp
|
||||
|
||||
|
||||
@index_bp.get('/passport/getCaptcha')
|
||||
def get_captcha():
|
||||
resp, code = get_captcha_image()
|
||||
session["code"] = code
|
||||
return resp
|
||||
|
||||
|
||||
# 退出登录
|
||||
@index_bp.post('/passport/logout')
|
||||
@login_required
|
||||
def logout():
|
||||
logout_user()
|
||||
session.pop('permissions')
|
||||
return success_api(message="注销成功")
|
||||
|
||||
|
||||
@index_bp.get('/passport/login')
|
||||
def login():
|
||||
if current_user.is_authenticated:
|
||||
return redirect(url_for('admin.index'))
|
||||
# TODO 分离视图操作 最终实现接口登录与视图登录两套逻辑
|
||||
return render_template('index/login.html')
|
||||
@@ -5,6 +5,13 @@ from models import RightModel
|
||||
from applications.view import index_bp
|
||||
|
||||
|
||||
@index_bp.get('/rights/')
|
||||
@view_logging_required
|
||||
@permission_required("admin:power:main")
|
||||
def rights_index():
|
||||
return render_template('admin/rights/rights.html')
|
||||
|
||||
|
||||
@index_bp.get('/rights/power/<int:power_id>')
|
||||
@view_logging_required
|
||||
@permission_required("admin:power:edit")
|
||||
@@ -15,11 +22,11 @@ def rights_edit(power_id):
|
||||
icon = icon[1]
|
||||
else:
|
||||
icon = None
|
||||
return render_template('view/system/power_edit.html', power=power, icon=icon)
|
||||
return render_template('admin/rights/rights_edit.html', power=power, icon=icon)
|
||||
|
||||
|
||||
@index_bp.get('/rights/add')
|
||||
@view_logging_required
|
||||
@permission_required("admin:power:main")
|
||||
def rights_add():
|
||||
return render_template('view/system/power_add.html')
|
||||
return render_template('admin/rights/rights_add.html')
|
||||
|
||||
@@ -7,12 +7,20 @@ from models import RoleModel
|
||||
role_bp = Blueprint('role', __name__, url_prefix='/admin/role')
|
||||
|
||||
|
||||
# 角色而管理
|
||||
@role_bp.get('/')
|
||||
@view_logging_required
|
||||
@permission_required("admin:role:main")
|
||||
def main():
|
||||
return render_template('admin/roles/roles.html')
|
||||
|
||||
|
||||
# 角色授权操作
|
||||
@role_bp.get('/power/<int:role_id>')
|
||||
@view_logging_required
|
||||
@permission_required("admin:role:power")
|
||||
def power(role_id):
|
||||
return render_template('view/system/roles_power.html', role_id=role_id)
|
||||
return render_template('admin/roles/roles_power.html', role_id=role_id)
|
||||
|
||||
|
||||
# 角色编辑
|
||||
@@ -21,11 +29,11 @@ def power(role_id):
|
||||
@permission_required("admin:role:edit")
|
||||
def role_editor(role_id):
|
||||
role = RoleModel.query.filter_by(id=role_id).first()
|
||||
return render_template('view/system/roles_edit.html', role=role)
|
||||
return render_template('admin/roles/roles_edit.html', role=role)
|
||||
|
||||
|
||||
@role_bp.get('/add')
|
||||
@view_logging_required
|
||||
@permission_required("admin:role:edit")
|
||||
def role_add():
|
||||
return render_template('view/system/roles_add.html')
|
||||
return render_template('admin/roles/roles_add.html')
|
||||
|
||||
@@ -1,48 +0,0 @@
|
||||
from flask import Blueprint, render_template
|
||||
|
||||
system_bp = Blueprint('system', __name__)
|
||||
|
||||
|
||||
@system_bp.route('/view/system/user.html')
|
||||
def system_user():
|
||||
return render_template('view/system/user.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/role.html')
|
||||
def system_role():
|
||||
return render_template('view/system/role.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/power.html')
|
||||
def system_power():
|
||||
return render_template('view/system/power.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/department.html')
|
||||
def system_department():
|
||||
return render_template('view/system/department.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/log.html')
|
||||
def system_log():
|
||||
return render_template('view/system/log.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/dict.html')
|
||||
def system_dict():
|
||||
return render_template('view/system/dict.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/operate/add.html')
|
||||
def system_operate_add():
|
||||
return render_template('view/system/operate/add.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/operate/edit.html')
|
||||
def system_operate_edit():
|
||||
return render_template('view/system/operate/edit.html')
|
||||
|
||||
|
||||
@system_bp.route('/view/system/operate/profile.html')
|
||||
def system_operate_profile():
|
||||
return render_template('view/system/operate/profile.html')
|
||||
@@ -1,16 +1,26 @@
|
||||
from flask import render_template
|
||||
from flask_login import login_required, current_user
|
||||
from sqlalchemy import desc
|
||||
|
||||
from common.utils.rights import permission_required, view_logging_required
|
||||
from models import RoleModel, UserModel
|
||||
from models import LogModel, RoleModel, UserModel
|
||||
from . import index_bp
|
||||
|
||||
|
||||
# 用户增加
|
||||
@index_bp.get('/users/')
|
||||
@view_logging_required
|
||||
@permission_required("admin:user:main")
|
||||
def users_main():
|
||||
return render_template('admin/users/users.html')
|
||||
|
||||
|
||||
@index_bp.get('/users/add')
|
||||
@view_logging_required
|
||||
@permission_required("admin:user:add")
|
||||
def users_add_view():
|
||||
roles = RoleModel.query.all()
|
||||
return render_template('view/system/user_add.html', roles=roles)
|
||||
return render_template('admin/users/users_add.html', roles=roles)
|
||||
|
||||
|
||||
@index_bp.get('/users/<user_id>')
|
||||
@@ -23,4 +33,17 @@ def users_user_id_view(user_id):
|
||||
checked_roles = []
|
||||
for r in user.role:
|
||||
checked_roles.append(r.id)
|
||||
return render_template('view/system/user_edit.html', user=user, roles=roles, checked_roles=checked_roles)
|
||||
return render_template('admin/users/users_edit.html', user=user, roles=roles, checked_roles=checked_roles)
|
||||
|
||||
|
||||
@index_bp.get('/users/center')
|
||||
@login_required
|
||||
def users_center():
|
||||
user_logs = LogModel.query.filter_by(url='/passport/login').filter_by(uid=current_user.id).order_by(
|
||||
desc(LogModel.create_at)).limit(10)
|
||||
return render_template('admin/users/profile.html', user_info=current_user, user_logs=user_logs)
|
||||
|
||||
|
||||
@index_bp.get('/users/avatar')
|
||||
def users_avatar_view():
|
||||
return render_template('admin/users/profile_avatar.html')
|
||||
|
||||
@@ -24,7 +24,7 @@ SYSTEM_PANEL_LINKS = [
|
||||
SECRET_KEY = os.getenv('SECRET_KEY', 'dev key')
|
||||
|
||||
# mysql 配置
|
||||
MYSQL_USERNAME = "windows"
|
||||
MYSQL_USERNAME = "root"
|
||||
MYSQL_PASSWORD = "123456"
|
||||
MYSQL_HOST = "127.0.0.1"
|
||||
MYSQL_PORT = 3306
|
||||
@@ -39,7 +39,8 @@ SQLALCHEMY_DATABASE_URI = r'sqlite:///pear_admin.db'
|
||||
SQLALCHEMY_TRACK_MODIFICATIONS = True
|
||||
SQLALCHEMY_ECHO = False
|
||||
SQLALCHEMY_POOL_RECYCLE = 8
|
||||
# SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@{MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
|
||||
# SQLALCHEMY_DATABASE_URI = f"mysql+pymysql://{MYSQL_USERNAME}:{MYSQL_PASSWORD}@\
|
||||
# {MYSQL_HOST}:{MYSQL_PORT}/{MYSQL_DATABASE}"
|
||||
|
||||
LOG_LEVEL = logging.ERROR
|
||||
|
||||
|
||||
@@ -32,22 +32,6 @@ class RightModel(db.Model):
|
||||
|
||||
parent = db.relationship("RightModel", remote_side=[id]) # 自关联
|
||||
|
||||
"""
|
||||
id = db.Column(db.Integer, primary_key=True, comment='权限编号')
|
||||
powerName = db.Column(db.String(255), comment='权限名称')
|
||||
powerType = db.Column(db.SMALLINT, comment='权限类型')
|
||||
powerCode = db.Column(db.String(30), comment='权限标识')
|
||||
powerUrl = db.Column(db.String(255), comment='权限路径')
|
||||
openType = db.Column(db.String(10), comment='打开方式')
|
||||
parentId = db.Column(db.Integer, db.ForeignKey("rt_power.id"), comment='父类编号')
|
||||
icon = db.Column(db.String(128), comment='图标')
|
||||
sort = db.Column(db.Integer, comment='排序')
|
||||
enable = db.Column(db.Boolean, comment='是否开启')
|
||||
checkArr = db.Column(db.String(128), comment='')
|
||||
|
||||
parent = db.relationship("RightModel", remote_side=[id]) # 自关联
|
||||
"""
|
||||
|
||||
|
||||
class RoleModel(db.Model):
|
||||
__tablename__ = 'rt_role'
|
||||
|
||||
@@ -12,67 +12,14 @@ body,
|
||||
transition: all .3s;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side {
|
||||
top: 60px!important;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side .layui-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-logo {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side .layui-side-scroll {
|
||||
height: 100%!important;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-side .layui-side-scroll {
|
||||
height: 100%!important;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header.dark-theme .layui-layout-control .layui-this *{
|
||||
background-color: rgba(0,0,0,.1)!important;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header {
|
||||
z-index: 99999;
|
||||
width: 100%;
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-layout-left {
|
||||
left: 230px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-logo .title {
|
||||
top: 2px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header .layui-layout-control {
|
||||
display: inline-block;
|
||||
left: 370px;
|
||||
}
|
||||
|
||||
.pear-admin.banner-layout .layui-header.dark-theme {
|
||||
box-shadow: 2px 0 6px rgb(0 21 41 / 35%);
|
||||
}
|
||||
|
||||
.pear-admin .layui-header .layui-logo {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-admin .layui-logo .title {
|
||||
font-size: 20px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-layout-right .layui-nav-child {
|
||||
border: 1px solid whitesmoke;
|
||||
border-radius: 4px;
|
||||
width: auto;
|
||||
left: auto;
|
||||
right: -23px;
|
||||
border-radius: 6px;
|
||||
width: 150px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header {
|
||||
@@ -82,6 +29,11 @@ body,
|
||||
border-bottom: 1px solid whitesmoke;
|
||||
}
|
||||
|
||||
.pear-admin .layui-header .layui-nav-img {
|
||||
width: 30px;
|
||||
height: 30px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-layout-control {
|
||||
left: 140px;
|
||||
position: absolute;
|
||||
@@ -93,11 +45,10 @@ body,
|
||||
|
||||
.pear-admin .layui-logo {
|
||||
width: 230px;
|
||||
height: 59px;
|
||||
line-height: 59px;
|
||||
height: 60px;
|
||||
line-height: 60px;
|
||||
position: relative;
|
||||
background-color: #28333E;
|
||||
border-bottom: 1px solid rgba(0, 0, 0, .12);
|
||||
}
|
||||
|
||||
.pear-admin .layui-logo img {
|
||||
@@ -152,29 +103,12 @@ body,
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-admin .layui-footer {
|
||||
position: absolute;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
left: 230px;
|
||||
background: #fff;
|
||||
border-top: 1px solid #F2F2F2;
|
||||
box-shadow: none;
|
||||
-webkit-transition: left .3s;
|
||||
transition: left .3s;
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.pear-admin .layui-footer.close {
|
||||
/** 隐 藏 布 局 样 式 */
|
||||
.pear-mini .layui-logo .title {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/** 收缩布局 */
|
||||
.pear-mini .layui-side .layui-logo .title {
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-mini .layui-side .layui-logo .logo {
|
||||
.pear-mini .layui-logo .logo {
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
@@ -191,14 +125,10 @@ body,
|
||||
left: 60px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-side .layui-logo {
|
||||
.pear-mini .layui-logo {
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-footer {
|
||||
left: 60px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-nav-tree .layui-nav-item span {
|
||||
display: none;
|
||||
}
|
||||
@@ -225,7 +155,7 @@ body,
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-collapsed-pe {
|
||||
.pear-collasped-pe {
|
||||
display: none;
|
||||
width: 50px;
|
||||
position: absolute;
|
||||
@@ -240,7 +170,7 @@ body,
|
||||
box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
|
||||
}
|
||||
|
||||
.pear-collapsed-pe a {
|
||||
.pear-collasped-pe a {
|
||||
color: white !important;
|
||||
}
|
||||
|
||||
@@ -258,11 +188,11 @@ body,
|
||||
|
||||
/** 新增兼容 */
|
||||
@media screen and (max-width:768px) {
|
||||
.collapse {
|
||||
.collaspe {
|
||||
display: none !important;
|
||||
}
|
||||
|
||||
.pear-collapsed-pe {
|
||||
.pear-collasped-pe {
|
||||
display: inline-block !important;
|
||||
}
|
||||
|
||||
@@ -283,6 +213,7 @@ body,
|
||||
height: calc(100% - 62px);
|
||||
}
|
||||
|
||||
/** 隐 藏 布 局 样 式 */
|
||||
.pear-mini .layui-side {
|
||||
width: 0px;
|
||||
}
|
||||
@@ -296,10 +227,6 @@ body,
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-footer {
|
||||
left: 0px;
|
||||
}
|
||||
|
||||
.pear-mini .layui-logo {
|
||||
width: 0px;
|
||||
}
|
||||
@@ -365,50 +292,22 @@ body,
|
||||
|
||||
}
|
||||
|
||||
/** 侧边主题 (亮) */
|
||||
/** 亮色侧边风格 */
|
||||
.light-theme .layui-logo {
|
||||
background-color: white !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.light-theme .layui-side-scroll {
|
||||
background-color: white !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.light-theme .layui-side {
|
||||
box-shadow: 2px 0 8px 0 rgba(29, 35, 41, .05) !important;
|
||||
}
|
||||
|
||||
.light-theme.layui-side .layui-logo {
|
||||
background-color: white !important;
|
||||
color: black !important;
|
||||
border-bottom: 1px whitesmoke solid;
|
||||
}
|
||||
|
||||
.light-theme.layui-side .layui-side-scroll {
|
||||
background-color: white !important;
|
||||
color: black !important;
|
||||
}
|
||||
|
||||
.dark-theme.layui-header {
|
||||
border-bottom: none;
|
||||
background-color: #28333E;
|
||||
color: whitesmoke;
|
||||
}
|
||||
|
||||
.dark-theme.layui-header li>a{
|
||||
color: whitesmoke!important;
|
||||
}
|
||||
|
||||
.dark-theme.layui-header .layui-logo {
|
||||
box-shadow: none;
|
||||
border: none;
|
||||
}
|
||||
|
||||
/** 顶部主题 (白) */
|
||||
.light-theme.layui-header .layui-logo {
|
||||
background-color: white;
|
||||
border: none;
|
||||
box-shadow: none;
|
||||
}
|
||||
|
||||
/** 主题面板 */
|
||||
.pearone-color .set-text {
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
}
|
||||
|
||||
/** 主 题 选 择 界 面 样 式 */
|
||||
.pearone-color .color-title {
|
||||
padding: 15px 0 0px 20px;
|
||||
margin-bottom: 4px;
|
||||
@@ -491,70 +390,57 @@ body,
|
||||
line-height: 30px;
|
||||
}
|
||||
|
||||
.message .layui-tab-title li:not(:last-child) {
|
||||
border-right: 1px solid #eee;
|
||||
/** 友情链接 */
|
||||
.more-setting {
|
||||
margin-top: 45px;
|
||||
}
|
||||
|
||||
/* 搜索面板 */
|
||||
.menu-search-content .layui-input-prefix {
|
||||
position: absolute;
|
||||
margin-top: 10px;
|
||||
margin-left: 10px;
|
||||
.more-setting form {
|
||||
margin-top: 30px;
|
||||
}
|
||||
|
||||
.menu-search-content .layui-input {
|
||||
padding-left: 30px;
|
||||
.more-setting-title {
|
||||
padding: 15px 0 0px 20px;
|
||||
margin-bottom: 4px;
|
||||
}
|
||||
|
||||
.menu-search-content {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
justify-content: center;
|
||||
.more-setting .layui-form-label {
|
||||
width: 60px;
|
||||
}
|
||||
|
||||
.menu-search-input-wrapper {
|
||||
.more-menu-list {
|
||||
width: 100%;
|
||||
padding: 15px 15px;
|
||||
margin-top: 80px;
|
||||
}
|
||||
|
||||
.menu-search-no-data {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
width: 100%;
|
||||
height: 122px;
|
||||
align-items: center;
|
||||
.more-menu-item:first-child {
|
||||
border-top: 1px solid #e8e8e8;
|
||||
}
|
||||
|
||||
.menu-search-list {
|
||||
width: 100%;
|
||||
padding: 5px 15px;
|
||||
.more-menu-item .layui-icon {
|
||||
font-size: 18px;
|
||||
padding-right: 10px;
|
||||
}
|
||||
|
||||
.menu-search-list li {
|
||||
position: relative;
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
flex-wrap: nowrap;
|
||||
.more-menu-item {
|
||||
color: #595959;
|
||||
height: 50px;
|
||||
margin-bottom: 8px;
|
||||
padding: 0px 10px;
|
||||
color: currentColor;
|
||||
font-size: 14px;
|
||||
border-radius: 4px;
|
||||
box-shadow: 0 1px 3px #d4d9e1;
|
||||
cursor: pointer;
|
||||
background-color: #fff;
|
||||
line-height: 50px;
|
||||
font-size: 16px;
|
||||
padding: 0 25px;
|
||||
border-bottom: 1px solid #e8e8e8;
|
||||
font-style: normal;
|
||||
display: block;
|
||||
}
|
||||
|
||||
.menu-search-list li:hover {
|
||||
background-color: #5FB878;
|
||||
color: white;
|
||||
.more-menu-item:hover {
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
|
||||
.menu-search-list li.this {
|
||||
background-color: #5FB878;
|
||||
color: white;
|
||||
.more-menu-item:after {
|
||||
color: #8c8c8c;
|
||||
right: 16px;
|
||||
content: "\e602";
|
||||
position: absolute;
|
||||
font-family: layui-icon !important;
|
||||
}
|
||||
|
||||
/* 搜索面板结束 */
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
.top-panel-number {
|
||||
line-height: 60px;
|
||||
font-size: 29px;
|
||||
font-size: 30px;
|
||||
border-right: 1px solid #eceff9;
|
||||
}
|
||||
|
||||
@@ -69,10 +69,9 @@
|
||||
.custom-tab .layui-tab-title li {
|
||||
margin-left: 10px;
|
||||
}
|
||||
|
||||
.list .list-item {
|
||||
height: 31.8px;
|
||||
line-height: 31.8px;
|
||||
height: 32px;
|
||||
line-height: 32px;
|
||||
color: gray;
|
||||
padding: 5px;
|
||||
padding-left: 15px;
|
||||
@@ -0,0 +1,18 @@
|
||||
.pear-container {background-color: whitesmoke;margin: 10px;}
|
||||
.pear-card {width: 100%;height: 66px;background-color: #F8F8F8;display: inline-block;border-radius: 5px;text-align: center;margin-bottom: 3px;}
|
||||
.pear-card:hover,.pear-card2:hover{box-shadow: 2px 0 8px 0 lightgray!important;}.pear-card2 {width: 100%;height: 90px;background-color: #F8F8F8;display: inline-block;border-radius: 5px;text-align: center;margin-bottom: 3px;}
|
||||
.pear-card2 i {font-size: 30px;height: 90px;line-height: 90px;}
|
||||
.pear-card i {font-size: 30px;height: 66px;line-height: 66px;}
|
||||
.layui-col-md3 {text-align: center;}
|
||||
.pear-card-title {margin-top: 3px;}
|
||||
.person img {width: 90px;height: 90px;border-radius: 4px;margin-top: 8px;margin-left: 8px;}
|
||||
.pear-card2 .count {color: #51A351;font-size: 30px;margin-top: 12px;}
|
||||
.pear-card2 .title {color: gray;font-size: 14px;margin-top: 14px;}
|
||||
.pear-card-status {padding: 0 10px 10px;}
|
||||
.pear-card-status li {position: relative;padding: 10px 0;border-bottom: 1px solid #EEE;}
|
||||
.pear-card-status li h3 {padding-bottom: 5px;font-weight: 700;}
|
||||
.pear-card-status li p {padding-bottom: 10px;padding-top: 3px ;}
|
||||
.pear-card-status li>span {color: #999;}
|
||||
.pear-reply {position: absolute;right: 20px;}
|
||||
.person .title{font-size: 17px;font-weight: 600;margin-left: 18px;margin-top: 16px;position: absolute;display: inline-block;}
|
||||
.person .desc{font-size: 16px;font-weight: 600;margin-left: 115px;margin-top: -30px;position: absolute;display: inline-block;}
|
||||
@@ -391,6 +391,14 @@
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* 代码高亮 */
|
||||
/* PrismJS 1.15.0
|
||||
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
|
||||
/**
|
||||
* prism.js default theme for JavaScript, CSS and HTML
|
||||
* Based on dabblet (http://dabblet.com)
|
||||
* @author Lea Verou
|
||||
*/
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: black;
|
||||
@@ -0,0 +1,58 @@
|
||||
.dept-tree {
|
||||
width: 100%;
|
||||
height: -webkit-calc(100vh - 247px);
|
||||
height: -moz-calc(100vh - 247px);
|
||||
height: calc(100vh - 247px);
|
||||
margin-top: 20px;
|
||||
}
|
||||
.dtree-laySimple-item-this{
|
||||
background-color: transparent!important;
|
||||
}
|
||||
.dtree-nav-div:hover{
|
||||
background-color: transparent!important;
|
||||
}
|
||||
.button{
|
||||
margin-top: 10px;
|
||||
width: 94%;
|
||||
margin-left: 3%;
|
||||
display: block;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
padding: 0 15px;
|
||||
white-space: nowrap;
|
||||
text-align: center;
|
||||
font-size: 14.5px;
|
||||
border: none;
|
||||
cursor: pointer;
|
||||
box-sizing: border-box;
|
||||
display:inline-block;
|
||||
outline: 0;
|
||||
border-radius: 2px;
|
||||
-webkit-appearance: none;
|
||||
box-shadow: 0px 1px 2px rgba(0, 0, 0, 0.15);
|
||||
}
|
||||
.button-primary{
|
||||
background-color: #5FB878;
|
||||
color: white;
|
||||
}
|
||||
.button-default{
|
||||
color: #2f495e;
|
||||
background-color: #edf2f7;
|
||||
}
|
||||
.user-main{
|
||||
width: calc(100% - 312px);
|
||||
float: right;
|
||||
}
|
||||
.user-left{
|
||||
width: 300px;
|
||||
float: left;
|
||||
}
|
||||
.user-collasped.user-main{
|
||||
width: 100%;
|
||||
}
|
||||
.user-collasped.user-left{
|
||||
width: 0px;
|
||||
}
|
||||
.user-collasped.user-left .user-group{
|
||||
display: none;
|
||||
}
|
||||
@@ -0,0 +1,56 @@
|
||||
{
|
||||
"code": 0,
|
||||
"msg": "...",
|
||||
"count": 3,
|
||||
"data": [{
|
||||
"id": "1",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png",
|
||||
"title": "Alipay",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
},{
|
||||
"id": "2",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png",
|
||||
"title": "Layui",
|
||||
"remark": "生命就像一盒巧克力,结果往往出人意料",
|
||||
"time": "几秒前"
|
||||
},{
|
||||
"id": "1",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png",
|
||||
"title": "Angular",
|
||||
"remark": "希望是一个好东西,也许是最好的,好东西是不会消亡的",
|
||||
"time": "几秒前"
|
||||
},
|
||||
{
|
||||
"id": "1",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png",
|
||||
"title": "React",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
},{
|
||||
"id": "1",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/gLaIAoVWTtLbBWZNYEMg.png",
|
||||
"title": "Alipay",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
},{
|
||||
"id": "2",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iXjVmWVHbCJAyqvDxdtx.png",
|
||||
"title": "Layui",
|
||||
"remark": "生命就像一盒巧克力,结果往往出人意料",
|
||||
"time": "几秒前"
|
||||
},{
|
||||
"id": "1",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/iZBVOIhGJiAnhplqjvZW.png",
|
||||
"title": "Angular",
|
||||
"remark": "希望是一个好东西,也许是最好的,好东西是不会消亡的",
|
||||
"time": "几秒前"
|
||||
},
|
||||
{
|
||||
"id": "1",
|
||||
"image": "https://gw.alipayobjects.com/zos/rmsportal/uMfMFlvUuceEyPpotzlq.png",
|
||||
"title": "React",
|
||||
"remark": "那是一种内在的东西, 他们到达不了,也无法触及的",
|
||||
"time": "几秒前"
|
||||
}]
|
||||
}
|
||||
@@ -1,8 +1,8 @@
|
||||
[{
|
||||
"id": 1,
|
||||
"title": "工作空间",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 0,
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"href": "",
|
||||
"children": [{
|
||||
"id": 10,
|
||||
@@ -24,7 +24,7 @@
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "http://www.bing.com"
|
||||
"href": "http://www.baidu.com"
|
||||
}, {
|
||||
"id": 15,
|
||||
"title": "主题预览",
|
||||
@@ -32,13 +32,6 @@
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/theme.html"
|
||||
}, {
|
||||
"id": 16,
|
||||
"title": "酸爽翻倍",
|
||||
"icon": "layui-icon layui-icon-console",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/core.html"
|
||||
}]
|
||||
},
|
||||
{
|
||||
@@ -151,18 +144,11 @@
|
||||
"href": "view/document/drawer.html"
|
||||
}, {
|
||||
"id": 2022,
|
||||
"title": "消息通知 (过时)",
|
||||
"title": "消息通知",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/notice.html"
|
||||
}, {
|
||||
"id": 2025,
|
||||
"title": "消息通知 (新增)",
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/toast.html"
|
||||
}, {
|
||||
"id": 2024,
|
||||
"title": "加载组件",
|
||||
@@ -209,7 +195,7 @@
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/document/encrypt.html"
|
||||
"href": "view/document/hash.html"
|
||||
},
|
||||
{
|
||||
"id": 2042,
|
||||
@@ -342,7 +328,7 @@
|
||||
"icon": "layui-icon layui-icon-face-cry",
|
||||
"type": 1,
|
||||
"openType": "_iframe",
|
||||
"href": "view/system/department.html"
|
||||
"href": "view/system/deptment.html"
|
||||
},
|
||||
{
|
||||
"id": 605,
|
||||
@@ -0,0 +1,88 @@
|
||||
[{
|
||||
"id": 1,
|
||||
"title": "私信",
|
||||
"children": [{
|
||||
"id": 11,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条私人消息",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条私人消息",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"title": "消息",
|
||||
"children": [{
|
||||
"id": 11,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条紧急任务",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条紧急任务",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条紧急任务",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条紧急任务",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条紧急任务",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条紧急任务",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}]
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"title": "通知",
|
||||
"children": [{
|
||||
"id": 11,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条警告通知",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}, {
|
||||
"id": 12,
|
||||
"avatar":"admin/images/avatar.jpg",
|
||||
"title": "收到一条警告通知",
|
||||
"context": "这是消息内容。",
|
||||
"form": "就眠仪式",
|
||||
"time": "2019-02-15"
|
||||
}]
|
||||
}
|
||||
]
|
||||
@@ -12,7 +12,6 @@
|
||||
"parentId": "0",
|
||||
"icon": "layui-icon-set-fill",
|
||||
"sort": 1,
|
||||
"enable": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "2",
|
||||
@@ -24,7 +23,6 @@
|
||||
"parentId": "1",
|
||||
"icon": "layui-icon-username",
|
||||
"sort": null,
|
||||
"enable": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "3",
|
||||
@@ -36,7 +34,6 @@
|
||||
"parentId": "1",
|
||||
"icon": "layui-icon-user",
|
||||
"sort": null,
|
||||
"enable": 1,
|
||||
"checkArr": "0"
|
||||
}, {
|
||||
"powerId": "4",
|
||||
@@ -0,0 +1 @@
|
||||
{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"code":0,"msg":"...","count":3,"data":[{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"roleId":"1","roleName":"超级管理员","roleCode":"admin","enable":"1","details":"超级管理员","checked":false},{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"roleId":"2","roleName":"普通管理员","roleCode":"manager","enable":"0","details":"普通管理员","checked":false},{"createTime":null,"createBy":null,"updateTime":null,"updateBy":null,"remark":null,"roleId":"3","roleName":"普通用户","roleCode":"pearson","enable":"0","details":"普通用户","checked":false}]}
|
||||
@@ -27,7 +27,7 @@
|
||||
"avatar": null,
|
||||
"sex": "1",
|
||||
"phone": "1555324324234",
|
||||
"enable": "0",
|
||||
"enable": "1",
|
||||
"login": "1",
|
||||
"roleIds": null
|
||||
}, {
|
||||
|
Before Width: | Height: | Size: 54 KiB After Width: | Height: | Size: 54 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 87 KiB After Width: | Height: | Size: 87 KiB |
|
Before Width: | Height: | Size: 197 KiB After Width: | Height: | Size: 197 KiB |
|
Before Width: | Height: | Size: 74 KiB After Width: | Height: | Size: 74 KiB |
@@ -18,6 +18,15 @@
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 210 530" to="360 210 530" repeatCount="indefinite"/>
|
||||
</path>
|
||||
|
||||
<circle cx="1200" cy="600" r="30" stroke="rgb(241, 243, 244)" fill="rgb(241, 243, 244)">
|
||||
<animateMotion path="M 0 0 L -20 40 Z" dur="9s" repeatCount="indefinite"/>
|
||||
</circle>
|
||||
|
||||
<path d="M 100 350 A 40 40 0 1 1 180 350 L 180 430 A 40 40 0 1 1 100 430 Z" stroke="rgb(241, 243, 244)" fill="rgb(241, 243, 244)">
|
||||
<animateMotion path="M 140 390 L 180 360 L 140 390" dur="20s" begin="0s" repeatCount="indefinite"/>
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="30s" type="rotate" values="0 140 390; -60 140 390; 0 140 390" keyTimes="0 ; 0.5 ; 1" repeatCount="indefinite"/>
|
||||
</path>
|
||||
|
||||
<rect x="400" y="600" rx="40" ry="40" width="100" height="100" stroke="rgb(129, 201, 149)" fill="rgb(129, 201, 149)">
|
||||
<animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-30 550 750" to="330 550 750" repeatCount="indefinite"/>
|
||||
</rect>
|
||||
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 3.9 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 14 KiB After Width: | Height: | Size: 14 KiB |
|
Before Width: | Height: | Size: 55 KiB After Width: | Height: | Size: 55 KiB |
@@ -0,0 +1 @@
|
||||
html #layuicss-skincodecss{display:none;position:absolute;width:1989px}.layui-code-h3,.layui-code-view{position:relative;font-size:12px}.layui-code-view{display:block;margin:10px 0;padding:0;border:1px solid #eee;border-left-width:6px;background-color:#FAFAFA;color:#333;font-family:Courier New}.layui-code-h3{padding:0 10px;height:40px;line-height:40px;border-bottom:1px solid #eee}.layui-code-h3 a{position:absolute;right:10px;top:0;color:#999}.layui-code-view .layui-code-ol{position:relative;overflow:auto}.layui-code-view .layui-code-ol li{position:relative;margin-left:45px;line-height:20px;padding:0 10px;border-left:1px solid #e2e2e2;list-style-type:decimal-leading-zero;*list-style-type:decimal;background-color:#fff}.layui-code-view .layui-code-ol li:first-child{padding-top:10px}.layui-code-view .layui-code-ol li:last-child{padding-bottom:10px}.layui-code-view pre{margin:0}.layui-code-notepad{border:1px solid #0C0C0C;border-left-color:#3F3F3F;background-color:#0C0C0C;color:#C2BE9E}.layui-code-notepad .layui-code-h3{border-bottom:none}.layui-code-notepad .layui-code-ol li{background-color:#3F3F3F;border-left:none}.layui-code-demo .layui-code{visibility:visible!important;margin:-15px;border-top:none;border-right:none;border-bottom:none}.layui-code-demo .layui-tab-content{padding:15px;border-top:none}
|
||||
|
Before Width: | Height: | Size: 5.8 KiB After Width: | Height: | Size: 5.8 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.7 KiB |
|
Before Width: | Height: | Size: 701 B After Width: | Height: | Size: 701 B |
|
Before Width: | Height: | Size: 1.7 KiB After Width: | Height: | Size: 1.7 KiB |
|
Before Width: | Height: | Size: 299 KiB After Width: | Height: | Size: 299 KiB |
@@ -1,3 +1,4 @@
|
||||
/** Buttom 默认*/
|
||||
.pear-btn {
|
||||
display: inline-block;
|
||||
line-height: 38px;
|
||||
@@ -24,6 +25,7 @@
|
||||
opacity: .8;
|
||||
filter: alpha(opacity=80);
|
||||
color: #409eff;
|
||||
border-color: #c6e2ff;
|
||||
background-color: #ECF5FF;
|
||||
}
|
||||
|
||||
@@ -35,23 +37,22 @@
|
||||
line-height: 37px;
|
||||
color: #fff !important
|
||||
}
|
||||
|
||||
/** Button 主题 */
|
||||
.pear-btn-primary {
|
||||
border: #2D8CF0;
|
||||
background-color: #2D8CF0 !important;
|
||||
border: #2D8CF0;
|
||||
}
|
||||
.pear-btn-danger {
|
||||
border: #f56c6c;
|
||||
background-color: #f56c6c !important;
|
||||
border: #f56c6c;
|
||||
}
|
||||
.pear-btn-warming {
|
||||
border: #f6ad55;
|
||||
background-color: #f6ad55 !important;
|
||||
border: #f6ad55;
|
||||
}
|
||||
.pear-btn-success {
|
||||
border: #36b368;
|
||||
background-color: #36b368 !important;
|
||||
background-color: #5FB878 !important;
|
||||
border: #5FB878;
|
||||
}
|
||||
|
||||
.pear-btn[round] {
|
||||
@@ -59,9 +60,9 @@
|
||||
}
|
||||
|
||||
.pear-btn-primary[plain] {
|
||||
border: #409eff !important;
|
||||
color: #409eff !important;
|
||||
background: #ecf5ff 10% !important;
|
||||
border-color: #b3d8ff !important;
|
||||
}
|
||||
|
||||
.pear-btn-primary[plain]:hover {
|
||||
@@ -70,20 +71,20 @@
|
||||
}
|
||||
|
||||
.pear-btn-success[plain] {
|
||||
border: #36b368 !important;
|
||||
color: #36b368 !important;
|
||||
color: #67c23a !important;
|
||||
background: #f0f9eb !important;
|
||||
border-color: #c2e7b0 !important;
|
||||
}
|
||||
|
||||
.pear-btn-success[plain]:hover {
|
||||
color: white !important;
|
||||
background-color: #36b368 !important
|
||||
background-color: #67c23a !important
|
||||
}
|
||||
|
||||
.pear-btn-warming[plain] {
|
||||
border: #e6a23c !important;
|
||||
color: #e6a23c !important;
|
||||
background: #fdf6ec !important;
|
||||
border-color: #f5dab1 !important;
|
||||
}
|
||||
|
||||
.pear-btn-warming[plain]:hover {
|
||||
@@ -92,9 +93,9 @@
|
||||
}
|
||||
|
||||
.pear-btn-danger[plain] {
|
||||
border: #f56c6c !important;
|
||||
color: #f56c6c !important;
|
||||
background: #fef0f0 !important;
|
||||
border-color: #fbc4c4 !important;
|
||||
}
|
||||
|
||||
.pear-btn-danger[plain]:hover {
|
||||
@@ -69,25 +69,10 @@
|
||||
margin-left: -10px;
|
||||
}
|
||||
|
||||
.cloud-card-component {
|
||||
.pear-card-component {
|
||||
padding: 20px;
|
||||
}
|
||||
|
||||
.cloud-card-component .layui-table-click {
|
||||
border-radius: 6px!important;
|
||||
}
|
||||
|
||||
.ew-table-loading {
|
||||
padding: 10px 0;
|
||||
text-align: center;
|
||||
}
|
||||
.ew-table-loading > i {
|
||||
color: #999;
|
||||
font-size: 30px;
|
||||
}
|
||||
.ew-table-loading.ew-loading-float {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
.pear-card-component .layui-laypage .layui-laypage-curr .layui-laypage-em {
|
||||
border-radius: 0px !important;
|
||||
}
|
||||
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
@@ -1,34 +1,29 @@
|
||||
.layui-card-body .layui-form{
|
||||
margin-top: 15px;
|
||||
}
|
||||
|
||||
input::-webkit-input-placeholder,
|
||||
textarea::-webkit-input-placeholder {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.layui-input:hover,
|
||||
.layui-textarea:hover,
|
||||
.layui-input:focus,
|
||||
.layui-textarea:focus {
|
||||
border-color: #eee;
|
||||
}
|
||||
|
||||
.layui-input:focus,
|
||||
.layui-textarea:focus {
|
||||
border-color: #5FB878!important;
|
||||
box-shadow: 0 0 0 3px #f0f9eb !important;
|
||||
}
|
||||
|
||||
.layui-input[success] {
|
||||
box-shadow: 0px 0px 0px 3px #f0f9eb !important;
|
||||
box-shadow: 0px 0px 3px 1px #5FB878 !important;
|
||||
border: #5FB878 1px solid!important;
|
||||
}
|
||||
|
||||
.layui-input[failure],
|
||||
.layui-form-item .layui-form-danger:focus {
|
||||
box-shadow: 0px 0px 0px 3px #fef0f0 !important;
|
||||
border: #F56C6C 1px solid!important;
|
||||
.layui-input[failure] {
|
||||
box-shadow: 0px 0px 3px 1px #F56C6C;
|
||||
border: #F56C6C 1px solid;
|
||||
}
|
||||
|
||||
.layui-input,
|
||||
@@ -33,15 +33,15 @@
|
||||
|
||||
.pear-frame .pear-frame-content {
|
||||
width: 100%;
|
||||
height: calc(100% - 0px) !important;
|
||||
height: calc(100% - 45px) !important;
|
||||
}
|
||||
|
||||
.pear-frame-loading {
|
||||
position: absolute;
|
||||
display: none;
|
||||
width: 100%;
|
||||
height: calc(100% - 0px) !important;
|
||||
top: 0px;
|
||||
height: calc(100% - 45px) !important;
|
||||
top: 42px;
|
||||
z-index: 19;
|
||||
background-color: #fff
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
.layui-iconpicker .layui-anim{
|
||||
width: 300px!important;
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
.layui-layer-msg{
|
||||
border-color: transparent!important;
|
||||
box-shadow: 2px 0 6px rgb(0 21 41 / 0.05)!important;
|
||||
}
|
||||
@@ -28,6 +28,11 @@
|
||||
width: 230px;
|
||||
}
|
||||
|
||||
.pear-nav-tree .layui-nav-child {
|
||||
padding-top: 5px;
|
||||
padding-bottom: 5px;
|
||||
}
|
||||
|
||||
.pear-nav-tree .layui-nav-child dd.layui-this,
|
||||
.layui-nav-tree .layui-nav-child dd.layui-this a,
|
||||
.layui-nav-tree .layui-this,
|
||||
@@ -68,15 +73,7 @@
|
||||
display: none;
|
||||
}
|
||||
|
||||
.pear-nav-tree .layui-nav-item a .layui-badge-dot {
|
||||
float: right;
|
||||
right: 13px;
|
||||
}
|
||||
|
||||
.pear-nav-tree .layui-nav-item a .layui-badge {
|
||||
float: right;
|
||||
right: 10px;
|
||||
}
|
||||
|
||||
/** 实 现 菜 单 隐 藏 */
|
||||
.pear-nav-mini {
|
||||
@@ -111,11 +108,9 @@
|
||||
.pear-nav-control.pc .layui-this * {
|
||||
background-color: whitesmoke;
|
||||
}
|
||||
|
||||
.pear-nav-control.pc *{
|
||||
color: darkslategray!important;
|
||||
}
|
||||
|
||||
.pear-nav-control.pc .layui-nav-bar{
|
||||
display: none!important;
|
||||
}
|
||||
@@ -128,23 +123,15 @@
|
||||
|
||||
/** 隐 藏 后 子 级 悬 浮 菜 单 */
|
||||
.pear-nav-tree .layui-nav-hover {
|
||||
position: fixed;
|
||||
min-width: 130px;
|
||||
padding: 4px;
|
||||
display: block !important;
|
||||
background: transparent !important;
|
||||
}
|
||||
.pear-nav-tree .layui-nav-hover:before {
|
||||
content: '';
|
||||
position: absolute;
|
||||
right: 4px;
|
||||
left: 4px;
|
||||
bottom: 0;
|
||||
top: 0;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
background-color: #28333E;
|
||||
display: block;
|
||||
position: fixed;
|
||||
min-width: 130px;
|
||||
margin-left: 62px;
|
||||
padding-top: 4px !important;
|
||||
padding-bottom: 4px !important;
|
||||
box-shadow: 0px 0px 3px lightgray;
|
||||
}
|
||||
.pear-nav-tree .layui-nav-hover a span {
|
||||
@@ -154,7 +141,7 @@
|
||||
display: none;
|
||||
}
|
||||
.pear-nav-tree .layui-nav-child dd a span {
|
||||
margin-left: 26px !important;
|
||||
margin-left: 30px !important;
|
||||
}
|
||||
.pear-nav-tree .layui-nav-child dd a i {
|
||||
display: none;
|
||||
@@ -162,11 +149,10 @@
|
||||
.pear-nav-tree .layui-nav-hover dd a span {
|
||||
margin-left: 0px !important;
|
||||
}
|
||||
.pear-nav-tree dl {
|
||||
padding-top: 0;
|
||||
padding-bottom: 0;
|
||||
}
|
||||
/** 亮 样 式*/
|
||||
|
||||
/** 亮 样 式*/
|
||||
|
||||
.dark-theme .layui-nav-tree{
|
||||
background-color: #28333E!important;
|
||||
}
|
||||
@@ -176,7 +162,6 @@
|
||||
}
|
||||
|
||||
.light-theme .pear-nav-tree,
|
||||
.light-theme .pear-nav-tree .layui-nav-hover:before,
|
||||
.light-theme .pear-nav-tree .layui-nav-child{
|
||||
background-color: white!important;
|
||||
}
|
||||
@@ -192,6 +177,11 @@
|
||||
border-bottom-color: dimgray!important;
|
||||
}
|
||||
|
||||
.light-theme .pear-nav-tree .layui-nav-child{
|
||||
padding-top: 0px;
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
|
||||
.light-theme .pear-nav-tree .layui-this a,
|
||||
.light-theme .pear-nav-tree .layui-this{
|
||||
color: white!important;
|
||||
@@ -247,21 +237,10 @@
|
||||
width: 12px;
|
||||
text-align: center;
|
||||
}
|
||||
.pear-nav-tree.arrow .layui-nav-child.layui-nav-hover>dd>a>.layui-nav-more {
|
||||
display: inline-block !important;
|
||||
transform: rotate(270deg);
|
||||
-ms-transform: rotate(270deg);
|
||||
-moz-transform: rotate(270deg);
|
||||
-webkit-transform: rotate(270deg);
|
||||
-o-transform: rotate(270deg);
|
||||
width: 12px;
|
||||
text-align: center;
|
||||
background-color: transparent !important;
|
||||
}
|
||||
|
||||
.pear-nav-tree.arrow .layui-nav-child.layui-nav-hover>a>.layui-nav-more:before,
|
||||
.pear-nav-tree.arrow .layui-nav-itemed>a>.layui-nav-more:before {
|
||||
content: '\e61a';
|
||||
background-color: transparent;
|
||||
display: inline-block;
|
||||
vertical-align: middle;
|
||||
}
|
||||
@@ -0,0 +1,42 @@
|
||||
.pear-notice .layui-this {
|
||||
color: #5FB878 !important;
|
||||
font-weight: 500;
|
||||
}
|
||||
|
||||
.pear-notice li {
|
||||
border-right: 1px solid whitesmoke;
|
||||
}
|
||||
|
||||
.pear-notice * {
|
||||
color: dimgray !important;
|
||||
}
|
||||
|
||||
.pear-notice{
|
||||
width: 285px!important;
|
||||
}
|
||||
|
||||
.pear-notice span{
|
||||
margin-left: 20px;
|
||||
font-size: 13px;
|
||||
}
|
||||
|
||||
.pear-notice img{
|
||||
margin-left: 8px;
|
||||
width: 33px!important;
|
||||
height: 33px!important;
|
||||
border-radius: 50px;
|
||||
}
|
||||
|
||||
.pear-notice-item{
|
||||
height: 45px!important;
|
||||
line-height: 45px!important;
|
||||
}
|
||||
|
||||
/** 滚动条样式 */
|
||||
.pear-notice *::-webkit-scrollbar{width:0px;height:0px;}
|
||||
.pear-notice *::-webkit-scrollbar-track{background: white;border-radius:2px;}
|
||||
.pear-notice *::-webkit-scrollbar-thumb{background: #E6E6E6;border-radius:2px;}
|
||||
.pear-notice *::-webkit-scrollbar-thumb:hover{background: #E6E6E6;}
|
||||
.pear-notice *::-webkit-scrollbar-corner{background: #f6f6f6;}
|
||||
|
||||
|
||||
@@ -439,13 +439,13 @@ div[xm-select-skin=default].xm-form-selected .xm-select:hover {
|
||||
}
|
||||
|
||||
div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span {
|
||||
background-color: #5FB878!important;
|
||||
background-color: #5FB878!important
|
||||
color: #FFF;
|
||||
border: 1px solid #5FB878!important
|
||||
}
|
||||
|
||||
div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i {
|
||||
background-color: #5FB878!important;
|
||||
background-color: #5FB878!important
|
||||
color: #FFF
|
||||
}
|
||||
|
||||
@@ -517,7 +517,7 @@ div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span {
|
||||
}
|
||||
|
||||
div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i {
|
||||
background-color:#f56c6c!important;
|
||||
background-color:#f56c6c!important
|
||||
color: #FFF
|
||||
}
|
||||
|
||||
@@ -820,3 +820,8 @@ div[xm-select-search-type="1"] .xm-select .xm-select-input {
|
||||
.icon-expand:before {
|
||||
content: "\e641";
|
||||
}
|
||||
|
||||
.xm-select-parent .xm-form-select dl{
|
||||
position: relative;
|
||||
top: 5px!important;
|
||||
}
|
||||
@@ -47,6 +47,7 @@
|
||||
border-right: 1px solid whitesmoke;
|
||||
color: dimgray;
|
||||
font-size: 13.5px;
|
||||
line-height: 43px;
|
||||
}
|
||||
|
||||
.pear-tab .layui-tab-title .layui-tab-bar {
|
||||
@@ -18,13 +18,12 @@
|
||||
}
|
||||
|
||||
.layui-table-cell {
|
||||
height: 34px;
|
||||
line-height: 34px;
|
||||
height: 34px !important;
|
||||
line-height: 34px !important;
|
||||
}
|
||||
|
||||
.layui-table .layui-laypage .layui-laypage-curr .layui-laypage-em {
|
||||
border-radius: 50px !important;
|
||||
border-radius: 4px!important;
|
||||
background-color: #5FB878 !important;
|
||||
}
|
||||
|
||||
@@ -33,8 +32,8 @@
|
||||
}
|
||||
|
||||
.layui-table tr {
|
||||
height: 34px;
|
||||
line-height: 34px;
|
||||
height: 34px !important;
|
||||
line-height: 34px !important;
|
||||
}
|
||||
|
||||
.layui-table-cell {
|
||||
@@ -69,12 +68,6 @@
|
||||
.layui-table-view .layui-table[lay-skin=line] {
|
||||
border: none !important;
|
||||
}
|
||||
|
||||
.layui-table-init .layui-icon{
|
||||
font-size: 40px !important;
|
||||
margin: -15px 0 0 -15px;
|
||||
}
|
||||
|
||||
.layui-table-body::-webkit-scrollbar {
|
||||
width: 0px;
|
||||
height: 0px;
|
||||