使用vuex

This commit is contained in:
kuaifan 2021-05-31 22:06:42 +08:00
parent 3646554e73
commit bf89968281
18 changed files with 199 additions and 273 deletions

View File

@ -153,40 +153,21 @@ class UsersController extends AbstractController
* @apiSuccess {Object} data 返回数据 * @apiSuccess {Object} data 返回数据
* @apiSuccessExample {json} data: * @apiSuccessExample {json} data:
{ {
"userid":1, "userid": 1,
"agentid":0, "identity": [ ],
"identity":[ "az": "",
"admin" "email": "admin@admin.com",
], "username": "admin@admin.com",
"token":"MUBhZG1pbkAwRWFGSFhAMTYwODY5MjM0MUBXcVJpQ1Q=", "nickname": "admin",
"az":"G", "userimg": "",
"username":"admin", "loginnum": 10,
"nickname":"管理员", "changepass": 0,
"userimg":"http://127.0.0.1:6006/images/other/avatar.png", "lastip": "10.22.22.1",
"loginnum":10, "lastdate": 1622468661,
"changepass":0, "lineip": "10.22.22.1",
"lastip":"172.18.0.1", "linedate": 1622468661,
"lastdate":1608692341, "regip": "",
"lineip":"172.18.0.1", "regdate": 0,
"linedate":1608704450,
"regip":"127.0.0.1",
"regdate":1600856611,
"setting":null,
"time":1608704450,
"setpass":1,
"service":{
"id":1,
"type":1,
"create_id":1,
"created_at":"2020-12-23 14:39:51",
"expire_at":"2021-01-23 14:39:51",
"type_name":"商业版",
"member":10,
"network":3
},
"num_member":3,
"num_network":2
} }
*/ */
public function info() public function info()

View File

@ -61,8 +61,20 @@ class User extends AbstractModel
protected $hidden = [ protected $hidden = [
'encrypt', 'encrypt',
'userpass', 'userpass',
'created_at',
'updated_at',
]; ];
/**
* 用户名
* @param $value
* @return string
*/
public function getUsernameAttribute($value)
{
return $value ?: $this->email;
}
/** /**
* 昵称 * 昵称
* @param $value * @param $value
@ -84,7 +96,7 @@ class User extends AbstractModel
* @param $value * @param $value
* @return string * @return string
*/ */
public function getUseringAttribute($value) public function getUserimgAttribute($value)
{ {
return self::userimg($value); return self::userimg($value);
} }
@ -96,7 +108,10 @@ class User extends AbstractModel
*/ */
public function getIdentityAttribute($value) public function getIdentityAttribute($value)
{ {
return is_array($value) ? $value : explode(",", trim($value, ",")); if (empty($value)) {
return [];
}
return array_filter(is_array($value) ? $value : explode(",", trim($value, ",")));
} }
@ -256,23 +271,18 @@ class User extends AbstractModel
if ($authInfo['timestamp'] + $loginValid > time()) { if ($authInfo['timestamp'] + $loginValid > time()) {
$row = self::whereUserid($authInfo['userid'])->whereUsername($authInfo['username'])->whereEncrypt($authInfo['encrypt'])->first(); $row = self::whereUserid($authInfo['userid'])->whereUsername($authInfo['username'])->whereEncrypt($authInfo['encrypt'])->first();
if ($row) { if ($row) {
if ($row->token) { $upArray = [];
$timestamp = self::authFind('timestamp', $row->token); if (Base::getIp() && $row->lineip != Base::getIp()) {
if ($timestamp + $loginValid > time()) { $upArray['lineip'] = Base::getIp();
$upArray = [];
if (Base::getIp() && $row->lineip != Base::getIp()) {
$upArray['lineip'] = Base::getIp();
}
if ($row->linedate + 30 < time()) {
$upArray['linedate'] = time();
}
if ($upArray) {
$row->updateInstance($upArray);
$row->save();
}
return $_A["__static_auth"] = $row;
}
} }
if ($row->linedate + 30 < time()) {
$upArray['linedate'] = time();
}
if ($upArray) {
$row->updateInstance($upArray);
$row->save();
}
return $_A["__static_auth"] = $row;
} }
} }
} }

View File

@ -19,12 +19,6 @@
} }
}, },
mounted() { mounted() {
this.checkToken();
//
if ($A.getToken() !== false) {
$A.getUserInfo(true);
}
//
let hash = window.location.hash; let hash = window.location.hash;
if (hash.indexOf("#") === 0) { if (hash.indexOf("#") === 0) {
hash = hash.substr(1); hash = hash.substr(1);
@ -56,23 +50,6 @@
} }
}, },
methods: { methods: {
checkToken() {
let token = $A.urlParameter("token");
if ($A.count(token) > 10) {
$.setToken(decodeURIComponent(token));
$A.getUserInfo(true);
let path = $A.removeURLParameter(window.location.href, 'token');
let uri = document.createElement('a');
uri.href = path;
if (uri.pathname) {
let query = $A.urlParameterAll();
if (typeof query['token'] !== "undefined") delete query['token'];
this.$nextTick(() => {
this.goForward({path: uri.pathname, query}, true);
});
}
}
},
slideType(To, From) { slideType(To, From) {
let isBack = this.$router.isBack; let isBack = this.$router.isBack;
this.$router.isBack = false; this.$router.isBack = false;

View File

@ -5,17 +5,15 @@ import routes from './routes'
import VueRouter from 'vue-router' import VueRouter from 'vue-router'
import ViewUI from 'view-design-hi'; import ViewUI from 'view-design-hi';
import Language from './language/index' import Language from './language/index'
import Mixins from './mixins/index'
import store from './store/index' import store from './store/index'
import './functions/common' import './functions/common'
import './functions/app' import './functions/web'
Vue.use(Vuex); Vue.use(Vuex);
Vue.use(ViewUI); Vue.use(ViewUI);
Vue.use(VueRouter); Vue.use(VueRouter);
Vue.use(Language); Vue.use(Language);
Vue.use(Mixins);
import PageTitle from './components/PageTitle.vue' import PageTitle from './components/PageTitle.vue'
import Loading from './components/Loading.vue' import Loading from './components/Loading.vue'

View File

@ -362,7 +362,7 @@
return { return {
actionUrl: $A.apiUrl('system/imgupload'), actionUrl: $A.apiUrl('system/imgupload'),
params: { params: {
token: $A.getToken(), token: this.$store.state.userToken,
width: this.width, width: this.width,
height: this.height height: this.height
}, },
@ -518,7 +518,7 @@
$A.noticeWarning(this.$L('最多只能上传 ' + this.maxNum + ' 张图片。')); $A.noticeWarning(this.$L('最多只能上传 ' + this.maxNum + ' 张图片。'));
} }
this.params = { this.params = {
token: $A.getToken(), token: this.$store.state.userToken,
width: this.width, width: this.width,
height: this.height height: this.height
}; };

View File

@ -217,7 +217,7 @@
uploadIng: 0, uploadIng: 0,
uploadFormat: ['jpg', 'jpeg', 'png', 'gif', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'esp', 'pdf', 'rar', 'zip', 'gz'], uploadFormat: ['jpg', 'jpeg', 'png', 'gif', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'esp', 'pdf', 'rar', 'zip', 'gz'],
actionUrl: $A.apiUrl('system/fileupload'), actionUrl: $A.apiUrl('system/fileupload'),
params: { token: $A.getToken() }, params: { token: this.$store.state.userToken },
maxSize: 10240 maxSize: 10240
}; };
}, },
@ -553,7 +553,7 @@
handleBeforeUpload() { handleBeforeUpload() {
// //
this.params = { this.params = {
token: $A.getToken(), token: this.$store.state.userToken,
}; };
return true; return true;
}, },

View File

@ -29,20 +29,6 @@
return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && typeof obj.length == "undefined"; return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && typeof obj.length == "undefined";
}, },
/**
* 身份识别码
* @param text
* @returns {*|string}
*/
token: function (text) {
let token = this.storage('token') || '';
if (typeof text === 'string') {
this.storage('token', text);
token = text;
}
return token;
},
/** /**
* 随机获取范围 * 随机获取范围
* @param Min * @param Min
@ -1334,7 +1320,6 @@
if (typeof params.header !== 'object') params.header = {}; if (typeof params.header !== 'object') params.header = {};
params.header['Content-Type'] = 'application/json'; params.header['Content-Type'] = 'application/json';
params.header['language'] = language; params.header['language'] = language;
params.header['token'] = $A.token();
// //
params.data['__Access-Control-Allow-Origin'] = true; params.data['__Access-Control-Allow-Origin'] = true;
params.beforeSend(); params.beforeSend();

View File

@ -39,6 +39,7 @@
if (typeof params.success === 'undefined') params.success = () => { }; if (typeof params.success === 'undefined') params.success = () => { };
if (typeof params.header !== 'object') params.header = {}; if (typeof params.header !== 'object') params.header = {};
params.url = this.apiUrl(params.url); params.url = this.apiUrl(params.url);
params.header['token'] = $A.app.$store.state.userToken;
// //
let beforeCall = params.beforeSend; let beforeCall = params.beforeSend;
params.beforeSend = () => { params.beforeSend = () => {
@ -165,60 +166,6 @@
}; };
}, },
/**
* 获取token
* @returns {boolean}
*/
getToken() {
let token = $A.token();
return $A.count(token) < 10 ? false : token;
},
/**
* 设置token
* @param token
*/
setToken(token) {
$A.token(token);
},
/**
* 获取会员ID
* @returns string
*/
getUserId() {
if ($A.getToken() === false) {
return "";
}
let userInfo = $A.getUserInfo();
return $A.runNum(userInfo.userid);
},
/**
* 获取会员账号
* @returns string
*/
getUserName() {
if ($A.getToken() === false) {
return "";
}
let userInfo = $A.getUserInfo();
return $A.ishave(userInfo.username) ? userInfo.username : '';
},
/**
* 获取会员昵称
* @param nullName
* @returns {string|*}
*/
getNickName(nullName = true) {
if ($A.getToken() === false) {
return "";
}
let userInfo = $A.getUserInfo();
return $A.ishave(userInfo.nickname) ? userInfo.nickname : '';
},
/** /**
* 获取用户信息并保存 * 获取用户信息并保存
* @param callback 网络请求获取到用户信息回调监听用户信息发生变化 * @param callback 网络请求获取到用户信息回调监听用户信息发生变化
@ -233,20 +180,18 @@
}, },
success: (res) => { success: (res) => {
if (res.ret === 1) { if (res.ret === 1) {
$A.storage("userInfo", res.data); $A.app.$store.commit('setUserInfo', res.data);
$A.setToken(res.data.token);
$A.triggerUserInfoListener(res.data);
$A.updateUserBasic({ $A.updateUserBasic({
username: res.data.username, username: res.data.username,
nickname: res.data.nickname, nickname: res.data.nickname,
userimg: res.data.userimg, userimg: res.data.userimg,
}); });
typeof callback === "function" && callback(res.data, $A.getToken() !== false); typeof callback === "function" && callback(res.data, $A.app.$store.state.userToken);
} }
}, },
}); });
} }
return $A.jsonParse($A.storage("userInfo")); return $A.app.$store.state.userInfo;
}, },
/** /**
@ -406,15 +351,9 @@
* 打开登录页面 * 打开登录页面
*/ */
userLogout() { userLogout() {
$A.token(""); const from = window.location.pathname == '/' ? '' : encodeURIComponent(window.location.href);
$A.storage("userInfo", {}); $A.app.$store.commit('setUserInfo', {});
$A.triggerUserInfoListener({}); $A.app.goForward({path: '/login', query: from ? {from: from} : {}}, true);
let from = window.location.pathname == '/' ? '' : encodeURIComponent(window.location.href);
if (typeof $A.app === "object") {
$A.app.goForward({path: '/users/login', query: from ? {from: from} : {}}, true);
} else {
window.location.replace($A.webUrl('users/login') + (from ? ('?from=' + from) : ''));
}
}, },
/** /**
@ -423,7 +362,7 @@
* @returns {boolean} * @returns {boolean}
*/ */
identityCheck(role) { identityCheck(role) {
let userInfo = $A.getUserInfo(); const userInfo = $A.app.$store.state.userInfo;
return $A.identityRaw(role, userInfo.identity); return $A.identityRaw(role, userInfo.identity);
}, },
@ -442,41 +381,6 @@
}); });
return isRole; return isRole;
}, },
/**
* 监听用户信息发生变化
* @param listenerName 监听标识
* @param callback 监听回调
*/
setOnUserInfoListener(listenerName, callback) {
if (typeof listenerName != "string") {
return;
}
if (typeof callback === "function") {
$A.__userInfoListenerObject[listenerName] = {
callback: callback,
}
}
},
removeUserInfoListener(listenerName) {
if (typeof listenerName != "string") {
return;
}
if (typeof $A.__userInfoListenerObject[listenerName] != "undefined") {
delete $A.__userInfoListenerObject[listenerName];
}
},
triggerUserInfoListener(userInfo) {
let key, item;
for (key in $A.__userInfoListenerObject) {
if (!$A.__userInfoListenerObject.hasOwnProperty(key)) continue;
item = $A.__userInfoListenerObject[key];
if (typeof item.callback === "function") {
item.callback(userInfo, $A.getToken() !== false);
}
}
},
__userInfoListenerObject: {},
}); });
/** /**
@ -829,9 +733,9 @@
url+= "/ws"; url+= "/ws";
} }
let config = { let config = {
userid: $A.getUserId(), userid: $A.app.$store.state.userInfo.userid,
url: url, url: url,
token: $A.getToken(), token: $A.app.$store.state.userToken,
}; };
if (window.webSocketConfig.DEBUG) { if (window.webSocketConfig.DEBUG) {
config.logCallback = function (msg) { config.logCallback = function (msg) {

View File

@ -1,55 +0,0 @@
export default {
install(Vue) {
Vue.mixin({
data() {
return {
mixinId: 0,
//用户信息
userLogin: false,
userInfo: {},
userName: '',
userId: 0,
//浏览器宽度≤768返回true
windowMax768: window.innerWidth <= 768,
}
},
mounted() {
if (typeof window.__mixinId != "number") window.__mixinId = 0;
this.mixinId = window.__mixinId++;
//
this.userLogin = $A.getToken() !== false;
this.userInfo = $A.getUserInfo();
this.userName = this.userInfo.username || '';
this.userId = parseInt(this.userInfo.userid);
$A.setOnUserInfoListener('mixins_' + this.mixinId, (data, isLogin) => {
this.userLogin = isLogin;
this.userInfo = data;
this.userName = this.userInfo.username || '';
this.userId = parseInt(this.userInfo.userid);
});
//
window.addEventListener('resize', this.windowMax768Listener);
},
beforeDestroy() {
$A.removeUserInfoListener('mixins_' + this.mixinId);
window.removeEventListener('resize', this.windowMax768Listener);
},
methods: {
isArray(obj) {
return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == '[object array]' && typeof obj.length == "number";
},
isJson(obj) {
return typeof (obj) == "object" && Object.prototype.toString.call(obj).toLowerCase() == "[object object]" && typeof obj.length == "undefined";
},
windowMax768Listener() {
this.windowMax768 = window.innerWidth <= 768
}
}
});
}
}

View File

@ -173,7 +173,7 @@ export default {
}, },
success: (res) => { success: (res) => {
if (res.ret === 1) { if (res.ret === 1) {
this.$store.commit('userInfo', res.data); this.$store.commit('setUserInfo', res.data);
// //
this.goNext(); this.goNext();
} else { } else {

View File

@ -12,7 +12,7 @@
</li> </li>
<li> <li>
<Icon type="md-cog" /> <Icon type="md-cog" />
<div class="menu-title">Settings</div> <div class="menu-title">Setting</div>
</li> </li>
<li> <li>
<Icon type="md-calendar" /> <Icon type="md-calendar" />
@ -195,7 +195,7 @@ export default {
} }
}, },
mounted() { mounted() {
$A.getUserInfo(true);
}, },
} }
</script> </script>

View File

@ -0,0 +1,17 @@
<template>
<div class="calendar">
<PageTitle>{{$L('Calendar')}}</PageTitle>
</div>
</template>
<script>
export default {
data() {
return {}
},
mounted() {
},
}
</script>

View File

@ -10,7 +10,7 @@
<li class="project-icon"> <li class="project-icon">
<Icon type="ios-search-outline" /> <Icon type="ios-search-outline" />
</li> </li>
<li class="project-icon" @click="$store.commit('projectChatShowToggle');"> <li class="project-icon" @click="$store.commit('toggleProjectChatShow');">
<Icon type="ios-chatbubbles-outline" /> <Icon type="ios-chatbubbles-outline" />
<Badge :count="999"></Badge> <Badge :count="999"></Badge>
</li> </li>

View File

@ -1,5 +1,8 @@
<template> <template>
<div>dashboard</div> <div class="dashboard">
<PageTitle>{{$L('Dashboard')}}</PageTitle>
</div>
</template> </template>
<script> <script>

View File

@ -0,0 +1,17 @@
<template>
<div class="setting">
<PageTitle>{{$L('Setting')}}</PageTitle>
</div>
</template>
<script>
export default {
data() {
return {}
},
mounted() {
},
}
</script>

View File

@ -17,6 +17,16 @@ export default [
path: 'dashboard', path: 'dashboard',
component: () => import('./pages/manage/dashboard.vue'), component: () => import('./pages/manage/dashboard.vue'),
}, },
{
name: 'manage-calendar',
path: 'calendar',
component: () => import('./pages/manage/calendar.vue'),
},
{
name: 'manage-setting',
path: 'setting',
component: () => import('./pages/manage/setting.vue'),
},
{ {
name: 'manage-project-detail', name: 'manage-project-detail',
path: 'project/:id', path: 'project/:id',

View File

@ -1,11 +1,14 @@
export default { export default {
projectChatShowToggle(state) { toggleProjectChatShow(state) {
state.projectChatShow = !state.projectChatShow state.projectChatShow = !state.projectChatShow
state.setStorage('projectChatShow', state.projectChatShow); state.setStorage('projectChatShow', state.projectChatShow);
}, },
userInfo(state, info) { setUserInfo(state, info) {
state.userInfo = info const userInfo = state._cloneJSON(info);
state.setStorage('userInfo', info); userInfo.userid = state._runNum(userInfo.userid);
state.setStorage('token', state._isJson(info) ? info.token : ''); userInfo.token = userInfo.userid > 0 ? (userInfo.token || state.userToken) : '';
state.userInfo = userInfo;
state.userToken = userInfo.token;
state.setStorage('userInfo', state.userInfo);
} }
} }

View File

@ -1,4 +1,4 @@
const state = { const stateCommon = {
setStorage(key, value) { setStorage(key, value) {
return this._storage(key, value); return this._storage(key, value);
}, },
@ -85,10 +85,86 @@ const state = {
return def; return def;
} }
}, },
_count(obj) {
try {
if (typeof obj === "undefined") {
return 0;
}
if (typeof obj === "number") {
obj += "";
}
if (typeof obj.length === 'number') {
return obj.length;
} else {
let i = 0, key;
for (key in obj) {
i++;
}
return i;
}
} catch (e) {
return 0;
}
},
_runNum(str, fixed) {
let _s = Number(str);
if (_s + "" === "NaN") {
_s = 0;
}
if (/^[0-9]*[1-9][0-9]*$/.test(fixed)) {
_s = _s.toFixed(fixed);
let rs = _s.indexOf('.');
if (rs < 0) {
_s += ".";
for (let i = 0; i < fixed; i++) {
_s += "0";
}
}
}
return _s;
},
_cloneJSON(myObj) {
if(typeof(myObj) !== 'object') return myObj;
if(myObj === null) return myObj;
return this._jsonParse(this._jsonStringify(myObj))
},
_jsonParse(str, defaultVal) {
if (str === null) {
return defaultVal ? defaultVal : {};
}
if (typeof str === "object") {
return str;
}
try {
return JSON.parse(str.replace(/\n/g,"\\n").replace(/\r/g,"\\r"));
} catch (e) {
return defaultVal ? defaultVal : {};
}
},
_jsonStringify(json, defaultVal) {
if (typeof json !== 'object') {
return json;
}
try{
return JSON.stringify(json);
}catch (e) {
return defaultVal ? defaultVal : "";
}
}
}; };
export default Object.assign(state, { const projectChatShow = stateCommon.getStorageBoolean('projectChatShow', true);
projectChatShow: state.getStorageBoolean('projectChatShow', true), const userInfo = stateCommon.getStorageJson('userInfo');
userInfo: state.getStorageJson('userInfo'), const userToken = userInfo.token;
token: state.getStorageString('token'), userInfo.userid = stateCommon._runNum(userInfo.userid);
export default Object.assign(stateCommon, {
projectChatShow,
userInfo,
userToken,
}) })