@@ -38,13 +38,13 @@
\ No newline at end of file
diff --git a/packages/manage/views/user.vue b/packages/manage/views/user.vue
new file mode 100644
index 0000000..be5d075
--- /dev/null
+++ b/packages/manage/views/user.vue
@@ -0,0 +1,134 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/plugs/api/index.ts b/plugs/api/index.ts
index 0c3456f..a82dc26 100644
--- a/plugs/api/index.ts
+++ b/plugs/api/index.ts
@@ -1,5 +1,7 @@
export * as dictionary from './dictionary';
export * as log from './log';
export * as permission from './permission';
+export * as role from './role';
+export * as user from './user';
export * as buffer from './buffer';
export * as pub from './public';
diff --git a/plugs/api/permission.ts b/plugs/api/permission.ts
index d7e35a5..191e333 100644
--- a/plugs/api/permission.ts
+++ b/plugs/api/permission.ts
@@ -1,7 +1,6 @@
import { get, post, put, delate } from '../http/axios';
-import { PageResult } from '../constant';
-const pageResult = new PageResult();
const root = 'permission';
+const publik = 'public/permission';
export const list = (example) => {
return new Promise((resolve, reject) => {
@@ -10,19 +9,19 @@ export const list = (example) => {
if (rsp) {
resolve(rsp);
} else {
- resolve(pageResult);
+ resolve([]);
}
},
(err) => {
- resolve(pageResult);
+ resolve([]);
}
);
});
};
-export const add = (dictionary) => {
+export const add = (permission) => {
return new Promise((resolve, reject) => {
- post(root, dictionary).then(
+ post(root, permission).then(
(rsp: any) => {
if (rsp) {
resolve(rsp);
@@ -37,9 +36,9 @@ export const add = (dictionary) => {
});
};
-export const set = (dictionary) => {
+export const set = (permission) => {
return new Promise((resolve, reject) => {
- put(root, dictionary).then(
+ put(root, permission).then(
(rsp: any) => {
if (rsp) {
resolve(rsp);
@@ -54,9 +53,9 @@ export const set = (dictionary) => {
});
};
-export const del = (dictionary) => {
+export const del = (permission) => {
return new Promise((resolve, reject) => {
- delate(root, dictionary).then(
+ delate(root + '/' + permission.id).then(
(rsp: any) => {
if (rsp) {
resolve(rsp);
@@ -70,3 +69,20 @@ export const del = (dictionary) => {
);
});
};
+
+export const tree = () => {
+ return new Promise((resolve, reject) => {
+ get(publik).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve([]);
+ }
+ },
+ (err) => {
+ resolve([]);
+ }
+ );
+ });
+};
diff --git a/plugs/api/public.ts b/plugs/api/public.ts
index fb77905..7c01dc7 100644
--- a/plugs/api/public.ts
+++ b/plugs/api/public.ts
@@ -4,6 +4,7 @@ const urls = {
info: 'public/info',
login: 'public/login',
logout: 'public/logout',
+ menu: 'public/menu',
};
export const getByCodes = (codes) => {
@@ -65,3 +66,20 @@ export const logout = () => {
);
});
};
+
+export const getMenus = () => {
+ return new Promise((resolve, reject) => {
+ get(urls.menu, null, true, true).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve([]);
+ }
+ },
+ (err) => {
+ resolve([]);
+ }
+ );
+ });
+};
diff --git a/plugs/api/role.ts b/plugs/api/role.ts
new file mode 100644
index 0000000..02ffb8e
--- /dev/null
+++ b/plugs/api/role.ts
@@ -0,0 +1,88 @@
+import { get, post, put, delate } from '../http/axios';
+const root = 'role';
+const publik = 'public/roles';
+
+export const list = (example) => {
+ return new Promise((resolve, reject) => {
+ get(root, example).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve([]);
+ }
+ },
+ (err) => {
+ resolve([]);
+ }
+ );
+ });
+};
+
+export const mapping = () => {
+ return new Promise((resolve, reject) => {
+ get(publik).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve([]);
+ }
+ },
+ (err) => {
+ resolve([]);
+ }
+ );
+ });
+};
+
+export const add = (role) => {
+ return new Promise((resolve, reject) => {
+ post(root, role).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve(false);
+ }
+ },
+ (err) => {
+ resolve(false);
+ }
+ );
+ });
+};
+
+export const set = (role) => {
+ return new Promise((resolve, reject) => {
+ put(root, role).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve(false);
+ }
+ },
+ (err) => {
+ resolve(false);
+ }
+ );
+ });
+};
+
+export const del = (role) => {
+ return new Promise((resolve, reject) => {
+ delate(root + '/' + role.roleCode).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve(false);
+ }
+ },
+ (err) => {
+ resolve(false);
+ }
+ );
+ });
+};
diff --git a/plugs/api/user.ts b/plugs/api/user.ts
new file mode 100644
index 0000000..bd454e3
--- /dev/null
+++ b/plugs/api/user.ts
@@ -0,0 +1,87 @@
+import { get, post, put, delate } from '../http/axios';
+const root = 'user';
+
+export const list = (example) => {
+ return new Promise((resolve, reject) => {
+ get(root, example).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve([]);
+ }
+ },
+ (err) => {
+ resolve([]);
+ }
+ );
+ });
+};
+
+export const add = (user) => {
+ return new Promise((resolve, reject) => {
+ post(root, user).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve(false);
+ }
+ },
+ (err) => {
+ resolve(false);
+ }
+ );
+ });
+};
+
+export const set = (user) => {
+ return new Promise((resolve, reject) => {
+ put(root, user).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve(false);
+ }
+ },
+ (err) => {
+ resolve(false);
+ }
+ );
+ });
+};
+
+export const del = (user) => {
+ return new Promise((resolve, reject) => {
+ delate(root + '/' + user.userId).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve(false);
+ }
+ },
+ (err) => {
+ resolve(false);
+ }
+ );
+ });
+};
+
+export const reset = (user) => {
+ return new Promise((resolve, reject) => {
+ put(root + '/' + user.userId).then(
+ (rsp: any) => {
+ if (rsp) {
+ resolve(rsp);
+ } else {
+ resolve(false);
+ }
+ },
+ (err) => {
+ resolve(false);
+ }
+ );
+ });
+};
diff --git a/plugs/element/message.ts b/plugs/element/message.ts
index dd325ed..2b5d455 100644
--- a/plugs/element/message.ts
+++ b/plugs/element/message.ts
@@ -79,7 +79,7 @@ export const confirm = (msg: string, title: string) => {
resolve(true);
})
.catch((error) => {
- resolve(false);
+ //do nothing
});
});
};
diff --git a/plugs/element/rule.ts b/plugs/element/rule.ts
index 5bb0227..373f14e 100644
--- a/plugs/element/rule.ts
+++ b/plugs/element/rule.ts
@@ -9,9 +9,7 @@ export class SimpleRequired {
validator = (rule: any, value: any, callback: any) => {
if (value == null || value === '') {
const k = this.selection ? 'rule.pleaseSelect' : 'rule.pleaseEnter';
- const msg = this.name
- ? t(k) + t(this.name).toLowerCase()
- : t('rule.notNull');
+ const msg = this.name ? t(k) + t(this.name).toLowerCase() : t('rule.notNull');
callback(new Error(msg));
}
callback();
@@ -96,10 +94,7 @@ export class Hexadecimal {
validator = (rule: any, value: any, callback: any) => {
if (value == null) {
callback();
- } else if (
- value.trim().length == 0 ||
- !new RegExp(/^[0-9a-fA-F\s]+$/).test(value)
- ) {
+ } else if (value.trim().length == 0 || !new RegExp(/^[0-9a-fA-F\s]+$/).test(value)) {
callback(new Error(t('rule.hexadecimal')));
} else if (this.min != null && value.length < this.min) {
callback(new Error(t('rule.minLen', [this.min])));
@@ -117,11 +112,7 @@ export class Hexadecimal {
export class Longitude extends Character {
constructor() {
- super(
- new RegExp(
- /^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/
- )
- );
+ super(new RegExp(/^-?((0|1?[0-7]?[0-9]?)(([.][0-9]{1,6})?)|180(([.][0]{1,6})?))$/));
}
}
export class Latitude extends Character {
@@ -132,20 +123,12 @@ export class Latitude extends Character {
export class Email extends Character {
constructor() {
- super(
- new RegExp(
- /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
- )
- );
+ super(new RegExp(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/));
}
}
export class Phone extends Character {
constructor() {
- super(
- new RegExp(
- /^(0|86|17951)?(13[0-9]|15[012356789]|17[0135678]|18[0-9]|14[57])[0-9]{8}$/
- )
- );
+ super(new RegExp(/^(0|86|17951)?(13[0-9]|15[012356789]|17[0135678]|18[0-9]|14[57])[0-9]{8}$/));
}
}
@@ -215,17 +198,9 @@ export class IdCard {
callback(new Error(t('rule.idCard.area')));
}
- const sBirthday =
- value.substr(6, 4) +
- '-' +
- Number(value.substr(10, 2)) +
- '-' +
- Number(value.substr(12, 2));
+ const sBirthday = value.substr(6, 4) + '-' + Number(value.substr(10, 2)) + '-' + Number(value.substr(12, 2));
const d = new Date(sBirthday.replace(/-/g, '/'));
- if (
- sBirthday !=
- d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()
- ) {
+ if (sBirthday != d.getFullYear() + '-' + (d.getMonth() + 1) + '-' + d.getDate()) {
callback(new Error(t('rule.idCard.birth')));
}
for (let i = 17; i >= 0; i--) {
@@ -256,6 +231,27 @@ export class SimplePassword {
};
}
+export class Username {
+ required: boolean = true;
+ trigger = 'blur';
+ min?: Number = 4;
+ max?: Number = 16;
+ validator = (rule: any, value: any, callback: any) => {
+ if (value != null && value.length != 0) {
+ if (!new RegExp('^[a-zA-Z0-9]{4,16}$').test(value)) {
+ callback(new Error(t('rule.username.0')));
+ }
+ if (/(^\_)|(\__)|(\_+$)/.test(value)) {
+ callback(new Error(t('rule.username.1')));
+ }
+ if (!new RegExp('^[^ ]+$').test(value)) {
+ callback(new Error(t('rule.username.2')));
+ }
+ }
+ callback();
+ };
+}
+
export class Password {
required: boolean = true;
trigger = 'blur';
@@ -266,9 +262,7 @@ export class Password {
callback(new Error(t('rule.pleaseEnter') + t('pwd.pwd').toLowerCase()));
} else if (value.length < 8 || value.length > 20) {
callback(new Error(t('pwd.length', [8, 20])));
- } else if (
- !new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$').test(value)
- ) {
+ } else if (!new RegExp('^(?=.*[0-9])(?=.*[a-z])(?=.*[A-Z]).*$').test(value)) {
callback(new Error(t('pwd.required')));
} else if (!new RegExp('^[^ ]+$').test(value)) {
callback(new Error(t('pwd.noSpace')));
@@ -276,3 +270,14 @@ export class Password {
callback();
};
}
+
+export class Name {
+ pattern: RegExp = new RegExp('^[a-zA-Z\u4e00-\u9fa5]{1,10}$');
+ trigger = 'blur';
+ validator = (rule: any, value: any, callback: any) => {
+ if (value != null && value.length != 0 && !this.pattern.test(value)) {
+ callback(new Error(t('rule.name')));
+ }
+ callback();
+ };
+}
diff --git a/plugs/http/axios.ts b/plugs/http/axios.ts
index abf938f..0f93cb0 100644
--- a/plugs/http/axios.ts
+++ b/plugs/http/axios.ts
@@ -1,9 +1,12 @@
/* eslint-disable */
import axios from 'axios';
import { loading, close, showMessage } from '../element';
+import { useRouter } from 'vue-router';
import { i18n } from '../i18n';
const t = i18n.t;
+const router = useRouter();
+
const config = {
baseURL: process.env.VUE_APP_BASE_URL ? '/api' : '',
timeout: 60 * 1000,
@@ -13,8 +16,7 @@ const config = {
const _axios = axios.create(config);
_axios.defaults.headers.post['Content-Type'] = 'application/json;charset=UTF-8';
_axios.defaults.headers.put['Content-Type'] = 'application/json;charset=UTF-8';
-_axios.defaults.headers.delete['Content-Type'] =
- 'application/json;charset=UTF-8';
+_axios.defaults.headers.delete['Content-Type'] = 'application/json;charset=UTF-8';
let logout;
@@ -159,7 +161,7 @@ function handResponse(response, resolve, noMsg, noLoading) {
}
} else {
if (response.message == 'session timeout') {
- logout();
+ router.push('/login');
}
if (response.message == 'no permission') {
response.message = t('http.unPermission');
diff --git a/plugs/i18n/en.ts b/plugs/i18n/en.ts
index 0eb5776..87ee934 100644
--- a/plugs/i18n/en.ts
+++ b/plugs/i18n/en.ts
@@ -18,7 +18,7 @@ export default class English {
key: 'Key',
value: 'Value',
import: 'Import',
- export: 'Export'
+ export: 'Export',
};
pwd = {
@@ -75,6 +75,12 @@ export default class English {
birth: 'The date of birth on the ID card is illegal',
error: 'The ID number is illegal',
},
+ username: [
+ 'The username consists of letters, numbers, and is between 4-16 in length',
+ "Usernames cannot be underscored '_'",
+ 'Usernames cannot contain spaces',
+ ],
+ name: 'The name consists of Chinese characters or letters and is no more than 10 in length',
};
http = {
@@ -112,12 +118,28 @@ export default class English {
delete: ['Are you sure you want to remove the permission?', 'Tips'],
};
+ role = {
+ title: 'Role manage',
+ name: 'role',
+ prop: ['Code', 'Name', 'Remark', 'Status', 'Action'],
+ setPer: ['Assign permissions'],
+ delete: ['Are you sure you want to remove the role?', 'Tips'],
+ };
+
+ user = {
+ title: 'User manage',
+ name: 'user',
+ prop: ['Username', 'Password', 'Role', 'Name', 'Phone', 'IdCard', 'Email', 'Action'],
+ delete: ['Are you sure you want to remove the user?', 'Tips'],
+ reset: ['Reset password', 'Are you sure you want to reset the password of this user to the default password "abcd1234"?', 'Tips'],
+ };
+
buffer = {
- title: '缓存管理',
- clean: '清空失效缓存',
- modify: '修改有效期',
- prop: ['缓存值', '唯一键', '是否有效', '失效时间', '操作'],
- delete: ['确定要删除此条缓存吗?', '提示'],
- delay: ['请输入失效时间(yyyy-MM-dd HH:mm:ss)', '修改'],
+ title: 'Cache manage',
+ clean: 'Clear the invalid cache',
+ modify: 'Modify the expiration date',
+ prop: ['Value', 'Key', 'Effective', 'Expiration time', 'Action'],
+ delete: ['Are you sure you want to delete this cache?', 'Tips'],
+ delay: ['Please enter an expiration time(yyyy-MM-dd HH:mm:ss)', 'Modify'],
};
}
diff --git a/plugs/i18n/zh.ts b/plugs/i18n/zh.ts
index 29db071..29807fe 100644
--- a/plugs/i18n/zh.ts
+++ b/plugs/i18n/zh.ts
@@ -18,7 +18,7 @@ export default class Zh {
key: '键',
value: '值',
import: '导入',
- export: '导出'
+ export: '导出',
};
pwd = {
@@ -75,6 +75,8 @@ export default class Zh {
birth: '你输入的身份证出生日期非法',
error: '你输入的身份证号非法',
},
+ username: ['用户名由字母,数字组成,长度4-16之间', "用户名首尾不能出现下划线'_'", '用户名不能包含空格'],
+ name: '姓名由汉字或字母组成,且长度不超过10',
};
http = {
@@ -85,7 +87,7 @@ export default class Zh {
};
preMenu = {
- operator: ['缓存管理', '系统配置', '数据字典', '权限管理', '角色管理', '状态管理', '接口日志'],
+ operator: ['缓存管理', '系统配置', '数据字典', '权限管理', '角色管理', '用户管理', '状态管理', '接口日志'],
};
log = {
@@ -112,6 +114,22 @@ export default class Zh {
delete: ['确定要删除该权限吗?', '提示'],
};
+ role = {
+ title: '角色管理',
+ name: '角色',
+ prop: ['角色编码', '角色名称', '备注', '角色状态', '操作'],
+ setPer: ['分配权限'],
+ delete: ['确定要删除该角色吗?', '提示'],
+ };
+
+ user = {
+ title: '用户管理',
+ name: '用户',
+ prop: ['用户名', '密码', '用户角色', '姓名', '手机号码', '身份证号', '邮箱', '操作'],
+ delete: ['确定要删除该用户吗?', '提示'],
+ reset: ['重置密码', '确定要将该用户密码重置为默认密码"Abcd1234"吗?', '提示'],
+ };
+
buffer = {
title: '缓存管理',
clean: '清空失效缓存',
diff --git a/plugs/store/index.ts b/plugs/store/index.ts
index de8d27e..f37286b 100644
--- a/plugs/store/index.ts
+++ b/plugs/store/index.ts
@@ -1,6 +1,7 @@
import { createStore as create } from 'vuex';
import { Styles, Size } from '../config';
-import { getByCodes, getInfo } from '../api/public';
+import { getByCodes, getMenus, logout } from '../api/public';
+import { mapping } from '../api/role';
export class State {
dict = {
@@ -9,6 +10,9 @@ export class State {
B: '禁用',
},
};
+ roles = {};
+ menus = [];
+ roleRefresh = true;
style = Styles.plain;
size = Size.normal;
}
@@ -41,6 +45,19 @@ export class Actions {
}
});
};
+ getRoleMap = ({ state, commit }) => {
+ state.roleRefresh &&
+ mapping().then((rsp) => {
+ commit('updateState', ['roles', rsp]);
+ commit('updateState', ['roleRefresh', false]);
+ });
+ };
+ getMenus = ({ state, commit }) => {
+ getMenus().then((rsp) => commit('updateState', ['menus', rsp]));
+ };
+ logout = ({ state, commit }) => {
+ logout().then((rsp) => window.location.reload());
+ };
}
export class Mutations {