@ajaxjs/ui 1.1.9 → 1.2.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/package.json +3 -3
- package/src/App.vue +14 -0
- package/src/index.ts +50 -0
- package/src/main.ts +12 -0
- package/src/pages/calendar.vue +33 -0
- package/src/pages/form.vue +68 -0
- package/src/pages/html-editor.vue +44 -0
- package/src/pages/index.vue +150 -0
- package/src/pages/play-ground.vue +14 -0
- package/src/pages/widgets.vue +183 -0
- package/src/router/index.ts +19 -0
- package/src/shims-vue.d.ts +4 -0
- package/src/style/common-functions.less +294 -0
- package/src/style/reset.less +19 -0
- package/src/util/cookies.ts +43 -0
- package/src/util/dom.ts +47 -0
- package/src/util/utils.ts +184 -0
- package/src/util/xhr-config.ts +25 -0
- package/src/util/xhr.ts +296 -0
- package/src/widget/AccordionMenu.vue +140 -0
- package/src/widget/AdjustFontSize.vue +65 -0
- package/src/widget/Article.vue +59 -0
- package/src/widget/EmptyContent.js +4 -0
- package/src/widget/Expander.vue +65 -0
- package/src/widget/FileUploader/FileUploader.less +68 -0
- package/src/widget/FileUploader/FileUploader.ts +156 -0
- package/src/widget/FileUploader/FileUploader.vue +43 -0
- package/src/widget/HtmlEditor/HtmlEditor.less +345 -0
- package/src/widget/HtmlEditor/HtmlEditor.ts +339 -0
- package/src/widget/HtmlEditor/HtmlEditor.vue +70 -0
- package/src/widget/HtmlEditor/html-editor-HtmlSanitizer.js +103 -0
- package/src/widget/ImageEnlarger.vue +105 -0
- package/src/widget/OpacityBanner.vue +125 -0
- package/src/widget/ProcessLine.vue +133 -0
- package/src/widget/Resize.ts +152 -0
- package/src/widget/Resize.vue +104 -0
- package/src/widget/TreeSelector.vue +4 -0
- package/src/widget/calendar/BetweenDate.vue +63 -0
- package/src/widget/calendar/Calendar.less +210 -0
- package/src/widget/calendar/Calendar.ts +167 -0
- package/src/widget/calendar/Calendar.vue +52 -0
- package/src/widget/calendar/CalendarInput.vue +71 -0
- package/src/widget/form/validator.ts +289 -0
- package/src/widget/play-ground/sku.vue +93 -0
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@ajaxjs/ui",
|
|
3
|
-
"version": "1.
|
|
4
|
-
"description": "
|
|
3
|
+
"version": "1.2.0",
|
|
4
|
+
"description": "Real ajaxjs ui library",
|
|
5
5
|
"main": "dist/index.js",
|
|
6
6
|
"types": "dist/libs/common.d.ts",
|
|
7
7
|
"homepage": "https://framework.ajaxjs.com/",
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
"author": "sp42 <sp42@qq.com>",
|
|
24
24
|
"license": "Apache License 2.0",
|
|
25
25
|
"files": [
|
|
26
|
-
"dist/"
|
|
26
|
+
"dist/", "src"
|
|
27
27
|
],
|
|
28
28
|
"devDependencies": {
|
|
29
29
|
"@vue/cli-plugin-babel": "~4.5.0",
|
package/src/App.vue
ADDED
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<router-view />
|
|
3
|
+
|
|
4
|
+
</template>
|
|
5
|
+
|
|
6
|
+
<script>
|
|
7
|
+
export default {
|
|
8
|
+
created() {
|
|
9
|
+
// window.config = { dsApiRoot: 'http://127.0.0.1:8080/entity' };
|
|
10
|
+
window.config = { dsApiRoot: '/entity' };
|
|
11
|
+
document.title = "Demo Page";
|
|
12
|
+
}
|
|
13
|
+
}
|
|
14
|
+
</script>
|
package/src/index.ts
ADDED
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import * as util from './util/utils';
|
|
2
|
+
import { setBaseHeadParams } from './util/xhr';
|
|
3
|
+
import { xhr_get, xhr_post, xhr_put, xhr_del } from './util/xhr';
|
|
4
|
+
|
|
5
|
+
import OpacityBanner from "@/widget/OpacityBanner.vue";
|
|
6
|
+
import ProcessLine from "@/widget/ProcessLine.vue";
|
|
7
|
+
import AccordionMenu from "@/widget/AccordionMenu.vue";
|
|
8
|
+
import Expander from "@/widget/Expander.vue";
|
|
9
|
+
import HtmlEditor from "@/widget/HtmlEditor/HtmlEditor.vue";
|
|
10
|
+
import FileUploader from "@/widget/FileUploader/FileUploader.vue";
|
|
11
|
+
import Calendar from "@/widget/calendar/Calendar.vue";
|
|
12
|
+
import Article from '@/widget/Article.vue';
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* API 统一前缀
|
|
16
|
+
*/
|
|
17
|
+
let API_BASE_URL: string;
|
|
18
|
+
|
|
19
|
+
/**
|
|
20
|
+
* 暴露各个组件
|
|
21
|
+
*/
|
|
22
|
+
export default {
|
|
23
|
+
/**
|
|
24
|
+
* 设置 API 统一前缀
|
|
25
|
+
*
|
|
26
|
+
* @param perfix API 统一前缀
|
|
27
|
+
*/
|
|
28
|
+
setApiBaseUrl(perfix: string): void {
|
|
29
|
+
API_BASE_URL = perfix;
|
|
30
|
+
},
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 获取 API 统一前缀
|
|
34
|
+
*
|
|
35
|
+
* @returns API 统一前缀
|
|
36
|
+
*/
|
|
37
|
+
getApiBaseUrl(): string {
|
|
38
|
+
return API_BASE_URL;
|
|
39
|
+
},
|
|
40
|
+
|
|
41
|
+
setBaseHeadParams,
|
|
42
|
+
|
|
43
|
+
util: util,
|
|
44
|
+
|
|
45
|
+
xhr: {
|
|
46
|
+
xhr_get, xhr_post, xhr_put, xhr_del
|
|
47
|
+
},
|
|
48
|
+
|
|
49
|
+
OpacityBanner, ProcessLine, AccordionMenu, Expander, Article, HtmlEditor, FileUploader, Calendar
|
|
50
|
+
};
|
package/src/main.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
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');
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="home">
|
|
3
|
+
<h2>日历控件</h2>
|
|
4
|
+
|
|
5
|
+
<p>
|
|
6
|
+
开门见山,先说明一下这日历组件的核心算法不是笔者原创的,而是来自于早期<a href="https://www.cnblogs.com/cloudgamer/articles/1274459.html" target="_blank">大神
|
|
7
|
+
cloudgamer 的作品</a>,在这里向前辈致敬! 组件本身的原理不算复杂难懂,也就寥寥
|
|
8
|
+
140 行代码(原 JavaScript),足以展现日历渲染的原理。
|
|
9
|
+
</p>
|
|
10
|
+
<p>
|
|
11
|
+
<a
|
|
12
|
+
href="https://blog.csdn.net/zhangxin09/article/details/89681010"
|
|
13
|
+
target="_blank"
|
|
14
|
+
>查看教程</a
|
|
15
|
+
>
|
|
16
|
+
</p>
|
|
17
|
+
<p>
|
|
18
|
+
<Calendar style="margin:20px auto;" @pickdate="showDate" />
|
|
19
|
+
</p>
|
|
20
|
+
</div>
|
|
21
|
+
</template>
|
|
22
|
+
<script>
|
|
23
|
+
import Calendar from "@/widget/calendar/Calendar.vue";
|
|
24
|
+
|
|
25
|
+
export default {
|
|
26
|
+
components: { Calendar },
|
|
27
|
+
methods:{
|
|
28
|
+
showDate(date) {
|
|
29
|
+
alert(date);
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
</script>
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="home">
|
|
3
|
+
<h2>表单</h2>
|
|
4
|
+
<p>表单的问题主要是表单布局和表单验证两个。</p>
|
|
5
|
+
<form class="aj-form">
|
|
6
|
+
<table class="aj-form-table">
|
|
7
|
+
<tr>
|
|
8
|
+
<td>昵称</td>
|
|
9
|
+
<td><input type="text" name="name" value="Jack" /></td>
|
|
10
|
+
<td>真实姓名</td>
|
|
11
|
+
<td><input type="text" name="realname" value="" /></td>
|
|
12
|
+
</tr>
|
|
13
|
+
<tr>
|
|
14
|
+
<td>性别</td>
|
|
15
|
+
<td>
|
|
16
|
+
<label><input type="radio" name="gender" value="1" /> 男</label>
|
|
17
|
+
<label><input type="radio" name="gender" value="2" /> 女</label>
|
|
18
|
+
<label><input type="radio" name="gender" value="0" /> 未知</label>
|
|
19
|
+
</td>
|
|
20
|
+
<td>生日</td>
|
|
21
|
+
<td><input type="text" name="phone" value="" /></td>
|
|
22
|
+
</tr>
|
|
23
|
+
<tr>
|
|
24
|
+
<td>电话</td>
|
|
25
|
+
<td><input type="text" name="phone" value="" /></td>
|
|
26
|
+
<td>Email</td>
|
|
27
|
+
<td><input type="text" name="email" value="" /></td>
|
|
28
|
+
</tr>
|
|
29
|
+
<tr>
|
|
30
|
+
<td>地区</td>
|
|
31
|
+
<td colspan="3">
|
|
32
|
+
<input type="text" name="location" value="" />
|
|
33
|
+
</td>
|
|
34
|
+
</tr>
|
|
35
|
+
<tr>
|
|
36
|
+
<td>租户</td>
|
|
37
|
+
<td>
|
|
38
|
+
<select style="width: 180px; margin: 10px 0">
|
|
39
|
+
<option value="${item.id}">${item.name}</option>
|
|
40
|
+
</select>
|
|
41
|
+
</td>
|
|
42
|
+
<td>组织</td>
|
|
43
|
+
<td></td>
|
|
44
|
+
</tr>
|
|
45
|
+
</table>
|
|
46
|
+
<div class="aj-btnsHolder">
|
|
47
|
+
<button>提交</button> <button>复位</button>
|
|
48
|
+
</div>
|
|
49
|
+
</form>
|
|
50
|
+
<h2>文件上传</h2>
|
|
51
|
+
<FileUploader action="ddfdsf" style="margin: 0 auto" />
|
|
52
|
+
</div>
|
|
53
|
+
</template>
|
|
54
|
+
<script>
|
|
55
|
+
import FileUploader from "@/widget/FileUploader/FileUploader.vue";
|
|
56
|
+
import Calendar from "@/widget/calendar/Calendar.vue";
|
|
57
|
+
|
|
58
|
+
export default {
|
|
59
|
+
components: { FileUploader, Calendar },
|
|
60
|
+
};
|
|
61
|
+
</script>
|
|
62
|
+
|
|
63
|
+
<style lang="less" scoped>
|
|
64
|
+
form {
|
|
65
|
+
width: 600px;
|
|
66
|
+
margin: 0 auto;
|
|
67
|
+
}
|
|
68
|
+
</style>
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="home">
|
|
3
|
+
<h2>HTML 编辑器</h2>
|
|
4
|
+
<p>HTML 编辑器,又叫富文本编辑器(Rich Text Editor),目的就是让用户可以在浏览器上编辑各种格式的文本,类似于 Word “即见即所得”那种可视化的特性,HTML 编辑器能直观地编辑文本并同时产生预期的效果。
|
|
5
|
+
不同的是 Word 最终成品是 *.doc 文件,而 HTML 编辑器的保存格式是 HTML。实际上,称为“富文本编辑器”或者更合适一些,盖因这类编辑器,最终的格式不一定是 HTML,可以被设计保存为 md(Markdown)或其他的格式。</p>
|
|
6
|
+
<p>
|
|
7
|
+
<a href="https://zhangxin.blog.csdn.net/article/details/113867893" target="_blank">查看教程</a>
|
|
8
|
+
</p>
|
|
9
|
+
<p>需要引入图标库;HTML 外层要有隐藏的 textarea 元素包裹着。</p>
|
|
10
|
+
|
|
11
|
+
<textarea style="display:none;">
|
|
12
|
+
<h2>什么是Lorem Ipsum?</h2>
|
|
13
|
+
<p>Lorem Ipsum,也称乱数假文或者哑元文本, 是印刷及排版领域所常用的虚拟文字。由于曾经一台匿名的打印机刻意打乱了一盒印刷字体从而造出一本字体样品书,Lorem Ipsum从西元15世纪起就被作为此领域的标准文本使用。它不仅延续了五个世纪,还通过了电子排版的挑战,其雏形却依然保存至今。在1960年代,”Leatraset”公司发布了印刷着Lorem Ipsum段落的纸张,从而广泛普及了它的使用。最近,计算机桌面出版软件”Aldus PageMaker”也通过同样的方式使Lorem Ipsum落入大众的视野。</p>
|
|
14
|
+
|
|
15
|
+
<h2>我们为何用它?</h2>
|
|
16
|
+
<p>无可否认,当读者在浏览一个页面的排版时,难免会被可阅读的内容所分散注意力。Lorem Ipsum的目的就是为了保持字母多多少少标准及平均的分配,而不是“此处有文本,此处有文本”,从而让内容更像可读的英语。如今,很多桌面排版软件以及网页编辑用Lorem Ipsum作为默认的示范文本,搜一搜“Lorem Ipsum”就能找到这些网站的雏形。这些年来Lorem Ipsum演变出了各式各样的版本,有些出于偶然,有些则是故意的(刻意的幽默之类的)。</p>
|
|
17
|
+
</textarea>
|
|
18
|
+
|
|
19
|
+
<HtmlEditor :v-model="v" style="width:800px;margin:0 auto" @on-change="v=$event" :is-ionicons="false" />
|
|
20
|
+
|
|
21
|
+
<br />
|
|
22
|
+
<br />
|
|
23
|
+
<h2>生成的 HTML 标签</h2>
|
|
24
|
+
<p>
|
|
25
|
+
{{v}}
|
|
26
|
+
</p>
|
|
27
|
+
</div>
|
|
28
|
+
</template>
|
|
29
|
+
|
|
30
|
+
<script>
|
|
31
|
+
import HtmlEditor from "@/widget/HtmlEditor/HtmlEditor.vue";
|
|
32
|
+
|
|
33
|
+
export default {
|
|
34
|
+
components: { HtmlEditor },
|
|
35
|
+
data() {
|
|
36
|
+
return {
|
|
37
|
+
v: "",
|
|
38
|
+
};
|
|
39
|
+
},
|
|
40
|
+
mounted() {
|
|
41
|
+
this.v = this.$el.querySelector("textarea").value;
|
|
42
|
+
},
|
|
43
|
+
};
|
|
44
|
+
</script>
|
|
@@ -0,0 +1,150 @@
|
|
|
1
|
+
<template>
|
|
2
|
+
<div class="demo">
|
|
3
|
+
<menu>
|
|
4
|
+
<a href="#" @click="show = 'intro'">简介</a> |
|
|
5
|
+
<!-- <a href="#" @click="show = 'baseFn'">基础函数</a> | -->
|
|
6
|
+
<a href="#" @click="show = 'widget'">页面 widget</a> |
|
|
7
|
+
<a href="#" @click="show = 'form'">表单组件</a> |
|
|
8
|
+
<a href="#" @click="show = 'html-editor'">HTML 编辑器</a> |
|
|
9
|
+
<a href="#" @click="show = 'calendar'">日历选择器</a> |
|
|
10
|
+
<a href="#" @click="show = 'play-ground'">试验场</a>
|
|
11
|
+
</menu>
|
|
12
|
+
<table class="all-center" v-if="show == 'intro'">
|
|
13
|
+
<tr>
|
|
14
|
+
<td>
|
|
15
|
+
<h1>ajaxjs.js 前端组件库</h1>
|
|
16
|
+
<ul>
|
|
17
|
+
<li>
|
|
18
|
+
这是一个个人练手项目,组件不是很全,只有顶部导航列出那些。要求大而全的请参考
|
|
19
|
+
element/ant/iview
|
|
20
|
+
</li>
|
|
21
|
+
<li>
|
|
22
|
+
轻量级,原先打算做一个纯原生的 UI 库,啥都不依赖,后面入坑 vue 才只依赖 vue 2
|
|
23
|
+
</li>
|
|
24
|
+
<li>
|
|
25
|
+
简单易懂的代码,不折腾。当然了,是 typescript。不过我没有用 class 风格,只是加入参数类型、返回值类型,这就足够了
|
|
26
|
+
</li>
|
|
27
|
+
<li>CSS 基于 less.js</li>
|
|
28
|
+
</ul>
|
|
29
|
+
<p class="p">安装 npm i @ajaxjs/ui</p>
|
|
30
|
+
|
|
31
|
+
<p>
|
|
32
|
+
<a href="https://www.npmjs.com/package/@ajaxjs/ui">npm</a>
|
|
33
|
+
|
|
|
34
|
+
<a href="https://gitee.com/sp42_admin/ajaxjs/tree/master/aj-ui-widget/aj"
|
|
35
|
+
>源码</a>
|
|
36
|
+
|
|
|
37
|
+
<a
|
|
38
|
+
target="_blank"
|
|
39
|
+
href="//shang.qq.com/wpa/qunwpa?idkey=3877893a4ed3a5f0be01e809e7ac120e346102bd550deb6692239bb42de38e22"
|
|
40
|
+
>QQ 群:3150067</a>
|
|
41
|
+
|
|
|
42
|
+
<a href="mailto:frank@ajaxjs.com">Email</a> |
|
|
43
|
+
<a target="_blank" href="http://blog.csdn.net/zhangxin09">作者博客</a>
|
|
44
|
+
<center>©1999-2022 Frank Cheung</center>
|
|
45
|
+
</p>
|
|
46
|
+
</td>
|
|
47
|
+
</tr>
|
|
48
|
+
</table>
|
|
49
|
+
|
|
50
|
+
<DemoWidget v-if="show == 'widget'" />
|
|
51
|
+
<Form v-if="show == 'form'" />
|
|
52
|
+
<HtmlEditor v-if="show == 'html-editor'" />
|
|
53
|
+
<Calendar v-if="show == 'calendar'" />
|
|
54
|
+
<PlayGround v-if="show == 'play-ground'" />
|
|
55
|
+
</div>
|
|
56
|
+
</template>
|
|
57
|
+
|
|
58
|
+
<script>
|
|
59
|
+
import DemoWidget from "./widgets.vue";
|
|
60
|
+
import Form from "./form.vue";
|
|
61
|
+
import HtmlEditor from "./html-editor.vue";
|
|
62
|
+
import Calendar from "./calendar.vue";
|
|
63
|
+
import PlayGround from "./play-ground.vue";
|
|
64
|
+
|
|
65
|
+
export default {
|
|
66
|
+
components: { DemoWidget, Form, HtmlEditor, Calendar, PlayGround },
|
|
67
|
+
data() {
|
|
68
|
+
return {
|
|
69
|
+
show: "intro",
|
|
70
|
+
};
|
|
71
|
+
},
|
|
72
|
+
};
|
|
73
|
+
</script>
|
|
74
|
+
|
|
75
|
+
<style lang="less">
|
|
76
|
+
@import "https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.2.0/css/all.min.css";
|
|
77
|
+
|
|
78
|
+
a {
|
|
79
|
+
color: gray;
|
|
80
|
+
}
|
|
81
|
+
a:hover {
|
|
82
|
+
color: black;
|
|
83
|
+
}
|
|
84
|
+
.demo {
|
|
85
|
+
font-size: 11pt;
|
|
86
|
+
menu {
|
|
87
|
+
margin: 0;
|
|
88
|
+
padding: 0;
|
|
89
|
+
line-height: 40px;
|
|
90
|
+
height: 40px;
|
|
91
|
+
// width: 300px;
|
|
92
|
+
text-align: center;
|
|
93
|
+
border-bottom: 1px solid lightgray;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
|
|
97
|
+
table.all-center {
|
|
98
|
+
width: 100%;
|
|
99
|
+
font-size: 11pt;
|
|
100
|
+
td {
|
|
101
|
+
vertical-align: middle;
|
|
102
|
+
text-align: center;
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
h1 {
|
|
107
|
+
margin: 20px;
|
|
108
|
+
}
|
|
109
|
+
|
|
110
|
+
.home {
|
|
111
|
+
& > h2 {
|
|
112
|
+
margin: 30px auto;
|
|
113
|
+
}
|
|
114
|
+
& > h2,
|
|
115
|
+
& > p {
|
|
116
|
+
margin: 20px auto;
|
|
117
|
+
width: 600px;
|
|
118
|
+
text-align: justify;
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
</style>
|
|
122
|
+
|
|
123
|
+
<style lang="less" scoped>
|
|
124
|
+
h1 {
|
|
125
|
+
margin: 30px;
|
|
126
|
+
}
|
|
127
|
+
|
|
128
|
+
ul {
|
|
129
|
+
max-width: 500px;
|
|
130
|
+
margin: 20px auto;
|
|
131
|
+
color: gray;
|
|
132
|
+
li {
|
|
133
|
+
text-align: left;
|
|
134
|
+
list-style-type: initial;
|
|
135
|
+
padding-bottom: 10px;
|
|
136
|
+
}
|
|
137
|
+
}
|
|
138
|
+
|
|
139
|
+
p.p {
|
|
140
|
+
.aj-text-function();
|
|
141
|
+
max-width: 500px;
|
|
142
|
+
margin: 20px auto;
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
center {
|
|
146
|
+
margin: 20px;
|
|
147
|
+
font-size: 9pt;
|
|
148
|
+
color: lightgray;
|
|
149
|
+
}
|
|
150
|
+
</style>
|
|
@@ -0,0 +1,183 @@
|
|
|
1
|
+
|
|
2
|
+
<template>
|
|
3
|
+
<div class="home">
|
|
4
|
+
<!-- <h2>图片放大器</h2>
|
|
5
|
+
<div style="margin:0 auto;width:600px;text-align: center;">
|
|
6
|
+
<ImageEnlarger img-url="https://thebulletin.org/wp-content/uploads/2021/11/rosner-photo-1-150x150.jpg.webp" />
|
|
7
|
+
|
|
8
|
+
<ImageEnlarger img-url="https://thebulletin.org/wp-content/uploads/2021/11/1280px-Construction_at_Vogtle_Nuclear_Plant-150x150.jpeg.webp" />
|
|
9
|
+
</div> -->
|
|
10
|
+
|
|
11
|
+
<h2>展开闭合器 expander</h2>
|
|
12
|
+
<p>常用于展开正文详情。提供过渡效果的图层,如果不需要把 div class="mask" 去掉即可。注意加入容器的 padding 会导致关闭时高度异常。</p>
|
|
13
|
+
<table class="aj-table" align="center">
|
|
14
|
+
<thead>
|
|
15
|
+
<tr>
|
|
16
|
+
<th>属性</th>
|
|
17
|
+
<th>含义</th>
|
|
18
|
+
<th>类型</th>
|
|
19
|
+
<th>是否必填,默认值</th>
|
|
20
|
+
</tr>
|
|
21
|
+
</thead>
|
|
22
|
+
<tbody>
|
|
23
|
+
<tr>
|
|
24
|
+
<td>openHeight</td>
|
|
25
|
+
<td>展开状态的高度</td>
|
|
26
|
+
<td>Number</td>
|
|
27
|
+
<td>n, 200</td>
|
|
28
|
+
</tr>
|
|
29
|
+
<tr>
|
|
30
|
+
<td>closeHeight</td>
|
|
31
|
+
<td>闭合状态的高度</td>
|
|
32
|
+
<td>Number</td>
|
|
33
|
+
<td>n, 50</td>
|
|
34
|
+
</tr>
|
|
35
|
+
<tr>
|
|
36
|
+
<td><code><slot</code>></td>
|
|
37
|
+
<td>正文内容扩展</td>
|
|
38
|
+
<td>String</td>
|
|
39
|
+
<td>n</td>
|
|
40
|
+
</tr>
|
|
41
|
+
</tbody>
|
|
42
|
+
</table>
|
|
43
|
+
|
|
44
|
+
<Expander :close-height="50" style="width: 300px;margin:5% auto;">
|
|
45
|
+
Lorem Ipsum,也称乱数假文或者哑元文本, 是印刷及排版领域所常用的虚拟文字。
|
|
46
|
+
由于曾经一台匿名的打印机刻意打乱了一盒印刷字体从而造出一本字体样品书, Lorem Ipsum从西元15世纪起就被作为此领域的标准文本使用。
|
|
47
|
+
<div class="mask-layer"></div>
|
|
48
|
+
</Expander>
|
|
49
|
+
|
|
50
|
+
<h2>渐现 Banner</h2>
|
|
51
|
+
<p>原理上讲,就是为每张图片准备好定时器 timer,使其控制图片的透明度。当图片从透明度 0 到 100,就是渐现的过程; 与此同时,另外一张图片由透明度 100 下降到 0。这两个过程是同时发生的,一个渐现一个渐隐,便会造成如此的目标效果。</p>
|
|
52
|
+
<p><a href="https://zhangxin.blog.csdn.net/article/details/112055111" target="_blank">查看教程</a>
|
|
53
|
+
</p>
|
|
54
|
+
|
|
55
|
+
<OpacityBanner style="width:300px;margin:0 auto">
|
|
56
|
+
<li><img src="https://img1.mydrivers.com/img/topimg/20220315/192429144.jpg" /></li>
|
|
57
|
+
<li><img src="https://img1.mydrivers.com/img/topimg/20220315/192403940.jpg" /></li>
|
|
58
|
+
<li><img src="https://img1.mydrivers.com/img/topimg/20220315/192314256.jpg" /></li>
|
|
59
|
+
<li><a target="iframepage" href="../job/job.jsp">招聘管理</a></li>
|
|
60
|
+
</OpacityBanner>
|
|
61
|
+
|
|
62
|
+
<br />
|
|
63
|
+
<br />
|
|
64
|
+
<br />
|
|
65
|
+
<br />
|
|
66
|
+
<br />
|
|
67
|
+
<br />
|
|
68
|
+
<h2>进度条 Process Line</h2>
|
|
69
|
+
<ProcessLine />
|
|
70
|
+
|
|
71
|
+
<h2>折叠菜单 Accordion Menu</h2>
|
|
72
|
+
<p>折叠菜单的特点是同一时间只展开一个区域,其他区域则处于闭合状态。</p>
|
|
73
|
+
|
|
74
|
+
<p>属性说明:</p>
|
|
75
|
+
<table class="aj-table" align="center" width="500">
|
|
76
|
+
<thead>
|
|
77
|
+
<tr>
|
|
78
|
+
<th>属性</th>
|
|
79
|
+
<th>含义</th>
|
|
80
|
+
<th>类型</th>
|
|
81
|
+
<th>是否必填,默认值</th>
|
|
82
|
+
</tr>
|
|
83
|
+
</thead>
|
|
84
|
+
<tbody>
|
|
85
|
+
<tr>
|
|
86
|
+
<td><code><slot></code></td>
|
|
87
|
+
<td>菜单内容</td>
|
|
88
|
+
<td>String</td>
|
|
89
|
+
<td>y</td>
|
|
90
|
+
</tr>
|
|
91
|
+
</tbody>
|
|
92
|
+
</table>
|
|
93
|
+
<br />
|
|
94
|
+
<br />
|
|
95
|
+
<br />
|
|
96
|
+
<AccordionMenu style="width:300px;margin:0 auto">
|
|
97
|
+
<li class="siteMgr">
|
|
98
|
+
<h3>网站管理</h3>
|
|
99
|
+
<ul>
|
|
100
|
+
<li><a target="iframepage" href="website/profile/changePassword.jsp">帐号信息</a></li>
|
|
101
|
+
<li><a target="iframepage" href="website/profile/companyInfo.jsp">公司信息</a></li>
|
|
102
|
+
<li><a target="iframepage" href="website/gallery/companyAlbum.jsp">相 册</a></li>
|
|
103
|
+
<li><a target="iframepage" href="website/pageEditor/index.jsp">页面维护</a></li>
|
|
104
|
+
<li><a target="iframepage" href="website/profile/global.jsp">全局信息</a></li>
|
|
105
|
+
</ul>
|
|
106
|
+
</li>
|
|
107
|
+
|
|
108
|
+
<li class="news">
|
|
109
|
+
<h3>新闻中心管理</h3>
|
|
110
|
+
<ul>
|
|
111
|
+
<li><a target="iframepage" href="entry/list/news">新闻管理</a></li>
|
|
112
|
+
</ul>
|
|
113
|
+
</li>
|
|
114
|
+
<li class="levelPoints">
|
|
115
|
+
<h3>积分系统</h3>
|
|
116
|
+
<ul>
|
|
117
|
+
<li><a target="iframepage" href="levelPoints/memberTree.jsp">会员下线一览</a>
|
|
118
|
+
</li>
|
|
119
|
+
<li><a target="iframepage" href="levelPoints/showUserPoints.jsp">显示会员积分</a></li>
|
|
120
|
+
</ul>
|
|
121
|
+
</li>
|
|
122
|
+
<li>
|
|
123
|
+
<h3>其他信息</h3>
|
|
124
|
+
<ul>
|
|
125
|
+
<li><a target="iframepage" href="../job/job.jsp">留言管理</a></li>
|
|
126
|
+
<li><a target="iframepage" href="../job/job.jsp">招聘管理</a></li>
|
|
127
|
+
</ul>
|
|
128
|
+
</li>
|
|
129
|
+
</AccordionMenu>
|
|
130
|
+
|
|
131
|
+
<br />
|
|
132
|
+
<br />
|
|
133
|
+
|
|
134
|
+
<h2>文章 Article</h2>
|
|
135
|
+
<Article title="新股上市首日破发并非坏事 警示投资者打新风险" author="张三" source="http://qq.com" style="max-width:700px;margin:0 auto">
|
|
136
|
+
|
|
137
|
+
<p class="one-p">10月22日是科创板新股<span class="linkNormal">中自科技</span>新股上市的日子。按照惯例,新股上市大都会给打新中签的投资者带来一笔无风险的“打新收益”。但对于中自科技的中签者来说,他们期待中的“打新收益”落空了,迎接他们的是新股上市首日破发的命运。打新中签者不仅没有得到“打新收益”,相反还要承担一定的“打新损失”,中自科技上市首日的收盘价较发行价下跌了6.87%。</p>
|
|
138
|
+
<p class="one-p">新股上市首日破发,这对于打新中签者来说是非常揪心的一件事情。尤其是中自科技开盘即破发,没有给中签者丝毫的逃命机会。当天的最高价是70.50元,低于70.90元的发行价,这意味着打新中签者悉数被套,全部都要为自己“中签”的好运而付出代价。</p>
|
|
139
|
+
<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>
|
|
140
|
+
<p class="one-p"><img class="content-picture" src="https://img1.mydrivers.com/img/20210706/S91792917-e725-484b-b8c9-b2d0eda32981.png">
|
|
141
|
+
</p>
|
|
142
|
+
<p class="one-p">当然,新股上市首日破发在A股市场还是比较少见的。中自科技是今年以来科创板第一家上市首日破发新股,也是科创板成立以来第二只上市首日破发新股。科创板第一只上市首日破发新股是<span class="linkNormal">建龙微纳</span>,其上市之日是2019年12月4日,距今已有一年零10个月,这也足见新股上市首日破发的现象在A股市场并不常见。</p>
|
|
143
|
+
<p class="one-p">实际上,对于A股市场来说,新股上市首日破发是一件好事。虽然对于A股市场来说,新股破发现象并不少见,但这种新股破发大多都是新股上市之后经过了一轮甚至是几番的市场炒作之后,然后股价回落破发。这样的新股破发除了提醒投资者注意市场炒作的风险之外,其意义并不大。相反,新股上市首日破发意义更加重大。</p>
|
|
144
|
+
<p class="one-p">首先,新股上市首日破发它有利于提醒询价机构理性询价,而不能为了得到新股份额一味报高价。因为参与新股询价的机构投资者在询价有效的情况下,也是要参与新股配售的。如果新股定价太高,上市就破发了,这对于询价机构来说当然也是不利的。因为他们参与的新股配售份额也会因为破发而出现浮亏。</p>
|
|
145
|
+
<p class="one-p">其次,新股上市首日破发也有利于向投资者提醒打新的风险。因为A股市场长期以来的新股不败现象,结果导致投资者在打新时逢新必打,根本就不关心新股的基本面,同时也不关心新股的发行价格,甚至将高价发行的新股视为“肉签”股。虽然在过去也经常出现新股破发现象,但新股经过一番炒作之后的破发,并没有危及到打新者的利益,并不会让打新者增加风险意识。而只有新股上市首日破发,才会直接损害到打新者的利益,只有在这种情况下,打新者才会真正意识到打新的风险,从而让打新者关心到新股的基本面,学会理性打新。当然,要达到这个目的,还需要新股上市首日破发现象进一步增加,呈现出一种常态化,这样更有利于投资者理性打新。</p>
|
|
146
|
+
<p class="one-p">此外,新股上市首日破发也有利于向市场警示炒新的风险。在新股不败的市场环境下,投资者除了盲目打新之外,还会盲目炒新,以至一只新股上市后,通常都会炒出几个、十几个甚至几十个涨停板出来。因此,一只新股上市,往往都会受到市场的投机炒作。而新股上市首日破发,对于炒新者是一个打击。因为炒新者盲目追进新股之后发现,股价不仅没有炒上去,相反股价在进一步下跌,炒新变成了套牢。因此,新股上市首日破发对于炒新者来说也是一种风险警示。</p>
|
|
147
|
+
|
|
148
|
+
</Article>
|
|
149
|
+
</div>
|
|
150
|
+
</template>
|
|
151
|
+
|
|
152
|
+
<script>
|
|
153
|
+
import OpacityBanner from "@/widget/OpacityBanner.vue";
|
|
154
|
+
import ProcessLine from "@/widget/ProcessLine.vue";
|
|
155
|
+
import AccordionMenu from "@/widget/AccordionMenu.vue";
|
|
156
|
+
import Expander from "@/widget/Expander";
|
|
157
|
+
import ImageEnlarger from "@/widget/ImageEnlarger";
|
|
158
|
+
import Article from '@/widget/Article.vue';
|
|
159
|
+
|
|
160
|
+
export default {
|
|
161
|
+
components: {
|
|
162
|
+
OpacityBanner,
|
|
163
|
+
ProcessLine,
|
|
164
|
+
AccordionMenu,
|
|
165
|
+
Expander,
|
|
166
|
+
ImageEnlarger,
|
|
167
|
+
Article
|
|
168
|
+
},
|
|
169
|
+
};
|
|
170
|
+
</script>
|
|
171
|
+
|
|
172
|
+
<style lang="less" scoped >
|
|
173
|
+
p {
|
|
174
|
+
width: 500px;
|
|
175
|
+
// .aj-text-function();
|
|
176
|
+
margin: 20px auto;
|
|
177
|
+
text-indent: 2em;
|
|
178
|
+
}
|
|
179
|
+
h2 {
|
|
180
|
+
// text-align: left;
|
|
181
|
+
margin: 20px auto;
|
|
182
|
+
}
|
|
183
|
+
</style>
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import Vue from 'vue'
|
|
2
|
+
import VueRouter, { RouteConfig } from 'vue-router'
|
|
3
|
+
// import Home from '../views/Home.vue'
|
|
4
|
+
|
|
5
|
+
Vue.use(VueRouter);
|
|
6
|
+
|
|
7
|
+
const routes: Array<RouteConfig> = [
|
|
8
|
+
{
|
|
9
|
+
path: '/',
|
|
10
|
+
name: 'Home',
|
|
11
|
+
component: () => import(/* webpackChunkName: "about" */ '../pages/index.vue')
|
|
12
|
+
}
|
|
13
|
+
];
|
|
14
|
+
|
|
15
|
+
const router = new VueRouter({
|
|
16
|
+
routes
|
|
17
|
+
});
|
|
18
|
+
|
|
19
|
+
export default router;
|