异地登录强制下线, 显示点赞和在线人数
This commit is contained in:
539
public/fonts/demo.css
Normal file
539
public/fonts/demo.css
Normal file
@ -0,0 +1,539 @@
|
||||
/* Logo 字体 */
|
||||
@font-face {
|
||||
font-family: "iconfont logo";
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834');
|
||||
src: url('https://at.alicdn.com/t/font_985780_km7mi63cihi.eot?t=1545807318834#iefix') format('embedded-opentype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.woff?t=1545807318834') format('woff'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.ttf?t=1545807318834') format('truetype'),
|
||||
url('https://at.alicdn.com/t/font_985780_km7mi63cihi.svg?t=1545807318834#iconfont') format('svg');
|
||||
}
|
||||
|
||||
.logo {
|
||||
font-family: "iconfont logo";
|
||||
font-size: 160px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
/* tabs */
|
||||
.nav-tabs {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.nav-tabs .nav-more {
|
||||
position: absolute;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
height: 42px;
|
||||
line-height: 42px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
#tabs {
|
||||
border-bottom: 1px solid #eee;
|
||||
}
|
||||
|
||||
#tabs li {
|
||||
cursor: pointer;
|
||||
width: 100px;
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
text-align: center;
|
||||
font-size: 16px;
|
||||
border-bottom: 2px solid transparent;
|
||||
position: relative;
|
||||
z-index: 1;
|
||||
margin-bottom: -1px;
|
||||
color: #666;
|
||||
}
|
||||
|
||||
|
||||
#tabs .active {
|
||||
border-bottom-color: #f00;
|
||||
color: #222;
|
||||
}
|
||||
|
||||
.tab-container .content {
|
||||
display: none;
|
||||
}
|
||||
|
||||
/* 页面布局 */
|
||||
.main {
|
||||
padding: 30px 100px;
|
||||
width: 960px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
|
||||
.main .logo {
|
||||
color: #333;
|
||||
text-align: left;
|
||||
margin-bottom: 30px;
|
||||
line-height: 1;
|
||||
height: 110px;
|
||||
margin-top: -50px;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.main .logo a {
|
||||
font-size: 160px;
|
||||
color: #333;
|
||||
}
|
||||
|
||||
.helps {
|
||||
margin-top: 40px;
|
||||
}
|
||||
|
||||
.helps pre {
|
||||
padding: 20px;
|
||||
margin: 10px 0;
|
||||
border: solid 1px #e7e1cd;
|
||||
background-color: #fffdef;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
.icon_lists {
|
||||
width: 100% !important;
|
||||
overflow: hidden;
|
||||
*zoom: 1;
|
||||
}
|
||||
|
||||
.icon_lists li {
|
||||
width: 100px;
|
||||
margin-bottom: 10px;
|
||||
margin-right: 20px;
|
||||
text-align: center;
|
||||
list-style: none !important;
|
||||
cursor: default;
|
||||
}
|
||||
|
||||
.icon_lists li .code-name {
|
||||
line-height: 1.2;
|
||||
}
|
||||
|
||||
.icon_lists .icon {
|
||||
display: block;
|
||||
height: 100px;
|
||||
line-height: 100px;
|
||||
font-size: 42px;
|
||||
margin: 10px auto;
|
||||
color: #333;
|
||||
-webkit-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
-moz-transition: font-size 0.25s linear, width 0.25s linear;
|
||||
transition: font-size 0.25s linear, width 0.25s linear;
|
||||
}
|
||||
|
||||
.icon_lists .icon:hover {
|
||||
font-size: 100px;
|
||||
}
|
||||
|
||||
.icon_lists .svg-icon {
|
||||
/* 通过设置 font-size 来改变图标大小 */
|
||||
width: 1em;
|
||||
/* 图标和文字相邻时,垂直对齐 */
|
||||
vertical-align: -0.15em;
|
||||
/* 通过设置 color 来改变 SVG 的颜色/fill */
|
||||
fill: currentColor;
|
||||
/* path 和 stroke 溢出 viewBox 部分在 IE 下会显示
|
||||
normalize.css 中也包含这行 */
|
||||
overflow: hidden;
|
||||
}
|
||||
|
||||
.icon_lists li .name,
|
||||
.icon_lists li .code-name {
|
||||
color: #666;
|
||||
}
|
||||
|
||||
/* markdown 样式 */
|
||||
.markdown {
|
||||
color: #666;
|
||||
font-size: 14px;
|
||||
line-height: 1.8;
|
||||
}
|
||||
|
||||
.highlight {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
.markdown img {
|
||||
vertical-align: middle;
|
||||
max-width: 100%;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
color: #404040;
|
||||
font-weight: 500;
|
||||
line-height: 40px;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown h2,
|
||||
.markdown h3,
|
||||
.markdown h4,
|
||||
.markdown h5,
|
||||
.markdown h6 {
|
||||
color: #404040;
|
||||
margin: 1.6em 0 0.6em 0;
|
||||
font-weight: 500;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown h1 {
|
||||
font-size: 28px;
|
||||
}
|
||||
|
||||
.markdown h2 {
|
||||
font-size: 22px;
|
||||
}
|
||||
|
||||
.markdown h3 {
|
||||
font-size: 16px;
|
||||
}
|
||||
|
||||
.markdown h4 {
|
||||
font-size: 14px;
|
||||
}
|
||||
|
||||
.markdown h5 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown h6 {
|
||||
font-size: 12px;
|
||||
}
|
||||
|
||||
.markdown hr {
|
||||
height: 1px;
|
||||
border: 0;
|
||||
background: #e9e9e9;
|
||||
margin: 16px 0;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
.markdown p {
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown>p,
|
||||
.markdown>blockquote,
|
||||
.markdown>.highlight,
|
||||
.markdown>ol,
|
||||
.markdown>ul {
|
||||
width: 80%;
|
||||
}
|
||||
|
||||
.markdown ul>li {
|
||||
list-style: circle;
|
||||
}
|
||||
|
||||
.markdown>ul li,
|
||||
.markdown blockquote ul>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown>ul li p,
|
||||
.markdown>ol li p {
|
||||
margin: 0.6em 0;
|
||||
}
|
||||
|
||||
.markdown ol>li {
|
||||
list-style: decimal;
|
||||
}
|
||||
|
||||
.markdown>ol li,
|
||||
.markdown blockquote ol>li {
|
||||
margin-left: 20px;
|
||||
padding-left: 4px;
|
||||
}
|
||||
|
||||
.markdown code {
|
||||
margin: 0 3px;
|
||||
padding: 0 5px;
|
||||
background: #eee;
|
||||
border-radius: 3px;
|
||||
}
|
||||
|
||||
.markdown strong,
|
||||
.markdown b {
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table {
|
||||
border-collapse: collapse;
|
||||
border-spacing: 0px;
|
||||
empty-cells: show;
|
||||
border: 1px solid #e9e9e9;
|
||||
width: 95%;
|
||||
margin-bottom: 24px;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
white-space: nowrap;
|
||||
color: #333;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.markdown>table th,
|
||||
.markdown>table td {
|
||||
border: 1px solid #e9e9e9;
|
||||
padding: 8px 16px;
|
||||
text-align: left;
|
||||
}
|
||||
|
||||
.markdown>table th {
|
||||
background: #F7F7F7;
|
||||
}
|
||||
|
||||
.markdown blockquote {
|
||||
font-size: 90%;
|
||||
color: #999;
|
||||
border-left: 4px solid #e9e9e9;
|
||||
padding-left: 0.8em;
|
||||
margin: 1em 0;
|
||||
}
|
||||
|
||||
.markdown blockquote p {
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
.markdown .anchor {
|
||||
opacity: 0;
|
||||
transition: opacity 0.3s ease;
|
||||
margin-left: 8px;
|
||||
}
|
||||
|
||||
.markdown .waiting {
|
||||
color: #ccc;
|
||||
}
|
||||
|
||||
.markdown h1:hover .anchor,
|
||||
.markdown h2:hover .anchor,
|
||||
.markdown h3:hover .anchor,
|
||||
.markdown h4:hover .anchor,
|
||||
.markdown h5:hover .anchor,
|
||||
.markdown h6:hover .anchor {
|
||||
opacity: 1;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
.markdown>br,
|
||||
.markdown>p>br {
|
||||
clear: both;
|
||||
}
|
||||
|
||||
|
||||
.hljs {
|
||||
display: block;
|
||||
background: white;
|
||||
padding: 0.5em;
|
||||
color: #333333;
|
||||
overflow-x: auto;
|
||||
}
|
||||
|
||||
.hljs-comment,
|
||||
.hljs-meta {
|
||||
color: #969896;
|
||||
}
|
||||
|
||||
.hljs-string,
|
||||
.hljs-variable,
|
||||
.hljs-template-variable,
|
||||
.hljs-strong,
|
||||
.hljs-emphasis,
|
||||
.hljs-quote {
|
||||
color: #df5000;
|
||||
}
|
||||
|
||||
.hljs-keyword,
|
||||
.hljs-selector-tag,
|
||||
.hljs-type {
|
||||
color: #a71d5d;
|
||||
}
|
||||
|
||||
.hljs-literal,
|
||||
.hljs-symbol,
|
||||
.hljs-bullet,
|
||||
.hljs-attribute {
|
||||
color: #0086b3;
|
||||
}
|
||||
|
||||
.hljs-section,
|
||||
.hljs-name {
|
||||
color: #63a35c;
|
||||
}
|
||||
|
||||
.hljs-tag {
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.hljs-title,
|
||||
.hljs-attr,
|
||||
.hljs-selector-id,
|
||||
.hljs-selector-class,
|
||||
.hljs-selector-attr,
|
||||
.hljs-selector-pseudo {
|
||||
color: #795da3;
|
||||
}
|
||||
|
||||
.hljs-addition {
|
||||
color: #55a532;
|
||||
background-color: #eaffea;
|
||||
}
|
||||
|
||||
.hljs-deletion {
|
||||
color: #bd2c00;
|
||||
background-color: #ffecec;
|
||||
}
|
||||
|
||||
.hljs-link {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* 代码高亮 */
|
||||
/* PrismJS 1.15.0
|
||||
https://prismjs.com/download.html#themes=prism&languages=markup+css+clike+javascript */
|
||||
/**
|
||||
* prism.js default theme for JavaScript, CSS and HTML
|
||||
* Based on dabblet (http://dabblet.com)
|
||||
* @author Lea Verou
|
||||
*/
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: black;
|
||||
background: none;
|
||||
text-shadow: 0 1px white;
|
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
line-height: 1.5;
|
||||
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::-moz-selection,
|
||||
pre[class*="language-"] ::-moz-selection,
|
||||
code[class*="language-"]::-moz-selection,
|
||||
code[class*="language-"] ::-moz-selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
pre[class*="language-"]::selection,
|
||||
pre[class*="language-"] ::selection,
|
||||
code[class*="language-"]::selection,
|
||||
code[class*="language-"] ::selection {
|
||||
text-shadow: none;
|
||||
background: #b3d4fc;
|
||||
}
|
||||
|
||||
@media print {
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
text-shadow: none;
|
||||
}
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*="language-"] {
|
||||
padding: 1em;
|
||||
margin: .5em 0;
|
||||
overflow: auto;
|
||||
}
|
||||
|
||||
:not(pre)>code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
background: #f5f2f0;
|
||||
}
|
||||
|
||||
/* Inline code */
|
||||
:not(pre)>code[class*="language-"] {
|
||||
padding: .1em;
|
||||
border-radius: .3em;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: slategray;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #999;
|
||||
}
|
||||
|
||||
.namespace {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.tag,
|
||||
.token.boolean,
|
||||
.token.number,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.deleted {
|
||||
color: #905;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.attr-name,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin,
|
||||
.token.inserted {
|
||||
color: #690;
|
||||
}
|
||||
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string {
|
||||
color: #9a6e3a;
|
||||
background: hsla(0, 0%, 100%, .5);
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value,
|
||||
.token.keyword {
|
||||
color: #07a;
|
||||
}
|
||||
|
||||
.token.function,
|
||||
.token.class-name {
|
||||
color: #DD4A68;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important,
|
||||
.token.variable {
|
||||
color: #e90;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
280
public/fonts/demo_index.html
Normal file
280
public/fonts/demo_index.html
Normal file
@ -0,0 +1,280 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8"/>
|
||||
<title>iconfont Demo</title>
|
||||
<link rel="shortcut icon" href="//img.alicdn.com/imgextra/i2/O1CN01ZyAlrn1MwaMhqz36G_!!6000000001499-73-tps-64-64.ico" type="image/x-icon"/>
|
||||
<link rel="icon" type="image/svg+xml" href="//img.alicdn.com/imgextra/i4/O1CN01EYTRnJ297D6vehehJ_!!6000000008020-55-tps-64-64.svg"/>
|
||||
<link rel="stylesheet" href="https://g.alicdn.com/thx/cube/1.3.2/cube.min.css">
|
||||
<link rel="stylesheet" href="demo.css">
|
||||
<link rel="stylesheet" href="iconfont.css">
|
||||
<script src="iconfont.js"></script>
|
||||
<!-- jQuery -->
|
||||
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/7bfddb60-08e8-11e9-9b04-53e73bb6408b.js"></script>
|
||||
<!-- 代码高亮 -->
|
||||
<script src="https://a1.alicdn.com/oss/uploads/2018/12/26/a3f714d0-08e6-11e9-8a15-ebf944d7534c.js"></script>
|
||||
<style>
|
||||
.main .logo {
|
||||
margin-top: 0;
|
||||
height: auto;
|
||||
}
|
||||
|
||||
.main .logo a {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
}
|
||||
|
||||
.main .logo .sub-title {
|
||||
margin-left: 0.5em;
|
||||
font-size: 22px;
|
||||
color: #fff;
|
||||
background: linear-gradient(-45deg, #3967FF, #B500FE);
|
||||
-webkit-background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
}
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<div class="main">
|
||||
<h1 class="logo"><a href="https://www.iconfont.cn/" title="iconfont 首页" target="_blank">
|
||||
<img width="200" src="https://img.alicdn.com/imgextra/i3/O1CN01Mn65HV1FfSEzR6DKv_!!6000000000514-55-tps-228-59.svg">
|
||||
|
||||
</a></h1>
|
||||
<div class="nav-tabs">
|
||||
<ul id="tabs" class="dib-box">
|
||||
<li class="dib active"><span>Unicode</span></li>
|
||||
<li class="dib"><span>Font class</span></li>
|
||||
<li class="dib"><span>Symbol</span></li>
|
||||
</ul>
|
||||
|
||||
<a href="https://www.iconfont.cn/manage/index?manage_type=myprojects&projectId=3446052" target="_blank" class="nav-more">查看项目</a>
|
||||
|
||||
</div>
|
||||
<div class="tab-container">
|
||||
<div class="content unicode" style="display: block;">
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">like_fill</div>
|
||||
<div class="code-name">&#xe668;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">like</div>
|
||||
<div class="code-name">&#xe669;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">online</div>
|
||||
<div class="code-name">&#xe647;</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont"></span>
|
||||
<div class="name">横屏</div>
|
||||
<div class="code-name">&#xe63d;</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="article markdown">
|
||||
<h2 id="unicode-">Unicode 引用</h2>
|
||||
<hr>
|
||||
|
||||
<p>Unicode 是字体在网页端最原始的应用方式,特点是:</p>
|
||||
<ul>
|
||||
<li>支持按字体的方式去动态调整图标大小,颜色等等。</li>
|
||||
<li>默认情况下不支持多色,直接添加多色图标会自动去色。</li>
|
||||
</ul>
|
||||
<blockquote>
|
||||
<p>注意:新版 iconfont 支持两种方式引用多色图标:SVG symbol 引用方式和彩色字体图标模式。(使用彩色字体图标需要在「编辑项目」中开启「彩色」选项后并重新生成。)</p>
|
||||
</blockquote>
|
||||
<p>Unicode 使用步骤如下:</p>
|
||||
<h3 id="-font-face">第一步:拷贝项目下面生成的 <code>@font-face</code></h3>
|
||||
<pre><code class="language-css"
|
||||
>@font-face {
|
||||
font-family: 'iconfont';
|
||||
src: url('iconfont.woff2?t=1656919180579') format('woff2'),
|
||||
url('iconfont.woff?t=1656919180579') format('woff'),
|
||||
url('iconfont.ttf?t=1656919180579') format('truetype');
|
||||
}
|
||||
</code></pre>
|
||||
<h3 id="-iconfont-">第二步:定义使用 iconfont 的样式</h3>
|
||||
<pre><code class="language-css"
|
||||
>.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
</code></pre>
|
||||
<h3 id="-">第三步:挑选相应图标并获取字体编码,应用于页面</h3>
|
||||
<pre>
|
||||
<code class="language-html"
|
||||
><span class="iconfont">&#x33;</span>
|
||||
</code></pre>
|
||||
<blockquote>
|
||||
<p>"iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content font-class">
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-likefill"></span>
|
||||
<div class="name">
|
||||
like_fill
|
||||
</div>
|
||||
<div class="code-name">.icon-likefill
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-like"></span>
|
||||
<div class="name">
|
||||
like
|
||||
</div>
|
||||
<div class="code-name">.icon-like
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-online"></span>
|
||||
<div class="name">
|
||||
online
|
||||
</div>
|
||||
<div class="code-name">.icon-online
|
||||
</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<span class="icon iconfont icon-hengping"></span>
|
||||
<div class="name">
|
||||
横屏
|
||||
</div>
|
||||
<div class="code-name">.icon-hengping
|
||||
</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="article markdown">
|
||||
<h2 id="font-class-">font-class 引用</h2>
|
||||
<hr>
|
||||
|
||||
<p>font-class 是 Unicode 使用方式的一种变种,主要是解决 Unicode 书写不直观,语意不明确的问题。</p>
|
||||
<p>与 Unicode 使用方式相比,具有如下特点:</p>
|
||||
<ul>
|
||||
<li>相比于 Unicode 语意明确,书写更直观。可以很容易分辨这个 icon 是什么。</li>
|
||||
<li>因为使用 class 来定义图标,所以当要替换图标时,只需要修改 class 里面的 Unicode 引用。</li>
|
||||
</ul>
|
||||
<p>使用步骤如下:</p>
|
||||
<h3 id="-fontclass-">第一步:引入项目下面生成的 fontclass 代码:</h3>
|
||||
<pre><code class="language-html"><link rel="stylesheet" href="./iconfont.css">
|
||||
</code></pre>
|
||||
<h3 id="-">第二步:挑选相应图标并获取类名,应用于页面:</h3>
|
||||
<pre><code class="language-html"><span class="iconfont icon-xxx"></span>
|
||||
</code></pre>
|
||||
<blockquote>
|
||||
<p>"
|
||||
iconfont" 是你项目下的 font-family。可以通过编辑项目查看,默认是 "iconfont"。</p>
|
||||
</blockquote>
|
||||
</div>
|
||||
</div>
|
||||
<div class="content symbol">
|
||||
<ul class="icon_lists dib-box">
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-likefill"></use>
|
||||
</svg>
|
||||
<div class="name">like_fill</div>
|
||||
<div class="code-name">#icon-likefill</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-like"></use>
|
||||
</svg>
|
||||
<div class="name">like</div>
|
||||
<div class="code-name">#icon-like</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-online"></use>
|
||||
</svg>
|
||||
<div class="name">online</div>
|
||||
<div class="code-name">#icon-online</div>
|
||||
</li>
|
||||
|
||||
<li class="dib">
|
||||
<svg class="icon svg-icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-hengping"></use>
|
||||
</svg>
|
||||
<div class="name">横屏</div>
|
||||
<div class="code-name">#icon-hengping</div>
|
||||
</li>
|
||||
|
||||
</ul>
|
||||
<div class="article markdown">
|
||||
<h2 id="symbol-">Symbol 引用</h2>
|
||||
<hr>
|
||||
|
||||
<p>这是一种全新的使用方式,应该说这才是未来的主流,也是平台目前推荐的用法。相关介绍可以参考这篇<a href="">文章</a>
|
||||
这种用法其实是做了一个 SVG 的集合,与另外两种相比具有如下特点:</p>
|
||||
<ul>
|
||||
<li>支持多色图标了,不再受单色限制。</li>
|
||||
<li>通过一些技巧,支持像字体那样,通过 <code>font-size</code>, <code>color</code> 来调整样式。</li>
|
||||
<li>兼容性较差,支持 IE9+,及现代浏览器。</li>
|
||||
<li>浏览器渲染 SVG 的性能一般,还不如 png。</li>
|
||||
</ul>
|
||||
<p>使用步骤如下:</p>
|
||||
<h3 id="-symbol-">第一步:引入项目下面生成的 symbol 代码:</h3>
|
||||
<pre><code class="language-html"><script src="./iconfont.js"></script>
|
||||
</code></pre>
|
||||
<h3 id="-css-">第二步:加入通用 CSS 代码(引入一次就行):</h3>
|
||||
<pre><code class="language-html"><style>
|
||||
.icon {
|
||||
width: 1em;
|
||||
height: 1em;
|
||||
vertical-align: -0.15em;
|
||||
fill: currentColor;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
</code></pre>
|
||||
<h3 id="-">第三步:挑选相应图标并获取类名,应用于页面:</h3>
|
||||
<pre><code class="language-html"><svg class="icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-xxx"></use>
|
||||
</svg>
|
||||
</code></pre>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
<script>
|
||||
$(document).ready(function () {
|
||||
$('.tab-container .content:first').show()
|
||||
|
||||
$('#tabs li').click(function (e) {
|
||||
var tabContent = $('.tab-container .content')
|
||||
var index = $(this).index()
|
||||
|
||||
if ($(this).hasClass('active')) {
|
||||
return
|
||||
} else {
|
||||
$('#tabs li').removeClass('active')
|
||||
$(this).addClass('active')
|
||||
|
||||
tabContent.hide().eq(index).fadeIn()
|
||||
}
|
||||
})
|
||||
})
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
31
public/fonts/iconfont.css
Normal file
31
public/fonts/iconfont.css
Normal file
@ -0,0 +1,31 @@
|
||||
@font-face {
|
||||
font-family: "iconfont"; /* Project id 3446052 */
|
||||
src: url('iconfont.woff2?t=1656919180579') format('woff2'),
|
||||
url('iconfont.woff?t=1656919180579') format('woff'),
|
||||
url('iconfont.ttf?t=1656919180579') format('truetype');
|
||||
}
|
||||
|
||||
.iconfont {
|
||||
font-family: "iconfont" !important;
|
||||
font-size: 16px;
|
||||
font-style: normal;
|
||||
-webkit-font-smoothing: antialiased;
|
||||
-moz-osx-font-smoothing: grayscale;
|
||||
}
|
||||
|
||||
.icon-likefill:before {
|
||||
content: "\e668";
|
||||
}
|
||||
|
||||
.icon-like:before {
|
||||
content: "\e669";
|
||||
}
|
||||
|
||||
.icon-online:before {
|
||||
content: "\e647";
|
||||
}
|
||||
|
||||
.icon-hengping:before {
|
||||
content: "\e63d";
|
||||
}
|
||||
|
1
public/fonts/iconfont.js
Normal file
1
public/fonts/iconfont.js
Normal file
File diff suppressed because one or more lines are too long
37
public/fonts/iconfont.json
Normal file
37
public/fonts/iconfont.json
Normal file
@ -0,0 +1,37 @@
|
||||
{
|
||||
"id": "3446052",
|
||||
"name": "meeting",
|
||||
"font_family": "iconfont",
|
||||
"css_prefix_text": "icon-",
|
||||
"description": "",
|
||||
"glyphs": [
|
||||
{
|
||||
"icon_id": "30417",
|
||||
"name": "like_fill",
|
||||
"font_class": "likefill",
|
||||
"unicode": "e668",
|
||||
"unicode_decimal": 58984
|
||||
},
|
||||
{
|
||||
"icon_id": "30418",
|
||||
"name": "like",
|
||||
"font_class": "like",
|
||||
"unicode": "e669",
|
||||
"unicode_decimal": 58985
|
||||
},
|
||||
{
|
||||
"icon_id": "1210461",
|
||||
"name": "online",
|
||||
"font_class": "online",
|
||||
"unicode": "e647",
|
||||
"unicode_decimal": 58951
|
||||
},
|
||||
{
|
||||
"icon_id": "14472203",
|
||||
"name": "横屏",
|
||||
"font_class": "hengping",
|
||||
"unicode": "e63d",
|
||||
"unicode_decimal": 58941
|
||||
}
|
||||
]
|
||||
}
|
BIN
public/fonts/iconfont.ttf
Normal file
BIN
public/fonts/iconfont.ttf
Normal file
Binary file not shown.
BIN
public/fonts/iconfont.woff
Normal file
BIN
public/fonts/iconfont.woff
Normal file
Binary file not shown.
BIN
public/fonts/iconfont.woff2
Normal file
BIN
public/fonts/iconfont.woff2
Normal file
Binary file not shown.
@ -7,6 +7,7 @@
|
||||
<link rel="icon" href="<%= BASE_URL %>favicon.ico" />
|
||||
<!-- <meta http-equiv="origin-trial" content="AuKHz2ifylDpZfg7iawfCDGtilbLT+tg9CCbVG4PNSxRA1v2NtYGRKAKctmE4Us42+t1lZ3IkPO9s5/VlHy/rwIAAABgeyJvcmlnaW4iOiJodHRwOi8vbG9jYWxob3N0OjMwMDAiLCJmZWF0dXJlIjoiVW5yZXN0cmljdGVkU2hhcmVkQXJyYXlCdWZmZXIiLCJleHBpcnkiOjE2NTg4Nzk5OTl9" /> -->
|
||||
<script src="/coi-serviceworker.js"></script>
|
||||
<script src="/fonts/iconfont.js"></script>
|
||||
<!-- <title><%= htmlWebpackPlugin.options.title %></title> -->
|
||||
<title>楚桓会议客户端</title>
|
||||
</head>
|
||||
|
@ -107,3 +107,23 @@ export function superviseJoinMeeting(params) {
|
||||
params,
|
||||
});
|
||||
}
|
||||
|
||||
// 点赞
|
||||
export function addMeetingLikeTotal(meetingId) {
|
||||
return request({
|
||||
url: `/app/addMeetingLikeTotal`,
|
||||
method: "get",
|
||||
params: {
|
||||
meetingId,
|
||||
},
|
||||
});
|
||||
}
|
||||
export function getOnlineUserTotalAndLikes(meetingId) {
|
||||
return request({
|
||||
url: `/app/getOnlineUserTotalAndLikes`,
|
||||
method: "get",
|
||||
params: {
|
||||
meetingId,
|
||||
},
|
||||
});
|
||||
}
|
||||
|
82
src/components/like.vue
Normal file
82
src/components/like.vue
Normal file
@ -0,0 +1,82 @@
|
||||
<template>
|
||||
<div class="bar">
|
||||
<svg
|
||||
class="icon"
|
||||
aria-hidden="true"
|
||||
style="user-select: none; cursor: pointer"
|
||||
@click="handleClickLike"
|
||||
>
|
||||
<use xlink:href="#icon-like"></use>
|
||||
</svg>
|
||||
<!-- <svg
|
||||
v-else
|
||||
class="icon"
|
||||
aria-hidden="true"
|
||||
style="user-select: none; cursor: pointer"
|
||||
@click="handleClickLike"
|
||||
>
|
||||
<use xlink:href="#icon-likefill"></use>
|
||||
</svg> -->
|
||||
<span class="count">{{ like }}</span>
|
||||
<svg class="icon" aria-hidden="true">
|
||||
<use xlink:href="#icon-online"></use>
|
||||
</svg>
|
||||
<span class="count">{{ online }}</span>
|
||||
</div>
|
||||
</template>
|
||||
<script setup name="Like">
|
||||
import { ElMessage } from "element-plus";
|
||||
import { toRefs } from "vue";
|
||||
import { addMeetingLikeTotal } from "@/api/meeting";
|
||||
import { useStore } from "vuex";
|
||||
const store = useStore();
|
||||
const props = defineProps({
|
||||
like: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
online: {
|
||||
type: Number,
|
||||
default: 0,
|
||||
},
|
||||
meetingId: {
|
||||
type: Number,
|
||||
required: true,
|
||||
},
|
||||
});
|
||||
const { like, online, meetingId } = toRefs(props);
|
||||
|
||||
const handleClickLike = async () => {
|
||||
// if (store.state.liked) {
|
||||
// ElMessage.error("不允许重复点赞");
|
||||
// return;
|
||||
// }
|
||||
await addMeetingLikeTotal(meetingId.value);
|
||||
// store.commit("setLiked", true);
|
||||
ElMessage.success("点赞成功");
|
||||
};
|
||||
</script>
|
||||
<style scoped lang="scss">
|
||||
.bar {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
width: 100px;
|
||||
height: 34px;
|
||||
// background-color: indianred;
|
||||
.count {
|
||||
min-width: 3em;
|
||||
margin: 0 4px 0 4px;
|
||||
color: #888;
|
||||
}
|
||||
}
|
||||
|
||||
.icon {
|
||||
color: indianred;
|
||||
width: 1.2em;
|
||||
height: 1.2em;
|
||||
vertical-align: -0.15em;
|
||||
fill: currentColor;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
@ -91,6 +91,7 @@ router.beforeEach(async (to) => {
|
||||
// 当参会角色(host,panelist,meeting,supervisor)改变时,清空用户信息、消息列表
|
||||
if (store.state.joinRole && store.state.joinRole !== to.name) {
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setLiked", false);
|
||||
store.commit("setMessagesList", []);
|
||||
}
|
||||
store.commit("setJoinRole", to.name);
|
||||
@ -99,6 +100,7 @@ router.beforeEach(async (to) => {
|
||||
if (to.params.meetingId !== store.state.joinUser.meetingId) {
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setMessagesList", []);
|
||||
store.commit("setLiked", false);
|
||||
}
|
||||
// 前往主持人页面
|
||||
if (to.name === "Host") {
|
||||
@ -128,6 +130,8 @@ router.beforeEach(async (to) => {
|
||||
store.state.meeting.joinType !== store.state.joinType
|
||||
) {
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setLiked", false);
|
||||
store.commit("setMessagesList", []);
|
||||
store.commit("setJoinType", store.state.meeting.joinType);
|
||||
return `/verify/${to.params.meetingId}`;
|
||||
}
|
||||
@ -149,15 +153,21 @@ router.beforeEach(async (to) => {
|
||||
return true;
|
||||
} catch (error) {
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setLiked", false);
|
||||
store.commit("setMessagesList", []);
|
||||
return `/verify/${to.params.meetingId}`;
|
||||
}
|
||||
} else {
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setLiked", false);
|
||||
store.commit("setMessagesList", []);
|
||||
return `/verify/${to.params.meetingId}`;
|
||||
}
|
||||
} else {
|
||||
if (_.isEmpty(store.state.joinUser)) {
|
||||
console.log("error");
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setLiked", false);
|
||||
store.commit("setMessagesList", []);
|
||||
return `/verify/${to.params.meetingId}`;
|
||||
} else {
|
||||
if (store.state.meeting.joinType === "2") {
|
||||
@ -205,10 +215,14 @@ router.beforeEach(async (to) => {
|
||||
return true;
|
||||
} catch (error) {
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setLiked", false);
|
||||
store.commit("setMessagesList", []);
|
||||
return `/panelist-verify/${to.params.meetingId}`;
|
||||
}
|
||||
} else {
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setLiked", false);
|
||||
store.commit("setMessagesList", []);
|
||||
return `/panelist-verify/${to.params.meetingId}`;
|
||||
}
|
||||
} else if (to.name === "Supervisor") {
|
||||
|
@ -12,6 +12,9 @@ const store = createStore({
|
||||
? JSON.parse(localStorage.getItem("MESSAGES"))
|
||||
: [],
|
||||
password: "", //参会密码
|
||||
liked: localStorage.getItem("LIKED")
|
||||
? localStorage.getItem("LIKED")
|
||||
: false,
|
||||
joinType: localStorage.getItem("JOINTYPE")
|
||||
? JSON.parse(localStorage.getItem("JOINTYPE"))
|
||||
: "",
|
||||
@ -29,7 +32,12 @@ const store = createStore({
|
||||
setMeetingInfo(state, data) {
|
||||
state.meeting = data;
|
||||
},
|
||||
|
||||
// 是否点赞
|
||||
setLiked(state, data) {
|
||||
state.liked = data;
|
||||
console.log(data);
|
||||
localStorage.setItem("LIKED", data);
|
||||
},
|
||||
// 设置参会密码
|
||||
setPassword(state, data) {
|
||||
state.password = data;
|
||||
|
@ -18,6 +18,13 @@
|
||||
:class="`layout-template-${templateId}`"
|
||||
ref="videoElementRef"
|
||||
></div>
|
||||
<like
|
||||
v-if="screenWidth > 900"
|
||||
:meeting-id="store.getters.meetingId"
|
||||
:like="likeCount"
|
||||
:online="onlineCount"
|
||||
style="position: absolute; bottom: 1vw; right: 4vw"
|
||||
/>
|
||||
<el-button
|
||||
v-if="!isFullScreen"
|
||||
:icon="FullScreen"
|
||||
@ -42,6 +49,13 @@
|
||||
/>
|
||||
</div>
|
||||
</div>
|
||||
<like
|
||||
v-if="screenWidth <= 900"
|
||||
:meeting-id="store.getters.meetingId"
|
||||
:like="likeCount"
|
||||
:online="onlineCount"
|
||||
style="margin: 0 auto"
|
||||
/>
|
||||
<el-tabs class="tabs" type="border-card">
|
||||
<el-tab-pane label="会议介绍">
|
||||
<div class="meeting-info meeting-note" v-html="meetingNote"></div>
|
||||
@ -145,7 +159,7 @@ import {
|
||||
watch,
|
||||
} from "vue";
|
||||
import { useStore } from "vuex";
|
||||
import { useRoute } from "vue-router";
|
||||
import { useRoute, useRouter } from "vue-router";
|
||||
|
||||
import dayjs from "dayjs";
|
||||
import { uniqueId } from "lodash";
|
||||
@ -153,9 +167,15 @@ import ZoomMtgEmbedded from "@zoomus/websdk/embedded";
|
||||
import ReconnectingWebSocket from "reconnecting-websocket";
|
||||
import { ElMessage, ElMessageBox } from "element-plus";
|
||||
import { FullScreen, CloseBold } from "@element-plus/icons-vue";
|
||||
import { signMeeting, generateSignature } from "@/api/meeting";
|
||||
import {
|
||||
signMeeting,
|
||||
generateSignature,
|
||||
getOnlineUserTotalAndLikes,
|
||||
} from "@/api/meeting";
|
||||
import axios from "axios";
|
||||
import Chat from "@/components/chat";
|
||||
import mediaCheck from "@/components/mediaCheck.vue";
|
||||
import like from "@/components/like.vue";
|
||||
import questions from "@/components/questions";
|
||||
import {
|
||||
getQuestionsList,
|
||||
@ -165,7 +185,7 @@ import {
|
||||
|
||||
const store = useStore();
|
||||
const route = useRoute();
|
||||
|
||||
const router = useRouter();
|
||||
const meetingNote = computed(() => store.getters.meetingNote); // 会议介绍
|
||||
const meetingSchedule = computed(() => store.getters.meetingSchedule); // 会议日程
|
||||
const expertInfo = computed(() => store.getters.expertInfo); // 专家信息
|
||||
@ -192,7 +212,7 @@ templateId.value = store.getters.templateId;
|
||||
/* 会议配置 */
|
||||
const meetingConfig = reactive({
|
||||
client: ZoomMtgEmbedded.createClient(),
|
||||
sdkKey: "99Spa64AWHYVZD95imUpVyMD0KF9CpEIrIb1",
|
||||
sdkKey: "ZAqxohNPDbVvx3cmc5Wzp2cFVwZvbyHFAzgl",
|
||||
meetingNumber: store.getters.meetingNumber,
|
||||
passWord: store.state.password,
|
||||
role: route.name === "Host" ? 1 : 0,
|
||||
@ -241,6 +261,11 @@ const startMeeting = async () => {
|
||||
meetingNumber: store.getters.meetingNumber,
|
||||
role: meetingConfig.role,
|
||||
});
|
||||
// const resp = await axios.post("http://localhost:4000", {
|
||||
// meetingNumber: store.getters.meetingNumber,
|
||||
// role: meetingConfig.role,
|
||||
// });
|
||||
// const sign = resp.data.signature;
|
||||
let meetingSDKElement = document.getElementById("video-element");
|
||||
|
||||
try {
|
||||
@ -486,6 +511,15 @@ watch(attendeeslist, (val) => {
|
||||
}
|
||||
});
|
||||
|
||||
// 进入会议时回去点赞数量和在线人数
|
||||
const onlineCount = ref(0);
|
||||
const likeCount = ref(0);
|
||||
const getLikeAndOnline = async () => {
|
||||
const { data } = await getOnlineUserTotalAndLikes(store.getters.meetingId);
|
||||
onlineCount.value = data.online;
|
||||
likeCount.value = data.like;
|
||||
};
|
||||
getLikeAndOnline();
|
||||
// 点击进入全屏模式
|
||||
const fullscreenWrapRef = ref(null);
|
||||
const isVerticalFullScreen = ref(false);
|
||||
@ -670,6 +704,26 @@ const initWebSocket = () => {
|
||||
else if (data.type === "isStartQuestionnaire" && route.name === "Meeting") {
|
||||
showQuestionnaireDialog.value = true;
|
||||
isDuringQuestionnairePeriod.value = true;
|
||||
} else if (data.type === "isRefreshOnlineAndLike") {
|
||||
console.log(data.type);
|
||||
getLikeAndOnline();
|
||||
}
|
||||
// 当检测到异地登陆时,强制退出登录,并清除数据
|
||||
else if (data.type === "isRemoteLogin") {
|
||||
ElMessageBox.alert("您的账号在异地登录,将被强制下线", "异地登录", {
|
||||
type: "warning",
|
||||
"show-close": false,
|
||||
"show-confirm-button": false,
|
||||
"show-cancel-button": false,
|
||||
});
|
||||
setTimeout(() => {
|
||||
leaveConference();
|
||||
store.commit("setJoinUser", {});
|
||||
store.commit("setPassword", "");
|
||||
store.commit("setMessagesList", []);
|
||||
store.commit("setLiked", false);
|
||||
router.push(`/verify/${store.getters.meetingId}`);
|
||||
}, 2000);
|
||||
}
|
||||
// 会议结束时
|
||||
else if (data.type === "isCloseMeeting") {
|
||||
|
Reference in New Issue
Block a user