diff --git a/config/routes.ts b/config/routes.ts
index 3a0d944a88e3f1f2f5cf18cbeb1186fb49c39140..b30128960174dcdf452a7fff25c8d4660abd709b 100644
--- a/config/routes.ts
+++ b/config/routes.ts
@@ -1,78 +1,78 @@
export default [
{
- path: "/outline",
- name: "outline",
- component: "./Outline",
+ path: '/outline',
+ name: 'outline',
+ component: './Outline',
},
{
- path: "/demand",
- name: "demand",
- component: "./Demand",
+ path: '/demand',
+ name: 'demand',
+ component: './Demand',
},
{
- path: "/plan",
- name: "plan",
+ path: '/plan',
+ name: 'plan',
routes: [
{
- path: "/plan/create",
- name: "create",
+ path: '/plan/create',
+ name: 'create',
hideInMenu: true,
- component: "./Plan",
+ component: './Plan',
},
{
- path: "/plan/:plan_id/edit",
- name: "edit",
+ path: '/plan/:plan_id/edit',
+ name: 'edit',
hideInMenu: true,
- component: "./Plan",
+ component: './Plan',
},
{
- path: "/plan/:plan_id/report",
- name: "report",
+ path: '/plan/:plan_id/report',
+ name: 'report',
hideInMenu: true,
- component: "./Plan/Report"
+ component: './Plan/Report',
},
{
- path: "/plan/:plan_id?",
+ path: '/plan/:plan_id?',
hideInMenu: true,
- name: "plan",
- component: "./Plan",
+ name: 'plan',
+ component: './Plan',
},
- ]
+ ],
},
{
- path: "/cases",
- name: "suite",
+ path: '/cases',
+ name: 'suite',
routes: [
{
- path: "/cases/:mod_id?",
+ path: '/cases/:mod_id?',
hideInMenu: true,
- component: "./Suite",
+ component: './Suite',
},
- ]
+ ],
},
{
- path: "/task",
- name: "task",
+ path: '/task',
+ name: 'task',
routes: [
{
- path: "/task",
- component: "./Task",
+ path: '/task',
+ component: './Task',
},
{
- path: "/task/:task_id",
- component: "./Task/Detail"
+ path: '/task/:task_id',
+ component: './Task/Detail',
},
- ]
+ ],
},
{
- path: "/server",
- name: "server",
- component: "./Server",
+ path: '/server',
+ name: 'server',
+ component: './Server',
},
{
- path: "/sys",
- name: "sys",
- component: "./Sys",
+ path: '/sys',
+ name: 'sys',
+ component: './Sys',
routes: [
/* {
path: "approval",
@@ -90,48 +90,55 @@
}]
}, */
{
- path: "user",
- name: "user-list",
- access: "canTestAdmin",
+ path: 'user',
+ name: 'user-list',
+ access: 'canTestAdmin',
hideInMenu: true,
- component: "./Sys/Users"
+ component: './Sys/Users',
},
{
- path: "tag",
- name: "tag",
+ path: 'tag',
+ name: 'tag',
hideInMenu: true,
- component: "./Sys/Tags"
+ component: './Sys/Tags',
},
{
- path: "suite",
- name: "suite",
+ path: 'suite',
+ name: 'suite',
hideInMenu: true,
- component: "./Sys/Suite"
+ component: './Sys/Suite',
},
{
- redirect: 'tag'
- }
- ]
+ redirect: 'tag',
+ },
+ ],
},
{
- path: "login",
- name: "login",
+ path: 'login',
+ name: 'login',
hideInMenu: true,
layout: false,
- component: "./Auth/Login",
+ component: './Auth/Login',
+ },
+ {
+ path: 'regist',
+ name: 'regist',
+ layout: false,
+ hideInMenu: true,
+ component: './Auth/Regist',
},
{
- path: "regist",
- name: "regist",
+ path: 'file-viewer',
+ name: 'file-viewer',
layout: false,
hideInMenu: true,
- component: "./Auth/Regist"
+ component: './FileViewer',
},
{
- path: "*",
- redirect: "/outline",
+ path: '*',
+ redirect: '/outline',
},
{
- component: "./404",
+ component: './404',
},
];
diff --git a/package.json b/package.json
index f180e1201e37ebb896a4c6447c17c57d622a43fd..ad9473a68dbab20367a27b2b581413e82ec213c9 100644
--- a/package.json
+++ b/package.json
@@ -92,6 +92,7 @@
"react-dnd": "^14.0.4",
"react-dnd-html5-backend": "^14.0.2",
"react-dom": "^17.0.0",
+ "react-file-viewer": "^1.2.1",
"react-fittext": "^1.0.0",
"react-helmet-async": "^1.0.4",
"react-router": "^4.3.1",
@@ -145,4 +146,4 @@
"resolutions": {
"styled-components": "^5"
}
-}
\ No newline at end of file
+}
diff --git a/src/app.tsx b/src/app.tsx
index 23de7a135c811e4cd406972e9f44dca81df84ebf..fc2b11e7519b6b29af2631954374db2a179f8f46 100644
--- a/src/app.tsx
+++ b/src/app.tsx
@@ -17,7 +17,7 @@ import zhCN from 'antd/lib/locale/zh_CN';
const isDev = process.env.NODE_ENV === 'development';
const ignorePathname = ["/login", "/regist"]
-const siteEnv = window.siteEnv
+const siteEnv = (window as any).siteEnv
/** 获取用户信息比较慢的时候会展示一个 loading */
export const initialStateConfig = {
@@ -92,18 +92,18 @@ export const layout: RunTimeLayoutConfig = (props) => {
childrenRender(dom, props) {
return {dom}
},
- headerRender: (props, dom) => ,
+ headerRender: (props, dom) => {dom},
menuItemRender,
contentStyle: {
margin: ~initialState?.location?.pathname.indexOf("/sys") ? 0 : 12,
},
links: isDev
? [
-
+
OpenAPI 文档
,
-
+
业务组件文档
,
diff --git a/src/components/FileViewer/DocViewer.tsx b/src/components/FileViewer/DocViewer.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..c591c833f0ce97391dd02bcd34fce695f007ebf1
--- /dev/null
+++ b/src/components/FileViewer/DocViewer.tsx
@@ -0,0 +1,44 @@
+import React from 'react';
+/* @ts-ignore */
+import Loading from "@/components/Loading"
+
+type DocProps = {
+ filePath: string
+}
+
+export const TextViewer: React.FC = (props) => {
+ const { filePath } = props;
+ const [html, setHtml] = React.useState("")
+
+ const [loading, setLoading] = React.useState(true)
+
+ const fetcher = () => {
+ const jsonFile = new XMLHttpRequest();
+ jsonFile.open('GET', filePath, true);
+ jsonFile.send();
+ jsonFile.responseType = 'arraybuffer';
+ jsonFile.onreadystatechange = () => {
+ if (jsonFile.readyState === 4 && jsonFile.status === 200) {
+ const b = new Blob([jsonFile.response])
+ const r = new FileReader() as any
+ r.readAsText(b, "utf-8")
+ r.onload = () => {
+ setLoading(false)
+ setHtml(r.result.replace(/\n/g, "
"))
+ }
+ }
+ };
+ }
+
+ React.useEffect(() => {
+ fetcher()
+ }, [])
+
+ if (loading)
+ return
+
+ return (
+
+ )
+}
+
diff --git a/src/locales/en-US/menu.ts b/src/locales/en-US/menu.ts
index 5c08b55e27b667381baf09e8fb56a3d618faf974..ab1c4eacd979cd80355e09772091fba08a9bc18e 100644
--- a/src/locales/en-US/menu.ts
+++ b/src/locales/en-US/menu.ts
@@ -17,6 +17,7 @@ export default {
"menu.sys.approval": "审批管理",
"menu.sys.approval.approval": "待审批",
"menu.sys.approval.record": "审批记录",
+ "menu.file-viewer": "文件预览",
"menu.login": "用户登录",
"menu.regist": "注册账号",
diff --git a/src/locales/zh-CN/menu.ts b/src/locales/zh-CN/menu.ts
index 99ed866f89a5649682d3585f40d168edf2135108..d0922efc53126e6422bc07f1e1fc7e30a8d1e209 100644
--- a/src/locales/zh-CN/menu.ts
+++ b/src/locales/zh-CN/menu.ts
@@ -17,6 +17,7 @@ export default {
"menu.sys.approval": "审批管理",
"menu.sys.approval.approval": "待审批",
"menu.sys.approval.record": "审批记录",
+ "menu.file-viewer": "文件预览",
"menu.login": "用户登录",
"menu.regist": "注册账号",
diff --git a/src/pages/FileViewer/index.tsx b/src/pages/FileViewer/index.tsx
new file mode 100644
index 0000000000000000000000000000000000000000..3670a23a05847c01649206c71d6962f15a4e6658
--- /dev/null
+++ b/src/pages/FileViewer/index.tsx
@@ -0,0 +1,31 @@
+import React from "react"
+/* @ts-ignore */
+import FileViewer from 'react-file-viewer'
+import { useLocation } from "umi"
+import { TextViewer } from "@/components/FileViewer/DocViewer"
+
+const Viewer: React.FC = () => {
+ const { query } = useLocation() as any
+ const { url, file_type } = query
+
+ const l = url.split('.')
+ const fType = l[l.length - 1]
+
+ const fileType = file_type ?? fType
+
+ if (fileType === "txt")
+ return
+
+ return (
+ /* @ts-ignore */
+ console.log('Failed to load')}
+ errorComponent={<>错误>}
+ unsupportedComponent={() => <>暂不支持>}
+ />
+ )
+}
+
+export default Viewer
\ No newline at end of file
diff --git a/src/pages/Outline/index.tsx b/src/pages/Outline/index.tsx
index 09ff7bbb86e8b557bdc5d907eb248c88254f3ac9..0500c31736cababe63a86f4779b33a723bae8afc 100644
--- a/src/pages/Outline/index.tsx
+++ b/src/pages/Outline/index.tsx
@@ -63,6 +63,14 @@ const TestDemand: React.FC = () => {
message.success('下载成功');
};
+
+ const handlePreview = (row: any): any => {
+ const l = row.name.split(".")
+ const fileType = l[l.length - 1]
+ if (["doc", "xls"].includes(fileType)) return message.warning("暂不支持07版之前的Office文件预览")
+ window.open(`/file-viewer?url=${location.origin}/api/outline/download/${row.id}&file_type=${fileType}`)
+ }
+
const columns: TableColumnProps[] = [
{
title: '标题',
@@ -77,21 +85,21 @@ const TestDemand: React.FC = () => {
dataIndex: 'remark',
ellipsis: true,
width: 200,
- render(_, row) {
- return
+ render(_) {
+ return {_}
}
},
{
title: '创建人',
dataIndex: 'owner',
- render(_, row) {
+ render(_) {
return _ || "-"
}
},
{
title: '创建日期',
dataIndex: 'gmt_created',
- render(_, row) {
+ render(_) {
return _ || "-"
}
},
@@ -102,6 +110,12 @@ const TestDemand: React.FC = () => {
render(row) {
return (
+ handlePreview(row)}
+ >
+ 预览
+
+
{
access.canCurrentTester(row.owner) &&
handleEdit(row)}>