This commit is contained in:
Xuan Loi
2026-01-09 17:25:23 +07:00
commit ae1ea57130
315 changed files with 57694 additions and 0 deletions

View File

@@ -0,0 +1,40 @@
<template>
<div class="columns mx-0">
<div class="column is-2">
<div class="py-1" v-for="v in array">
<a :class="(current? current.code===v.code : false)? 'has-text-primary has-text-weight-bold' : ''" @click="changeTab(v)">{{ v.name }}</a>
</div>
</div>
<div class="column is-10">
<div class="fsb-20 mb-3" v-if="current">{{ current.name }}</div>
<DataView v-bind="current.vbind" v-if="current"></DataView>
</div>
</div>
</template>
<script setup>
import { useStore } from '~/stores/index'
const store = useStore()
const { $clone } = useNuxtApp()
var array = [
{code: 'systemsetting', name: 'System setting', vbind: {api: 'systemsetting', setting: 'common-fields-1', pagename: 'pagedata8.8.8',
timeopt: 36000,
modal: {component: 'parameter/Common', title: 'System setting', vbind: {api: 'systemsetting'}}}},
{code: 'emailsetup', name: 'Email setup', vbind: {api: 'emailsetup', setting: 'email-setup', pagename: 'pagedata8.8.8',
timeopt: 36000,
modal: {component: 'parameter/EmailSetup', title: 'Email setup', width: '600px', height: '300px', vbind: {api: 'emailsetup'}}}},
{code: 'settingfields', name: 'Setting fields',
vbind: {api: 'settingfields', setting: 'system-setting-fields', pagename: 'pagedata8.8.8', timeopt: 36000,
modal: {component: 'parameter/SettingFields', title: 'Setting fields', vbind: {api: 'settingfields'}}}}
]
var current = ref(array[0])
function changeTab(v) {
current.value = null
let copy = $clone(store['pagedata8.8.8'])
copy.filters = []
store.commit('pagedata8.8.8', copy)
setTimeout(()=>current.value = v)
}
</script>

View File

@@ -0,0 +1,72 @@
<template>
<div class="columns is-centered mx-0">
<div class="column is-6">
<article class="message is-danger">
<div class="message-header">
<p class="fsb-20 has-text-white">{{$lang('warning')}}</p>
</div>
<div class="message-body has-text-black fs-17">
{{$lang('alert')}}
</div>
</article>
<div class="field is-horizontal">
<div class="field-body">
<div class="field is-narrow">
<label class="label">{{ $lang('confirm') }} <b class="has-text-danger">*</b></label>
<div class="control">
<input class="input" type="text" :placeholder="$lang('info')" v-model="text">
</div>
<p class="help has-text-danger" v-if="errors.text">{{ errors.text }}</p>
</div>
<div class="field">
<label class="label">{{ $lang('hash') }} <b class="has-text-danger">*</b></label>
<div class="control">
<input class="input" type="text" placeholder="secret key" v-model="password">
</div>
<p class="help has-text-danger" v-if="errors.password">{{ errors.password }}</p>
</div>
</div>
</div>
<div class="mt-5">
<button :class="`button is-danger ${loading? 'is-loading' : ''} has-text-white`" @click="deletion()">
Xóa dữ liệu
</button>
</div>
</div>
</div>
</template>
<script setup>
const { $empty, $insertapi, $snackbar, $lang } = useNuxtApp()
var text = ref()
var password = ref()
var hash = ref()
var loading = ref(false)
var errors = ref({})
async function sha256(str) {
const buffer = await crypto.subtle.digest("SHA-256", new TextEncoder().encode(str));
return Array.from(new Uint8Array(buffer)).map(b => b.toString(16).padStart(2, '0')).join('');
}
async function checkError() {
errors.value = {}
if(text.value!=='delete') errors.value.text = "Chưa nhập xác nhận xóa"
if($empty(password.value)) errors.value.password = "Chưa nhập chuỗi bí mật"
else {
hash.value = await sha256(password.value)
if(hash.value !=='8816f9082eb2a9adf08dca6e0273d40908f409b6f8ca60bbeedd5d8d437c603b') {
errors.value.password = "Chuỗi bí mật không chính xác"
}
}
return Object.keys(errors.value).length>0
}
async function deletion() {
let rs = await checkError()
if(rs) return
loading.value = true
rs = await $insertapi('datadeletion', {password: password.value, hash: hash.value})
if(rs==='error') $snackbar($lang('delete-error'))
else $snackbar($lang('delete-success'))
text.value = undefined
password.value = undefined
loading.value = false
}
</script>