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 = ...@@ -41,3 +41,6 @@ VITE_GLOB_API_URL_PREFIX =
# 是否启用官网代码 # 是否启用官网代码
VITE_GLOB_PRODUCTION = false VITE_GLOB_PRODUCTION = false
# 帆软服务地址
VITE_GLOB_FINE_REPORT_URL = http://192.168.8.117:8075
...@@ -45,3 +45,6 @@ VITE_USE_PWA = false ...@@ -45,3 +45,6 @@ VITE_USE_PWA = false
# 是否启用官网代码 # 是否启用官网代码
VITE_GLOB_PRODUCTION = true VITE_GLOB_PRODUCTION = true
# 帆软服务地址
VITE_GLOB_FINE_REPORT_URL = http://127.0.0.1:8075
...@@ -26,7 +26,8 @@ ...@@ -26,7 +26,8 @@
<link rel="stylesheet" href="/assets/iconfont/iconfont.css" /> <link rel="stylesheet" href="/assets/iconfont/iconfont.css" />
<script src="/plugins/js/plugin.js"></script> <script src="/plugins/js/plugin.js"></script>
<script src="/luckysheet.umd.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> <script>
(async () => { (async () => {
var htmlRoot = document.getElementById('htmlRoot'); var htmlRoot = document.getElementById('htmlRoot');
......
...@@ -35,6 +35,7 @@ export interface LoginResultModel { ...@@ -35,6 +35,7 @@ export interface LoginResultModel {
firstLogin: boolean; firstLogin: boolean;
isNeedChangePwd: boolean; isNeedChangePwd: boolean;
pwdExpireDate: string; pwdExpireDate: string;
fineReportToken: string;
} }
export interface CaptchaImgModel { export interface CaptchaImgModel {
......
// token key // token key
export const TOKEN_KEY = 'TOKEN__'; export const TOKEN_KEY = 'TOKEN__';
export const FINE_REPORT_TOKEN_KEY = 'FINE_REPORT_TOKEN__';
export const LOCALE_KEY = 'LOCALE__'; export const LOCALE_KEY = 'LOCALE__';
export const LANGUAGE_KEY = 'LANGUAGE__'; export const LANGUAGE_KEY = 'LANGUAGE__';
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
style="height: calc(100vh - 149px)" style="height: calc(100vh - 149px)"
v-if="frame.meta.frameSrc && hasRenderFrame(frame.name) && showIframe(frame)" 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> </div>
</template> </template>
</div> </div>
......
...@@ -3,7 +3,7 @@ import type { ErrorMessageMode } from '/#/axios'; ...@@ -3,7 +3,7 @@ import type { ErrorMessageMode } from '/#/axios';
import { defineStore } from 'pinia'; import { defineStore } from 'pinia';
import { store } from '/@/store'; import { store } from '/@/store';
import { PageEnum } from '/@/enums/pageEnum'; 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 { getAuthCache, setAuthCache } from '/@/utils/auth';
import { import {
GetUserInfoModel, GetUserInfoModel,
...@@ -31,6 +31,7 @@ import { getFileUrl } from '/@/utils/event/design'; ...@@ -31,6 +31,7 @@ import { getFileUrl } from '/@/utils/event/design';
interface UserState { interface UserState {
userInfo: Nullable<UserInfo>; userInfo: Nullable<UserInfo>;
token?: string; token?: string;
fineReportToken?: string;
roleList: RoleInfo[]; roleList: RoleInfo[];
sessionTimeout?: boolean; sessionTimeout?: boolean;
lastUpdateTime: number; lastUpdateTime: number;
...@@ -43,6 +44,8 @@ export const useUserStore = defineStore({ ...@@ -43,6 +44,8 @@ export const useUserStore = defineStore({
userInfo: null, userInfo: null,
// token // token
token: undefined, token: undefined,
// fineReportToken
fineReportToken: undefined,
// roleList // roleList
roleList: [], roleList: [],
// Whether the login expired // Whether the login expired
...@@ -57,6 +60,9 @@ export const useUserStore = defineStore({ ...@@ -57,6 +60,9 @@ export const useUserStore = defineStore({
getToken(): string { getToken(): string {
return this.token || getAuthCache<string>(TOKEN_KEY); return this.token || getAuthCache<string>(TOKEN_KEY);
}, },
getFineReportToken(): string {
return this.fineReportToken || getAuthCache<string>(FINE_REPORT_TOKEN_KEY);
},
getRoleList(): RoleInfo[] { getRoleList(): RoleInfo[] {
return this.roleList && this.roleList.length > 0 return this.roleList && this.roleList.length > 0
? this.roleList ? this.roleList
...@@ -74,6 +80,10 @@ export const useUserStore = defineStore({ ...@@ -74,6 +80,10 @@ export const useUserStore = defineStore({
this.token = info ? info : ''; // for null or undefined value this.token = info ? info : ''; // for null or undefined value
setAuthCache(TOKEN_KEY, info); 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[]) { setRoleList(roleList: RoleInfo[]) {
this.roleList = roleList; this.roleList = roleList;
setAuthCache(ROLES_KEY, roleList); setAuthCache(ROLES_KEY, roleList);
...@@ -89,6 +99,7 @@ export const useUserStore = defineStore({ ...@@ -89,6 +99,7 @@ export const useUserStore = defineStore({
resetState() { resetState() {
this.userInfo = null; this.userInfo = null;
this.token = ''; this.token = '';
this.fineReportToken = '';
this.roleList = []; this.roleList = [];
this.sessionTimeout = false; this.sessionTimeout = false;
}, },
...@@ -130,9 +141,10 @@ export const useUserStore = defineStore({ ...@@ -130,9 +141,10 @@ export const useUserStore = defineStore({
const data = await ssoLoginApi({ accessToken: params.token }, mode); const data = await ssoLoginApi({ accessToken: params.token }, mode);
const { token } = data; const { token, fineReportToken } = data;
// save token // save token
this.setToken(token); this.setToken(token);
this.setFineReportToken(fineReportToken);
return this.afterLoginAction(goHome); return this.afterLoginAction(goHome);
} catch (error) { } catch (error) {
...@@ -192,19 +204,21 @@ export const useUserStore = defineStore({ ...@@ -192,19 +204,21 @@ export const useUserStore = defineStore({
} }
const data = await loginApi(myLoginParams, mode, captchaKey ?? ''); const data = await loginApi(myLoginParams, mode, captchaKey ?? '');
const { token, firstLogin, isNeedChangePwd, pwdExpireDate } = data; const { token, firstLogin, isNeedChangePwd, pwdExpireDate, fineReportToken } = data;
if (firstLogin || isNeedChangePwd) { if (firstLogin || isNeedChangePwd) {
return Promise.reject({ return Promise.reject({
firstLogin: true, firstLogin: true,
isNeedChangePwd: true, isNeedChangePwd: true,
pwdExpireDate: pwdExpireDate, pwdExpireDate: pwdExpireDate,
token: token, token: token,
fineReportToken: fineReportToken,
}); });
} }
// save token // save token
this.setToken(token); this.setToken(token);
setImToken(loginParams); setImToken(loginParams);
this.setFineReportToken(fineReportToken);
return await this.afterLoginAction(goHome); return await this.afterLoginAction(goHome);
} catch (error) { } catch (error) {
...@@ -264,6 +278,7 @@ export const useUserStore = defineStore({ ...@@ -264,6 +278,7 @@ export const useUserStore = defineStore({
} }
} }
this.setToken(undefined); this.setToken(undefined);
this.setFineReportToken(undefined);
this.setSessionTimeout(false); this.setSessionTimeout(false);
this.setUserInfo(null); this.setUserInfo(null);
......
...@@ -6,6 +6,7 @@ import { createLocalStorage, createSessionStorage } from '/@/utils/cache'; ...@@ -6,6 +6,7 @@ import { createLocalStorage, createSessionStorage } from '/@/utils/cache';
import { Memory } from './memory'; import { Memory } from './memory';
import { import {
TOKEN_KEY, TOKEN_KEY,
FINE_REPORT_TOKEN_KEY,
USER_INFO_KEY, USER_INFO_KEY,
ROLES_KEY, ROLES_KEY,
LOCK_INFO_KEY, LOCK_INFO_KEY,
...@@ -20,6 +21,7 @@ import { pick, omit } from 'lodash-es'; ...@@ -20,6 +21,7 @@ import { pick, omit } from 'lodash-es';
interface BasicStore { interface BasicStore {
[TOKEN_KEY]: string | number | null | undefined; [TOKEN_KEY]: string | number | null | undefined;
[FINE_REPORT_TOKEN_KEY]: string | number | null | undefined;
[USER_INFO_KEY]: UserInfo; [USER_INFO_KEY]: UserInfo;
[ROLES_KEY]: string[]; [ROLES_KEY]: string[];
[LOCK_INFO_KEY]: LockInfo; [LOCK_INFO_KEY]: LockInfo;
......
...@@ -171,6 +171,7 @@ export interface GlobEnvConfig { ...@@ -171,6 +171,7 @@ export interface GlobEnvConfig {
//file preview //file preview
VITE_GLOB_UPLOAD_PREVIEW?: string; VITE_GLOB_UPLOAD_PREVIEW?: string;
VITE_GLOB_QN_LINK_URL?: string; VITE_GLOB_QN_LINK_URL?: string;
VITE_GLOB_FINE_REPORT_URL?: string;
} }
export interface LogoConfig { 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