Commit ddda8b89 authored by wanli's avatar wanli

update

parent 883c66c3
...@@ -37,7 +37,7 @@ frontend/dist ...@@ -37,7 +37,7 @@ frontend/dist
backend/logs/*.log backend/logs/*.log
backend/logs/*.log.* backend/logs/*.log.*
backend/nohup.out backend/nohup.out
backend/scheduler.db backend/app-store.db
backend/*.db-journal backend/*.db-journal
backend/backup/* backend/backup/*
backend/upload/ backend/upload/
......
No preview for this file type
...@@ -67,6 +67,13 @@ class SignalManager(object): ...@@ -67,6 +67,13 @@ class SignalManager(object):
actionGetDownloadList = PySignal() actionGetDownloadList = PySignal()
actionUpdateDownload = PySignal() actionUpdateDownload = PySignal()
# 系统菜单
actionAddMenu = PySignal()
actionDeleteMenu = PySignal()
actionGetMenu = PySignal()
actionGetMenuList = PySignal()
actionUpdateMenu = PySignal()
def __init__(self): def __init__(self):
super(SignalManager, self).__init__() super(SignalManager, self).__init__()
......
...@@ -9,6 +9,7 @@ from .login_manager import loginManager ...@@ -9,6 +9,7 @@ from .login_manager import loginManager
from .annex_manager import annexManager from .annex_manager import annexManager
from .upload_manager import uploadManager from .upload_manager import uploadManager
from .apps_manager import appsManager from .apps_manager import appsManager
from .menu_manager import menuManager
from .download_manager import downloadManager from .download_manager import downloadManager
from .framework_manager import frameworkManager from .framework_manager import frameworkManager
from .build_logs_manager import buildLogsManager from .build_logs_manager import buildLogsManager
...@@ -66,4 +67,11 @@ def initConnect(): ...@@ -66,4 +67,11 @@ def initConnect():
signalManager.actionGetDownloadList.connect(downloadManager.getList) signalManager.actionGetDownloadList.connect(downloadManager.getList)
signalManager.actionUpdateDownload.connect(downloadManager.update) signalManager.actionUpdateDownload.connect(downloadManager.update)
# 系统菜单
signalManager.actionAddMenu.connect(menuManager.add)
signalManager.actionDeleteMenu.connect(menuManager.delete)
signalManager.actionGetMenu.connect(menuManager.get)
signalManager.actionGetMenuList.connect(menuManager.getList)
signalManager.actionUpdateMenu.connect(menuManager.update)
initConnect() initConnect()
\ No newline at end of file
...@@ -11,26 +11,25 @@ from datetime import datetime ...@@ -11,26 +11,25 @@ from datetime import datetime
from pony.orm import * from pony.orm import *
from flask import request from flask import request
from model import fullStackDB from model import fullStackDB
from model.summary import Summary from model.menu import Menu
from model.user import User from model.user import User
from utils import sql_filter from utils import sql_filter
logger = logging.getLogger("SummaryManager") logger = logging.getLogger("MenuManager")
class SummaryManager(object): class MenuManager(object):
def __init__(self): def __init__(self):
super(SummaryManager, self).__init__() super(MenuManager, self).__init__()
def add(self, data): def add(self, data):
# 判断角色名是否存在
result = Summary.get(name=data.get("name"))
if result:
return False, "summary name has been exists."
editor = User.get(id=request.current_user.get("id")) editor = User.get(id=request.current_user.get("id"))
if not editor: if not editor:
return False, "current user is not exists" return False, "current user is not exists"
result = Menu.get(path=data.get("path"))
if result:
return False, "menu path has been exists."
data.update({ data.update({
'create_by': editor, 'create_by': editor,
'create_at': datetime.now(), 'create_at': datetime.now(),
...@@ -38,22 +37,22 @@ class SummaryManager(object): ...@@ -38,22 +37,22 @@ class SummaryManager(object):
'update_at': datetime.now(), 'update_at': datetime.now(),
}) })
result = fullStackDB.add(Summary, **data) result = fullStackDB.add(Menu, **data)
return result, "add summary {}.".format("success" if result else "fail") return result, "add menu {}.".format("success" if result else "fail")
def delete(self, uuid): def delete(self, uuid):
editor = User.get(id=request.current_user.get("id")) editor = User.get(id=request.current_user.get("id"))
if not editor: if not editor:
return False, "current user is not exists" return False, "current user is not exists"
result = fullStackDB.update(Summary, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor) result = fullStackDB.update(Menu, { 'uuid': uuid }, is_delete=True, delete_at=datetime.now(), delete_by=editor)
return result, "delete summary {}.".format("success" if result else "fail") return result, "delete menu {}.".format("success" if result else "fail")
def get(self, data): def get(self, data):
result = Summary.get(**data) result = Menu.get(**data)
if result: if result:
result = result.to_dict(only=["uuid", "name", "create_at", "update_at"]) result = result.to_dict(only=["uuid", "name", "create_at", "update_at"])
return result, "get summary {}.".format("success" if result else "no data") return result, "get menu {}.".format("success" if result else "no data")
def getList(self, data): def getList(self, data):
if not data or len(data) <= 0: if not data or len(data) <= 0:
...@@ -71,17 +70,17 @@ class SummaryManager(object): ...@@ -71,17 +70,17 @@ class SummaryManager(object):
temp.setdefault("is_delete", False) temp.setdefault("is_delete", False)
if "scope_type" in data and data.get("scope_type") == "list": if "scope_type" in data and data.get("scope_type") == "list":
result = Summary.select().where(**temp).order_by(desc(Summary.create_at)) result = Menu.select().where(**temp).order_by(desc(Menu.create_at))
temp = [] temp = []
fields = ["uuid", "name"] fields = ["uuid", "name"]
if "props" in data and isinstance(data.get("props"), list): if "props" in data and isinstance(data.get("props"), list):
fields = data.get("props") fields = data.get("props")
for item in result: for item in result:
temp.append(item.to_dict(only=fields)) temp.append(item.to_dict(only=fields))
return temp, len(temp), "get summary {}.".format("success" if temp else "fail") return temp, len(temp), "get menu {}.".format("success" if temp else "fail")
result = fullStackDB.pagination(Summary, Summary.create_at, pagenum=data.get("pagenum", 1), pagesize=data.get("pagesize", 10), **temp) result = fullStackDB.pagination(Menu, Menu.create_at, pagenum=data.get("pagenum", 1), pagesize=data.get("pagesize", 10), **temp)
count = fullStackDB.count(Summary, **temp) count = fullStackDB.count(Menu, **temp)
if result and len(result): if result and len(result):
temp = [] temp = []
...@@ -94,7 +93,7 @@ class SummaryManager(object): ...@@ -94,7 +93,7 @@ class SummaryManager(object):
temp.append(t) temp.append(t)
result = temp result = temp
return result, count, "get summary {}.".format("success" if result else "no data") return result, count, "get menu {}.".format("success" if result else "no data")
def update(self, uuid, data): def update(self, uuid, data):
# 当参数为空时,直接返回错误 # 当参数为空时,直接返回错误
...@@ -106,7 +105,7 @@ class SummaryManager(object): ...@@ -106,7 +105,7 @@ class SummaryManager(object):
if not editor: if not editor:
return False, "current user is not exists" return False, "current user is not exists"
result = fullStackDB.update(Summary, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data) result = fullStackDB.update(Menu, { 'uuid': uuid }, update_at=datetime.now(), update_by=editor, **data)
return result, "update summary {}.".format("success" if result else "fail") return result, "update menu {}.".format("success" if result else "fail")
summaryManager = SummaryManager() menuManager = MenuManager()
...@@ -94,7 +94,7 @@ class UserManager(object): ...@@ -94,7 +94,7 @@ class UserManager(object):
user = User.get(uuid=uuid) user = User.get(uuid=uuid)
if user: if user:
user.set(update_at=datetime.now(), update_by=editor.id, **data) user.set(update_at=datetime.now(), update_by=editor.id, **data)
result = user.to_dict(only=["account", "gender", "birthday", "hometown", "phone", "email",]) result = user.to_dict(only=["account", "gender", "birthday", "phone", "email",])
if result.get("birthday"): if result.get("birthday"):
result.update({ "birthday": result.get("birthday").strftime("%Y-%m-%d") }) result.update({ "birthday": result.get("birthday").strftime("%Y-%m-%d") })
return result, "update user success" return result, "update user success"
...@@ -105,9 +105,29 @@ class UserManager(object): ...@@ -105,9 +105,29 @@ class UserManager(object):
''' '''
查询单用户 查询单用户
''' '''
result = User.get(id=request.current_user.get("id"), is_delete=False) result = User.get(id=request.current_user.get("id"), is_delete=False)
if result: if result:
temp = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "phone", "email", "gender", "create_at", "update_at"]) # 根据用户账号类型,返回不同的菜单
menus = [
{'id': 1, 'path': '/', 'name': None, 'redirect': '/home', 'component': 'Layout', 'title': None, 'icon': None, 'parent_id': 0},
{'id': 2, 'path': 'home', 'name': 'AppIndex', 'redirect': None, 'component': 'Home', 'title': '应用管理', 'icon': 'gongzuotai', 'parent_id': 1},
{'id': 3, 'path': '/', 'name': None, 'redirect': '/build', 'component': 'Layout', 'title': None, 'icon': None, 'parent_id': 0},
{'id': 4, 'path': 'build', 'name': 'AppBuild', 'redirect': None, 'component': 'Build', 'title': '打包日志', 'icon': 'gongzuotai', 'parent_id': 3},
{'id': 5, 'path': '/', 'name': None, 'redirect': '/profile', 'component': 'Layout', 'title': None, 'icon': None, 'parent_id': 0},
{'id': 6, 'path': 'profile', 'name': 'Profile', 'redirect': None, 'component': 'Profile', 'title': '个人中心', 'icon': 'shangcheng', 'parent_id': 5},
]
if result.role == "ADMIN":
menus = menus + [
{'id': 7, 'path': '/', 'name': None, 'redirect': '/download', 'component': 'Layout', 'title': None, 'icon': None, 'parent_id': 0},
{'id': 8, 'path': 'download', 'name': 'Download', 'redirect': None, 'component': 'Download', 'title': '下载记录', 'icon': 'gongzuotai', 'parent_id': 7},
{'id': 9, 'path': '/', 'name': None, 'redirect': '/framework', 'component': 'Layout', 'title': None, 'icon': None, 'parent_id': 0},
{'id': 10, 'path': 'framework', 'name': 'Framework', 'redirect': None, 'component': 'Framework', 'title': '系统页面', 'icon': 'gongzuotai', 'parent_id': 9},
{'id': 11, 'path': '/', 'name': None, 'redirect': '/users', 'component': 'Layout', 'title': None, 'icon': None, 'parent_id': 0},
{'id': 12, 'path': 'users', 'name': 'User', 'redirect': None, 'component': 'User', 'title': '用户管理', 'icon': 'user', 'parent_id': 11},
]
temp = result.to_dict(with_collections=True, related_objects=True, only=["uuid", "username", "account", "role", "phone", "email", "gender", "create_at", "update_at"])
temp.update({ temp.update({
"create_at": result.create_at.strftime("%Y-%m-%d %H:%M:%S") if result.create_at else None, "create_at": result.create_at.strftime("%Y-%m-%d %H:%M:%S") if result.create_at else None,
"update_at": result.update_at.strftime("%Y-%m-%d %H:%M:%S") if result.update_at else None, "update_at": result.update_at.strftime("%Y-%m-%d %H:%M:%S") if result.update_at else None,
......
...@@ -9,28 +9,24 @@ from . import fullStackDB ...@@ -9,28 +9,24 @@ from . import fullStackDB
db = fullStackDB.db db = fullStackDB.db
class Summary(db.Entity): class Menu(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "summary" _table_ = "{}".format(config['TABLE_PREFIX']) + "menu"
id = PrimaryKey(int, auto=True) id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True) uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
name = Required(str, max_len=200) # 总结标题 name = Optional(str)
year_supervise_churn_rate = Required(float) # 年度监督流失率 title = Required(str)
year_recert_churn_rate = Required(float) # 年度再认证流失率 path = Required(str)
year_satis_churn_rate = Required(float) # 年度顾客满意率 icon = Optional(str)
year_dispatch_site_days = Required(int) # 年度调派技术现场总人天数 hidden = Optional(bool, default=False)
year_receiv_collection_rate = Required(float) # 年度应收款回款率 component = Required(str)
year_bad_project = Required(int) # 年度列入坏账并终止项目数 redirect = Optional(str)
year_bad_debt_amount = Required(float) # 年度坏账金额 parent_id = Optional(str, default="")
indus_project_rate = Required(float) # 行业项目比率
indus_project_count = Required(int) # 行业项目数量
channel_project_rate = Required(float) # 渠道开发项目比率
channel_project_count = Required(int) # 渠道开发项目数量
create_at = Required(datetime, default=datetime.now) create_at = Required(datetime, default=datetime.now)
create_by = Required("User", reverse='summary_creator') # Summary与User一对一关系 create_by = Required("User", reverse='menu_creator') # Menu与User一对一关系
update_at = Required(datetime, default=datetime.now) update_at = Required(datetime, default=datetime.now)
update_by = Required("User", reverse='summary_updater') # Summary与User一对一关系 update_by = Required("User", reverse='menu_updater') # Menu与User一对一关系
delete_at = Optional(datetime) delete_at = Optional(datetime)
delete_by = Optional("User", reverse='summary_deleter') # Summary与User一对一关系 delete_by = Optional("User", reverse='menu_deleter') # Menu与User一对一关系
is_delete = Required(bool, default=False) is_delete = Required(bool, default=False)
sort = Optional(int, size=32, default=0) sort = Optional(int, size=32, default=0)
remarks = Optional(str, max_len=255, default="", nullable=True) remarks = Optional(str, max_len=255, default="", nullable=True)
\ No newline at end of file
...@@ -13,6 +13,7 @@ class User(db.Entity): ...@@ -13,6 +13,7 @@ class User(db.Entity):
_table_ = "{}".format(config['TABLE_PREFIX']) + "user" _table_ = "{}".format(config['TABLE_PREFIX']) + "user"
id = PrimaryKey(int, auto=True) id = PrimaryKey(int, auto=True)
uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True) uuid = Required(uuid.UUID, unique=True, default=uuid.uuid1, index=True)
role = Required(str, default="User") # 角色
account = Required(str, unique=True) # 账号 account = Required(str, unique=True) # 账号
username = Required(str, max_len=100) # 用户名 username = Required(str, max_len=100) # 用户名
password = Required(str, max_len=64) password = Required(str, max_len=64)
...@@ -43,4 +44,7 @@ class User(db.Entity): ...@@ -43,4 +44,7 @@ class User(db.Entity):
build_logs_deleter = Set('BuildLogs', reverse='delete_by') build_logs_deleter = Set('BuildLogs', reverse='delete_by')
framework_creator = Set('Framework', reverse='create_by') framework_creator = Set('Framework', reverse='create_by')
framework_updater = Set('Framework', reverse='update_by') framework_updater = Set('Framework', reverse='update_by')
framework_deleter = Set('Framework', reverse='delete_by') framework_deleter = Set('Framework', reverse='delete_by')
\ No newline at end of file menu_creator = Set('Menu', reverse='create_by')
menu_updater = Set('Menu', reverse='update_by')
menu_deleter = Set('Menu', reverse='delete_by')
...@@ -13,13 +13,14 @@ from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE ...@@ -13,13 +13,14 @@ from marshmallow import fields, validate, RAISE, INCLUDE, EXCLUDE
''' '''
class AddSchema(BaseSchema): class AddSchema(BaseSchema):
account = fields.String(required=True, validate=validate.Length(min=2, max=20)) account = fields.String(required=True)
username = fields.String(required=False, validate=validate.Length(min=2, max=20)) username = fields.String(required=False)
password = fields.String(required=True, validate=validate.Length(min=6, max=18)) password = fields.String(required=True)
email = fields.Email(required=False, default="") email = fields.Email(required=False, default="")
phone = fields.String(required=False, default="") phone = fields.String(required=False, default="")
gender = fields.Int(required=False, default=1) gender = fields.Int(required=False, default=1)
birthday = fields.Date(required=False, default=None) birthday = fields.Date(required=False, default=None)
role = fields.String(required=False)
remarks = fields.String(required=False) remarks = fields.String(required=False)
class Meta: class Meta:
...@@ -31,12 +32,13 @@ class DeleteSchema(BaseSchema): ...@@ -31,12 +32,13 @@ class DeleteSchema(BaseSchema):
class UpdateSchema(BaseSchema): class UpdateSchema(BaseSchema):
uuid = fields.UUID(required=False) uuid = fields.UUID(required=False)
account = fields.String(required=False, validate=validate.Length(min=2, max=20)) account = fields.String(required=False)
username = fields.String(required=False, validate=validate.Length(min=2, max=20)) username = fields.String(required=False)
email = fields.Email(required=False) email = fields.Email(required=False)
phone = fields.String(required=False) phone = fields.String(required=False)
gender = fields.Int(required=False) gender = fields.Int(required=False)
birthday = fields.Date(missing=False) birthday = fields.Date(required=False)
role = fields.String(required=False)
remarks = fields.String(required=False) remarks = fields.String(required=False)
class Meta: class Meta:
...@@ -53,16 +55,13 @@ class QuerySchema(BaseSchema): ...@@ -53,16 +55,13 @@ class QuerySchema(BaseSchema):
class ResponseSchema(BaseSchema): class ResponseSchema(BaseSchema):
uuid = fields.UUID(required=True) uuid = fields.UUID(required=True)
account = fields.String(required=True, validate=validate.Length(min=2, max=20)) account = fields.String(required=True)
username = fields.String(required=True, validate=validate.Length(min=2, max=20)) username = fields.String(required=True)
password = fields.String(required=True, validate=validate.Length(min=6, max=18)) password = fields.String(required=True)
email = fields.Email(required=False) email = fields.Email(required=False)
phone = fields.String(required=True) phone = fields.String(required=True)
gender = fields.Int(required=True) gender = fields.Int(required=True)
birthday = fields.Date(required=False) birthday = fields.Date(required=False)
hometown = fields.String(required=False)
entry_time = fields.DateTime(required=True)
expire_date = fields.DateTime(required=True)
remarks = fields.String(required=True) remarks = fields.String(required=True)
class Meta: class Meta:
......
frontend/src/assets/images/logo.png

22.1 KB | W: | H:

frontend/src/assets/images/logo.png

23.8 KB | W: | H:

frontend/src/assets/images/logo.png
frontend/src/assets/images/logo.png
frontend/src/assets/images/logo.png
frontend/src/assets/images/logo.png
  • 2-up
  • Swipe
  • Onion skin
...@@ -433,7 +433,7 @@ ...@@ -433,7 +433,7 @@
<div class="dropdown" v-show="userShow" style="right: 20px;"> <div class="dropdown" v-show="userShow" style="right: 20px;">
<ul> <ul>
<li @click="redirectTo('/system/profile')"> <li @click="redirectTo('/profile')">
<i aria-label="图标: user" class="webicon"> <i aria-label="图标: user" class="webicon">
<svg viewBox="64 64 896 896" data-icon="user" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false"><path d="M858.5 763.6a374 374 0 0 0-80.6-119.5 375.63 375.63 0 0 0-119.5-80.6c-.4-.2-.8-.3-1.2-.5C719.5 518 760 444.7 760 362c0-137-111-248-248-248S264 225 264 362c0 82.7 40.5 156 102.8 201.1-.4.2-.8.3-1.2.5-44.8 18.9-85 46-119.5 80.6a375.63 375.63 0 0 0-80.6 119.5A371.7 371.7 0 0 0 136 901.8a8 8 0 0 0 8 8.2h60c4.4 0 7.9-3.5 8-7.8 2-77.2 33-149.5 87.8-204.3 56.7-56.7 132-87.9 212.2-87.9s155.5 31.2 212.2 87.9C779 752.7 810 825 812 902.2c.1 4.4 3.6 7.8 8 7.8h60a8 8 0 0 0 8-8.2c-1-47.8-10.9-94.3-29.5-138.2zM512 534c-45.9 0-89.1-17.9-121.6-50.4S340 407.9 340 362c0-45.9 17.9-89.1 50.4-121.6S466.1 190 512 190s89.1 17.9 121.6 50.4S684 316.1 684 362c0 45.9-17.9 89.1-50.4 121.6S557.9 534 512 534z"></path></svg> <svg viewBox="64 64 896 896" data-icon="user" width="1em" height="1em" fill="currentColor" aria-hidden="true" focusable="false"><path d="M858.5 763.6a374 374 0 0 0-80.6-119.5 375.63 375.63 0 0 0-119.5-80.6c-.4-.2-.8-.3-1.2-.5C719.5 518 760 444.7 760 362c0-137-111-248-248-248S264 225 264 362c0 82.7 40.5 156 102.8 201.1-.4.2-.8.3-1.2.5-44.8 18.9-85 46-119.5 80.6a375.63 375.63 0 0 0-80.6 119.5A371.7 371.7 0 0 0 136 901.8a8 8 0 0 0 8 8.2h60c4.4 0 7.9-3.5 8-7.8 2-77.2 33-149.5 87.8-204.3 56.7-56.7 132-87.9 212.2-87.9s155.5 31.2 212.2 87.9C779 752.7 810 825 812 902.2c.1 4.4 3.6 7.8 8 7.8h60a8 8 0 0 0 8-8.2c-1-47.8-10.9-94.3-29.5-138.2zM512 534c-45.9 0-89.1-17.9-121.6-50.4S340 407.9 340 362c0-45.9 17.9-89.1 50.4-121.6S466.1 190 512 190s89.1 17.9 121.6 50.4S684 316.1 684 362c0 45.9-17.9 89.1-50.4 121.6S557.9 534 512 534z"></path></svg>
</i>个人中心 </i>个人中心
......
...@@ -3,7 +3,8 @@ import store from "@/store"; // get token from cookie ...@@ -3,7 +3,8 @@ import store from "@/store"; // get token from cookie
import NProgress from "nprogress"; // progress bar import NProgress from "nprogress"; // progress bar
import "nprogress/nprogress.css"; // progress bar style import "nprogress/nprogress.css"; // progress bar style
import { getPageTitle } from "@/utils/index"; import { getPageTitle } from "@/utils/index";
import { default as def } from "./settings";
const whiteList = ["/login", "/register"];
NProgress.configure({ showSpinner: false }); // NProgress Configuration NProgress.configure({ showSpinner: false }); // NProgress Configuration
...@@ -27,7 +28,7 @@ router.beforeEach(async (to, from, next) => { ...@@ -27,7 +28,7 @@ router.beforeEach(async (to, from, next) => {
} }
} else { } else {
/* has no token*/ /* has no token*/
if (def.whiteList.indexOf(to.path) !== -1) { if (whiteList.indexOf(to.path) !== -1) {
// in the free login whitelist, go directly // in the free login whitelist, go directly
next(); next();
} else { } else {
......
import Vue from "vue"; import Vue from "vue";
import Router from "vue-router"; import Router from "vue-router";
import setting from "@/settings.js";
const pageInfos = setting.pageInfos;
Vue.use(Router); Vue.use(Router);
/* Layout */ /* Layout */
import Layout from "@/layout"; import Layout from "@/layout";
import View from "@/layout/view";
/** /**
* Note: sub-menu only appear when route children.length >= 1 * Note: sub-menu only appear when route children.length >= 1
...@@ -29,64 +25,6 @@ import View from "@/layout/view"; ...@@ -29,64 +25,6 @@ import View from "@/layout/view";
} }
*/ */
const newRules = [];
const recursion = (obj, parent) => {
return obj.children.map((ele) => {
let res = {};
if (ele.children && ele.children.length > 0) {
res.path = ele.path;
res.component = View;
res.redirect = `/${obj.path}/${ele.path}/${ele.children[0].path}`;
res.children = recursion(ele, `/${obj.path}`);
} else {
let t = {
path: `${parent ? parent : ""}/${obj.path}/${ele.path}`,
component: () => import(`@/views/${ele.vue}`),
meta: {
title: ele.title,
icon: ele.icon,
keepAlive: ele.keepAlive || false,
},
hidden: ele.hidden || false,
};
if (ele.name) res.name = ele.name;
if (ele.redirect) res.redirect = ele.redirect;
res = Object.assign(res, t);
}
return res;
});
};
pageInfos.forEach((item) => {
let routeObj = {
path: `/${item.path}`,
component: Layout,
hidden: item.hidden || false,
};
if (item.redirect) routeObj.redirect = item.redirect;
if (item.children && item.children.length > 0) {
routeObj.redirect = `/${item.path}/${item.children[0].path}`;
routeObj.children = recursion(item);
} else {
routeObj.children = [
{
path: `/${item.path}`,
name: item.name,
component: () => import(`@/views/${item.vue}`),
meta: {
title: item.title,
icon: item.icon,
keepAlive: item.keepAlive || false,
},
},
];
}
newRules.push(routeObj);
});
/** /**
* constantRoutes * constantRoutes
...@@ -94,60 +32,133 @@ pageInfos.forEach((item) => { ...@@ -94,60 +32,133 @@ pageInfos.forEach((item) => {
* all roles can be accessed * all roles can be accessed
*/ */
export const constantRoutes = [ export const constantRoutes = [
{ {
path: "/login", path: "/login",
component: () => import("@/views/login/index"), component: () => import("@/views/login/index"),
hidden: true, hidden: true,
}, },
{ {
path: "/register", path: "/register",
component: () => import("@/views/login/register"), component: () => import("@/views/login/register"),
hidden: true, hidden: true,
}, },
{ {
path: '/', path: '/',
redirect: '/404', redirect: '/home',
component: Layout, component: Layout,
children: [{ children: [{
path: '404', path: 'home',
name: 'Page404', name: 'AppIndex',
component: () => import('@/views/error-pages/404'), component: () => import('@/views/app-store/index.vue'),
meta: { title: '404', icon: 'home' } meta: { title: '应用管理', icon: 'home' }
}] }]
}, },
{ {
path: '/', path: '/',
redirect: '/403', redirect: '/build',
component: Layout, component: Layout,
children: [{ children: [{
path: '403', path: 'build',
name: 'Page403', name: 'AppBuild',
component: () => import('@/views/error-pages/403'), component: () => import('@/views/app-store/build.vue'),
meta: { title: '403', icon: 'home' } meta: { title: '打包日志', icon: 'home' }
}] }]
}, },
...newRules, {
path: '/',
{ path: "/", redirect: "/home", hidden: true }, redirect: '/download',
component: Layout,
// 404 page must be placed at the end !!! children: [{
{ path: "*", redirect: "/404", hidden: true }, path: 'download',
name: 'AppDownload',
component: () => import('@/views/app-store/download.vue'),
meta: { title: '下载记录', icon: 'gongzuotai' }
}]
},
{
path: '/',
redirect: '/framework',
component: Layout,
children: [{
path: 'framework',
name: 'Framework',
component: () => import('@/views/app-store/framework.vue'),
meta: { title: '系统页面', icon: 'gongzuotai' }
}]
},
{
path: '/',
redirect: '/profile',
component: Layout,
children: [{
path: 'profile',
name: 'Profile',
component: () => import('@/views/profile/index.vue'),
meta: { title: '个人中心', icon: 'shangcheng' }
}]
},
{
path: '/',
redirect: '/user',
component: Layout,
children: [{
path: 'user',
name: 'UserIndex',
component: () => import('@/views/system/users.vue'),
meta: { title: '用户管理', icon: 'shangcheng' }
}]
},
{
path: '/',
redirect: '/404',
component: Layout,
children: [{
path: '404',
name: 'Page404',
component: () => import('@/views/error-pages/404'),
meta: { title: '404', icon: 'home' }
}]
},
{
path: '/',
redirect: '/403',
component: Layout,
children: [{
path: '403',
name: 'Page403',
component: () => import('@/views/error-pages/403'),
meta: { title: '403', icon: 'home' }
}]
}
]; ];
// 404 page must be placed at the end !!!
export const notFound = { path: '*', redirect: '/404', hidden: true }
export const routerMap = {
Layout: () => import('@/layout'),
Home: () => import('@/views/app-store/index'),
Build: () => import('@/views/app-store/build'),
Profile: () => import('@/views/profile/index'),
Download: () => import('@/views/app-store/download'),
Framework: () => import('@/views/app-store/framework'),
User: () => import('@/views/system/users'),
}
const createRouter = () => const createRouter = () =>
new Router({ new Router({
// mode: 'history', // require service support, 后台部署在/static 目录 // mode: 'history', // require service support, 后台部署在/static 目录
// base: "/static", // 应用的基础路径: 默认为'/',修改为'/static' // base: "/static", // 应用的基础路径: 默认为'/',修改为'/static'
scrollBehavior: () => ({ y: 0 }), scrollBehavior: () => ({ y: 0 }),
routes: constantRoutes, routes: constantRoutes,
}); });
const router = createRouter(); const router = createRouter();
// Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465 // Detail see: https://github.com/vuejs/vue-router/issues/1234#issuecomment-357941465
export function resetRouter() { export function resetRouter() {
const newRouter = createRouter(); const newRouter = createRouter();
router.matcher = newRouter.matcher; // reset router router.matcher = newRouter.matcher; // reset router
} }
export default router; export default router;
...@@ -71,6 +71,4 @@ export default { ...@@ -71,6 +71,4 @@ export default {
path: "user", path: "user",
}, },
], ],
whiteList: ["/login", "/register"],
}; };
...@@ -16,7 +16,7 @@ ...@@ -16,7 +16,7 @@
>查询</el-button >查询</el-button
></el-form-item ></el-form-item
> >
<el-form-item><el-button @click="onReset">重置</el-button></el-form-item> <el-form-item><el-button @click="onReset('form')">重置</el-button></el-form-item>
</el-form> </el-form>
<el-table <el-table
v-loading="isLoading" v-loading="isLoading"
...@@ -31,25 +31,29 @@ ...@@ -31,25 +31,29 @@
<el-table-column <el-table-column
prop="app.app_name" prop="app.app_name"
label="应用名称" label="应用名称"
width="180" min-width="180"
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
prop="build_text" prop="app.app_url"
label="打包信息" label="应用路径"
min-width="250" min-width="180"
:show-overflow-tooltip="true" ></el-table-column>
<el-table-column
prop="app.app_version"
label="应用版本"
min-width="180"
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
prop="create_at" prop="create_at"
label="创建时间" label="创建时间"
width="150" min-width="150"
></el-table-column> ></el-table-column>
<el-table-column <el-table-column
prop="create_by.username" prop="create_by.username"
label="创建者" label="创建者"
width="150" min-width="150"
></el-table-column> ></el-table-column>
<el-table-column label="操作" align="center" width="240" fixed="right"> <el-table-column label="操作" align="center" width="140" fixed="right">
<template slot-scope="scope"> <template slot-scope="scope">
<el-button <el-button
size="mini" size="mini"
...@@ -57,18 +61,6 @@ ...@@ -57,18 +61,6 @@
@click="handleDownload(scope.$index, scope.row)" @click="handleDownload(scope.$index, scope.row)"
>下载</el-button >下载</el-button
> >
<el-button
size="mini"
type="success"
@click="handleEdit(scope.$index, scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.$index, scope.row)"
>删除</el-button
>
</template> </template>
</el-table-column> </el-table-column>
</el-table> </el-table>
......
...@@ -95,6 +95,7 @@ export default { ...@@ -95,6 +95,7 @@ export default {
}, },
mounted() {}, mounted() {},
created() { created() {
if (this.$store.getters.role !== "ADMIN") this.$router.push({ path: "/403" })
this.fetchData(mapTrim(this.form)) this.fetchData(mapTrim(this.form))
} }
} }
......
...@@ -220,6 +220,7 @@ export default { ...@@ -220,6 +220,7 @@ export default {
}, },
mounted() {}, mounted() {},
created() { created() {
if (this.$store.getters.role !== "ADMIN") this.$router.push({ path: "/403" })
this.fetchData() this.fetchData()
this.fetchSelectData() this.fetchSelectData()
} }
......
...@@ -51,8 +51,8 @@ ...@@ -51,8 +51,8 @@
</div> </div>
</template> </template>
<script> <script>
import { doLogin, getUser } from "@/api/index"; import { doLogin, getUser } from "@/api/index"
import { strTrim } from "@/utils/index"; import { strTrim } from "@/utils/index"
let loading = null let loading = null
...@@ -73,9 +73,9 @@ export default { ...@@ -73,9 +73,9 @@ export default {
getUserPermission() { getUserPermission() {
getUser() getUser()
.then((res) => { .then((res) => {
this.$store.dispatch("user/setRole", res.data.role); this.$store.dispatch("user/setRole", res.data.role);
sessionStorage.setItem("user", JSON.stringify(res.data)); sessionStorage.setItem("user", JSON.stringify(res.data));
this.$router.push({ path: "/home" }); this.$router.push({ path: "/home" });
}) })
.catch((err) => { .catch((err) => {
this.$message.error(err.message); this.$message.error(err.message);
......
...@@ -87,21 +87,6 @@ ...@@ -87,21 +87,6 @@
<el-input v-model.trim="user.email" /> <el-input v-model.trim="user.email" />
</el-col> </el-col>
</el-form-item> </el-form-item>
<el-form-item label="籍贯" prop="hometown">
<el-col :md="8" :xs="24">
<el-input v-model.trim="user.hometown" />
</el-col>
</el-form-item>
<el-form-item label="部门">
<el-col :md="8" :xs="24">
<el-input v-model.trim="user.hometown" disabled />
</el-col>
</el-form-item>
<el-form-item label="角色">
<el-col :md="8" :xs="24">
<el-input v-model.trim="user.hometown" disabled />
</el-col>
</el-form-item>
<el-form-item> <el-form-item>
<el-button type="primary" @click="submitForm('post')" <el-button type="primary" @click="submitForm('post')"
>更新资料</el-button >更新资料</el-button
......
<template> <template>
<div class="app-container"> <div class="app-container">
<el-form :inline="true" ref="form" :model="form" size="mini"> <el-form :inline="true" ref="form" :model="form" size="mini">
<el-form-item label="帐号" prop="uuid"> <el-form-item label="帐号" prop="uuid">
<el-select v-model="form.uuid" filterable placeholder="请输入帐号"> <el-select v-model="form.uuid" filterable placeholder="请输入帐号">
<el-option v-for="(item, index) in users" :key="index" :label="item.account" :value="item.uuid"></el-option> <el-option
</el-select> v-for="(item, index) in users"
</el-form-item> :key="index"
<el-form-item><el-button type="primary" @click="onSubmit">查询</el-button></el-form-item> :label="item.account"
<el-form-item><el-button @click="onReset('form')">重置</el-button></el-form-item> :value="item.uuid"
<el-form-item><el-button type="warning" @click="onAdd">添加</el-button></el-form-item> ></el-option>
</el-form> </el-select>
<el-table v-loading="isLoading" element-loading-text="Loading" :data="list" size="mini" border stripe fit highlight-current-row> </el-form-item>
<el-table-column prop="username" label="用户名" align="center" width="150"></el-table-column> <el-form-item
<el-table-column prop="account" label="账号" align="center" width="120"></el-table-column> ><el-button type="primary" @click="onSubmit"
<el-table-column prop="phone" label="手机" width="150"></el-table-column> >查询</el-button
<el-table-column prop="email" label="邮箱" width="200" :show-overflow-tooltip="true"></el-table-column> ></el-form-item
<el-table-column prop="remarks" label="备注" width="240" :show-overflow-tooltip="true"></el-table-column> >
<el-table-column prop="create_at" label="创建时间" width="150"></el-table-column> <el-form-item
<el-table-column label="操作" align="center" min-width="180" fixed="right"> ><el-button @click="onReset('form')">重置</el-button></el-form-item
<template slot-scope="scope"> >
<el-button size="mini" type="success" @click="handleEdit(scope.$index, scope.row)">编辑</el-button> <el-form-item
<el-button size="mini" type="danger" @click="handleDelete(scope.$index, scope.row)">删除</el-button> ><el-button type="warning" @click="onAdd">添加</el-button></el-form-item
</template> >
</el-table-column> </el-form>
</el-table> <el-table
<div class="page-wrapper"> v-loading="isLoading"
<el-pagination @current-change="handleCurrentChange" :current-page.sync="form.pagenum" background small :page-size="form.pagesize" :pager-count="5" layout="pager, prev, next, total" :total="total"></el-pagination> element-loading-text="Loading"
</div> :data="list"
<el-dialog size="mini"
:title="dialogTitle" border
:visible.sync="dialogVisible" stripe
width="45%" fit
> highlight-current-row
<el-form :model="post" status-icon :rules="rules" :inline="true" ref="post" size="mini" label-width="80px"> >
<el-form-item label="账号" prop="account"> <el-table-column
<el-input type="text" v-model="post.account" autocomplete="off"></el-input> prop="username"
</el-form-item> label="用户名"
<el-form-item label="密码" prop="password"> align="center"
<el-input type="password" v-model="post.password" autocomplete="off"></el-input> width="150"
</el-form-item> ></el-table-column>
<el-form-item label="用户名" prop="username"> <el-table-column
<el-input type="text" v-model="post.username" autocomplete="off"></el-input> prop="account"
</el-form-item> label="账号"
<el-form-item label="联系方式" prop="phone"> align="center"
<el-input type="text" v-model="post.phone" autocomplete="off"></el-input> width="120"
</el-form-item> ></el-table-column>
<el-form-item label="邮箱" prop="email"> <el-table-column prop="phone" label="手机" width="150"></el-table-column>
<el-input type="email" v-model="post.email" autocomplete="off"></el-input> <el-table-column
</el-form-item> prop="email"
<el-form-item label="备注" prop="remarks"> label="邮箱"
<el-input type="text" v-model="post.remarks" autocomplete="off"></el-input> width="200"
</el-form-item> :show-overflow-tooltip="true"
</el-form> ></el-table-column>
<div slot="footer" class="dialog-footer"> <el-table-column
<el-button type="primary" size="mini" plain @click="submitForm('post')">提交</el-button> prop="remarks"
<el-button type="success" size="mini" plain @click="onReset('post')">重置</el-button> label="备注"
<el-button size="mini" @click="dialogVisible = false">关闭</el-button> width="240"
</div> :show-overflow-tooltip="true"
</el-dialog> ></el-table-column>
<el-table-column
prop="create_at"
label="创建时间"
width="150"
></el-table-column>
<el-table-column
label="操作"
align="center"
min-width="180"
fixed="right"
>
<template slot-scope="scope">
<el-button
size="mini"
type="success"
@click="handleEdit(scope.$index, scope.row)"
>编辑</el-button
>
<el-button
size="mini"
type="danger"
@click="handleDelete(scope.$index, scope.row)"
>删除</el-button
>
</template>
</el-table-column>
</el-table>
<div class="page-wrapper">
<el-pagination
@current-change="handleCurrentChange"
:current-page.sync="form.pagenum"
background
small
:page-size="form.pagesize"
:pager-count="5"
layout="pager, prev, next, total"
:total="total"
></el-pagination>
</div> </div>
<el-dialog :title="dialogTitle" :visible.sync="dialogVisible" width="45%">
<el-form
:model="post"
status-icon
:rules="rules"
ref="post"
size="mini"
label-width="80px"
>
<el-form-item label="账号" prop="account">
<el-input
type="text"
v-model="post.account"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="密码" prop="password">
<el-input
type="password"
v-model="post.password"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="角色" prop="password">
<el-select v-model="post.role" placeholder="请选择">
<el-option
v-for="item in options"
:key="item.value"
:label="item.label"
:value="item.value"
>
</el-option>
</el-select>
</el-form-item>
<el-form-item label="用户名" prop="username">
<el-input
type="text"
v-model="post.username"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="联系方式" prop="phone">
<el-input
type="text"
v-model="post.phone"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="邮箱" prop="email">
<el-input
type="email"
v-model="post.email"
autocomplete="off"
></el-input>
</el-form-item>
<el-form-item label="备注" prop="remarks">
<el-input
type="text"
v-model="post.remarks"
autocomplete="off"
></el-input>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" size="mini" plain @click="submitForm('post')"
>提交</el-button
>
<el-button type="success" size="mini" plain @click="onReset('post')"
>重置</el-button
>
<el-button size="mini" @click="dialogVisible = false">关闭</el-button>
</div>
</el-dialog>
</div>
</template> </template>
<script> <script>
import { getUserList, deleteUser, updateUser, addUser } from '@/api/index' import { getUserList, deleteUser, updateUser, addUser } from "@/api/index";
import { mapTrim, compareObjectDiff } from '@/utils/index' import { mapTrim, compareObjectDiff } from "@/utils/index";
export default { export default {
data() { data() {
return { return {
data: {}, data: {},
total: 0, total: 0,
list: [], list: [],
isLoading: false, isLoading: false,
users: [], users: [],
depots: [], options: [
roles: [], { value: "USER", label: "用户" },
form: { { value: "ADMIN", label: "管理员" },
uuid: null, ],
role: null, form: {
depot: null, uuid: null,
pagesize: 15, role: null,
pagenum: 1 depot: null,
}, pagesize: 15,
dialogTitle: "", pagenum: 1,
dialogVisible: false, },
currentValue: null, dialogTitle: "",
currentIndex: 0, dialogVisible: false,
post: { currentValue: null,
account: null, currentIndex: 0,
username: null, post: {
phone: null, account: null,
birthday: null, username: null,
gender: 1, phone: null,
email: null, birthday: null,
hometown: null, gender: 1,
entry_time: null, email: null,
expire_date: null, hometown: null,
depot: null, entry_time: null,
role: null, expire_date: null,
remarks: "" depot: null,
}, role: null,
rules: { remarks: "",
account: [{ type: 'string', required: true, message: '账号不能为空', trigger: 'blur' }], },
username: [ rules: {
{ type: 'string', required: true, message: '用户名不能为空', trigger: 'blur' }, account: [
{ min: 1, max: 20, message: '字符串长度在 1 到 20 之间', trigger: 'blur' } {
], type: "string",
password: [{ type: 'string', required: true, message: '密码不能为空', trigger: 'blur' }, { min: 6, max: 18, message: '长度在 6 到 18 个字符', trigger: 'blur' }], required: true,
phone: [{ type: 'string', required: false, message: '手机号不能为空', trigger: 'blur' }, { len: 11, message: '手机号长度为11', trigger: 'blur' }], message: "账号不能为空",
birthday: [{ required: false, message: '出生年月不能为空', trigger: 'blur' }], trigger: "blur",
gender: [{ type: 'number', required: false, message: '性别不能为空', trigger: 'blur' }], },
email: [{ type: 'email', required: false, message: '邮箱不能为空', trigger: 'blur' }], ],
hometown: [{ type: 'string', required: false, message: '籍贯不能为空', trigger: 'blur' }], username: [
entry_time: [{ required: false, message: '入职时间不能为空', trigger: 'blur' }], {
expire_date: [{ required: false, message: '到期时间不能为空', trigger: 'blur' }], type: "string",
depot: [{ type: 'string', required: false, message: '部门不能为空', trigger: 'blur' }], required: true,
role: [{ type: 'string', required: false, message: '角色不能为空', trigger: 'blur' }], message: "用户名不能为空",
remarks: [{ type: 'string', required: false, message: '备注不能为空', trigger: 'blur' }], trigger: "blur",
} },
} {
min: 1,
max: 20,
message: "字符串长度在 1 到 20 之间",
trigger: "blur",
},
],
password: [
{
type: "string",
required: true,
message: "密码不能为空",
trigger: "blur",
},
{
min: 6,
max: 18,
message: "长度在 6 到 18 个字符",
trigger: "blur",
},
],
phone: [
{
type: "string",
required: false,
message: "手机号不能为空",
trigger: "blur",
},
{ len: 11, message: "手机号长度为11", trigger: "blur" },
],
birthday: [
{ required: false, message: "出生年月不能为空", trigger: "blur" },
],
gender: [
{
type: "number",
required: false,
message: "性别不能为空",
trigger: "blur",
},
],
email: [
{
type: "email",
required: false,
message: "邮箱不能为空",
trigger: "blur",
},
],
hometown: [
{
type: "string",
required: false,
message: "籍贯不能为空",
trigger: "blur",
},
],
role: [
{
type: "string",
required: false,
message: "角色不能为空",
trigger: "blur",
},
],
remarks: [
{
type: "string",
required: false,
message: "备注不能为空",
trigger: "blur",
},
],
},
};
},
methods: {
fetchData(params) {
this.isLoading = true;
getUserList(
Object.assign(
{
pagenum: this.form.pagenum,
pagesize: this.form.pagesize,
},
params
)
)
.then((res) => {
this.total = res.count;
this.list = res.data.map((item) => {
item.gender = item.gender == 1 ? "" : "";
if (item.email == "user@example.com") item.email = null;
return item;
});
})
.catch((err) => {
this.list = err.data;
// this.$message.error(err.message)
console.log(err.message);
})
.finally(() => {
this.isLoading = false;
});
},
fetchSelectData() {
getUserList({ scope_type: "list" })
.then((res) => {
if (res.code == 200) this.users = res.data;
})
.catch((err) => {
// this.$message.error(err.message)
console.log(err.message);
});
},
handleSizeChange(e) {
this.form.pagesize = e;
this.fetchData(mapTrim(this.form));
},
handleCurrentChange(e) {
this.form.pagenum = e;
this.fetchData(mapTrim(this.form));
}, },
methods: { handleEdit(index, row) {
fetchData(params) { this.post.account = row.account;
this.isLoading = true this.post.username = row.username;
getUserList(Object.assign({ this.post.phone = row.phone;
pagenum: this.form.pagenum, this.post.birthday = row.birthday;
pagesize: this.form.pagesize, this.post.email = row.email;
}, params)).then(res => { this.post.hometown = row.hometown;
this.total = res.count this.post.entry_time = row.entry_time;
this.list = res.data.map(item => { this.post.expire_date = row.expire_date;
item.gender = item.gender == 1 ? "" : "" this.post.role = row.role_id;
if (item.email == "user@example.com") item.email = null this.post.depot = row.depot_id;
return item this.post.remarks = row.remarks;
this.dialogTitle = "编辑";
this.dialogVisible = true;
this.currentValue = row;
this.currentIndex = index;
this.rules.password[0].required = false;
},
handleDelete(index, row) {
this.$alert(
"您确定要删除么?删除操作将不可恢复。如需取消操作,请点击右上角关闭按钮。",
"删除提醒",
{
confirmButtonText: "确定",
callback: (action) => {
if (action == "confirm")
deleteUser(row.uuid)
.then((res) => {
console.log(res);
this.total -= 1;
this.$delete(this.list, index);
this.$message({
type: "success",
message: `成功删除第${index}行`,
});
}) })
}).catch(err => { .catch((err) => {
this.list = err.data this.$message.error(err.message);
// this.$message.error(err.message) });
console.log(err.message) },
}).finally(() => { }
this.isLoading = false );
}) },
}, submitForm(formName) {
fetchSelectData() { this.$refs[formName].validate((valid) => {
getUserList({ "scope_type": "list" }).then(res => { let result = true;
if (res.code == 200) this.users = res.data if (valid) {
}).catch(err => { if (!this.post.username) this.post.username = this.post.account;
// this.$message.error(err.message) if (this.dialogTitle === "添加")
console.log(err.message) addUser(mapTrim(this.post))
}) .then((res) => {
}, console.log(res);
handleSizeChange(e) { this.$message({ type: "success", message: "添加成功" });
this.form.pagesize = e this.fetchData();
this.fetchData(mapTrim(this.form)) })
}, .catch((err) => {
handleCurrentChange(e) { this.$message.error(err.message);
this.form.pagenum = e });
this.fetchData(mapTrim(this.form)) else if (this.dialogTitle === "编辑")
}, updateUser(
handleEdit(index, row) { this.currentValue.uuid,
this.post.account = row.account compareObjectDiff(this.post, this.currentValue)
this.post.username = row.username )
this.post.phone = row.phone .then((res) => {
this.post.birthday = row.birthday console.log(res);
this.post.email = row.email this.$message({ type: "success", message: "更新成功" });
this.post.hometown = row.hometown this.fetchData();
this.post.entry_time = row.entry_time })
this.post.expire_date = row.expire_date .catch((err) => {
this.post.role = row.role_id this.$message.error(err.message);
this.post.depot = row.depot_id });
this.post.remarks = row.remarks } else {
this.dialogTitle = "编辑" result = false;
this.dialogVisible = true
this.currentValue = row
this.currentIndex = index
this.rules.password[0].required = false
},
handleDelete(index, row) {
this.$alert('您确定要删除么?删除操作将不可恢复。如需取消操作,请点击右上角关闭按钮。', '删除提醒', {
confirmButtonText: '确定',
callback: action => {
if (action == 'confirm') deleteUser(row.uuid).then(res => {
console.log(res)
this.total -= 1
this.$delete(this.list, index)
this.$message({ type: 'success', message: `成功删除第${ index }行` })
}).catch(err => {
this.$message.error(err.message)
})
}
})
},
submitForm(formName) {
this.$refs[formName].validate((valid) => {
let result = true
if (valid) {
if (!this.post.username) this.post.username = this.post.account
if (this.dialogTitle === '添加') addUser(mapTrim(this.post)).then(res => {
console.log(res)
this.$message({ type: 'success', message: '添加成功' })
this.fetchData()
}).catch(err => {
this.$message.error(err.message)
})
else if (this.dialogTitle === '编辑') updateUser(this.currentValue.uuid, compareObjectDiff(this.post, this.currentValue)).then(res => {
console.log(res)
this.$message({ type: 'success', message: '更新成功' })
this.fetchData()
}).catch(err => {
this.$message.error(err.message)
})
} else {
result = false
}
this.dialogVisible = false
return result
})
},
onAdd() {
this.dialogTitle = "添加"
this.dialogVisible = true
this.rules.password[0].required = true
},
onSubmit() {
this.form.pagenum = 1
this.form.pagesize = 15
this.fetchData(mapTrim(this.form))
},
onReset(formName) {
this.form.account = null
this.form.username = null
this.form.pagesize = 15
this.form.pagenum = 1
this.$refs[formName].resetFields()
this.fetchData()
} }
this.dialogVisible = false;
return result;
});
},
onAdd() {
this.dialogTitle = "添加";
this.dialogVisible = true;
this.rules.password[0].required = true;
}, },
mounted() {}, onSubmit() {
created() { this.form.pagenum = 1;
this.fetchData() this.form.pagesize = 15;
this.fetchSelectData() this.fetchData(mapTrim(this.form));
},
onReset(formName) {
this.form.account = null;
this.form.username = null;
this.form.pagesize = 15;
this.form.pagenum = 1;
this.$refs[formName].resetFields();
this.fetchData();
},
},
mounted() {},
created() {
if (this.$store.getters.role !== "ADMIN")
this.$router.push({ path: "/403" });
// const user = JSON.parse(sessionStorage.getItem("user")) this.fetchData();
// if (!user || user.role.permission.users == "无权限") this.$router.push("/403") this.fetchSelectData();
} },
} };
</script> </script>
<style lang="less" scoped> <style lang="less" scoped>
.app-container { .app-container {
& > div.page-wrapper { & > div.page-wrapper {
margin: 10px 0px; margin: 10px 0px;
} }
} }
</style> </style>
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment