diff --git a/app/Http/Controllers/Api/UsersController.php b/app/Http/Controllers/Api/UsersController.php index 1a1be909..eab1b08d 100755 --- a/app/Http/Controllers/Api/UsersController.php +++ b/app/Http/Controllers/Api/UsersController.php @@ -153,40 +153,21 @@ class UsersController extends AbstractController * @apiSuccess {Object} data 返回数据 * @apiSuccessExample {json} data: { - "userid":1, - "agentid":0, - "identity":[ - "admin" - ], - "token":"MUBhZG1pbkAwRWFGSFhAMTYwODY5MjM0MUBXcVJpQ1Q=", - "az":"G", - "username":"admin", - "nickname":"管理员", - "userimg":"http://127.0.0.1:6006/images/other/avatar.png", - "loginnum":10, - "changepass":0, - "lastip":"172.18.0.1", - "lastdate":1608692341, - "lineip":"172.18.0.1", - "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 + "userid": 1, + "identity": [ ], + "az": "", + "email": "admin@admin.com", + "username": "admin@admin.com", + "nickname": "admin", + "userimg": "", + "loginnum": 10, + "changepass": 0, + "lastip": "10.22.22.1", + "lastdate": 1622468661, + "lineip": "10.22.22.1", + "linedate": 1622468661, + "regip": "", + "regdate": 0, } */ public function info() diff --git a/app/Models/User.php b/app/Models/User.php index 868b3a0b..3b6ac2b6 100644 --- a/app/Models/User.php +++ b/app/Models/User.php @@ -61,8 +61,20 @@ class User extends AbstractModel protected $hidden = [ 'encrypt', 'userpass', + 'created_at', + 'updated_at', ]; + /** + * 用户名 + * @param $value + * @return string + */ + public function getUsernameAttribute($value) + { + return $value ?: $this->email; + } + /** * 昵称 * @param $value @@ -84,7 +96,7 @@ class User extends AbstractModel * @param $value * @return string */ - public function getUseringAttribute($value) + public function getUserimgAttribute($value) { return self::userimg($value); } @@ -96,7 +108,10 @@ class User extends AbstractModel */ 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()) { $row = self::whereUserid($authInfo['userid'])->whereUsername($authInfo['username'])->whereEncrypt($authInfo['encrypt'])->first(); if ($row) { - if ($row->token) { - $timestamp = self::authFind('timestamp', $row->token); - if ($timestamp + $loginValid > time()) { - $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; - } + $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; } } } diff --git a/resources/assets/js/App.vue b/resources/assets/js/App.vue index 0b1205ad..c3fd7ae9 100755 --- a/resources/assets/js/App.vue +++ b/resources/assets/js/App.vue @@ -19,12 +19,6 @@ } }, mounted() { - this.checkToken(); - // - if ($A.getToken() !== false) { - $A.getUserInfo(true); - } - // let hash = window.location.hash; if (hash.indexOf("#") === 0) { hash = hash.substr(1); @@ -56,23 +50,6 @@ } }, 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) { let isBack = this.$router.isBack; this.$router.isBack = false; diff --git a/resources/assets/js/app.js b/resources/assets/js/app.js index c42b9a38..ec9d13eb 100644 --- a/resources/assets/js/app.js +++ b/resources/assets/js/app.js @@ -5,17 +5,15 @@ import routes from './routes' import VueRouter from 'vue-router' import ViewUI from 'view-design-hi'; import Language from './language/index' -import Mixins from './mixins/index' import store from './store/index' import './functions/common' -import './functions/app' +import './functions/web' Vue.use(Vuex); Vue.use(ViewUI); Vue.use(VueRouter); Vue.use(Language); -Vue.use(Mixins); import PageTitle from './components/PageTitle.vue' import Loading from './components/Loading.vue' diff --git a/resources/assets/js/components/ImgUpload.vue b/resources/assets/js/components/ImgUpload.vue index c6606f9c..778d26c1 100755 --- a/resources/assets/js/components/ImgUpload.vue +++ b/resources/assets/js/components/ImgUpload.vue @@ -362,7 +362,7 @@ return { actionUrl: $A.apiUrl('system/imgupload'), params: { - token: $A.getToken(), + token: this.$store.state.userToken, width: this.width, height: this.height }, @@ -518,7 +518,7 @@ $A.noticeWarning(this.$L('最多只能上传 ' + this.maxNum + ' 张图片。')); } this.params = { - token: $A.getToken(), + token: this.$store.state.userToken, width: this.width, height: this.height }; diff --git a/resources/assets/js/components/TEditor.vue b/resources/assets/js/components/TEditor.vue index 3808de07..e18a84ca 100755 --- a/resources/assets/js/components/TEditor.vue +++ b/resources/assets/js/components/TEditor.vue @@ -217,7 +217,7 @@ uploadIng: 0, uploadFormat: ['jpg', 'jpeg', 'png', 'gif', 'doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx', 'txt', 'esp', 'pdf', 'rar', 'zip', 'gz'], actionUrl: $A.apiUrl('system/fileupload'), - params: { token: $A.getToken() }, + params: { token: this.$store.state.userToken }, maxSize: 10240 }; }, @@ -553,7 +553,7 @@ handleBeforeUpload() { //上传前判断 this.params = { - token: $A.getToken(), + token: this.$store.state.userToken, }; return true; }, diff --git a/resources/assets/js/functions/common.js b/resources/assets/js/functions/common.js index 03d41cf1..7b7c72aa 100755 --- a/resources/assets/js/functions/common.js +++ b/resources/assets/js/functions/common.js @@ -29,20 +29,6 @@ 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 @@ -1334,7 +1320,6 @@ if (typeof params.header !== 'object') params.header = {}; params.header['Content-Type'] = 'application/json'; params.header['language'] = language; - params.header['token'] = $A.token(); // params.data['__Access-Control-Allow-Origin'] = true; params.beforeSend(); diff --git a/resources/assets/js/functions/app.js b/resources/assets/js/functions/web.js similarity index 90% rename from resources/assets/js/functions/app.js rename to resources/assets/js/functions/web.js index 480d4895..8c77363c 100755 --- a/resources/assets/js/functions/app.js +++ b/resources/assets/js/functions/web.js @@ -39,6 +39,7 @@ if (typeof params.success === 'undefined') params.success = () => { }; if (typeof params.header !== 'object') params.header = {}; params.url = this.apiUrl(params.url); + params.header['token'] = $A.app.$store.state.userToken; // let beforeCall = 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 网络请求获取到用户信息回调(监听用户信息发生变化) @@ -233,20 +180,18 @@ }, success: (res) => { if (res.ret === 1) { - $A.storage("userInfo", res.data); - $A.setToken(res.data.token); - $A.triggerUserInfoListener(res.data); + $A.app.$store.commit('setUserInfo', res.data); $A.updateUserBasic({ username: res.data.username, nickname: res.data.nickname, 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() { - $A.token(""); - $A.storage("userInfo", {}); - $A.triggerUserInfoListener({}); - 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) : '')); - } + const from = window.location.pathname == '/' ? '' : encodeURIComponent(window.location.href); + $A.app.$store.commit('setUserInfo', {}); + $A.app.goForward({path: '/login', query: from ? {from: from} : {}}, true); }, /** @@ -423,7 +362,7 @@ * @returns {boolean} */ identityCheck(role) { - let userInfo = $A.getUserInfo(); + const userInfo = $A.app.$store.state.userInfo; return $A.identityRaw(role, userInfo.identity); }, @@ -442,41 +381,6 @@ }); 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"; } let config = { - userid: $A.getUserId(), + userid: $A.app.$store.state.userInfo.userid, url: url, - token: $A.getToken(), + token: $A.app.$store.state.userToken, }; if (window.webSocketConfig.DEBUG) { config.logCallback = function (msg) { diff --git a/resources/assets/js/mixins/index.js b/resources/assets/js/mixins/index.js deleted file mode 100644 index b84d04d5..00000000 --- a/resources/assets/js/mixins/index.js +++ /dev/null @@ -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 - } - } - }); - } -} diff --git a/resources/assets/js/pages/login.vue b/resources/assets/js/pages/login.vue index 62c2dc73..3697a111 100644 --- a/resources/assets/js/pages/login.vue +++ b/resources/assets/js/pages/login.vue @@ -173,7 +173,7 @@ export default { }, success: (res) => { if (res.ret === 1) { - this.$store.commit('userInfo', res.data); + this.$store.commit('setUserInfo', res.data); // this.goNext(); } else { diff --git a/resources/assets/js/pages/manage.vue b/resources/assets/js/pages/manage.vue index 124ed2b4..0bf59cc9 100644 --- a/resources/assets/js/pages/manage.vue +++ b/resources/assets/js/pages/manage.vue @@ -12,7 +12,7 @@
  • - +
  • @@ -195,7 +195,7 @@ export default { } }, mounted() { - + $A.getUserInfo(true); }, } diff --git a/resources/assets/js/pages/manage/calendar.vue b/resources/assets/js/pages/manage/calendar.vue new file mode 100644 index 00000000..8f9db4a6 --- /dev/null +++ b/resources/assets/js/pages/manage/calendar.vue @@ -0,0 +1,17 @@ + + + diff --git a/resources/assets/js/pages/manage/components/project-list.vue b/resources/assets/js/pages/manage/components/project-list.vue index 3d9147a9..d0bc645d 100644 --- a/resources/assets/js/pages/manage/components/project-list.vue +++ b/resources/assets/js/pages/manage/components/project-list.vue @@ -10,7 +10,7 @@
  • -
  • +
  • diff --git a/resources/assets/js/pages/manage/dashboard.vue b/resources/assets/js/pages/manage/dashboard.vue index 970698b5..b747fd5b 100644 --- a/resources/assets/js/pages/manage/dashboard.vue +++ b/resources/assets/js/pages/manage/dashboard.vue @@ -1,5 +1,8 @@ diff --git a/resources/assets/js/routes.js b/resources/assets/js/routes.js index df2d2f65..917887fa 100755 --- a/resources/assets/js/routes.js +++ b/resources/assets/js/routes.js @@ -17,6 +17,16 @@ export default [ path: 'dashboard', 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', path: 'project/:id', diff --git a/resources/assets/js/store/mutations.js b/resources/assets/js/store/mutations.js index 6c747b96..817a2b7c 100644 --- a/resources/assets/js/store/mutations.js +++ b/resources/assets/js/store/mutations.js @@ -1,11 +1,14 @@ export default { - projectChatShowToggle(state) { + toggleProjectChatShow(state) { state.projectChatShow = !state.projectChatShow state.setStorage('projectChatShow', state.projectChatShow); }, - userInfo(state, info) { - state.userInfo = info - state.setStorage('userInfo', info); - state.setStorage('token', state._isJson(info) ? info.token : ''); + setUserInfo(state, info) { + const userInfo = state._cloneJSON(info); + userInfo.userid = state._runNum(userInfo.userid); + userInfo.token = userInfo.userid > 0 ? (userInfo.token || state.userToken) : ''; + state.userInfo = userInfo; + state.userToken = userInfo.token; + state.setStorage('userInfo', state.userInfo); } } diff --git a/resources/assets/js/store/state.js b/resources/assets/js/store/state.js index 5645eceb..fb1eed46 100644 --- a/resources/assets/js/store/state.js +++ b/resources/assets/js/store/state.js @@ -1,4 +1,4 @@ -const state = { +const stateCommon = { setStorage(key, value) { return this._storage(key, value); }, @@ -85,10 +85,86 @@ const state = { 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, { - projectChatShow: state.getStorageBoolean('projectChatShow', true), - userInfo: state.getStorageJson('userInfo'), - token: state.getStorageString('token'), +const projectChatShow = stateCommon.getStorageBoolean('projectChatShow', true); +const userInfo = stateCommon.getStorageJson('userInfo'); +const userToken = userInfo.token; +userInfo.userid = stateCommon._runNum(userInfo.userid); + +export default Object.assign(stateCommon, { + projectChatShow, + userInfo, + userToken, })