浏览代码

vip功能

llp 1 周之前
父节点
当前提交
57a5861124
共有 25 个文件被更改,包括 472 次插入0 次删除
  1. 1 0
      bootstrap/providers.php
  2. 1 0
      composer.json
  3. 23 0
      packages/Longyi/Member/package.json
  4. 6 0
      packages/Longyi/Member/postcss.config.js
  5. 10 0
      packages/Longyi/Member/src/Config/acl.php
  6. 11 0
      packages/Longyi/Member/src/Config/admin-menu.php
  7. 28 0
      packages/Longyi/Member/src/Database/Migrations/2026_04_15_233520_add_vip_expire_fields_to_customer_table.php
  8. 29 0
      packages/Longyi/Member/src/Database/Migrations/2026_04_15_233955_add_member_fields_to_cart_table.php
  9. 29 0
      packages/Longyi/Member/src/Database/Migrations/2026_04_15_234016_add_member_fields_to_orders_table.php
  10. 29 0
      packages/Longyi/Member/src/Database/Migrations/2026_04_15_234035_add_member_fields_to_invoices_table.php
  11. 76 0
      packages/Longyi/Member/src/Http/Controllers/Admin/MemberController.php
  12. 17 0
      packages/Longyi/Member/src/Http/Controllers/Shop/MemberController.php
  13. 53 0
      packages/Longyi/Member/src/Providers/MemberServiceProvider.php
  14. 15 0
      packages/Longyi/Member/src/Providers/ModuleServiceProvider.php
  15. 23 0
      packages/Longyi/Member/src/Resources/assets/css/app.css
  16. 12 0
      packages/Longyi/Member/src/Resources/assets/images/icon-temp-active.svg
  17. 12 0
      packages/Longyi/Member/src/Resources/assets/images/icon-temp.svg
  18. 4 0
      packages/Longyi/Member/src/Resources/assets/js/app.js
  19. 13 0
      packages/Longyi/Member/src/Resources/views/admin/index.blade.php
  20. 1 0
      packages/Longyi/Member/src/Resources/views/admin/layouts/style.blade.php
  21. 11 0
      packages/Longyi/Member/src/Resources/views/shop/index.blade.php
  22. 10 0
      packages/Longyi/Member/src/Routes/admin-routes.php
  23. 8 0
      packages/Longyi/Member/src/Routes/shop-routes.php
  24. 4 0
      packages/Longyi/Member/tailwind.config.js
  25. 46 0
      packages/Longyi/Member/vite.config.js

+ 1 - 0
bootstrap/providers.php

@@ -14,6 +14,7 @@ return [
     Longyi\DynamicMenu\Providers\DynamicMenuServiceProvider::class,
     Longyi\RewardPoints\Providers\RewardPointsServiceProvider::class,
     Longyi\Gift\Providers\GiftServiceProvider::class,
+    Longyi\Member\Providers\MemberServiceProvider::class,
     Webkul\Attribute\Providers\AttributeServiceProvider::class,
     Webkul\BookingProduct\Providers\BookingProductServiceProvider::class,
     Webkul\CMS\Providers\CMSServiceProvider::class,

+ 1 - 0
composer.json

@@ -70,6 +70,7 @@
             "Longyi\\DynamicMenu\\": "packages/Longyi/DynamicMenu/src/",
             "Longyi\\RewardPoints\\": "packages/Longyi/RewardPoints/src/",
             "Longyi\\Gift\\": "packages/Longyi/Gift/src/",
+            "Longyi\\Member\\": "packages/Longyi/Member/src/",
             "Webkul\\Admin\\": "packages/Webkul/Admin/src",
             "Webkul\\Attribute\\": "packages/Webkul/Attribute/src",
             "Webkul\\BookingProduct\\": "packages/Webkul/BookingProduct/src",

+ 23 - 0
packages/Longyi/Member/package.json

@@ -0,0 +1,23 @@
+{
+  "private": true,
+  "scripts": {
+    "dev": "vite",
+    "build": "vite build"
+  },
+  "devDependencies": {
+    "autoprefixer": "^10.4.14",
+    "axios": "^1.4.0",
+    "laravel-vite-plugin": "^0.7.2",
+    "postcss": "^8.4.23",
+    "tailwindcss": "^3.3.2",
+    "vite": "^4.0.0",
+    "vue": "^3.2.47"
+  },
+  "dependencies": {
+    "@vee-validate/i18n": "^4.9.1",
+    "@vee-validate/rules": "^4.9.1",
+    "@vitejs/plugin-vue": "^4.2.3",
+    "mitt": "^3.0.1",
+    "vee-validate": "^4.9.1"
+  }
+}

+ 6 - 0
packages/Longyi/Member/postcss.config.js

@@ -0,0 +1,6 @@
+module.exports = {
+  plugins: {
+    tailwindcss: {},
+    autoprefixer: {},
+  },
+}

+ 10 - 0
packages/Longyi/Member/src/Config/acl.php

@@ -0,0 +1,10 @@
+<?php
+
+return [
+    [
+        'key'   => 'member',
+        'name'  => 'Member',
+        'route' => 'admin.member.index',
+        'sort'  => 2
+    ]
+];

+ 11 - 0
packages/Longyi/Member/src/Config/admin-menu.php

@@ -0,0 +1,11 @@
+<?php
+
+return [
+    [
+        'key'   => 'member',
+        'name'  => 'Member',
+        'route' => 'admin.member.index',
+        'sort'  => 2,
+        'icon'  => 'icon-sales',
+    ]
+];

+ 28 - 0
packages/Longyi/Member/src/Database/Migrations/2026_04_15_233520_add_vip_expire_fields_to_customer_table.php

@@ -0,0 +1,28 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('customers', function (Blueprint $table) {
+            $table->dateTime('vip_expire_date')->nullable()->after('remember_token');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('customer', function (Blueprint $table) {
+            $table->dropColumn('vip_expire_date');
+        });
+    }
+};

+ 29 - 0
packages/Longyi/Member/src/Database/Migrations/2026_04_15_233955_add_member_fields_to_cart_table.php

@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('cart', function (Blueprint $table) {
+            $table->decimal('vip_plus_amount', 10, 2)->nullable()->after('giftcard_amount');
+            $table->decimal('Vip_discount_amount', 10, 2)->nullable()->after('Vip_discount_amount');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('cart', function (Blueprint $table) {
+            $table->dropColumn(['vip_plus_amount', 'Vip_discount_amount']);
+        });
+    }
+};

+ 29 - 0
packages/Longyi/Member/src/Database/Migrations/2026_04_15_234016_add_member_fields_to_orders_table.php

@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->decimal('vip_plus_amount', 10, 2)->nullable()->after('giftcard_amount');
+            $table->decimal('Vip_discount_amount', 10, 2)->nullable()->after('Vip_discount_amount');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('orders', function (Blueprint $table) {
+            $table->dropColumn(['vip_plus_amount', 'Vip_discount_amount']);
+        });
+    }
+};

+ 29 - 0
packages/Longyi/Member/src/Database/Migrations/2026_04_15_234035_add_member_fields_to_invoices_table.php

@@ -0,0 +1,29 @@
+<?php
+
+use Illuminate\Database\Migrations\Migration;
+use Illuminate\Database\Schema\Blueprint;
+use Illuminate\Support\Facades\Schema;
+
+return new class extends Migration
+{
+    /**
+     * Run the migrations.
+     */
+    public function up(): void
+    {
+        Schema::table('invoices', function (Blueprint $table) {
+            $table->decimal('vip_plus_amount', 10, 2)->nullable()->after('giftcard_amount');
+            $table->decimal('Vip_discount_amount', 10, 2)->nullable()->after('Vip_discount_amount');
+        });
+    }
+
+    /**
+     * Reverse the migrations.
+     */
+    public function down(): void
+    {
+        Schema::table('invoices', function (Blueprint $table) {
+            $table->dropColumn(['vip_plus_amount', 'Vip_discount_amount']);
+        });
+    }
+};

+ 76 - 0
packages/Longyi/Member/src/Http/Controllers/Admin/MemberController.php

@@ -0,0 +1,76 @@
+<?php
+
+namespace Longyi\Member\Http\Controllers\Admin;
+
+use Illuminate\Http\JsonResponse;
+use Illuminate\View\View;
+use Webkul\Admin\Http\Controllers\Controller;
+
+class MemberController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     */
+    public function index(): View
+    {
+        if (request()->ajax()) {
+            // return datagrid(MemberControllerDataGrid::class)->process();
+        }
+
+        return view('member::admin.index');
+    }
+
+    /**
+     * Show the form for creating a new resource.
+     */
+    public function create(): View
+    {
+        return view('member::admin.create');
+    }
+
+    /**
+     * Store a newly created resource in storage.
+     */
+    public function store(): JsonResponse
+    {
+        // Add your store logic here
+        
+        return new JsonResponse([
+            'message' => 'Resource created successfully.',
+        ]);
+    }
+
+    /**
+     * Show the form for editing the specified resource.
+     */
+    public function edit(int $id): View
+    {
+        // $resource = $this->repository->findOrFail($id);
+
+        return view('member::admin.edit', compact('id'));
+    }
+
+    /**
+     * Update the specified resource in storage.
+     */
+    public function update(int $id): JsonResponse
+    {
+        // Add your update logic here
+        
+        return new JsonResponse([
+            'message' => 'Resource updated successfully.',
+        ]);
+    }
+
+    /**
+     * Remove the specified resource from storage.
+     */
+    public function destroy(int $id): JsonResponse
+    {
+        // Add your destroy logic here
+        
+        return new JsonResponse([
+            'message' => 'Resource deleted successfully.',
+        ]);
+    }
+}

+ 17 - 0
packages/Longyi/Member/src/Http/Controllers/Shop/MemberController.php

@@ -0,0 +1,17 @@
+<?php
+
+namespace Longyi\Member\Http\Controllers\Shop;
+
+use Illuminate\View\View;
+use Webkul\Shop\Http\Controllers\Controller;
+
+class MemberController extends Controller
+{
+    /**
+     * Display a listing of the resource.
+     */
+    public function index(): View
+    {
+        return view('member::shop.index');
+    }
+}

+ 53 - 0
packages/Longyi/Member/src/Providers/MemberServiceProvider.php

@@ -0,0 +1,53 @@
+<?php
+
+namespace Longyi\Member\Providers;
+
+use Illuminate\Support\ServiceProvider;
+use Illuminate\Support\Facades\Event;
+
+class MemberServiceProvider extends ServiceProvider
+{
+    /**
+     * Register services.
+     */
+    public function register(): void
+    {
+        $this->registerConfig();
+    }
+
+    /**
+     * Bootstrap services.
+     */
+    public function boot(): void
+    {
+        $this->loadMigrationsFrom(__DIR__ . '/../Database/Migrations');
+
+        $this->loadRoutesFrom(__DIR__ . '/../Routes/admin-routes.php');
+
+        $this->loadRoutesFrom(__DIR__ . '/../Routes/shop-routes.php');
+
+        $this->loadTranslationsFrom(__DIR__ . '/../Resources/lang', 'member');
+
+        $this->loadViewsFrom(__DIR__ . '/../Resources/views', 'member');
+
+        Event::listen('bagisto.admin.layout.head', function($viewRenderEventManager) {
+            $viewRenderEventManager->addTemplate('member::admin.layouts.style');
+        });
+    }
+
+    /**
+     * Register package config.
+     *
+     * @return void
+     */
+    protected function registerConfig()
+    {
+        $this->mergeConfigFrom(
+            dirname(__DIR__) . '/Config/admin-menu.php', 'menu.admin'
+        );
+
+        $this->mergeConfigFrom(
+            dirname(__DIR__) . '/Config/acl.php', 'acl'
+        );
+    }
+}

+ 15 - 0
packages/Longyi/Member/src/Providers/ModuleServiceProvider.php

@@ -0,0 +1,15 @@
+<?php
+
+namespace Longyi\Member\Providers;
+
+use Konekt\Concord\BaseModuleServiceProvider;
+
+class ModuleServiceProvider extends BaseModuleServiceProvider
+{
+    /**
+     * Models.
+     *
+     * @var array
+     */
+    protected $models = [];
+}

+ 23 - 0
packages/Longyi/Member/src/Resources/assets/css/app.css

@@ -0,0 +1,23 @@
+@tailwind base;
+@tailwind components;
+@tailwind utilities;
+
+@layer components {
+    .temp-icon {
+        width: 48px;
+        height: 48px;
+        display: inline-block;
+        background-size: cover;
+        background-image: url("../images/icon-temp.svg");
+    }
+
+    .active {
+        .temp-icon {
+            background-image: url("../images/icon-temp-active.svg");
+        }
+
+        &.temp-icon {
+            background-image: url("../images/icon-temp-active.svg");
+        }
+    }
+}

+ 12 - 0
packages/Longyi/Member/src/Resources/assets/images/icon-temp-active.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
+    <title>Icon-Catalog-Active</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Icon-Catalog-Active" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
+        <g transform="translate(9.000000, 7.000000)" stroke="#0041FF" stroke-width="2">
+            <rect id="Rectangle-2" x="0" y="0" width="30" height="34"></rect>
+        </g>
+    </g>
+</svg>

+ 12 - 0
packages/Longyi/Member/src/Resources/assets/images/icon-temp.svg

@@ -0,0 +1,12 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<svg width="48px" height="48px" viewBox="0 0 48 48" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
+    <!-- Generator: Sketch 50.2 (55047) - http://www.bohemiancoding.com/sketch -->
+    <title>Icon-Catalog</title>
+    <desc>Created with Sketch.</desc>
+    <defs></defs>
+    <g id="Icon-Catalog" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd" stroke-linecap="round" stroke-linejoin="round">
+        <g transform="translate(9.000000, 7.000000)" stroke-width="2">
+            <rect id="Rectangle-2" stroke="#8E8E8E" x="0" y="0" width="30" height="34"></rect>
+        </g>
+    </g>
+</svg>

+ 4 - 0
packages/Longyi/Member/src/Resources/assets/js/app.js

@@ -0,0 +1,4 @@
+/**
+ * This will track all the images and fonts for publishing.
+ */
+import.meta.glob(["../images/**"]);

+ 13 - 0
packages/Longyi/Member/src/Resources/views/admin/index.blade.php

@@ -0,0 +1,13 @@
+<x-admin::layouts>
+
+    <!-- Title of the page -->
+    <x-slot:title>
+        Package Member
+    </x-slot>
+
+    <!-- Page Content -->
+    <div class="page-content">
+        <h1>Package Member</h1>
+    </div>
+
+</x-admin::layouts>

+ 1 - 0
packages/Longyi/Member/src/Resources/views/admin/layouts/style.blade.php

@@ -0,0 +1 @@
+<link rel="stylesheet" href="{{ asset('themes/default/assets/css/admin.css') }}">

+ 11 - 0
packages/Longyi/Member/src/Resources/views/shop/index.blade.php

@@ -0,0 +1,11 @@
+<x-shop::layouts>
+
+    <!-- Title of the page -->
+    <x-slot:title>
+        Package Member
+    </x-slot>
+
+    <div class="main">
+        Package Member
+    </div>
+</x-shop::layouts>

+ 10 - 0
packages/Longyi/Member/src/Routes/admin-routes.php

@@ -0,0 +1,10 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use Longyi\Member\Http\Controllers\Admin\MemberController;
+
+Route::group(['middleware' => ['web', 'admin'], 'prefix' => 'admin/member'], function () {
+    Route::controller(MemberController::class)->group(function () {
+        Route::get('', 'index')->name('admin.member.index');
+    });
+});

+ 8 - 0
packages/Longyi/Member/src/Routes/shop-routes.php

@@ -0,0 +1,8 @@
+<?php
+
+use Illuminate\Support\Facades\Route;
+use Longyi\Member\Http\Controllers\Shop\MemberController;
+
+Route::group(['middleware' => ['web', 'theme', 'locale', 'currency'], 'prefix' => 'member'], function () {
+    Route::get('', [MemberController::class, 'index'])->name('shop.member.index');
+});

+ 4 - 0
packages/Longyi/Member/tailwind.config.js

@@ -0,0 +1,4 @@
+/** @type {import('tailwindcss').Config} */
+module.exports = {
+    content: ["./src/Resources/**/*.blade.php", "./src/Resources/**/*.js"],
+};

+ 46 - 0
packages/Longyi/Member/vite.config.js

@@ -0,0 +1,46 @@
+import { defineConfig, loadEnv } from "vite";
+import vue from "@vitejs/plugin-vue";
+import laravel from "laravel-vite-plugin";
+import path from "path";
+
+export default defineConfig(({ mode }) => {
+    const envDir = "../../../";
+
+    Object.assign(process.env, loadEnv(mode, envDir));
+
+    return {
+        build: {
+            emptyOutDir: true,
+        },
+
+        envDir,
+
+        server: {
+            host: process.env.VITE_HOST || "localhost",
+            port: process.env.VITE_PORT || 5173,
+        },
+
+        plugins: [
+            vue(),
+
+            laravel({
+                hotFile: "../../../public/member-default-vite.hot",
+                publicDirectory: "../../../public",
+                buildDirectory: "themes/member/default/build",
+                input: [
+                    "src/Resources/assets/css/app.css",
+                    "src/Resources/assets/js/app.js",
+                ],
+                refresh: true,
+            }),
+        ],
+
+        experimental: {
+            renderBuiltUrl(filename, { hostId, hostType, type }) {
+                if (hostType === "css") {
+                    return path.basename(filename);
+                }
+            },
+        },
+    };
+});