Change plugin purchase process

wip

wip

wip

wip

admin ui optimization

Optimize file manager
This commit is contained in:
pushuo 2023-05-08 10:57:21 +08:00 committed by Edward Yang
parent 4869e4252e
commit 77bf0bca1a
25 changed files with 300 additions and 250 deletions

View File

@ -46,8 +46,8 @@ hr.horizontal.dark {
// border-width: 2px;
.nav-item {
margin-left: 0.75rem;
margin-right: 0.75rem;
margin-left: 0.65rem;
margin-right: 0.65rem;
&:first-child {
margin-left: 0;
@ -60,7 +60,7 @@ hr.horizontal.dark {
.nav-link {
color: #6c757d;
border: none;
padding: 0 .6rem 0.7rem;
padding: 0 1rem 0.7rem;
&.active {
color: $primary;
@ -107,8 +107,11 @@ hr.horizontal.dark {
table.table {
thead {
th {
background-color: #f9fbfd;
// background-color: #f9fbfd;
background-color: #f5f7f8;
// color: #74859e;
padding-top: .7rem;
padding-bottom: .7rem;
font-size: .825rem;
border-top-width: 0;
border-bottom: none;
@ -253,4 +256,54 @@ table.table {
border-bottom-left-radius: 0 !important;
margin-left: -1px;
}
}
.pagination {
> li {
margin: 0 5px;
font-weight: bold;
a, span {
text-align: center;
border-radius: 2px !important;
min-width: 30px;
}
}
}
.dropdown-menu {
box-shadow: 0 .5rem 2rem 0.125rem rgba(140, 152, 164, 0.286);
}
.input-locale-wrap {
> .input-for-group, .input-group {
& + .input-for-group, & + .input-group {
margin-top: -1px;
}
input, span, textarea {
border-radius: 0;
}
// 选择第一个
&:first-child {
input, textarea {
border-top-right-radius: 0.2rem;
}
span {
border-top-left-radius: 0.2rem;
}
}
// 选择最后一个
&:last-child {
input, textarea {
border-bottom-right-radius: 0.2rem;
}
span {
border-bottom-left-radius: 0.2rem;
}
}
}
}

View File

@ -49,9 +49,15 @@
&:hover {
.input-wrap {
background-color: #f0f3f8;
background-color: #f1f3f8;
.search-icon {
color: #4f5b68;
color: #2a343f;
}
}
input#header-search-input {
&::-webkit-input-placeholder {
color: #546371;
}
}
}
@ -65,20 +71,25 @@
width: 330px;
border-radius: 6px;
font-size: 16px;
background-color: #f6f7fa;
background-color: #f2f4f7;
.search-icon {
// color: #8c98a4;
// color: #798591;
color: #626f7c;
color: #52606f;
}
&.active {
// background-color: #f6f7fa;
background-color: #f0f3f8;
background-color: #ebeff5;
border-radius: 8px;
height: 40px;
.search-icon {
color: #4f5b68;
color: #2a343f;
}
input#header-search-input {
&::-webkit-input-placeholder {
color: #546371;
}
}
.close-icon {
@ -117,7 +128,7 @@
height: 40px;
// 设置 placeholder 颜色
&::-webkit-input-placeholder {
color: #8c98a4;
color: #7b8996;
}
}
}
@ -274,6 +285,7 @@
&:hover {
.nav-link {
background-color: #eee;
color: #333 !important;
}
.dropdown-menu {
@ -330,7 +342,11 @@
}
a.nav-link {
padding: 0 14px;
padding: 0 20px;
&:hover {
color: $primary;
}
}
&.update-btn a {

View File

@ -50,7 +50,10 @@
> .left {
padding-top: 8px;
min-width: 92px;
background-color: #eff3f7;
// background-color: #eff3f7;
// background-color: #dce5ee;
// background-color: #e4ebf2;
background-color: #ebf1f6;
max-width: 130px;
// 背景图
@ -68,26 +71,20 @@
color: #333;
display: flex;
text-decoration: none;
&::after {
content: '';
display: inline-block;
width: 3px;
height: 3px;
}
i {
margin-right: 7px;
}
}
&.active, &:hover {
background-color: #fff;
&.active {
a {
font-weight: bold;
&::after {
display: none;
}
}
}
&.active, &:hover {
background-color: #fff;
body.admin-home & {
background-color: #f9fbfd;

View File

@ -54,6 +54,23 @@ $nav-link-color: #555;
$nav-link-hover-color: #555;
$nav-tabs-link-active-color: #222;
$pagination-border-width: 0;
$pagination-bg: #f4f4f5;
$pagination-color: #606266;
$pagination-border-radius: 2px;
$pagination-disabled-bg: $pagination-bg;
$pagination-disabled-color: #c0c4cc;
$pagination-hover-color: $primary;
$pagination-padding-x: 4px;
$pagination-padding-y: .3rem;
$pagination-focus-color: #606266;
$dropdown-box-shadow: 0 0.8rem 2.5rem 0.6125rem rgba(140, 152, 164, 0.286);
$dropdown-item-padding-y: 0.45rem;
$dropdown-border-color: rgba(0, 0, 0, 0.064);
// $dropdown-border-color: transparent;
$dropdown-border-radius: 0.4rem;
@import './bootstrap-icons';
@import 'node_modules/bootstrap/scss/bootstrap';
// @import 'node_modules/bootstrap/scss/bootstrap';

View File

@ -1,4 +1,5 @@
<x-admin::form.row :title="$title" :required="$required">
<div class="input-locale-wrap">
@foreach (locales() as $index => $locale)
<div class="d-flex wp-{{ $width }} input-for-group">
<span class="input-group-text wp-100 px-1" id="basic-addon1">{{ $locale['name'] }}</span>
@ -13,4 +14,5 @@
@enderror
@endif
@endforeach
</div>
</x-admin::form.row>

View File

@ -93,7 +93,7 @@
<li class="nav-item me-3">
<div class="dropdown">
<a href="#" class="nav-link dropdown-toggle" data-bs-toggle="dropdown">
<span class="text-dark ml-2">{{ current_user()->name }}</span>
<span class="ml-2">{{ current_user()->name }}</span>
</a>
<ul class="dropdown-menu dropdown-menu-end" aria-labelledby="dropdownMenuLink">

View File

@ -3,7 +3,7 @@
@section('title', __('admin/attribute_group.index'))
@section('content')
<div id="customer-app" class="card" v-cloak>
<div id="customer-app" class="card h-min-600" v-cloak>
<div class="card-body">
<div class="d-flex justify-content-between mb-4">
<button type="button" class="btn btn-primary" @click="checkedCustomersCreate('add', null)">{{ __('admin/attribute_group.create_at_groups') }}</button>

View File

@ -35,7 +35,7 @@
</table>
</div>
<el-pagination v-if="attributes.data.length" layout="total, prev, pager, next" background :page-size="attributes.per_page" :current-page.sync="page"
<el-pagination v-if="attributes.data.length" layout="prev, pager, next" background :page-size="attributes.per_page" :current-page.sync="page"
:total="attributes.total"></el-pagination>
</div>

View File

@ -25,7 +25,7 @@
<tr v-for="brand, index in brands.data" :key="index">
<td>@{{ brand.id }}</td>
<td>@{{ brand.name }}</td>
<td><div class="wh-50"><img :src="thumbnail(brand.logo)" class="img-fluid"></div></td>
<td><div class="wh-50 border d-flex justify-content-center rounded-2 align-items-center"><img :src="thumbnail(brand.logo)" class="img-fluid rounded-2"></div></td>
<td>@{{ brand.sort_order }}</td>
<td>@{{ brand.first }}</td>
<td>

View File

@ -1,92 +0,0 @@
@extends('admin::admin.layouts.master')
@section('title', '分类管理')
@section('content')
<div id="app">
<el-card class="box-card">
<div slot="header" class="clearfix">
<span>编辑分类</span>
</div>
<el-form label-width="200px" size="small1">
<el-form-item label="分类名称">
<div style="max-width: 400px">
@foreach (locales() as $locale)
<el-input class="mb-1">
<template slot="append">{{ $locale['name'] }}</template>
</el-input>
@endforeach
</div>
</el-form-item>
<el-form-item label="分类描述">
<div style="max-width: 400px">
@foreach (locales() as $locale)
<el-input v-model="form.descriptions['{{ $locale['code'] }}'].content" class="mb-1">
<template slot="append">{{ $locale['name'] }}</template>
</el-input>
@endforeach
</div>
</el-form-item>
<el-form-item label="上级分类">
<el-select v-model="form.parent_id" placeholder="请选择上级分类">
@foreach ($categories as $_category)
<el-option label="{{ $_category->name }}" value="{{ $_category->id }}"></el-option>
@endforeach
</el-select>
</el-form-item>
<el-form-item label="状态">
<el-radio-group v-model="form.active">
<el-radio :label="1">启用</el-radio>
<el-radio :label="0">禁用</el-radio>
</el-radio-group>
</el-form-item>
<el-form-item>
<el-button type="primary" @click="save">立即创建</el-button>
<el-button>取消</el-button>
</el-form-item>
</el-form>
</el-card>
</div>
@endsection
@push('footer')
<script>
new Vue({
el: '#app',
data() {
return {
form: {
parent_id: 0,
active: 1,
descriptions: {
zh_cn: {
name: '',
content: '',
},
en: {
name: '',
content: '',
}
}
}
};
},
methods: {
save() {
axios.post(@json(admin_route('categories.store')), this.form).then(response => {
this.loading = false;
}).catch(error => {
// this.$message.error(error.response.data.message);
});
}
}
});
</script>
@endpush

View File

@ -5,7 +5,7 @@
@section('body-class', 'page-categories')
@section('content')
<div id="category-app" class="card">
<div id="category-app" class="card h-min-600">
<div class="card-body">
<a href="{{ admin_route('categories.create') }}" class="btn btn-primary">{{ __('admin/category.categories_create') }}</a>
<div class="mt-4" style="" v-if="categories.length">

View File

@ -3,7 +3,7 @@
@section('title', __('admin/common.customer_groups_index'))
@section('content')
<div id="customer-app" class="card" v-cloak>
<div id="customer-app" class="card h-min-600" v-cloak>
<div class="card-body">
<div class="d-flex justify-content-between mb-4">
<button type="button" class="btn btn-primary" @click="checkedCustomersCreate('add', null)">{{ __('admin/customer_group.customer_groups_create') }}</button>

View File

@ -3,10 +3,10 @@
@section('title', __('admin/common.customer'))
@section('content')
<div id="customer-app" class="card" v-cloak>
<div id="customer-app" class="card h-min-600" v-cloak>
<div class="card-body">
<div class="bg-light p-4 mb-3">
<el-form :inline="true" :model="filter" class="demo-form-inline" label-width="100px">
<el-form :inline="true" :model="filter" class="demo-form-inline" label-width="70px">
<div>
<el-form-item label="{{ __('customer.name') }}">
<el-input @keyup.enter.native="search" v-model="filter.name" size="small" placeholder="{{ __('customer.name') }}"></el-input>
@ -34,7 +34,7 @@
</el-form>
<div class="row">
<label class="wp-100"></label>
<label style="width: 70px"></label>
<div class="col-auto">
<button type="button" @click="search" class="btn btn-outline-primary btn-sm">{{ __('common.filter') }}</button>
<button type="button" @click="resetSearch" class="btn btn-outline-secondary btn-sm ms-1">{{ __('common.reset') }}</button>

View File

@ -84,7 +84,7 @@
<el-switch v-model="currentMenu.isFull"></el-switch>
</div>
</div>
<draggable class="children-group d-lg-flex" style="margin: 0 -0.5rem" :list="currentMenu.childrenGroup"
<draggable class="children-group d-lg-flex flex-wrap" style="margin: 0 -0.5rem" :list="currentMenu.childrenGroup"
:options="{ animation: 330, handle: '.el-icon-rank' }">
<div class="card border mx-2 mb-3 group-item" v-for="group, group_index in currentMenu.childrenGroup"
:key="group_index">

View File

@ -489,7 +489,7 @@
type: 'warning'
}).then(() => {
$http.delete(`file_manager/directories`, {
name: this.folderCurrent
name: data.path
}).then((res) => {
layer.msg(res.message)
this.$refs.tree.setCurrentKey(node.parent.data.path)
@ -522,13 +522,22 @@
},
openInputBox(type, node, data) {
let fileSuffix, fileName = '';
if (type == 'image') {
const image = this.images[this.selectImageIndex].name;
// 获取文件后缀
fileSuffix = image.substring(image.lastIndexOf('.') + 1);
// 获取文件名
fileName = image.substring(0, image.lastIndexOf('.'));
}
this.$prompt('', type == 'addFolder' ? '{{ __('admin/file_manager.new_folder') }}' : '{{ __('admin/file_manager.rename') }}', {
confirmButtonText: '{{ __('common.confirm') }}',
cancelButtonText: '{{ __('common.cancel') }}',
inputPattern: /^.+$/,
closeOnClickModal: false,
inputValue: type == 'image' ? this.images[this.selectImageIndex].name : (type == 'renameFolder' ? data
.name : '{{ __('admin/file_manager.new_folder') }}'),
inputValue: type == 'image' ? fileName : (type == 'renameFolder' ? data.name : '{{ __('admin/file_manager.new_folder') }}'),
inputErrorMessage: '{{ __('admin/file_manager.can_empty') }}'
}).then(({
value
@ -555,8 +564,10 @@
}
if (type == 'renameFolder') {
this.folderCurrent = data.path;
$http.post(`file_manager/rename`, {
origin_name: this.folderCurrent,
origin_name: data.path,
new_name: value
}).then((res) => {
layer.msg(res.message)
@ -574,8 +585,9 @@
$http.post(`file_manager/rename`, {
origin_name: origin_name,
new_name: value
new_name: value + '.' + fileSuffix
}).then((res) => {
this.images[this.selectImageIndex].name = value + '.' + fileSuffix;
layer.msg(res.message)
})
}

View File

@ -24,7 +24,7 @@ $data = $plugin['data'];
<img src="{{ $data['icon_big'] }}" class="img-fluid plugin-icon">
<img src="{{ $data['icon_big'] }}" class="img-fluid plugin-icon-shadow">
</div>
<div class="ms-lg-5 mt-2">
<div class="ms-lg-5">
<h2 class="card-title mb-4">{{ $data['name'] }}</h2>
<div class="plugin-item d-lg-flex align-items-center mb-4 lh-1 text-secondary">
<div class="mx-3 ms-0">{{ __('admin/marketing.download_count') }}{{ $data['downloaded'] }}</div><span
@ -35,23 +35,23 @@ $data = $plugin['data'];
class="lh-1 bg-secondary"></span>
</div>
<div class="mb-4">
<div class="mb-2 fw-bold">{{ __('product.price') }}</div>
<div class="fs-3 fw-bold">{{ $data['price_format'] }}</div>
<div class="mb-3">
<div class="mb-1 fw-bold">{{ __('product.price') }}</div>
<div class="fs-3 fw-bold" style="margin-left: -4px">{{ $data['price_format'] }}</div>
</div>
<div class="mb-4">
<div class="mb-2 fw-bold">{{ __('admin/marketing.text_version') }}</div>
<div class="mb-3">
<div class="mb-1 fw-bold">{{ __('admin/marketing.text_version') }}</div>
<div>{{ $data['version'] }}</div>
</div>
<div class="mb-4">
<div class="mb-2 fw-bold">{{ __('admin/marketing.text_compatibility') }}</div>
<div class="mb-3">
<div class="mb-1 fw-bold">{{ __('admin/marketing.text_compatibility') }}</div>
<div>{{ $data['version_name_format'] }}</div>
</div>
<div class="mb-4">
<div class="mb-2 fw-bold">{{ __('admin/marketing.text_author') }}</div>
<div class="mb-3">
<div class="mb-1 fw-bold">{{ __('admin/marketing.text_author') }}</div>
<div class="d-inline-block">
<a href="{{ config('app.url') }}/account/{{ $data['developer']['id'] }}" target="_blank"
class="d-flex align-items-center text-dark">
@ -101,26 +101,25 @@ $data = $plugin['data'];
<div class="d-flex justify-content-center align-items-center" id="code-info"></div>
</div>
<el-dialog title="{{ __('admin/marketing.set_token') }}" :close-on-click-modal="false"
:visible.sync="setTokenDialog.show" width="820px" @close="dialogOnClose">
{{-- <el-input type="textarea" :rows="3" placeholder="{{ __('admin/marketing.set_token') }}"
v-model="setTokenDialog.token">
</el-input>
<div class="mt-3 text-secondary fs-6">{{ __('admin/marketing.get_token_text') }} <a
href="{{ config('beike.api_url') }}/account/websites?domain={{ $domain }}" class="link-primary"
target="_blank">{{ __('admin/marketing.get_token') }}</a></div>
<div class="d-flex justify-content-end align-items-center mt-4">
<span slot="footer" class="dialog-footer">
<el-button @click="setTokenDialog.show = false">{{ __('common.cancel') }}</el-button>
<el-button type="primary" @click="submitToken">{{ __('common.confirm') }}</el-button>
</span>
</div> --}}
<div class="login-wrap d-flex mb-4 px-2">
<div class="card w-50 border-0 p-0 shadow-none">
<div class="p-0 card-header">
<h5 class="bg-light px-2 py-3 text-black mb-3">{{ __('shop/login.login') }}</h5>
</div>
<div class="card-body p-0">
<el-dialog title="{{ __('admin/marketing.bind_bk_token') }}" :close-on-click-modal="false"
:visible.sync="setTokenDialog.show" width="520px" @close="dialogOnClose">
<div class="login-wrap mb-4 px-2" style="margin-top: -20px">
<ul class="nav nav-tabs nav-bordered mb-3" role="tablist">
<li class="nav-item flex-1 text-center" role="presentation">
<button class="nav-link active w-100" data-bs-toggle="tab" data-bs-target="#tab-login" type="button" >{{ __('shop/login.login') }}</button>
</li>
<li class="nav-item flex-1 text-center" role="presentation">
<button class="nav-link w-100" data-bs-toggle="tab" data-bs-target="#tab-register" type="button">{{ __('shop/login.register') }}</button>
</li>
</ul>
<div class="tab-content">
<div class="tab-pane fade show active" id="tab-login">
<div class="alert alert-info" role="alert">
<i class="bi bi-question-circle"></i> {!! __('admin/marketing.bk_login_hint') !!}
</div>
<el-form ref="loginForm" :model="loginForm" :rules="loginRules">
<el-form-item label="{{ __('shop/login.email') }}" prop="email">
<el-input @keyup.enter.native="checkedBtnLogin('loginForm')" v-model="loginForm.email"
@ -138,16 +137,12 @@ $data = $plugin['data'];
</div>
</el-form>
</div>
</div>
<div class="d-flex vr-wrap mx-5">
<div class="vr bg-secondary"></div>
</div>
<div class="card w-50 border-0 p-0 shadow-none">
<div class="p-0 card-header">
<h5 class="bg-light px-2 py-3 text-black mb-3">{{ __('shop/login.new') }}</h5>
</div>
<div class="card-body p-0">
<div class="tab-pane fade" id="tab-register">
<div class="alert alert-info" role="alert">
<i class="bi bi-question-circle"></i> {!! __('admin/marketing.bk_register_hint') !!}
</div>
<el-form ref="registerForm" :model="registerForm" :rules="registeRules">
<el-form-item label="{{ __('admin/customer.user_name') }}" prop="name">
<el-input @keyup.enter.native="checkedBtnLogin('registerForm')" v-model="registerForm.name"
@ -208,51 +203,51 @@ $data = $plugin['data'];
},
loginForm: {
email: '',
password: '',
},
email: '',
password: '',
},
registerForm: {
email: '',
name: '',
telephone: '',
qq: '',
password: '',
},
registerForm: {
email: '',
name: '',
telephone: '',
qq: '',
password: '',
},
loginRules: {
email: [
{required: true, message: '{{ __('shop/login.enter_email') }}', trigger: 'change'},
{type: 'email', message: '{{ __('shop/login.email_err') }}', trigger: 'change'},
],
password: [
{required: true, message: '{{ __('shop/login.enter_password')}}', trigger: 'change'}
]
},
loginRules: {
email: [
{required: true, message: '{{ __('shop/login.enter_email') }}', trigger: 'change'},
{type: 'email', message: '{{ __('shop/login.email_err') }}', trigger: 'change'},
],
password: [
{required: true, message: '{{ __('shop/login.enter_password')}}', trigger: 'change'}
]
},
registeRules: {
name: [
{required: true, message: '{{ __('common.error_required', ['name' => __('admin/customer.user_name')]) }}', trigger: 'change'},
],
telephone: [
{required: true, message: '{{ __('common.error_required', ['name' => __('address.phone')]) }}', trigger: 'change'},
],
email: [
{required: true, message: '{{ __('common.error_required', ['name' => __('shop/login.email')]) }}', trigger: 'change'},
{type: 'email', message: '{{ __('shop/login.email_err') }}', trigger: 'change'},
],
password: [
{required: true, message: '{{ __('common.error_required', ['name' => __('shop/login.password')]) }}', trigger: 'change'},
],
},
registeRules: {
name: [
{required: true, message: '{{ __('common.error_required', ['name' => __('admin/customer.user_name')]) }}', trigger: 'change'},
],
telephone: [
{required: true, message: '{{ __('common.error_required', ['name' => __('address.phone')]) }}', trigger: 'change'},
],
email: [
{required: true, message: '{{ __('common.error_required', ['name' => __('shop/login.email')]) }}', trigger: 'change'},
{type: 'email', message: '{{ __('shop/login.email_err') }}', trigger: 'change'},
],
password: [
{required: true, message: '{{ __('common.error_required', ['name' => __('shop/login.password')]) }}', trigger: 'change'},
],
},
},
methods: {
checkedBtnLogin(form) {
let _data = this.loginForm, url = '/login'
let _data = this.loginForm, url = `${config.api_url}/api/login?domain=${config.app_url}`
if (form == 'registerForm') {
_data = this.registerForm, url = '/register'
_data = this.registerForm, url = `${config.api_url}/api/register?domain=${config.app_url}`
}
this.$refs['loginForm'].clearValidate();
@ -264,10 +259,19 @@ $data = $plugin['data'];
return;
}
return;
$http.post(url, _data).then((res) => {
layer.msg(res.message)
if (res.status == 'fail') {
layer.msg(res.message, ()=>{});
return;
}
layer.msg(res.message);
this.setTokenDialog.token = res.data.token;
$http.post('{{ admin_route('settings.store_token') }}', {developer_token: this.setTokenDialog.token}).then((res) => {
this.setTokenDialog.show = false;
})
})
});
},
@ -294,7 +298,6 @@ $data = $plugin['data'];
marketingBuy() {
if (!this.setTokenDialog.token) {
console.log(1);
return this.setTokenDialog.show = true;
}

View File

@ -67,15 +67,15 @@
:list="form.images"
:options="{animation: 200, handle: '.product-item'}"
>
<div v-for="image, index in form.images" :key="index" class="wh-80 product-item position-relative me-2 mb-2 border d-flex justify-content-center align-items-center max-h-100 overflow-hidden">
<div v-for="image, index in form.images" :key="index" class="wh-80 rounded-2 product-item position-relative me-2 mb-2 border d-flex justify-content-center align-items-center max-h-100 overflow-hidden">
<div class="position-absolute top-0 end-0">
<button class="btn btn-danger btn-sm wh-20 p-0" @click="removeImages(index)" type="button"><i class="bi bi-trash"></i></button>
</div>
<img :src="thumbnail(image)" class="img-fluid">
<img :src="thumbnail(image)" class="img-fluid rounded-2">
<input type="hidden" name="images[]" :value="image">
</div>
<div v-if="!form.images.length" class="d-none"><input type="hidden" name="images[]" value=""></div>
<div class="set-product-img wh-80" @click="addProductImages"><i class="bi bi-plus fs-1 text-muted"></i></div>
<div class="set-product-img wh-80 rounded-2" @click="addProductImages"><i class="bi bi-plus fs-1 text-muted"></i></div>
</draggable>
<div class="help-text mb-1 mt-1">{{ __('admin/product.image_help') }}</div>
</x-admin::form.row>
@ -318,6 +318,7 @@
</x-admin::form.row>
</div>
<div class="tab-pane fade" id="tab-attribute">
<h6 class="border-bottom pb-3 mb-4">{{ __('admin/attribute.index') }}</h6>
<x-admin::form.row title="{{ __('admin/attribute.set_attribute') }}">
<div class="pdf-table">
<table class="table table-bordered w-max-600">
@ -372,26 +373,32 @@
<x-admin-form-input-locale :width="600" name="descriptions.*.meta_title" title="Meta title" :value="$descriptions"/>
<x-admin::form.row title="Meta keywords">
@foreach ($languages as $language)
<div class="input-group w-max-600">
<span class="input-group-text wp-100">{{ $language['name'] }}</span>
<textarea rows="2" type="text" name="descriptions[{{ $language['code'] }}][meta_keywords]" class="form-control wp-400" placeholder="Meta keywords">{{ old('meta_keywords', $product->descriptions->keyBy('locale')[$language->code]->meta_keywords ?? '') }}</textarea>
<div class="input-locale-wrap">
@foreach ($languages as $language)
<div class="input-group w-max-600">
<span class="input-group-text wp-100">{{ $language['name'] }}</span>
<textarea rows="2" type="text" name="descriptions[{{ $language['code'] }}][meta_keywords]" class="form-control wp-400" placeholder="Meta keywords">{{ old('meta_keywords', $product->descriptions->keyBy('locale')[$language->code]->meta_keywords ?? '') }}</textarea>
</div>
@endforeach
</div>
@endforeach
</x-admin::form.row>
<x-admin::form.row title="Meta description">
@foreach ($languages as $language)
<div class="input-group w-max-600">
<span class="input-group-text wp-100">{{ $language['name'] }}</span>
<textarea rows="2" type="text" name="descriptions[{{ $language['code'] }}][meta_description]" class="form-control wp-400" placeholder="Meta description">{{ old('meta_description', $product->descriptions->keyBy('locale')[$language->code]->meta_description ?? '') }}</textarea>
<div class="input-locale-wrap">
@foreach ($languages as $language)
<div class="input-group w-max-600">
<span class="input-group-text wp-100">{{ $language['name'] }}</span>
<textarea rows="2" type="text" name="descriptions[{{ $language['code'] }}][meta_description]" class="form-control wp-400" placeholder="Meta description">{{ old('meta_description', $product->descriptions->keyBy('locale')[$language->code]->meta_description ?? '') }}</textarea>
</div>
@endforeach
</div>
@endforeach
</x-admin::form.row>
@hook('admin.product.seo.after')
</div>
<div class="tab-pane fade" id="tab-relations">
<h6 class="border-bottom pb-3 mb-4">{{ __('admin/product.product_relations') }}</h6>
<x-admin::form.row title="{{ __('admin/product.product_relations') }}">
<div class="module-edit-group wp-600">
<div class="autocomplete-group-wrapper">

View File

@ -12,7 +12,7 @@
@endif
<div id="product-app">
<div class="card">
<div class="card h-min-600">
<div class="card-body">
<div class="bg-light p-4">
<div class="row">
@ -125,7 +125,7 @@
<td><input type="checkbox" :value="{{ $product['id'] }}" v-model="selectedIds" /></td>
<td>{{ $product['id'] }}</td>
<td>
<div class="wh-60 border d-flex justify-content-between align-items-center"><img src="{{ $product['images'][0] ?? 'image/placeholder.png' }}" class="img-fluid"></div>
<div class="wh-60 border d-flex rounded-2 justify-content-between align-items-center"><img src="{{ $product['images'][0] ?? 'image/placeholder.png' }}" class="img-fluid rounded-2"></div>
</td>
<td>
<a href="{{ $product['url'] }}" target="_blank" title="{{ $product['name'] }}" class="text-dark">{{ $product['name'] }}</a>

View File

@ -4,11 +4,11 @@
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
<span class="page-link" aria-hidden="true"><i class="bi bi-chevron-left"></i></span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')"><i class="bi bi-chevron-left"></i></a>
</li>
@endif
@ -34,11 +34,11 @@
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')"><i class="bi bi-chevron-right"></i></a>
</li>
@else
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
<span class="page-link" aria-hidden="true"><i class="bi bi-chevron-right"></i></span>
</li>
@endif
</ul>

View File

@ -74,6 +74,17 @@ $alert-padding-y: 0.5rem;
$form-feedback-icon-valid: none;
$form-feedback-icon-valid-color: inherit;
$pagination-border-width: 0;
$pagination-bg: #f4f4f5;
$pagination-color: #606266;
$pagination-border-radius: 2px;
$pagination-disabled-bg: $pagination-bg;
$pagination-disabled-color: #c0c4cc;
$pagination-hover-color: $primary;
$pagination-padding-x: 4px;
$pagination-padding-y: .3rem;
$pagination-focus-color: #606266;
// $dropdown-divider-bg: rgba(0, 0, 0, 0.1);
@import './bootstrap-icons';
@import 'node_modules/bootstrap/scss/bootstrap';
@ -164,4 +175,16 @@ $form-feedback-icon-valid-color: inherit;
}
}
}
}
.pagination {
> li {
margin: 0 5px;
font-weight: bold;
a, span {
text-align: center;
border-radius: 2px !important;
min-width: 30px;
}
}
}

View File

@ -36,4 +36,7 @@ return [
'ali_pay_text' => 'Payment has been completed, please refresh the page',
'version_compatible_text' => 'This plugin is not compatible with the current system version, please upgrade to <a href="' . config('beike.api_url') . '/download" target="_blank">Latest Version</a>',
'to_update' => 'To Upgrade',
'bk_register_hint' => 'Register a new account with <a href="https://beikeshop.com/account" target="_blank">beikeshop.com</a>',
'bk_login_hint' => 'login with <a href="https://beikeshop.com/account" target="_blank">beikeshop.com</a> account',
'bind_bk_token' => 'Bind BeikeShop account and get Token automatically',
];

View File

@ -10,7 +10,7 @@
*/
return [
'admin_panel' => 'バックステージ管理',
'admin_panel' => 'バックステージ',
'edit' => '編集',
'status' => 'ステータス',
'action' => 'アクション',
@ -22,21 +22,23 @@ return [
'has_no_permission' => 'このページにアクセスする権限がありません。システム管理者に連絡してください。 ',
// header
'home' => 'ホームページを管理する',
'order' => '注文管理',
'rma' => 'アフターサービス管理',
'rma_reason' => '返品理由管理',
'product' => '製品管理',
'brand' => 'ブランド管理',
'attribute' => 'attribute',
'attribute_group' => 'attribute group',
'category' => 'カテゴリ管理',
'customer_group' => '顧客グループ管理',
'customer' => '顧客管理',
'page' => 'コンテンツ管理',
'page_category' => 'Page Category',
'home' => '表紙',
'order' => '注文',
'rma' => 'アフターサービス',
'rma_reason' => '返品理由',
'product' => '製品',
'brand' => 'ブランド',
'attribute' => '属性管理',
'attribute_group' => '属性グループ',
'category' => 'カテゴリ',
'customer_group' => '顧客グループ',
'customer' => '顧客',
'page' => 'コンテンツ',
'page_category' => '記事の分類',
'setting' => 'システム設定',
'plugin' => 'プラグイン管理',
'plugin' => 'プラグイン',
'design' => 'デザイン',
'marketing' => 'プラグイン市場',
'admin_user' => 'バックエンド ユーザー',
'admin_role' => 'ユーザーの役割',
'region' => '地域のグループ化',

View File

@ -37,4 +37,7 @@ return [
'ali_pay_text' => '已完成支付,请刷新页面',
'version_compatible_text' => '该插件不兼容当前系统版本,请升级到 <a href="' . config('beike.api_url') . '/download" target="_blank">最新版本</a>',
'to_update' => '去升级',
'bk_register_hint' => '用 <a href="https://beikeshop.com/account" target="_blank">beikeshop.com</a> 上注册新账号',
'bk_login_hint' => '用 <a href="https://beikeshop.com/account" target="_blank">beikeshop.com</a> 账号登录',
'bind_bk_token' => '绑定BeikeShop账号自动获取Token',
];

View File

@ -5,11 +5,15 @@
@section('content')
<x-shop-breadcrumb type="brand" :value="$brand" />
<div class="container">
@if (count($products_format))
<div class="row">
@foreach ($products_format as $product)
<div class="col-6 col-md-3">@include('shared.product')</div>
@endforeach
</div>
@else
<x-shop-no-data />
@endif
{{ $products->links('shared/pagination/bootstrap-4') }}
</div>

View File

@ -4,11 +4,11 @@
{{-- Previous Page Link --}}
@if ($paginator->onFirstPage())
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.previous')">
<span class="page-link" aria-hidden="true">&lsaquo;</span>
<span class="page-link" aria-hidden="true"><i class="bi bi-chevron-left"></i></span>
</li>
@else
<li class="page-item">
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')">&lsaquo;</a>
<a class="page-link" href="{{ $paginator->previousPageUrl() }}" rel="prev" aria-label="@lang('pagination.previous')"><i class="bi bi-chevron-left"></i></a>
</li>
@endif
{{-- Pagination Elements --}}
@ -31,11 +31,11 @@
{{-- Next Page Link --}}
@if ($paginator->hasMorePages())
<li class="page-item">
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')">&rsaquo;</a>
<a class="page-link" href="{{ $paginator->nextPageUrl() }}" rel="next" aria-label="@lang('pagination.next')"><i class="bi bi-chevron-right"></i></a>
</li>
@else
<li class="page-item disabled" aria-disabled="true" aria-label="@lang('pagination.next')">
<span class="page-link" aria-hidden="true">&rsaquo;</span>
<span class="page-link" aria-hidden="true"><i class="bi bi-chevron-right"></i></span>
</li>
@endif
</ul>