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](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
|
||||||
```
|
```
|
||||||
|
|||||||
@@ -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,9 +39,10 @@ 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,
|
'deptId': item.id,
|
||||||
'parentId': item.parent_id,
|
'parentId': item.parent_id,
|
||||||
@@ -54,12 +56,12 @@ class DepartmentsApi(MethodView):
|
|||||||
'address': item.address,
|
'address': item.address,
|
||||||
'create_at': item.create_at.strftime('%Y-%m-%d %H:%M:%S')
|
'create_at': item.create_at.strftime('%Y-%m-%d %H:%M:%S')
|
||||||
} for item in dept_data
|
} 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()
|
||||||
|
|||||||
@@ -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,
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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(',')
|
||||||
|
|||||||
@@ -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)
|
|
||||||
|
|||||||
@@ -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)
|
||||||
|
|||||||
@@ -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
|
@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')
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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():
|
||||||
|
|||||||
@@ -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
|
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')
|
||||||
|
|||||||
@@ -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')
|
||||||
|
|||||||
@@ -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 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')
|
||||||
|
|||||||
@@ -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
|
||||||
|
|
||||||
|
|||||||
@@ -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,6 +29,11 @@ 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;
|
||||||
@@ -93,11 +45,10 @@ body,
|
|||||||
|
|
||||||
.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-logo {
|
||||||
|
background-color: white !important;
|
||||||
|
color: black !important;
|
||||||
|
}
|
||||||
|
|
||||||
|
.light-theme .layui-side-scroll {
|
||||||
|
background-color: white !important;
|
||||||
|
color: black !important;
|
||||||
|
}
|
||||||
|
|
||||||
.light-theme .layui-side {
|
.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;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* 搜索面板结束 */
|
|
||||||
@@ -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;
|
||||||
@@ -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;
|
||||||
@@ -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,
|
"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,
|
||||||
@@ -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",
|
||||||
@@ -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
|
||||||
}, {
|
}, {
|
||||||
|
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 |
@@ -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 {
|
.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;
|
||||||