修正看看
This commit is contained in:
+1
-1
@@ -2,7 +2,7 @@
|
|||||||
==================================================
|
==================================================
|
||||||
|
|
||||||
本压缩包包含「数据库管理」与「数据库升级」两个后台模块的改动,
|
本压缩包包含「数据库管理」与「数据库升级」两个后台模块的改动,
|
||||||
适用于部署在 st-joyapparel.com 的站点(需运行 MySQL)。
|
适用于部署在 coolcoth.com 的站点(需运行 MySQL)。
|
||||||
|
|
||||||
一、包含文件
|
一、包含文件
|
||||||
------------
|
------------
|
||||||
|
|||||||
@@ -17,6 +17,7 @@ class App
|
|||||||
// 1. 时区 & 会话
|
// 1. 时区 & 会话
|
||||||
date_default_timezone_set(self::config('app.timezone', 'Asia/Shanghai'));
|
date_default_timezone_set(self::config('app.timezone', 'Asia/Shanghai'));
|
||||||
if (session_status() !== PHP_SESSION_ACTIVE) {
|
if (session_status() !== PHP_SESSION_ACTIVE) {
|
||||||
|
self::ensureSessionPath();
|
||||||
session_start([
|
session_start([
|
||||||
'cookie_httponly' => true,
|
'cookie_httponly' => true,
|
||||||
'cookie_samesite' => 'Lax',
|
'cookie_samesite' => 'Lax',
|
||||||
@@ -48,6 +49,43 @@ class App
|
|||||||
self::dispatch(self::parseRoute());
|
self::dispatch(self::parseRoute());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 确保 session 存储路径可用。
|
||||||
|
* 服务器 session.save_path 可能指向不存在/不可写目录(如旧域名残留配置、
|
||||||
|
* php_admin_value 锁定等),此时 session_start() 会报 Warning 并失败。
|
||||||
|
* 本方法依次尝试:1) session_save_path() 切换到项目本地目录;2) 若被锁则
|
||||||
|
* 注册自定义文件 session handler 完全绕过服务器配置。
|
||||||
|
*/
|
||||||
|
private static function ensureSessionPath()
|
||||||
|
{
|
||||||
|
$sp = session_save_path();
|
||||||
|
// session.save_path 可能带 N;/path 深度前缀,取实际路径部分判断
|
||||||
|
$spDir = ($pos = strpos($sp, ';')) !== false ? substr($sp, $pos + 1) : $sp;
|
||||||
|
if ($spDir !== '' && is_dir($spDir) && is_writable($spDir)) {
|
||||||
|
return; // 服务器路径正常,无需处理
|
||||||
|
}
|
||||||
|
|
||||||
|
$localSession = BASE_PATH . '/storage/sessions';
|
||||||
|
if (!is_dir($localSession)) {
|
||||||
|
@mkdir($localSession, 0755, true);
|
||||||
|
}
|
||||||
|
if (!is_dir($localSession) || !is_writable($localSession)) {
|
||||||
|
return; // 本地目录也建不了,交给 session_start() 原样报错
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尝试 1:session_save_path() 切换(php_value 级别可生效)
|
||||||
|
session_save_path($localSession);
|
||||||
|
$checkPath = session_save_path();
|
||||||
|
$checkDir = ($pos = strpos($checkPath, ';')) !== false ? substr($checkPath, $pos + 1) : $checkPath;
|
||||||
|
if ($checkDir === $localSession) {
|
||||||
|
return; // 切换成功
|
||||||
|
}
|
||||||
|
|
||||||
|
// 尝试 2:被 php_admin_value 锁定,注册自定义文件 handler 完全绕过
|
||||||
|
$handler = new LocalSessionHandler($localSession);
|
||||||
|
session_set_save_handler($handler, true);
|
||||||
|
}
|
||||||
|
|
||||||
/** 解析请求路径为段数组 */
|
/** 解析请求路径为段数组 */
|
||||||
public static function parseRoute(): array
|
public static function parseRoute(): array
|
||||||
{
|
{
|
||||||
@@ -405,3 +443,59 @@ class App
|
|||||||
exit;
|
exit;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* 本地文件 session handler —— 当服务器 session.save_path 不可用/被锁时,
|
||||||
|
* 将 session 数据存到项目 storage/sessions/ 目录,完全绕过服务器配置。
|
||||||
|
* 兼容 PHP 7.4 ~ 8.x(不声明返回类型,用 #[\ReturnTypeWillChange] 抑制 8.x 弃用提示)。
|
||||||
|
*/
|
||||||
|
class LocalSessionHandler implements \SessionHandlerInterface
|
||||||
|
{
|
||||||
|
private $dir;
|
||||||
|
|
||||||
|
public function __construct(string $dir)
|
||||||
|
{
|
||||||
|
$this->dir = $dir;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function open($savePath, $sessionName)
|
||||||
|
{
|
||||||
|
return is_dir($this->dir) && is_writable($this->dir);
|
||||||
|
}
|
||||||
|
|
||||||
|
public function close()
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[\ReturnTypeWillChange]
|
||||||
|
public function read($id)
|
||||||
|
{
|
||||||
|
$f = $this->dir . '/sess_' . $id;
|
||||||
|
return is_file($f) ? (string) @file_get_contents($f) : '';
|
||||||
|
}
|
||||||
|
|
||||||
|
public function write($id, $data)
|
||||||
|
{
|
||||||
|
return @file_put_contents($this->dir . '/sess_' . $id, $data) !== false;
|
||||||
|
}
|
||||||
|
|
||||||
|
public function destroy($id)
|
||||||
|
{
|
||||||
|
$f = $this->dir . '/sess_' . $id;
|
||||||
|
return is_file($f) ? @unlink($f) : true;
|
||||||
|
}
|
||||||
|
|
||||||
|
#[\ReturnTypeWillChange]
|
||||||
|
public function gc($maxlifetime)
|
||||||
|
{
|
||||||
|
$n = 0;
|
||||||
|
foreach ((array) @glob($this->dir . '/sess_*') as $f) {
|
||||||
|
if (is_file($f) && filemtime($f) + $maxlifetime < time()) {
|
||||||
|
@unlink($f);
|
||||||
|
$n++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return $n;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
+1
-1
@@ -18,7 +18,7 @@ class Theme
|
|||||||
'site_slogan' => '科技降温 · 清凉一夏',
|
'site_slogan' => '科技降温 · 清凉一夏',
|
||||||
'site_logo' => '',
|
'site_logo' => '',
|
||||||
'contact_phone' => '400-1783-998',
|
'contact_phone' => '400-1783-998',
|
||||||
'contact_email' => 'service@st-joyapparel.com',
|
'contact_email' => 'service@coolcoth.com',
|
||||||
'contact_address'=> '江苏省苏州市工业园区',
|
'contact_address'=> '江苏省苏州市工业园区',
|
||||||
'icp' => '',
|
'icp' => '',
|
||||||
'seo_title' => '酷冰甲降温服 - 科技降温服装定制',
|
'seo_title' => '酷冰甲降温服 - 科技降温服装定制',
|
||||||
|
|||||||
+1
-1
@@ -9,7 +9,7 @@
|
|||||||
|
|
||||||
# 放在原有 location / { try_files ... } 之前
|
# 放在原有 location / { try_files ... } 之前
|
||||||
location ^~ /.well-known/acme-challenge/ {
|
location ^~ /.well-known/acme-challenge/ {
|
||||||
root /www/wwwroot/st-joyapparel.com; # 改成你的项目真实根目录(不含 /public)
|
root /www/wwwroot/coolcoth.com; # 改成你的项目真实根目录(不含 /public)
|
||||||
default_type text/plain;
|
default_type text/plain;
|
||||||
try_files $uri =404;
|
try_files $uri =404;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,6 +10,6 @@ try_files $uri $uri/ /index.php?$query_string;
|
|||||||
|
|
||||||
# Let's Encrypt HTTP-01 验证路径(否则证书签发 404)
|
# Let's Encrypt HTTP-01 验证路径(否则证书签发 404)
|
||||||
location ^~ /.well-known/acme-challenge/ {
|
location ^~ /.well-known/acme-challenge/ {
|
||||||
root /www/wwwroot/st-joyapparel.com; # 改成你的项目真实根目录(不含 /public)
|
root /www/wwwroot/coolcoth.com; # 改成你的项目真实根目录(不含 /public)
|
||||||
default_type text/plain;
|
default_type text/plain;
|
||||||
}
|
}
|
||||||
|
|||||||
+11
-11
@@ -1,16 +1,16 @@
|
|||||||
# 宝塔 Nginx + DNS 验证 申请 SSL 证书(详细操作顺序)
|
# 宝塔 Nginx + DNS 验证 申请 SSL 证书(详细操作顺序)
|
||||||
|
|
||||||
> 适用:已建好站点 `st-joyapparel.com`、运行目录=`/public`、已配前端控制器伪静态。
|
> 适用:已建好站点 `coolcoth.com`、运行目录=`/public`、已配前端控制器伪静态。
|
||||||
> 用 DNS 验证可以**完全绕开** `.well-known/acme-challenge` 路径问题,最稳。
|
> 用 DNS 验证可以**完全绕开** `.well-known/acme-challenge` 路径问题,最稳。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 一、前置确认(1 分钟)
|
## 一、前置确认(1 分钟)
|
||||||
|
|
||||||
1. 域名 `st-joyapparel.com` 已在宝塔「网站」里建好站点。
|
1. 域名 `coolcoth.com` 已在宝塔「网站」里建好站点。
|
||||||
2. 域名解析里**至少有一条 A 记录**指向服务器 `47.107.30.116`
|
2. 域名解析里**至少有一条 A 记录**指向服务器 `47.107.30.116`
|
||||||
(这样证书签发后 HTTPS 才能真正用起来;DNS 验证本身不要求域名解析到本机,但上线必须)。
|
(这样证书签发后 HTTPS 才能真正用起来;DNS 验证本身不要求域名解析到本机,但上线必须)。
|
||||||
3. 宝塔 → 网站 → `st-joyapparel.com` → 设置 → 网站目录 → **运行目录 = `/public`**(已设过可跳过)。
|
3. 宝塔 → 网站 → `coolcoth.com` → 设置 → 网站目录 → **运行目录 = `/public`**(已设过可跳过)。
|
||||||
4. 伪静态里**只保留**前端控制器那条(去掉之前为 HTTP 验证加的 `.well-known` location 也行,DNS 用不到它):
|
4. 伪静态里**只保留**前端控制器那条(去掉之前为 HTTP 验证加的 `.well-known` location 也行,DNS 用不到它):
|
||||||
```nginx
|
```nginx
|
||||||
try_files $uri $uri/ /index.php?$query_string;
|
try_files $uri $uri/ /index.php?$query_string;
|
||||||
@@ -29,9 +29,9 @@
|
|||||||
- AccessKey Secret
|
- AccessKey Secret
|
||||||
(在对应云服务商的「访问控制 / API 密钥」里创建,**只给 DNS 解析权限**即可,别给全量权限)
|
(在对应云服务商的「访问控制 / API 密钥」里创建,**只给 DNS 解析权限**即可,别给全量权限)
|
||||||
4. 保存。
|
4. 保存。
|
||||||
5. 回到 网站 → `st-joyapparel.com` → **SSL** → **Let's Encrypt**。
|
5. 回到 网站 → `coolcoth.com` → **SSL** → **Let's Encrypt**。
|
||||||
6. 验证方式下拉选 **DNS验证**(或「DNS API」)。
|
6. 验证方式下拉选 **DNS验证**(或「DNS API」)。
|
||||||
7. 勾选要签的域名(`st-joyapparel.com` 和 `www.st-joyapparel.com`)。
|
7. 勾选要签的域名(`coolcoth.com` 和 `www.coolcoth.com`)。
|
||||||
8. 点 **申请**。宝塔会自动添加 TXT 记录 → 等待 CA 校验 → **自动签发并部署**。
|
8. 点 **申请**。宝塔会自动添加 TXT 记录 → 等待 CA 校验 → **自动签发并部署**。
|
||||||
9. 完成后页面显示「证书已部署」,结束。✅
|
9. 完成后页面显示「证书已部署」,结束。✅
|
||||||
|
|
||||||
@@ -43,11 +43,11 @@
|
|||||||
|
|
||||||
> 没有 API 密钥时用这个。缺点:下次续签要再手动加一次 TXT(除非改用 API)。
|
> 没有 API 密钥时用这个。缺点:下次续签要再手动加一次 TXT(除非改用 API)。
|
||||||
|
|
||||||
1. 网站 → `st-joyapparel.com` → **SSL** → **Let's Encrypt**。
|
1. 网站 → `coolcoth.com` → **SSL** → **Let's Encrypt**。
|
||||||
2. 验证方式选 **DNS验证**。
|
2. 验证方式选 **DNS验证**。
|
||||||
3. 页面会列出**需要你手动添加的 DNS 记录**,一般是:
|
3. 页面会列出**需要你手动添加的 DNS 记录**,一般是:
|
||||||
- 记录类型:**TXT**
|
- 记录类型:**TXT**
|
||||||
- 主机记录:**`_acme-challenge`**(完整即 `_acme-challenge.st-joyapparel.com`)
|
- 主机记录:**`_acme-challenge`**(完整即 `_acme-challenge.coolcoth.com`)
|
||||||
- 记录值:一长串字符(如 `S7ASyftFIXsmMfhFqydT7QfMsFpsmTXRLD7FMZd_AIY` 之类,以页面显示为准)
|
- 记录值:一长串字符(如 `S7ASyftFIXsmMfhFqydT7QfMsFpsmTXRLD7FMZd_AIY` 之类,以页面显示为准)
|
||||||
- (如果要给 `www` 也签,会再给一条 `_acme-challenge.www` 的 TXT)
|
- (如果要给 `www` 也签,会再给一条 `_acme-challenge.www` 的 TXT)
|
||||||
4. **另开一个标签页**,登录你的域名解析控制台
|
4. **另开一个标签页**,登录你的域名解析控制台
|
||||||
@@ -55,9 +55,9 @@
|
|||||||
5. 添加上面那条 TXT 记录,保存。
|
5. 添加上面那条 TXT 记录,保存。
|
||||||
6. **等解析生效**(看 TTL,通常 1–10 分钟;用下面命令自查):
|
6. **等解析生效**(看 TTL,通常 1–10 分钟;用下面命令自查):
|
||||||
```bash
|
```bash
|
||||||
nslookup -type=TXT _acme-challenge.st-joyapparel.com
|
nslookup -type=TXT _acme-challenge.coolcoth.com
|
||||||
# 或 Windows:
|
# 或 Windows:
|
||||||
nslookup -type=TXT _acme-challenge.st-joyapparel.com 8.8.8.8
|
nslookup -type=TXT _acme-challenge.coolcoth.com 8.8.8.8
|
||||||
```
|
```
|
||||||
看到记录值和你填的一致,说明生效。
|
看到记录值和你填的一致,说明生效。
|
||||||
7. 回到宝塔,点 **验证 / 申请**。CA 读到 TXT 后即签发并自动部署。
|
7. 回到宝塔,点 **验证 / 申请**。CA 读到 TXT 后即签发并自动部署。
|
||||||
@@ -68,12 +68,12 @@
|
|||||||
|
|
||||||
1. SSL 页确认证书状态为「已部署」,有效期约 90 天。
|
1. SSL 页确认证书状态为「已部署」,有效期约 90 天。
|
||||||
2. 开启 **强制 HTTPS**(SSL 页里有开关)→ 访问 `http://` 自动跳 `https://`。
|
2. 开启 **强制 HTTPS**(SSL 页里有开关)→ 访问 `http://` 自动跳 `https://`。
|
||||||
3. 浏览器访问 `https://st-joyapparel.com/` 和 `https://www.st-joyapparel.com/`,确认:
|
3. 浏览器访问 `https://coolcoth.com/` 和 `https://www.coolcoth.com/`,确认:
|
||||||
- 地址栏出现小锁 🔒
|
- 地址栏出现小锁 🔒
|
||||||
- 前台页面、后台 `/admin` 都正常(之前配的 `try_files` 继续生效)
|
- 前台页面、后台 `/admin` 都正常(之前配的 `try_files` 继续生效)
|
||||||
4. 跑部署收尾(若还没跑):
|
4. 跑部署收尾(若还没跑):
|
||||||
```bash
|
```bash
|
||||||
cd /www/wwwroot/st-joyapparel.com
|
cd /www/wwwroot/coolcoth.com
|
||||||
bash deploy.sh
|
bash deploy.sh
|
||||||
rm -rf install # 删安装目录
|
rm -rf install # 删安装目录
|
||||||
```
|
```
|
||||||
|
|||||||
+1
-1
@@ -54,7 +54,7 @@ return [
|
|||||||
['skey'=>'site_name','sval'=>'酷冰甲 · 降温服','sgroup'=>'site'],
|
['skey'=>'site_name','sval'=>'酷冰甲 · 降温服','sgroup'=>'site'],
|
||||||
['skey'=>'site_slogan','sval'=>'科技降温 · 清凉一夏','sgroup'=>'site'],
|
['skey'=>'site_slogan','sval'=>'科技降温 · 清凉一夏','sgroup'=>'site'],
|
||||||
['skey'=>'contact_phone','sval'=>'400-1783-998','sgroup'=>'site'],
|
['skey'=>'contact_phone','sval'=>'400-1783-998','sgroup'=>'site'],
|
||||||
['skey'=>'contact_email','sval'=>'service@st-joyapparel.com','sgroup'=>'site'],
|
['skey'=>'contact_email','sval'=>'service@coolcoth.com','sgroup'=>'site'],
|
||||||
['skey'=>'contact_address','sval'=>'江苏省苏州市工业园区','sgroup'=>'site'],
|
['skey'=>'contact_address','sval'=>'江苏省苏州市工业园区','sgroup'=>'site'],
|
||||||
['skey'=>'icp','sval'=>'苏ICP备10206899号','sgroup'=>'site'],
|
['skey'=>'icp','sval'=>'苏ICP备10206899号','sgroup'=>'site'],
|
||||||
['skey'=>'seo_title','sval'=>'酷冰甲降温服 - 科技降温服装定制','sgroup'=>'site'],
|
['skey'=>'seo_title','sval'=>'酷冰甲降温服 - 科技降温服装定制','sgroup'=>'site'],
|
||||||
|
|||||||
+1
-1
@@ -1,2 +1,2 @@
|
|||||||
session.save_path=/www/php_session/st-joyapparel.com/
|
session.save_path=/www/php_session/coolcoth.com/
|
||||||
session.save_handler = files
|
session.save_handler = files
|
||||||
+1
-1
@@ -1,4 +1,4 @@
|
|||||||
# www.st-joyapparel.com robots.txt
|
# www.coolcoth.com robots.txt
|
||||||
# 禁止爬虫抓取后台、系统、内部静态资源等敏感路径
|
# 禁止爬虫抓取后台、系统、内部静态资源等敏感路径
|
||||||
|
|
||||||
User-agent: *
|
User-agent: *
|
||||||
|
|||||||
@@ -0,0 +1 @@
|
|||||||
|
|
||||||
|
|||||||
@@ -1,11 +1,11 @@
|
|||||||
# 圣巧依官网 ── 切换 coolcoth.com(Apache → Nginx)部署说明
|
# 圣巧依官网 ── 切换 coolcoth.com(Apache → Nginx)部署说明
|
||||||
|
|
||||||
> 适用:把原 `st-joyapparel.com` 站点迁移到新域名 `coolcoth.com`,并将 Web 服务由 Apache 切换为 Nginx(宝塔环境)。
|
> 适用:把原 `coolcoth.com` 站点迁移到新域名 `coolcoth.com`,并将 Web 服务由 Apache 切换为 Nginx(宝塔环境)。
|
||||||
> 联系邮箱保持 `service@st-joyapparel.com`(同属圣巧依公司,未随域名变更)。
|
> 联系邮箱保持 `service@coolcoth.com`(同属圣巧依公司,未随域名变更)。
|
||||||
|
|
||||||
---
|
---
|
||||||
|
|
||||||
## 一、本次改动清单(相对原 st-joyapparel.com 代码)
|
## 一、本次改动清单(相对原 coolcoth.com 代码)
|
||||||
|
|
||||||
| 文件 | 改动内容 | 是否需上传替换 |
|
| 文件 | 改动内容 | 是否需上传替换 |
|
||||||
|---|---|---|
|
|---|---|---|
|
||||||
@@ -14,8 +14,8 @@
|
|||||||
| `public/robots.txt` | Sitemap 地址改为 `https://coolcoth.com/sitemap.xml` | ✅ 替换 |
|
| `public/robots.txt` | Sitemap 地址改为 `https://coolcoth.com/sitemap.xml` | ✅ 替换 |
|
||||||
| `robots.txt`(项目根) | 同上 | ✅ 替换 |
|
| `robots.txt`(项目根) | 同上 | ✅ 替换 |
|
||||||
| `public/user.ini` | 会话目录改为 `/www/php_session/coolcoth.com/` | ✅ 替换 |
|
| `public/user.ini` | 会话目录改为 `/www/php_session/coolcoth.com/` | ✅ 替换 |
|
||||||
| `app/Core/Theme.php` | 联系邮箱(保持 `service@st-joyapparel.com`,未改) | ❌ 无需替换 |
|
| `app/Core/Theme.php` | 联系邮箱(保持 `service@coolcoth.com`,未改) | ❌ 无需替换 |
|
||||||
| `install/seed.php` | 联系邮箱(保持 `service@st-joyapparel.com`,未改) | ❌ 无需替换 |
|
| `install/seed.php` | 联系邮箱(保持 `service@coolcoth.com`,未改) | ❌ 无需替换 |
|
||||||
| `.htaccess` / `public/.htaccess` | Apache 规则,Nginx 下不生效,保留无害 | ❌ 无需替换 |
|
| `.htaccess` / `public/.htaccess` | Apache 规则,Nginx 下不生效,保留无害 | ❌ 无需替换 |
|
||||||
|
|
||||||
> 因站点功能(路由、SEO、后台)基于请求域名自动生成 URL(`site_url()` / `absolute_url()`),
|
> 因站点功能(路由、SEO、后台)基于请求域名自动生成 URL(`site_url()` / `absolute_url()`),
|
||||||
@@ -68,4 +68,4 @@
|
|||||||
|
|
||||||
## 六、旧域名
|
## 六、旧域名
|
||||||
|
|
||||||
`st-joyapparel.com` 若不再使用,请在 DNS / 阿里云释放;其服务器目录可保留或清理。
|
`coolcoth.com` 若不再使用,请在 DNS / 阿里云释放;其服务器目录可保留或清理。
|
||||||
|
|||||||
+1
-1
@@ -1,7 +1,7 @@
|
|||||||
# 圣巧依 / 酷冰甲 CMS — 完整性 · 安全性审计 & 后台美化报告
|
# 圣巧依 / 酷冰甲 CMS — 完整性 · 安全性审计 & 后台美化报告
|
||||||
|
|
||||||
- 本地:`G:\www\phpEnv\www\圣巧依新的`
|
- 本地:`G:\www\phpEnv\www\圣巧依新的`
|
||||||
- 远端:https://st-joyapparel.com/ (后台 `admin`)
|
- 远端:https://coolcoth.com/ (后台 `admin`)
|
||||||
- 技术栈:原生 PHP MVC(自研路由/View/Model),MySQL / 文件双驱动
|
- 技术栈:原生 PHP MVC(自研路由/View/Model),MySQL / 文件双驱动
|
||||||
- 说明:项目为 PHP 服务端渲染,与 Nuxt/Nuxt-UI 无关,本次未引入前端框架。
|
- 说明:项目为 PHP 服务端渲染,与 Nuxt/Nuxt-UI 无关,本次未引入前端框架。
|
||||||
|
|
||||||
|
|||||||
+2
-2
@@ -6,7 +6,7 @@
|
|||||||
---
|
---
|
||||||
|
|
||||||
## 一、项目定位与技术底座
|
## 一、项目定位与技术底座
|
||||||
- **站点**:酷冰甲降温服企业官网,线上 `st-joyapparel.com`,后台 `/admin`。
|
- **站点**:酷冰甲降温服企业官网,线上 `coolcoth.com`,后台 `/admin`。
|
||||||
- **架构**:原生 PHP 7.4 MVC(无 Composer/框架),前端 jQuery + 自研 `page-builder.js`,CSS 变量主题引擎。
|
- **架构**:原生 PHP 7.4 MVC(无 Composer/框架),前端 jQuery + 自研 `page-builder.js`,CSS 变量主题引擎。
|
||||||
- **存储**:双模式——默认文件 JSON(`storage/data/*`),可切 MySQL(`install/schema.sql`)。`Core\Model` 统一抽象。
|
- **存储**:双模式——默认文件 JSON(`storage/data/*`),可切 MySQL(`install/schema.sql`)。`Core\Model` 统一抽象。
|
||||||
- **能力**:产品/分类/新闻/客户案例/单页 5 类内容 + 订单/支付(支付宝/微信 demo+live)+ 三级权限(super_admin/admin/user)+ 可视化自由画布。
|
- **能力**:产品/分类/新闻/客户案例/单页 5 类内容 + 订单/支付(支付宝/微信 demo+live)+ 三级权限(super_admin/admin/user)+ 可视化自由画布。
|
||||||
@@ -38,7 +38,7 @@
|
|||||||
|
|
||||||
### 阶段 E:打磨与 Bug 收口
|
### 阶段 E:打磨与 Bug 收口
|
||||||
14. **暗色主题自适应**:`canvas.php` 改用 CSS 变量,历史 `#0f172a` 归一 `var(--c-text)`;`page/show.php` 复用共享 canvas 去掉重复内联。
|
14. **暗色主题自适应**:`canvas.php` 改用 CSS 变量,历史 `#0f172a` 归一 `var(--c-text)`;`page/show.php` 复用共享 canvas 去掉重复内联。
|
||||||
15. **全站品牌更名**:`圣巧依`→`酷冰甲`、`service@sqy58.com`→`service@st-joyapparel.com`,19 文件替换 + grep 0 命中(保留 SQY 型号代号/英文 eyebrow/目录名/参考外链)。
|
15. **全站品牌更名**:`圣巧依`→`酷冰甲`、`service@sqy58.com`→`service@coolcoth.com`,19 文件替换 + grep 0 命中(保留 SQY 型号代号/英文 eyebrow/目录名/参考外链)。
|
||||||
16. **案例/新闻编辑 404**:表单缺 slug 框 → update 按中文标题重建 slug。补 slug 框 + 隐藏 content 框。
|
16. **案例/新闻编辑 404**:表单缺 slug 框 → update 按中文标题重建 slug。补 slug 框 + 隐藏 content 框。
|
||||||
17. **升级清数据根因**:`Installer::upgrade()` 曾 `DELETE` 清空客户数据。改为非破坏(按 id/skey 补齐);update slug 空则保留;前台 show 加数字 id 兜底。
|
17. **升级清数据根因**:`Installer::upgrade()` 曾 `DELETE` 清空客户数据。改为非破坏(按 id/skey 补齐);update slug 空则保留;前台 show 加数字 id 兜底。
|
||||||
18. **slug 顺序生成**:store 先插取 id → slug=id(自定义则 slugify),URL 短而稳定。
|
18. **slug 顺序生成**:store 先插取 id → slug=id(自定义则 slugify),URL 短而稳定。
|
||||||
|
|||||||
Reference in New Issue
Block a user