chore: remove committed build artifacts and dead files, archive stray root docs
Root had accumulated files that should never have been tracked:
- Committed build output: TaxBaik.Web.*.json (runtimeconfig/deps), and a
225-file root wwwroot/ that duplicated (and was staler than)
TaxBaik.Web/wwwroot/.
- A stale migrations/ (V001-V003 only) superseded by db/migrations/, which
is the directory MigrationRunner and CI actually use.
- An orphaned root appsettings.json (dev DB password + JWT secret) that the
app's content root (TaxBaik.Web/) never actually loads.
- Ad-hoc debug/log scratch files: debug-settings.js, final-test.js,
test-settings.js, settings-page.png, login-test-output.log,
server.{err,out}.log.
- docker-compose.yml, Dockerfile.*, web.config, SERVER_SETUP.sh, deploy.sh,
remote_deploy.sh - none referenced by any .gitea/workflows/*.yml; leftovers
from a Docker/manual-deploy approach superseded by deploy_gb.sh's
systemd + Green-Blue proxy model.
- Tmp/ - screenshots and a scratch html/js, exactly the "temp work
committed to root" problem.
None of this is destroyed - it stays recoverable via git history if ever
needed. Historical root-level docs (BLOG_TEMPLATE.md, DEPLOYMENT_GUIDE.md,
etc.) are moved into docs/archive/ rather than deleted, since docs/INDEX.md
already treats anything outside docs/ as non-canonical reference material.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
This commit is contained in:
@@ -1,9 +0,0 @@
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY ./publish/ .
|
||||
|
||||
EXPOSE 5001
|
||||
|
||||
ENTRYPOINT ["dotnet", "TaxBaik.Web.dll"]
|
||||
@@ -1,9 +0,0 @@
|
||||
FROM mcr.microsoft.com/dotnet/aspnet:10.0-alpine
|
||||
|
||||
WORKDIR /app
|
||||
|
||||
COPY ./publish/ .
|
||||
|
||||
EXPOSE 5001
|
||||
|
||||
ENTRYPOINT ["dotnet", "TaxBaik.Web.dll"]
|
||||
@@ -1,77 +0,0 @@
|
||||
#!/bin/bash
|
||||
# TaxBaik Server Setup Script
|
||||
# Run on Ubuntu 26.04 server as root or with sudo
|
||||
|
||||
set -e
|
||||
|
||||
echo "===== TaxBaik Server Setup ====="
|
||||
|
||||
# Colors for output
|
||||
GREEN='\033[0;32m'
|
||||
BLUE='\033[0;34m'
|
||||
NC='\033[0m' # No Color
|
||||
|
||||
# Configuration
|
||||
DEPLOY_USER="kjh2064"
|
||||
DB_NAME="taxbaikdb"
|
||||
DB_USER="taxbaik"
|
||||
DB_PASSWORD="${DB_PASSWORD:-$(openssl rand -base64 12)}" # Use env var or generate
|
||||
DEPLOY_DIR="/home/$DEPLOY_USER"
|
||||
|
||||
echo -e "${BLUE}1. Installing .NET 8 Runtime${NC}"
|
||||
sudo apt-get update
|
||||
sudo apt-get install -y dotnet-runtime-8.0 aspnetcore-runtime-8.0
|
||||
|
||||
echo -e "${BLUE}2. Installing PostgreSQL 18${NC}"
|
||||
sudo apt-get install -y postgresql postgresql-contrib
|
||||
|
||||
echo -e "${BLUE}3. Creating database and user${NC}"
|
||||
sudo -u postgres psql << EOF
|
||||
CREATE USER $DB_USER WITH PASSWORD '$DB_PASSWORD';
|
||||
CREATE DATABASE $DB_NAME OWNER $DB_USER;
|
||||
GRANT ALL PRIVILEGES ON DATABASE $DB_NAME TO $DB_USER;
|
||||
EOF
|
||||
|
||||
echo -e "${BLUE}4. Creating deployment directories${NC}"
|
||||
sudo -u $DEPLOY_USER mkdir -p $DEPLOY_DIR/deployments
|
||||
sudo -u $DEPLOY_USER mkdir -p $DEPLOY_DIR/taxbaik_active
|
||||
sudo -u $DEPLOY_USER mkdir -p $DEPLOY_DIR/taxbaik_admin_active
|
||||
|
||||
echo -e "${BLUE}5. Installing systemd service files${NC}"
|
||||
sudo cp deploy/taxbaik.service /etc/systemd/system/
|
||||
sudo cp deploy/taxbaik-admin.service /etc/systemd/system/
|
||||
|
||||
# Update environment variables in service files
|
||||
sudo sed -i "s/YOUR_SECURE_PASSWORD_HERE/$DB_PASSWORD/g" /etc/systemd/system/taxbaik.service
|
||||
sudo sed -i "s/YOUR_SECURE_PASSWORD_HERE/$DB_PASSWORD/g" /etc/systemd/system/taxbaik-admin.service
|
||||
|
||||
echo -e "${BLUE}6. Configuring Nginx${NC}"
|
||||
sudo mkdir -p /etc/nginx/conf.d
|
||||
sudo cp deploy/nginx-taxbaik-locations.conf /etc/nginx/conf.d/taxbaik.conf
|
||||
sudo nginx -t
|
||||
sudo systemctl reload nginx
|
||||
|
||||
echo -e "${BLUE}7. Enabling services${NC}"
|
||||
sudo systemctl daemon-reload
|
||||
sudo systemctl enable taxbaik taxbaik-admin
|
||||
sudo systemctl enable postgresql
|
||||
|
||||
echo -e "${GREEN}===== Setup Complete ====="
|
||||
echo ""
|
||||
echo "Database credentials:"
|
||||
echo " Host: localhost"
|
||||
echo " Database: $DB_NAME"
|
||||
echo " User: $DB_USER"
|
||||
echo " Password: $DB_PASSWORD"
|
||||
echo ""
|
||||
echo "Next steps:"
|
||||
echo " 1. Copy the first deployment to ~/deployments/taxbaik_TIMESTAMP/"
|
||||
echo " 2. Create symlinks:"
|
||||
echo " ln -s ~/deployments/taxbaik_TIMESTAMP ~/taxbaik_active"
|
||||
echo " ln -s ~/deployments/taxbaik_admin_TIMESTAMP ~/taxbaik_admin_active"
|
||||
echo " 3. Start services:"
|
||||
echo " sudo systemctl start taxbaik taxbaik-admin"
|
||||
echo " 4. Verify:"
|
||||
echo " sudo systemctl status taxbaik taxbaik-admin"
|
||||
echo " curl http://127.0.0.1:5001/taxbaik"
|
||||
echo " curl http://127.0.0.1:5002/taxbaik/admin/login"
|
||||
@@ -1,52 +0,0 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net10.0",
|
||||
"includedFrameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "10.0.0"
|
||||
}
|
||||
],
|
||||
"wasmHostProperties": {
|
||||
"perHostConfig": [
|
||||
{
|
||||
"name": "browser",
|
||||
"host": "browser"
|
||||
}
|
||||
]
|
||||
},
|
||||
"configProperties": {
|
||||
"Microsoft.AspNetCore.Components.Routing.RegexConstraintSupport": false,
|
||||
"Microsoft.Extensions.DependencyInjection.VerifyOpenGenericServiceTrimmability": true,
|
||||
"System.ComponentModel.DefaultValueAttribute.IsSupported": false,
|
||||
"System.ComponentModel.Design.IDesignerHost.IsSupported": false,
|
||||
"System.ComponentModel.TypeConverter.EnableUnsafeBinaryFormatterInDesigntimeLicenseContextSerialization": false,
|
||||
"System.ComponentModel.TypeDescriptor.IsComObjectDescriptorSupported": false,
|
||||
"System.Data.DataSet.XmlSerializationIsSupported": false,
|
||||
"System.Diagnostics.Debugger.IsSupported": false,
|
||||
"System.Diagnostics.Metrics.Meter.IsSupported": false,
|
||||
"System.Diagnostics.Tracing.EventSource.IsSupported": false,
|
||||
"System.GC.Server": true,
|
||||
"System.Globalization.Invariant": false,
|
||||
"System.TimeZoneInfo.Invariant": false,
|
||||
"System.Linq.Enumerable.IsSizeOptimized": true,
|
||||
"System.Net.Http.EnableActivityPropagation": false,
|
||||
"System.Net.Http.WasmEnableStreamingResponse": true,
|
||||
"System.Net.SocketsHttpHandler.Http3Support": false,
|
||||
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
|
||||
"System.Resources.ResourceManager.AllowCustomResourceTypes": false,
|
||||
"System.Resources.UseSystemResourceKeys": true,
|
||||
"System.Runtime.CompilerServices.RuntimeFeature.IsDynamicCodeSupported": true,
|
||||
"System.Runtime.InteropServices.BuiltInComInterop.IsSupported": false,
|
||||
"System.Runtime.InteropServices.EnableConsumingManagedCodeFromNativeHosting": false,
|
||||
"System.Runtime.InteropServices.EnableCppCLIHostActivation": false,
|
||||
"System.Runtime.InteropServices.Marshalling.EnableGeneratedComInterfaceComImportInterop": false,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false,
|
||||
"System.StartupHookProvider.IsSupported": false,
|
||||
"System.Text.Encoding.EnableUnsafeUTF7Encoding": false,
|
||||
"System.Text.Json.JsonSerializer.IsReflectionEnabledByDefault": true,
|
||||
"System.Threading.Thread.EnableAutoreleasePool": false,
|
||||
"Microsoft.AspNetCore.Components.Endpoints.NavigationManager.DisableThrowNavigationException": false
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,573 +0,0 @@
|
||||
{
|
||||
"runtimeTarget": {
|
||||
"name": ".NETCoreApp,Version=v10.0",
|
||||
"signature": ""
|
||||
},
|
||||
"compilationOptions": {},
|
||||
"targets": {
|
||||
".NETCoreApp,Version=v10.0": {
|
||||
"TaxBaik.Web/1.0.0": {
|
||||
"dependencies": {
|
||||
"BCrypt.Net-Next": "4.0.3",
|
||||
"Microsoft.AspNetCore.Authentication.Google": "10.0.9",
|
||||
"Microsoft.AspNetCore.Authentication.JwtBearer": "10.0.9",
|
||||
"Microsoft.AspNetCore.Components.WebAssembly.Server": "10.0.9",
|
||||
"Microsoft.IdentityModel.Tokens": "8.19.1",
|
||||
"MudBlazor": "6.10.0",
|
||||
"Serilog.AspNetCore": "8.0.1",
|
||||
"Serilog.Sinks.Console": "6.0.0",
|
||||
"Serilog.Sinks.File": "5.0.0",
|
||||
"System.IdentityModel.Tokens.Jwt": "8.19.1",
|
||||
"TaxBaik.Application": "1.0.0",
|
||||
"TaxBaik.Infrastructure": "1.0.0",
|
||||
"TaxBaik.Web.Client": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"TaxBaik.Web.dll": {}
|
||||
}
|
||||
},
|
||||
"BCrypt.Net-Next/4.0.3": {
|
||||
"runtime": {
|
||||
"lib/net6.0/BCrypt.Net-Next.dll": {
|
||||
"assemblyVersion": "4.0.3.0",
|
||||
"fileVersion": "4.0.3.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Dapper/2.1.15": {
|
||||
"runtime": {
|
||||
"lib/net5.0/Dapper.dll": {
|
||||
"assemblyVersion": "2.0.0.0",
|
||||
"fileVersion": "2.1.15.52653"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Authentication.Google/10.0.9": {
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.AspNetCore.Authentication.Google.dll": {
|
||||
"assemblyVersion": "10.0.9.0",
|
||||
"fileVersion": "10.0.926.27113"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Authentication.JwtBearer/10.0.9": {
|
||||
"dependencies": {
|
||||
"Microsoft.IdentityModel.Protocols.OpenIdConnect": "8.0.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.AspNetCore.Authentication.JwtBearer.dll": {
|
||||
"assemblyVersion": "10.0.9.0",
|
||||
"fileVersion": "10.0.926.27113"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.WebAssembly/10.0.9": {
|
||||
"dependencies": {
|
||||
"Microsoft.JSInterop.WebAssembly": "10.0.9"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.AspNetCore.Components.WebAssembly.dll": {
|
||||
"assemblyVersion": "10.0.9.0",
|
||||
"fileVersion": "10.0.926.27113"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.WebAssembly.Server/10.0.9": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Components.WebAssembly": "10.0.9"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.AspNetCore.Components.WebAssembly.Server.dll": {
|
||||
"assemblyVersion": "10.0.9.0",
|
||||
"fileVersion": "10.0.926.27113"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Bcl.Cryptography/10.0.2": {
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.Bcl.Cryptography.dll": {
|
||||
"assemblyVersion": "10.0.0.2",
|
||||
"fileVersion": "10.0.225.61305"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.Extensions.DependencyModel/8.0.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Microsoft.Extensions.DependencyModel.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.23.53103"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.IdentityModel.Abstractions/8.19.1": {
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.IdentityModel.Abstractions.dll": {
|
||||
"assemblyVersion": "8.19.1.0",
|
||||
"fileVersion": "8.19.1.26153"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.IdentityModel.JsonWebTokens/8.19.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.IdentityModel.Tokens": "8.19.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.IdentityModel.JsonWebTokens.dll": {
|
||||
"assemblyVersion": "8.19.1.0",
|
||||
"fileVersion": "8.19.1.26153"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.IdentityModel.Logging/8.19.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.IdentityModel.Abstractions": "8.19.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.IdentityModel.Logging.dll": {
|
||||
"assemblyVersion": "8.19.1.0",
|
||||
"fileVersion": "8.19.1.26153"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.IdentityModel.Protocols/8.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.IdentityModel.Tokens": "8.19.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.IdentityModel.Protocols.dll": {
|
||||
"assemblyVersion": "8.0.1.0",
|
||||
"fileVersion": "8.0.1.50722"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.IdentityModel.Protocols": "8.0.1",
|
||||
"System.IdentityModel.Tokens.Jwt": "8.19.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net9.0/Microsoft.IdentityModel.Protocols.OpenIdConnect.dll": {
|
||||
"assemblyVersion": "8.0.1.0",
|
||||
"fileVersion": "8.0.1.50722"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.IdentityModel.Tokens/8.19.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.Bcl.Cryptography": "10.0.2",
|
||||
"Microsoft.IdentityModel.Logging": "8.19.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.IdentityModel.Tokens.dll": {
|
||||
"assemblyVersion": "8.19.1.0",
|
||||
"fileVersion": "8.19.1.26153"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Microsoft.JSInterop.WebAssembly/10.0.9": {
|
||||
"runtime": {
|
||||
"lib/net10.0/Microsoft.JSInterop.WebAssembly.dll": {
|
||||
"assemblyVersion": "10.0.9.0",
|
||||
"fileVersion": "10.0.926.27113"
|
||||
}
|
||||
}
|
||||
},
|
||||
"MudBlazor/6.10.0": {
|
||||
"runtime": {
|
||||
"lib/net7.0/MudBlazor.dll": {
|
||||
"assemblyVersion": "6.10.0.0",
|
||||
"fileVersion": "6.10.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Npgsql/10.0.3": {
|
||||
"runtime": {
|
||||
"lib/net10.0/Npgsql.dll": {
|
||||
"assemblyVersion": "10.0.3.0",
|
||||
"fileVersion": "10.0.3.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog/4.0.0": {
|
||||
"runtime": {
|
||||
"lib/net8.0/Serilog.dll": {
|
||||
"assemblyVersion": "4.0.0.0",
|
||||
"fileVersion": "4.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.AspNetCore/8.0.1": {
|
||||
"dependencies": {
|
||||
"Serilog": "4.0.0",
|
||||
"Serilog.Extensions.Hosting": "8.0.0",
|
||||
"Serilog.Extensions.Logging": "8.0.0",
|
||||
"Serilog.Formatting.Compact": "2.0.0",
|
||||
"Serilog.Settings.Configuration": "8.0.0",
|
||||
"Serilog.Sinks.Console": "6.0.0",
|
||||
"Serilog.Sinks.Debug": "2.0.0",
|
||||
"Serilog.Sinks.File": "5.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Serilog.AspNetCore.dll": {
|
||||
"assemblyVersion": "8.0.1.0",
|
||||
"fileVersion": "8.0.1.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Extensions.Hosting/8.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "4.0.0",
|
||||
"Serilog.Extensions.Logging": "8.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Serilog.Extensions.Hosting.dll": {
|
||||
"assemblyVersion": "7.0.0.0",
|
||||
"fileVersion": "8.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Extensions.Logging/8.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "4.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Serilog.Extensions.Logging.dll": {
|
||||
"assemblyVersion": "7.0.0.0",
|
||||
"fileVersion": "8.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Formatting.Compact/2.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "4.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net7.0/Serilog.Formatting.Compact.dll": {
|
||||
"assemblyVersion": "2.0.0.0",
|
||||
"fileVersion": "2.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Settings.Configuration/8.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.Extensions.DependencyModel": "8.0.0",
|
||||
"Serilog": "4.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Serilog.Settings.Configuration.dll": {
|
||||
"assemblyVersion": "8.0.0.0",
|
||||
"fileVersion": "8.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Sinks.Console/6.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "4.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net8.0/Serilog.Sinks.Console.dll": {
|
||||
"assemblyVersion": "6.0.0.0",
|
||||
"fileVersion": "6.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Sinks.Debug/2.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "4.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/netstandard2.1/Serilog.Sinks.Debug.dll": {
|
||||
"assemblyVersion": "2.0.0.0",
|
||||
"fileVersion": "2.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"Serilog.Sinks.File/5.0.0": {
|
||||
"dependencies": {
|
||||
"Serilog": "4.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net5.0/Serilog.Sinks.File.dll": {
|
||||
"assemblyVersion": "5.0.0.0",
|
||||
"fileVersion": "5.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"System.IdentityModel.Tokens.Jwt/8.19.1": {
|
||||
"dependencies": {
|
||||
"Microsoft.IdentityModel.JsonWebTokens": "8.19.1",
|
||||
"Microsoft.IdentityModel.Tokens": "8.19.1"
|
||||
},
|
||||
"runtime": {
|
||||
"lib/net10.0/System.IdentityModel.Tokens.Jwt.dll": {
|
||||
"assemblyVersion": "8.19.1.0",
|
||||
"fileVersion": "8.19.1.26153"
|
||||
}
|
||||
}
|
||||
},
|
||||
"TaxBaik.Application/1.0.0": {
|
||||
"dependencies": {
|
||||
"TaxBaik.Domain": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"TaxBaik.Application.dll": {
|
||||
"assemblyVersion": "1.0.0.0",
|
||||
"fileVersion": "1.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"TaxBaik.Domain/1.0.0": {
|
||||
"runtime": {
|
||||
"TaxBaik.Domain.dll": {
|
||||
"assemblyVersion": "1.0.0.0",
|
||||
"fileVersion": "1.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"TaxBaik.Infrastructure/1.0.0": {
|
||||
"dependencies": {
|
||||
"Dapper": "2.1.15",
|
||||
"Npgsql": "10.0.3",
|
||||
"TaxBaik.Domain": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"TaxBaik.Infrastructure.dll": {
|
||||
"assemblyVersion": "1.0.0.0",
|
||||
"fileVersion": "1.0.0.0"
|
||||
}
|
||||
}
|
||||
},
|
||||
"TaxBaik.Web.Client/1.0.0": {
|
||||
"dependencies": {
|
||||
"Microsoft.AspNetCore.Components.WebAssembly": "10.0.9",
|
||||
"Microsoft.IdentityModel.Tokens": "8.19.1",
|
||||
"MudBlazor": "6.10.0",
|
||||
"System.IdentityModel.Tokens.Jwt": "8.19.1",
|
||||
"TaxBaik.Application": "1.0.0"
|
||||
},
|
||||
"runtime": {
|
||||
"TaxBaik.Web.Client.dll": {
|
||||
"assemblyVersion": "1.0.0.0",
|
||||
"fileVersion": "1.0.0.0"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
},
|
||||
"libraries": {
|
||||
"TaxBaik.Web/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"BCrypt.Net-Next/4.0.3": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-W+U9WvmZQgi5cX6FS5GDtDoPzUCV4LkBLkywq/kRZhuDwcbavOzcDAr3LXJFqHUi952Yj3LEYoWW0jbEUQChsA==",
|
||||
"path": "bcrypt.net-next/4.0.3",
|
||||
"hashPath": "bcrypt.net-next.4.0.3.nupkg.sha512"
|
||||
},
|
||||
"Dapper/2.1.15": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-1aWSAosZymEM+mRwfrXteRIN74/JTUjqj9B/KqEbanH6vfUKy9D9cemRN0q1ZOEfSB7d1PpFTpVOCbf2Uv70Og==",
|
||||
"path": "dapper/2.1.15",
|
||||
"hashPath": "dapper.2.1.15.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Authentication.Google/10.0.9": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-xqjTc8/ap0dwKmdaqSlV8RxjXb02uQ8rynDtTuHRU2gmOYaNm6O+uUjobp4Ararzq0ndKNXiWnQErxjWEGFGiA==",
|
||||
"path": "microsoft.aspnetcore.authentication.google/10.0.9",
|
||||
"hashPath": "microsoft.aspnetcore.authentication.google.10.0.9.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Authentication.JwtBearer/10.0.9": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-Hs5NDsGm8YicDDNx5RoBIT+H2AB9R27MvZ2gHoupTiHr+nnH3VxzY7DcmlbJ3b5DvvOhK35lWt/9Odtrq9sjtA==",
|
||||
"path": "microsoft.aspnetcore.authentication.jwtbearer/10.0.9",
|
||||
"hashPath": "microsoft.aspnetcore.authentication.jwtbearer.10.0.9.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.WebAssembly/10.0.9": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-tBv68AsZ3r6z2QdV2m3cSSKUCbvEscN8REpHxcUs22vlR6UjTz6IKdInKNREkJ/3G1AQrBKrRTdrfrHVffE8Iw==",
|
||||
"path": "microsoft.aspnetcore.components.webassembly/10.0.9",
|
||||
"hashPath": "microsoft.aspnetcore.components.webassembly.10.0.9.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.AspNetCore.Components.WebAssembly.Server/10.0.9": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ZTtYvBILwGxhIiXi1L03ETBBOgMmizStu7dO/YblK6rPTa27wpEgYKp5Z9bUfr+wsFvHIDWd/ZMGb9on41f6yw==",
|
||||
"path": "microsoft.aspnetcore.components.webassembly.server/10.0.9",
|
||||
"hashPath": "microsoft.aspnetcore.components.webassembly.server.10.0.9.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Bcl.Cryptography/10.0.2": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-LG9Yll3B5aNpxv0+D47g6LiOiKBIlodhcHdQwcYzo8VeexFLGqx5ymetmA2aBRyo9cCcWsQWrFsdbsr8LvmWDw==",
|
||||
"path": "microsoft.bcl.cryptography/10.0.2",
|
||||
"hashPath": "microsoft.bcl.cryptography.10.0.2.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.Extensions.DependencyModel/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-NSmDw3K0ozNDgShSIpsZcbFIzBX4w28nDag+TfaQujkXGazBm+lid5onlWoCBy4VsLxqnnKjEBbGSJVWJMf43g==",
|
||||
"path": "microsoft.extensions.dependencymodel/8.0.0",
|
||||
"hashPath": "microsoft.extensions.dependencymodel.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.IdentityModel.Abstractions/8.19.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-gFA8THIk23uNF/vMdOHnjIdXD1LyA2g12cHzMJ+Xag6WpgWLw6E/6uCXxvA0gp9d2yAvkRt3xzFzMUiO/hofnQ==",
|
||||
"path": "microsoft.identitymodel.abstractions/8.19.1",
|
||||
"hashPath": "microsoft.identitymodel.abstractions.8.19.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.IdentityModel.JsonWebTokens/8.19.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-6eeY+y2QFyjj3XnCz/8gJdoP5smYHTS9ow1bw2nsZzDIPjPhBZlackYTIduSMipVpxnoT/B62LkrXX2jPggOXg==",
|
||||
"path": "microsoft.identitymodel.jsonwebtokens/8.19.1",
|
||||
"hashPath": "microsoft.identitymodel.jsonwebtokens.8.19.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.IdentityModel.Logging/8.19.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-H+sMrMpdbWnwkQnpb/ESkQovtOgdefmj0ecGCcP40mDKzE5i4dUYkH6599M9mWYFNGNJnTp92l/9wLubYXWimw==",
|
||||
"path": "microsoft.identitymodel.logging/8.19.1",
|
||||
"hashPath": "microsoft.identitymodel.logging.8.19.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.IdentityModel.Protocols/8.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-uA2vpKqU3I2mBBEaeJAWPTjT9v1TZrGWKdgK6G5qJd03CLx83kdiqO9cmiK8/n1erkHzFBwU/RphP83aAe3i3g==",
|
||||
"path": "microsoft.identitymodel.protocols/8.0.1",
|
||||
"hashPath": "microsoft.identitymodel.protocols.8.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.IdentityModel.Protocols.OpenIdConnect/8.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-AQDbfpL+yzuuGhO/mQhKNsp44pm5Jv8/BI4KiFXR7beVGZoSH35zMV3PrmcfvSTsyI6qrcR898NzUauD6SRigg==",
|
||||
"path": "microsoft.identitymodel.protocols.openidconnect/8.0.1",
|
||||
"hashPath": "microsoft.identitymodel.protocols.openidconnect.8.0.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.IdentityModel.Tokens/8.19.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-KDiuSLXud2AFVNAOottd8ztVysfPeHyr4r8gofU3/VKUXlI7oytzGTnPsNJ/B3nui17rgz8wAdWNJOtzPjkUxw==",
|
||||
"path": "microsoft.identitymodel.tokens/8.19.1",
|
||||
"hashPath": "microsoft.identitymodel.tokens.8.19.1.nupkg.sha512"
|
||||
},
|
||||
"Microsoft.JSInterop.WebAssembly/10.0.9": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-4G0A7GuQrtCAes8PuJPTDUcy+lCrxHWjr8ZlkDOa4h8a2Txj1XdhbXKLnld2vMY5EyZNC5jZXxa1xTD/AOCUlw==",
|
||||
"path": "microsoft.jsinterop.webassembly/10.0.9",
|
||||
"hashPath": "microsoft.jsinterop.webassembly.10.0.9.nupkg.sha512"
|
||||
},
|
||||
"MudBlazor/6.10.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-Dpjouo3MVva4p8Nh2VCzHzvzReWhnzmCBNlrhymeXjn6oBEtT3Oi9z/R2sHOg/jYrW/hIPKMhfZHnptilHScsw==",
|
||||
"path": "mudblazor/6.10.0",
|
||||
"hashPath": "mudblazor.6.10.0.nupkg.sha512"
|
||||
},
|
||||
"Npgsql/10.0.3": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-7nb5YzXuvWWJxB0J8DiyL3we+X4FOctZrt0fIBnucOIaIevFEEwGQVZKtiu9olXdlNAK1eNgqSral6r/jlhI4w==",
|
||||
"path": "npgsql/10.0.3",
|
||||
"hashPath": "npgsql.10.0.3.nupkg.sha512"
|
||||
},
|
||||
"Serilog/4.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-2jDkUrSh5EofOp7Lx5Zgy0EB+7hXjjxE2ktTb1WVQmU00lDACR2TdROGKU0K1pDTBSJBN1PqgYpgOZF8mL7NJw==",
|
||||
"path": "serilog/4.0.0",
|
||||
"hashPath": "serilog.4.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.AspNetCore/8.0.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-B/X+wAfS7yWLVOTD83B+Ip9yl4MkhioaXj90JSoWi1Ayi8XHepEnsBdrkojg08eodCnmOKmShFUN2GgEc6c0CQ==",
|
||||
"path": "serilog.aspnetcore/8.0.1",
|
||||
"hashPath": "serilog.aspnetcore.8.0.1.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Extensions.Hosting/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-db0OcbWeSCvYQkHWu6n0v40N4kKaTAXNjlM3BKvcbwvNzYphQFcBR+36eQ/7hMMwOkJvAyLC2a9/jNdUL5NjtQ==",
|
||||
"path": "serilog.extensions.hosting/8.0.0",
|
||||
"hashPath": "serilog.extensions.hosting.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Extensions.Logging/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-YEAMWu1UnWgf1c1KP85l1SgXGfiVo0Rz6x08pCiPOIBt2Qe18tcZLvdBUuV5o1QHvrs8FAry9wTIhgBRtjIlEg==",
|
||||
"path": "serilog.extensions.logging/8.0.0",
|
||||
"hashPath": "serilog.extensions.logging.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Formatting.Compact/2.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-ob6z3ikzFM3D1xalhFuBIK1IOWf+XrQq+H4KeH4VqBcPpNcmUgZlRQ2h3Q7wvthpdZBBoY86qZOI2LCXNaLlNA==",
|
||||
"path": "serilog.formatting.compact/2.0.0",
|
||||
"hashPath": "serilog.formatting.compact.2.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Settings.Configuration/8.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-nR0iL5HwKj5v6ULo3/zpP8NMcq9E2pxYA6XKTSWCbugVs4YqPyvaqaKOY+OMpPivKp7zMEpax2UKHnDodbRB0Q==",
|
||||
"path": "serilog.settings.configuration/8.0.0",
|
||||
"hashPath": "serilog.settings.configuration.8.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Sinks.Console/6.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-fQGWqVMClCP2yEyTXPIinSr5c+CBGUvBybPxjAGcf7ctDhadFhrQw03Mv8rJ07/wR5PDfFjewf2LimvXCDzpbA==",
|
||||
"path": "serilog.sinks.console/6.0.0",
|
||||
"hashPath": "serilog.sinks.console.6.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Sinks.Debug/2.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-Y6g3OBJ4JzTyyw16fDqtFcQ41qQAydnEvEqmXjhwhgjsnG/FaJ8GUqF5ldsC/bVkK8KYmqrPhDO+tm4dF6xx4A==",
|
||||
"path": "serilog.sinks.debug/2.0.0",
|
||||
"hashPath": "serilog.sinks.debug.2.0.0.nupkg.sha512"
|
||||
},
|
||||
"Serilog.Sinks.File/5.0.0": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-uwV5hdhWPwUH1szhO8PJpFiahqXmzPzJT/sOijH/kFgUx+cyoDTMM8MHD0adw9+Iem6itoibbUXHYslzXsLEAg==",
|
||||
"path": "serilog.sinks.file/5.0.0",
|
||||
"hashPath": "serilog.sinks.file.5.0.0.nupkg.sha512"
|
||||
},
|
||||
"System.IdentityModel.Tokens.Jwt/8.19.1": {
|
||||
"type": "package",
|
||||
"serviceable": true,
|
||||
"sha512": "sha512-2VHcRtT95GAcW1E3aVBLvL2rAAMxKHXKMXKXFyWzwgkdFXZPMMvP8tVOfnRydL4vTr1RirNuGC6T8VSEF2YsPQ==",
|
||||
"path": "system.identitymodel.tokens.jwt/8.19.1",
|
||||
"hashPath": "system.identitymodel.tokens.jwt.8.19.1.nupkg.sha512"
|
||||
},
|
||||
"TaxBaik.Application/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"TaxBaik.Domain/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"TaxBaik.Infrastructure/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
},
|
||||
"TaxBaik.Web.Client/1.0.0": {
|
||||
"type": "project",
|
||||
"serviceable": false,
|
||||
"sha512": ""
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,20 +0,0 @@
|
||||
{
|
||||
"runtimeOptions": {
|
||||
"tfm": "net10.0",
|
||||
"frameworks": [
|
||||
{
|
||||
"name": "Microsoft.NETCore.App",
|
||||
"version": "10.0.0"
|
||||
},
|
||||
{
|
||||
"name": "Microsoft.AspNetCore.App",
|
||||
"version": "10.0.0"
|
||||
}
|
||||
],
|
||||
"configProperties": {
|
||||
"System.GC.Server": true,
|
||||
"System.Reflection.Metadata.MetadataUpdater.IsSupported": false,
|
||||
"System.Runtime.Serialization.EnableUnsafeBinaryFormatterSerialization": false
|
||||
}
|
||||
}
|
||||
}
|
||||
File diff suppressed because one or more lines are too long
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 50 KiB |
-1603
File diff suppressed because it is too large
Load Diff
@@ -1,514 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1">
|
||||
<script src="./support.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<x-dc>
|
||||
<helmet>
|
||||
<link rel="preconnect" href="https://fonts.googleapis.com">
|
||||
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
|
||||
<link href="https://fonts.googleapis.com/css2?family=Hahmlet:wght@600;700;900&display=swap" rel="stylesheet">
|
||||
<link rel="stylesheet" href="https://cdn.jsdelivr.net/npm/pretendard@latest/dist/web/static/pretendard.css">
|
||||
<style>
|
||||
@keyframes fadeUp { from{opacity:0;transform:translateY(36px)} to{opacity:1;transform:translateY(0)} }
|
||||
@keyframes fadeIn { from{opacity:0} to{opacity:1} }
|
||||
*,*::before,*::after{box-sizing:border-box;margin:0;padding:0}
|
||||
html{scroll-behavior:smooth}
|
||||
body{font-family:'Pretendard',-apple-system,BlinkMacSystemFont,sans-serif;background:#fafaf8;color:#1a2232;overflow-x:hidden;line-height:1.7}
|
||||
::selection{background:rgba(201,168,76,0.22)}
|
||||
a{text-decoration:none;color:inherit}
|
||||
button{cursor:pointer;font-family:inherit;border:none;background:none}
|
||||
@media(max-width:768px){
|
||||
.nav-links{display:none!important}
|
||||
.section-px{padding-left:24px!important;padding-right:24px!important}
|
||||
}
|
||||
</style>
|
||||
</helmet>
|
||||
|
||||
<!-- ── NAV ── -->
|
||||
<nav style="{{ navStyle }}">
|
||||
<div style="{{ navLogoStyle }}">백원숙 세무사</div>
|
||||
<div style="display:flex;gap:28px;align-items:center;" class="nav-links">
|
||||
<a href="#about" style="{{ navLinkStyle }}" style-hover="color:#c9a84c;">소개</a>
|
||||
<a href="#services" style="{{ navLinkStyle }}" style-hover="color:#c9a84c;">서비스</a>
|
||||
<a href="#customers" style="{{ navLinkStyle }}" style-hover="color:#c9a84c;">고객유형</a>
|
||||
<a href="#faq" style="{{ navLinkStyle }}" style-hover="color:#c9a84c;">FAQ</a>
|
||||
<a href="#contact" style="background:#c9a84c;color:#0d2340;padding:10px 22px;border-radius:5px;font-size:0.875rem;font-weight:700;transition:filter 0.2s;" style-hover="filter:brightness(0.92);">상담 예약</a>
|
||||
</div>
|
||||
</nav>
|
||||
|
||||
<!-- ── HERO ── -->
|
||||
<section style="min-height:100vh;background:#0d2340;display:flex;align-items:center;position:relative;overflow:hidden;">
|
||||
<div style="position:absolute;top:-180px;right:-180px;width:760px;height:760px;border-radius:50%;border:1px solid rgba(201,168,76,0.12);pointer-events:none;"></div>
|
||||
<div style="position:absolute;top:-80px;right:-80px;width:460px;height:460px;border-radius:50%;border:1px solid rgba(201,168,76,0.07);pointer-events:none;"></div>
|
||||
<div style="position:absolute;bottom:0;left:0;right:0;height:1px;background:linear-gradient(90deg,transparent,rgba(201,168,76,0.25),transparent);"></div>
|
||||
|
||||
<div style="max-width:1200px;margin:0 auto;width:100%;padding:140px 60px 90px;" class="section-px">
|
||||
<div style="animation:fadeIn 0.7s ease both;margin-bottom:18px;">
|
||||
<span style="font-size:0.72rem;letter-spacing:0.22em;color:#c9a84c;font-weight:600;text-transform:uppercase;">공인 세무사 · 부동산중개사 · 보험설계사</span>
|
||||
</div>
|
||||
<h1 style="font-family:'Hahmlet',serif;font-size:clamp(2.4rem,5.5vw,5rem);font-weight:900;color:white;line-height:1.18;letter-spacing:-0.035em;margin-bottom:28px;animation:fadeUp 0.8s ease 0.08s both;">
|
||||
사업의 숫자와<br>
|
||||
가족의 자산을<br>
|
||||
<span style="color:#c9a84c;">함께 지키는 세무사</span>
|
||||
</h1>
|
||||
<p style="font-size:clamp(0.95rem,1.8vw,1.1rem);color:rgba(255,255,255,0.65);max-width:540px;line-height:2;margin-bottom:44px;animation:fadeUp 0.8s ease 0.18s both;">
|
||||
스마트스토어·프리랜서·개인사업자부터 부동산·가족자산까지 —<br>전국 어디서나 <strong style="color:rgba(255,255,255,0.9);font-weight:600;">비대면 온라인 상담</strong>으로 시작하세요.
|
||||
</p>
|
||||
<div style="display:flex;gap:14px;flex-wrap:wrap;animation:fadeUp 0.8s ease 0.28s both;">
|
||||
<a href="https://pf.kakao.com/_xoxchTX" target="_blank" style="background:#FEE500;color:#3C1E1E;padding:16px 30px;border-radius:6px;font-weight:700;font-size:1rem;display:inline-flex;align-items:center;gap:8px;transition:filter 0.2s;" style-hover="filter:brightness(0.95);">💬 카카오로 상담하기</a>
|
||||
<a href="tel:010-4122-8268" style="background:rgba(255,255,255,0.08);color:white;padding:16px 30px;border-radius:6px;font-weight:500;font-size:1rem;border:1px solid rgba(255,255,255,0.2);transition:background 0.2s;" style-hover="background:rgba(255,255,255,0.14);">📞 010-4122-8268</a>
|
||||
</div>
|
||||
<div style="display:flex;gap:28px;margin-top:60px;animation:fadeUp 0.8s ease 0.38s both;flex-wrap:wrap;padding-top:32px;border-top:1px solid rgba(255,255,255,0.08);">
|
||||
<div style="display:flex;align-items:center;gap:9px;"><div style="width:5px;height:5px;border-radius:50%;background:#c9a84c;flex-shrink:0;"></div><span style="color:rgba(255,255,255,0.45);font-size:0.8rem;font-weight:300;">세무사 자격 (2015)</span></div>
|
||||
<div style="display:flex;align-items:center;gap:9px;"><div style="width:5px;height:5px;border-radius:50%;background:#c9a84c;flex-shrink:0;"></div><span style="color:rgba(255,255,255,0.45);font-size:0.8rem;font-weight:300;">공인 부동산중개사</span></div>
|
||||
<div style="display:flex;align-items:center;gap:9px;"><div style="width:5px;height:5px;border-radius:50%;background:#c9a84c;flex-shrink:0;"></div><span style="color:rgba(255,255,255,0.45);font-size:0.8rem;font-weight:300;">보험설계사 자격</span></div>
|
||||
<div style="display:flex;align-items:center;gap:9px;"><div style="width:5px;height:5px;border-radius:50%;background:#c9a84c;flex-shrink:0;"></div><span style="color:rgba(255,255,255,0.45);font-size:0.8rem;font-weight:300;">전국 비대면 온라인 상담</span></div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── ONLINE TRUST BAR ── -->
|
||||
<div style="background:#1a3a5c;padding:20px 60px;" class="section-px">
|
||||
<div style="max-width:1200px;margin:0 auto;display:flex;align-items:center;justify-content:center;gap:48px;flex-wrap:wrap;">
|
||||
<div style="display:flex;align-items:center;gap:10px;">
|
||||
<span style="font-size:1.1rem;">💻</span>
|
||||
<span style="font-size:0.85rem;color:rgba(255,255,255,0.85);font-weight:500;">전국 비대면 온라인 상담</span>
|
||||
</div>
|
||||
<div style="width:1px;height:18px;background:rgba(255,255,255,0.15);"></div>
|
||||
<div style="display:flex;align-items:center;gap:10px;">
|
||||
<span style="font-size:1.1rem;">💬</span>
|
||||
<span style="font-size:0.85rem;color:rgba(255,255,255,0.85);font-weight:500;">카카오 당일 응답</span>
|
||||
</div>
|
||||
<div style="width:1px;height:18px;background:rgba(255,255,255,0.15);"></div>
|
||||
<div style="display:flex;align-items:center;gap:10px;">
|
||||
<span style="font-size:1.1rem;">📂</span>
|
||||
<span style="font-size:0.85rem;color:rgba(255,255,255,0.85);font-weight:500;">자료 공유 후 온라인 검토</span>
|
||||
</div>
|
||||
<div style="width:1px;height:18px;background:rgba(255,255,255,0.15);"></div>
|
||||
<div style="display:flex;align-items:center;gap:10px;">
|
||||
<span style="font-size:1.1rem;">✅</span>
|
||||
<span style="font-size:0.85rem;color:rgba(255,255,255,0.85);font-weight:500;">방문 없이 신고·기장 가능</span>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<!-- ── ABOUT ── -->
|
||||
<section id="about" style="padding:100px 60px;background:white;" class="section-px">
|
||||
<div style="max-width:1200px;margin:0 auto;">
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:60px;align-items:start;">
|
||||
|
||||
<div style="background:#0d2340;border-radius:20px;padding:52px 44px;">
|
||||
<div style="font-size:0.72rem;letter-spacing:0.18em;color:#c9a84c;font-weight:600;margin-bottom:20px;text-transform:uppercase;">About</div>
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:1.9rem;font-weight:700;color:white;line-height:1.35;margin-bottom:24px;">안녕하세요.<br>백원숙 세무사입니다.</h2>
|
||||
<p style="color:rgba(255,255,255,0.7);line-height:1.95;font-size:0.9rem;margin-bottom:18px;">세무사 자격과 함께 부동산중개사, 보험설계사 자격을 보유하고 있습니다. 사업자 세무, 종합소득세, 부가가치세, 양도세, 증여·상속 상담을 중심으로 운영합니다.</p>
|
||||
<p style="color:rgba(255,255,255,0.7);line-height:1.95;font-size:0.9rem;">저도 집을 사업장으로 등록하고 작게 시작해 본 사람입니다. 처음 사업을 시작하는 대표님의 막막함을 직접 압니다.</p>
|
||||
<div style="margin-top:36px;padding-top:28px;border-top:1px solid rgba(255,255,255,0.1);display:flex;gap:36px;">
|
||||
<div>
|
||||
<div style="font-size:0.76rem;color:rgba(255,255,255,0.38);margin-bottom:6px;">세무사 자격 취득</div>
|
||||
<div style="font-size:1.2rem;font-family:'Hahmlet',serif;font-weight:700;color:#c9a84c;">2015년</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:0.76rem;color:rgba(255,255,255,0.38);margin-bottom:6px;">활동 지역</div>
|
||||
<div style="font-size:1.2rem;font-family:'Hahmlet',serif;font-weight:700;color:#c9a84c;">성북구</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div>
|
||||
<div style="font-size:0.72rem;letter-spacing:0.18em;color:#c9a84c;font-weight:600;margin-bottom:16px;text-transform:uppercase;">Expertise</div>
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:2rem;font-weight:700;color:#0d2340;margin-bottom:36px;line-height:1.3;">세 가지 자격의<br>시너지</h2>
|
||||
<div style="display:flex;flex-direction:column;gap:16px;">
|
||||
<div style="display:flex;gap:18px;padding:24px;border:1.5px solid #ede9e0;border-radius:14px;transition:border-color 0.2s;" style-hover="border-color:#c9a84c;background:#fffdf7;">
|
||||
<div style="width:48px;height:48px;background:#f5f3ee;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;flex-shrink:0;">⚖️</div>
|
||||
<div>
|
||||
<div style="font-weight:700;font-size:0.975rem;color:#0d2340;margin-bottom:5px;">공인 세무사</div>
|
||||
<div style="font-size:0.845rem;color:#6b7e8f;line-height:1.75;">세무신고·장부관리·조세 자문 등 세무 업무 전반을 공식 대리합니다.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex;gap:18px;padding:24px;border:1.5px solid #ede9e0;border-radius:14px;transition:border-color 0.2s;" style-hover="border-color:#c9a84c;background:#fffdf7;">
|
||||
<div style="width:48px;height:48px;background:#f5f3ee;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;flex-shrink:0;">🏠</div>
|
||||
<div>
|
||||
<div style="font-weight:700;font-size:0.975rem;color:#0d2340;margin-bottom:5px;">공인 부동산중개사</div>
|
||||
<div style="font-size:0.845rem;color:#6b7e8f;line-height:1.75;">부동산 거래 구조를 이해해 양도·증여·임대 세무상담에 현실감을 더합니다.</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="display:flex;gap:18px;padding:24px;border:1.5px solid #ede9e0;border-radius:14px;transition:border-color 0.2s;" style-hover="border-color:#c9a84c;background:#fffdf7;">
|
||||
<div style="width:48px;height:48px;background:#f5f3ee;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;flex-shrink:0;">🛡️</div>
|
||||
<div>
|
||||
<div style="font-weight:700;font-size:0.975rem;color:#0d2340;margin-bottom:5px;">보험설계사 자격</div>
|
||||
<div style="font-size:0.845rem;color:#6b7e8f;line-height:1.75;">상속·증여·대표자 리스크 관점에서 가족 현금흐름과 보험 구조를 함께 설명합니다.</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── SERVICES ── -->
|
||||
<section id="services" style="padding:100px 60px;background:#f2f5f9;" class="section-px">
|
||||
<div style="max-width:1200px;margin:0 auto;">
|
||||
<div style="text-align:center;margin-bottom:64px;">
|
||||
<div style="font-size:0.72rem;letter-spacing:0.18em;color:#c9a84c;font-weight:600;margin-bottom:14px;text-transform:uppercase;">Services</div>
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:2.2rem;font-weight:700;color:#0d2340;margin-bottom:14px;">주요 서비스</h2>
|
||||
<p style="color:#6b7e8f;font-size:0.925rem;max-width:460px;margin:0 auto;">신고만 하는 세무가 아니라, 사업과 자산의 흐름을 함께 봅니다.</p>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(300px,1fr));gap:22px;">
|
||||
|
||||
<div style="background:white;border-radius:14px;padding:32px;box-shadow:0 2px 16px rgba(13,35,64,0.06);transition:transform 0.25s ease,box-shadow 0.25s ease;" style-hover="transform:translateY(-5px);box-shadow:0 20px 48px rgba(13,35,64,0.13);">
|
||||
<div style="width:48px;height:48px;background:#edf2f7;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;margin-bottom:20px;">📊</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:8px;text-transform:uppercase;">기장 서비스</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.15rem;font-weight:700;color:#0d2340;margin-bottom:12px;">월 기장 관리</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.855rem;line-height:1.85;">장부 작성, 부가세, 원천세, 인건비, 예상세액까지 — 매월 세금 리스크를 함께 점검합니다.</p>
|
||||
<div style="margin-top:22px;padding-top:18px;border-top:1px solid #eef0f3;font-size:0.775rem;color:#9db0bc;">대상: 매출 발생 사업자</div>
|
||||
</div>
|
||||
|
||||
<div style="background:white;border-radius:14px;padding:32px;box-shadow:0 2px 16px rgba(13,35,64,0.06);transition:transform 0.25s ease,box-shadow 0.25s ease;" style-hover="transform:translateY(-5px);box-shadow:0 20px 48px rgba(13,35,64,0.13);">
|
||||
<div style="width:48px;height:48px;background:#edf2f7;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;margin-bottom:20px;">📋</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:8px;text-transform:uppercase;">소득세</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.15rem;font-weight:700;color:#0d2340;margin-bottom:12px;">종합소득세 신고</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.855rem;line-height:1.85;">사업자, 프리랜서, 보험설계사, 부동산중개사의 소득 유형에 맞는 경비처리와 신고를 안내합니다.</p>
|
||||
<div style="margin-top:22px;padding-top:18px;border-top:1px solid #eef0f3;font-size:0.775rem;color:#9db0bc;">대상: 개인사업자·프리랜서·영업직</div>
|
||||
</div>
|
||||
|
||||
<div style="background:white;border-radius:14px;padding:32px;box-shadow:0 2px 16px rgba(13,35,64,0.06);transition:transform 0.25s ease,box-shadow 0.25s ease;" style-hover="transform:translateY(-5px);box-shadow:0 20px 48px rgba(13,35,64,0.13);">
|
||||
<div style="width:48px;height:48px;background:#fdf8ec;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;margin-bottom:20px;">🏡</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:8px;text-transform:uppercase;">부동산 세무</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.15rem;font-weight:700;color:#0d2340;margin-bottom:12px;">양도세 사전진단</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.855rem;line-height:1.85;">계약 전 보유기간·비과세 여부·필요경비·장기보유특별공제를 검토합니다. 계약 전 상담이 선택지를 넓힙니다.</p>
|
||||
<div style="margin-top:22px;padding-top:18px;border-top:1px solid #eef0f3;font-size:0.775rem;color:#9db0bc;">대상: 부동산 매도 예정자</div>
|
||||
</div>
|
||||
|
||||
<div style="background:white;border-radius:14px;padding:32px;box-shadow:0 2px 16px rgba(13,35,64,0.06);transition:transform 0.25s ease,box-shadow 0.25s ease;" style-hover="transform:translateY(-5px);box-shadow:0 20px 48px rgba(13,35,64,0.13);">
|
||||
<div style="width:48px;height:48px;background:#fdf8ec;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;margin-bottom:20px;">👨👩👧</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:8px;text-transform:uppercase;">자산이전</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.15rem;font-weight:700;color:#0d2340;margin-bottom:12px;">증여·상속 상담</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.855rem;line-height:1.85;">증여 시기, 증여재산 평가, 세부담, 자금출처, 보험 활용 가능성까지 — 가족 자산이전을 사전에 설계합니다.</p>
|
||||
<div style="margin-top:22px;padding-top:18px;border-top:1px solid #eef0f3;font-size:0.775rem;color:#9db0bc;">대상: 자산이전 예정 가족</div>
|
||||
</div>
|
||||
|
||||
<div style="background:white;border-radius:14px;padding:32px;box-shadow:0 2px 16px rgba(13,35,64,0.06);transition:transform 0.25s ease,box-shadow 0.25s ease;" style-hover="transform:translateY(-5px);box-shadow:0 20px 48px rgba(13,35,64,0.13);">
|
||||
<div style="width:48px;height:48px;background:#edf2f7;border-radius:10px;display:flex;align-items:center;justify-content:center;font-size:1.4rem;margin-bottom:20px;">🌱</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:8px;text-transform:uppercase;">첫 세무</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.15rem;font-weight:700;color:#0d2340;margin-bottom:12px;">신규 사업자 세무정리</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.855rem;line-height:1.85;">사업자 유형 확인, 부가세·종소세·증빙관리·세금계좌 분리까지. 처음 사업을 시작하는 대표님을 위한 패키지.</p>
|
||||
<div style="margin-top:22px;padding-top:18px;border-top:1px solid #eef0f3;font-size:0.775rem;color:#9db0bc;">대상: 신규 사업자·프리랜서</div>
|
||||
</div>
|
||||
|
||||
<div style="background:#0d2340;border-radius:14px;padding:32px;display:flex;flex-direction:column;justify-content:space-between;">
|
||||
<div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:16px;text-transform:uppercase;">상담 안내</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.25rem;font-weight:700;color:white;line-height:1.45;margin-bottom:16px;">어떤 세금이<br>걱정이신가요?</h3>
|
||||
<p style="color:rgba(255,255,255,0.6);font-size:0.84rem;line-height:1.85;">세금은 계약·매출·명의·자금 이동 전에 검토할수록 선택지가 많습니다.</p>
|
||||
</div>
|
||||
<a href="https://pf.kakao.com/_xoxchTX" target="_blank" style="display:block;margin-top:28px;background:#c9a84c;color:#0d2340;padding:14px;border-radius:8px;text-align:center;font-weight:700;font-size:0.875rem;transition:filter 0.2s;" style-hover="filter:brightness(1.08);">카카오로 문의하기 →</a>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── CUSTOMER TYPES ── -->
|
||||
<section id="customers" style="padding:100px 60px;background:#1a3a5c;" class="section-px">
|
||||
<div style="max-width:1200px;margin:0 auto;">
|
||||
<div style="text-align:center;margin-bottom:64px;">
|
||||
<div style="font-size:0.72rem;letter-spacing:0.18em;color:#c9a84c;font-weight:600;margin-bottom:14px;text-transform:uppercase;">Who We Help</div>
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:2.2rem;font-weight:700;color:white;margin-bottom:14px;">전국 어디서나, 온라인으로 시작하세요</h2>
|
||||
<p style="color:rgba(255,255,255,0.52);font-size:0.925rem;">방문 없이 카카오·이메일로 상담부터 신고까지 — 온라인 사업자에게 최적화된 세무관리.</p>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:22px;">
|
||||
|
||||
<div style="background:rgba(201,168,76,0.12);border:1px solid rgba(201,168,76,0.35);border-radius:18px;padding:38px;transition:background 0.2s;" style-hover="background:rgba(201,168,76,0.18);">
|
||||
<div style="display:flex;align-items:center;gap:10px;margin-bottom:16px;">
|
||||
<span style="font-size:1.8rem;">💻</span>
|
||||
<span style="background:#c9a84c;color:#0d2340;font-size:0.65rem;font-weight:700;padding:3px 10px;border-radius:20px;letter-spacing:0.08em;">핵심 타깃</span>
|
||||
</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:10px;text-transform:uppercase;">1순위 · 온라인 사업자</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.2rem;font-weight:700;color:white;margin-bottom:14px;">스마트스토어 · 크리에이터 · 프리랜서</h3>
|
||||
<p style="color:rgba(255,255,255,0.75);font-size:0.855rem;line-height:1.85;margin-bottom:20px;">스마트스토어·쿠팡마켓·유튜버·인스타셀러·크몽 프리랜서 — 플랫폼 정산 구조와 부가세·종소세 경비처리를 체계적으로 관리합니다. 전국 어디서나 비대면 상담 가능합니다.</p>
|
||||
<div style="display:flex;flex-wrap:wrap;gap:7px;">
|
||||
<span style="background:rgba(201,168,76,0.28);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">스마트스토어</span>
|
||||
<span style="background:rgba(201,168,76,0.28);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">크리에이터</span>
|
||||
<span style="background:rgba(201,168,76,0.28);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">비대면 상담</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.1);border-radius:18px;padding:38px;transition:background 0.2s;" style-hover="background:rgba(255,255,255,0.12);">
|
||||
<div style="font-size:1.8rem;margin-bottom:16px;">💼</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:10px;text-transform:uppercase;">2순위 · 영업직·독립사업자</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.2rem;font-weight:700;color:white;margin-bottom:14px;">보험설계사·부동산중개사·영업직</h3>
|
||||
<p style="color:rgba(255,255,255,0.62);font-size:0.855rem;line-height:1.85;margin-bottom:20px;">소득 변동이 크고 경비처리 기준이 애매한 분들. 업계 구조를 직접 경험한 세무사로서 종소세·경비처리·세금 예측을 온라인으로 관리합니다.</p>
|
||||
<div style="display:flex;flex-wrap:wrap;gap:7px;">
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">종합소득세</span>
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">경비처리</span>
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">세금 예측</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.1);border-radius:18px;padding:38px;transition:background 0.2s;" style-hover="background:rgba(255,255,255,0.12);">
|
||||
<div style="font-size:1.8rem;margin-bottom:16px;">🏘️</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:10px;text-transform:uppercase;">3순위 · 고단가 상담</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.2rem;font-weight:700;color:white;margin-bottom:14px;">부동산 매도 · 증여 · 상속 예정자</h3>
|
||||
<p style="color:rgba(255,255,255,0.62);font-size:0.855rem;line-height:1.85;margin-bottom:20px;">계약 전 양도세 사전검토, 증여·상속 사전설계, 임대사업자 세무관리. 자료 공유 후 온라인 검토로 계약 전 선택지를 최대화합니다.</p>
|
||||
<div style="display:flex;flex-wrap:wrap;gap:7px;">
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">양도세 검토</span>
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">증여·상속</span>
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">임대사업자</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div style="background:rgba(255,255,255,0.07);border:1px solid rgba(255,255,255,0.1);border-radius:18px;padding:38px;transition:background 0.2s;" style-hover="background:rgba(255,255,255,0.12);">
|
||||
<div style="font-size:1.8rem;margin-bottom:16px;">🔑</div>
|
||||
<div style="font-size:0.68rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:10px;text-transform:uppercase;">4순위 · 자산관리</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.2rem;font-weight:700;color:white;margin-bottom:14px;">임대사업자 · 상가 보유자</h3>
|
||||
<p style="color:rgba(255,255,255,0.62);font-size:0.855rem;line-height:1.85;margin-bottom:20px;">주택·상가·오피스텔 임대 소득의 종합소득세, 부가가치세, 양도 시점 세무까지 — 보유부터 매도까지 단계별로 관리합니다.</p>
|
||||
<div style="display:flex;flex-wrap:wrap;gap:7px;">
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">임대소득세</span>
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">상가·오피스텔</span>
|
||||
<span style="background:rgba(201,168,76,0.18);color:#e0c87a;padding:4px 12px;border-radius:20px;font-size:0.745rem;">매도 세무</span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── PROCESS ── -->
|
||||
<section style="padding:100px 60px;background:white;" class="section-px">
|
||||
<div style="max-width:960px;margin:0 auto;">
|
||||
<div style="text-align:center;margin-bottom:64px;">
|
||||
<div style="font-size:0.72rem;letter-spacing:0.18em;color:#c9a84c;font-weight:600;margin-bottom:14px;text-transform:uppercase;">Process</div>
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:2.2rem;font-weight:700;color:#0d2340;">상담 진행 과정</h2>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(220px,1fr));gap:40px;text-align:center;">
|
||||
<div>
|
||||
<div style="width:72px;height:72px;border-radius:50%;background:white;border:2px solid #c9a84c;display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-family:'Hahmlet',serif;font-size:1.35rem;font-weight:700;color:#c9a84c;">01</div>
|
||||
<div style="font-size:0.7rem;color:#c9a84c;font-weight:600;letter-spacing:0.1em;margin-bottom:8px;text-transform:uppercase;">카카오 · 전화 · 이메일</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.05rem;font-weight:700;color:#0d2340;margin-bottom:10px;">온라인으로 상담 신청</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.845rem;line-height:1.85;">전국 어디서나 카카오채널·전화·이메일로 문의하시면 상담 분야와 상황을 파악합니다. 방문 불필요.</p>
|
||||
</div>
|
||||
<div>
|
||||
<div style="width:72px;height:72px;border-radius:50%;background:white;border:2px solid #c9a84c;display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-family:'Hahmlet',serif;font-size:1.35rem;font-weight:700;color:#c9a84c;">02</div>
|
||||
<div style="font-size:0.7rem;color:#c9a84c;font-weight:600;letter-spacing:0.1em;margin-bottom:8px;text-transform:uppercase;">자료 공유 → 온라인 검토</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.05rem;font-weight:700;color:#0d2340;margin-bottom:10px;">비대면 자료 검토 & 방향 안내</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.845rem;line-height:1.85;">이메일·카카오로 자료를 공유하시면 세금 리스크와 선택 가능한 방향을 정리해 안내드립니다.</p>
|
||||
</div>
|
||||
<div>
|
||||
<div style="width:72px;height:72px;border-radius:50%;background:#0d2340;border:2px solid #0d2340;display:flex;align-items:center;justify-content:center;margin:0 auto 16px;font-family:'Hahmlet',serif;font-size:1.35rem;font-weight:700;color:#c9a84c;">03</div>
|
||||
<div style="font-size:0.7rem;color:#c9a84c;font-weight:600;letter-spacing:0.1em;margin-bottom:8px;text-transform:uppercase;">온라인 신고 · 기장 · 자문</div>
|
||||
<h3 style="font-family:'Hahmlet',serif;font-size:1.05rem;font-weight:700;color:#0d2340;margin-bottom:10px;">비대면으로 세무관리 시작</h3>
|
||||
<p style="color:#6b7e8f;font-size:0.845rem;line-height:1.85;">신고대리·기장·자문 중 맞는 방식으로 진행합니다. 이후 관리도 모두 온라인으로 이루어집니다.</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── FAQ ── -->
|
||||
<section id="faq" style="padding:100px 60px;background:#f8f7f4;" class="section-px">
|
||||
<div style="max-width:800px;margin:0 auto;">
|
||||
<div style="text-align:center;margin-bottom:56px;">
|
||||
<div style="font-size:0.72rem;letter-spacing:0.18em;color:#c9a84c;font-weight:600;margin-bottom:14px;text-transform:uppercase;">FAQ</div>
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:2.2rem;font-weight:700;color:#0d2340;">자주 묻는 질문</h2>
|
||||
</div>
|
||||
<div style="display:flex;flex-direction:column;gap:10px;">
|
||||
<sc-for list="{{ faqs }}" as="faq" hint-placeholder-count="5">
|
||||
<div style="background:white;border-radius:10px;overflow:hidden;">
|
||||
<button onClick="{{ faq.toggle }}" style="width:100%;padding:22px 26px;background:white;display:flex;justify-content:space-between;align-items:center;text-align:left;border-radius:10px;transition:background 0.15s;" style-hover="background:#f5f3ee;">
|
||||
<span style="font-family:'Hahmlet',serif;font-size:0.975rem;font-weight:600;color:#0d2340;flex:1;padding-right:16px;line-height:1.5;">{{ faq.q }}</span>
|
||||
<span style="font-size:1.5rem;color:#c9a84c;font-weight:300;line-height:1;flex-shrink:0;">{{ faq.icon }}</span>
|
||||
</button>
|
||||
<div style="{{ faq.bodyStyle }}">
|
||||
<p style="color:#6b7e8f;font-size:0.875rem;line-height:1.95;padding:4px 26px 24px;">{{ faq.a }}</p>
|
||||
</div>
|
||||
</div>
|
||||
</sc-for>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── BLOG ── -->
|
||||
<section style="padding:100px 60px;background:white;" class="section-px">
|
||||
<div style="max-width:1200px;margin:0 auto;">
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(340px,1fr));gap:72px;align-items:center;">
|
||||
<div>
|
||||
<div style="font-size:0.72rem;letter-spacing:0.18em;color:#c9a84c;font-weight:600;margin-bottom:16px;text-transform:uppercase;">Blog</div>
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:2rem;font-weight:700;color:#0d2340;margin-bottom:20px;line-height:1.35;">세금, 미리 알면<br>달라집니다</h2>
|
||||
<p style="color:#6b7e8f;line-height:1.9;margin-bottom:32px;font-size:0.9rem;">사업자 세무, 부동산 세금, 종합소득세까지 — 실제 사례와 체크리스트로 알기 쉽게 설명합니다.</p>
|
||||
<a href="#" style="display:inline-flex;align-items:center;gap:8px;background:#0d2340;color:white;padding:13px 22px;border-radius:6px;font-weight:600;font-size:0.875rem;transition:background 0.2s;" style-hover="background:#1a3a5c;">블로그 바로가기 →</a>
|
||||
</div>
|
||||
<div style="display:flex;flex-direction:column;gap:12px;">
|
||||
<div style="padding:18px 22px;background:#f8f7f4;border-radius:10px;border-left:3px solid #c9a84c;transition:background 0.2s;" style-hover="background:#fffdf5;">
|
||||
<div style="font-size:0.68rem;color:#c9a84c;font-weight:600;margin-bottom:7px;text-transform:uppercase;">부동산</div>
|
||||
<div style="font-size:0.875rem;font-weight:600;color:#0d2340;line-height:1.5;">집 팔기 전 양도세 상담을 먼저 받아야 하는 이유</div>
|
||||
</div>
|
||||
<div style="padding:18px 22px;background:#f8f7f4;border-radius:10px;border-left:3px solid #c9a84c;transition:background 0.2s;" style-hover="background:#fffdf5;">
|
||||
<div style="font-size:0.68rem;color:#c9a84c;font-weight:600;margin-bottom:7px;text-transform:uppercase;">종합소득세</div>
|
||||
<div style="font-size:0.875rem;font-weight:600;color:#0d2340;line-height:1.5;">보험설계사 종소세 신고 전 준비자료</div>
|
||||
</div>
|
||||
<div style="padding:18px 22px;background:#f8f7f4;border-radius:10px;border-left:3px solid #c9a84c;transition:background 0.2s;" style-hover="background:#fffdf5;">
|
||||
<div style="font-size:0.68rem;color:#c9a84c;font-weight:600;margin-bottom:7px;text-transform:uppercase;">사업자 세무</div>
|
||||
<div style="font-size:0.875rem;font-weight:600;color:#0d2340;line-height:1.5;">사업자 통장 꼭 따로 써야 할까? 세무사가 보는 기준</div>
|
||||
</div>
|
||||
<div style="padding:18px 22px;background:#f8f7f4;border-radius:10px;border-left:3px solid #c9a84c;transition:background 0.2s;" style-hover="background:#fffdf5;">
|
||||
<div style="font-size:0.68rem;color:#c9a84c;font-weight:600;margin-bottom:7px;text-transform:uppercase;">증여·상속</div>
|
||||
<div style="font-size:0.875rem;font-weight:600;color:#0d2340;line-height:1.5;">부모님 집을 자녀에게 증여하기 전 체크할 것</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── CONTACT CTA ── -->
|
||||
<section id="contact" style="padding:100px 60px;background:#c9a84c;" class="section-px">
|
||||
<div style="max-width:1100px;margin:0 auto;">
|
||||
<div style="text-align:center;margin-bottom:56px;">
|
||||
<h2 style="font-family:'Hahmlet',serif;font-size:2.4rem;font-weight:700;color:#0d2340;margin-bottom:14px;line-height:1.3;">세금 걱정, 지금 바로<br>상담하세요</h2>
|
||||
<p style="color:rgba(13,35,64,0.62);font-size:0.95rem;max-width:480px;margin:0 auto;">세금은 계약·매출·명의·자금 이동 전에 검토할수록 선택지가 많습니다.</p>
|
||||
</div>
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(240px,1fr));gap:20px;max-width:840px;margin:0 auto;">
|
||||
<a href="https://pf.kakao.com/_xoxchTX" target="_blank" style="background:white;border-radius:14px;padding:36px 26px;text-align:center;display:block;transition:transform 0.2s,box-shadow 0.2s;" style-hover="transform:translateY(-3px);box-shadow:0 10px 28px rgba(0,0,0,0.1);">
|
||||
<div style="font-size:2rem;margin-bottom:12px;">💬</div>
|
||||
<div style="font-weight:700;font-size:0.975rem;color:#0d2340;margin-bottom:6px;">카카오 상담</div>
|
||||
<div style="font-size:0.815rem;color:#6b7e8f;margin-bottom:16px;">편하게 문의하세요</div>
|
||||
<div style="font-size:0.78rem;color:#c9a84c;font-weight:700;">바로 연결 →</div>
|
||||
</a>
|
||||
<a href="tel:010-4122-8268" style="background:white;border-radius:14px;padding:36px 26px;text-align:center;display:block;transition:transform 0.2s,box-shadow 0.2s;" style-hover="transform:translateY(-3px);box-shadow:0 10px 28px rgba(0,0,0,0.1);">
|
||||
<div style="font-size:2rem;margin-bottom:12px;">📞</div>
|
||||
<div style="font-weight:700;font-size:0.975rem;color:#0d2340;margin-bottom:6px;">전화 상담</div>
|
||||
<div style="font-size:0.815rem;color:#6b7e8f;margin-bottom:16px;">010-4122-8268</div>
|
||||
<div style="font-size:0.78rem;color:#c9a84c;font-weight:700;">바로 연결 →</div>
|
||||
</a>
|
||||
<a href="mailto:taxbaik5668@gmail.com" style="background:white;border-radius:14px;padding:36px 26px;text-align:center;display:block;transition:transform 0.2s,box-shadow 0.2s;" style-hover="transform:translateY(-3px);box-shadow:0 10px 28px rgba(0,0,0,0.1);">
|
||||
<div style="font-size:2rem;margin-bottom:12px;">✉️</div>
|
||||
<div style="font-weight:700;font-size:0.975rem;color:#0d2340;margin-bottom:6px;">이메일 문의</div>
|
||||
<div style="font-size:0.815rem;color:#6b7e8f;margin-bottom:16px;">taxbaik5668@gmail.com</div>
|
||||
<div style="font-size:0.78rem;color:#c9a84c;font-weight:700;">이메일 보내기 →</div>
|
||||
</a>
|
||||
</div>
|
||||
<p style="text-align:center;margin-top:44px;color:rgba(13,35,64,0.48);font-size:0.8rem;line-height:1.9;">사업자 기장, 종합소득세, 부가세, 양도세, 증여·상속세 상담이 필요하시면 언제든 연락주세요.</p>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<!-- ── FOOTER ── -->
|
||||
<footer style="background:#0d2340;padding:64px 60px 40px;" class="section-px">
|
||||
<div style="max-width:1200px;margin:0 auto;">
|
||||
<div style="display:grid;grid-template-columns:repeat(auto-fit,minmax(200px,1fr));gap:52px;margin-bottom:48px;">
|
||||
<div>
|
||||
<div style="font-family:'Hahmlet',serif;font-size:1.2rem;font-weight:700;color:white;margin-bottom:14px;">백원숙 세무사</div>
|
||||
<p style="color:rgba(255,255,255,0.42);font-size:0.845rem;line-height:1.9;margin-bottom:16px;">사업과 부동산, 가족의 돈 흐름까지 함께 보는 생활자산 세무 파트너</p>
|
||||
<div style="font-size:0.76rem;color:rgba(255,255,255,0.28);">세무사 · 부동산중개사 · 보험설계사</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:0.72rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:18px;text-transform:uppercase;">서비스</div>
|
||||
<div style="display:flex;flex-direction:column;gap:10px;">
|
||||
<a href="#services" style="color:rgba(255,255,255,0.45);font-size:0.845rem;transition:color 0.2s;" style-hover="color:rgba(255,255,255,0.85);">월 기장 관리</a>
|
||||
<a href="#services" style="color:rgba(255,255,255,0.45);font-size:0.845rem;transition:color 0.2s;" style-hover="color:rgba(255,255,255,0.85);">종합소득세 신고</a>
|
||||
<a href="#services" style="color:rgba(255,255,255,0.45);font-size:0.845rem;transition:color 0.2s;" style-hover="color:rgba(255,255,255,0.85);">양도세 사전진단</a>
|
||||
<a href="#services" style="color:rgba(255,255,255,0.45);font-size:0.845rem;transition:color 0.2s;" style-hover="color:rgba(255,255,255,0.85);">증여·상속 상담</a>
|
||||
<a href="#services" style="color:rgba(255,255,255,0.45);font-size:0.845rem;transition:color 0.2s;" style-hover="color:rgba(255,255,255,0.85);">신규 사업자 세무정리</a>
|
||||
</div>
|
||||
</div>
|
||||
<div>
|
||||
<div style="font-size:0.72rem;letter-spacing:0.14em;color:#c9a84c;font-weight:600;margin-bottom:18px;text-transform:uppercase;">연락처</div>
|
||||
<div style="display:flex;flex-direction:column;gap:12px;">
|
||||
<div style="color:rgba(255,255,255,0.52);font-size:0.845rem;">📞 010-4122-8268</div>
|
||||
<div style="color:rgba(255,255,255,0.52);font-size:0.845rem;">✉️ taxbaik5668@gmail.com</div>
|
||||
<a href="https://pf.kakao.com/_xoxchTX" target="_blank" style="color:#c9a84c;font-size:0.845rem;">💬 카카오채널 상담</a>
|
||||
<div style="color:rgba(255,255,255,0.52);font-size:0.845rem;">📍 성북구</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div style="border-top:1px solid rgba(255,255,255,0.07);padding-top:24px;display:flex;justify-content:space-between;align-items:center;flex-wrap:wrap;gap:12px;">
|
||||
<div style="color:rgba(255,255,255,0.25);font-size:0.775rem;">© 2025 백원숙세무회계. All rights reserved.</div>
|
||||
<div style="color:rgba(255,255,255,0.25);font-size:0.72rem;">세무사·부동산중개사·보험설계사 자격 보유</div>
|
||||
</div>
|
||||
</div>
|
||||
</footer>
|
||||
</x-dc>
|
||||
<script type="text/x-dc" data-dc-script>
|
||||
class Component extends DCLogic {
|
||||
state = { navScrolled: false, faqOpen: null };
|
||||
|
||||
componentDidMount() {
|
||||
this._onScroll = () => {
|
||||
const scrolled = window.scrollY > 60;
|
||||
if (scrolled !== this.state.navScrolled) {
|
||||
this.setState({ navScrolled: scrolled });
|
||||
}
|
||||
};
|
||||
window.addEventListener('scroll', this._onScroll, { passive: true });
|
||||
}
|
||||
|
||||
componentWillUnmount() {
|
||||
window.removeEventListener('scroll', this._onScroll);
|
||||
}
|
||||
|
||||
renderVals() {
|
||||
const { navScrolled, faqOpen } = this.state;
|
||||
const navTextColor = navScrolled ? '#1a2232' : '#ffffff';
|
||||
|
||||
const faqs = [
|
||||
{
|
||||
q: '기장료가 얼마인지 미리 알 수 있나요?',
|
||||
a: '업종, 매출 규모, 직원 여부, 세금계산서 발행량에 따라 달라집니다. 단순 장부 작성만 필요한지, 예상세액과 증빙관리까지 필요한지 먼저 확인한 뒤 안내드립니다. 카카오채널로 상황을 알려주시면 적합한 구성을 제안해드립니다.',
|
||||
},
|
||||
{
|
||||
q: '양도세 상담은 어떻게 진행되나요?',
|
||||
a: '양도세는 취득가액, 보유기간, 거주기간, 주택 수, 조정대상지역 여부 등에 따라 달라집니다. 계약 전이라면 선택지가 훨씬 많기 때문에 먼저 상황을 공유해주시면 사전 검토 방식으로 진행합니다.',
|
||||
},
|
||||
{
|
||||
q: '무료 상담도 가능한가요?',
|
||||
a: '간단한 문의는 카카오채널로 주시면 방향을 안내드립니다. 세액 판단이나 신고 리스크 검토는 사실관계 확인이 필요해 유료상담으로 진행됩니다. 단, 기장·신고 계약으로 이어지는 경우 상담료 일부를 차감해드립니다.',
|
||||
},
|
||||
{
|
||||
q: '처음 상담 시 어떤 자료를 준비해야 하나요?',
|
||||
a: '분야에 따라 다르지만 일반적으로 사업자등록증, 최근 신고 내역, 매출·매입 자료를 준비하시면 됩니다. 부동산의 경우 등기부등본과 취득가액 관련 자료가 필요합니다. 상담 신청 후 구체적인 준비자료를 먼저 안내드립니다.',
|
||||
},
|
||||
{
|
||||
q: '부동산중개사 자격은 세무상담에 어떻게 활용되나요?',
|
||||
a: '부동산 거래 구조를 직접 이해하는 세무사로서 매도·증여·임대 단계에서 발생하는 세금 리스크를 현실적으로 설명할 수 있습니다. 단순히 세금 계산에서 끝나는 것이 아니라, 거래 구조 자체를 함께 검토합니다.',
|
||||
},
|
||||
].map((item, i) => ({
|
||||
...item,
|
||||
icon: faqOpen === i ? '×' : '+',
|
||||
toggle: () => this.setState(s => ({ faqOpen: s.faqOpen === i ? null : i })),
|
||||
bodyStyle: {
|
||||
transition: 'max-height 0.38s ease, opacity 0.38s ease',
|
||||
maxHeight: faqOpen === i ? '420px' : '0px',
|
||||
opacity: faqOpen === i ? 1 : 0,
|
||||
overflow: 'hidden',
|
||||
},
|
||||
}));
|
||||
|
||||
return {
|
||||
navStyle: {
|
||||
position: 'fixed', top: 0, left: 0, right: 0, zIndex: 100,
|
||||
height: '70px', display: 'flex', alignItems: 'center',
|
||||
justifyContent: 'space-between', padding: '0 60px',
|
||||
transition: 'all 0.35s ease',
|
||||
background: navScrolled ? 'rgba(255,255,255,0.97)' : 'rgba(13,35,64,0.72)',
|
||||
backdropFilter: 'blur(14px)',
|
||||
boxShadow: navScrolled ? '0 2px 24px rgba(0,0,0,0.08)' : 'none',
|
||||
},
|
||||
navLogoStyle: {
|
||||
fontFamily: "'Hahmlet', serif",
|
||||
fontSize: '1.1rem', fontWeight: '700',
|
||||
color: navTextColor, letterSpacing: '-0.02em',
|
||||
transition: 'color 0.3s ease',
|
||||
},
|
||||
navLinkStyle: {
|
||||
fontSize: '0.875rem', color: navTextColor,
|
||||
fontWeight: '500', transition: 'color 0.2s ease',
|
||||
},
|
||||
faqs,
|
||||
};
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 12 KiB |
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 210 KiB |
BIN
Binary file not shown.
|
Before Width: | Height: | Size: 192 KiB |
@@ -1,52 +0,0 @@
|
||||
{
|
||||
"Logging": {
|
||||
"LogLevel": {
|
||||
"Default": "Information",
|
||||
"Microsoft.AspNetCore": "Warning"
|
||||
}
|
||||
},
|
||||
"ConnectionStrings": {
|
||||
"Default": "Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
||||
},
|
||||
"Jwt": {
|
||||
"SecretKey": "dev-secret-key-change-in-production-min-32-chars!"
|
||||
},
|
||||
"App": {
|
||||
"PublicBaseUrl": "http://178.104.200.7/taxbaik"
|
||||
},
|
||||
"ApiClient": {
|
||||
"BaseUrl": "http://localhost:5001/taxbaik/api/"
|
||||
},
|
||||
"Telegram": {
|
||||
"BotToken": "8679990909:AAGLLRUIAuEbYAZVGOYDu-UuTu4ihroEiX0",
|
||||
"ChatId": "-5434691215",
|
||||
"InquiryChatId": "-5434691215",
|
||||
"SystemChatId": "-5585148480"
|
||||
},
|
||||
"Admin": {
|
||||
"PasswordResetToken": "dev-reset-token-12345"
|
||||
},
|
||||
"Authentication": {
|
||||
"Google": {
|
||||
"ClientId": "",
|
||||
"ClientSecret": ""
|
||||
},
|
||||
"Naver": {
|
||||
"ClientId": "",
|
||||
"ClientSecret": ""
|
||||
},
|
||||
"Kakao": {
|
||||
"ClientId": "",
|
||||
"ClientSecret": ""
|
||||
}
|
||||
},
|
||||
"SiteSettings": {
|
||||
"PhoneNumber": "010-4122-8268",
|
||||
"EmailAddress": "taxbaik5668@gmail.com",
|
||||
"KakaoChannelUrl": "http://pf.kakao.com/_xoxchTX",
|
||||
"InstagramUrl": "https://www.instagram.com/taxtory5668/",
|
||||
"CompanyName": "백원숙 세무회계",
|
||||
"CompanyDescription": "사업자 기장, 부동산 양도세·증여세, 종합소득세 전문 상담"
|
||||
},
|
||||
"AllowedHosts": "*"
|
||||
}
|
||||
@@ -1,57 +0,0 @@
|
||||
import { chromium } from '@playwright/test';
|
||||
|
||||
const browser = await chromium.launch();
|
||||
const page = await browser.newPage();
|
||||
|
||||
try {
|
||||
// 1. 로그인
|
||||
console.log('🔓 로그인 중...');
|
||||
await page.goto('http://178.104.200.7/taxbaik/admin/login', { waitUntil: 'networkidle' });
|
||||
await page.fill('input[placeholder="사용자명"]', 'test_admin');
|
||||
await page.fill('input[placeholder="비밀번호"]', 'TestAdmin@123456');
|
||||
await page.click('button:has-text("로그인")');
|
||||
await page.waitForURL(/\/taxbaik\/admin\/dashboard$/, { timeout: 10000 });
|
||||
console.log('✅ 로그인 성공');
|
||||
|
||||
// 2. Settings 페이지로 이동
|
||||
console.log('\n📍 Settings 페이지로 이동...');
|
||||
await page.goto('http://178.104.200.7/taxbaik/admin/settings', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
// 3. 다양한 대기 전략 시도
|
||||
console.log('⏳ 페이지 로드 대기 중...');
|
||||
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
await page.waitForTimeout(1000);
|
||||
const title = await page.locator('h4:has-text("설정")').count();
|
||||
const body = await page.locator('body').evaluate(el => el.innerHTML.length);
|
||||
const mudComponents = await page.locator('[class*="mud-"]').count();
|
||||
|
||||
console.log(`시도 ${i}: body=${body}bytes, mud=${mudComponents}, title=${title}`);
|
||||
|
||||
if (mudComponents > 10 && body > 5000) {
|
||||
console.log('✅ 페이지 렌더링 감지됨!');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 4. 최종 상태 확인
|
||||
console.log('\n📊 최종 상태:');
|
||||
const hasContent = await page.locator('body').evaluate(el => el.innerText.length > 100);
|
||||
const hasComponents = await page.locator('[class*="mud-"]').count();
|
||||
|
||||
console.log(`- 텍스트 콘텐츠: ${hasContent ? '있음' : '없음'}`);
|
||||
console.log(`- MudBlazor 컴포넌트: ${hasComponents}개`);
|
||||
|
||||
if (!hasContent) {
|
||||
console.log('\n❌ Settings 페이지 렌더링 실패');
|
||||
console.log('HTML 스니펫:');
|
||||
const html = await page.content();
|
||||
const bodyMatch = html.match(/<body[^>]*>([\s\S]{0,500})/);
|
||||
if (bodyMatch) console.log(bodyMatch[1]);
|
||||
}
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 에러:', error.message);
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
@@ -1,46 +0,0 @@
|
||||
#!/bin/bash
|
||||
set -e
|
||||
|
||||
if [ "${TAXBAIK_DEPLOY_FROM_CI:-}" != "1" ]; then
|
||||
echo "❌ This deployment script may only be run from CI." >&2
|
||||
exit 1
|
||||
fi
|
||||
|
||||
DEPLOY_HOME="/home/kjh2064"
|
||||
WEB_TIMESTAMP=$(TZ=Asia/Seoul date +%Y%m%d_%H%M%S)
|
||||
|
||||
echo "===== 🚀 TaxBaik 배포 스크립트 ====="
|
||||
echo "Web Timestamp: $WEB_TIMESTAMP"
|
||||
|
||||
# Web 배포
|
||||
echo "=== Deploying Web ==="
|
||||
WEB_DEPLOY_DIR="$DEPLOY_HOME/deployments/taxbaik_${WEB_TIMESTAMP}"
|
||||
mkdir -p "$WEB_DEPLOY_DIR"
|
||||
|
||||
if [ -z "$1" ]; then
|
||||
echo "Error: Publish directory required"
|
||||
exit 1
|
||||
fi
|
||||
|
||||
# 첫 번째 인자는 publish 경로
|
||||
cp -r "$1/web" "$WEB_DEPLOY_DIR/"
|
||||
ln -sfn "$WEB_DEPLOY_DIR/web" "$DEPLOY_HOME/taxbaik_active"
|
||||
echo "✓ Web symlink updated: $WEB_DEPLOY_DIR/web"
|
||||
|
||||
# 프로세스 재시작
|
||||
echo "=== Restarting processes ==="
|
||||
pkill -9 -f "TaxBaik.Web" || true
|
||||
sleep 3
|
||||
|
||||
echo "=== Starting Web ==="
|
||||
cd "$DEPLOY_HOME/taxbaik_active"
|
||||
export ConnectionStrings__Default="Host=localhost;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
||||
export ASPNETCORE_ENVIRONMENT=Production
|
||||
export ASPNETCORE_URLS=http://127.0.0.1:5001
|
||||
nohup /usr/local/dotnet/dotnet TaxBaik.Web.dll > web.log 2>&1 &
|
||||
sleep 2
|
||||
ps aux | grep TaxBaik.Web | grep -v grep && echo "✓ Web started" || echo "✗ Web failed"
|
||||
|
||||
echo ""
|
||||
echo "===== ✅ 배포 완료 ====="
|
||||
cat "$DEPLOY_HOME/taxbaik_active/wwwroot/version.json" 2>/dev/null || echo "Version file not found"
|
||||
@@ -1,40 +0,0 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
postgres:
|
||||
image: postgres:18-alpine
|
||||
container_name: taxbaik-db
|
||||
environment:
|
||||
POSTGRES_DB: taxbaikdb
|
||||
POSTGRES_USER: taxbaik
|
||||
POSTGRES_PASSWORD: taxbaik123
|
||||
ports:
|
||||
- "5432:5432"
|
||||
volumes:
|
||||
- postgres_data:/var/lib/postgresql/data
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "pg_isready -U taxbaik -d taxbaikdb"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 5
|
||||
|
||||
taxbaik-web:
|
||||
build:
|
||||
context: .
|
||||
dockerfile: Dockerfile.web
|
||||
container_name: taxbaik-web
|
||||
environment:
|
||||
ASPNETCORE_ENVIRONMENT: Development
|
||||
ASPNETCORE_URLS: http://0.0.0.0:5001
|
||||
ConnectionStrings__Default: "Host=postgres;Database=taxbaikdb;Username=taxbaik;Password=taxbaik123"
|
||||
Jwt__SecretKey: "dev-secret-key-change-in-production-min-32-chars!"
|
||||
ports:
|
||||
- "5001:5001"
|
||||
depends_on:
|
||||
postgres:
|
||||
condition: service_healthy
|
||||
volumes:
|
||||
- ./publish:/app
|
||||
|
||||
volumes:
|
||||
postgres_data:
|
||||
@@ -1,52 +0,0 @@
|
||||
import { chromium } from '@playwright/test';
|
||||
|
||||
const browser = await chromium.launch();
|
||||
const page = await browser.newPage();
|
||||
|
||||
try {
|
||||
console.log('🧪 최종 테스트: Settings 페이지 로딩 인디케이터');
|
||||
console.log('');
|
||||
|
||||
// 로그인
|
||||
await page.goto('http://178.104.200.7/taxbaik/admin/login', { waitUntil: 'networkidle' });
|
||||
await page.fill('input[placeholder="사용자명"]', 'test_admin');
|
||||
await page.fill('input[placeholder="비밀번호"]', 'TestAdmin@123456');
|
||||
await page.click('button:has-text("로그인")');
|
||||
await page.waitForURL(/\/taxbaik\/admin\/dashboard$/);
|
||||
console.log('✅ 로그인 성공');
|
||||
|
||||
// Settings 페이지로 이동
|
||||
console.log('📍 Settings 페이지로 이동...');
|
||||
await page.goto('http://178.104.200.7/taxbaik/admin/settings', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
// 로딩 인디케이터 상태 확인
|
||||
console.log('');
|
||||
console.log('⏱️ 로딩 상태 모니터링:');
|
||||
|
||||
for (let i = 1; i <= 5; i++) {
|
||||
await page.waitForTimeout(500);
|
||||
|
||||
const loadingVisible = await page.locator('#blazor-loading.show').isVisible().catch(() => false);
|
||||
const mudCount = await page.locator('[class*="mud-"]').count();
|
||||
const formElements = await page.locator('input, .admin-section-header').count();
|
||||
|
||||
console.log(` ${i}초: Loading=${loadingVisible ? '보임' : '안보임'}, Mud=${mudCount}, Form=${formElements}`);
|
||||
|
||||
if (!loadingVisible && mudCount > 20) {
|
||||
console.log('');
|
||||
console.log('✅ 로딩 인디케이터 정상 작동!');
|
||||
console.log(' → 페이지 로드 중: 스피너 표시');
|
||||
console.log(' → 페이지 완료: 스피너 숨김');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
// 스크린샷
|
||||
await page.screenshot({ path: 'settings-final.png' });
|
||||
console.log('✅ 스크린샷 저장: settings-final.png');
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 오류:', error.message);
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
@@ -1,360 +0,0 @@
|
||||
|
||||
Running 4 tests using 4 workers
|
||||
|
||||
[1A[2K[1/4] [iPhone 12] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
[1A[2K[2/4] [Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
[1A[2K[3/4] [iPad Pro] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
[1A[2K[4/4] [Galaxy S9+] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
[1A[2K[Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
|
||||
=== 1단계: 로그인 페이지 방문 ===
|
||||
|
||||
[1A[2K[Galaxy S9+] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
|
||||
=== 1단계: 로그인 페이지 방문 ===
|
||||
|
||||
[1A[2K[iPad Pro] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
|
||||
=== 1단계: 로그인 페이지 방문 ===
|
||||
|
||||
[1A[2K[iPhone 12] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
|
||||
=== 1단계: 로그인 페이지 방문 ===
|
||||
|
||||
[1A[2K[Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
🔴 HTTP ERROR: [33m404[39m https://www.taxbaik.com/taxbaik/_framework/blazor.web.js
|
||||
|
||||
[1A[2K[iPad Pro] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
🔴 HTTP ERROR: [33m404[39m https://www.taxbaik.com/taxbaik/_framework/blazor.web.js
|
||||
|
||||
[1A[2K🔴 CONSOLE ERROR: Failed to load resource: the server responded with a status of 404 ()
|
||||
|
||||
[1A[2K[Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
🔴 CONSOLE ERROR: Failed to load resource: the server responded with a status of 404 ()
|
||||
|
||||
[1A[2K[Galaxy S9+] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
🔴 HTTP ERROR: [33m404[39m https://www.taxbaik.com/taxbaik/_framework/blazor.web.js
|
||||
|
||||
[1A[2K🔴 CONSOLE ERROR: Failed to load resource: the server responded with a status of 404 ()
|
||||
|
||||
[1A[2K[iPhone 12] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
🔴 HTTP ERROR: [33m404[39m https://www.taxbaik.com/taxbaik/_framework/blazor.web.js
|
||||
|
||||
[1A[2K🔴 CONSOLE ERROR: Failed to load resource: the server responded with a status of 404 ()
|
||||
|
||||
[1A[2K[iPad Pro] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 페이지 제목: 백원숙 세무회계 - 관리자
|
||||
|
||||
[1A[2K✅ 페이지 길이: [33m15158[39m 바이트
|
||||
|
||||
[1A[2K
|
||||
=== 2단계: 로그인 필드 확인 ===
|
||||
|
||||
[1A[2K✅ 사용자명 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K✅ 비밀번호 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K✅ 로그인 버튼: 안 보임 ❌
|
||||
|
||||
[1A[2K
|
||||
=== 3단계: 로그인 입력 & 제출 ===
|
||||
|
||||
[1A[2K❌ 필수 필드가 렌더링되지 않음
|
||||
|
||||
[1A[2K📋 페이지 구조 분석:
|
||||
|
||||
[1A[2K<!DOCTYPE html><html lang="ko" class="admin-login-route"><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>백원숙 세무회계 - 관리자</title>
|
||||
<base href="/taxbaik/">
|
||||
<link rel="icon" type="image/svg+xml" href="/taxbaik/favicon.svg">
|
||||
<link rel="alternate icon" href="/taxbaik/favicon.ico">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet">
|
||||
<script>
|
||||
window.taxbaikAdminBuildVersion = 'unknown';
|
||||
window.taxbaikAdminComponent = 'AdminApp';
|
||||
document.documentElement.classList.toggle(
|
||||
'admin-login-route',
|
||||
window.location.pathname.toLowerCase().endsWith('/admin/login'));
|
||||
</script>
|
||||
<link rel="stylesheet" href="css/admin.css">
|
||||
</head><body><component type="typeof(HeadOutlet)" render-mode="InteractiveWebAssembly"></component>
|
||||
<div id="components-reconnect-modal" class="admin-reconnect-modal"><div class="admin-reconnect-card"><strong>연결 재설정 중...</strong>
|
||||
<span>새로운 버전으로 업데이트되었습니다.</span>
|
||||
<span style="font-size: 0.85rem; margin-top: 0.5rem; opacity: 0.8;">자동으로 페이지를 새로고침합니다. 잠시만 기다려주세요.</span></div></div>
|
||||
<div id="blazor-loading" class="blazor-loading-overlay"><div class="blazor-loading-spinner"><div class="spinner"></div>
|
||||
<p>로드 중...</p></div></div>
|
||||
<style>
|
||||
::-webkit-scrollbar {width: 8px;height: 8px;z-index: 1;}
|
||||
::-webkit-scrollbar-track {background: transparent;}
|
||||
::-webkit-scrollbar-thumb {background: #c4c4c4;border-radius: 1px;}
|
||||
::-webkit-scrollbar-thumb:hover {background: #a6a6a6;}
|
||||
html, body * {scrollbar-color: #c4c4c4 transparent;scrollbar-width: thin;}
|
||||
</style>
|
||||
<style>
|
||||
.mud-chart-serie:hover {
|
||||
filter: url(#lighten);
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
:root{
|
||||
--mud-palette-blac
|
||||
|
||||
[1A[2K
|
||||
=== 5단계: 스크린샷 ===
|
||||
|
||||
[1A[2K✅ 스크린샷 저장: test-results/login-page.png
|
||||
|
||||
[1A[2K
|
||||
=== 🎯 테스트 결과 ===
|
||||
|
||||
[1A[2K✅ 페이지 로드: 성공
|
||||
|
||||
[1A[2K❌ 사용자명 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 비밀번호 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 로그인 버튼: 미렌더링
|
||||
|
||||
[1A[2K[iPhone 12] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 페이지 제목: 백원숙 세무회계 - 관리자
|
||||
|
||||
[1A[2K✅ 페이지 길이: [33m15158[39m 바이트
|
||||
|
||||
[1A[2K
|
||||
=== 2단계: 로그인 필드 확인 ===
|
||||
|
||||
[1A[2K✅ 사용자명 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K✅ 비밀번호 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K✅ 로그인 버튼: 안 보임 ❌
|
||||
|
||||
[1A[2K
|
||||
=== 3단계: 로그인 입력 & 제출 ===
|
||||
|
||||
[1A[2K❌ 필수 필드가 렌더링되지 않음
|
||||
|
||||
[1A[2K📋 페이지 구조 분석:
|
||||
|
||||
[1A[2K<!DOCTYPE html><html lang="ko" class="admin-login-route"><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>백원숙 세무회계 - 관리자</title>
|
||||
<base href="/taxbaik/">
|
||||
<link rel="icon" type="image/svg+xml" href="/taxbaik/favicon.svg">
|
||||
<link rel="alternate icon" href="/taxbaik/favicon.ico">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet">
|
||||
<script>
|
||||
window.taxbaikAdminBuildVersion = 'unknown';
|
||||
window.taxbaikAdminComponent = 'AdminApp';
|
||||
document.documentElement.classList.toggle(
|
||||
'admin-login-route',
|
||||
window.location.pathname.toLowerCase().endsWith('/admin/login'));
|
||||
</script>
|
||||
<link rel="stylesheet" href="css/admin.css">
|
||||
</head><body><component type="typeof(HeadOutlet)" render-mode="InteractiveWebAssembly"></component>
|
||||
<div id="components-reconnect-modal" class="admin-reconnect-modal"><div class="admin-reconnect-card"><strong>연결 재설정 중...</strong>
|
||||
<span>새로운 버전으로 업데이트되었습니다.</span>
|
||||
<span style="font-size: 0.85rem; margin-top: 0.5rem; opacity: 0.8;">자동으로 페이지를 새로고침합니다. 잠시만 기다려주세요.</span></div></div>
|
||||
<div id="blazor-loading" class="blazor-loading-overlay"><div class="blazor-loading-spinner"><div class="spinner"></div>
|
||||
<p>로드 중...</p></div></div>
|
||||
<style>
|
||||
::-webkit-scrollbar {width: 8px;height: 8px;z-index: 1;}
|
||||
::-webkit-scrollbar-track {background: transparent;}
|
||||
::-webkit-scrollbar-thumb {background: #c4c4c4;border-radius: 1px;}
|
||||
::-webkit-scrollbar-thumb:hover {background: #a6a6a6;}
|
||||
html, body * {scrollbar-color: #c4c4c4 transparent;scrollbar-width: thin;}
|
||||
</style>
|
||||
<style>
|
||||
.mud-chart-serie:hover {
|
||||
filter: url(#lighten);
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
:root{
|
||||
--mud-palette-blac
|
||||
|
||||
[1A[2K
|
||||
=== 5단계: 스크린샷 ===
|
||||
|
||||
[1A[2K[Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 페이지 제목: 백원숙 세무회계 - 관리자
|
||||
|
||||
[1A[2K✅ 페이지 길이: [33m15158[39m 바이트
|
||||
|
||||
[1A[2K
|
||||
=== 2단계: 로그인 필드 확인 ===
|
||||
|
||||
[1A[2K[Galaxy S9+] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 페이지 제목: 백원숙 세무회계 - 관리자
|
||||
|
||||
[1A[2K[Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 사용자명 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K[Galaxy S9+] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 페이지 길이: [33m15158[39m 바이트
|
||||
|
||||
[1A[2K
|
||||
=== 2단계: 로그인 필드 확인 ===
|
||||
|
||||
[1A[2K[Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 비밀번호 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K✅ 로그인 버튼: 안 보임 ❌
|
||||
|
||||
[1A[2K
|
||||
=== 3단계: 로그인 입력 & 제출 ===
|
||||
|
||||
[1A[2K❌ 필수 필드가 렌더링되지 않음
|
||||
|
||||
[1A[2K📋 페이지 구조 분석:
|
||||
|
||||
[1A[2K<!DOCTYPE html><html lang="ko" class="admin-login-route"><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>백원숙 세무회계 - 관리자</title>
|
||||
<base href="/taxbaik/">
|
||||
<link rel="icon" type="image/svg+xml" href="/taxbaik/favicon.svg">
|
||||
<link rel="alternate icon" href="/taxbaik/favicon.ico">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet">
|
||||
<script>
|
||||
window.taxbaikAdminBuildVersion = 'unknown';
|
||||
window.taxbaikAdminComponent = 'AdminApp';
|
||||
document.documentElement.classList.toggle(
|
||||
'admin-login-route',
|
||||
window.location.pathname.toLowerCase().endsWith('/admin/login'));
|
||||
</script>
|
||||
<link rel="stylesheet" href="css/admin.css">
|
||||
</head><body><component type="typeof(HeadOutlet)" render-mode="InteractiveWebAssembly"></component>
|
||||
<div id="components-reconnect-modal" class="admin-reconnect-modal"><div class="admin-reconnect-card"><strong>연결 재설정 중...</strong>
|
||||
<span>새로운 버전으로 업데이트되었습니다.</span>
|
||||
<span style="font-size: 0.85rem; margin-top: 0.5rem; opacity: 0.8;">자동으로 페이지를 새로고침합니다. 잠시만 기다려주세요.</span></div></div>
|
||||
<div id="blazor-loading" class="blazor-loading-overlay"><div class="blazor-loading-spinner"><div class="spinner"></div>
|
||||
<p>로드 중...</p></div></div>
|
||||
<style>
|
||||
::-webkit-scrollbar {width: 8px;height: 8px;z-index: 1;}
|
||||
::-webkit-scrollbar-track {background: transparent;}
|
||||
::-webkit-scrollbar-thumb {background: #c4c4c4;border-radius: 1px;}
|
||||
::-webkit-scrollbar-thumb:hover {background: #a6a6a6;}
|
||||
html, body * {scrollbar-color: #c4c4c4 transparent;scrollbar-width: thin;}
|
||||
</style>
|
||||
<style>
|
||||
.mud-chart-serie:hover {
|
||||
filter: url(#lighten);
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
:root{
|
||||
--mud-palette-blac
|
||||
|
||||
[1A[2K
|
||||
=== 5단계: 스크린샷 ===
|
||||
|
||||
[1A[2K[Galaxy S9+] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 사용자명 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K✅ 비밀번호 필드: 안 보임 ❌
|
||||
|
||||
[1A[2K✅ 로그인 버튼: 안 보임 ❌
|
||||
|
||||
[1A[2K
|
||||
=== 3단계: 로그인 입력 & 제출 ===
|
||||
|
||||
[1A[2K❌ 필수 필드가 렌더링되지 않음
|
||||
|
||||
[1A[2K📋 페이지 구조 분석:
|
||||
|
||||
[1A[2K<!DOCTYPE html><html lang="ko" class="admin-login-route"><head><meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>백원숙 세무회계 - 관리자</title>
|
||||
<base href="/taxbaik/">
|
||||
<link rel="icon" type="image/svg+xml" href="/taxbaik/favicon.svg">
|
||||
<link rel="alternate icon" href="/taxbaik/favicon.ico">
|
||||
<link href="https://fonts.googleapis.com/css2?family=Noto+Sans+KR:wght@400;500;700&display=swap" rel="stylesheet">
|
||||
<link href="https://fonts.googleapis.com/icon?family=Material+Icons" rel="stylesheet">
|
||||
<link href="_content/MudBlazor/MudBlazor.min.css" rel="stylesheet">
|
||||
<script>
|
||||
window.taxbaikAdminBuildVersion = 'unknown';
|
||||
window.taxbaikAdminComponent = 'AdminApp';
|
||||
document.documentElement.classList.toggle(
|
||||
'admin-login-route',
|
||||
window.location.pathname.toLowerCase().endsWith('/admin/login'));
|
||||
</script>
|
||||
<link rel="stylesheet" href="css/admin.css">
|
||||
</head><body><component type="typeof(HeadOutlet)" render-mode="InteractiveWebAssembly"></component>
|
||||
<div id="components-reconnect-modal" class="admin-reconnect-modal"><div class="admin-reconnect-card"><strong>연결 재설정 중...</strong>
|
||||
<span>새로운 버전으로 업데이트되었습니다.</span>
|
||||
<span style="font-size: 0.85rem; margin-top: 0.5rem; opacity: 0.8;">자동으로 페이지를 새로고침합니다. 잠시만 기다려주세요.</span></div></div>
|
||||
<div id="blazor-loading" class="blazor-loading-overlay"><div class="blazor-loading-spinner"><div class="spinner"></div>
|
||||
<p>로드 중...</p></div></div>
|
||||
<style>
|
||||
::-webkit-scrollbar {width: 8px;height: 8px;z-index: 1;}
|
||||
::-webkit-scrollbar-track {background: transparent;}
|
||||
::-webkit-scrollbar-thumb {background: #c4c4c4;border-radius: 1px;}
|
||||
::-webkit-scrollbar-thumb:hover {background: #a6a6a6;}
|
||||
html, body * {scrollbar-color: #c4c4c4 transparent;scrollbar-width: thin;}
|
||||
</style>
|
||||
<style>
|
||||
.mud-chart-serie:hover {
|
||||
filter: url(#lighten);
|
||||
}
|
||||
</style>
|
||||
|
||||
<style>
|
||||
:root{
|
||||
--mud-palette-blac
|
||||
|
||||
[1A[2K
|
||||
=== 5단계: 스크린샷 ===
|
||||
|
||||
[1A[2K[iPhone 12] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 스크린샷 저장: test-results/login-page.png
|
||||
|
||||
[1A[2K
|
||||
=== 🎯 테스트 결과 ===
|
||||
|
||||
[1A[2K✅ 페이지 로드: 성공
|
||||
|
||||
[1A[2K❌ 사용자명 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 비밀번호 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 로그인 버튼: 미렌더링
|
||||
|
||||
[1A[2K[Desktop Chrome] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 스크린샷 저장: test-results/login-page.png
|
||||
|
||||
[1A[2K
|
||||
=== 🎯 테스트 결과 ===
|
||||
|
||||
[1A[2K✅ 페이지 로드: 성공
|
||||
|
||||
[1A[2K❌ 사용자명 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 비밀번호 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 로그인 버튼: 미렌더링
|
||||
|
||||
[1A[2K[Galaxy S9+] › tests\e2e\login-test.spec.ts:7:5 › Admin Login Page - Full Flow Test
|
||||
✅ 스크린샷 저장: test-results/login-page.png
|
||||
|
||||
[1A[2K
|
||||
=== 🎯 테스트 결과 ===
|
||||
|
||||
[1A[2K✅ 페이지 로드: 성공
|
||||
|
||||
[1A[2K❌ 사용자명 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 비밀번호 필드: 미렌더링
|
||||
|
||||
[1A[2K❌ 로그인 버튼: 미렌더링
|
||||
|
||||
[1A[2K 4 passed (8.1s)
|
||||
@@ -1,59 +0,0 @@
|
||||
-- V001 - Initial Schema for TaxBaik
|
||||
|
||||
CREATE TABLE categories (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
slug VARCHAR(100) NOT NULL UNIQUE,
|
||||
sort_order INT NOT NULL DEFAULT 0
|
||||
);
|
||||
|
||||
CREATE TABLE admin_users (
|
||||
id SERIAL PRIMARY KEY,
|
||||
username VARCHAR(100) NOT NULL UNIQUE,
|
||||
password_hash VARCHAR(500) NOT NULL,
|
||||
last_login_at TIMESTAMPTZ,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE TABLE blog_posts (
|
||||
id SERIAL PRIMARY KEY,
|
||||
title VARCHAR(300) NOT NULL,
|
||||
content TEXT NOT NULL,
|
||||
slug VARCHAR(300) NOT NULL UNIQUE,
|
||||
category_id INT REFERENCES categories(id) ON DELETE SET NULL,
|
||||
tags TEXT,
|
||||
author_id INT REFERENCES admin_users(id) ON DELETE SET NULL,
|
||||
published_at TIMESTAMPTZ,
|
||||
view_count INT NOT NULL DEFAULT 0,
|
||||
seo_title VARCHAR(300),
|
||||
seo_description VARCHAR(500),
|
||||
thumbnail_url VARCHAR(500),
|
||||
is_published BOOLEAN NOT NULL DEFAULT FALSE,
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW(),
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_blog_slug ON blog_posts(slug);
|
||||
CREATE INDEX idx_blog_published ON blog_posts(is_published, published_at DESC);
|
||||
CREATE INDEX idx_blog_category ON blog_posts(category_id);
|
||||
|
||||
CREATE TABLE inquiries (
|
||||
id SERIAL PRIMARY KEY,
|
||||
name VARCHAR(100) NOT NULL,
|
||||
phone VARCHAR(20) NOT NULL,
|
||||
email VARCHAR(200),
|
||||
service_type VARCHAR(100) NOT NULL,
|
||||
message TEXT NOT NULL,
|
||||
status VARCHAR(50) NOT NULL DEFAULT 'new',
|
||||
ip_address VARCHAR(50),
|
||||
created_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
|
||||
CREATE INDEX idx_inquiry_status ON inquiries(status);
|
||||
CREATE INDEX idx_inquiry_created ON inquiries(created_at DESC);
|
||||
|
||||
CREATE TABLE site_settings (
|
||||
key VARCHAR(200) PRIMARY KEY,
|
||||
value TEXT NOT NULL,
|
||||
updated_at TIMESTAMPTZ NOT NULL DEFAULT NOW()
|
||||
);
|
||||
@@ -1,17 +0,0 @@
|
||||
-- V002 - Seed Categories and Settings
|
||||
|
||||
INSERT INTO categories (name, slug, sort_order) VALUES
|
||||
('사업자 세무', 'business-tax', 1),
|
||||
('부동산 세금', 'real-estate-tax', 2),
|
||||
('종합소득세', 'income-tax', 3),
|
||||
('부가가치세', 'vat', 4),
|
||||
('가족자산·증여', 'family-asset', 5)
|
||||
ON CONFLICT (slug) DO NOTHING;
|
||||
|
||||
INSERT INTO site_settings (key, value) VALUES
|
||||
('site.title', '백원숙 세무회계 | 사업자·부동산·증여 세무 상담'),
|
||||
('site.description', '사업자 기장, 부동산 양도세·증여세, 종합소득세 전문 상담. 온라인 맞춤 상담 제공.'),
|
||||
('kakao.channel.url', ''),
|
||||
('phone.main', ''),
|
||||
('consultation.fee.text','상담료 7만~20만 원, 계약 체결 시 일부 차감')
|
||||
ON CONFLICT (key) DO NOTHING;
|
||||
@@ -1,80 +0,0 @@
|
||||
-- 초기 관리자 계정 (비밀번호: admin123)
|
||||
-- bcrypt hash: $2a$11$N9qo8uLOickgx2ZMRZoMye (실제 환경에서는 강력한 암호 사용)
|
||||
INSERT INTO admin_users (username, password_hash, created_at)
|
||||
VALUES ('admin', '$2a$11$N9qo8uLOickgx2ZMRZoMye6IjfQTp5emXyqhT3jrDZWCqYIxJkAOq', NOW())
|
||||
ON CONFLICT (username) DO NOTHING;
|
||||
|
||||
-- 초기 블로그 포스트 5개
|
||||
INSERT INTO blog_posts (title, content, slug, category_id, tags, author_id, published_at, is_published, seo_title, seo_description, created_at, updated_at)
|
||||
VALUES
|
||||
(
|
||||
'사업자 기장 시 자주 하는 실수 5가지',
|
||||
'사업자라면 반드시 알아야 할 기장 관련 팁을 소개합니다. 신용카드 영수증, 현금영수증, 세금계산서를 올바르게 분류하고 관리하세요.',
|
||||
'accountant-mistakes-5',
|
||||
1,
|
||||
'기장,세무,사업자',
|
||||
1,
|
||||
NOW(),
|
||||
true,
|
||||
'사업자 기장 시 자주 하는 실수 5가지 | 백원숙 세무회계',
|
||||
'사업자 기장 실수를 피하고 절세하는 방법을 전문가가 안내합니다.',
|
||||
NOW(),
|
||||
NOW()
|
||||
),
|
||||
(
|
||||
'부동산 양도세 계산하기',
|
||||
'부동산을 팔 때 발생하는 양도세는 어떻게 계산할까요? 취득가, 보유기간, 비과세 요건을 확인해보세요.',
|
||||
'real-estate-capital-gains-tax',
|
||||
2,
|
||||
'부동산,세금,양도세',
|
||||
1,
|
||||
NOW(),
|
||||
true,
|
||||
'부동산 양도세 계산 방법 | 세무사 가이드',
|
||||
'부동산 양도세를 제대로 이해하고 절세 방법을 배워보세요.',
|
||||
NOW(),
|
||||
NOW()
|
||||
),
|
||||
(
|
||||
'프리랜서를 위한 종합소득세 신고',
|
||||
'프리랜서, 강사, 컨설턴트라면 종합소득세를 직접 신고해야 합니다. 경비율, 기준경비율, 실제경비 방식 중 어떤 것이 유리할까요?',
|
||||
'freelancer-income-tax-guide',
|
||||
3,
|
||||
'프리랜서,종합소득세,신고',
|
||||
1,
|
||||
NOW(),
|
||||
true,
|
||||
'프리랜서 종합소득세 신고 완전 가이드 | 절세 팁',
|
||||
'프리랜서를 위한 종합소득세 신고 방법과 절세 전략을 알아보세요.',
|
||||
NOW(),
|
||||
NOW()
|
||||
),
|
||||
(
|
||||
'부가가치세 간이과세 vs 일반과세',
|
||||
'사업 초기에는 간이과세 신청이 가능합니다. 간이과세와 일반과세 중 어떤 것을 선택해야 할까요?',
|
||||
'vat-simplified-vs-general',
|
||||
4,
|
||||
'부가가치세,간이과세,일반과세',
|
||||
1,
|
||||
NOW(),
|
||||
true,
|
||||
'부가가치세 간이과세 vs 일반과세 | 절세 비교',
|
||||
'부가가치세 신고 방식에 따른 세금 차이를 비교 분석합니다.',
|
||||
NOW(),
|
||||
NOW()
|
||||
),
|
||||
(
|
||||
'가족 자산 증여세 절세 방법',
|
||||
'자녀, 배우자에게 자산을 증여할 때 세금을 최소화하려면? 증여세 기초공제, 배우자공제를 활용하세요.',
|
||||
'family-asset-gift-tax',
|
||||
5,
|
||||
'증여세,증여,가족자산,절세',
|
||||
1,
|
||||
NOW(),
|
||||
true,
|
||||
'가족 자산 증여세 절세 방법 | 증여세 기초공제',
|
||||
'증여세를 절감하는 전략적인 증여 방법을 소개합니다.',
|
||||
NOW(),
|
||||
NOW()
|
||||
)
|
||||
ON CONFLICT (slug) DO NOTHING;
|
||||
@@ -1 +0,0 @@
|
||||
-NoNewline
|
||||
@@ -1,11 +0,0 @@
|
||||
TaxBaik.Web\Properties\launchSettings.json의 시작 설정을 사용하는 중...
|
||||
빌드하는 중...
|
||||
Migration warning (development only): Failed to connect to 127.0.0.1:5432
|
||||
info: Microsoft.Hosting.Lifetime[14]
|
||||
Now listening on: http://127.0.0.1:5055
|
||||
info: Microsoft.Hosting.Lifetime[0]
|
||||
Application started. Press Ctrl+C to shut down.
|
||||
info: Microsoft.Hosting.Lifetime[0]
|
||||
Hosting environment: Development
|
||||
info: Microsoft.Hosting.Lifetime[0]
|
||||
Content root path: D:\JobRoomz\taxbaik\TaxBaik.Web
|
||||
Binary file not shown.
|
Before Width: | Height: | Size: 4.2 KiB |
@@ -1,45 +0,0 @@
|
||||
import { chromium } from '@playwright/test';
|
||||
|
||||
const browser = await chromium.launch();
|
||||
const page = await browser.newPage();
|
||||
|
||||
try {
|
||||
console.log('📍 1. Login page 접속...');
|
||||
await page.goto('http://178.104.200.7/taxbaik/admin/login', { waitUntil: 'networkidle' });
|
||||
|
||||
console.log('📍 2. 로그인 입력...');
|
||||
await page.fill('input[placeholder="사용자명"]', 'test_admin');
|
||||
await page.fill('input[placeholder="비밀번호"]', 'TestAdmin@123456');
|
||||
await page.click('button:has-text("로그인")');
|
||||
|
||||
console.log('📍 3. Dashboard 로드 대기...');
|
||||
await page.waitForURL(/\/taxbaik\/admin\/dashboard$/, { timeout: 10000 });
|
||||
console.log('✅ Dashboard로 이동 성공');
|
||||
|
||||
console.log('📍 4. Settings page 접속...');
|
||||
await page.goto('http://178.104.200.7/taxbaik/admin/settings', { waitUntil: 'domcontentloaded' });
|
||||
|
||||
console.log('📍 5. Settings 페이지 렌더링 대기...');
|
||||
await page.waitForTimeout(1500);
|
||||
|
||||
console.log('📍 6. 페이지 콘텐츠 확인...');
|
||||
const formElements = await page.locator('input, button, .admin-section-header').count();
|
||||
|
||||
console.log(`✅ 렌더링된 폼 요소: ${formElements}개`);
|
||||
|
||||
if (formElements > 5) {
|
||||
console.log('✅ Settings 페이지 완전 렌더링됨 (흰 화면 없음)');
|
||||
} else {
|
||||
console.log('⚠️ Settings 페이지 부분 렌더링됨');
|
||||
}
|
||||
|
||||
console.log('📍 7. 스크린샷 저장...');
|
||||
await page.screenshot({ path: 'settings-page.png' });
|
||||
console.log('✅ settings-page.png 저장됨');
|
||||
|
||||
} catch (error) {
|
||||
console.error('❌ 테스트 실패:', error.message);
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
await browser.close();
|
||||
-12
@@ -1,12 +0,0 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<configuration>
|
||||
<location path="." inheritInChildApplications="false">
|
||||
<system.webServer>
|
||||
<handlers>
|
||||
<add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModuleV2" resourceType="Unspecified" />
|
||||
</handlers>
|
||||
<aspNetCore processPath="dotnet" arguments=".\TaxBaik.Web.dll" stdoutLogEnabled="false" stdoutLogFile=".\logs\stdout" hostingModel="inprocess" />
|
||||
</system.webServer>
|
||||
</location>
|
||||
</configuration>
|
||||
<!--ProjectGuid: C40CB56B-D9A6-47B3-A0A2-7736D83425C5-->
|
||||
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
-7
File diff suppressed because one or more lines are too long
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
BIN
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user