kn-cli 1.0.96 → 1.0.98

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (135) hide show
  1. package/build/package.json +1 -0
  2. package/package.json +1 -1
  3. package/readme.md +3 -0
  4. package/templates/template_admin/cli.config.js +4 -1
  5. package/templates/template_admin/package.json +7 -1
  6. package/templates/template_admin/public/favicon.png +0 -0
  7. package/templates/template_admin/public/index.html +6 -4
  8. package/templates/template_admin/public/src/_antd.less +30 -3
  9. package/templates/template_admin/public/src/_mixin.less +41 -0
  10. package/templates/template_admin/public/src/_reset.less +28 -20
  11. package/templates/template_admin/public/src/_variable.less +11 -6
  12. package/templates/template_admin/public/src/assets/iconfont/iconfont.eot +0 -0
  13. package/templates/template_admin/public/src/assets/iconfont/iconfont.less +60 -8
  14. package/templates/template_admin/public/src/assets/iconfont/iconfont.svg +57 -18
  15. package/templates/template_admin/public/src/assets/iconfont/iconfont.ttf +0 -0
  16. package/templates/template_admin/public/src/assets/iconfont/iconfont.woff +0 -0
  17. package/templates/template_admin/public/src/assets/iconfont/iconfont.woff2 +0 -0
  18. package/templates/template_admin/public/src/assets/images/arrow.png +0 -0
  19. package/templates/template_admin/public/src/assets/images/icon-notice.png +0 -0
  20. package/templates/template_admin/public/src/assets/images/icon-user.png +0 -0
  21. package/templates/template_admin/public/src/assets/images/loadFail.png +0 -0
  22. package/templates/template_admin/public/src/assets/images/login/bg.png +0 -0
  23. package/templates/template_admin/public/src/assets/images/login/logo.png +0 -0
  24. package/templates/template_admin/public/src/assets/images/login/slogan.png +0 -0
  25. package/templates/template_admin/public/src/assets/images/nav/icon-dep-active.png +0 -0
  26. package/templates/template_admin/public/src/assets/images/nav/icon-dep.png +0 -0
  27. package/templates/template_admin/public/src/assets/images/nav/icon-log-active.png +0 -0
  28. package/templates/template_admin/public/src/assets/images/nav/icon-log.png +0 -0
  29. package/templates/template_admin/public/src/assets/images/nav/icon-loginlog-active.png +0 -0
  30. package/templates/template_admin/public/src/assets/images/nav/icon-loginlog.png +0 -0
  31. package/templates/template_admin/public/src/assets/images/nav/icon-role-active.png +0 -0
  32. package/templates/template_admin/public/src/assets/images/nav/icon-role.png +0 -0
  33. package/templates/template_admin/public/src/assets/images/nav/icon-user-active.png +0 -0
  34. package/templates/template_admin/public/src/assets/images/nav/icon-user.png +0 -0
  35. package/templates/template_admin/public/src/assets/images/nav/nav-toggle.png +0 -0
  36. package/templates/template_admin/public/src/assets/images/nav/slogan.png +0 -0
  37. package/templates/template_admin/public/src/assets/images/noData.png +0 -0
  38. package/templates/template_admin/public/src/assets/images/noSelect.png +0 -0
  39. package/templates/template_admin/public/src/components/auth/index.jsx +7 -3
  40. package/templates/template_admin/public/src/components/auth/index.less +7 -0
  41. package/templates/template_admin/public/src/components/badge/index.jsx +47 -0
  42. package/templates/template_admin/public/src/components/badge/index.less +44 -0
  43. package/templates/template_admin/public/src/components/debug/index.jsx +27 -0
  44. package/templates/template_admin/public/src/components/debug/index.less +9 -0
  45. package/templates/template_admin/public/src/components/empty/index.jsx +28 -0
  46. package/templates/template_admin/public/src/components/empty/index.less +20 -0
  47. package/templates/template_admin/public/src/components/image/index.jsx +73 -0
  48. package/templates/template_admin/public/src/components/image/index.less +117 -0
  49. package/templates/template_admin/public/src/components/image/preview.jsx +85 -0
  50. package/templates/template_admin/public/src/components/layout/basic/index.jsx +24 -11
  51. package/templates/template_admin/public/src/components/layout/basic/index.less +58 -19
  52. package/templates/template_admin/public/src/components/layout/index.jsx +20 -17
  53. package/templates/template_admin/public/src/components/layout/index.less +4 -4
  54. package/templates/template_admin/public/src/components/layout/provider/index.jsx +19 -6
  55. package/templates/template_admin/public/src/components/{menu → leftMenu}/index.jsx +20 -28
  56. package/templates/template_admin/public/src/components/leftMenu/index.less +42 -0
  57. package/templates/template_admin/public/src/components/popup/index.jsx +25 -0
  58. package/templates/template_admin/public/src/components/table/column.jsx +47 -0
  59. package/templates/template_admin/public/src/components/table/column.less +12 -0
  60. package/templates/template_admin/public/src/components/table/index.jsx +22 -13
  61. package/templates/template_admin/public/src/components/table/index.less +15 -0
  62. package/templates/template_admin/public/src/components/text/index.jsx +98 -0
  63. package/templates/template_admin/public/src/components/text/index.less +13 -0
  64. package/templates/template_admin/public/src/components/topMenu/index.jsx +97 -0
  65. package/templates/template_admin/public/src/components/topMenu/index.less +80 -0
  66. package/templates/template_admin/public/src/components/topMenu/topBar/index.jsx +76 -0
  67. package/templates/template_admin/public/src/components/topMenu/topBar/index.less +88 -0
  68. package/templates/template_admin/public/src/components/video/index.jsx +96 -0
  69. package/templates/template_admin/public/src/components/video/index.less +132 -0
  70. package/templates/template_admin/public/src/components/video/preview.jsx +38 -0
  71. package/templates/template_admin/public/src/dictionary/index.js +108 -39
  72. package/templates/template_admin/public/src/enum.js +41 -0
  73. package/templates/template_admin/public/src/hooks/index.jsx +8 -6
  74. package/templates/template_admin/public/src/hooks/useDebounceFn.jsx +33 -0
  75. package/templates/template_admin/public/src/hooks/useInToView.jsx +58 -0
  76. package/templates/template_admin/public/src/hooks/useRouteMenu.jsx +37 -28
  77. package/templates/template_admin/public/src/hooks/useTimer.jsx +42 -0
  78. package/templates/template_admin/public/src/index.jsx +10 -7
  79. package/templates/template_admin/public/src/mock/auth.js +33 -0
  80. package/templates/template_admin/public/src/mock/demo.js +12 -74
  81. package/templates/template_admin/public/src/mock/index.js +1 -0
  82. package/templates/template_admin/public/src/pages/auth/user/create/index.jsx +55 -0
  83. package/templates/template_admin/public/src/pages/auth/user/create/index.less +6 -0
  84. package/templates/template_admin/public/src/pages/auth/user/dialog/index.jsx +96 -0
  85. package/templates/template_admin/public/src/pages/auth/user/index.jsx +271 -0
  86. package/templates/template_admin/public/src/pages/components/layout/index.jsx +75 -0
  87. package/templates/template_admin/public/src/pages/components/layout/index.less +78 -0
  88. package/templates/template_admin/public/src/pages/components/layout/titleBar/index.jsx +28 -0
  89. package/templates/template_admin/public/src/pages/components/layout/titleBar/index.less +44 -0
  90. package/templates/template_admin/public/src/pages/components/select/account/index.jsx +114 -0
  91. package/templates/template_admin/public/src/pages/components/select/device/index.jsx +83 -0
  92. package/templates/template_admin/public/src/pages/components/select/groupUser/index.jsx +172 -0
  93. package/templates/template_admin/public/src/pages/components/select/user/index.jsx +119 -0
  94. package/templates/template_admin/public/src/pages/home.jsx +79 -0
  95. package/templates/template_admin/public/src/pages/home.less +6 -0
  96. package/templates/template_admin/public/src/pages/login/index.jsx +90 -6
  97. package/templates/template_admin/public/src/pages/login/index.less +133 -24
  98. package/templates/template_admin/public/src/provider/app.jsx +72 -66
  99. package/templates/template_admin/public/src/provider/loading.jsx +47 -0
  100. package/templates/template_admin/public/src/provider/menu.jsx +117 -83
  101. package/templates/template_admin/public/src/provider/menu.less +35 -0
  102. package/templates/template_admin/public/src/route.jsx +41 -40
  103. package/templates/template_admin/public/src/services/auth.js +39 -0
  104. package/templates/template_admin/public/src/services/demo.js +3 -37
  105. package/templates/template_admin/public/src/services/index.js +139 -13
  106. package/templates/template_admin/public/src/services/login.js +37 -0
  107. package/templates/template_admin/public/src/services/socket/index.jsx +100 -0
  108. package/templates/template_admin/public/src/type.js +36 -19
  109. package/templates/template_admin/public/src/utils/event.js +58 -0
  110. package/templates/template_admin/public/src/utils/format.js +84 -0
  111. package/templates/template_admin/public/src/utils/index.js +214 -2
  112. package/templates/template_admin/public/src/utils/rule.js +3 -0
  113. package/templates/template_admin/public/static/kssoLogin.html +1 -1
  114. package/templates/template_admin/webpack.api.js +11 -3
  115. package/src/.DS_Store +0 -0
  116. package/templates/template_admin/.gitignore +0 -6
  117. package/templates/template_admin/public/favicon.ico +0 -0
  118. package/templates/template_admin/public/src/assets/images/avatars/1.png +0 -0
  119. package/templates/template_admin/public/src/assets/images/avatars/2.png +0 -0
  120. package/templates/template_admin/public/src/assets/images/avatars/3.png +0 -0
  121. package/templates/template_admin/public/src/components/layout/centerBody/index.jsx +0 -25
  122. package/templates/template_admin/public/src/components/layout/centerBody/index.less +0 -30
  123. package/templates/template_admin/public/src/components/menu/index.less +0 -19
  124. package/templates/template_admin/public/src/components/menu/topMenu/index.jsx +0 -132
  125. package/templates/template_admin/public/src/components/menu/topMenu/index.less +0 -105
  126. package/templates/template_admin/public/src/pages/demo/detail/index.jsx +0 -27
  127. package/templates/template_admin/public/src/pages/demo/edit/index.jsx +0 -109
  128. package/templates/template_admin/public/src/pages/demo/index.less +0 -9
  129. package/templates/template_admin/public/src/pages/demo/page1.jsx +0 -161
  130. package/templates/template_admin/public/src/pages/superAdminLogin/index.jsx +0 -64
  131. package/templates/template_admin/public/src/pages/superAdminLogin/index.less +0 -44
  132. package/templates/template_app/.gitignore +0 -6
  133. package/templates/template_oa/.gitignore +0 -6
  134. package/templates/template_oa_jwt/.gitignore +0 -6
  135. package/templates/template_offcial/.gitignore +0 -6
@@ -4,7 +4,11 @@ import React, { useEffect, useState } from 'react';
4
4
  import { useNavigate } from 'react-router-dom';
5
5
 
6
6
  import ProviderApp from '@/provider/app';
7
+
7
8
  import {useLoading} from '@/hooks/index';
9
+ // @ts-ignore
10
+ import styles from './index.less';
11
+
8
12
 
9
13
  /**
10
14
  * 检查用户是否带有某个权限
@@ -17,7 +21,7 @@ import {useLoading} from '@/hooks/index';
17
21
  export const AuthShow=(props)=>{
18
22
  const {name} = props;
19
23
  const app = ProviderApp.useContainer();
20
- if(app?.user?.authorities?.includes(name)){
24
+ if(app?.auths?.includes(name)){
21
25
  return props.children;
22
26
  }
23
27
  return <></>
@@ -47,7 +51,7 @@ export const AuthLogin=(props)=>{
47
51
  }else{
48
52
  console.log(`[Auth]检查用户登录态失败`)
49
53
  setPass(false);
50
- navigate('/superAdminLogin');
54
+ navigate('/login');
51
55
  }
52
56
  }
53
57
  useEffect(()=>{check()},[]);
@@ -55,7 +59,7 @@ export const AuthLogin=(props)=>{
55
59
  if(pass){
56
60
  return props.children;
57
61
  }
58
- return <>检查登录态中...</>
62
+ return <div className={styles.body}></div>
59
63
  }
60
64
 
61
65
 
@@ -0,0 +1,7 @@
1
+ .body{
2
+ width: 100%;
3
+ height:100%;
4
+ position: fixed;
5
+ background-image: url('~@/assets/images/login/bg.png');
6
+
7
+ }
@@ -0,0 +1,47 @@
1
+ import React, { useEffect, useRef, useState } from "react";
2
+
3
+ // @ts-ignore
4
+ import styles from './index.less';
5
+
6
+
7
+ const Badge=(props)=>{
8
+ const {dot=false,overflowCount=99,offset} = props;
9
+ /**
10
+ * @type {React.MutableRefObject<object>}
11
+ */
12
+ const refDom = useRef();
13
+
14
+ const [myStyle,setStyle]=useState(()=>{
15
+ if(offset){
16
+ return {
17
+ marginLeft:`${offset[0]}px`,
18
+ marginTop:`${offset[1]}px`,
19
+ }
20
+ }
21
+ });
22
+ const [count,setCount] = useState(0);
23
+
24
+
25
+ useEffect(()=>{
26
+ let _count = props.count;
27
+ if(_count != count){
28
+ setCount(+_count);
29
+ }
30
+ })
31
+ const getCountText=()=>{
32
+ if(count > overflowCount){
33
+ return `${overflowCount}+`
34
+ }else{
35
+ let req = Math.max(0,count);
36
+ return `${req}`;
37
+ }
38
+ }
39
+ let countLabel = getCountText();
40
+ return (
41
+ <div className={styles.wrap} data-hide={count <= 0}>
42
+ <div ref={refDom} style={myStyle} className={styles.badge} data-len={countLabel.length}>{countLabel}</div>
43
+ </div>
44
+ )
45
+ }
46
+
47
+ export default Badge;
@@ -0,0 +1,44 @@
1
+ .wrap{
2
+ display: inline-flex;
3
+ position: relative;
4
+ &[data-hide='true']{
5
+ display: none;
6
+ }
7
+ }
8
+ .hideBadge,
9
+ .badge{
10
+ display: inline-flex;
11
+ background-color: red;
12
+ border-radius: 100%;
13
+ color:white;
14
+ font-size: 12px;
15
+ font-weight: bold;
16
+ align-items: center;
17
+ justify-content: center;
18
+ line-height: 12px;
19
+ box-shadow: 0 0 0 1px #fff;
20
+ padding-bottom: 1px;
21
+
22
+ width: 16px;
23
+ height: 16px;
24
+ &[data-len='2']{
25
+ transform: scale(.9);
26
+ width: 26px;
27
+ height: 15px;
28
+ border-radius: 12px;
29
+ }
30
+ &[data-len='3']{
31
+ transform: scale(.9);
32
+ width: 34px;
33
+ height: 15px;
34
+ border-radius: 12px;
35
+ }
36
+ }
37
+ .hideBadge{
38
+ position: absolute;
39
+ left:0;
40
+ top:0;
41
+ opacity: 0;
42
+ z-index: -1;
43
+ pointer-events: none;
44
+ }
@@ -0,0 +1,27 @@
1
+ // @ts-ignore
2
+ import React from 'react';
3
+ // @ts-ignore
4
+ import ReactJson from 'react-json-view'
5
+ // @ts-ignore
6
+ import {Tooltip} from 'antd';
7
+ // @ts-ignore
8
+ import styles from './index.less';
9
+
10
+ /**
11
+ * 测试调试时用于点击对象后显示数据用
12
+ * @param {object} props
13
+ * @param {JSX.Element} props.children - 真正展示的对象
14
+ * @param {object} props.item - 需要被调试展示的对象数据
15
+ *
16
+ * @returns {JSX.Element}
17
+ */
18
+ export const DebugTableItem=(props)=>{
19
+ // @ts-ignore
20
+ if(BUILD_ENV==='prod'){
21
+ return props.children
22
+ }
23
+ const {children,item={}} = props;
24
+ return <Tooltip trigger='click' overlayClassName={styles.jsonView} color='white' title={<div className={styles.jsonView}><ReactJson src={item} /></div>}>
25
+ {children}
26
+ </Tooltip>
27
+ }
@@ -0,0 +1,9 @@
1
+
2
+
3
+ .jsonView{
4
+ max-width: 520px;
5
+ width:520px;
6
+ height: 400px;
7
+ overflow:auto;
8
+ position: relative;
9
+ }
@@ -0,0 +1,28 @@
1
+ // @ts-ignore
2
+ import React from "react";
3
+ // @ts-ignore
4
+ import styles from './index.less';
5
+ // @ts-ignore
6
+ import imgEmpty from '@/assets/images/noData.png';
7
+ // @ts-ignore
8
+ import imgEmptySelect from '@/assets/images/noSelect.png';
9
+
10
+
11
+ /**
12
+ * 当前没数据的占位图
13
+ * @param {object} props
14
+ * @param {string} [props.label='暂无数据 ,请稍后再试'] - 提示文案
15
+ * @param {string} [props.type='data'] - 图标类型 'data':无数据 , ‘select':没有选择提示
16
+ * @returns {JSX.Element}
17
+ */
18
+ const EmptyData=(props)=>{
19
+ const {label='暂无数据 ,请稍后再试',type='data'}= props;
20
+ return (
21
+ <section className={styles.wrap}>
22
+ <img src={type=='select'?imgEmptySelect:imgEmpty} />
23
+ <span>{label}</span>
24
+ </section>
25
+ )
26
+ }
27
+
28
+ export default EmptyData;
@@ -0,0 +1,20 @@
1
+
2
+
3
+ .wrap{
4
+ width: 100%;
5
+ height: 100%;
6
+ display: flex;
7
+ flex-direction: column;
8
+ align-items: center;
9
+ justify-content: center;
10
+ row-gap: 16px;
11
+ img{
12
+ width: 96px;
13
+ }
14
+ span{
15
+ font-weight: 400;
16
+ font-size: 14px;
17
+ color: #8F959E;
18
+ line-height: 16px;
19
+ }
20
+ }
@@ -0,0 +1,73 @@
1
+ import React, { useState } from 'react';
2
+ // @ts-ignore
3
+ import { Image } from 'antd';
4
+ import ShowPreview from './preview';
5
+ // @ts-ignore
6
+ import styles from './index.less';
7
+ // @ts-ignore
8
+ import imgFail from '@/assets/images/loadFail.png';
9
+
10
+
11
+ const errorImg =imgFail;
12
+ // 'data:image/png;base64,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';
13
+
14
+ /**
15
+ * @typedef ParamsBasic
16
+ * @property {string} props.src - 必填项;显示的图片地址
17
+ * @property {boolean} [props.hidePreview] - 可选项;是否展示预览功能
18
+ * @property {Array} [props.previewSrcs] - 可选项;预览图片地址
19
+ * @property {boolean} [props.showBlurOSS] - 可选项;展示oss图片模糊效果,大图时渐进加载
20
+ * @property {string} [props.className] - 可选项;类名
21
+ * @property {'view'|'checkbox'} [props.mode='view'] - view为预览模式,点击后会放大,checkbox为选择模式点击后为选中
22
+ * @property {(checked:boolean)=>void} [props.onClick] - 点击后的回调
23
+ * @property {boolean} [props.checked=false] - 选中状态
24
+ *
25
+ */
26
+
27
+ /**
28
+ * 带预览功能的图片组件
29
+ * @param {ParamsBasic & OtherAny} props
30
+ * @returns {JSX.Element}
31
+ */
32
+ const ImgPreview = (props) => {
33
+ const { src, hidePreview, showBlurOSS, className,mode='view',checked=false,onClick:_onClick, ...others } =props;
34
+ const previewSrcs = props.previewSrcs || [{ src,name:src }];
35
+
36
+ const onImgClick = ()=>{
37
+ if(mode=='checkbox'){
38
+ if(_onClick){
39
+ _onClick(!checked);
40
+ }
41
+ return;
42
+ }
43
+ if(hidePreview) return;
44
+ ShowPreview({
45
+ data:previewSrcs,
46
+ });
47
+ }
48
+
49
+ return (
50
+ <div className={`${styles.wrap} ${className}`} data-checked={checked} onClick={onImgClick}>
51
+ <Image
52
+ className={`${styles.imgWrap}`}
53
+ src={src || errorImg}
54
+ preview={false}
55
+ placeholder={
56
+ showBlurOSS ? (
57
+ <Image
58
+ preview={false}
59
+ src={`${src}?x-oss-process=image/blur,r_50,s_50/quality,q_1/resize,m_mfit,h_200`}
60
+ className={`${className}`}
61
+ />
62
+ ) : (
63
+ false
64
+ )
65
+ }
66
+ fallback={errorImg}
67
+ {...others}
68
+ />
69
+ </div>
70
+ );
71
+ };
72
+
73
+ export default ImgPreview;
@@ -0,0 +1,117 @@
1
+
2
+ .wrap{
3
+ position: relative;
4
+ display: flex;
5
+ justify-content: center;
6
+ align-items: center;
7
+ cursor: pointer;
8
+ overflow: hidden;
9
+ width: 174px;
10
+ height: 174px;
11
+ :global{
12
+ .ant-image{
13
+ width: 100%;
14
+ height: 100%;
15
+ }
16
+ }
17
+ .imgWrap{width: 100%;height: 100%;}
18
+ &[data-checked='true']{
19
+ &:before{
20
+ content:' ';
21
+ position: absolute;
22
+ width: 100%;
23
+ height: 100%;
24
+ background-color: rgba(0,0,0,.5);
25
+ left:0;
26
+ top:0;
27
+ z-index: 1;
28
+ }
29
+ &:after{
30
+ background-image: url('~@/assets/images/chat/checked.png');
31
+ background-size: contain;
32
+ width: 48px;
33
+ height: 48px;
34
+ position: absolute;
35
+ content: ' ';
36
+ z-index: 1;
37
+ }
38
+ }
39
+ }
40
+
41
+ .main{
42
+ position: fixed;
43
+ top: 0;
44
+ right: 0;
45
+ bottom: 0;
46
+ left: 0;
47
+ z-index: 1000;
48
+ width: 100%;
49
+ height: 100%;
50
+ overflow: hidden;
51
+ }
52
+ .preview {
53
+ padding: 30px;
54
+ width: 100%;
55
+ height: 100%;
56
+ display: flex;
57
+ flex-direction: column;
58
+ justify-content: center;
59
+ align-items: center;
60
+ background-color: rgba(0, 0, 0, 0.7);
61
+ overflow: auto;
62
+ .current{
63
+ margin-top: 30px;
64
+ margin-bottom: 8px;
65
+ flex:none;
66
+ width:70vh;
67
+ height: 70vh;
68
+ display: flex;
69
+ align-items: center;
70
+ justify-content: center;
71
+ position: relative;
72
+ .image{
73
+ max-width:70vh;
74
+ max-height: 70vh;
75
+ object-fit: contain;
76
+ }
77
+ }
78
+ .name{
79
+ flex: none;
80
+ color: #FFFFFF;
81
+ font-weight: var(--weight-Medium);
82
+ line-height: 16px;
83
+ padding-bottom: 24px;
84
+ }
85
+ .thumb{
86
+ flex: none;
87
+ width: 100%;
88
+ padding-bottom: 24px;
89
+ display: flex;
90
+ justify-content: center;
91
+ column-gap: 24px;
92
+ overflow-x: auto;
93
+ .item{
94
+ border: 1px solid rgba(31,35,41,0.15);
95
+ border-radius: 4px;
96
+ cursor: pointer;
97
+ .itemImage{
98
+ width: 45px;
99
+ height: 80px;
100
+ object-fit: cover;
101
+ border-radius: 4px;
102
+ }
103
+ }
104
+ .active{
105
+ border: 2px solid #fff;
106
+ }
107
+ }
108
+ .close{
109
+ position: absolute;
110
+ top: -30px;
111
+ right: -30px;
112
+ svg{
113
+ font-size: 24px;
114
+ color:rgba(255, 255, 255, 0.85)
115
+ }
116
+ }
117
+ }
@@ -0,0 +1,85 @@
1
+ import React, { useState } from 'react';
2
+ import ReactDom from 'react-dom';
3
+ import { Image,Button,Space } from 'antd';
4
+ import { CloseOutlined } from '@ant-design/icons';
5
+ import Popup from '@/components/popup';
6
+ // @ts-ignore
7
+ import styles from './index.less';
8
+
9
+ const ModalPreview = (props) => {
10
+ const { destory,data=[] } = props;
11
+ const [current,setCurrent] = useState(0);
12
+
13
+ const onCancel = () => {
14
+ destory && destory();
15
+ };
16
+ const prePage = (e)=>{
17
+ e.stopPropagation();
18
+ if(!current) return;
19
+ setCurrent(current - 1);
20
+ }
21
+ const nextPage = (e)=>{
22
+ e.stopPropagation();
23
+ setCurrent(current+1);
24
+ }
25
+
26
+
27
+ return (
28
+ <section className={styles.main}>
29
+ <section className={styles.preview}>
30
+ <div className={styles.current}>
31
+ <Image
32
+ preview={false}
33
+ src={data?.[current]?.src}
34
+ className={styles.image}
35
+ />
36
+ <CloseOutlined className={styles.close} onClick={onCancel} />
37
+ </div>
38
+ {data?.length > 1 && (
39
+ <>
40
+ <div className={styles.name}>{data?.[current]?.name}</div>
41
+ <section className={styles.thumb}>
42
+ {data.map((item, index) => (
43
+ <div
44
+ key={index}
45
+ className={`${styles.item} ${
46
+ current === index ? styles.active : ''
47
+ }`}
48
+ onClick={() => setCurrent(index)}
49
+ >
50
+ <Image
51
+ preview={false}
52
+ src={item?.src}
53
+ className={styles.itemImage}
54
+ />
55
+ </div>
56
+ ))}
57
+ </section>
58
+ <Space size={'middle'}>
59
+ <Button disabled={!current} onClick={prePage}>
60
+ 上一页
61
+ </Button>
62
+ <Button
63
+ disabled={!(current < data?.length - 1)}
64
+ onClick={nextPage}
65
+ >
66
+ 下一页
67
+ </Button>
68
+ </Space>
69
+ </>
70
+ )}
71
+ </section>
72
+ </section>
73
+ );
74
+ };
75
+
76
+ const ShowPreview = (props = {}) => {
77
+ return new Promise((resolve) => {
78
+ let popup = Popup(resolve);
79
+ ReactDom.render(
80
+ <ModalPreview destory={popup.destory} {...props} />,
81
+ popup.dom
82
+ );
83
+ });
84
+ };
85
+ export default ShowPreview;
@@ -3,13 +3,13 @@ import React from 'react';
3
3
  // @ts-ignore
4
4
  import {Outlet} from 'react-router-dom';
5
5
 
6
- import {LayoutCenterBody} from '@/components/layout';
6
+ import TopBar from '@/components/topMenu/topBar';
7
7
 
8
8
  // @ts-ignore
9
9
  import styles from './index.less';
10
10
 
11
11
  /**
12
- * 基础页面框架
12
+ * 登录后的页面主体框架,定义导航栏、路由主体部分位置
13
13
  * @param {object} props
14
14
  * @param {JSX.Element} [props.nav] - 左侧导航栏组件
15
15
  * @param {JSX.Element} [props.topMenu] - 顶部导航栏组件
@@ -18,18 +18,31 @@ import styles from './index.less';
18
18
  */
19
19
  const LayoutBasic=(props)=>{
20
20
  const {nav="",topMenu=""} = props;
21
+
21
22
  return (
22
- <LayoutCenterBody layout='x-center'>
23
- <section className={styles.wrap} >
24
- {topMenu}
25
- <section className={styles.content}>
26
- {nav}
27
- <section className={styles.body}>
28
- <Outlet />
23
+ <div className={styles.layout}>
24
+ {/* 设置站点主体最小尺寸,窗口小于该尺寸将触发滚动条 */}
25
+ <div className={styles.frameMinSize} >
26
+
27
+ {/* 定义站点基础框架圣杯布局 */}
28
+ <section className={styles.frameTop}>
29
+ {/* 一级导航栏 */}
30
+ {topMenu}
31
+ </section>
32
+
33
+ <section className={styles.frameBottom}>
34
+ <section className={styles.frameContent}>
35
+ {/* 二级导航栏 */}
36
+ {nav}
37
+ {/* 路由内的页面部分 */}
38
+ <section className={styles.framePage}>
39
+ <Outlet />
40
+ </section>
29
41
  </section>
30
42
  </section>
31
- </section>
32
- </LayoutCenterBody>
43
+
44
+ </div>
45
+ </div>
33
46
  )
34
47
  }
35
48