@ajaxjs/ui 1.0.8 → 1.1.0
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/dist/components/form/HtmlEditor/HtmlEditor.js +5 -2
- package/dist/components/form/HtmlEditor/HtmlEditor.js.map +1 -1
- package/dist/components/form/HtmlEditor/HtmlEditor.ts +6 -2
- package/package.json +5 -1
- package/.browserslistrc +0 -3
- package/.eslintrc.js +0 -25
- package/babel.config.js +0 -5
- package/public/favicon.ico +0 -0
- package/public/index.html +0 -24
- package/src/App.vue +0 -32
- package/src/assets/logo.png +0 -0
- package/src/components/form/AjSelect.vue +0 -33
- package/src/components/form/HtmlEditor/HtmlEditor.less +0 -165
- package/src/components/form/HtmlEditor/HtmlEditor.ts +0 -329
- package/src/components/form/HtmlEditor/HtmlEditor.vue +0 -70
- package/src/components/form/HtmlEditor/html-editor-HtmlSanitizer.js +0 -103
- package/src/components/form/TreeLikeSelect.vue +0 -125
- package/src/components/list/attachment-picture-list.ts +0 -57
- package/src/components/list/list.js +0 -227
- package/src/components/list/list.ts +0 -261
- package/src/components/widgets/AccordionMenu.vue +0 -138
- package/src/components/widgets/AdjustFontSize.vue +0 -66
- package/src/components/widgets/AjAvatar.vue +0 -42
- package/src/components/widgets/Article.vue +0 -49
- package/src/components/widgets/BaiduSearch.vue +0 -50
- package/src/components/widgets/Expander.vue +0 -65
- package/src/components/widgets/ImageEnlarger.vue +0 -42
- package/src/components/widgets/OpacityBanner.vue +0 -124
- package/src/components/widgets/ProcessLine.vue +0 -133
- package/src/globalDeclare/shims.d.ts +0 -4
- package/src/index.ts +0 -8
- package/src/main.ts +0 -12
- package/src/pages/Nav.vue +0 -23
- package/src/pages/common.less +0 -10
- package/src/pages/demo/Article.vue +0 -30
- package/src/pages/demo/Form.vue +0 -46
- package/src/pages/demo/Wdigets.vue +0 -168
- package/src/router/index.js +0 -39
- package/src/router/index.js.map +0 -1
- package/src/router/index.ts +0 -39
- package/src/shims-tsx.d.ts +0 -13
- package/src/shims-vue.d.ts +0 -4
- package/src/style/common-functions.less +0 -171
- package/src/style/reset.less +0 -18
- package/src/views/About.vue +0 -5
- package/src/views/Home.vue +0 -49
- package/src/views/desktop/Desktop.vue +0 -251
- package/src/views/desktop/Window.vue +0 -62
- package/src/views/desktop/desktop.md +0 -14
- package/tsconfig.json +0 -30
- package/vue.config.js +0 -17
|
@@ -1,66 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="aj-adjust-font-size">
|
|
3
|
-
<span>字体大小</span>
|
|
4
|
-
<ul @click="onClk">
|
|
5
|
-
<li><label><input type="radio" name="fontSize" /> 小</label></li>
|
|
6
|
-
<li><label><input type="radio" name="fontSize" /> 中</label></li>
|
|
7
|
-
<li><label><input type="radio" name="fontSize" /> 大</label></li>
|
|
8
|
-
</ul>
|
|
9
|
-
</div>
|
|
10
|
-
</template>
|
|
11
|
-
|
|
12
|
-
<script lang="ts">
|
|
13
|
-
/**
|
|
14
|
-
* 调整正文字体大小
|
|
15
|
-
*/
|
|
16
|
-
export default {
|
|
17
|
-
props: {
|
|
18
|
-
articleTarget: { type: String, default: "article p" }, // 正文所在的位置,通过 CSS Selector 定位
|
|
19
|
-
},
|
|
20
|
-
methods: {
|
|
21
|
-
onClk(ev: Event): void {
|
|
22
|
-
let el: Element = ev.target as Element;
|
|
23
|
-
let setFontSize = (fontSize: string): void => {
|
|
24
|
-
document.body
|
|
25
|
-
.querySelectorAll(this.$props.articleTarget)
|
|
26
|
-
.forEach((p: HTMLParagraphElement) => (p.style.fontSize = fontSize));
|
|
27
|
-
};
|
|
28
|
-
|
|
29
|
-
if (el.tagName == "LABEL" || el.tagName == "INPUT") {
|
|
30
|
-
if (el.tagName != "LABEL") el = el.parentNode as Element;
|
|
31
|
-
|
|
32
|
-
console.log(el);
|
|
33
|
-
if (el.innerHTML.indexOf("大") != -1) setFontSize("12pt");
|
|
34
|
-
else if (el.innerHTML.indexOf("中") != -1) setFontSize("10.5pt");
|
|
35
|
-
else if (el.innerHTML.indexOf("小") != -1) setFontSize("9pt");
|
|
36
|
-
}
|
|
37
|
-
},
|
|
38
|
-
},
|
|
39
|
-
};
|
|
40
|
-
</script>
|
|
41
|
-
|
|
42
|
-
<style lang="less" scoped>
|
|
43
|
-
.aj-adjust-font-size {
|
|
44
|
-
width: 210px;
|
|
45
|
-
font-size: 0.8rem;
|
|
46
|
-
padding: 2px 0;
|
|
47
|
-
|
|
48
|
-
span {
|
|
49
|
-
float: left;
|
|
50
|
-
width: 35%;
|
|
51
|
-
display: block;
|
|
52
|
-
}
|
|
53
|
-
|
|
54
|
-
ul {
|
|
55
|
-
width: 65%;
|
|
56
|
-
float: right;
|
|
57
|
-
cursor: pointer;
|
|
58
|
-
|
|
59
|
-
li {
|
|
60
|
-
display: block;
|
|
61
|
-
float: right;
|
|
62
|
-
width: 33%;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
</style>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<a :href="avatar" target="_blank">
|
|
3
|
-
<img :src="avatar" style="max-width:50px;max-height:60px;vertical-align: middle;" @mouseenter="mouseEnter" @mouseleave="mouseLeave" />
|
|
4
|
-
</a>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts">
|
|
8
|
-
/**
|
|
9
|
-
* 显示头像
|
|
10
|
-
*/
|
|
11
|
-
export default {
|
|
12
|
-
props: {
|
|
13
|
-
avatar: {
|
|
14
|
-
// 头像图片地址
|
|
15
|
-
type: String,
|
|
16
|
-
required: true,
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
methods: {
|
|
20
|
-
mouseEnter(): void {
|
|
21
|
-
// @ts-ignore
|
|
22
|
-
if (window.aj_avatar_imgUrl)
|
|
23
|
-
// @ts-ignore
|
|
24
|
-
window.aj_avatar_imgUrl = this.avatar;
|
|
25
|
-
},
|
|
26
|
-
mouseLeave(): void {
|
|
27
|
-
// @ts-ignore
|
|
28
|
-
if (window.aj_avatar_imgUrl)
|
|
29
|
-
// @ts-ignore
|
|
30
|
-
window.aj_avatar_imgUrl = null;
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
</script>
|
|
35
|
-
|
|
36
|
-
<style lang="less" scoped>
|
|
37
|
-
.aj-img-thumb img {
|
|
38
|
-
max-width: 50px;
|
|
39
|
-
max-height: 60px;
|
|
40
|
-
vertical-align: middle;
|
|
41
|
-
}
|
|
42
|
-
</style>
|
|
@@ -1,49 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<article>
|
|
3
|
-
<h2>{{title}}</h2>
|
|
4
|
-
|
|
5
|
-
<div class="toolbar">
|
|
6
|
-
<span v-if="author">作者: {{author}}</span>
|
|
7
|
-
<a :href="source" v-if="source" target="_blank">🡕来源</a>
|
|
8
|
-
<FontSize style="float:right;clear:both"></FontSize>
|
|
9
|
-
</div>
|
|
10
|
-
<slot></slot>
|
|
11
|
-
</article>
|
|
12
|
-
</template>
|
|
13
|
-
|
|
14
|
-
<script>
|
|
15
|
-
import FontSize from './AdjustFontSize.vue';
|
|
16
|
-
|
|
17
|
-
export default {
|
|
18
|
-
props: {
|
|
19
|
-
title: String, author: String, source: String
|
|
20
|
-
},
|
|
21
|
-
components: { FontSize }
|
|
22
|
-
}
|
|
23
|
-
</script>
|
|
24
|
-
|
|
25
|
-
<style lang="less" scoped>
|
|
26
|
-
article {
|
|
27
|
-
& > p {
|
|
28
|
-
.aj-text-function();
|
|
29
|
-
text-indent: 2em;
|
|
30
|
-
}
|
|
31
|
-
& > img,
|
|
32
|
-
& > p > img {
|
|
33
|
-
max-width: 80%;
|
|
34
|
-
margin: 0 auto;
|
|
35
|
-
display: block;
|
|
36
|
-
}
|
|
37
|
-
|
|
38
|
-
h2 {
|
|
39
|
-
.aj-text-title();
|
|
40
|
-
}
|
|
41
|
-
|
|
42
|
-
.toolbar {
|
|
43
|
-
height: 15px;
|
|
44
|
-
margin: 30px 0;
|
|
45
|
-
font-size: 0.8rem;
|
|
46
|
-
text-align: right;
|
|
47
|
-
}
|
|
48
|
-
}
|
|
49
|
-
</style>
|
|
@@ -1,50 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<form class="aj-widget-baidu-search" method="GET" action="http://www.baidu.com/baidu" onsubmit="//return g(this);">
|
|
3
|
-
<input type="text" name="word" placeholder="请输入搜索之关键字" />
|
|
4
|
-
<input name="tn" value="bds" type="hidden" />
|
|
5
|
-
<input name="cl" value="3" type="hidden" />
|
|
6
|
-
<input name="ct" value="2097152" type="hidden" />
|
|
7
|
-
<input name="si" :value="getSiteDomainName" type="hidden" />
|
|
8
|
-
<div class="searchBtn" onclick="this.parentNode.submit();"></div>
|
|
9
|
-
</form>
|
|
10
|
-
</template>
|
|
11
|
-
|
|
12
|
-
<script lang="ts">
|
|
13
|
-
/**
|
|
14
|
-
* Baidu 自定义搜索
|
|
15
|
-
*/
|
|
16
|
-
export default {
|
|
17
|
-
props: {
|
|
18
|
-
siteDomainName: String,
|
|
19
|
-
},
|
|
20
|
-
computed: {
|
|
21
|
-
getSiteDomainName(): string {
|
|
22
|
-
return this.siteDomainName || location.host || document.domain;
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
};
|
|
26
|
-
</script>
|
|
27
|
-
|
|
28
|
-
<style lang="less" scoped>
|
|
29
|
-
.aj-widget-baidu-search {
|
|
30
|
-
padding: 0;
|
|
31
|
-
margin: 0;
|
|
32
|
-
|
|
33
|
-
input[type="text"] {
|
|
34
|
-
border-radius: 5px;
|
|
35
|
-
border: 1px solid gray;
|
|
36
|
-
padding: 0 2px;
|
|
37
|
-
height: 22px;
|
|
38
|
-
}
|
|
39
|
-
|
|
40
|
-
.searchBtn {
|
|
41
|
-
background: url("data:image/gif;base64,R0lGODlhEAAQAGYAACH5BAEAAAAALAAAAAAQABAApgEAAOD3//n9/+3//936/xt7uX+x1KAQCyeHwsj1/6QcGZDd+fX+/+oOAFW05FCUxMXs+9P0/+T0+7fv/5rm/6fn/bHr/jCBugt0t0CKv47e+4fW9CaEv6fb8w9/weteSfkEAOsJC8xBKehVP+FZPxF1thZ4uMHx/1FBZQdssQ51uLrk9zlumyB3tDBRir3x/7nm+WK75DKb0z2k2XTG6mXD7Gq/6Euq20yk1EWp20ay5Umv4liw3dUcAKowMBqJycEzB8EqANoZACOa2KQNCp4NCgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAeWgACCDwUIhgaCiYoFNBQWFQs4F4qJBQsRAZkBFTwZlBcbEQMCpAMDCwiUBRQEpCcTCQEwN4iJHBYSAgmwBAEQObWCBRoBAi8JvQMdMsEAGTEQAQTJAw4qlAAmNSsM3RIOPyzYACUzOjY7Qx4uIQfjDykYGC0oHyAN7uOKCiMNQvn6BCkg0SNIkYCJFIgAAhChDyII9QUCADs=")
|
|
42
|
-
no-repeat center;
|
|
43
|
-
width: 25px;
|
|
44
|
-
height: 25px;
|
|
45
|
-
cursor: pointer;
|
|
46
|
-
display: inline-block;
|
|
47
|
-
vertical-align: bottom;
|
|
48
|
-
}
|
|
49
|
-
}
|
|
50
|
-
</style>
|
|
@@ -1,65 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="aj-expander" :style="'height:' + (expended ? openHeight : closeHeight) + 'px;'">
|
|
3
|
-
<div :class="expended ? 'closeBtn' : 'openBtn'" @click="expended = !expended;"></div>
|
|
4
|
-
<slot></slot>
|
|
5
|
-
</div>
|
|
6
|
-
</template>
|
|
7
|
-
|
|
8
|
-
<script lang="ts">
|
|
9
|
-
/**
|
|
10
|
-
* 展开闭合器
|
|
11
|
-
*/
|
|
12
|
-
export default {
|
|
13
|
-
props: {
|
|
14
|
-
openHeight: { type: Number, default: 200 },
|
|
15
|
-
closeHeight: { type: Number, default: 50 },
|
|
16
|
-
},
|
|
17
|
-
data(): any {
|
|
18
|
-
return {
|
|
19
|
-
expended: false,
|
|
20
|
-
};
|
|
21
|
-
},
|
|
22
|
-
};
|
|
23
|
-
</script>
|
|
24
|
-
|
|
25
|
-
<style lang="less" scoped>
|
|
26
|
-
.aj-expander {
|
|
27
|
-
overflow: hidden;
|
|
28
|
-
position: relative;
|
|
29
|
-
clear: both;
|
|
30
|
-
transition: height 200ms ease 0s;
|
|
31
|
-
|
|
32
|
-
.mask-layer {
|
|
33
|
-
position: absolute;
|
|
34
|
-
bottom: 0;
|
|
35
|
-
left: 0;
|
|
36
|
-
height: 23px;
|
|
37
|
-
width: 100%;
|
|
38
|
-
background: -webkit-gradient(
|
|
39
|
-
linear,
|
|
40
|
-
center top,
|
|
41
|
-
center bottom,
|
|
42
|
-
from(transparent),
|
|
43
|
-
to(white)
|
|
44
|
-
);
|
|
45
|
-
}
|
|
46
|
-
|
|
47
|
-
.openBtn {
|
|
48
|
-
background: url("https://ajaxjs.nos-eastchina1.126.net/images/openBtn.png");
|
|
49
|
-
}
|
|
50
|
-
|
|
51
|
-
.closeBtn {
|
|
52
|
-
background: url("https://ajaxjs.nos-eastchina1.126.net/images/closeBtn.png");
|
|
53
|
-
}
|
|
54
|
-
|
|
55
|
-
.closeBtn,
|
|
56
|
-
.openBtn {
|
|
57
|
-
width: 45px;
|
|
58
|
-
height: 32px;
|
|
59
|
-
position: absolute;
|
|
60
|
-
cursor: pointer;
|
|
61
|
-
top: 0px;
|
|
62
|
-
right: 0px;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
</style>
|
|
@@ -1,42 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<a class="aj-img-thumb" :href="getImgUrl" v-if="imgUrl" target="_blank">
|
|
3
|
-
<img :src="getImgUrl" :onmouseenter="'aj_widget_imageEnlarger_imgUrl = ' + getImgUrl + ';'" onmouseleave="aj_widget_imageEnlarger_imgUrl = null;" />
|
|
4
|
-
</a>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts">
|
|
8
|
-
/**
|
|
9
|
-
* 悬浮显示大图
|
|
10
|
-
*/
|
|
11
|
-
export default {
|
|
12
|
-
props: {
|
|
13
|
-
imgUrl: {
|
|
14
|
-
// 图片地址
|
|
15
|
-
type: String,
|
|
16
|
-
required: true,
|
|
17
|
-
},
|
|
18
|
-
},
|
|
19
|
-
computed: {
|
|
20
|
-
getImgUrl(): string {
|
|
21
|
-
if (!this.imgUrl) return "";
|
|
22
|
-
|
|
23
|
-
if (this.imgUrl.indexOf("http") != -1)
|
|
24
|
-
// 图片地址已经是完整的 http 地址,直接返回
|
|
25
|
-
return this.imgUrl;
|
|
26
|
-
// uploadFile.imgPerfix
|
|
27
|
-
|
|
28
|
-
if (!this.ajResources.imgPerfix) throw "未提供图片前缀地址";
|
|
29
|
-
|
|
30
|
-
return this.ajResources.imgPerfix + this.imgUrl;
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
};
|
|
34
|
-
</script>
|
|
35
|
-
|
|
36
|
-
<style lang="less" scoped>
|
|
37
|
-
.aj-img-thumb img {
|
|
38
|
-
max-width: 50px;
|
|
39
|
-
max-height: 60px;
|
|
40
|
-
vertical-align: middle;
|
|
41
|
-
}
|
|
42
|
-
</style>
|
|
@@ -1,124 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<ul class="aj-opacity-banner">
|
|
3
|
-
<slot></slot>
|
|
4
|
-
</ul>
|
|
5
|
-
</template>
|
|
6
|
-
|
|
7
|
-
<script lang="ts">
|
|
8
|
-
/**
|
|
9
|
-
* 渐显 banner
|
|
10
|
-
* 注意:定时器保存在 DOM 元素的属性上,是否会内存泄漏呢?
|
|
11
|
-
*/
|
|
12
|
-
export default {
|
|
13
|
-
props: {
|
|
14
|
-
delay: { default: 3000 }, // 延时
|
|
15
|
-
fps: { default: 25 }, // 帧速
|
|
16
|
-
},
|
|
17
|
-
data(): any {
|
|
18
|
-
return {
|
|
19
|
-
active: 0, // 当前索引
|
|
20
|
-
};
|
|
21
|
-
},
|
|
22
|
-
mounted(): void {
|
|
23
|
-
this.list = this.$el.querySelectorAll("li"); // 各帧
|
|
24
|
-
this.list[0].style.opacity = "1";
|
|
25
|
-
this.run();
|
|
26
|
-
},
|
|
27
|
-
methods: {
|
|
28
|
-
/**
|
|
29
|
-
* 播放动画
|
|
30
|
-
*
|
|
31
|
-
* @param this
|
|
32
|
-
*/
|
|
33
|
-
run(): void {
|
|
34
|
-
this.timer = window.setInterval(() => {
|
|
35
|
-
let active: number = this.active;
|
|
36
|
-
this.clear();
|
|
37
|
-
active += 1;
|
|
38
|
-
this.active = active % this.list.length;
|
|
39
|
-
this.animate(100);
|
|
40
|
-
}, this.delay);
|
|
41
|
-
},
|
|
42
|
-
|
|
43
|
-
/**
|
|
44
|
-
* 下一帧
|
|
45
|
-
*
|
|
46
|
-
* @param this
|
|
47
|
-
*/
|
|
48
|
-
per(): void {
|
|
49
|
-
let active: number = this.active;
|
|
50
|
-
this.clear();
|
|
51
|
-
active -= 1;
|
|
52
|
-
active = active % this.list.length;
|
|
53
|
-
|
|
54
|
-
if (active < 0) active = this.list.length - 1;
|
|
55
|
-
|
|
56
|
-
this.active = active;
|
|
57
|
-
this.animate(100);
|
|
58
|
-
},
|
|
59
|
-
|
|
60
|
-
/**
|
|
61
|
-
* 内容淡出
|
|
62
|
-
*/
|
|
63
|
-
clear(): void {
|
|
64
|
-
this.animate(0);
|
|
65
|
-
},
|
|
66
|
-
|
|
67
|
-
/**
|
|
68
|
-
*
|
|
69
|
-
* @param params
|
|
70
|
-
*/
|
|
71
|
-
animate(params: number): void {
|
|
72
|
-
var el: HTMLLIElement = this.list[this.active],
|
|
73
|
-
fps: number = 1000 / this.fps;
|
|
74
|
-
// @ts-ignore
|
|
75
|
-
window.clearTimeout(el.timer);
|
|
76
|
-
|
|
77
|
-
window.setTimeout(function loop() {
|
|
78
|
-
var i: number = getOpacity(el);
|
|
79
|
-
let speed: number = (params - i) / 8;
|
|
80
|
-
speed = speed > 0 ? Math.ceil(speed) : Math.floor(speed);
|
|
81
|
-
// console.log("i=" + i + "; speed="+ speed+"; s="+s+"; k="+k);
|
|
82
|
-
i += speed;
|
|
83
|
-
el.style.opacity = String(i / 100);
|
|
84
|
-
// @ts-ignore
|
|
85
|
-
window.clearTimeout(el.timer);
|
|
86
|
-
// params.complete && params.complete.call(elem);
|
|
87
|
-
// @ts-ignore
|
|
88
|
-
el.timer = window.setTimeout(loop, fps);
|
|
89
|
-
}, fps);
|
|
90
|
-
},
|
|
91
|
-
},
|
|
92
|
-
};
|
|
93
|
-
|
|
94
|
-
/**
|
|
95
|
-
* 获取元素的透明度
|
|
96
|
-
*
|
|
97
|
-
* @param el
|
|
98
|
-
*/
|
|
99
|
-
function getOpacity(el: Element): number {
|
|
100
|
-
let v = Number(getComputedStyle(el)["opacity"]);
|
|
101
|
-
v *= 100;
|
|
102
|
-
|
|
103
|
-
return parseFloat(v + "") || 0;
|
|
104
|
-
}
|
|
105
|
-
</script>
|
|
106
|
-
|
|
107
|
-
<style lang="less" scoped>
|
|
108
|
-
.aj-opacity-banner {
|
|
109
|
-
position: relative;
|
|
110
|
-
min-height: 90px;
|
|
111
|
-
li {
|
|
112
|
-
position: absolute;
|
|
113
|
-
top: 0;
|
|
114
|
-
left: 0;
|
|
115
|
-
opacity: 0;
|
|
116
|
-
width: 100%;
|
|
117
|
-
}
|
|
118
|
-
|
|
119
|
-
img {
|
|
120
|
-
// border-top:solid 20px #00416d;
|
|
121
|
-
width: 100%;
|
|
122
|
-
}
|
|
123
|
-
}
|
|
124
|
-
</style>
|
|
@@ -1,133 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="aj-process-line">
|
|
3
|
-
<div class="process-line">
|
|
4
|
-
<div v-for="(item, index) in items" :key="index" :class="{current: index == current, done: index < current}">
|
|
5
|
-
<span>{{index + 1}}</span>
|
|
6
|
-
<p>{{item}}</p>
|
|
7
|
-
</div>
|
|
8
|
-
</div>
|
|
9
|
-
</div>
|
|
10
|
-
</template>
|
|
11
|
-
|
|
12
|
-
<script lang="ts">
|
|
13
|
-
/**
|
|
14
|
-
* 进度条
|
|
15
|
-
*/
|
|
16
|
-
export default {
|
|
17
|
-
props: {
|
|
18
|
-
items: {
|
|
19
|
-
type: Array,
|
|
20
|
-
default(): string[] {
|
|
21
|
-
return ["Step 1", "Step 2", "Step 3"];
|
|
22
|
-
},
|
|
23
|
-
},
|
|
24
|
-
},
|
|
25
|
-
data():any {
|
|
26
|
-
return {
|
|
27
|
-
current: 0,
|
|
28
|
-
};
|
|
29
|
-
},
|
|
30
|
-
methods: {
|
|
31
|
-
/**
|
|
32
|
-
*
|
|
33
|
-
* @param i
|
|
34
|
-
*/
|
|
35
|
-
go(i: number): void {
|
|
36
|
-
this.current = i;
|
|
37
|
-
},
|
|
38
|
-
|
|
39
|
-
/**
|
|
40
|
-
*
|
|
41
|
-
*/
|
|
42
|
-
perv(): void {
|
|
43
|
-
let perv: number = this.current - 1;
|
|
44
|
-
if (perv < 0) perv = this.items.length - 1;
|
|
45
|
-
|
|
46
|
-
this.go(perv);
|
|
47
|
-
},
|
|
48
|
-
|
|
49
|
-
/**
|
|
50
|
-
*
|
|
51
|
-
*/
|
|
52
|
-
next(): void {
|
|
53
|
-
let next: number = this.current + 1;
|
|
54
|
-
if (this.items.length == next) next = 0; // 循环
|
|
55
|
-
|
|
56
|
-
this.go(next);
|
|
57
|
-
},
|
|
58
|
-
},
|
|
59
|
-
};
|
|
60
|
-
</script>
|
|
61
|
-
|
|
62
|
-
<style lang="less" scoped>
|
|
63
|
-
.aj-process-line {
|
|
64
|
-
display: flex;
|
|
65
|
-
padding: 5%;
|
|
66
|
-
justify-content: center;
|
|
67
|
-
|
|
68
|
-
.process-line {
|
|
69
|
-
font-size: 18px;
|
|
70
|
-
color: lightgray;
|
|
71
|
-
font-weight: bold;
|
|
72
|
-
|
|
73
|
-
& > div {
|
|
74
|
-
float: left;
|
|
75
|
-
width: 156px;
|
|
76
|
-
text-align: center;
|
|
77
|
-
position: relative;
|
|
78
|
-
|
|
79
|
-
&.current {
|
|
80
|
-
color: black;
|
|
81
|
-
|
|
82
|
-
span {
|
|
83
|
-
background-color: gray;
|
|
84
|
-
}
|
|
85
|
-
}
|
|
86
|
-
|
|
87
|
-
&.done {
|
|
88
|
-
// color: lighten(@mainColor, 80%);
|
|
89
|
-
span {
|
|
90
|
-
// background-color: lighten(@mainColor, 50%);
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
&::after {
|
|
94
|
-
// background-color: lighten(@mainColor, 50%);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
|
|
98
|
-
p {
|
|
99
|
-
font-size: 1rem;
|
|
100
|
-
letter-spacing: 3px;
|
|
101
|
-
padding-top: 5%;
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
span {
|
|
105
|
-
display: inline-block;
|
|
106
|
-
width: 32px;
|
|
107
|
-
height: 32px;
|
|
108
|
-
border-radius: 50%;
|
|
109
|
-
color: #fff;
|
|
110
|
-
line-height: 32px;
|
|
111
|
-
font-size: 16px;
|
|
112
|
-
background-color: lightgray;
|
|
113
|
-
position: relative;
|
|
114
|
-
z-index: 1;
|
|
115
|
-
}
|
|
116
|
-
|
|
117
|
-
&:last-child::after {
|
|
118
|
-
display: none;
|
|
119
|
-
}
|
|
120
|
-
|
|
121
|
-
&::after {
|
|
122
|
-
content: "";
|
|
123
|
-
position: absolute;
|
|
124
|
-
top: 14px;
|
|
125
|
-
left: 94px;
|
|
126
|
-
width: 124px;
|
|
127
|
-
height: 4px;
|
|
128
|
-
background-color: lightgray;
|
|
129
|
-
}
|
|
130
|
-
}
|
|
131
|
-
}
|
|
132
|
-
}
|
|
133
|
-
</style>
|
package/src/index.ts
DELETED
package/src/main.ts
DELETED
|
@@ -1,12 +0,0 @@
|
|
|
1
|
-
import Vue from 'vue'
|
|
2
|
-
import App from './App.vue'
|
|
3
|
-
import router from './router'
|
|
4
|
-
import '@/style/reset.less';
|
|
5
|
-
import '@/style/common-functions.less';
|
|
6
|
-
|
|
7
|
-
Vue.config.productionTip = false
|
|
8
|
-
|
|
9
|
-
new Vue({
|
|
10
|
-
router,
|
|
11
|
-
render: h => h(App)
|
|
12
|
-
}).$mount('#app')
|
package/src/pages/Nav.vue
DELETED
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div style="position: fixed; left: 10px; top:50px">
|
|
3
|
-
<ul>
|
|
4
|
-
<li>
|
|
5
|
-
<a href="#/demo/widget">Widget</a>
|
|
6
|
-
</li>
|
|
7
|
-
<li>
|
|
8
|
-
<a href="#/demo/Article">Article</a>
|
|
9
|
-
</li>
|
|
10
|
-
<li>
|
|
11
|
-
<a href="#/demo/form">Form</a>
|
|
12
|
-
</li>
|
|
13
|
-
</ul>
|
|
14
|
-
</div>
|
|
15
|
-
</template>
|
|
16
|
-
|
|
17
|
-
<style lang="less" scoped>
|
|
18
|
-
li {
|
|
19
|
-
list-style-type: disc;
|
|
20
|
-
text-align: left;
|
|
21
|
-
margin: 10px 0 0 20px;
|
|
22
|
-
}
|
|
23
|
-
</style>
|
package/src/pages/common.less
DELETED
|
@@ -1,30 +0,0 @@
|
|
|
1
|
-
<template>
|
|
2
|
-
<div class="home">
|
|
3
|
-
<Article title="新股上市首日破发并非坏事 警示投资者打新风险" author="张三" source="http://qq.com" style="max-width:700px;margin:0 auto">
|
|
4
|
-
|
|
5
|
-
<p class="one-p">10月22日是科创板新股<span class="linkNormal">中自科技</span>新股上市的日子。按照惯例,新股上市大都会给打新中签的投资者带来一笔无风险的“打新收益”。但对于中自科技的中签者来说,他们期待中的“打新收益”落空了,迎接他们的是新股上市首日破发的命运。打新中签者不仅没有得到“打新收益”,相反还要承担一定的“打新损失”,中自科技上市首日的收盘价较发行价下跌了6.87%。</p>
|
|
6
|
-
<p class="one-p">新股上市首日破发,这对于打新中签者来说是非常揪心的一件事情。尤其是中自科技开盘即破发,没有给中签者丝毫的逃命机会。当天的最高价是70.50元,低于70.90元的发行价,这意味着打新中签者悉数被套,全部都要为自己“中签”的好运而付出代价。</p>
|
|
7
|
-
<p class="one-p">那么,中自科技为何会出现上市首日破发现象呢?究其原因主要有两点。一是发行价偏高,高达每股70.90元,其动态市盈率达到百倍。二是今年该公司业绩大幅滑坡。该公司预计,2021年1~9月营业收入为8.6亿元~9.5亿元,同比下滑57.48%至53.03%;预计归母净利润为4500万元~5400万元,同比下滑75.33%至70.40%;预计扣非后归母净利润为3000万元~3900万元,同比下滑84.63%至80.02%。也正因如此,中自科技上市首日破发并不令人意外,这也进一步证实投资者打新之盲目了。</p>
|
|
8
|
-
<p class="one-p"><img class="content-picture" src="//inews.gtimg.com/newsapp_bt/0/14110170817/1000">
|
|
9
|
-
</p>
|
|
10
|
-
<p class="one-p">当然,新股上市首日破发在A股市场还是比较少见的。中自科技是今年以来科创板第一家上市首日破发新股,也是科创板成立以来第二只上市首日破发新股。科创板第一只上市首日破发新股是<span class="linkNormal">建龙微纳</span>,其上市之日是2019年12月4日,距今已有一年零10个月,这也足见新股上市首日破发的现象在A股市场并不常见。</p>
|
|
11
|
-
<p class="one-p">实际上,对于A股市场来说,新股上市首日破发是一件好事。虽然对于A股市场来说,新股破发现象并不少见,但这种新股破发大多都是新股上市之后经过了一轮甚至是几番的市场炒作之后,然后股价回落破发。这样的新股破发除了提醒投资者注意市场炒作的风险之外,其意义并不大。相反,新股上市首日破发意义更加重大。</p>
|
|
12
|
-
<p class="one-p">首先,新股上市首日破发它有利于提醒询价机构理性询价,而不能为了得到新股份额一味报高价。因为参与新股询价的机构投资者在询价有效的情况下,也是要参与新股配售的。如果新股定价太高,上市就破发了,这对于询价机构来说当然也是不利的。因为他们参与的新股配售份额也会因为破发而出现浮亏。</p>
|
|
13
|
-
<p class="one-p">其次,新股上市首日破发也有利于向投资者提醒打新的风险。因为A股市场长期以来的新股不败现象,结果导致投资者在打新时逢新必打,根本就不关心新股的基本面,同时也不关心新股的发行价格,甚至将高价发行的新股视为“肉签”股。虽然在过去也经常出现新股破发现象,但新股经过一番炒作之后的破发,并没有危及到打新者的利益,并不会让打新者增加风险意识。而只有新股上市首日破发,才会直接损害到打新者的利益,只有在这种情况下,打新者才会真正意识到打新的风险,从而让打新者关心到新股的基本面,学会理性打新。当然,要达到这个目的,还需要新股上市首日破发现象进一步增加,呈现出一种常态化,这样更有利于投资者理性打新。</p>
|
|
14
|
-
<p class="one-p">此外,新股上市首日破发也有利于向市场警示炒新的风险。在新股不败的市场环境下,投资者除了盲目打新之外,还会盲目炒新,以至一只新股上市后,通常都会炒出几个、十几个甚至几十个涨停板出来。因此,一只新股上市,往往都会受到市场的投机炒作。而新股上市首日破发,对于炒新者是一个打击。因为炒新者盲目追进新股之后发现,股价不仅没有炒上去,相反股价在进一步下跌,炒新变成了套牢。因此,新股上市首日破发对于炒新者来说也是一种风险警示。</p>
|
|
15
|
-
|
|
16
|
-
</Article>
|
|
17
|
-
<Nav />
|
|
18
|
-
</div>
|
|
19
|
-
</template>
|
|
20
|
-
|
|
21
|
-
<script>
|
|
22
|
-
import Article from "@/components/widgets/Article.vue";
|
|
23
|
-
import Nav from "../Nav.vue";
|
|
24
|
-
|
|
25
|
-
export default {
|
|
26
|
-
components: {
|
|
27
|
-
Article, Nav
|
|
28
|
-
},
|
|
29
|
-
};
|
|
30
|
-
</script>
|