6 Commits
Author SHA1 Message Date
zhengxinonlyandGitee 55ea1e7252 !82 update README.md.
Merge pull request !82 from alan968/N/A
2023-04-06 04:51:15 +00:00
alan968andGitee b80b869dd8 update README.md.
更新README.md文档中在拉取代码时的步骤。

Signed-off-by: alan968 <2669660794@qq.com>
2023-03-23 12:21:18 +00:00
zhengxinonlyandGitee 7fea9743c9 !50 修复文件管理上传错误 2022-09-30 11:57:45 +00:00
mengfu188 c09812f85d 修复文件管理上传错误 2022-09-29 13:39:37 +08:00
zhengxinonlyandGitee 794a8a57ad !48 修复创建权限时的bug
修复创建权限时的bug
2022-09-05 15:45:16 +00:00
mengfu188 cab60da886 修复创建权限时的bug 2022-09-04 15:55:00 +08:00
1068 changed files with 31845 additions and 63045 deletions
+5 -1
View File
@@ -40,6 +40,7 @@ Pear Admin Flask 基于 Flask 生态的后台管理系统,该项目旨在为 p
+ [flask](https://dormousehole.readthedocs.io/en/latest/) + [flask](https://dormousehole.readthedocs.io/en/latest/)
+ [flask-login](https://flask-login.readthedocs.io/en/latest/) + [flask-login](https://flask-login.readthedocs.io/en/latest/)
+ [flask-sqlalchemy](http://www.pythondoc.com/flask-sqlalchemy/quickstart.html) + [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/) [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 ```bash
git clone https://gitee.com/pear-admin/pear-admin-flask git clone https://gitee.com/pear-admin/pear-admin-flask
# 进入 pear-admin-flask 代码根目录
cd pear-admin-flask
# 切换分支 # 切换分支
git checkout mini git checkout mini
``` ```
+27 -25
View File
@@ -1,15 +1,16 @@
import typing as t import typing as t
from flask import jsonify
from flask.views import MethodView from flask.views import MethodView
from flask_pydantic import validate from flask_pydantic import validate
from pydantic import BaseModel, Field 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 extensions import db
from models import DepartmentModel, UserModel from models import DepartmentModel, UserModel
class DeptSchema(BaseModel): class DeptModel(BaseModel):
address: t.Optional[str] address: t.Optional[str]
dept_name: t.Optional[str] = Field(alias='deptName') dept_name: t.Optional[str] = Field(alias='deptName')
email: t.Optional[str] email: t.Optional[str]
@@ -38,28 +39,29 @@ class DepartmentsApi(MethodView):
return dict(success=True, message='ok', dept=dept_data) return dict(success=True, message='ok', dept=dept_data)
dept_data = DepartmentModel.query.order_by(DepartmentModel.sort).all() dept_data = DepartmentModel.query.order_by(DepartmentModel.sort).all()
return table_api( # TODO dtree 需要返回状态信息
result={ res = {
'items': [ "status": {"code": 200, "message": "默认"},
{ "data": [
'deptId': item.id, {
'parentId': item.parent_id, 'deptId': item.id,
'deptName': item.dept_name, 'parentId': item.parent_id,
'sort': item.sort, 'deptName': item.dept_name,
'leader': item.leader, 'sort': item.sort,
'phone': item.phone, 'leader': item.leader,
'email': item.email, 'phone': item.phone,
'status': item.status, 'email': item.email,
'comment': item.comment, 'status': item.status,
'address': item.address, 'comment': item.comment,
'create_at': item.create_at.strftime('%Y-%m-%d %H:%M:%S') 'address': item.address,
} for item in dept_data '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() @validate()
def post(self, body: DeptSchema): def post(self, body: DeptModel):
dept = DepartmentModel( dept = DepartmentModel(
parent_id=body.parent_id, parent_id=body.parent_id,
dept_name=body.dept_name, dept_name=body.dept_name,
@@ -76,7 +78,7 @@ class DepartmentsApi(MethodView):
return success_api(message="成功") return success_api(message="成功")
@validate() @validate()
def put(self, _id, body: DeptSchema): def put(self, _id, body: DeptModel):
data = { data = {
"dept_name": body.dept_name, "dept_name": body.dept_name,
"sort": body.sort, "sort": body.sort,
@@ -88,9 +90,9 @@ class DepartmentsApi(MethodView):
} }
body = DepartmentModel.query.filter_by(id=_id).update(data) body = DepartmentModel.query.filter_by(id=_id).update(data)
if not body: if not body:
return {'success': False, 'message': "更新失败", 'code': 404} return fail_api(message="更新失败")
db.session.commit() db.session.commit()
return {'success': True, 'message': '更新成功', 'code': 200} return success_api(message="更新成功")
def delete(self, _id): def delete(self, _id):
ret = DepartmentModel.query.filter_by(id=_id).delete() ret = DepartmentModel.query.filter_by(id=_id).delete()
+3 -3
View File
@@ -147,7 +147,7 @@ def make_menu_tree():
return sorted(menu_dict.get(0), key=lambda item: item['sort']) return sorted(menu_dict.get(0), key=lambda item: item['sort'])
class PowerSchema(BaseModel): class PowerModel(BaseModel):
icon: str icon: str
open_type: Optional[str] = Field(alias='openType') open_type: Optional[str] = Field(alias='openType')
parent_id: Optional[str] = Field(alias='parentId') parent_id: Optional[str] = Field(alias='parentId')
@@ -199,7 +199,7 @@ class RightsApi(MethodView):
class PowerApi(MethodView): class PowerApi(MethodView):
@validate() @validate()
def post(self, body: PowerSchema): def post(self, body: PowerModel):
power = RightModel( power = RightModel(
icon=body.icon, icon=body.icon,
open_type=body.open_type, open_type=body.open_type,
@@ -239,7 +239,7 @@ class PowerApi(MethodView):
return fail_api(message="删除失败") return fail_api(message="删除失败")
@validate() @validate()
def put(self, _id, body: PowerSchema): def put(self, _id, body: PowerModel):
data = { data = {
"icon": body.icon, "icon": body.icon,
"open_type": body.open_type, "open_type": body.open_type,
+3 -1
View File
@@ -1,3 +1,5 @@
from flask import Blueprint
from common import register_api from common import register_api
from .file import FilePhotoAPI from .file import FilePhotoAPI
from .passport import LoginAPI from .passport import LoginAPI
@@ -5,4 +7,4 @@ from .passport import LoginAPI
def register_sys_api(api_bp): def register_sys_api(api_bp):
register_api(LoginAPI, 'login_api', '/passport/login', pk='_id', app=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)
+2 -2
View File
@@ -11,7 +11,7 @@ from common.utils.rights import record_logging
from models import UserModel from models import UserModel
class LoginSchema(BaseModel): class LoginModel(BaseModel):
username: str username: str
password: str password: str
captcha: str captcha: str
@@ -25,7 +25,7 @@ class LoginAPI(MethodView):
return make_response(render_template('index/login.html')) return make_response(render_template('index/login.html'))
@validate() @validate()
def post(self, body: LoginSchema): def post(self, body: LoginModel):
s_code = session.get("code", None) s_code = session.get("code", None)
session["code"] = None session["code"] = None
+4 -4
View File
@@ -67,7 +67,7 @@ def users_delete():
return success_api(message="批量删除成功") return success_api(message="批量删除成功")
class QuerySchema(BaseModel): class QueryModel(BaseModel):
page: int = 1 page: int = 1
limit: int = 10 limit: int = 10
real_name: t.Optional[str] = Field(alias='realName') real_name: t.Optional[str] = Field(alias='realName')
@@ -78,7 +78,7 @@ class QuerySchema(BaseModel):
status: t.Optional[int] status: t.Optional[int]
class PersonSchema(BaseModel): class PersonModel(BaseModel):
role_ids: str = Field(alias='roleIds') role_ids: str = Field(alias='roleIds')
username: str username: str
real_name: str = Field(alias='realName') real_name: str = Field(alias='realName')
@@ -89,7 +89,7 @@ class UserApi(MethodView):
"""修改用户数据""" """修改用户数据"""
@validate() @validate()
def get(self, _id, query: QuerySchema): def get(self, _id, query: QueryModel):
filters = [] filters = []
@@ -123,7 +123,7 @@ class UserApi(MethodView):
) )
@validate() @validate()
def post(self, body: PersonSchema): def post(self, body: PersonModel):
"""新建单个用户""" """新建单个用户"""
role_ids = body.role_ids.split(',') role_ids = body.role_ids.split(',')
+1 -4
View File
@@ -3,12 +3,11 @@ from flask import Flask
from .index import index_bp from .index import index_bp
from .logs_view import logs_bp from .logs_view import logs_bp
from .roles import role_bp from .roles import role_bp
from .system_view import system_bp
from .document_view import document_bp
from . import department from . import department
from . import file from . import file
from . import rights from . import rights
from . import passport
from . import users from . import users
@@ -16,5 +15,3 @@ def init_view(app: Flask):
app.register_blueprint(index_bp) app.register_blueprint(index_bp)
app.register_blueprint(logs_bp) app.register_blueprint(logs_bp)
app.register_blueprint(role_bp) app.register_blueprint(role_bp)
app.register_blueprint(system_bp)
app.register_blueprint(document_bp)
+9 -2
View File
@@ -5,11 +5,18 @@ from common.utils.rights import permission_required, view_logging_required
from applications.view import index_bp 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') @index_bp.get('/dept/add')
@view_logging_required @view_logging_required
@permission_required("admin:dept:add") @permission_required("admin:dept:add")
def add(): def add():
return render_template('view/system/department_add.html') return render_template('admin/department/dept_add.html')
@index_bp.get('/dept/edit') @index_bp.get('/dept/edit')
@@ -18,4 +25,4 @@ def add():
def edit(): def edit():
dept_id = request.args.get("deptId", type=int) dept_id = request.args.get("deptId", type=int)
dept = DepartmentModel.query.get(dept_id) 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)
-18
View File
@@ -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')
+2 -2
View File
@@ -8,11 +8,11 @@ from common.utils.rights import view_logging_required, permission_required
@view_logging_required @view_logging_required
@permission_required("admin:file:main") @permission_required("admin:file:main")
def file_index(): def file_index():
return render_template('view/system/photo.html') return render_template('admin/file/photo.html')
@index_bp.get('/file/photo/add') @index_bp.get('/file/photo/add')
@view_logging_required @view_logging_required
@permission_required("admin:file:main") @permission_required("admin:file:main")
def file_photo_add(): def file_photo_add():
return render_template('view/system/photo_add.html') return render_template('admin/file/photo_add.html')
+13 -67
View File
@@ -1,78 +1,24 @@
from flask import Blueprint, redirect, url_for from flask import Blueprint
from flask import send_file from flask import render_template
from flask import session, render_template from flask_login import login_required, current_user
from flask_login import current_user, logout_user, login_required
from common.gen_captcha import get_captcha_image
index_bp = Blueprint('index', __name__) index_bp = Blueprint('index', __name__)
@index_bp.route('/') @index_bp.route('/')
@index_bp.route('/admin')
@login_required
def index(): def index():
return render_template('index.html') return render_template('index/index.html')
@index_bp.route('/config/pear.config.json') # 首页
def pear_config(): @index_bp.get('/admin/')
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')
@login_required @login_required
def logout(): def admin_index():
logout_user() return render_template('index/admin_index.html', user=current_user)
session.pop('permissions')
print({"message": "注销成功", "success": True})
return {"message": "注销成功", "success": True}
@index_bp.get('/login') # 控制台页面
def login(): @index_bp.get('/admin/welcome')
if current_user.is_authenticated: @login_required
return redirect(url_for('admin.index')) def welcome():
return render_template('login.html') return render_template('index/welcome.html')
+6
View File
@@ -8,6 +8,12 @@ from models import LogModel
logs_bp = Blueprint('logs', __name__, url_prefix='/logs') 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') @logs_bp.get('/login_log')
@permission_required("admin:log:main") @permission_required("admin:log:main")
def login_log(): def login_log():
+32
View File
@@ -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')
+9 -2
View File
@@ -5,6 +5,13 @@ from models import RightModel
from applications.view import index_bp 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>') @index_bp.get('/rights/power/<int:power_id>')
@view_logging_required @view_logging_required
@permission_required("admin:power:edit") @permission_required("admin:power:edit")
@@ -15,11 +22,11 @@ def rights_edit(power_id):
icon = icon[1] icon = icon[1]
else: else:
icon = None 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') @index_bp.get('/rights/add')
@view_logging_required @view_logging_required
@permission_required("admin:power:main") @permission_required("admin:power:main")
def rights_add(): def rights_add():
return render_template('view/system/power_add.html') return render_template('admin/rights/rights_add.html')
+11 -3
View File
@@ -7,12 +7,20 @@ from models import RoleModel
role_bp = Blueprint('role', __name__, url_prefix='/admin/role') 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>') @role_bp.get('/power/<int:role_id>')
@view_logging_required @view_logging_required
@permission_required("admin:role:power") @permission_required("admin:role:power")
def power(role_id): 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") @permission_required("admin:role:edit")
def role_editor(role_id): def role_editor(role_id):
role = RoleModel.query.filter_by(id=role_id).first() 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') @role_bp.get('/add')
@view_logging_required @view_logging_required
@permission_required("admin:role:edit") @permission_required("admin:role:edit")
def role_add(): def role_add():
return render_template('view/system/roles_add.html') return render_template('admin/roles/roles_add.html')
-48
View File
@@ -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')
+26 -3
View File
@@ -1,16 +1,26 @@
from flask import render_template 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 common.utils.rights import permission_required, view_logging_required
from models import RoleModel, UserModel from models import LogModel, RoleModel, UserModel
from . import index_bp 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') @index_bp.get('/users/add')
@view_logging_required @view_logging_required
@permission_required("admin:user:add") @permission_required("admin:user:add")
def users_add_view(): def users_add_view():
roles = RoleModel.query.all() 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>') @index_bp.get('/users/<user_id>')
@@ -23,4 +33,17 @@ def users_user_id_view(user_id):
checked_roles = [] checked_roles = []
for r in user.role: for r in user.role:
checked_roles.append(r.id) 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')
+3 -2
View File
@@ -24,7 +24,7 @@ SYSTEM_PANEL_LINKS = [
SECRET_KEY = os.getenv('SECRET_KEY', 'dev key') SECRET_KEY = os.getenv('SECRET_KEY', 'dev key')
# mysql 配置 # mysql 配置
MYSQL_USERNAME = "windows" MYSQL_USERNAME = "root"
MYSQL_PASSWORD = "123456" MYSQL_PASSWORD = "123456"
MYSQL_HOST = "127.0.0.1" MYSQL_HOST = "127.0.0.1"
MYSQL_PORT = 3306 MYSQL_PORT = 3306
@@ -39,7 +39,8 @@ SQLALCHEMY_DATABASE_URI = r'sqlite:///pear_admin.db'
SQLALCHEMY_TRACK_MODIFICATIONS = True SQLALCHEMY_TRACK_MODIFICATIONS = True
SQLALCHEMY_ECHO = False SQLALCHEMY_ECHO = False
SQLALCHEMY_POOL_RECYCLE = 8 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 LOG_LEVEL = logging.ERROR
-16
View File
@@ -32,22 +32,6 @@ class RightModel(db.Model):
parent = db.relationship("RightModel", remote_side=[id]) # 自关联 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): class RoleModel(db.Model):
__tablename__ = 'rt_role' __tablename__ = 'rt_role'
@@ -12,67 +12,14 @@ body,
transition: all .3s; 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 { .pear-admin .layui-logo .title {
font-size: 20px; font-size: 20px;
} }
.pear-admin .layui-layout-right .layui-nav-child { .pear-admin .layui-layout-right .layui-nav-child {
border: 1px solid whitesmoke; border: 1px solid whitesmoke;
border-radius: 4px; border-radius: 6px;
width: auto; width: 150px;
left: auto;
right: -23px;
} }
.pear-admin .layui-header { .pear-admin .layui-header {
@@ -82,22 +29,26 @@ body,
border-bottom: 1px solid whitesmoke; border-bottom: 1px solid whitesmoke;
} }
.pear-admin .layui-header .layui-nav-img {
width: 30px;
height: 30px;
}
.pear-admin .layui-layout-control { .pear-admin .layui-layout-control {
left: 140px; left: 140px;
position: absolute; position: absolute;
} }
.pear-admin .layui-layout-control .layui-nav { .pear-admin .layui-layout-control .layui-nav{
padding: 0px; padding: 0px;
} }
.pear-admin .layui-logo { .pear-admin .layui-logo {
width: 230px; width: 230px;
height: 59px; height: 60px;
line-height: 59px; line-height: 60px;
position: relative; position: relative;
background-color: #28333E; background-color: #28333E;
border-bottom: 1px solid rgba(0, 0, 0, .12);
} }
.pear-admin .layui-logo img { .pear-admin .layui-logo img {
@@ -152,29 +103,12 @@ body,
left: 0px; left: 0px;
} }
.pear-admin .layui-footer { /** 隐 藏 布 局 样 式 */
position: absolute; .pear-mini .layui-logo .title {
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 {
display: none; display: none;
} }
/** 收缩布局 */ .pear-mini .layui-logo .logo {
.pear-mini .layui-side .layui-logo .title {
display: none;
}
.pear-mini .layui-side .layui-logo .logo {
display: inline-block; display: inline-block;
} }
@@ -191,14 +125,10 @@ body,
left: 60px; left: 60px;
} }
.pear-mini .layui-side .layui-logo { .pear-mini .layui-logo {
width: 60px; width: 60px;
} }
.pear-mini .layui-footer {
left: 60px;
}
.pear-mini .layui-nav-tree .layui-nav-item span { .pear-mini .layui-nav-tree .layui-nav-item span {
display: none; display: none;
} }
@@ -225,7 +155,7 @@ body,
display: none; display: none;
} }
.pear-collapsed-pe { .pear-collasped-pe {
display: none; display: none;
width: 50px; width: 50px;
position: absolute; position: absolute;
@@ -240,7 +170,7 @@ body,
box-shadow: 2px 0 6px rgba(0, 21, 41, .35); box-shadow: 2px 0 6px rgba(0, 21, 41, .35);
} }
.pear-collapsed-pe a { .pear-collasped-pe a {
color: white !important; color: white !important;
} }
@@ -258,11 +188,11 @@ body,
/** 新增兼容 */ /** 新增兼容 */
@media screen and (max-width:768px) { @media screen and (max-width:768px) {
.collapse { .collaspe {
display: none !important; display: none !important;
} }
.pear-collapsed-pe { .pear-collasped-pe {
display: inline-block !important; display: inline-block !important;
} }
@@ -283,6 +213,7 @@ body,
height: calc(100% - 62px); height: calc(100% - 62px);
} }
/** 隐 藏 布 局 样 式 */
.pear-mini .layui-side { .pear-mini .layui-side {
width: 0px; width: 0px;
} }
@@ -296,10 +227,6 @@ body,
left: 0px; left: 0px;
} }
.pear-mini .layui-footer {
left: 0px;
}
.pear-mini .layui-logo { .pear-mini .layui-logo {
width: 0px; width: 0px;
} }
@@ -365,50 +292,22 @@ body,
} }
/** 侧边主题 (亮) */ /** 亮色侧边风格 */
.light-theme.layui-side { .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; 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 { .pearone-color .color-title {
padding: 15px 0 0px 20px; padding: 15px 0 0px 20px;
margin-bottom: 4px; margin-bottom: 4px;
@@ -491,70 +390,57 @@ body,
line-height: 30px; line-height: 30px;
} }
.message .layui-tab-title li:not(:last-child) { /** 友情链接 */
border-right: 1px solid #eee; .more-setting {
margin-top: 45px;
} }
/* 搜索面板 */ .more-setting form {
.menu-search-content .layui-input-prefix { margin-top: 30px;
position: absolute;
margin-top: 10px;
margin-left: 10px;
} }
.menu-search-content .layui-input { .more-setting-title {
padding-left: 30px; padding: 15px 0 0px 20px;
margin-bottom: 4px;
} }
.menu-search-content { .more-setting .layui-form-label {
display: flex; width: 60px;
flex-wrap: wrap;
justify-content: center;
} }
.menu-search-input-wrapper { .more-menu-list {
width: 100%; width: 100%;
padding: 15px 15px; margin-top: 80px;
} }
.menu-search-no-data { .more-menu-item:first-child {
display: flex; border-top: 1px solid #e8e8e8;
justify-content: center;
width: 100%;
height: 122px;
align-items: center;
} }
.menu-search-list { .more-menu-item .layui-icon {
width: 100%; font-size: 18px;
padding: 5px 15px; padding-right: 10px;
} }
.menu-search-list li { .more-menu-item {
position: relative; color: #595959;
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: nowrap;
height: 50px; height: 50px;
margin-bottom: 8px; line-height: 50px;
padding: 0px 10px; font-size: 16px;
color: currentColor; padding: 0 25px;
font-size: 14px; border-bottom: 1px solid #e8e8e8;
border-radius: 4px; font-style: normal;
box-shadow: 0 1px 3px #d4d9e1; display: block;
cursor: pointer;
background-color: #fff;
} }
.menu-search-list li:hover { .more-menu-item:hover {
background-color: #5FB878; background-color: whitesmoke;
color: white;
} }
.menu-search-list li.this { .more-menu-item:after {
background-color: #5FB878; color: #8c8c8c;
color: white; right: 16px;
content: "\e602";
position: absolute;
font-family: layui-icon !important;
} }
/* 搜索面板结束 */
@@ -31,7 +31,7 @@
width: 50px; width: 50px;
height: 50px; height: 50px;
border-radius: 3px; border-radius: 3px;
background-color: #5FB878; background-color: #5FB878;
position: absolute; position: absolute;
top: 0; top: 0;
left: 0; left: 0;
@@ -9,7 +9,7 @@
.top-panel-number { .top-panel-number {
line-height: 60px; line-height: 60px;
font-size: 29px; font-size: 30px;
border-right: 1px solid #eceff9; border-right: 1px solid #eceff9;
} }
@@ -69,10 +69,9 @@
.custom-tab .layui-tab-title li { .custom-tab .layui-tab-title li {
margin-left: 10px; margin-left: 10px;
} }
.list .list-item { .list .list-item {
height: 31.8px; height: 32px;
line-height: 31.8px; line-height: 32px;
color: gray; color: gray;
padding: 5px; padding: 5px;
padding-left: 15px; padding-left: 15px;
+18
View File
@@ -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; 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-"], code[class*="language-"],
pre[class*="language-"] { pre[class*="language-"] {
color: black; color: black;
+58
View File
@@ -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;
}
+56
View File
@@ -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, "id": 1,
"title": "工作空间", "title": "工作空间",
"icon": "layui-icon layui-icon-console",
"type": 0, "type": 0,
"icon": "layui-icon layui-icon-console",
"href": "", "href": "",
"children": [{ "children": [{
"id": 10, "id": 10,
@@ -24,7 +24,7 @@
"icon": "layui-icon layui-icon-console", "icon": "layui-icon layui-icon-console",
"type": 1, "type": 1,
"openType": "_iframe", "openType": "_iframe",
"href": "http://www.bing.com" "href": "http://www.baidu.com"
}, { }, {
"id": 15, "id": 15,
"title": "主题预览", "title": "主题预览",
@@ -32,13 +32,6 @@
"type": 1, "type": 1,
"openType": "_iframe", "openType": "_iframe",
"href": "view/system/theme.html" "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" "href": "view/document/drawer.html"
}, { }, {
"id": 2022, "id": 2022,
"title": "消息通知 (过时)", "title": "消息通知",
"icon": "layui-icon layui-icon-face-cry", "icon": "layui-icon layui-icon-face-cry",
"type": 1, "type": 1,
"openType": "_iframe", "openType": "_iframe",
"href": "view/document/notice.html" "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, "id": 2024,
"title": "加载组件", "title": "加载组件",
@@ -209,7 +195,7 @@
"icon": "layui-icon layui-icon-face-cry", "icon": "layui-icon layui-icon-face-cry",
"type": 1, "type": 1,
"openType": "_iframe", "openType": "_iframe",
"href": "view/document/encrypt.html" "href": "view/document/hash.html"
}, },
{ {
"id": 2042, "id": 2042,
@@ -342,7 +328,7 @@
"icon": "layui-icon layui-icon-face-cry", "icon": "layui-icon layui-icon-face-cry",
"type": 1, "type": 1,
"openType": "_iframe", "openType": "_iframe",
"href": "view/system/department.html" "href": "view/system/deptment.html"
}, },
{ {
"id": 605, "id": 605,
@@ -420,4 +406,4 @@
"href": "component/code/index.html" "href": "component/code/index.html"
}] }]
} }
] ]
+88
View File
@@ -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", "parentId": "0",
"icon": "layui-icon-set-fill", "icon": "layui-icon-set-fill",
"sort": 1, "sort": 1,
"enable": 1,
"checkArr": "0" "checkArr": "0"
}, { }, {
"powerId": "2", "powerId": "2",
@@ -24,7 +23,6 @@
"parentId": "1", "parentId": "1",
"icon": "layui-icon-username", "icon": "layui-icon-username",
"sort": null, "sort": null,
"enable": 1,
"checkArr": "0" "checkArr": "0"
}, { }, {
"powerId": "3", "powerId": "3",
@@ -36,7 +34,6 @@
"parentId": "1", "parentId": "1",
"icon": "layui-icon-user", "icon": "layui-icon-user",
"sort": null, "sort": null,
"enable": 1,
"checkArr": "0" "checkArr": "0"
}, { }, {
"powerId": "4", "powerId": "4",
+1
View File
@@ -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, "avatar": null,
"sex": "1", "sex": "1",
"phone": "1555324324234", "phone": "1555324324234",
"enable": "0", "enable": "1",
"login": "1", "login": "1",
"roleIds": null "roleIds": null
}, { }, {
@@ -115,4 +115,4 @@
"login": "1", "login": "1",
"roleIds": null "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"/> <animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="0 210 530" to="360 210 530" repeatCount="indefinite"/>
</path> </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)"> <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"/> <animateTransform attributeType="XML" attributeName="transform" begin="0s" dur="35s" type="rotate" from="-30 550 750" to="330 550 750" repeatCount="indefinite"/>
</rect> </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

File diff suppressed because one or more lines are too long
@@ -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}
File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long

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

File diff suppressed because one or more lines are too long
@@ -1,3 +1,4 @@
/** Buttom 默认*/
.pear-btn { .pear-btn {
display: inline-block; display: inline-block;
line-height: 38px; line-height: 38px;
@@ -24,6 +25,7 @@
opacity: .8; opacity: .8;
filter: alpha(opacity=80); filter: alpha(opacity=80);
color: #409eff; color: #409eff;
border-color: #c6e2ff;
background-color: #ECF5FF; background-color: #ECF5FF;
} }
@@ -35,23 +37,22 @@
line-height: 37px; line-height: 37px;
color: #fff !important color: #fff !important
} }
/** Button 主题 */ /** Button 主题 */
.pear-btn-primary { .pear-btn-primary {
border: #2D8CF0;
background-color: #2D8CF0 !important; background-color: #2D8CF0 !important;
border: #2D8CF0;
} }
.pear-btn-danger { .pear-btn-danger {
border: #f56c6c;
background-color: #f56c6c !important; background-color: #f56c6c !important;
border: #f56c6c;
} }
.pear-btn-warming { .pear-btn-warming {
border: #f6ad55;
background-color: #f6ad55 !important; background-color: #f6ad55 !important;
border: #f6ad55;
} }
.pear-btn-success { .pear-btn-success {
border: #36b368; background-color: #5FB878 !important;
background-color: #36b368 !important; border: #5FB878;
} }
.pear-btn[round] { .pear-btn[round] {
@@ -59,9 +60,9 @@
} }
.pear-btn-primary[plain] { .pear-btn-primary[plain] {
border: #409eff !important;
color: #409eff !important; color: #409eff !important;
background: #ecf5ff 10% !important; background: #ecf5ff 10% !important;
border-color: #b3d8ff !important;
} }
.pear-btn-primary[plain]:hover { .pear-btn-primary[plain]:hover {
@@ -70,20 +71,20 @@
} }
.pear-btn-success[plain] { .pear-btn-success[plain] {
border: #36b368 !important; color: #67c23a !important;
color: #36b368 !important;
background: #f0f9eb !important; background: #f0f9eb !important;
border-color: #c2e7b0 !important;
} }
.pear-btn-success[plain]:hover { .pear-btn-success[plain]:hover {
color: white !important; color: white !important;
background-color: #36b368 !important background-color: #67c23a !important
} }
.pear-btn-warming[plain] { .pear-btn-warming[plain] {
border: #e6a23c !important;
color: #e6a23c !important; color: #e6a23c !important;
background: #fdf6ec !important; background: #fdf6ec !important;
border-color: #f5dab1 !important;
} }
.pear-btn-warming[plain]:hover { .pear-btn-warming[plain]:hover {
@@ -92,9 +93,9 @@
} }
.pear-btn-danger[plain] { .pear-btn-danger[plain] {
border: #f56c6c !important;
color: #f56c6c !important; color: #f56c6c !important;
background: #fef0f0 !important; background: #fef0f0 !important;
border-color: #fbc4c4 !important;
} }
.pear-btn-danger[plain]:hover { .pear-btn-danger[plain]:hover {
@@ -69,25 +69,10 @@
margin-left: -10px; margin-left: -10px;
} }
.cloud-card-component { .pear-card-component {
padding: 20px; padding: 20px;
} }
.cloud-card-component .layui-table-click { .pear-card-component .layui-laypage .layui-laypage-curr .layui-laypage-em {
border-radius: 6px!important; border-radius: 0px !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;
}

Before

Width:  |  Height:  |  Size: 60 KiB

After

Width:  |  Height:  |  Size: 60 KiB

@@ -1,34 +1,29 @@
.layui-card-body .layui-form{ .layui-card-body .layui-form{
margin-top: 15px; margin-top: 15px;
} }
input::-webkit-input-placeholder, input::-webkit-input-placeholder,
textarea::-webkit-input-placeholder { textarea::-webkit-input-placeholder {
color: #ccc; color: #ccc;
} }
.layui-input:hover, .layui-input:hover,
.layui-textarea:hover, .layui-textarea:hover,
.layui-input:focus, .layui-input:focus,
.layui-textarea:focus { .layui-textarea:focus {
border-color: #eee; border-color: #eee;
} }
.layui-input:focus, .layui-input:focus,
.layui-textarea:focus { .layui-textarea:focus {
border-color: #5FB878 !important; border-color: #5FB878!important;
box-shadow: 0 0 0 3px #f0f9eb !important;
} }
.layui-input[success] { .layui-input[success] {
box-shadow: 0px 0px 0px 3px #f0f9eb !important; box-shadow: 0px 0px 3px 1px #5FB878 !important;
border: #5FB878 1px solid!important; border: #5FB878 1px solid!important;
} }
.layui-input[failure], .layui-input[failure] {
.layui-form-item .layui-form-danger:focus { box-shadow: 0px 0px 3px 1px #F56C6C;
box-shadow: 0px 0px 0px 3px #fef0f0 !important; border: #F56C6C 1px solid;
border: #F56C6C 1px solid!important;
} }
.layui-input, .layui-input,
@@ -33,15 +33,15 @@
.pear-frame .pear-frame-content { .pear-frame .pear-frame-content {
width: 100%; width: 100%;
height: calc(100% - 0px) !important; height: calc(100% - 45px) !important;
} }
.pear-frame-loading { .pear-frame-loading {
position: absolute; position: absolute;
display: none; display: none;
width: 100%; width: 100%;
height: calc(100% - 0px) !important; height: calc(100% - 45px) !important;
top: 0px; top: 42px;
z-index: 19; z-index: 19;
background-color: #fff 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; width: 230px;
} }
.pear-nav-tree .layui-nav-child {
padding-top: 5px;
padding-bottom: 5px;
}
.pear-nav-tree .layui-nav-child dd.layui-this, .pear-nav-tree .layui-nav-child dd.layui-this,
.layui-nav-tree .layui-nav-child dd.layui-this a, .layui-nav-tree .layui-nav-child dd.layui-this a,
.layui-nav-tree .layui-this, .layui-nav-tree .layui-this,
@@ -68,15 +73,7 @@
display: none; 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 { .pear-nav-mini {
@@ -111,11 +108,9 @@
.pear-nav-control.pc .layui-this * { .pear-nav-control.pc .layui-this * {
background-color: whitesmoke; background-color: whitesmoke;
} }
.pear-nav-control.pc *{ .pear-nav-control.pc *{
color: darkslategray!important; color: darkslategray!important;
} }
.pear-nav-control.pc .layui-nav-bar{ .pear-nav-control.pc .layui-nav-bar{
display: none!important; display: none!important;
} }
@@ -128,23 +123,15 @@
/** 隐 藏 后 子 级 悬 浮 菜 单 */ /** 隐 藏 后 子 级 悬 浮 菜 单 */
.pear-nav-tree .layui-nav-hover { .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; border-radius: 4px;
overflow: hidden; overflow: hidden;
background-color: #28333E; background-color: #28333E;
display: block; display: block;
position: fixed;
min-width: 130px;
margin-left: 62px;
padding-top: 4px !important;
padding-bottom: 4px !important;
box-shadow: 0px 0px 3px lightgray; box-shadow: 0px 0px 3px lightgray;
} }
.pear-nav-tree .layui-nav-hover a span { .pear-nav-tree .layui-nav-hover a span {
@@ -154,7 +141,7 @@
display: none; display: none;
} }
.pear-nav-tree .layui-nav-child dd a span { .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 { .pear-nav-tree .layui-nav-child dd a i {
display: none; display: none;
@@ -162,11 +149,10 @@
.pear-nav-tree .layui-nav-hover dd a span { .pear-nav-tree .layui-nav-hover dd a span {
margin-left: 0px !important; margin-left: 0px !important;
} }
.pear-nav-tree dl {
padding-top: 0;
padding-bottom: 0;
}
/** 亮 样 式*/ /** 亮 样 式*/
/** 亮 样 式*/
.dark-theme .layui-nav-tree{ .dark-theme .layui-nav-tree{
background-color: #28333E!important; background-color: #28333E!important;
} }
@@ -176,7 +162,6 @@
} }
.light-theme .pear-nav-tree, .light-theme .pear-nav-tree,
.light-theme .pear-nav-tree .layui-nav-hover:before,
.light-theme .pear-nav-tree .layui-nav-child{ .light-theme .pear-nav-tree .layui-nav-child{
background-color: white!important; background-color: white!important;
} }
@@ -192,6 +177,11 @@
border-bottom-color: dimgray!important; 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 a,
.light-theme .pear-nav-tree .layui-this{ .light-theme .pear-nav-tree .layui-this{
color: white!important; color: white!important;
@@ -247,21 +237,10 @@
width: 12px; width: 12px;
text-align: center; 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 { .pear-nav-tree.arrow .layui-nav-itemed>a>.layui-nav-more:before {
content: '\e61a'; content: '\e61a';
background-color: transparent;
display: inline-block; display: inline-block;
vertical-align: middle; 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 { div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span {
background-color: #5FB878!important; background-color: #5FB878!important
color: #FFF; color: #FFF;
border: 1px solid #5FB878!important border: 1px solid #5FB878!important
} }
div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i { div[xm-select-skin=primary] .xm-select-title div.xm-select-label>span i {
background-color: #5FB878!important; background-color: #5FB878!important
color: #FFF 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 { div[xm-select-skin=danger] .xm-select-title div.xm-select-label>span i {
background-color:#f56c6c!important; background-color:#f56c6c!important
color: #FFF color: #FFF
} }
@@ -820,3 +820,8 @@ div[xm-select-search-type="1"] .xm-select .xm-select-input {
.icon-expand:before { .icon-expand:before {
content: "\e641"; content: "\e641";
} }
.xm-select-parent .xm-form-select dl{
position: relative;
top: 5px!important;
}
@@ -47,6 +47,7 @@
border-right: 1px solid whitesmoke; border-right: 1px solid whitesmoke;
color: dimgray; color: dimgray;
font-size: 13.5px; font-size: 13.5px;
line-height: 43px;
} }
.pear-tab .layui-tab-title .layui-tab-bar { .pear-tab .layui-tab-title .layui-tab-bar {
@@ -18,13 +18,12 @@
} }
.layui-table-cell { .layui-table-cell {
height: 34px; height: 34px !important;
line-height: 34px; line-height: 34px !important;
} }
.layui-table .layui-laypage .layui-laypage-curr .layui-laypage-em { .layui-table .layui-laypage .layui-laypage-curr .layui-laypage-em {
border-radius: 50px !important; border-radius: 50px !important;
border-radius: 4px!important;
background-color: #5FB878 !important; background-color: #5FB878 !important;
} }
@@ -33,8 +32,8 @@
} }
.layui-table tr { .layui-table tr {
height: 34px; height: 34px !important;
line-height: 34px; line-height: 34px !important;
} }
.layui-table-cell { .layui-table-cell {
@@ -69,12 +68,6 @@
.layui-table-view .layui-table[lay-skin=line] { .layui-table-view .layui-table[lay-skin=line] {
border: none !important; border: none !important;
} }
.layui-table-init .layui-icon{
font-size: 40px !important;
margin: -15px 0 0 -15px;
}
.layui-table-body::-webkit-scrollbar { .layui-table-body::-webkit-scrollbar {
width: 0px; width: 0px;
height: 0px; height: 0px;

Some files were not shown because too many files have changed in this diff Show More