|
@@ -23,17 +23,23 @@ export default {
|
|
|
// this.scrollUpdate();
|
|
// this.scrollUpdate();
|
|
|
// });
|
|
// });
|
|
|
let that = this;
|
|
let that = this;
|
|
|
|
|
+ // ticket 校验不依赖系统登录,有参数立即请求
|
|
|
|
|
+ that.fetchTicketUser();
|
|
|
|
|
+ this.$router.isReady().then(() => {
|
|
|
|
|
+ that.fetchTicketUser();
|
|
|
|
|
+ });
|
|
|
let sessionUserInfo = sessionStorage.getItem("sessionUserInfo");
|
|
let sessionUserInfo = sessionStorage.getItem("sessionUserInfo");
|
|
|
|
|
+ const afterLogin = () => {
|
|
|
|
|
+ // 登录成功之后要批量加载一下DMS的字典,后续全局可调用
|
|
|
|
|
+ that.getDMSTypesData();
|
|
|
|
|
+ };
|
|
|
// console.log(sessionUserInfo);
|
|
// console.log(sessionUserInfo);
|
|
|
if (sessionUserInfo && sessionUserInfo !== "") {
|
|
if (sessionUserInfo && sessionUserInfo !== "") {
|
|
|
let user = JSON.parse(sessionUserInfo);
|
|
let user = JSON.parse(sessionUserInfo);
|
|
|
// console.log(user);
|
|
// console.log(user);
|
|
|
// 刷新页面登录
|
|
// 刷新页面登录
|
|
|
encrypt(user)
|
|
encrypt(user)
|
|
|
- .then(() => {
|
|
|
|
|
- // 登录成功之后要批量加载一下DMS的字典,后续全局可调用
|
|
|
|
|
- that.getDMSTypesData();
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ .then(afterLogin)
|
|
|
.catch((err) => {
|
|
.catch((err) => {
|
|
|
that.$message({
|
|
that.$message({
|
|
|
type: "error",
|
|
type: "error",
|
|
@@ -43,10 +49,7 @@ export default {
|
|
|
} else {
|
|
} else {
|
|
|
// 默认登录
|
|
// 默认登录
|
|
|
encrypt()
|
|
encrypt()
|
|
|
- .then(() => {
|
|
|
|
|
- // 登录成功之后要批量加载一下DMS的字典,后续全局可调用
|
|
|
|
|
- that.getDMSTypesData();
|
|
|
|
|
- })
|
|
|
|
|
|
|
+ .then(afterLogin)
|
|
|
.catch((err) => {
|
|
.catch((err) => {
|
|
|
that.$message({
|
|
that.$message({
|
|
|
type: "error",
|
|
type: "error",
|
|
@@ -55,7 +58,111 @@ export default {
|
|
|
});
|
|
});
|
|
|
}
|
|
}
|
|
|
},
|
|
},
|
|
|
|
|
+ watch: {
|
|
|
|
|
+ "$route.query.ticket"() {
|
|
|
|
|
+ this.fetchTicketUser();
|
|
|
|
|
+ },
|
|
|
|
|
+ },
|
|
|
methods: {
|
|
methods: {
|
|
|
|
|
+ // 从地址栏或会话中读取第三方 ticket
|
|
|
|
|
+ getUrlTicket() {
|
|
|
|
|
+ const query = (this.$route && this.$route.query) || {};
|
|
|
|
|
+ const routeTicket = query.ticket || query.Ticket;
|
|
|
|
|
+ if (routeTicket) {
|
|
|
|
|
+ return Array.isArray(routeTicket) ? routeTicket[0] : routeTicket;
|
|
|
|
|
+ }
|
|
|
|
|
+ const search = window.location.search || "";
|
|
|
|
|
+ const hash = window.location.hash || "";
|
|
|
|
|
+ const searchParams = new URLSearchParams(search);
|
|
|
|
|
+ const fromSearch = searchParams.get("ticket") || searchParams.get("Ticket");
|
|
|
|
|
+ if (fromSearch) {
|
|
|
|
|
+ return fromSearch;
|
|
|
|
|
+ }
|
|
|
|
|
+ const hashQuery = hash.includes("?") ? hash.slice(hash.indexOf("?") + 1) : "";
|
|
|
|
|
+ const hashParams = new URLSearchParams(hashQuery);
|
|
|
|
|
+ return hashParams.get("ticket") || hashParams.get("Ticket");
|
|
|
|
|
+ },
|
|
|
|
|
+ // 解析接口返回的第三方用户对象
|
|
|
|
|
+ resolveTicketUser(result) {
|
|
|
|
|
+ if (!result || result.code != 200 || !result.content) {
|
|
|
|
|
+ return null;
|
|
|
|
|
+ }
|
|
|
|
|
+ let user = result.content;
|
|
|
|
|
+ if (Array.isArray(user)) {
|
|
|
|
|
+ user = user[0];
|
|
|
|
|
+ } else if (user.data && Array.isArray(user.data)) {
|
|
|
|
|
+ user = user.data[0];
|
|
|
|
|
+ }
|
|
|
|
|
+ return user || null;
|
|
|
|
|
+ },
|
|
|
|
|
+ // 使用完 ticket 后从地址栏移除,不留下历史记录
|
|
|
|
|
+ removeTicketFromUrl() {
|
|
|
|
|
+ const query = { ...(this.$route.query || {}) };
|
|
|
|
|
+ const hasRouteTicket = query.ticket != null || query.Ticket != null;
|
|
|
|
|
+ if (hasRouteTicket) {
|
|
|
|
|
+ delete query.ticket;
|
|
|
|
|
+ delete query.Ticket;
|
|
|
|
|
+ this.$router.replace({ path: this.$route.path, query }).catch(() => {});
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ const url = new URL(window.location.href);
|
|
|
|
|
+ let changed = false;
|
|
|
|
|
+ ["ticket", "Ticket"].forEach((key) => {
|
|
|
|
|
+ if (url.searchParams.has(key)) {
|
|
|
|
|
+ url.searchParams.delete(key);
|
|
|
|
|
+ changed = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ if (url.hash && url.hash.indexOf("?") > -1) {
|
|
|
|
|
+ const hashIndex = url.hash.indexOf("?");
|
|
|
|
|
+ const hashPath = url.hash.slice(0, hashIndex);
|
|
|
|
|
+ const hashParams = new URLSearchParams(url.hash.slice(hashIndex + 1));
|
|
|
|
|
+ ["ticket", "Ticket"].forEach((key) => {
|
|
|
|
|
+ if (hashParams.has(key)) {
|
|
|
|
|
+ hashParams.delete(key);
|
|
|
|
|
+ changed = true;
|
|
|
|
|
+ }
|
|
|
|
|
+ });
|
|
|
|
|
+ const qs = hashParams.toString();
|
|
|
|
|
+ url.hash = qs ? hashPath + "?" + qs : hashPath;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (changed) {
|
|
|
|
|
+ window.history.replaceState(
|
|
|
|
|
+ window.history.state,
|
|
|
|
|
+ document.title,
|
|
|
|
|
+ url.pathname + url.search + url.hash
|
|
|
|
|
+ );
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ fetchTicketUser() {
|
|
|
|
|
+ const ticket = this.getUrlTicket();
|
|
|
|
|
+ // 地址中没有 ticket 时不请求;互联网环境且从未用过 ticket 时保持原游客逻辑
|
|
|
|
|
+ if (!ticket) {
|
|
|
|
|
+ if (systemConfig.serverType === "互联网" && !this._fetchedTicket) {
|
|
|
|
|
+ this.$store.commit("setThirdPartyUser", {});
|
|
|
|
|
+ sessionStorage.removeItem("ssoTicket");
|
|
|
|
|
+ }
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ if (this._fetchedTicket === ticket) {
|
|
|
|
|
+ this.removeTicketFromUrl();
|
|
|
|
|
+ return;
|
|
|
|
|
+ }
|
|
|
|
|
+ this._fetchedTicket = ticket;
|
|
|
|
|
+ sessionStorage.setItem("ssoTicket", ticket);
|
|
|
|
|
+ this.removeTicketFromUrl();
|
|
|
|
|
+ api
|
|
|
|
|
+ .getUserByTicket({ ticket })
|
|
|
|
|
+ .then((result) => {
|
|
|
|
|
+ const user = this.resolveTicketUser(result);
|
|
|
|
|
+ if (user) {
|
|
|
|
|
+ this.$store.commit("setThirdPartyUser", user);
|
|
|
|
|
+ }
|
|
|
|
|
+ })
|
|
|
|
|
+ .catch(() => {
|
|
|
|
|
+ // ticket 用户获取失败时保持游客展示,不影响系统登录
|
|
|
|
|
+ });
|
|
|
|
|
+ },
|
|
|
// scrollUpdate() {
|
|
// scrollUpdate() {
|
|
|
// let that = this;
|
|
// let that = this;
|
|
|
// setTimeout(() => {
|
|
// setTimeout(() => {
|