vr-uniapp/src/views/layout/components/navbar/index.vue

200 lines
6.9 KiB
Vue
Raw Normal View History

<template>
<!-- 顶部导航栏 -->
<div class="navbar">
<div class="nav-left">
2024-09-03 02:53:24 +00:00
<!-- <icon name="arrow-left" color="f">返回</icon> -->
<div class="flex-row align-c">
<div class="name">
2024-08-23 09:14:43 +00:00
<div class="flex-row align-c gap-10 c-pointer" @click="dialog_visible = true">
<image-empty :src="modelValue.logo" class="round img" error-img-style="width: 2.2rem;height: 2.2rem;" />
<div>{{ modelValue.name }}</div>
2024-08-29 07:29:45 +00:00
<icon name="edit" color="#7DBEFF"></icon>
</div>
</div>
</div>
</div>
<div class="nav-right">
<el-button class="btn-plain" @click="upload_manage"></el-button>
<el-button class="btn-plain" @click="preview_event"></el-button>
2024-10-11 08:37:43 +00:00
<el-button class="btn-plain" :class="saveDisabled ? 'disabled' : ''" :disabled="saveDisabled" @click="save_event"></el-button>
<el-button class="btn-white" :class="saveDisabled ? 'disabled' : ''" :disabled="saveDisabled" @click="save_close_event"></el-button>
</div>
</div>
2024-09-02 06:02:05 +00:00
<el-dialog v-model="dialog_visible" class="radius-lg" width="650" draggable :close-on-click-modal="false" append-to-body>
2024-08-23 09:14:43 +00:00
<template #header>
<div class="title re">
2025-01-13 08:55:10 +00:00
<div class="middle size-16 fw-b">附件管理</div>
2024-08-23 09:14:43 +00:00
</div>
</template>
<div class="content pa-20">
<el-form ref="ruleFormRef" :model="form" :rules="rules" label-width="50" status-icon @submit.prevent>
2024-09-03 02:53:24 +00:00
<el-form-item label="封面">
2024-08-23 09:14:43 +00:00
<upload v-model="form.logo" :limit="1"></upload>
</el-form-item>
2024-09-03 02:53:24 +00:00
<el-form-item label="名称" prop="name">
2024-10-16 02:45:14 +00:00
<el-input v-model="form.name" placeholder="请输入名称" clearable @keyup.enter="confirm_event(ruleFormRef)" />
2024-08-23 09:14:43 +00:00
</el-form-item>
2024-09-03 02:53:24 +00:00
<el-form-item label="描述">
2024-10-16 02:45:14 +00:00
<el-input v-model="form.describe" placeholder="请输入描述" :rows="4" type="textarea" clearable @keyup.enter="confirm_event(ruleFormRef)" />
2024-08-23 09:14:43 +00:00
</el-form-item>
2024-09-06 09:05:00 +00:00
<el-form-item label="状态">
2024-08-23 09:14:43 +00:00
<el-switch v-model="form.is_enable" active-value="1" inactive-value="0"></el-switch>
</el-form-item>
</el-form>
</div>
<template #footer>
<span class="dialog-footer">
<el-button class="plr-28 ptb-10" @click="dialog_visible = false">取消</el-button>
<el-button class="plr-28 ptb-10" type="primary" @click="confirm_event(ruleFormRef)"></el-button>
</span>
</template>
</el-dialog>
2024-08-27 05:43:44 +00:00
<upload v-model:visible-dialog="is_custom_dialog" is-custom-dialog :is-check-confirm="false"></upload>
</template>
<script setup lang="ts">
2024-08-23 09:14:43 +00:00
import { FormInstance, FormRules } from 'element-plus';
const props = defineProps({
saveDisabled: {
type: Boolean,
default: false,
},
});
const modelValue = defineModel({ type: Object, default: {} });
// #region 变量 --------------------start
const is_custom_dialog = ref(false);
2024-08-23 09:14:43 +00:00
const dialog_visible = ref(false);
2024-09-04 03:55:40 +00:00
watch(dialog_visible, (val) => {
if (val) {
form.value = {
logo: modelValue.value.logo.length > 0 ? [{ url: modelValue.value.logo }] : [],
name: modelValue.value.name,
describe: modelValue.value.describe,
2024-10-10 08:56:20 +00:00
is_enable: modelValue.value.is_enable.toString(),
2024-09-04 03:55:40 +00:00
};
}
});
2024-08-23 09:14:43 +00:00
const form = ref({
2024-09-04 03:55:40 +00:00
logo: [] as any[],
name: '',
describe: '',
is_enable: '',
2024-08-23 09:14:43 +00:00
});
const ruleFormRef = ref<FormInstance>();
const rules = reactive<FormRules>({
name: [
{ required: true, trigger: 'blur', message: '请输入模版名称' },
{ min: 1, max: 60, message: '名称长度1~60个字符', trigger: 'blur' },
],
});
// #endregion 变量 --------------------end
const emit = defineEmits(['preview', 'save', 'saveClose']);
// 点击上传管理时的事件处理函数。
const upload_manage = () => {
is_custom_dialog.value = true;
};
// * 点击预览时的事件处理函数。
const preview_event = () => {
emit('preview');
};
// 点击仅保存时的事件处理函数。
const save_event = () => {
emit('save', true);
};
// 点击保存并关闭时的事件处理函数。
const save_close_event = () => {
emit('saveClose', true);
};
2024-08-23 09:14:43 +00:00
const confirm_event = async (formEl: FormInstance | undefined) => {
if (!formEl) return;
await formEl.validate((valid, fields) => {
if (valid) {
dialog_visible.value = false;
modelValue.value = {
...form.value,
logo: form.value.logo.length > 0 ? form.value.logo[0].url : '',
};
}
2024-10-16 07:12:57 +00:00
// else {
// console.log('error submit!', fields);
// }
2024-08-23 09:14:43 +00:00
});
};
</script>
<style lang="scss" scoped>
.navbar {
2024-09-03 06:27:36 +00:00
height: 6rem;
2024-09-03 02:53:24 +00:00
padding: 0 3rem;
display: flex;
justify-content: space-between;
align-items: center;
2024-08-29 07:29:45 +00:00
background-color: $cr-primary;
.nav-left {
display: flex;
align-items: center;
.name {
2024-09-03 02:53:24 +00:00
// padding-left: 2rem;
// margin: 0 2rem;
color: #fff;
position: relative;
2024-09-03 02:53:24 +00:00
// &::before {
// content: '';
// display: inline-block;
// width: 0.1rem;
// height: 65%;
// background-color: #fff;
// position: absolute;
// left: 0;
// top: 50%;
// transform: translateY(-50%);
// }
.img {
width: 2.2rem;
height: 2.2rem;
}
}
}
.nav-right {
display: flex;
gap: 1.2rem;
.btn-plain {
background-color: transparent;
border-color: #fff;
color: #fff;
&:hover {
2024-09-02 06:02:05 +00:00
background-color: #fff;
border-color: #fff;
color: $cr-primary;
}
2024-10-11 08:37:43 +00:00
&.disabled {
opacity: 0.5;
&:hover {
background-color: transparent;
border-color: #fff;
color: #fff;
}
}
}
.btn-white {
background-color: #fff;
border-color: #fff;
color: $cr-primary;
&:hover {
2024-09-02 06:02:05 +00:00
background-color: #1e7ede;
border-color: #1e7ede;
color: #fff;
}
2024-10-11 08:37:43 +00:00
&.disabled {
opacity: 0.5;
&:hover {
background-color: #fff;
border-color: #fff;
color: $cr-primary;
}
}
}
}
}
</style>