初始化调整 debug
This commit is contained in:
parent
5f9aaa5c33
commit
0c7597cd46
@ -9,7 +9,7 @@
|
||||
"urls": "http://localhost:8888", //项目启动url,如果改动端口前端对应devServer也需要进行修改
|
||||
"dbConfigs": [
|
||||
{
|
||||
"Conn": "Data Source=127.0.0.1;User ID=admin;Password=123456;Initial Catalog=ZrAdmin;",
|
||||
"Conn": "Data Source=127.0.0.1;User ID=sa;Password=123456;Initial Catalog=ZrAdmin;",
|
||||
"DbType": 1, //数据库类型 MySql = 0, SqlServer = 1, Oracle = 3,PgSql = 4
|
||||
"ConfigId": "0", //多租户唯一标识
|
||||
"IsAutoCloseConnection": true
|
||||
@ -19,7 +19,7 @@
|
||||
//代码生成数据库配置
|
||||
"CodeGenDbConfig": {
|
||||
//代码生成连接字符串,注意{dbName}为固定格式,不要填写数据库名
|
||||
"Conn": "Data Source=127.0.0.1;User ID=admin;Password=123456;Initial Catalog={dbName};",
|
||||
"Conn": "Data Source=127.0.0.1;User ID=sa;Password=123456;Initial Catalog={dbName};",
|
||||
"DbType": 1,
|
||||
"IsAutoCloseConnection": true,
|
||||
"DbName": "ZrAdmin" //代码生成默认连接数据库
|
||||
@ -52,9 +52,9 @@
|
||||
},
|
||||
//企业微信通知配置
|
||||
"WxCorp": {
|
||||
"AgentID": "",
|
||||
"CorpID": "",
|
||||
"CorpSecret": "",
|
||||
"AgentID": "1",
|
||||
"CorpID": "1",
|
||||
"CorpSecret": "1",
|
||||
"SendUser": "@all"
|
||||
},
|
||||
//代码生成配置
|
||||
|
||||
@ -26,7 +26,7 @@ namespace ZR.Model.System
|
||||
/// 公告类型 (1通知 2公告)
|
||||
/// </summary>
|
||||
[SugarColumn(ColumnName = "notice_type", ExtendedAttribute = ProteryConstant.NOTNULL)]
|
||||
public int NoticeType { get; set; }
|
||||
public char NoticeType { get; set; }
|
||||
/// <summary>
|
||||
/// 公告内容
|
||||
/// </summary>
|
||||
@ -36,6 +36,6 @@ namespace ZR.Model.System
|
||||
/// 公告状态 (0正常 1关闭)
|
||||
/// </summary>
|
||||
[SugarColumn(DefaultValue = "0", ExtendedAttribute = ProteryConstant.NOTNULL)]
|
||||
public int Status { get; set; }
|
||||
public char Status { get; set; }
|
||||
}
|
||||
}
|
||||
@ -27,7 +27,7 @@ namespace ZR.Service.System
|
||||
{
|
||||
var predicate = Expressionable.Create<SysNotice>();
|
||||
|
||||
predicate = predicate.And(m => m.Status == 0);
|
||||
predicate = predicate.And(m => m.Status == '0');
|
||||
return Queryable()
|
||||
.Where(predicate.ToExpression())
|
||||
.OrderByDescending(f => f.Create_time)
|
||||
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 7.5 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 207 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 10 KiB After Width: | Height: | Size: 16 KiB |
@ -1,234 +1,367 @@
|
||||
<template>
|
||||
<div class="app-container home">
|
||||
<el-row :gutter="20">
|
||||
<el-col :sm="24" :lg="24">
|
||||
<blockquote class="text-warning" style="font-size: 14px">
|
||||
【阿里云特惠专区】
|
||||
<el-link href="https://www.aliyun.com/minisite/goods?userCode=uotn5vt1&share_source=copy_link" type="primary" target="_black">
|
||||
☛☛点我进入☚☚
|
||||
</el-link>
|
||||
<br />
|
||||
【领取腾讯云通用云产品新用户专属大礼包2860优惠券,每种代金券限量500张,先到先得。】
|
||||
<el-link href="https://curl.qcloud.com/5J4nag8D" type="primary" target="_blank"> ☛☛点我进入☚☚ </el-link>
|
||||
<br />
|
||||
|
||||
【腾讯云限时秒杀活动】
|
||||
<el-link href="https://curl.qcloud.com/4yEoRquq" type="primary" target="_blank">☛☛点我进入☚☚ </el-link>
|
||||
<br />
|
||||
|
||||
【华为特惠专区,多款产品限时特价】
|
||||
<el-link
|
||||
href="https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=a53709d1-149d-49f4-9b89-bf62bd96ef65&utm_source=aGlkX3N0dnZkMWNxejBnOTJ5OA===&utm_medium=cps&utm_campaign=201905"
|
||||
type="primary"
|
||||
target="_blank"
|
||||
>
|
||||
☛☛点我进入☚☚
|
||||
</el-link>
|
||||
<br />
|
||||
【领取七牛云通用云产品优惠券】
|
||||
<el-link href="https://s.qiniu.com/FzEfay" type="primary" target="_blank"> ☛☛点我进入☚☚ </el-link>
|
||||
<br />
|
||||
【Gitee 企业版优惠专区】
|
||||
<el-link href="https://gitee.com/enterprises?invite_code=Z2l0ZWUtMTI1NzM1OQ%3D%3D" type="primary" target="_blank"> ☛☛点我进入☚☚ </el-link>
|
||||
<br />
|
||||
<h4 class="text-danger">云产品通用红包,可叠加官网常规优惠使用。(仅限新用户)</h4>
|
||||
</blockquote>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-row :gutter="20">
|
||||
<el-col :lg="16" :sm="24">
|
||||
<h2>ZRAdmin.NET后台管理框架</h2>
|
||||
<p>
|
||||
ZRAdmin.NET借鉴了很多开源项目的优点,让你开发Web管理系统更简单,所以我也把它给开源了(前端
|
||||
<code>vue页面</code>主要参考若依,在此表示感谢.)
|
||||
</p>
|
||||
<p>代码完全免费开源,易读易懂、界面简洁美观,给你的项目多一种选择与参考。</p>
|
||||
<p>
|
||||
<b>当前版本:</b> <span>v{{ version }}</span>
|
||||
<el-link
|
||||
class="ml10"
|
||||
type="primary"
|
||||
size="mini"
|
||||
icon="el-icon-document"
|
||||
plain
|
||||
@click="goTarget('http://www.izhaorui.cn/doc/changelog.html#' + version)"
|
||||
>更新日志
|
||||
</el-link>
|
||||
</p>
|
||||
<p>
|
||||
<el-button type="primary" size="mini" icon="el-icon-cloudy" plain @click="goTarget('https://gitee.com/izory/ZrAdminNetCore')"
|
||||
>访问码云
|
||||
</el-button>
|
||||
<el-button type="primary" size="mini" icon="el-icon-cloudy" plain @click="goTarget('https://github.com/izhaorui/ZrAdmin.NET')"
|
||||
>Github
|
||||
</el-button>
|
||||
</p>
|
||||
<p></p>
|
||||
<h3>如果觉得不错欢迎给个⭐Star⭐收藏一下 ,这样作者才有继续免费下去的动力,谢谢!</h3>
|
||||
</el-col>
|
||||
<el-col :sm="24" :lg="8">
|
||||
<el-row>
|
||||
<h2>技术选型</h2>
|
||||
<el-col :span="10">
|
||||
<h4>后端技术</h4>
|
||||
<ul>
|
||||
<li>NET5</li>
|
||||
<li>JWT</li>
|
||||
<li>SqlSugar</li>
|
||||
<li>Quartz.Net</li>
|
||||
<li>MySql</li>
|
||||
<li>Mapster</li>
|
||||
<li>Epplus</li>
|
||||
<li>Signalr</li>
|
||||
<li>...</li>
|
||||
</ul>
|
||||
</el-col>
|
||||
<el-col :span="10">
|
||||
<h4>前端技术</h4>
|
||||
<ul>
|
||||
<li>Vue</li>
|
||||
<li>Vuex</li>
|
||||
<li>Element-ui</li>
|
||||
<li>Axios</li>
|
||||
<li>Sass</li>
|
||||
<li>Quill</li>
|
||||
<li>...</li>
|
||||
</ul>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-divider />
|
||||
<el-row :gutter="20" class="mt10">
|
||||
<el-col :sm="24" :lg="8">
|
||||
<el-card>
|
||||
<div slot="header" class="clearfix">
|
||||
<span>联系信息</span>
|
||||
<div class="dashboard-editor-container home">
|
||||
<!-- 用户信息 -->
|
||||
<el-row :gutter="15">
|
||||
<el-col :md="24" :lg="16" :xl="16" class="mb10">
|
||||
<el-card shadow="hover">
|
||||
<div slot="header">
|
||||
<span>我的工作台</span>
|
||||
</div>
|
||||
<div class="body">
|
||||
<p>
|
||||
<i class="el-icon-s-promotion"></i>官网:
|
||||
<el-link href="http://www.izhaorui.cn/doc" target="_blank">http://www.izhaorui.cn/doc</el-link>
|
||||
</p>
|
||||
</div>
|
||||
<div class="body">
|
||||
<p>
|
||||
<i class="el-icon-user-solid"></i>QQ群:<a
|
||||
href="https://qm.qq.com/cgi-bin/qm/qr?k=Y__-fTGo_K2UIo3nWz7QnvS8LoRfPWKm&authKey=/ldXxiuolv80PF4yC8VtLk/TvAYbIhm2LKP8YVHCxAk+x2I+iqPAM1H/IsxQ+0gC&noverify=0"
|
||||
target="_black"
|
||||
>191349103</a
|
||||
>
|
||||
</p>
|
||||
<div class="user-item">
|
||||
<div class="user-item-left">
|
||||
<img :src="userInfo.avatar" />
|
||||
</div>
|
||||
|
||||
<div class="user-item-right overflow">
|
||||
<el-row>
|
||||
<el-col :xs="24" :md="24" class="right-title mb20 one-text-overflow">
|
||||
{{ userInfo.welcomeMessage }},{{ userInfo.nickName }},{{ userInfo.welcomeContent }}</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24">
|
||||
<el-col :xs="24" :md="8" class="right-l-v">
|
||||
<div class="right-label">昵称:</div>
|
||||
<div class="right-value">{{ userInfo.nickName }}</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :md="16" class="right-l-v">
|
||||
<div class="right-label">身份:</div>
|
||||
<div class="right-value">
|
||||
<span v-for="item in userInfo.roles" :key="item.roleId">{{ item.roleName }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-col>
|
||||
<el-col :md="24" class="mt10">
|
||||
<el-col :xs="24" :sm="12" :md="8" class="right-l-v">
|
||||
<div class="right-label one-text-overflow">IP:</div>
|
||||
<div class="right-value one-text-overflow">{{ userInfo.loginIP }}</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="16" class="right-l-v">
|
||||
<div class="right-label one-text-overflow">时间:</div>
|
||||
<div class="right-value one-text-overflow">{{ currentTime }}</div>
|
||||
</el-col>
|
||||
</el-col>
|
||||
<el-col :lg="24" class="mt10">
|
||||
<el-button size="small" icon="el-icon-edit-outline">
|
||||
<router-link to="/user/profile">修改信息</router-link>
|
||||
</el-button>
|
||||
<!-- <el-button size="small" icon="el-icon-position" type="primary">发布活动</el-button> -->
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :sm="24" :lg="8">
|
||||
<el-card>
|
||||
<div slot="header" class="clearfix">
|
||||
<span>捐赠支持</span>
|
||||
<el-col :md="24" :lg="8" :xl="8" class="mb10">
|
||||
<el-card shadow="hover">
|
||||
<div slot="header">
|
||||
<span>最新文章</span>
|
||||
<el-button class="home-card-more" type="text" @click="onOpenGitee">更多</el-button>
|
||||
</div>
|
||||
<div class="body">
|
||||
<div style="color: red">打赏作者喝杯咖啡表示鼓励</div>
|
||||
<img src="@/assets/image/reward.jpg" alt="donate" width="100%" />
|
||||
<div class="info">
|
||||
<Scroll :data="newArticleList" class="info-scroll" :class-option="optionSingleHeight">
|
||||
<ul class="info-ul">
|
||||
<li v-for="(v, k) in newArticleList" :key="k" class="info-item">
|
||||
<div class="info-item-left" v-text="v.title"></div>
|
||||
<div class="info-item-right" v-text="parseTime(v.updateTime, '{m}/{d}')"></div>
|
||||
</li>
|
||||
</ul>
|
||||
</Scroll>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :span="10">
|
||||
<!-- <el-card>
|
||||
<div slot="header" class="clearfix">
|
||||
<span></span>
|
||||
</div>
|
||||
</el-card> -->
|
||||
</el-row>
|
||||
<panel-group @handleSetLineChartData="handleSetLineChartData" />
|
||||
|
||||
<el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
|
||||
<line-chart :chart-data="lineChartData" />
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="32">
|
||||
<el-col :xs="24" :sm="24" :lg="8">
|
||||
<div class="chart-wrapper">
|
||||
<raddar-chart />
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :lg="8">
|
||||
<div class="chart-wrapper">
|
||||
<pie-chart />
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :lg="8">
|
||||
<div class="chart-wrapper">
|
||||
<bar-chart />
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<el-divider />
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
const defaultSettings = require('@/settings.js')
|
||||
import PanelGroup from './dashboard/PanelGroup'
|
||||
import LineChart from './dashboard/LineChart'
|
||||
import RaddarChart from './dashboard/RaddarChart'
|
||||
import PieChart from './dashboard/PieChart'
|
||||
import BarChart from './dashboard/BarChart'
|
||||
import Scroll from 'vue-seamless-scroll'
|
||||
import { listNewArticle } from '@/api/system/article.js'
|
||||
|
||||
const lineChartData = {
|
||||
newVisitis: {
|
||||
expectedData: [100, 120, 161, 134, 105, 160, 165],
|
||||
actualData: [120, 82, 91, 154, 162, 140, 145]
|
||||
},
|
||||
messages: {
|
||||
expectedData: [200, 192, 120, 144, 160, 130, 140],
|
||||
actualData: [180, 160, 151, 106, 145, 150, 130]
|
||||
},
|
||||
purchases: {
|
||||
expectedData: [80, 100, 121, 104, 105, 90, 100],
|
||||
actualData: [120, 90, 100, 138, 142, 130, 130]
|
||||
},
|
||||
shoppings: {
|
||||
expectedData: [130, 140, 141, 142, 145, 150, 160],
|
||||
actualData: [120, 82, 91, 154, 162, 140, 130]
|
||||
}
|
||||
}
|
||||
export default {
|
||||
name: 'index',
|
||||
data() {
|
||||
return {
|
||||
// 版本号
|
||||
version: defaultSettings.version,
|
||||
name: 'Index',
|
||||
components: {
|
||||
PanelGroup,
|
||||
LineChart,
|
||||
RaddarChart,
|
||||
PieChart,
|
||||
BarChart,
|
||||
Scroll
|
||||
},
|
||||
computed: {
|
||||
photo() {
|
||||
return this.$store.getters.photo
|
||||
},
|
||||
userInfo() {
|
||||
return this.$store.getters.userinfo
|
||||
},
|
||||
currentTime() {
|
||||
return this.parseTime(new Date())
|
||||
},
|
||||
optionSingleHeight() {
|
||||
return {
|
||||
step: 0.2, // 数值越大速度滚动越快
|
||||
limitMoveNum: 2, // 开始无缝滚动的数据量 this.dataList.length
|
||||
hoverStop: true, // 是否开启鼠标悬停stop
|
||||
direction: 1, // 0向下 1向上 2向左 3向右
|
||||
openWatch: true, // 开启数据实时监控刷新dom
|
||||
singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
|
||||
singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
|
||||
waitTime: 1000 // 单步运动停止的时间(默认值1000ms)
|
||||
}
|
||||
}
|
||||
},
|
||||
methods: {
|
||||
goTarget(href) {
|
||||
window.open(href, '_blank')
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
lineChartData: lineChartData.newVisitis,
|
||||
newArticleList: []
|
||||
}
|
||||
},
|
||||
created() {
|
||||
listNewArticle().then((res) => {
|
||||
this.newArticleList = res.data
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
handleSetLineChartData(type) {
|
||||
this.lineChartData = lineChartData[type]
|
||||
},
|
||||
onOpenGitee() {}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped lang="scss">
|
||||
.tip {
|
||||
color: red;
|
||||
display: inline-block;
|
||||
height: 30px;
|
||||
line-height: 30px;
|
||||
}
|
||||
<style lang="scss" scoped>
|
||||
.home {
|
||||
blockquote {
|
||||
padding: 10px 20px;
|
||||
margin: 0 0 20px;
|
||||
font-size: 17.5px;
|
||||
border-left: 5px solid #eee;
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
.home-card-more {
|
||||
float: right;
|
||||
padding: 3px 0;
|
||||
font-size: 13px;
|
||||
}
|
||||
hr {
|
||||
margin-top: 20px;
|
||||
margin-bottom: 20px;
|
||||
border: 0;
|
||||
border-top: 1px solid #eee;
|
||||
.home-card-time {
|
||||
float: right;
|
||||
font-size: 13px;
|
||||
width: 130px;
|
||||
margin-top: -4px;
|
||||
}
|
||||
.col-item {
|
||||
margin-bottom: 20px;
|
||||
}
|
||||
|
||||
ul {
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
}
|
||||
|
||||
font-family: 'open sans', 'Helvetica Neue', Helvetica, Arial, sans-serif;
|
||||
font-size: 13px;
|
||||
color: #676a6c;
|
||||
overflow-x: hidden;
|
||||
|
||||
ul {
|
||||
list-style-type: none;
|
||||
}
|
||||
|
||||
h4 {
|
||||
margin-top: 0px;
|
||||
}
|
||||
|
||||
h2 {
|
||||
margin-top: 10px;
|
||||
font-size: 26px;
|
||||
font-weight: 100;
|
||||
}
|
||||
|
||||
p {
|
||||
margin-top: 10px;
|
||||
|
||||
b {
|
||||
font-weight: 700;
|
||||
.user-item {
|
||||
height: 198px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.user-item-left {
|
||||
width: 100px;
|
||||
height: 130px;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.user-item-right {
|
||||
flex: 1;
|
||||
padding: 15px;
|
||||
.right-title {
|
||||
font-size: 20px;
|
||||
}
|
||||
.right-l-v {
|
||||
font-size: 13px;
|
||||
display: flex;
|
||||
.right-label {
|
||||
color: gray;
|
||||
width: 40px;
|
||||
}
|
||||
.right-value {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.update-log {
|
||||
ol {
|
||||
display: block;
|
||||
list-style-type: decimal;
|
||||
margin-block-start: 1em;
|
||||
margin-block-end: 1em;
|
||||
margin-inline-start: 0;
|
||||
margin-inline-end: 0;
|
||||
padding-inline-start: 40px;
|
||||
.info {
|
||||
height: 198px;
|
||||
.info-scroll {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
.info-ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
.info-item {
|
||||
display: flex;
|
||||
font-size: 13px;
|
||||
color: gray;
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
&:hover {
|
||||
color: var(--color-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.info-item-left {
|
||||
flex: 1;
|
||||
flex-shrink: 0;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
.info-item-right {
|
||||
width: 60px;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.home-recommend-row {
|
||||
.home-recommend {
|
||||
position: relative;
|
||||
height: 100px;
|
||||
color: #ffffff;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
i {
|
||||
right: 0px !important;
|
||||
bottom: 0px !important;
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
}
|
||||
i {
|
||||
position: absolute;
|
||||
right: -10px;
|
||||
bottom: -10px;
|
||||
font-size: 70px;
|
||||
transform: rotate(-30deg);
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
.home-recommend-auto {
|
||||
padding: 15px;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 5%;
|
||||
.home-recommend-msg {
|
||||
font-size: 12px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.charts {
|
||||
width: 100%;
|
||||
height: 282.6px;
|
||||
display: flex;
|
||||
padding: 12px 15px;
|
||||
.charts-left {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
}
|
||||
.charts-right {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.home-charts {
|
||||
height: 282.6px;
|
||||
.home-charts-item {
|
||||
background-color: #f5f5f5;
|
||||
padding: 19px 15px;
|
||||
border-radius: 2px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
cursor: pointer;
|
||||
&:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
&:hover {
|
||||
.home-charts-item-right {
|
||||
i {
|
||||
transform: rotate(45deg);
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
}
|
||||
}
|
||||
.home-charts-item-left {
|
||||
flex: 1;
|
||||
.home-charts-item-title {
|
||||
font-size: 13px;
|
||||
}
|
||||
.home-charts-item-num {
|
||||
font-size: 20px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
.home-charts-item-right {
|
||||
i {
|
||||
font-size: 20px;
|
||||
padding: 8px;
|
||||
border-radius: 100%;
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dashboard-editor-container {
|
||||
padding: 18px;
|
||||
background-color: rgb(240, 242, 245);
|
||||
position: relative;
|
||||
|
||||
.chart-wrapper {
|
||||
background: #fff;
|
||||
padding: 16px 16px 0;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.chart-wrapper {
|
||||
padding: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
|
||||
@ -1,367 +0,0 @@
|
||||
<template>
|
||||
<div class="dashboard-editor-container home">
|
||||
<!-- 用户信息 -->
|
||||
<el-row :gutter="15">
|
||||
<el-col :md="24" :lg="16" :xl="16" class="mb10">
|
||||
<el-card shadow="hover">
|
||||
<div slot="header">
|
||||
<span>我的工作台</span>
|
||||
</div>
|
||||
<div class="user-item">
|
||||
<div class="user-item-left">
|
||||
<img :src="userInfo.avatar" />
|
||||
</div>
|
||||
|
||||
<div class="user-item-right overflow">
|
||||
<el-row>
|
||||
<el-col :xs="24" :md="24" class="right-title mb20 one-text-overflow">
|
||||
{{ userInfo.welcomeMessage }},{{ userInfo.nickName }},{{ userInfo.welcomeContent }}</el-col>
|
||||
<el-col :xs="24" :sm="24" :md="24">
|
||||
<el-col :xs="24" :md="8" class="right-l-v">
|
||||
<div class="right-label">昵称:</div>
|
||||
<div class="right-value">{{ userInfo.nickName }}</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :md="16" class="right-l-v">
|
||||
<div class="right-label">身份:</div>
|
||||
<div class="right-value">
|
||||
<span v-for="item in userInfo.roles" :key="item.roleId">{{ item.roleName }}</span>
|
||||
</div>
|
||||
</el-col>
|
||||
</el-col>
|
||||
<el-col :md="24" class="mt10">
|
||||
<el-col :xs="24" :sm="12" :md="8" class="right-l-v">
|
||||
<div class="right-label one-text-overflow">IP:</div>
|
||||
<div class="right-value one-text-overflow">{{ userInfo.loginIP }}</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="12" :md="16" class="right-l-v">
|
||||
<div class="right-label one-text-overflow">时间:</div>
|
||||
<div class="right-value one-text-overflow">{{ currentTime }}</div>
|
||||
</el-col>
|
||||
</el-col>
|
||||
<el-col :lg="24" class="mt10">
|
||||
<el-button size="small" icon="el-icon-edit-outline">
|
||||
<router-link to="/user/profile">修改信息</router-link>
|
||||
</el-button>
|
||||
<!-- <el-button size="small" icon="el-icon-position" type="primary">发布活动</el-button> -->
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
<el-col :md="24" :lg="8" :xl="8" class="mb10">
|
||||
<el-card shadow="hover">
|
||||
<div slot="header">
|
||||
<span>最新文章</span>
|
||||
<el-button class="home-card-more" type="text" @click="onOpenGitee">更多</el-button>
|
||||
</div>
|
||||
<div class="info">
|
||||
<Scroll :data="newArticleList" class="info-scroll" :class-option="optionSingleHeight">
|
||||
<ul class="info-ul">
|
||||
<li v-for="(v, k) in newArticleList" :key="k" class="info-item">
|
||||
<div class="info-item-left" v-text="v.title"></div>
|
||||
<div class="info-item-right" v-text="parseTime(v.updateTime, '{m}/{d}')"></div>
|
||||
</li>
|
||||
</ul>
|
||||
</Scroll>
|
||||
</div>
|
||||
</el-card>
|
||||
</el-col>
|
||||
</el-row>
|
||||
<panel-group @handleSetLineChartData="handleSetLineChartData" />
|
||||
|
||||
<el-row style="background:#fff;padding:16px 16px 0;margin-bottom:32px;">
|
||||
<line-chart :chart-data="lineChartData" />
|
||||
</el-row>
|
||||
|
||||
<el-row :gutter="32">
|
||||
<el-col :xs="24" :sm="24" :lg="8">
|
||||
<div class="chart-wrapper">
|
||||
<raddar-chart />
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :lg="8">
|
||||
<div class="chart-wrapper">
|
||||
<pie-chart />
|
||||
</div>
|
||||
</el-col>
|
||||
<el-col :xs="24" :sm="24" :lg="8">
|
||||
<div class="chart-wrapper">
|
||||
<bar-chart />
|
||||
</div>
|
||||
</el-col>
|
||||
</el-row>
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<script>
|
||||
import PanelGroup from './dashboard/PanelGroup'
|
||||
import LineChart from './dashboard/LineChart'
|
||||
import RaddarChart from './dashboard/RaddarChart'
|
||||
import PieChart from './dashboard/PieChart'
|
||||
import BarChart from './dashboard/BarChart'
|
||||
import Scroll from 'vue-seamless-scroll'
|
||||
import { listNewArticle } from '@/api/system/article.js'
|
||||
|
||||
const lineChartData = {
|
||||
newVisitis: {
|
||||
expectedData: [100, 120, 161, 134, 105, 160, 165],
|
||||
actualData: [120, 82, 91, 154, 162, 140, 145]
|
||||
},
|
||||
messages: {
|
||||
expectedData: [200, 192, 120, 144, 160, 130, 140],
|
||||
actualData: [180, 160, 151, 106, 145, 150, 130]
|
||||
},
|
||||
purchases: {
|
||||
expectedData: [80, 100, 121, 104, 105, 90, 100],
|
||||
actualData: [120, 90, 100, 138, 142, 130, 130]
|
||||
},
|
||||
shoppings: {
|
||||
expectedData: [130, 140, 141, 142, 145, 150, 160],
|
||||
actualData: [120, 82, 91, 154, 162, 140, 130]
|
||||
}
|
||||
}
|
||||
export default {
|
||||
name: 'Index',
|
||||
components: {
|
||||
PanelGroup,
|
||||
LineChart,
|
||||
RaddarChart,
|
||||
PieChart,
|
||||
BarChart,
|
||||
Scroll
|
||||
},
|
||||
computed: {
|
||||
photo() {
|
||||
return this.$store.getters.photo
|
||||
},
|
||||
userInfo() {
|
||||
return this.$store.getters.userinfo
|
||||
},
|
||||
currentTime() {
|
||||
return this.parseTime(new Date())
|
||||
},
|
||||
optionSingleHeight() {
|
||||
return {
|
||||
step: 0.2, // 数值越大速度滚动越快
|
||||
limitMoveNum: 2, // 开始无缝滚动的数据量 this.dataList.length
|
||||
hoverStop: true, // 是否开启鼠标悬停stop
|
||||
direction: 1, // 0向下 1向上 2向左 3向右
|
||||
openWatch: true, // 开启数据实时监控刷新dom
|
||||
singleHeight: 0, // 单步运动停止的高度(默认值0是无缝不停止的滚动) direction => 0/1
|
||||
singleWidth: 0, // 单步运动停止的宽度(默认值0是无缝不停止的滚动) direction => 2/3
|
||||
waitTime: 1000 // 单步运动停止的时间(默认值1000ms)
|
||||
}
|
||||
}
|
||||
},
|
||||
data() {
|
||||
return {
|
||||
lineChartData: lineChartData.newVisitis,
|
||||
newArticleList: []
|
||||
}
|
||||
},
|
||||
created() {
|
||||
listNewArticle().then((res) => {
|
||||
this.newArticleList = res.data
|
||||
})
|
||||
},
|
||||
methods: {
|
||||
handleSetLineChartData(type) {
|
||||
this.lineChartData = lineChartData[type]
|
||||
},
|
||||
onOpenGitee() {}
|
||||
}
|
||||
}
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.home {
|
||||
width: 100%;
|
||||
overflow: hidden;
|
||||
.home-card-more {
|
||||
float: right;
|
||||
padding: 3px 0;
|
||||
font-size: 13px;
|
||||
}
|
||||
.home-card-time {
|
||||
float: right;
|
||||
font-size: 13px;
|
||||
width: 130px;
|
||||
margin-top: -4px;
|
||||
}
|
||||
.user-item {
|
||||
height: 198px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
.user-item-left {
|
||||
width: 100px;
|
||||
height: 130px;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
img {
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.user-item-right {
|
||||
flex: 1;
|
||||
padding: 15px;
|
||||
.right-title {
|
||||
font-size: 20px;
|
||||
}
|
||||
.right-l-v {
|
||||
font-size: 13px;
|
||||
display: flex;
|
||||
.right-label {
|
||||
color: gray;
|
||||
width: 40px;
|
||||
}
|
||||
.right-value {
|
||||
flex: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.info {
|
||||
height: 198px;
|
||||
.info-scroll {
|
||||
height: 100%;
|
||||
overflow: hidden;
|
||||
.info-ul {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
.info-item {
|
||||
display: flex;
|
||||
font-size: 13px;
|
||||
color: gray;
|
||||
height: 28px;
|
||||
line-height: 28px;
|
||||
&:hover {
|
||||
color: var(--color-primary);
|
||||
cursor: pointer;
|
||||
}
|
||||
.info-item-left {
|
||||
flex: 1;
|
||||
flex-shrink: 0;
|
||||
text-overflow: ellipsis;
|
||||
white-space: nowrap;
|
||||
overflow: hidden;
|
||||
}
|
||||
.info-item-right {
|
||||
width: 60px;
|
||||
text-align: right;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.home-recommend-row {
|
||||
.home-recommend {
|
||||
position: relative;
|
||||
height: 100px;
|
||||
color: #ffffff;
|
||||
border-radius: 4px;
|
||||
overflow: hidden;
|
||||
cursor: pointer;
|
||||
&:hover {
|
||||
i {
|
||||
right: 0px !important;
|
||||
bottom: 0px !important;
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
}
|
||||
i {
|
||||
position: absolute;
|
||||
right: -10px;
|
||||
bottom: -10px;
|
||||
font-size: 70px;
|
||||
transform: rotate(-30deg);
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
.home-recommend-auto {
|
||||
padding: 15px;
|
||||
position: absolute;
|
||||
left: 0;
|
||||
top: 5%;
|
||||
.home-recommend-msg {
|
||||
font-size: 12px;
|
||||
margin-top: 10px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
.charts {
|
||||
width: 100%;
|
||||
height: 282.6px;
|
||||
display: flex;
|
||||
padding: 12px 15px;
|
||||
.charts-left {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
}
|
||||
.charts-right {
|
||||
flex: 1;
|
||||
height: 100%;
|
||||
}
|
||||
}
|
||||
.home-charts {
|
||||
height: 282.6px;
|
||||
.home-charts-item {
|
||||
background-color: #f5f5f5;
|
||||
padding: 19px 15px;
|
||||
border-radius: 2px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
margin-bottom: 12px;
|
||||
cursor: pointer;
|
||||
&:last-of-type {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
&:hover {
|
||||
.home-charts-item-right {
|
||||
i {
|
||||
transform: rotate(45deg);
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
}
|
||||
}
|
||||
.home-charts-item-left {
|
||||
flex: 1;
|
||||
.home-charts-item-title {
|
||||
font-size: 13px;
|
||||
}
|
||||
.home-charts-item-num {
|
||||
font-size: 20px;
|
||||
margin-top: 5px;
|
||||
}
|
||||
}
|
||||
.home-charts-item-right {
|
||||
i {
|
||||
font-size: 20px;
|
||||
padding: 8px;
|
||||
border-radius: 100%;
|
||||
transition: all ease 0.3s;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.dashboard-editor-container {
|
||||
padding: 18px;
|
||||
background-color: rgb(240, 242, 245);
|
||||
position: relative;
|
||||
|
||||
.chart-wrapper {
|
||||
background: #fff;
|
||||
padding: 16px 16px 0;
|
||||
margin-bottom: 32px;
|
||||
}
|
||||
}
|
||||
|
||||
@media (max-width: 1024px) {
|
||||
.chart-wrapper {
|
||||
padding: 8px;
|
||||
}
|
||||
}
|
||||
</style>
|
||||
@ -1,43 +1,82 @@
|
||||
<!--
|
||||
* @Author: 许前浩
|
||||
* @Date: 2023-04-20 09:07:18
|
||||
* @LastEditors: 许前浩
|
||||
* @LastEditTime: 2023-04-21 10:56:59
|
||||
* @Description: file content
|
||||
* @FilePath: \ZR.Vue\src\views\login.vue
|
||||
-->
|
||||
<template>
|
||||
<div class="login">
|
||||
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
|
||||
<h3 class="title">{{ title }}</h3>
|
||||
<el-form-item prop="username">
|
||||
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
|
||||
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="password">
|
||||
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码" @keyup.enter.native="handleLogin">
|
||||
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="code" v-if="showCaptcha != 'off'">
|
||||
<el-input
|
||||
v-model="loginForm.code"
|
||||
auto-complete="off"
|
||||
placeholder="验证码"
|
||||
style="width: 63%"
|
||||
@keyup.enter.native="handleLogin"
|
||||
ref="codeTxt"
|
||||
>
|
||||
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
|
||||
</el-input>
|
||||
<div class="login-code">
|
||||
<img :src="codeUrl" @click="getCode" class="login-code-img" />
|
||||
<!-- <div class="welcome">
|
||||
<el-image :src="DoanIcon" :fit="fit" style="width: 40px; height: 35px; margin: 0 atuo"> </el-image>
|
||||
{{ title }}
|
||||
</div> -->
|
||||
<div class="bluebackground">
|
||||
<div style="width: 50%">
|
||||
<div style="height: 90px"></div>
|
||||
<div class="bigtitle">MES管理系统</div>
|
||||
<div class="smallTitle">
|
||||
苏州道安自动化技术有限公司成立于2009年7月,公司在苏州新加坡工业园区注册成立,是一家专业从事于装配和测试的民营企业。
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">记住密码</el-checkbox>
|
||||
<el-form-item style="width: 100%">
|
||||
<el-button :loading="loading" size="medium" type="primary" style="width: 100%" @click.native.prevent="handleLogin">
|
||||
<span v-if="!loading">登 录</span>
|
||||
<span v-else>登 录 中...</span>
|
||||
</el-button>
|
||||
<div style="float: right">
|
||||
<router-link class="link-type" :to="'/register'">还没有账号?立即注册</router-link>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
|
||||
<div class="contain">
|
||||
<el-form ref="loginForm" :model="loginForm" :rules="loginRules" class="login-form">
|
||||
<div style="height: 30px"></div>
|
||||
|
||||
<h3 class="title">
|
||||
<svg class="icon_title" aria-hidden="true">
|
||||
<use xlink:href="#icon-gongyezidonghua" /></svg
|
||||
>用户登陆
|
||||
</h3>
|
||||
<el-form-item prop="username">
|
||||
<el-input v-model="loginForm.username" type="text" auto-complete="off" placeholder="账号">
|
||||
<svg-icon slot="prefix" icon-class="user" class="el-input__icon input-icon" />
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="password">
|
||||
<el-input v-model="loginForm.password" type="password" auto-complete="off" placeholder="密码" @keyup.enter.native="handleLogin">
|
||||
<svg-icon slot="prefix" icon-class="password" class="el-input__icon input-icon" />
|
||||
</el-input>
|
||||
</el-form-item>
|
||||
<el-form-item prop="code" v-if="showCaptcha != 'off'">
|
||||
<el-input
|
||||
v-model="loginForm.code"
|
||||
auto-complete="off"
|
||||
placeholder="验证码"
|
||||
style="width: 63%"
|
||||
@keyup.enter.native="handleLogin"
|
||||
ref="codeTxt"
|
||||
>
|
||||
<svg-icon slot="prefix" icon-class="validCode" class="el-input__icon input-icon" />
|
||||
</el-input>
|
||||
<div class="login-code">
|
||||
<img :src="codeUrl" @click="getCode" class="login-code-img" />
|
||||
</div>
|
||||
</el-form-item>
|
||||
<el-checkbox v-model="loginForm.rememberMe" style="margin: 0px 0px 25px 0px">记住密码</el-checkbox>
|
||||
<el-form-item style="width: 100%; margin: auto 0">
|
||||
<el-button
|
||||
:loading="loading"
|
||||
size="medium"
|
||||
round
|
||||
style="width: 90%; margin: auto 0;"
|
||||
@click.native.prevent="handleLogin"
|
||||
|
||||
>
|
||||
<span v-if="!loading">登 录</span>
|
||||
<span v-else>登 录 中...</span>
|
||||
</el-button>
|
||||
|
||||
<div style="float: right">
|
||||
<router-link class="link-type" :to="'/register'">还没有账号?立即注册</router-link>
|
||||
</div>
|
||||
</el-form-item>
|
||||
</el-form>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- 底部 -->
|
||||
<div class="el-login-footer">
|
||||
<span>{{ copyRight }}</span>
|
||||
@ -50,11 +89,16 @@ import { getCodeImg } from '@/api/system/login'
|
||||
import Cookies from 'js-cookie'
|
||||
import defaultSettings from '@/settings'
|
||||
import { encrypt, decrypt } from '@/utils/jsencrypt'
|
||||
import imageUrl from '@/assets/image/login-pic03.png'
|
||||
import DoanIcon from '@/assets/logo/logo.png'
|
||||
import '@/assets/iconfont/login/iconfont.js'
|
||||
|
||||
export default {
|
||||
name: 'Login',
|
||||
data() {
|
||||
return {
|
||||
DoanIcon: DoanIcon,
|
||||
imageUrl: imageUrl,
|
||||
codeUrl: '',
|
||||
cookiePassword: '',
|
||||
loginForm: {
|
||||
@ -154,55 +198,100 @@ export default {
|
||||
}
|
||||
</script>
|
||||
|
||||
<style scoped rel="stylesheet/scss" lang="scss">
|
||||
<style scoped rel="stylesheet/scss" lang="scss" scoped>
|
||||
.login {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
align-items: center;
|
||||
position: fixed;
|
||||
height: 100%;
|
||||
background-image: url('../assets/image/login-background.jpg');
|
||||
width: 100%;
|
||||
background-image: url('../assets/logo/background.png');
|
||||
//background: #141e47;
|
||||
background-size: cover;
|
||||
// background-color: rgba(56, 157, 170, 0.82);
|
||||
}
|
||||
.title {
|
||||
margin: 0px auto 30px auto;
|
||||
text-align: center;
|
||||
// color: #707070;
|
||||
color: #fff;
|
||||
}
|
||||
.bluebackground {
|
||||
height: 320px;
|
||||
width: 600px;
|
||||
background: #203589;
|
||||
border-radius: 10px;
|
||||
margin-left: 50%;
|
||||
margin-top: 13%;
|
||||
.bigtitle {
|
||||
color: #fff;
|
||||
font-size: 25px;
|
||||
font-family: 'Helvetica Neue', Helvetica, 'PingFang SC', 'Hiragino Sans GB', 'Microsoft YaHei', '微软雅黑', Arial, sans-serif;
|
||||
margin-left: 10px;
|
||||
margin-bottom: 30px;
|
||||
}
|
||||
.smallTitle {
|
||||
color: #fff;
|
||||
font-size: 12px;
|
||||
font-family: '幼圆';
|
||||
margin-left: 10px;
|
||||
width: 250px;
|
||||
}
|
||||
.contain {
|
||||
position: relative;
|
||||
border-radius: 6px;
|
||||
top: -240px;
|
||||
left: 270px;
|
||||
background: #fff;
|
||||
width: 300px;
|
||||
height: 420px;
|
||||
.login-form {
|
||||
border-radius: 6px;
|
||||
height: inherit;
|
||||
width: 90%;
|
||||
margin: 0 auto;
|
||||
.el-input {
|
||||
height: 38px;
|
||||
|
||||
.login-form {
|
||||
border-radius: 6px;
|
||||
// background: #ffffff;
|
||||
background-color: hsla(0, 0%, 100%, 0.3);
|
||||
width: 310px;
|
||||
padding: 25px 25px 5px 25px;
|
||||
.el-input {
|
||||
height: 38px;
|
||||
input {
|
||||
height: 38px;
|
||||
input {
|
||||
height: 38px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.welcome {
|
||||
width: 880px;
|
||||
margin: 0px auto 50px;
|
||||
text-align: center;
|
||||
font-size: 28px;
|
||||
font-weight: bold;
|
||||
color: #f6f0f0;
|
||||
}
|
||||
|
||||
.title {
|
||||
margin: 0px auto 30px auto;
|
||||
text-align: center;
|
||||
// color: #707070;
|
||||
color: #203589;
|
||||
}
|
||||
|
||||
.input-icon {
|
||||
height: 39px;
|
||||
width: 14px;
|
||||
margin-left: 2px;
|
||||
}
|
||||
}
|
||||
|
||||
.login-tip {
|
||||
font-size: 13px;
|
||||
text-align: center;
|
||||
color: #bfbfbf;
|
||||
}
|
||||
|
||||
.login-code {
|
||||
width: 33%;
|
||||
height: 38px;
|
||||
float: right;
|
||||
|
||||
img {
|
||||
cursor: pointer;
|
||||
vertical-align: middle;
|
||||
}
|
||||
}
|
||||
|
||||
.el-login-footer {
|
||||
height: 40px;
|
||||
line-height: 40px;
|
||||
@ -215,7 +304,15 @@ export default {
|
||||
font-size: 12px;
|
||||
letter-spacing: 1px;
|
||||
}
|
||||
|
||||
.login-code-img {
|
||||
height: 38px;
|
||||
width: 80px;
|
||||
}
|
||||
.icon_title {
|
||||
width: 2em;
|
||||
height: 2em;
|
||||
vertical-align: -0.15em;
|
||||
overflow: hidden;
|
||||
}
|
||||
</style>
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user