'admin-21.03.09:更新最新依赖、添加二维码,表单,列表等示例'

This commit is contained in:
lyt 2021-03-09 13:16:04 +08:00
parent 1dcea813f3
commit ba61840ed6
9 changed files with 500 additions and 5 deletions

View File

@ -116,6 +116,7 @@ cnpm run build
- <a href="https://github.com/wangeditor-team/wangEditor" target="_blank">wangeditor</a>
- <a href="https://github.com/fengyuanchen/cropperjs" target="_blank">cropperjs</a>
- <a href="https://github.com/antvis/g6" target="_blank">@antv/g6</a>
- <a href="https://github.com/davidshimjs/qrcodejs" target="_blank">qrcodejs</a>
#### 特别感谢

View File

@ -7,7 +7,7 @@
},
"dependencies": {
"axios": "^0.21.1",
"clipboard": "^2.0.6",
"clipboard": "^2.0.7",
"countup.js": "^2.0.7",
"cropperjs": "^1.5.11",
"echarts": "^5.0.2",
@ -25,7 +25,7 @@
"devDependencies": {
"@types/axios": "^0.14.0",
"@types/clipboard": "^2.0.1",
"@types/node": "^14.14.31",
"@types/node": "^14.14.32",
"@types/nprogress": "^0.2.0",
"@types/sortablejs": "^1.10.6",
"@vitejs/plugin-vue": "^1.1.5",

View File

@ -421,6 +421,21 @@ export const dynamicRoutes = [
auth: ['admin', 'test'],
icon: 'iconfont icon-siweidaotu'
}
},
{
path: '/fun/qrcode',
name: 'qrcode',
component: () => import('/@/views/fun/qrcode/index.vue'),
meta: {
title: 'qrcode 二维码生成',
isLink: '',
isHide: false,
isKeepAlive: true,
isAffix: false,
isIframe: false,
auth: ['admin', 'test'],
icon: 'iconfont icon-ico'
}
}
]
},
@ -515,6 +530,36 @@ export const dynamicRoutes = [
icon: 'iconfont icon-jiliandongxuanzeqi'
}
},
{
path: '/pages/formAdapt',
name: 'formAdapt',
component: () => import('/@/views/pages/formAdapt/index.vue'),
meta: {
title: '表单自适应',
isLink: '',
isHide: false,
isKeepAlive: true,
isAffix: false,
isIframe: false,
auth: ['admin', 'test'],
icon: 'iconfont icon-biaodan'
}
},
{
path: '/pages/listAdapt',
name: 'listAdapt',
component: () => import('/@/views/pages/listAdapt/index.vue'),
meta: {
title: '列表自适应',
isLink: '',
isHide: false,
isKeepAlive: true,
isAffix: false,
isIframe: false,
auth: ['admin', 'test'],
icon: 'iconfont icon-chazhaobiaodanliebiao'
}
},
]
},
{

View File

@ -1,11 +1,12 @@
// 字体图标 url
const cssCdnUrlList: Array<string> = [
'//at.alicdn.com/t/font_2298093_eee6zjvjt5a.css',
'//at.alicdn.com/t/font_2298093_n459lh5kpoh.css',
'//netdna.bootstrapcdn.com/font-awesome/4.7.0/css/font-awesome.min.css'
]
// 第三方 js url
const jsCdnUrlList: Array<string> = [
'https://gw.alipayobjects.com/os/antv/pkg/_antv.g6-3.8.1/dist/g6.min.js'
'https://gw.alipayobjects.com/os/antv/pkg/_antv.g6-3.8.1/dist/g6.min.js',
'http://static.runoob.com/assets/qrcode/qrcode.min.js'
]
// 动态设置字体图标

View File

@ -0,0 +1,67 @@
<template>
<div class="qrcode-container">
<el-card shadow="hover" header="qrcodejs2 二维码生成">
<el-alert title="感谢优秀的 `qrcodejs2`项目地址https://github.com/davidshimjs/qrcodejs" type="success" :closable="false"
class="mb15"></el-alert>
<div class="qrcode-img-warp">
<div class="mb30 mt30 qrcode-img">
<div id="qrcode"></div>
</div>
<el-button type="primary" icon="el-icon-refresh" size="small" @click="onInitQrcode">重新生成</el-button>
</div>
</el-card>
</div>
</template>
<script lang="ts">
import { toRefs, reactive, onMounted } from "vue";
export default {
name: "qrcode",
setup() {
const state = reactive({
qrcode: "",
});
//
const initQrcode = () => {
new QRCode(document.getElementById("qrcode"), {
text: `https://lyt-top.gitee.io/vue-next-admin-preview/#/login?t=${new Date().getTime()}`,
width: 125,
height: 125,
colorDark: "#000000",
colorLight: "#ffffff",
});
};
//
const onInitQrcode = () => {
document.getElementById("qrcode").innerHTML = "";
initQrcode();
};
//
onMounted(() => {
initQrcode();
});
return {
onInitQrcode,
...toRefs(state),
};
},
};
</script>
<style scoped lang="scss">
.qrcode-container {
.qrcode-img-warp {
text-align: center;
.qrcode-img {
display: flex;
width: 100%;
height: 125px;
#qrcode {
margin: auto;
width: 125px;
height: 125px;
}
}
}
}
</style>

View File

@ -0,0 +1,97 @@
<template>
<div class="form-adapt-container">
<el-card shadow="hover" header="表单自适应演示(改变窗口查看效果)">
<el-form :model="form" size="small" label-width="100px" class="mt35 mb35">
<el-row :gutter="35">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="姓名">
<el-input v-model="form.name" placeholder="请输入姓名" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="用户归属部门">
<el-input v-model="form.email" placeholder="请输入用户归属部门" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="登陆账户名">
<el-input v-model="form.autograph" placeholder="请输入登陆账户名" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="职务">
<el-select v-model="form.occupation" placeholder="请选择职务" clearable class="w100">
<el-option label="计算机 / 互联网 / 通信" value="1"></el-option>
<el-option label="生产 / 工艺 / 制造" value="2"></el-option>
<el-option label="医疗 / 护理 / 制药" value="3"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="手机">
<el-input v-model="form.phone" placeholder="请输入手机" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="性别">
<el-select v-model="form.sex" placeholder="请选择性别" clearable class="w100">
<el-option label="男" value="1"></el-option>
<el-option label="女" value="2"></el-option>
</el-select>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="登录密码">
<el-input v-model="form.phone1" placeholder="请输入登录密码" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="权限角色">
<el-input v-model="form.phone2" placeholder="请输入权限角色" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="创建用户">
<el-input v-model="form.phone3" placeholder="请输入创建用户" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="修改用户">
<el-input v-model="form.phone4" placeholder="请输入修改用户" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="所属用户">
<el-input v-model="form.phone5" placeholder="请输入所属用户" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb20">
<el-form-item label="所属部门">
<el-input v-model="form.phone6" placeholder="请输入所属部门" clearable></el-input>
</el-form-item>
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-form-item>
<el-button type="primary" icon="el-icon-position">更新个人信息</el-button>
</el-form-item>
</el-col>
</el-row>
</el-form>
</el-card>
</div>
</template>
<script lang="ts">
import { toRefs, reactive } from "vue";
export default {
name: "formAdapt",
setup() {
const state = reactive({
form: {},
});
return {
...toRefs(state),
};
},
};
</script>

View File

@ -0,0 +1,170 @@
<template>
<div class="list-adapt-container">
<el-card shadow="hover" header="列表自适应演示(改变窗口查看效果)">
<div class="flex-warp" v-if="tableData.data.length > 0">
<el-row :gutter="15">
<el-col :xs="24" :sm="12" :md="8" :lg="6" :xl="4" class="mb15" v-for="(v,k) in tableData.data" :key="k"
@click="onTableItemClick(v)">
<div class="flex-warp-item">
<div class="flex-warp-item-box">
<div class="item-img">
<img :src="v.img" />
</div>
<div class="item-txt">
<div class="item-txt-title">{{v.title}}</div>
<div class="item-txt-other">
<div style="width: 100%;">
<div class="item-txt-msg mb10">
<span>评价 {{v.evaluate}}</span>
<span class="ml10">收藏 {{v.collection}}</span>
</div>
<div class="item-txt-msg item-txt-price">
<span class="font-price">
<span></span>
<span class="font">{{v.price}}</span>
</span>
<span>月销{{v.monSales}}</span>
</div>
</div>
</div>
</div>
</div>
</div>
</el-col>
</el-row>
</div>
<el-empty v-else description="暂无数据"></el-empty>
<template v-if="tableData.data.length > 0">
<el-pagination style="text-align: right;" background @size-change="onHandleSizeChange"
@current-change="onHandleCurrentChange" :page-sizes="[10, 20, 30]" :current-page="tableData.param.pageNum"
:page-size="tableData.param.pageSize" layout="total, sizes, prev, pager, next, jumper"
:total="tableData.total">
</el-pagination>
</template>
</el-card>
</div>
</template>
<script lang="ts">
import { toRefs, reactive } from "vue";
import { filterList } from "./mock.ts";
export default {
name: "listAdapt",
setup() {
const state = reactive({
tableData: {
data: filterList,
total: 99,
loading: false,
param: {
pageNum: 1,
pageSize: 10,
},
},
});
//
const onHandleSizeChange = (val) => {
state.tableData.param.pageSize = val;
};
//
const onHandleCurrentChange = (val) => {
state.tableData.param.pageNum = val;
};
return {
onHandleSizeChange,
onHandleCurrentChange,
...toRefs(state),
};
},
};
</script>
<style scoped lang="scss">
.flex-warp {
display: flex;
flex-wrap: wrap;
align-content: flex-start;
margin: 0 -5px;
.flex-warp-item {
padding: 5px;
width: 100%;
height: 360px;
.flex-warp-item-box {
border: 1px solid #ebeef5;
width: 100%;
height: 100%;
border-radius: 2px;
display: flex;
flex-direction: column;
transition: all 0.3s ease;
&:hover {
cursor: pointer;
border: 1px solid var(--color-primary);
transition: all 0.3s ease;
box-shadow: 0 2px 12px 0 rgba(0, 0, 0, 0.03);
.item-txt-title {
color: var(--color-primary) !important;
transition: all 0.3s ease;
}
.item-img {
img {
transition: all 0.3s ease;
transform: translateZ(0) scale(1.05);
}
}
}
.item-img {
width: 100%;
height: 215px;
overflow: hidden;
img {
transition: all 0.3s ease;
width: 100%;
height: 100%;
}
}
.item-txt {
flex: 1;
padding: 15px;
display: flex;
flex-direction: column;
overflow: hidden;
.item-txt-title {
text-overflow: ellipsis;
overflow: hidden;
-webkit-line-clamp: 2;
-webkit-box-orient: vertical;
display: -webkit-box;
color: #666666;
transition: all 0.3s ease;
&:hover {
color: var(--color-primary);
text-decoration: underline;
transition: all 0.3s ease;
}
}
.item-txt-other {
flex: 1;
align-items: flex-end;
display: flex;
.item-txt-msg {
font-size: 12px;
color: #8d8d91;
}
.item-txt-price {
display: flex;
justify-content: space-between;
align-items: center;
.font-price {
color: #ff5000;
.font {
font-size: 22px;
}
}
}
}
}
}
}
}
</style>

View File

@ -0,0 +1,114 @@
// 列表数据
export const filterList = [
{
img:
"https://news.sznews.com/pic/2021-03/09/e37326cc-4583-48f3-aa00-ecc2392d319d.jpg",
title: "36分钟深圳平均通勤时间出炉GDP10强城市中仅输杭州",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 1,
isShowMore: false
},
{
img:
"http://news.sznews.com/pic/2021-03/09/78cf72b6-e2d9-459d-a368-470414a027f4679cf4ea-26fa-48c8-9fee-c2d092a91400.png",
title: "为爱而动,“红色鹊桥”三八妇女节交友联谊活动助力深圳女孩脱单",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 2,
isShowMore: false
},
{
img:
"http://news.sznews.com/pic/2021-03/09/1faf3c6e-1250-4e6b-b072-4a331553e027.jpg",
title:
"粤桂协作“背水一战” 解决广西大化县3.7万人饮水难题",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 3,
isShowMore: false
},
{
img:
"https://news.sznews.com/pic/2021-03/09/9fcf6dd4-1e80-4497-bdc9-83dc7246d170.jpg.2",
title: "城镇就业女性平均薪酬6847元 女性职场渗透率提升",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 4,
isShowMore: false
},
{
img:
"https://news.sznews.com/pic/2021-03/09/1bd78227-4126-4a43-bdf6-48ead6edd1bf.jpg.2",
title: "深圳实现“从0到1”源头创新推进大湾区综合性国家科学中心建设",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 5,
isShowMore: false
},
{
img:
"http://news.sznews.com/pic/2021-03/08/9ea943a3-3ae8-4f49-8296-711ec36ef8c6_watermark.png",
title: "煖声音第126期|愿你有诗酒趁年华的洒脱,也有岁月沉淀后的坚定从容",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 6,
isShowMore: false
},
{
img:
"https://news.sznews.com/pic/2021-03/08/a95ba232-1422-4f7e-b85f-c61d486c8659.jpg.2",
title: "姐妹们一起来吐槽,最不能接受男人的缺点!",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 7,
isShowMore: false
},
{
img:
"http://news.sznews.com/pic/2021-03/08/76816bf0-3899-4c7e-bc6e-079b5ba8725e.jpg",
title: "民生小事 | 手机遗落出租车 热心民警帮找回",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 8,
isShowMore: false
},
{
img:
"https://news.sznews.com/pic/2021-03/08/28ed70d4-71f5-4abb-bf7b-0294bece9e43.jpg.2",
title: "“十三五”:深圳交上靓丽答卷 发展动力加快转换",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 9,
isShowMore: false
},
{
img:
"http://news.sznews.com/pic/2021-03/05/d13ae31f-fd45-431a-b48e-c5895bbc193e.png",
title: "深圳湾公园一女子落水,三名男子接力及时施救",
evaluate: (Math.random() * 10).toFixed(2),
collection: (Math.random() * 100).toFixed(2),
price: (Math.random() * 10).toFixed(2),
monSales: (Math.random() * 20).toFixed(2),
id: 10,
isShowMore: false
},
];

View File

@ -125,7 +125,7 @@
</el-col>
<el-col :xs="24" :sm="24" :md="24" :lg="24" :xl="24">
<el-form-item>
<el-button type="primary">更新个人信息</el-button>
<el-button type="primary" icon="el-icon-position">更新个人信息</el-button>
</el-form-item>
</el-col>
</el-row>