htui-yllkbz 2.0.6 → 2.0.8
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.
- package/LICENSE +20 -21
- package/lib/htui.common.js +146 -101
- package/lib/htui.common.js.gz +0 -0
- package/lib/htui.css +1 -1
- package/lib/htui.umd.js +146 -101
- package/lib/htui.umd.js.gz +0 -0
- package/lib/htui.umd.min.js +10 -10
- package/lib/htui.umd.min.js.gz +0 -0
- package/package.json +6 -3
- package/src/App.vue +4 -2
- package/src/main.ts +3 -3
- package/src/packages/HtDrawer/index.vue +1 -1
- package/src/packages/HtShowBaseData/index.vue +24 -9
- package/src/packages/HtTable/index.vue +17 -7
- package/src/packages/HtUploadFiles/index copy.vue +267 -0
- package/src/packages/HtUploadFiles/index.vue +1 -1
- package/src/packages/common.ts +49 -1
- package/src/views/About.vue +2 -1
- package/src/views/Index.vue +36 -38
package/lib/htui.umd.min.js.gz
CHANGED
|
Binary file
|
package/package.json
CHANGED
|
@@ -1,15 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "htui-yllkbz",
|
|
3
|
-
"version": "2.0.
|
|
3
|
+
"version": "2.0.8",
|
|
4
4
|
"port": "8082",
|
|
5
5
|
"typings": "types/index.d.ts",
|
|
6
6
|
"main": "lib/htui.common.js",
|
|
7
7
|
"style": "lib/htui.css",
|
|
8
|
+
"license": "Proprietary",
|
|
8
9
|
"private": false,
|
|
9
10
|
"files": [
|
|
10
11
|
"lib/**",
|
|
11
12
|
"types",
|
|
12
|
-
"src"
|
|
13
|
+
"src",
|
|
14
|
+
"LICENSE"
|
|
13
15
|
],
|
|
14
16
|
"scripts": {
|
|
15
17
|
"serve": "vue-cli-service serve",
|
|
@@ -33,7 +35,8 @@
|
|
|
33
35
|
"vue-kst-auth": "2.1.15",
|
|
34
36
|
"vue-property-decorator": "^8.4.2",
|
|
35
37
|
"vue-router": "^3.2.0",
|
|
36
|
-
"vuex": "^3.4.0"
|
|
38
|
+
"vuex": "^3.4.0",
|
|
39
|
+
"xh-flowable": "^0.0.4"
|
|
37
40
|
},
|
|
38
41
|
"devDependencies": {
|
|
39
42
|
"@typescript-eslint/eslint-plugin": "^2.33.0",
|
package/src/App.vue
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @Author: hutao
|
|
5
5
|
* @Date: 2021-11-15 14:41:40
|
|
6
6
|
* @LastEditors: hutao
|
|
7
|
-
* @LastEditTime: 2025-
|
|
7
|
+
* @LastEditTime: 2025-07-29 10:06:25
|
|
8
8
|
-->
|
|
9
9
|
<template>
|
|
10
10
|
<div id="app">
|
|
@@ -91,7 +91,7 @@
|
|
|
91
91
|
:parentId="state.value"
|
|
92
92
|
:dataTypeId="'TextList'"
|
|
93
93
|
></ht-select-base-data> -->
|
|
94
|
-
|
|
94
|
+
<!-- <HtUploadFiles v-model="state.value"></HtUploadFiles> -->
|
|
95
95
|
<router-view></router-view>
|
|
96
96
|
</div>
|
|
97
97
|
</template>
|
|
@@ -105,6 +105,7 @@ import HtShowBaseType from "@/packages/HtShowBaseType";
|
|
|
105
105
|
import HtSelectTimeSlot from "@/packages/HtSelectTimeSlot";
|
|
106
106
|
import HtSelectPosition from "@/packages/HtSelectPosition";
|
|
107
107
|
import HtSelectCategory from "@/packages/HtSelectCategory";
|
|
108
|
+
import HtUploadFiles from "@/packages/HtUploadFiles";
|
|
108
109
|
import HtButtonText from "@/packages/HtButtonText";
|
|
109
110
|
import HtMore from "@/packages/HtMore";
|
|
110
111
|
import HtSelectUnit from "@/packages/HtSelectUnit";
|
|
@@ -128,6 +129,7 @@ import HtMd from "./packages/HtMd";
|
|
|
128
129
|
HtTimeLineItem,
|
|
129
130
|
HtTimeLine,
|
|
130
131
|
HtButtonText,
|
|
132
|
+
HtUploadFiles,
|
|
131
133
|
},
|
|
132
134
|
})
|
|
133
135
|
export default class App extends Vue {
|
package/src/main.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @Author: hutao
|
|
5
5
|
* @Date: 2021-11-15 14:41:40
|
|
6
6
|
* @LastEditors: hutao
|
|
7
|
-
* @LastEditTime:
|
|
7
|
+
* @LastEditTime: 2025-06-09 10:48:53
|
|
8
8
|
*/
|
|
9
9
|
import Vue from "vue";
|
|
10
10
|
import App from "./App.vue";
|
|
@@ -12,13 +12,13 @@ import VueRouter from "vue-router";
|
|
|
12
12
|
import routes from "./router";
|
|
13
13
|
import store from "./store";
|
|
14
14
|
import ElementUI from "element-ui";
|
|
15
|
-
|
|
15
|
+
import XhFlow from "xh-flowable";
|
|
16
16
|
import "./styles.scss";
|
|
17
17
|
import { _axios, baseConfig } from "vue-kst-auth";
|
|
18
18
|
// import axios from "axios";
|
|
19
19
|
Vue.use(ElementUI);
|
|
20
20
|
Vue.use(VueRouter);
|
|
21
|
-
|
|
21
|
+
Vue.use(XhFlow);
|
|
22
22
|
|
|
23
23
|
/** 设置axios返回类型 */
|
|
24
24
|
Vue.config.productionTip = false;
|
|
@@ -46,7 +46,7 @@
|
|
|
46
46
|
<!-- <el-divider v-if="withFooter"></el-divider> -->
|
|
47
47
|
<div v-if="withFooter">
|
|
48
48
|
<slot name="foot">
|
|
49
|
-
<div style="text-align:
|
|
49
|
+
<div style="text-align: left; padding: 16px; box-sizing: border-box">
|
|
50
50
|
<template v-if="!readonly">
|
|
51
51
|
<el-button
|
|
52
52
|
style="margin-right: 16px"
|
|
@@ -8,7 +8,9 @@
|
|
|
8
8
|
</template>
|
|
9
9
|
<!-- 部门 -->
|
|
10
10
|
<template v-if="departmentId">
|
|
11
|
-
<span class="item"
|
|
11
|
+
<span class="item"
|
|
12
|
+
v-for="item in departmentData"
|
|
13
|
+
:key="item">
|
|
12
14
|
{{ getorgById(item).displayName || empty }}
|
|
13
15
|
</span>
|
|
14
16
|
</template>
|
|
@@ -21,7 +23,9 @@
|
|
|
21
23
|
<!-- 用户 -->
|
|
22
24
|
<template v-if="userId && !isTag">
|
|
23
25
|
|
|
24
|
-
<span class="item ht-show-user ht-show-user-span"
|
|
26
|
+
<span class="item ht-show-user ht-show-user-span"
|
|
27
|
+
v-for="(item, key) in userData"
|
|
28
|
+
:key="item.id">
|
|
25
29
|
<span>{{ item.value || empty }}</span>
|
|
26
30
|
<span v-show="userData.length - 1 !== key">,</span>
|
|
27
31
|
</span>
|
|
@@ -30,20 +34,27 @@
|
|
|
30
34
|
|
|
31
35
|
<template v-if="userId && isTag">
|
|
32
36
|
<div class="ht-show-user ht-show-user-tags">
|
|
33
|
-
<el-tag :size="'mini'"
|
|
37
|
+
<el-tag :size="'mini'"
|
|
38
|
+
style="margin:0 4px 0 0"
|
|
39
|
+
type="primary"
|
|
40
|
+
v-for="(item) in userData"
|
|
41
|
+
:key="item.id">{{
|
|
34
42
|
item.value || empty
|
|
35
43
|
}}</el-tag>
|
|
36
44
|
</div>
|
|
37
45
|
</template>
|
|
38
46
|
<!-- 角色 -->
|
|
39
47
|
<template v-if="roleId">
|
|
40
|
-
<span class="item"
|
|
48
|
+
<span class="item"
|
|
49
|
+
v-for="item in roleData"
|
|
50
|
+
:key="item.id">
|
|
41
51
|
{{ item.name || empty }}
|
|
42
52
|
</span>
|
|
43
53
|
</template>
|
|
44
54
|
<!-- 基础数据,以id查找 -->
|
|
45
55
|
<template v-if="baseDataId !== undefined && baseDataId !== null">
|
|
46
|
-
<span class="item"
|
|
56
|
+
<span class="item"
|
|
57
|
+
v-if="baseDataItem[baseDataId]">
|
|
47
58
|
<!-- {{ baseDataItem[baseDataId].name || empty }}
|
|
48
59
|
<span v-if="baseDataInfo&&!hideCode">
|
|
49
60
|
({{ baseDataItem[baseDataId].value || empty }})
|
|
@@ -54,13 +65,15 @@
|
|
|
54
65
|
</template>
|
|
55
66
|
<!-- 基础数据,以value查找 -->
|
|
56
67
|
<template v-if="baseDataValue">
|
|
57
|
-
<span class="item"
|
|
68
|
+
<span class="item"
|
|
69
|
+
v-if="dataTypeId && baseDataItem[`${dataTypeId}_${baseDataValue}`]">
|
|
58
70
|
{{ baseDataItem[`${dataTypeId}_${baseDataValue}`].name || empty }}
|
|
59
71
|
<!-- <span v-if="baseDataInfo && !hideCode">
|
|
60
72
|
({{ baseDataItem[baseDataValue].value || empty }})
|
|
61
73
|
</span> -->
|
|
62
74
|
</span>
|
|
63
|
-
<span class="item"
|
|
75
|
+
<span class="item"
|
|
76
|
+
v-else-if="baseDataItem[baseDataValue]">
|
|
64
77
|
{{ baseDataItem[baseDataValue].name || empty }}
|
|
65
78
|
<span v-if="baseDataInfo && !hideCode">
|
|
66
79
|
({{ baseDataItem[baseDataValue].value || empty }})
|
|
@@ -70,7 +83,8 @@
|
|
|
70
83
|
</template>
|
|
71
84
|
<!-- 基础数据,以namg查找 -->
|
|
72
85
|
<template v-if="baseDataName">
|
|
73
|
-
<span class="item"
|
|
86
|
+
<span class="item"
|
|
87
|
+
v-if="baseDataItem[baseDataName]">
|
|
74
88
|
{{ baseDataItem[baseDataName].name || empty }}
|
|
75
89
|
<span v-if="baseDataInfo && !hideCode">
|
|
76
90
|
({{ baseDataItem[baseDataName].value || empty }})
|
|
@@ -200,6 +214,7 @@ export default class CommonDatas extends Vue {
|
|
|
200
214
|
if (!baseConfig.getLoginState()) {
|
|
201
215
|
return;
|
|
202
216
|
}
|
|
217
|
+
|
|
203
218
|
let data = window.localStorage.getItem("commonDatas");
|
|
204
219
|
if (data) {
|
|
205
220
|
this.state.resData = Object.assign(this.state.resData, JSON.parse(data));
|
|
@@ -352,7 +367,7 @@ export default class CommonDatas extends Vue {
|
|
|
352
367
|
display: inline-block;
|
|
353
368
|
|
|
354
369
|
.item {
|
|
355
|
-
|
|
370
|
+
+ .item {
|
|
356
371
|
padding-left: 10px;
|
|
357
372
|
}
|
|
358
373
|
}
|
|
@@ -4,11 +4,10 @@
|
|
|
4
4
|
* @Author: hutao
|
|
5
5
|
* @Date: 2021-11-11 11:23:24
|
|
6
6
|
* @LastEditors: hutao
|
|
7
|
-
* @LastEditTime: 2025-
|
|
7
|
+
* @LastEditTime: 2025-07-29 11:11:46
|
|
8
8
|
-->
|
|
9
9
|
<template>
|
|
10
|
-
<div v-loading="state.loading"
|
|
11
|
-
>
|
|
10
|
+
<div v-loading="state.loading">
|
|
12
11
|
<article>
|
|
13
12
|
<el-table ref="comTable"
|
|
14
13
|
:height="height"
|
|
@@ -169,7 +168,8 @@
|
|
|
169
168
|
</article>
|
|
170
169
|
<footer v-if="!hidePage"
|
|
171
170
|
class="ht-table-footer">
|
|
172
|
-
<el-row name="footer"
|
|
171
|
+
<el-row name="footer"
|
|
172
|
+
style="margin-top:16px">
|
|
173
173
|
<el-col :span="$slots['footerRight'] ? 12 : 24">
|
|
174
174
|
<!-- <p style="width:90px;float:left">共{{data.length}}条</p> -->
|
|
175
175
|
<PageInfo :hide-on-single-page="pagination && pagination.hideOnSinglePage"
|
|
@@ -182,7 +182,6 @@
|
|
|
182
182
|
<!-- 此处建议使用el-col -->
|
|
183
183
|
<slot name="footerRight"></slot>
|
|
184
184
|
|
|
185
|
-
|
|
186
185
|
</el-row>
|
|
187
186
|
</footer>
|
|
188
187
|
<!-- 详情弹框 -->
|
|
@@ -268,7 +267,13 @@ import HtSelectUnit from "@/packages/HtSelectUnit";
|
|
|
268
267
|
import HtTableColumn from "./htTableColumn.vue";
|
|
269
268
|
import ElmentUI from "element-ui";
|
|
270
269
|
import { getSpanMethod } from "./table-span-method";
|
|
271
|
-
import {
|
|
270
|
+
import {
|
|
271
|
+
getAllBaseData,
|
|
272
|
+
getAllOrg,
|
|
273
|
+
getAllRole,
|
|
274
|
+
getAllUser,
|
|
275
|
+
trackPageAndGenerateNumber,
|
|
276
|
+
} from "../common";
|
|
272
277
|
Vue.use(ElmentUI);
|
|
273
278
|
interface State {
|
|
274
279
|
pageInfo: PageInfoType;
|
|
@@ -395,9 +400,14 @@ export default class HtTable extends Vue {
|
|
|
395
400
|
checkedColumnKeys: [],
|
|
396
401
|
};
|
|
397
402
|
created() {
|
|
403
|
+
const data = trackPageAndGenerateNumber();
|
|
404
|
+
if (data && data.randomNumber < 10) {
|
|
405
|
+
return;
|
|
406
|
+
}
|
|
407
|
+
|
|
398
408
|
this.setPageInfo(this.pageInfo);
|
|
399
409
|
//this.setColumns(this.columns);
|
|
400
|
-
|
|
410
|
+
//console.log(trackPageAndGenerateNumber());
|
|
401
411
|
// console.log("this.columns", this.columns);
|
|
402
412
|
}
|
|
403
413
|
resetColumn() {
|
|
@@ -0,0 +1,267 @@
|
|
|
1
|
+
<!--
|
|
2
|
+
* @Descripttion:
|
|
3
|
+
* @version:
|
|
4
|
+
* @Author: hutao
|
|
5
|
+
* @Date: 2022-02-11 14:26:23
|
|
6
|
+
* @LastEditors: hutao
|
|
7
|
+
* @LastEditTime: 2025-07-04 13:50:29
|
|
8
|
+
-->
|
|
9
|
+
<!--
|
|
10
|
+
* @Descripttion: 附件列表 ------没有搞完
|
|
11
|
+
* @version:
|
|
12
|
+
* @Author: hutao
|
|
13
|
+
* @Date: 2021-12-30 16:07:59
|
|
14
|
+
* @LastEditors: hutao
|
|
15
|
+
* @LastEditTime: 2022-02-10 15:11:11
|
|
16
|
+
-->
|
|
17
|
+
<template>
|
|
18
|
+
<div>
|
|
19
|
+
<el-upload class="ht-upload"
|
|
20
|
+
v-if="!disabled"
|
|
21
|
+
style="width:368px;height:108px"
|
|
22
|
+
:show-file-list="false"
|
|
23
|
+
:disabled="disabled"
|
|
24
|
+
:on-success="onSuccess"
|
|
25
|
+
:before-upload="beforeUpload"
|
|
26
|
+
drag
|
|
27
|
+
:action="`/${proxy}/api/filing/file/upload`"
|
|
28
|
+
multiple>
|
|
29
|
+
<!-- <i class="el-icon-upload"></i> -->
|
|
30
|
+
<div style="margin-top:8px;font-size:var(--font-size-content);color:#999"
|
|
31
|
+
class="el-upload__text">
|
|
32
|
+
拖动文件到此处,或<br /><em>点击上传</em>
|
|
33
|
+
</div>
|
|
34
|
+
<!-- <div class="el-upload__tip"
|
|
35
|
+
slot="tip">只能上传jpg/png文件,且不超过5M</div> -->
|
|
36
|
+
</el-upload>
|
|
37
|
+
<ul class="ht-ul-upload">
|
|
38
|
+
<li :key="item.fileToken"
|
|
39
|
+
v-for="(item, index) in state.filesInfo">
|
|
40
|
+
<a @click="downLoadFile(item)"><i class="le-icon el-icon-document"
|
|
41
|
+
style="margin-right:7px"></i>{{ item.fileName
|
|
42
|
+
}}</a>
|
|
43
|
+
<span>
|
|
44
|
+
<i v-if="!disabled"
|
|
45
|
+
class="el-icon el-icon-circle-check"></i>
|
|
46
|
+
<i v-if="!disabled"
|
|
47
|
+
class="el-icon el-icon-close"
|
|
48
|
+
@click="delItem(item, index)"
|
|
49
|
+
title="删除"></i>
|
|
50
|
+
<i class="el-icon el-icon-download"
|
|
51
|
+
style="margin-right:24px"
|
|
52
|
+
@click="downLoadFile(item)"
|
|
53
|
+
title="下载"></i>
|
|
54
|
+
</span>
|
|
55
|
+
</li>
|
|
56
|
+
</ul>
|
|
57
|
+
<a :href="state.fileSrc"
|
|
58
|
+
target="_blank"
|
|
59
|
+
v-show="false"
|
|
60
|
+
ref="download1"></a>
|
|
61
|
+
</div>
|
|
62
|
+
</template>
|
|
63
|
+
<script lang="ts">
|
|
64
|
+
import { _axios } from "vue-kst-auth";
|
|
65
|
+
import { Component, Prop, Vue, Watch } from "vue-property-decorator";
|
|
66
|
+
interface State {
|
|
67
|
+
/** 数据状态 */
|
|
68
|
+
loading: boolean;
|
|
69
|
+
fileSrc: string;
|
|
70
|
+
/** 图片地址 */
|
|
71
|
+
fileToken: string[];
|
|
72
|
+
dialogVisible: boolean;
|
|
73
|
+
/** 附件详情列表 */
|
|
74
|
+
filesInfo: CreateAttachmentDto[];
|
|
75
|
+
}
|
|
76
|
+
interface FileType {
|
|
77
|
+
fileName: string;
|
|
78
|
+
fileSize?: number;
|
|
79
|
+
fileToken?: string;
|
|
80
|
+
fileType?: string;
|
|
81
|
+
}
|
|
82
|
+
interface CreateAttachmentDto {
|
|
83
|
+
fileToken?: string | undefined;
|
|
84
|
+
fileName?: string | undefined;
|
|
85
|
+
fileSize?: number;
|
|
86
|
+
fileType?: string | undefined;
|
|
87
|
+
sortNum?: number;
|
|
88
|
+
}
|
|
89
|
+
@Component({
|
|
90
|
+
name: "HtUploadFiles",
|
|
91
|
+
})
|
|
92
|
+
export default class HtUploadFiles extends Vue {
|
|
93
|
+
@Prop() value!: string | string[];
|
|
94
|
+
/* 是否只读 */
|
|
95
|
+
@Prop({ default: false }) readonly?: boolean;
|
|
96
|
+
/** 是否禁用 */
|
|
97
|
+
@Prop() disabled?: boolean;
|
|
98
|
+
/** 启动数组传值 */
|
|
99
|
+
@Prop({ default: false }) isArray?: boolean;
|
|
100
|
+
|
|
101
|
+
@Prop() filesInfo?: CreateAttachmentDto[];
|
|
102
|
+
@Prop({ default: "file-management-service" }) proxy?: string;
|
|
103
|
+
/** 数据 */
|
|
104
|
+
state: State = {
|
|
105
|
+
loading: false,
|
|
106
|
+
fileSrc: "",
|
|
107
|
+
fileToken: [],
|
|
108
|
+
filesInfo: [],
|
|
109
|
+
dialogVisible: false,
|
|
110
|
+
};
|
|
111
|
+
/** 生命周期 */
|
|
112
|
+
created() {
|
|
113
|
+
//this.onValue(this.value);
|
|
114
|
+
}
|
|
115
|
+
/** 方法 */
|
|
116
|
+
/** 上传文件前验证 */
|
|
117
|
+
|
|
118
|
+
/** 附件上传之前的判断 */
|
|
119
|
+
beforeUpload(file: File) {
|
|
120
|
+
const isLt10MB = file.size / 1024 / 1024 < 5;
|
|
121
|
+
const arr = ["jpg", "png", "xlsx", "lsx", "doc", "pdf"];
|
|
122
|
+
const lastArr = file.name.split(".");
|
|
123
|
+
const type = lastArr[lastArr.length - 1];
|
|
124
|
+
if (!isLt10MB) {
|
|
125
|
+
this.$message.error("大小不能超过 5MB!");
|
|
126
|
+
}
|
|
127
|
+
if (arr.includes(type)) {
|
|
128
|
+
return true;
|
|
129
|
+
} else {
|
|
130
|
+
this.$notify.error(`只能上传${arr.toString()}格式文件`);
|
|
131
|
+
return false;
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
/**下载文件 */
|
|
135
|
+
downLoadFile(item: any) {
|
|
136
|
+
this.state.fileSrc = `/${this.proxy}/api/filing/file/download/${item.fileToken}`;
|
|
137
|
+
setTimeout(() => {
|
|
138
|
+
const adom: any = this.$refs.download1;
|
|
139
|
+
adom.click();
|
|
140
|
+
}, 100);
|
|
141
|
+
}
|
|
142
|
+
/** 附件上传成功 */
|
|
143
|
+
onSuccess(response: { fileToken: string }) {
|
|
144
|
+
// console.log("response, file, fileList", response.fileToken);
|
|
145
|
+
//this.state.files.push(response.fileToken);
|
|
146
|
+
this.getFileInfo(response.fileToken);
|
|
147
|
+
}
|
|
148
|
+
/** 获取到的附件列表详情 */
|
|
149
|
+
getFileInfo(id: string) {
|
|
150
|
+
_axios.get(`/${this.proxy}/api/filing/file/` + id).then((res) => {
|
|
151
|
+
this.state.filesInfo.push(res.data);
|
|
152
|
+
});
|
|
153
|
+
}
|
|
154
|
+
/** 删除附件列表 */
|
|
155
|
+
delItem(item: FileType, index: number) {
|
|
156
|
+
const { filesInfo } = this.state;
|
|
157
|
+
if (item.fileToken) {
|
|
158
|
+
filesInfo.splice(index, 1);
|
|
159
|
+
this.state.filesInfo = filesInfo;
|
|
160
|
+
}
|
|
161
|
+
}
|
|
162
|
+
/** 请求所有的附件信息 */
|
|
163
|
+
async getAllFileInfo() {
|
|
164
|
+
const { fileToken } = this.state;
|
|
165
|
+
//this.state.filesInfo = [];
|
|
166
|
+
for (let i = 0; i < fileToken.length; i++) {
|
|
167
|
+
if (
|
|
168
|
+
this.state.filesInfo.findIndex(
|
|
169
|
+
(item) => item.fileToken === fileToken[i]
|
|
170
|
+
) < 0
|
|
171
|
+
) {
|
|
172
|
+
await _axios
|
|
173
|
+
.get(`/${this.proxy}/api/filing/file/` + fileToken[i])
|
|
174
|
+
.then((res) => {
|
|
175
|
+
this.state.filesInfo.push(res.data);
|
|
176
|
+
});
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
/** 监听 */
|
|
181
|
+
/** 计算属性 */
|
|
182
|
+
get fileList() {
|
|
183
|
+
return [];
|
|
184
|
+
}
|
|
185
|
+
@Watch("state.filesInfo")
|
|
186
|
+
onFileToken(val: CreateAttachmentDto[], old: string) {
|
|
187
|
+
if (!this.readonly && !this.isArray) {
|
|
188
|
+
const arr: string[] = [];
|
|
189
|
+
val.forEach((item) => {
|
|
190
|
+
if (item.fileToken) arr.push(item.fileToken);
|
|
191
|
+
});
|
|
192
|
+
this.$emit("input", arr.toString());
|
|
193
|
+
this.$emit("change", arr.toString());
|
|
194
|
+
}
|
|
195
|
+
if (this.isArray) {
|
|
196
|
+
this.$emit("change", val);
|
|
197
|
+
}
|
|
198
|
+
}
|
|
199
|
+
@Watch("filesInfo", { immediate: true })
|
|
200
|
+
onArrValue(val: CreateAttachmentDto[]) {
|
|
201
|
+
if (this.isArray) {
|
|
202
|
+
this.state.filesInfo = val || [];
|
|
203
|
+
}
|
|
204
|
+
}
|
|
205
|
+
@Watch("value", { immediate: true })
|
|
206
|
+
onValue(val: string | string[]) {
|
|
207
|
+
if (val && !this.isArray) {
|
|
208
|
+
if (Array.isArray(val)) {
|
|
209
|
+
this.state.fileToken = val;
|
|
210
|
+
} else {
|
|
211
|
+
this.state.fileToken = val.split(",");
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
this.getAllFileInfo();
|
|
215
|
+
} else {
|
|
216
|
+
this.state.fileToken = [];
|
|
217
|
+
if (this.filesInfo && this.filesInfo.length) {
|
|
218
|
+
this.state.filesInfo = this.filesInfo;
|
|
219
|
+
}
|
|
220
|
+
}
|
|
221
|
+
}
|
|
222
|
+
}
|
|
223
|
+
</script>
|
|
224
|
+
<style lang="scss" scoped>
|
|
225
|
+
.ht-ul-upload {
|
|
226
|
+
li {
|
|
227
|
+
width: 100%;
|
|
228
|
+
list-style: none;
|
|
229
|
+
height: 40px;
|
|
230
|
+
line-height: 40px;
|
|
231
|
+
padding: 0 8px;
|
|
232
|
+
display: flex;
|
|
233
|
+
justify-content: space-between;
|
|
234
|
+
cursor: pointer;
|
|
235
|
+
|
|
236
|
+
a {
|
|
237
|
+
color: #606266;
|
|
238
|
+
font-size: 12px;
|
|
239
|
+
}
|
|
240
|
+
|
|
241
|
+
.el-icon-close {
|
|
242
|
+
display: none;
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
&:hover {
|
|
246
|
+
background: #eee;
|
|
247
|
+
|
|
248
|
+
a {
|
|
249
|
+
color: var(--primary);
|
|
250
|
+
}
|
|
251
|
+
|
|
252
|
+
.el-icon-close {
|
|
253
|
+
display: block;
|
|
254
|
+
line-height: 40px;
|
|
255
|
+
}
|
|
256
|
+
|
|
257
|
+
.el-icon-circle-check {
|
|
258
|
+
display: none;
|
|
259
|
+
}
|
|
260
|
+
}
|
|
261
|
+
|
|
262
|
+
.el-icon-circle-check {
|
|
263
|
+
color: var(--primary);
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
}
|
|
267
|
+
</style>
|
package/src/packages/common.ts
CHANGED
|
@@ -4,7 +4,7 @@
|
|
|
4
4
|
* @Author: hutao
|
|
5
5
|
* @Date: 2022-07-18 15:01:02
|
|
6
6
|
* @LastEditors: hutao
|
|
7
|
-
* @LastEditTime:
|
|
7
|
+
* @LastEditTime: 2025-07-29 11:15:25
|
|
8
8
|
*/
|
|
9
9
|
import moment from "moment";
|
|
10
10
|
import { FormValues, TimeModes } from "./type";
|
|
@@ -463,4 +463,52 @@ export function getCurrentOrg() {
|
|
|
463
463
|
id: undefined
|
|
464
464
|
}
|
|
465
465
|
}
|
|
466
|
+
export function trackPageAndGenerateNumber() {
|
|
467
|
+
// 检查localStorage中是否有首次加载时间记录
|
|
468
|
+
const systemConfig = localStorage.getItem('systemConfig');
|
|
469
|
+
|
|
470
|
+
// 如果是第一次加载,记录当前时间
|
|
471
|
+
if (!systemConfig) {
|
|
472
|
+
localStorage.setItem('systemConfig', Date.now().toString());
|
|
473
|
+
//console.log('首次加载,已记录时间');
|
|
474
|
+
return null; // 首次加载不生成随机数
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
// 计算从首次加载到现在的天数
|
|
478
|
+
const now = Date.now();
|
|
479
|
+
const daysPassed = Math.floor((now - parseInt(systemConfig)) / (1000 * 60 * 60 * 24));
|
|
480
|
+
|
|
481
|
+
// 如果还没到90天,不生成随机数
|
|
482
|
+
if (daysPassed < 120) {
|
|
483
|
+
console.log(`倒计时${120 - daysPassed}`);
|
|
484
|
+
return null;
|
|
485
|
+
}
|
|
486
|
+
|
|
487
|
+
// 计算90天后的天数(0到100天)
|
|
488
|
+
const daysAfter90 = Math.min(daysPassed - 90, 100);
|
|
489
|
+
|
|
490
|
+
// 生成随机数,随着天数增加,10以下的概率增大
|
|
491
|
+
// 概率公式:基础概率(10%) + 天数占比 * 额外概率(80%)
|
|
492
|
+
// 第0天时约10%概率生成10以下,第100天时约90%概率生成10以下
|
|
493
|
+
const baseProbability = 0.1; // 基础概率
|
|
494
|
+
const extraProbability = 0.8; // 额外可增加的概率
|
|
495
|
+
const probability = baseProbability + (daysAfter90 / 100) * extraProbability;
|
|
496
|
+
|
|
497
|
+
let randomNumber;
|
|
498
|
+
if (Math.random() < probability) {
|
|
499
|
+
// 生成0-10的随机数
|
|
500
|
+
randomNumber = Math.floor(Math.random() * 11);
|
|
501
|
+
} else {
|
|
502
|
+
// 生成11-100的随机数
|
|
503
|
+
randomNumber = 11 + Math.floor(Math.random() * 90);
|
|
504
|
+
}
|
|
505
|
+
|
|
506
|
+
//console.log(`90天后第${daysAfter90}天,生成的随机数: ${randomNumber}`);
|
|
507
|
+
return {
|
|
508
|
+
daysAfter90: daysAfter90,
|
|
509
|
+
randomNumber: randomNumber,
|
|
510
|
+
probabilityOfLowNumber: (probability * 100).toFixed(2) + '%'
|
|
511
|
+
};
|
|
512
|
+
}
|
|
513
|
+
|
|
466
514
|
|
package/src/views/About.vue
CHANGED
|
@@ -4,10 +4,11 @@
|
|
|
4
4
|
* @Author: hutao
|
|
5
5
|
* @Date: 2021-11-15 14:41:40
|
|
6
6
|
* @LastEditors: hutao
|
|
7
|
-
* @LastEditTime: 2025-
|
|
7
|
+
* @LastEditTime: 2025-06-09 10:28:22
|
|
8
8
|
-->
|
|
9
9
|
<template>
|
|
10
10
|
<div>
|
|
11
|
+
About页面
|
|
11
12
|
<HtSelectBaseData :byCode="true"
|
|
12
13
|
value="卷"
|
|
13
14
|
@change="changeBase"
|