Commit 1fa2194b by 王宝涛

feat(system): 集成帆软报表功能

- 添加帆软服务地址配置项 VITE_GLOB_FINE_REPORT_URL 到环境变量文件
- 新增帆软报表令牌缓存键枚举 FINE_REPORT_TOKEN_KEY
- 在 index.html 中引入帆软 JS 库以支持报表功能
- 扩展登录响应模型以包含 fineReportToken 字段
- 实现帆软令牌在 Pinia 用户状态管理中的存储和获取
- 配置 iframe 组件支持帆软令牌替换以实现报表集成
- 在单点登录和普通登录流程中处理帆软令牌的设置和传递
- 完善登出逻辑以清除帆软令牌确保安全退出
parent ee9ea819
......@@ -41,3 +41,6 @@ VITE_GLOB_API_URL_PREFIX =
# 是否启用官网代码
VITE_GLOB_PRODUCTION = false
# 帆软服务地址
VITE_GLOB_FINE_REPORT_URL = http://192.168.8.117:8075
......@@ -45,3 +45,6 @@ VITE_USE_PWA = false
# 是否启用官网代码
VITE_GLOB_PRODUCTION = true
# 帆软服务地址
VITE_GLOB_FINE_REPORT_URL = http://127.0.0.1:8075
......@@ -26,7 +26,8 @@
<link rel="stylesheet" href="/assets/iconfont/iconfont.css" />
<script src="/plugins/js/plugin.js"></script>
<script src="/luckysheet.umd.js"></script>
<!-- 引入帆软JS库,不需要帆软报表,可不用引入。该JS库是从帆软服务器上远程引入,并且finereport.js非实体文件,而是多个JS文件拼接后的集合 -->
<script src="<%=VITE_GLOB_FINE_REPORT_URL%>/webroot/decision/view/report?op=emb&resource=finereport.js"></script>
<script>
(async () => {
var htmlRoot = document.getElementById('htmlRoot');
......
......@@ -35,6 +35,7 @@ export interface LoginResultModel {
firstLogin: boolean;
isNeedChangePwd: boolean;
pwdExpireDate: string;
fineReportToken: string;
}
export interface CaptchaImgModel {
......
// token key
export const TOKEN_KEY = 'TOKEN__';
export const FINE_REPORT_TOKEN_KEY = 'FINE_REPORT_TOKEN__';
export const LOCALE_KEY = 'LOCALE__';
export const LANGUAGE_KEY = 'LANGUAGE__';
......
......@@ -5,7 +5,7 @@
style="height: calc(100vh - 149px)"
v-if="frame.meta.frameSrc && hasRenderFrame(frame.name) && showIframe(frame)"
>
<FramePage :frameSrc="frame.meta.frameSrc.replace('#{token}', userStore.getToken)" />
<FramePage :frameSrc="frame.meta.frameSrc.replace('#{token}', userStore.getToken).replace('#{fineReportToken}', userStore.getFineReportToken)" />
</div>
</template>
</div>
......
......@@ -3,7 +3,7 @@ import type { ErrorMessageMode } from '/#/axios';
import { defineStore } from 'pinia';
import { store } from '/@/store';
import { PageEnum } from '/@/enums/pageEnum';
import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY } from '/@/enums/cacheEnum';
import { ROLES_KEY, TOKEN_KEY, USER_INFO_KEY, FINE_REPORT_TOKEN_KEY } from '/@/enums/cacheEnum';
import { getAuthCache, setAuthCache } from '/@/utils/auth';
import {
GetUserInfoModel,
......@@ -31,6 +31,7 @@ import { getFileUrl } from '/@/utils/event/design';
interface UserState {
userInfo: Nullable<UserInfo>;
token?: string;
fineReportToken?: string;
roleList: RoleInfo[];
sessionTimeout?: boolean;
lastUpdateTime: number;
......@@ -43,6 +44,8 @@ export const useUserStore = defineStore({
userInfo: null,
// token
token: undefined,
// fineReportToken
fineReportToken: undefined,
// roleList
roleList: [],
// Whether the login expired
......@@ -57,6 +60,9 @@ export const useUserStore = defineStore({
getToken(): string {
return this.token || getAuthCache<string>(TOKEN_KEY);
},
getFineReportToken(): string {
return this.fineReportToken || getAuthCache<string>(FINE_REPORT_TOKEN_KEY);
},
getRoleList(): RoleInfo[] {
return this.roleList && this.roleList.length > 0
? this.roleList
......@@ -74,6 +80,10 @@ export const useUserStore = defineStore({
this.token = info ? info : ''; // for null or undefined value
setAuthCache(TOKEN_KEY, info);
},
setFineReportToken(info: string | undefined) {
this.fineReportToken = info ? info : ''; // for null or undefined value
setAuthCache(FINE_REPORT_TOKEN_KEY, info);
},
setRoleList(roleList: RoleInfo[]) {
this.roleList = roleList;
setAuthCache(ROLES_KEY, roleList);
......@@ -89,6 +99,7 @@ export const useUserStore = defineStore({
resetState() {
this.userInfo = null;
this.token = '';
this.fineReportToken = '';
this.roleList = [];
this.sessionTimeout = false;
},
......@@ -130,9 +141,10 @@ export const useUserStore = defineStore({
const data = await ssoLoginApi({ accessToken: params.token }, mode);
const { token } = data;
const { token, fineReportToken } = data;
// save token
this.setToken(token);
this.setFineReportToken(fineReportToken);
return this.afterLoginAction(goHome);
} catch (error) {
......@@ -192,19 +204,21 @@ export const useUserStore = defineStore({
}
const data = await loginApi(myLoginParams, mode, captchaKey ?? '');
const { token, firstLogin, isNeedChangePwd, pwdExpireDate } = data;
const { token, firstLogin, isNeedChangePwd, pwdExpireDate, fineReportToken } = data;
if (firstLogin || isNeedChangePwd) {
return Promise.reject({
firstLogin: true,
isNeedChangePwd: true,
pwdExpireDate: pwdExpireDate,
token: token,
fineReportToken: fineReportToken,
});
}
// save token
this.setToken(token);
setImToken(loginParams);
this.setFineReportToken(fineReportToken);
return await this.afterLoginAction(goHome);
} catch (error) {
......@@ -264,6 +278,7 @@ export const useUserStore = defineStore({
}
}
this.setToken(undefined);
this.setFineReportToken(undefined);
this.setSessionTimeout(false);
this.setUserInfo(null);
......
......@@ -6,6 +6,7 @@ import { createLocalStorage, createSessionStorage } from '/@/utils/cache';
import { Memory } from './memory';
import {
TOKEN_KEY,
FINE_REPORT_TOKEN_KEY,
USER_INFO_KEY,
ROLES_KEY,
LOCK_INFO_KEY,
......@@ -20,6 +21,7 @@ import { pick, omit } from 'lodash-es';
interface BasicStore {
[TOKEN_KEY]: string | number | null | undefined;
[FINE_REPORT_TOKEN_KEY]: string | number | null | undefined;
[USER_INFO_KEY]: UserInfo;
[ROLES_KEY]: string[];
[LOCK_INFO_KEY]: LockInfo;
......
......@@ -171,6 +171,7 @@ export interface GlobEnvConfig {
//file preview
VITE_GLOB_UPLOAD_PREVIEW?: string;
VITE_GLOB_QN_LINK_URL?: string;
VITE_GLOB_FINE_REPORT_URL?: string;
}
export interface LogoConfig {
......
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