Browse Source

主题库

dev
xuhuajiao 3 years ago
parent
commit
e8bf024453
  1. 2
      src/assets/icons/iconfont.js
  2. 264
      src/assets/styles/adminIndex.scss
  3. 10
      src/assets/styles/iconfont.css
  4. 97
      src/views/ThemeGallery/index.vue
  5. 250
      src/views/components/ThemeGalleryList.vue
  6. 7
      src/views/dashboard/HomeThemeGallery.vue
  7. 54
      src/views/immediateRelease/index.vue
  8. 15
      src/views/materialContent/index.vue
  9. 96
      src/views/materialContent/materialList/index.vue

2
src/assets/icons/iconfont.js
File diff suppressed because it is too large
View File

264
src/assets/styles/adminIndex.scss

@ -35,7 +35,7 @@
}
}
}
// 获取验证码
.auth_code {
position: relative;
@ -75,7 +75,7 @@
}
}
}
// table新增按钮
.page_add {
text-align: right;
@ -107,7 +107,7 @@
.col_flex {
display: flex;
}
// table内不同的btn
.el-table {
color: #333;
font-size: 14px;
@ -141,6 +141,7 @@
background-color: #a7acae !important;
}
}
// 弹框定位居中
.el-dialog {
margin-top: 0 !important;
top: 50%;
@ -150,39 +151,35 @@
-ms-transform: translateY(-50%);
-o-transform: translateY(-50%);
}
// 弹框内表单统一操作
.el-dialog__body {
max-height: 70vh !important;
overflow-y: auto;
.el-form-item {
margin-bottom: 24px;
}
.el-form-item__label {
line-height: 40px;
color: #333;
}
.el-input__inner {
// width: 336px;
height: 40px;
line-height: 40px;
}
.el-range-separator {
line-height: 34px;
}
.el-date-editor {
width: 336px;
}
}
// 弹框header样式
.el-dialog__header {
position: relative;
padding: 20px 0;
margin: 0 24px;
border-bottom: 1px solid #eee;
&::before {
content: "";
position: absolute;
@ -194,29 +191,25 @@
background: url(../images/t-zs.png) no-repeat left center;
background-size: 100% 100%;
}
.el-dialog__title {
color: #000;
}
.el-dialog__headerbtn {
font-size: 20px;
top: 50%;
right: 0;
transform: translateY(-50%);
}
// .el-dialog__headerbtn {
// font-size: 20px;
// top: 50%;
// right: 0;
// transform: translateY(-50%);
// }
}
// 弹框底部-居中-btn样式
.el-dialog__footer {
padding: 10px 0 40px 0;
text-align: center;
.dialog-footer {
.el-button {
font-size: 14px;
padding: 10px 36px;
}
.el-button--default {
color: #3a8aeb;
border-color: #3a8aeb;
@ -224,7 +217,7 @@
}
}
}
// 记录弹框
.record_layer {
.el-dialog__body {
padding: 0 20px 30px 20px;
@ -272,61 +265,6 @@
}
}
.item_format {
display: flex;
position: absolute;
left: 0;
bottom: 38px;
span {
display: block;
width: 47px;
height: 18px;
// padding: 2px 5px;
margin-left: 6px;
text-align: center;
background: #3a8aeb;
color: #fff;
font-size: 12px;
line-height: 18px;
border-radius: 9px;
}
}
.file_name {
height: 32px;
line-height: 32px;
padding: 0 10px;
font-size: 14px;
color: #333;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
text-overflow: ellipsis;
}
// 首页-主题库-按钮
.home_publish_btn {
position: absolute;
top: 14px;
right: 26px;
z-index: 999;
.el-button {
padding: 8px 20px;
margin-left: 20px;
font-size: 14px;
color: #fff;
border: none;
&:first-child {
background: linear-gradient(to right, #fc8c6f, #fa544e);
}
// &:last-child {
// margin-left: 24px;
// }
}
}
.content_warp {
i {
font-style: normal;
@ -435,16 +373,8 @@
padding: 0 20px 30px 20px;
}
}
// 弹框右上角多按钮且关闭X出框
// 弹框右上角多按钮
.upload_layer {
// .el-dialog__headerbtn {
// right: -60px;
// .el-dialog__close {
// color: #fff;
// font-size: 26px;
// }
// }
.upload_list_right {
position: absolute;
right: 24px;
@ -456,7 +386,6 @@
cursor: pointer;
.upload_return {
margin-left: 16px;
}
}
}
@ -479,6 +408,44 @@
height: 100%;
}
}
.cont_upload {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-content: center;
border: 1px dashed #dcdde3;
background: #f2f7ff;
.el-button {
display: block;
width: 114px;
height: 34px;
padding: 0;
font-size: 14px;
border: none;
}
.cont_upload_btn {
background: linear-gradient(to right, #fc8c6f, #fa544e) !important;
}
.mkdir_btn {
margin-left: 0;
margin-top: 16px;
}
}
.folder {
border: 1px solid #dcdde3;
.icon_bg {
display: flex;
align-items: center;
justify-content: center;
height: 148px;
background: #fff5dd;
.icon {
width: 104px;
height: 89px;
}
}
}
// 素材库/主题库选中
.checked_btn {
position: absolute;
@ -497,5 +464,130 @@
background: url(~@/assets/images/selected.png) no-repeat;
}
}
// 主题-素材-资源格式样式
.item_format {
display: flex;
position: absolute;
left: 0;
bottom: 38px;
span {
display: block;
width: 47px;
height: 18px;
// padding: 2px 5px;
margin-left: 6px;
text-align: center;
background: #3a8aeb;
color: #fff;
font-size: 12px;
line-height: 18px;
border-radius: 9px;
}
}
// 主题-素材-文件名样式
.file_name {
height: 32px;
line-height: 32px;
padding: 0 10px;
font-size: 14px;
color: #333;
display: -webkit-box;
-webkit-box-orient: vertical;
-webkit-line-clamp: 1;
overflow: hidden;
text-overflow: ellipsis;
}
// 首页-主题库-按钮
.home_publish_btn {
position: absolute;
top: 14px;
right: 26px;
z-index: 999;
.el-button {
padding: 8px 20px;
margin-left: 20px;
font-size: 14px;
color: #fff;
border: none;
&.el_button_red {
background: linear-gradient(to right, #fc8c6f, #fa544e);
}
&.el_button_green {
background: linear-gradient(to right, #43c7b8, #3dd3ae);
}
}
}
// 素材-主题库-list-上传历史/多选btn
.material_btn {
position: absolute;
right: 24px;
top: 13px;
.el-button {
padding: 0 20px;
height: 28px;
border-color: #3a8aeb;
&:last-child {
padding: 0 25px;
color: #3a8aeb;
}
}
}
// 素材-主题库-list- 多选之后操作
.multi_handle {
display: flex;
position: fixed;
bottom: 140px;
left: 50%;
// width: 1100px;
padding: 25px 150px;
background: rgba(0, 0, 0, 0.5);
border-radius: 4px;
transform: translateX(-40%);
.mulit_btn {
padding: 0 24px;
height: 34px;
font-size: 14px;
color: #333;
border: none;
margin: 0 24px;
background-color: #fff;
}
.mulit_delt_btn {
background-color: #ec414d;
color: #fff;
}
}
// 移动至 - 文件夹弹框
.wjj_layer {
::v-deep .el-dialog__body {
padding: 30px 24px;
}
.wjj_list {
display: flex;
flex-wrap: wrap;
.wjj_item {
display: flex;
flex-wrap: wrap;
align-content: center;
justify-content: center;
width: 96px;
height: 104px;
cursor: pointer;
&.wjj_item_active {
background: #e8f3ff;
border: 1px solid #428fec;
}
.font-icon {
width: 64px;
height: 55px;
}
.wjj_name {
font-size: 14px;
color: #333;
margin-top: 8px;
}
}
}
}
// end

10
src/assets/styles/iconfont.css

@ -1,10 +1,8 @@
@font-face {
font-family: 'iconfont';
/* project id 3202838 */
src: url('//at.alicdn.com/t/font_3202838_q6w9546ze7d.woff2') format('woff2'),
url('//at.alicdn.com/t/font_3202838_q6w9546ze7d.woff') format('woff'),
url('//at.alicdn.com/t/font_3202838_q6w9546ze7d.ttf') format('truetype'),
url('#iconfont') format('svg');
font-family: 'iconfont'; /* Project id 3202838 */
src: url('//at.alicdn.com/t/font_3202838_xxqwqp4ynb7.woff2?t=1647330074548') format('woff2'),
url('//at.alicdn.com/t/font_3202838_xxqwqp4ynb7.woff?t=1647330074548') format('woff'),
url('//at.alicdn.com/t/font_3202838_xxqwqp4ynb7.ttf?t=1647330074548') format('truetype');
}
.iconfont {
font-family: "iconfont" !important;

97
src/views/ThemeGallery/index.vue

@ -1,29 +1,25 @@
<template>
<div class="theme">
<div class="app-container theme_main">
<!-- 右上角btn -->
<div class="home_publish_btn">
<el-button round @click="publishHandle(0)">即时发布</el-button>
<el-button round type="primary" @click="publishHandle(1)">定时发布</el-button>
<el-button round class="publish_muilt_btn" @click="multiSelectBtn">{{ mulitText }}</el-button>
<el-button round class="el_button_green">新增</el-button>
<el-button round type="primary">编辑</el-button>
<el-button round class="el_button_red">上传</el-button>
</div>
<div style="position:relative">
<!-- 主题库list -->
<ThemeGalleryList
ref="ThemeGalleryList"
:is-multi-selected="isMultiSelected"
:mulit-text="mulitText"
:show-item-info="showItemInfo"
/>
<div class="material_btn">
<el-button round type="primary">上传历史</el-button>
<el-button round @click="multiSelectBtn">{{ mulitText }}</el-button>
</div>
</div>
<!-- tab-btn -->
<!-- <el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="为你推荐" name="1" />
<el-tab-pane label="人工智能" name="2" />
<el-tab-pane label="党建文化" name="3" />
<el-tab-pane label="节日节气" name="4" />
<el-tab-pane label="艺术鉴赏" name="5" />
<el-tab-pane label="名人介绍" name="6" />
<el-tab-pane label="摄影" name="7" />
<el-tab-pane label="书法" name="8" />
</el-tabs> -->
<!-- 主题库list -->
<ThemeGalleryList
ref="ThemeGalleryList"
:is-multi-selected="isMultiSelected"
:mulit-text="mulitText"
:show-item-info="showItemInfo"
/>
</div>
</template>
@ -34,7 +30,6 @@ export default {
components: { ThemeGalleryList },
data() {
return {
activeName: '1',
mulitText: '多选',
isMultiSelected: false,
showItemInfo: true
@ -51,44 +46,44 @@ export default {
} else {
this.mulitText = '多选'
}
},
publishHandle(index) {
this.$router.push(
{
path: '/release', query: { tag: index }
}
)
}
}
}
</script>
<style lang="scss" scoped>
.theme {
.theme_main {
position: relative;
width: 100%;
background: #fff;
margin-top: 24px;
padding-top: 8px;
border-radius: 4px;
min-height: calc(100vh - 384px);
::v-deep .el-tabs__header {
padding: 0 26px;
padding: 0;
background: none;
::v-deep .el-tabs{
height: 55px;
padding: 0 24px;
margin-bottom: 24px;
line-height: 55px;
background: #fff;
}
.el-tabs{
margin-bottom: 0;
::v-deep .el-tabs__nav-wrap::after{
display: none;
}
::v-deep .el-tabs__item {
font-size: 16px;
height: 50px;
line-height: 50px;
::v-deep .el-tabs__active-bar{
display: none;
}
::v-deep .theme_item_tab{
margin-bottom: 0;
.el-tabs__header{
margin-bottom: 0;
border-bottom: 1px solid #eee;
}
}
::v-deep .el-tabs__active-bar {
height: 3px;
::v-deep .theme_img{
align-content: flex-start;
height: calc(100vh - 246px);
padding: 18px 24px 0 24px;
overflow-y: auto;
background: #fff;
}
.publish_muilt_btn{
padding: 6px 20px;
border: 1px solid #3a8aeb;
color: #3a8aeb;
.material_btn {
top: 93px;
}
}
</style>

250
src/views/components/ThemeGalleryList.vue

@ -1,16 +1,37 @@
<template>
<div>
<el-tabs v-model="activeName" @tab-click="handleClick">
<el-tab-pane label="为你推荐" name="1" />
<el-tab-pane label="人工智能" name="2" />
<el-tab-pane label="党建文化" name="3" />
<el-tab-pane label="节日节气" name="4" />
<el-tab-pane label="艺术鉴赏" name="5" />
<el-tab-pane label="名人介绍" name="6" />
<el-tab-pane label="摄影" name="7" />
<el-tab-pane label="书法" name="8" />
<el-tabs v-model="activeName" @tab-click="tabHandleClick">
<el-tab-pane
v-for="item in tabItem"
:key="item.key"
:label="item.name"
:name="item.key"
/>
</el-tabs>
<el-tabs v-if="showItemInfo" v-model="themeItemActive" class="theme_item_tab" @tab-click="tabItemClick">
<el-tab-pane label="竖屏" name="1" />
<el-tab-pane label="横屏" name="2" />
<el-tab-pane label="我的画册" name="3" />
</el-tabs>
<div class="theme_img">
<!-- 我的画册-创建文件夹btn -->
<div v-if="themeItemActive=='3'" class="theme_mkdir cont_upload" @click="handleMkdir">
<svg class="font-icon icon" aria-hidden="true">
<use xlink:href="#icon-a-xinzeng" />
</svg>
<el-button class="mkdir_btn" round type="primary">创建文件夹</el-button>
</div>
<!-- 我的画册-某一文件夹 -->
<div v-if="themeItemActive=='3'" class="theme_mkdir folder">
<div class="icon_bg">
<svg class="font-icon icon" aria-hidden="true">
<use xlink:href="#icon-wenjianjia" />
</svg>
<!-- <img src /> -->
</div>
<p class="file_name">文件夹</p>
</div>
<!-- 主题库list -->
<div
v-for="(item, index) in listThemeData"
:key="index"
@ -28,11 +49,98 @@
<span v-if="isMultiSelected" class="checked_btn" @click="selectedItem(item.id, item.type)"></span>
</div>
</div>
<!-- 多选操作 -->
<div v-if="selectedListIds.length !== 0" class="multi_handle">
<el-button type="button" class="mulit_btn" @click="publishHandle(0)">即时发布</el-button>
<el-button type="button" class="mulit_btn" @click="publishHandle(1)">定时发布</el-button>
<el-button type="button" class="mulit_btn">下载</el-button>
<el-button v-if="themeItemActive!='3'" type="button" class="mulit_btn">添加到画册</el-button>
<el-button v-if="themeItemActive=='3'" type="button" class="mulit_btn" @click="moveingTo()">移动</el-button>
<el-button v-if="themeItemActive=='3'" type="button" class="mulit_btn mulit_delt_btn">删除</el-button>
</div>
<!-- 创建文件夹layer / 编辑 -->
<div class="publish_layer">
<el-dialog
title="创建文件夹"
:close-on-click-modal="false"
:show-close="false"
:visible.sync="mkdirVisible"
width="616px"
height="384px"
>
<el-form ref="form" :inline="true" :model="form" size="small" label-width="100px">
<el-form-item
label="文件夹名称"
prop="name"
:rules="[
{ required: true, message: '请输入名称', trigger: 'blur' }
]"
>
<el-input v-model="form.name" style="width: 336px" />
</el-form-item>
<el-form-item label="封面" prop="file">
<el-upload action="#" list-type="picture-card" :auto-upload="false">
<img src="@/assets/images/t-sc.png" alt />
<div slot="file" slot-scope="{file}">
<img class="el-upload-list__item-thumbnail" :src="file.url" alt />
</div>
</el-upload>
</el-form-item>
</el-form>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round> </el-button>
<el-button round @click="mkdirVisible=false"> </el-button>
</div>
</el-dialog>
</div>
<!-- 移动至layer -->
<div class="wjj_layer">
<!-- width="736px" -->
<el-dialog
title="移动至"
:close-on-click-modal="false"
:show-close="false"
:visible.sync="movingVisible"
width="576px"
height="384px"
>
<div class="wjj_list">
<div
v-for="(item, index) in wjjList"
:key="index"
:class="['wjj_item', { 'wjj_item_active': movingChecked === index }]"
@click="wjjSelected(index)"
>
<svg class="font-icon icon" aria-hidden="true">
<use xlink:href="#icon-wenjianjia" />
</svg>
<p class="wjj_name">{{ item.name }}</p>
</div>
</div>
<div slot="footer" class="dialog-footer">
<el-button type="primary" round>确定</el-button>
<el-button round @click="movingVisible=false">取消</el-button>
</div>
</el-dialog>
</div>
</div>
</template>
<script>
import crudUser from '@/api/system/user'
import CRUD, { presenter, header, form, crud } from '@crud/crud'
const defaultForm = {
id: null,
name: '',
file: null
}
export default {
name: 'ThemeGalleryList',
cruds() {
return CRUD({ title: '用户', url: 'api/users', crudMethod: { ...crudUser }})
},
mixins: [presenter(), header(), form(defaultForm), crud()],
props: {
isMultiSelected: {
type: Boolean,
@ -50,6 +158,10 @@ export default {
data() {
return {
activeName: '1',
themeItemActive: '1',
mkdirVisible: false,
movingVisible: false,
movingChecked: null,
listThemeData: [
{
id: '1',
@ -101,7 +213,51 @@ export default {
time: ''
}
],
selectedListIds: []
selectedListIds: [],
tabItem: [
{
key: '1',
name: '为你推荐'
},
{
key: '2',
name: '人工智能'
},
{
key: '3',
name: '党建文化'
},
{
key: '4',
name: '节日节气'
},
{
key: '5',
name: '艺术鉴赏'
},
{
key: '6',
name: '名人介绍'
},
{
key: '7',
name: '摄影'
},
{
key: '8',
name: '书法'
}
],
wjjList: [
{
id: '1',
name: '文件夹1'
},
{
id: '2',
name: '文件夹2'
}
]
}
},
watch: {
@ -115,9 +271,27 @@ export default {
},
methods: {
// tabClick
handleClick(tab, event) {
tabHandleClick(tab, event) {
console.log(tab, event)
},
tabItemClick(tab, event) {
console.log(this.themeItemActive)
console.log(tab, event)
},
//
handleMkdir() {
this.mkdirVisible = true
},
//
moveingTo(index) {
this.movingVisible = true
// this.movingChecked = index
},
//
wjjSelected(index) {
this.movingChecked = index
console.log(this.movingChecked)
},
//
selectedItem(id) {
const arr = this.selectedListIds
@ -131,6 +305,14 @@ export default {
} else {
this.selectedListIds.push(id)
}
},
// /
publishHandle(index) {
this.$router.push(
{
path: '/release', query: { tag: index }
}
)
}
}
}
@ -139,18 +321,42 @@ export default {
.el-tabs{
margin-bottom: 0;
}
::v-deep .el-tabs__item.is-active{
color: #3a8aeb;
}
.theme_img {
padding-left: 26px;
height: calc(100vh - 449px);
overflow-y: auto;
.file_name{
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 30px;
background: rgba(255,255,255,0.6);
line-height: 30px;
.theme_mkdir{
width: 140px;
height: 250px;
margin: 0 24px 24px 0;
&.cont_upload .font-icon{
width: 45px;
height: 45px;
margin-bottom: 20px;
}
&.folder .font-icon{
width: 84px;
height: 69px;
}
}
.theme_item{
width: 140px;
height: 250px;
}
.icon_bg {
height: 220px;
}
.theme_item{
.file_name{
position: absolute;
left: 0;
bottom: 0;
width: 100%;
height: 30px;
background: rgba(255,255,255,0.6);
line-height: 30px;
}
}
}

7
src/views/dashboard/HomeThemeGallery.vue

@ -13,6 +13,7 @@
ref="ThemeGalleryList"
:is-multi-selected="isMultiSelected"
:mulit-text="mulitText"
:show-item-info="false"
/>
</div>
</template>
@ -62,7 +63,6 @@ export default {
::v-deep .el-tabs__header {
padding: 0 26px;
}
::v-deep .el-tabs__item {
font-size: 16px;
height: 50px;
@ -76,5 +76,10 @@ export default {
border: 1px solid #3a8aeb;
color: #3a8aeb;
}
::v-deep .theme_img {
padding-left: 26px;
height: calc(100vh - 449px);
overflow-y: auto;
}
}
</style>

54
src/views/immediateRelease/index.vue

@ -201,7 +201,8 @@
:key="index"
:class="{'active': activeItemIndex === index}"
@click="tab(index)"
>{{ item.name }}<span>{{ item.num }}</span></li>
>{{ item.name }}<span>{{ item.num }}</span>
</li>
</ul>
<div class="material_list">
<div
@ -235,6 +236,7 @@
ref="ThemeGalleryList"
:is-multi-selected="isMultiSelected"
:mulit-text="mulitText"
:show-item-info="false"
/>
</div>
<div class="upload_list_right">
@ -438,40 +440,6 @@ export default {
name: '音频',
num: '1'
}
],
tabItem: [
{
key: 1,
name: '为你推荐'
},
{
key: 2,
name: '人工智能'
},
{
key: 3,
name: '党建文化'
},
{
key: 4,
name: '节日节气'
},
{
key: 5,
name: '艺术鉴赏'
},
{
key: 6,
name: '名人介绍'
},
{
key: 7,
name: '摄影'
},
{
key: 8,
name: '书法'
}
]
}
},
@ -894,9 +862,17 @@ export default {
margin-bottom: 0;
}
}
.theme_img {
padding-left: 0;
height: auto;
overflow-y: auto;
.release_layer {
::v-deep .el-tabs{
margin: -26px 0 8px 0;
}
::v-deep .el-tabs__nav-wrap::after{
display: none;
}
::v-deep .el-tabs__active-bar{
display: none;
}
}
</style>

15
src/views/materialContent/index.vue

@ -48,7 +48,6 @@ export default {
return {
activeName: 'first',
isMultiSelected: false,
isCheck: null,
mulitText: '多选'
}
},
@ -76,19 +75,5 @@ export default {
.app-container {
position: relative;
padding: 6px 0 20px 0;
.material_btn {
position: absolute;
right: 24px;
top: 13px;
.el-button {
padding: 0 20px;
height: 28px;
border-color: #3a8aeb;
&:last-child {
padding: 0 25px;
color: #3a8aeb;
}
}
}
}
</style>

96
src/views/materialContent/materialList/index.vue

@ -406,46 +406,6 @@ export default {
border-radius: 4px;
margin: 0 20px 20px 0;
}
.cont_upload {
display: flex;
flex-wrap: wrap;
justify-content: center;
align-content: center;
border: 1px dashed #dcdde3;
background: #f2f7ff;
.el-button {
display: block;
width: 114px;
height: 34px;
padding: 0;
font-size: 14px;
border: none;
}
.cont_upload_btn {
background: linear-gradient(to right, #fc8c6f, #fa544e) !important;
}
.mkdir_btn {
margin-left: 0;
margin-top: 16px;
}
}
.folder {
border: 1px solid #dcdde3;
.icon_bg {
display: flex;
align-items: center;
justify-content: center;
height: 148px;
background: #fff5dd;
.icon {
width: 104px;
height: 89px;
}
}
}
.item_cont {
border-color: #dcdde3;
img {
@ -476,60 +436,4 @@ export default {
width: 128px;
height: 120px;
}
.multi_handle {
position: fixed;
bottom: 140px;
left: 50%;
width: 1100px;
padding: 25px 150px;
background: rgba(0, 0, 0, 0.5);
border-radius: 4px;
margin-left: -438px;
.mulit_btn {
padding: 0 24px;
height: 34px;
font-size: 14px;
color: #333;
border: none;
margin: 0 24px;
background-color: #fff;
}
.mulit_delt_btn {
background-color: #ec414d;
color: #fff;
}
}
.wjj_layer {
::v-deep .el-dialog__body {
padding: 30px 24px;
}
.wjj_list {
display: flex;
flex-wrap: wrap;
.wjj_item {
display: flex;
flex-wrap: wrap;
align-content: center;
justify-content: center;
width: 96px;
height: 104px;
cursor: pointer;
&.wjj_item_active {
background: #e8f3ff;
border: 1px solid #428fec;
}
.font-icon {
width: 64px;
height: 55px;
}
.wjj_name {
font-size: 14px;
color: #333;
margin-top: 8px;
}
}
}
}
</style>
Loading…
Cancel
Save