From 3dcdf8e1a3069217116c355e6d2851b0f5834898 Mon Sep 17 00:00:00 2001 From: mkg <1650473152@qq.com> Date: Fri, 19 Mar 2021 22:20:45 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=87=E6=BB=A4=E6=9F=A5=E8=AF=A2=EF=BC=8C?= =?UTF-8?q?=E5=AE=8C=E5=96=84=E5=9F=BA=E7=A1=80=E5=8A=9F=E8=83=BD=EF=BC=8C?= =?UTF-8?q?=E8=A7=A3=E5=86=B3unicode=E7=BC=96=E7=A0=81=E9=97=AE=E9=A2=98?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E7=A3=81=E7=9B=98=E7=9B=91=E6=8E=A7?= =?UTF-8?q?=E5=AF=B9=E4=BA=8Edocker=E5=AE=B9=E5=99=A8=E7=9A=84=E5=88=A4?= =?UTF-8?q?=E6=96=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- applications/config/common.py | 1 + applications/models/admin.py | 2 +- applications/service/admin/power.py | 28 ++- applications/service/admin/role.py | 44 +++- applications/service/admin/user.py | 12 +- applications/views/admin/index.py | 2 +- applications/views/admin/monitor.py | 29 +-- applications/views/admin/power.py | 17 +- applications/views/admin/role.py | 112 ++++------ applications/views/admin/user.py | 9 +- migrations/versions/58fc2c4c30a5_.py | 28 +++ migrations/versions/715a8ecc5856_.py | 28 +++ static/admin/config/pear.config.yml | 2 +- .../6958819_pear-admin_1607443454_1.png | Bin 0 -> 2204 bytes static/upload/png | Bin 8950 -> 0 bytes templates/admin/power/edit.html | 202 ++++++++++++++++++ templates/admin/power/main.html | 2 +- templates/admin/role/add.html | 2 +- templates/admin/role/edit.html | 105 +++++++++ templates/admin/role/main.html | 2 +- 20 files changed, 513 insertions(+), 114 deletions(-) create mode 100644 migrations/versions/58fc2c4c30a5_.py create mode 100644 migrations/versions/715a8ecc5856_.py create mode 100644 static/upload/6958819_pear-admin_1607443454_1.png delete mode 100644 static/upload/png create mode 100644 templates/admin/power/edit.html create mode 100644 templates/admin/role/edit.html diff --git a/applications/config/common.py b/applications/config/common.py index 7e9d77a..b4e026d 100644 --- a/applications/config/common.py +++ b/applications/config/common.py @@ -6,3 +6,4 @@ SECRET_KEY = 'pear-admin-flask' UPLOADED_PHOTOS_DEST = 'static/upload' UPLOADED_FILES_ALLOW = ['gif','jpg'] +JSON_AS_ASCII = False \ No newline at end of file diff --git a/applications/models/admin.py b/applications/models/admin.py index c82638b..0b861ec 100644 --- a/applications/models/admin.py +++ b/applications/models/admin.py @@ -37,7 +37,7 @@ class Role(db.Model): id = db.Column(db.Integer, primary_key=True, comment='角色ID') name = db.Column(db.String(255), comment='角色名称') code = db.Column(db.String(255), comment='角色标识') - enable = db.Column(db.CHAR(1), comment='是否启用') + enable = db.Column(db.Integer, comment='是否启用') remark = db.Column(db.String(255), comment='备注') details = db.Column(db.String(255), comment='详情') sort = db.Column(db.Integer, comment='排序') diff --git a/applications/service/admin/power.py b/applications/service/admin/power.py index b0faf57..bd177b7 100644 --- a/applications/service/admin/power.py +++ b/applications/service/admin/power.py @@ -28,6 +28,7 @@ def get_power_dict(): return power_dict +# 选择父节点 def select_parent(): power = Power.query.all() power_schema = PowerSchema(many=True) @@ -36,6 +37,7 @@ def select_parent(): return power_dict +# 增加权限 def save_power(req): icon = req.get("icon") openType = req.get("openType") @@ -44,6 +46,7 @@ def save_power(req): powerName = req.get("powerName") powerType = req.get("powerType") powerUrl = req.get("powerUrl") + sort = req.get("sort") power = Power( icon=icon, open_type=openType, @@ -51,13 +54,36 @@ def save_power(req): code=powerCode, name=powerName, type=powerType, - url=powerUrl + url=powerUrl, + sort=sort ) r = db.session.add(power) db.session.commit() return r +# 根据id查询权限 +def get_power_by_id(id): + p = Power.query.filter_by(id=id).first() + return p + + +# 更新角色 +def update_power(req_json): + id = req_json.get("roleId") + data = { + "code": req_json.get("roleCode"), + "name": req_json.get("roleName"), + "sort": req_json.get("sort"), + "enable": req_json.get("enable"), + "details": req_json.get("details") + } + print(data) + role = Role.query.filter_by(id=id).update(data) + db.session.commit() + return role + + # 删除权限(目前没有判断父节点自动删除子节点) def remove_power(id): power = Power.query.filter_by(id=id).first() diff --git a/applications/service/admin/role.py b/applications/service/admin/role.py index 281cd5b..af24b48 100644 --- a/applications/service/admin/role.py +++ b/applications/service/admin/role.py @@ -1,5 +1,6 @@ from flask_marshmallow import Marshmallow from marshmallow import fields +from sqlalchemy import and_ from applications.models import db from applications.models.admin import Role, Power @@ -33,25 +34,24 @@ class PowerSchema(ma.Schema): # 序列化类 enable = fields.Integer() -''' -获取用户的sqlalchemy对象 -分页器 -''' - - -def get_role_data(page, limit): - role = Role.query.paginate(page=page, per_page=limit, error_out=False) +# 获取角色对象 +def get_role_data(page, limit, filters): + role = Role.query.filter(and_(*[getattr(Role, k).like(v) for k, v in filters.items()])).paginate(page=page, + per_page=limit, + error_out=False) count = Role.query.count() return role, count -def get_role_data_dict(page, limit): - role, count = get_role_data(page, limit) +# 获取角色dict +def get_role_data_dict(page, limit, filters): + role, count = get_role_data(page, limit, filters) role_schema = RoleSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类 output = role_schema.dump(role.items) # 生成可序列化对象 return output, count +# 增加角色 def add_role(req): details = req.get("details") enable = req.get("enable") @@ -69,6 +69,29 @@ def add_role(req): db.session.commit() +# 通过id获取角色 +def get_role_by_id(id): + r = Role.query.filter_by(id=id).first() + return r + + +# 更新角色 +def update_role(req_json): + id =req_json.get("roleId") + data ={ + "code":req_json.get("roleCode"), + "name":req_json.get("roleName"), + "sort":req_json.get("sort"), + "enable":req_json.get("enable"), + "details":req_json.get("details") + } + print(data) + role = Role.query.filter_by(id=id).update(data) + db.session.commit() + return role + + +# 获取角色的权限 def get_role_power(id): role = Role.query.filter_by(id=id).first() check_powers = role.power @@ -86,6 +109,7 @@ def get_role_power(id): return output +# 更新角色权限 def update_role_power(id, power_list): role = Role.query.filter_by(id=id).first() power_id_list = [] diff --git a/applications/service/admin/user.py b/applications/service/admin/user.py index 8b17c73..29f16ac 100644 --- a/applications/service/admin/user.py +++ b/applications/service/admin/user.py @@ -2,6 +2,7 @@ from flask import jsonify from flask_login import current_user from flask_marshmallow import Marshmallow from marshmallow import fields +from sqlalchemy import and_ from sqlalchemy.sql import exists from applications.models import db @@ -27,8 +28,8 @@ class UserSchema(ma.Schema): ''' -def get_user_data(page, limit): - user = User.query.paginate(page=page, per_page=limit, error_out=False) +def get_user_data(page, limit,filters): + user = User.query.filter(and_(*[getattr(User, k).like(v) for k,v in filters.items()])).paginate(page=page, per_page=limit, error_out=False) count = User.query.count() return user, count @@ -39,8 +40,8 @@ def get_user_data(page, limit): ''' -def get_user_data_dict(page, limit): - user, count = get_user_data(page, limit) +def get_user_data_dict(page, limit, filters): + user, count = get_user_data(page, limit,filters) user_schema = UserSchema(many=True) # 用已继承ma.ModelSchema类的自定制类生成序列化类 output = user_schema.dump(user.items) # 生成可序列化对象 return output, count @@ -104,10 +105,7 @@ def update_user_role(id, roles_list): user = User.query.filter_by(id=id).first() roles_id = [] for role in user.role: - print(role) roles_id.append(role.id) - print('---------------------') - print(roles_id) roles = Role.query.filter(Role.id.in_(roles_id)).all() for r in roles: user.role.remove(r) diff --git a/applications/views/admin/index.py b/applications/views/admin/index.py index e0c830d..ea266b9 100644 --- a/applications/views/admin/index.py +++ b/applications/views/admin/index.py @@ -14,7 +14,7 @@ ma = Marshmallow() # 首页 @admin_index.route('/') -@PreAuthorize('index:index') +@login_required def index(): username = current_user.username return render_template('admin/index.html', username=username) diff --git a/applications/views/admin/monitor.py b/applications/views/admin/monitor.py index aef0818..5fa1f0b 100644 --- a/applications/views/admin/monitor.py +++ b/applications/views/admin/monitor.py @@ -1,3 +1,4 @@ +import os import platform import re from datetime import datetime @@ -43,20 +44,22 @@ def index(): memory_total = str(round(memory_information.total / 1024 / 1024)) memory_free = str(round(memory_information.free / 1024 / 1024)) # 磁盘信息 - disk_partitions = psutil.disk_partitions() - disk_partitions_list = [] - for i in disk_partitions: - a = psutil.disk_usage(i.device) - disk_partitions_dict = { - 'device': i.device, - 'fstype': i.fstype, - 'total': str(round(a.total / 1024 / 1024)), - 'used': str(round(a.used / 1024 / 1024)), - 'free': str(round(a.free / 1024 / 1024)), - 'percent': a.percent - } - disk_partitions_list.append(disk_partitions_dict) + disk_partitions_list = [] + # 判断是否在容器中 + if not os.path.exists('/.dockerenv'): + disk_partitions = psutil.disk_partitions() + for i in disk_partitions: + a = psutil.disk_usage(i.device) + disk_partitions_dict = { + 'device': i.device, + 'fstype': i.fstype, + 'total': str(round(a.total / 1024 / 1024)), + 'used': str(round(a.used / 1024 / 1024)), + 'free': str(round(a.free / 1024 / 1024)), + 'percent': a.percent + } + disk_partitions_list.append(disk_partitions_dict) # 开机时间 boot_time = datetime.fromtimestamp(psutil.boot_time()).replace(microsecond=0) diff --git a/applications/views/admin/power.py b/applications/views/admin/power.py index b446f53..326912b 100644 --- a/applications/views/admin/power.py +++ b/applications/views/admin/power.py @@ -1,6 +1,6 @@ from flask import Blueprint, render_template, request, jsonify from flask_login import login_required -from applications.service.admin.power import get_power_dict, select_parent, save_power, remove_power +from applications.service.admin.power import get_power_dict, select_parent, save_power, remove_power, get_power_by_id admin_power = Blueprint('adminPower', __name__, url_prefix='/admin/power') @@ -52,3 +52,18 @@ def remove(id): return jsonify(success=True, msg="删除成功") else: return jsonify(success=False, msg="删除失败") + +# 权限编辑 +@admin_power.route('/edit/', methods=['GET', 'POST']) +def edit(id): + power = get_power_by_id(id) + return render_template('admin/power/edit.html',power=power) + + +# 权限更新 +@admin_power.route('/update', methods=['PUT']) +def update(): + res = update_role(request.json) + if not res: + return jsonify(success=False, msg="更新角色失败") + return jsonify(success=True, msg="更新角色成功") diff --git a/applications/views/admin/role.py b/applications/views/admin/role.py index eaa4b0a..7ccd6ec 100644 --- a/applications/views/admin/role.py +++ b/applications/views/admin/role.py @@ -1,7 +1,8 @@ from flask import Blueprint, render_template, request, jsonify from flask_login import login_required -from applications.service.admin.role import get_role_data_dict, add_role, get_role_power, update_role_power +from applications.service.admin.role import get_role_data_dict, add_role, get_role_power, update_role_power, \ + get_role_by_id, update_role admin_role = Blueprint('adminRole', __name__, url_prefix='/admin/role') @@ -13,20 +14,20 @@ def index(): return render_template('admin/role/main.html') -# @admin_role.route('/test') -# @login_required -# def test(): -# return jsonify(current_user.role) - -# 用户 分页查询 - - +# 表格数据 @admin_role.route('/data') @login_required def table(): page = request.args.get('page', type=int) limit = request.args.get('limit', type=int) - data, count = get_role_data_dict(page=page, limit=limit) + roleName = request.args.get('roleName', type=str) + roleCode = request.args.get('roleCode', type=str) + filters = {} + if roleName: + filters["name"] = ('%' + roleName + '%') + if roleCode: + filters["code"] = ('%' + roleCode + '%') + data, count = get_role_data_dict(page=page, limit=limit, filters=filters) res = { 'msg': "", 'code': 0, @@ -45,6 +46,7 @@ def add(): return render_template('admin/role/add.html') +# 角色增加 @admin_role.route('/save', methods=['POST']) @login_required def save(): @@ -53,89 +55,49 @@ def save(): return jsonify(msg="成功", success=True) +# 角色授权 @admin_role.route('/power/') def power(id): return render_template('admin/role/power.html', id=id) +# 获取角色权限 @admin_role.route('/getRolePower/') def getRolePower(id): powers = get_role_power(id) res = { "data": powers, - "status":{"code": 200, "message": "默认"} + "status": {"code": 200, "message": "默认"} } return jsonify(res) -@admin_role.route('/saveRolePower',methods=['PUT']) + +# 保存角色权限 +@admin_role.route('/saveRolePower', methods=['PUT']) def saveRolePower(): - req_form =request.form - powerIds=req_form.get("powerIds") - power_list=powerIds.split(',') - roleId=req_form.get("roleId") - update_role_power(id=roleId,power_list=power_list) - return jsonify(success=True,msg="授权成功") - -# @admin_user.route('/delete', methods=['POST']) -# @login_required -# def delete(): -# id = request.form.get('id') -# user = delete_by_id() -# db.session.commit() -# if user: -# return jsonify(msg="删除成功", code=200) -# else: -# return jsonify(msg="删除失败", code=999) -# - -# 编辑用户 -# @admin_user.route('/edit/', methods=['GET', 'POST']) -# @login_required -# def update(id): -# if request.method == 'POST': -# username = request.form.get('username') -# password = request.form.get('password') -# role = request.form.get('role') -# if username and role: -# if password is None: -# if User.query.filter_by(id=id).first() is not None: -# update_user(id,username) -# return jsonify(msg="修改成功", code=200) -# -# else: -# res = {"msg": "用户已经存在", "code": 200} -# return jsonify(res) -# else: -# user = User.query.filter_by(id=id).first() -# if user is not None: -# User.query.filter_by(id=id).update({'username': username, 'role': role}) -# user.set_password(password) -# db.session.commit() -# return jsonify(msg="修改成功", code=200) -# else: -# return jsonify(msg="用户不存在", code=200) -# -# else: -# -# return jsonify(msg="用户名密码角色不能为空", code=999) -# else: -# role = ['管理员', '普通用户'] -# user = User.query.filter_by(id=id).first() -# return render_template('admin/user_edit.html', user=user, role=role) + req_form = request.form + powerIds = req_form.get("powerIds") + power_list = powerIds.split(',') + roleId = req_form.get("roleId") + update_role_power(id=roleId, power_list=power_list) + return jsonify(success=True, msg="授权成功") -# 更新用户状态 -# @admin_user.route('/update/status', methods=['POST']) -# @login_required -# def ustatus(): -# id = request.form.get('id') -# status = request.form.get('status') -# if id and status: -# res = update_status(status=status) -# return res -# return jsonify(msg="出错啦", code=999) +# 角色编辑 +@admin_role.route('/edit/', methods=['GET', 'POST']) +def edit(id): + role = get_role_by_id(id) + return render_template('admin/role/edit.html', role=role) +# 更新角色 +@admin_role.route('/update', methods=['PUT']) +def update(): + res = update_role(request.json) + if not res: + return jsonify(success=False, msg="更新角色失败") + return jsonify(success=True, msg="更新角色成功") + # 批量删除 # @admin_user.route('/batchRemove', methods=['GET', 'POST']) # @login_required diff --git a/applications/views/admin/user.py b/applications/views/admin/user.py index 10bd60d..506bdb5 100644 --- a/applications/views/admin/user.py +++ b/applications/views/admin/user.py @@ -21,7 +21,14 @@ def index(): def data(): page = request.args.get('page', type=int) limit = request.args.get('limit', type=int) - data, count = get_user_data_dict(page=page, limit=limit) + realName = request.args.get('realName', type=str) + username = request.args.get('username',type=str) + filters = {} + if realName: + filters["realname"]=('%'+realName+'%') + if username: + filters["username"]=('%'+username+'%') + data, count = get_user_data_dict(page=page, limit=limit, filters=filters) res = { 'msg': "", 'code': 0, diff --git a/migrations/versions/58fc2c4c30a5_.py b/migrations/versions/58fc2c4c30a5_.py new file mode 100644 index 0000000..289a8af --- /dev/null +++ b/migrations/versions/58fc2c4c30a5_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 58fc2c4c30a5 +Revises: 715a8ecc5856 +Create Date: 2021-03-19 21:31:06.761526 + +""" +from alembic import op +import sqlalchemy as sa + + +# revision identifiers, used by Alembic. +revision = '58fc2c4c30a5' +down_revision = '715a8ecc5856' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admin_role', sa.Column('enable', sa.Integer(), nullable=True, comment='是否启用')) + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admin_role', 'enable') + # ### end Alembic commands ### diff --git a/migrations/versions/715a8ecc5856_.py b/migrations/versions/715a8ecc5856_.py new file mode 100644 index 0000000..ede2495 --- /dev/null +++ b/migrations/versions/715a8ecc5856_.py @@ -0,0 +1,28 @@ +"""empty message + +Revision ID: 715a8ecc5856 +Revises: 64de3323bc01 +Create Date: 2021-03-19 21:30:52.200812 + +""" +from alembic import op +import sqlalchemy as sa +from sqlalchemy.dialects import mysql + +# revision identifiers, used by Alembic. +revision = '715a8ecc5856' +down_revision = '64de3323bc01' +branch_labels = None +depends_on = None + + +def upgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.drop_column('admin_role', 'enable') + # ### end Alembic commands ### + + +def downgrade(): + # ### commands auto generated by Alembic - please adjust! ### + op.add_column('admin_role', sa.Column('enable', mysql.CHAR(collation='utf8_unicode_ci', length=1), nullable=True, comment='是否启用')) + # ### end Alembic commands ### diff --git a/static/admin/config/pear.config.yml b/static/admin/config/pear.config.yml index c2be9d5..3f2d97f 100644 --- a/static/admin/config/pear.config.yml +++ b/static/admin/config/pear.config.yml @@ -4,7 +4,7 @@ logo: ## 网站名称 title: "Pear Admin" ## 网站图标 - image: "admin/admin/images/logo.png" + image: "/static/admin/admin/images/logo.png" ## 菜单配置 menu: ## 菜单数据来源 diff --git a/static/upload/6958819_pear-admin_1607443454_1.png b/static/upload/6958819_pear-admin_1607443454_1.png new file mode 100644 index 0000000000000000000000000000000000000000..048643a8199143ecb3ab068f0f22db93f52c986d GIT binary patch literal 2204 zcmXw33pkW%8~!j3rEE?WQDJJ3D~ueHi#294!ytopNOo+L-F9=hYE_n0IuL)1Gs{oE z>_*vj$k4P7i7`Z?loe9OVVJ=*F^==U?>D-xciwrQ`?=ryxu56zW)hEix^CU9yBR@{ ztrRkm2EIe!M@0ebt`4E65kvtwM)f7RMo^_(tBqBsCy)I8JK+vNB}f1V zE*_=;0iIE$4TPAD6vzT5$kr=C8YG~hj1P9%0yGpsa*2SmF4KWkpgsg^F^~W~$jn%7 zgpi4md3armg+O6OMsazL$g@c!N00fU@5}^)k z6WB)Wq1B<88f2q7M3e!73<{i~C8CrCUjW#9Hdw&9A{<>iM5MLolLDa( zgjdi`fdY^P7r_DT9Zm^^EM@et@wh=#A6l%XZRjIz)R8vm$_zjM$5!iig3*7S(V4rT zBGAd9drs4>hqMa_U5z&AB)^UVDx#5U@d=@LZDws*D4viA7R2J&qca^U`*|zF>mtn?^TPGO#g$?{Pa+D@ z>|9!%vyzx{oh3u-y(1En=~X$Z%JipowQ*Ix@$&J{Gpb*Ns)1`iuV`8nE5+1u*iOpYooOF-V zCq3TV5@V40{@(ZA?z4h1p5~GAP|~7~B&8(2qUQ`_kiXpi1{Xxwg?*)UNz|{|l#d{o z?_jpZuEH{KRr%5vy?$mKauiFX4<<_a@jG1N{@iBO(t~OLuK!B(nrI96V~*y zM_F3-VRsB;=vjD-mTBGMaLnwD80kFO$Ly!L#ufS5{_O0hVnw@!SWnNmrD0n~+~W9f z4AWQ(j}J~?nNu)|*JhEtqlU9^=1Mk>8XnxG|1GQ>wuq}Tn>x!>NJ&ZYW;#5PpWv`g zbUPm#f=vk{fDtDlnIX8op$jw18cmn0$lQXU{dUr{ErzOB>D;YVSf=HaAtob;I>7BesFvnt z^T_Noa@`?OH)X$fpTn-+)cUS%)(hM3+`JQej>udZ9CpVzY!BVS;Q0EU=H!epce|+P zmi(PDDyTSU!k#X|<|&xF6De^fp{!rc_cUYgw4~SB6v(~*GF`iKAEWX>z1Evk-0;!t z_fo_9WyN4_&D->sm^jaKLgkE0%aQcwZKP>c3085tv~``+=cN)J)K{9WlNNSH@?@G3 zBEiaabRSPJn!lE?DStO}Al5_v)H9-)js`(ADzPtrmq-4G*Dn|Nj^5|%V*R#fe$6Yv=@~Be&7P^rq66;x6U#2ymmM~`o^OA%L7NcO z@ppI6&Nlvoz>^-Ni3pMkrK6!IS*QGuDmPNAquKl`F77_I&tjXUu5y%x*p|RHI8}&c zHVfu!FFNsSE~@eTGU>nYDu*=4uX!dydc1>jM78BUQd0E2iWy7YYwgTG-G;GD)8oBE z`d6`E{DZk=yzzkQfxyAq7m-_v`u6R8ljD1Ja&IolZwA{HP}d)r|2W{HcHxpJtjKT{ zXZ?|?pZw>*B=$%Dyu415-#dr%9G}Ax7rLL!HN5;TWGOYc;OduzZ<+JXv47lkA;{Zs z9Lq+1hs8$Hd%OY55E$3~51!(Ta{vGU literal 0 HcmV?d00001 diff --git a/static/upload/png b/static/upload/png deleted file mode 100644 index 43c38d698652ed23924e8360db2880c1a1eb135d..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 8950 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 LQkJX|Hx2$@!W + + + 权限编辑 + + +
+
+
+
+
+ +
+ +
+
+
+ +
+
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/templates/admin/power/main.html b/templates/admin/power/main.html index e1a913c..9d82e09 100644 --- a/templates/admin/power/main.html +++ b/templates/admin/power/main.html @@ -206,7 +206,7 @@ title: '修改', shade: 0.1, area: ['450px', '500px'], - content: MODULE_PATH + 'edit?powerId=' + obj.data['powerId'] + content: MODULE_PATH + 'edit/' + obj.data['powerId'] }); } diff --git a/templates/admin/role/add.html b/templates/admin/role/add.html index 0efee37..48ddba7 100644 --- a/templates/admin/role/add.html +++ b/templates/admin/role/add.html @@ -1,7 +1,7 @@ - 用户新增 + 角色新增 diff --git a/templates/admin/role/edit.html b/templates/admin/role/edit.html new file mode 100644 index 0000000..2e6dda9 --- /dev/null +++ b/templates/admin/role/edit.html @@ -0,0 +1,105 @@ + + + + 角色编辑 + + +
    +
    +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    + +
    + + +
    +
    +
    + +
    + +
    +
    +
    + +
    + +
    +
    +
    +
    +
    +
    +
    + + +
    +
    +
    + + + + + + + + \ No newline at end of file diff --git a/templates/admin/role/main.html b/templates/admin/role/main.html index e547ff6..003fdd6 100644 --- a/templates/admin/role/main.html +++ b/templates/admin/role/main.html @@ -175,7 +175,7 @@ title: '修改', shade: 0.1, area: ['500px', '500px'], - content: MODULE_PATH + 'edit?roleId=' + obj.data['roleId'] + content: MODULE_PATH + 'edit/' + obj.data['id'] }); }