feat: 公共表更名 common/member 前缀 + 插件命令自动加载 + 版本 1.1.1
- 18 张公共表更名(addon/attachment/configure/links/spider_log/spider_stat/sms/notice/ad/task/prop/medal/help/card -> common_*,member_wallets->member_wallet,score_rule/score_log -> member_*,addon_config->common_addonconf),模型全部对齐新表名,Db 直引用清零 - Attachment 模型补 表名绑定,修复富文本上传查 wxapp_attachment 1146 隐患 - install.sql + 迁移 SQL:backend_admin/backend_role delete_at 默认 0,修复软删除(NULL != 0)误过滤导致后台菜单为空 - AppService::boot() 支持插件 info.php 声明 commands 自动注册插件命令(psr-4 自动加载,坏类名自动跳过) - 各插件(haonav/mqttbroker/wxchat/articles/blog/forum 等)字段与配置同步调整 - 框架版本 1.1.0 -> 1.1.1
@@ -19,8 +19,8 @@ CREATE DATABASE IF NOT EXISTS `ywxapp_dev` /*!40100 DEFAULT CHARACTER SET utf8mb
|
||||
USE `ywxapp_dev`;
|
||||
|
||||
|
||||
-- 导出 表 __PREFIX__addon 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__addon` (
|
||||
-- 导出 表 __PREFIX__common_addon 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_addon` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(100) NOT NULL COMMENT '插件名称',
|
||||
`name` varchar(100) NOT NULL COMMENT '插件唯一标识',
|
||||
@@ -36,7 +36,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__addon` (
|
||||
UNIQUE KEY `name` (`name`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci;
|
||||
|
||||
-- 正在导出表 __PREFIX__addon 的数据:~0 rows (大约)
|
||||
-- 正在导出表 __PREFIX__common_addon 的数据:~0 rows (大约)
|
||||
|
||||
-- 导出 表 __PREFIX__backend_admin 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__backend_admin` (
|
||||
@@ -58,7 +58,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__backend_admin` (
|
||||
`need_reset` tinyint(1) NOT NULL DEFAULT '0' COMMENT '是否需要重置密码',
|
||||
`create_at` int DEFAULT NULL COMMENT '创建时间',
|
||||
`update_at` int DEFAULT NULL COMMENT '更新时间',
|
||||
`delete_at` int DEFAULT NULL COMMENT '删除时间(0表示未删除)',
|
||||
`delete_at` int unsigned NOT NULL DEFAULT '0' COMMENT '删除时间(0表示未删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `account` (`account`),
|
||||
KEY `idx_email` (`email`)
|
||||
@@ -183,15 +183,15 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__backend_role` (
|
||||
`status` tinyint(1) DEFAULT '1' COMMENT '状态:1-启用,0-禁用',
|
||||
`create_at` int unsigned NOT NULL DEFAULT '0' COMMENT '创建时间',
|
||||
`update_at` int unsigned NOT NULL DEFAULT '0' COMMENT '更新时间',
|
||||
`delete_at` int DEFAULT NULL,
|
||||
`delete_at` int unsigned NOT NULL DEFAULT '0' COMMENT '删除时间(0表示未删除)',
|
||||
PRIMARY KEY (`id`),
|
||||
UNIQUE KEY `code` (`name`) USING BTREE
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=12 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='角色表';
|
||||
|
||||
-- 正在导出表 __PREFIX__backend_role 的数据:~4 rows (大约)
|
||||
INSERT INTO `__PREFIX__backend_role` (`id`, `title`, `name`, `description`, `status`, `create_at`, `update_at`, `delete_at`) VALUES
|
||||
(1, '超级管理员', 'superadmin', '拥有所有权限', 1, 1672560000, 1768943789, NULL),
|
||||
(2, '管理员', 'backend', '管理员', 1, 1768944587, 1768944587, NULL);
|
||||
(1, '超级管理员', 'superadmin', '拥有所有权限', 1, 1672560000, 1768943789, 0),
|
||||
(2, '管理员', 'backend', '管理员', 1, 1768944587, 1768944587, 0);
|
||||
|
||||
-- 导出 表 __PREFIX__backend_role_access 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__backend_role_access` (
|
||||
@@ -234,6 +234,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__common_nav_menu` (
|
||||
`parent_id` int unsigned NOT NULL DEFAULT '0' COMMENT '父级ID(0=一级)',
|
||||
`title` varchar(50) NOT NULL DEFAULT '' COMMENT '菜单名称',
|
||||
`url` varchar(255) NOT NULL DEFAULT '' COMMENT '链接(controller/action 或 外链 http)',
|
||||
`app` varchar(30) NOT NULL DEFAULT '' COMMENT '所属应用(跨应用链接用,空=当前应用)',
|
||||
`icon` varchar(50) NOT NULL DEFAULT '' COMMENT '图标类',
|
||||
`sort` int NOT NULL DEFAULT '0' COMMENT '排序(越小越靠前)',
|
||||
`status` tinyint NOT NULL DEFAULT '1' COMMENT '状态(1=显示 0=隐藏)',
|
||||
@@ -244,8 +245,8 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__common_nav_menu` (
|
||||
KEY `parent_id` (`parent_id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='前台主导航菜单';
|
||||
|
||||
-- 导出 表 __PREFIX__attachment 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__attachment` (
|
||||
-- 导出 表 __PREFIX__common_attachment 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_attachment` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT COMMENT '文件ID',
|
||||
`uid` int unsigned NOT NULL DEFAULT '0' COMMENT '所属用户ID',
|
||||
`module` varchar(20) NOT NULL DEFAULT 'backend' COMMENT '所属模块 (admin, index, api)',
|
||||
@@ -271,25 +272,8 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__attachment` (
|
||||
KEY `idx_create_at` (`create_at`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=13 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='文件存储表';
|
||||
|
||||
-- 正在导出表 __PREFIX__attachment 的数据:~12 rows (大约)
|
||||
INSERT INTO `__PREFIX__attachment` (`id`, `uid`, `module`, `path`, `url`, `original`, `name`, `size`, `ext`, `mime`, `storage`, `driver_info`, `is_image`, `width`, `height`, `upload_ip`, `create_at`, `update_at`) VALUES
|
||||
(1, 1, 'index', 'images/20260122/c7f0cc7d087f748773f35484f48ece98.jpg', '/storage/images/20260122/c7f0cc7d087f748773f35484f48ece98.jpg', 'd62a6059252dd42a2834a697a4724cb5c9ea15ce12ff.jpg', 'c7f0cc7d087f748773f35484f48ece98.jpg', 1000238, '', NULL, 'local', NULL, 1, 4096, 2734, '127.0.0.1', 1769058175, 1769058175),
|
||||
(2, 1, 'index', 'images/20260122/042eeecde2719cbe391ba75b1a2e3116.jpg', '/storage/images/20260122/042eeecde2719cbe391ba75b1a2e3116.jpg', 'd62a6059252dd42a2834a697a4724cb5c9ea15ce12ff.jpg', '042eeecde2719cbe391ba75b1a2e3116.jpg', 1000238, 'jpg', NULL, 'local', NULL, 1, 4096, 2734, '127.0.0.1', 1769058473, 1769058473),
|
||||
(3, 1, 'index', 'images/20260122/bef44a8800fb2f275fa32d0b861fc4fe.jpg', '/storage/images/20260122/bef44a8800fb2f275fa32d0b861fc4fe.jpg', '未标题-3.jpg', 'bef44a8800fb2f275fa32d0b861fc4fe.jpg', 40753, 'jpg', NULL, 'local', NULL, 1, 289, 431, '127.0.0.1', 1769058632, 1769058632),
|
||||
(4, 1, 'index', 'images/20260122/793045b0a8df2e24b40101d81277c80d.jpg', '/storage/images/20260122/793045b0a8df2e24b40101d81277c80d.jpg', '微信图片_2025-09-01_094126_376.jpg', '793045b0a8df2e24b40101d81277c80d.jpg', 86132, 'jpg', NULL, 'local', NULL, 1, 800, 800, '127.0.0.1', 1769058722, 1769058722),
|
||||
(5, 1, 'index', 'images/20260122/071aaf47501ffae96e3f5c0f634dd446.jpg', '/storage/images/20260122/071aaf47501ffae96e3f5c0f634dd446.jpg', 'd62a6059252dd42a2834a697a4724cb5c9ea15ce12ff.jpg', '071aaf47501ffae96e3f5c0f634dd446.jpg', 1000238, 'jpg', NULL, 'local', NULL, 1, 4096, 2734, '127.0.0.1', 1769058909, 1769058909),
|
||||
(6, 1, 'index', 'images/20260122/586a0ea4c0301af54cd627bdcc495ed2.jpg', '/storage/images/20260122/586a0ea4c0301af54cd627bdcc495ed2.jpg', 'd62a6059252dd42a2834a697a4724cb5c9ea15ce12ff.jpg', '586a0ea4c0301af54cd627bdcc495ed2.jpg', 1000238, 'jpg', NULL, 'local', NULL, 1, 4096, 2734, '127.0.0.1', 1769065458, 1769065458),
|
||||
(7, 1, 'index', 'images/20260122/46c3478e9f9e6f81632ad410c0193f80.jpg', '/storage/images/20260122/46c3478e9f9e6f81632ad410c0193f80.jpg', 'd62a6059252dd42a2834a697a4724cb5c9ea15ce12ff.jpg', '46c3478e9f9e6f81632ad410c0193f80.jpg', 1000238, 'jpg', NULL, 'local', NULL, 1, 4096, 2734, '127.0.0.1', 1769065562, 1769065562),
|
||||
(8, 1, 'index', 'images/20260122/0b619e79aaf60dbecd4f6c53a6599ba6.jpg', '/storage/images/20260122/0b619e79aaf60dbecd4f6c53a6599ba6.jpg', '未标题-3.jpg', '0b619e79aaf60dbecd4f6c53a6599ba6.jpg', 40753, 'jpg', 'image/jpeg', 'local', NULL, 1, 289, 431, '127.0.0.1', 1769065654, 1769065654),
|
||||
(9, 1, 'index', 'images/20260122/ec75503e71bec4ff826ad75ea20e627b.jpg', '/storage/images/20260122/ec75503e71bec4ff826ad75ea20e627b.jpg', 'd62a6059252dd42a2834a697a4724cb5c9ea15ce12ff.jpg', 'ec75503e71bec4ff826ad75ea20e627b.jpg', 1000238, 'jpg', 'image/jpeg', 'local', NULL, 1, 4096, 2734, '127.0.0.1', 1769065770, 1769065770),
|
||||
(10, 1, 'index', 'images/20260122/9da3a3c83af08c56e7231459b4d4e633.jpg', '/storage/images/20260122/9da3a3c83af08c56e7231459b4d4e633.jpg', 'd62a6059252dd42a2834a697a4724cb5c9ea15ce12ff.jpg', '9da3a3c83af08c56e7231459b4d4e633.jpg', 1000238, 'jpg', 'image/jpeg', 'local', NULL, 1, 4096, 2734, '127.0.0.1', 1769065848, 1769065848),
|
||||
(11, 1, 'index', 'images/20260122/a4a6b53937064487c67947849bef4e2f.jpg', '/storage/images/20260122/a4a6b53937064487c67947849bef4e2f.jpg', '1.jpg', 'a4a6b53937064487c67947849bef4e2f.jpg', 5463, 'jpg', 'image/jpeg', 'local', NULL, 1, 200, 200, '127.0.0.1', 1769090385, 1769090385),
|
||||
(12, 1, 'index', 'images/20260208/60f67fae5262f0ae19bf483aa4a5b926.png', '/storage/images/20260208/60f67fae5262f0ae19bf483aa4a5b926.png', '图片1.png', '60f67fae5262f0ae19bf483aa4a5b926.png', 24512, 'png', 'image/png', 'local', NULL, 1, 137, 139, '127.0.0.1', 1770484883, 1770484883);
|
||||
|
||||
|
||||
|
||||
-- 导出 表 __PREFIX__configure 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__configure` (
|
||||
-- 导出 表 __PREFIX__common_configure 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_configure` (
|
||||
`id` int unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(30) NOT NULL DEFAULT '' COMMENT '变量名',
|
||||
`group` varchar(30) DEFAULT '' COMMENT '分组',
|
||||
@@ -305,8 +289,8 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__configure` (
|
||||
UNIQUE KEY `name` (`name`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=22 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=COMPACT COMMENT='系统配置';
|
||||
|
||||
-- 正在导出表 __PREFIX__configure 的数据:~18 rows (大约)
|
||||
INSERT INTO `__PREFIX__configure` (`id`, `name`, `group`, `title`, `tip`, `type`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
|
||||
-- 正在导出表 __PREFIX__common_configure 的数据:~18 rows (大约)
|
||||
INSERT INTO `__PREFIX__common_configure` (`id`, `name`, `group`, `title`, `tip`, `type`, `value`, `content`, `rule`, `extend`, `setting`) VALUES
|
||||
(1, 'site_name', 'basic', 'Site name', '请填写站点名称', 'string', 'YwxApp', '', 'required', '', ''),
|
||||
(2, 'beian', 'basic', 'Beian', '', 'string', '', '', '', '', ''),
|
||||
(3, 'cdnurl', 'basic', 'Cdn url', '如果静态资源使用第三方云储存请配置该值', 'string', '', '', '', '', ''),
|
||||
@@ -326,8 +310,8 @@ INSERT INTO `__PREFIX__configure` (`id`, `name`, `group`, `title`, `tip`, `type`
|
||||
(20, 'site_qq', 'contact', 'site_qq', '', 'string', '', '', '', '', ''),
|
||||
(21, 'site_email', 'contact', 'site_email', '', 'string', 'admin@ywxapp.cn', '', '', '', '');
|
||||
|
||||
-- 导出 表 __PREFIX__links 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__links` (
|
||||
-- 导出 表 __PREFIX__common_links 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_links` (
|
||||
`id` int NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`title` varchar(255) NOT NULL COMMENT '网站标题',
|
||||
`url` varchar(255) NOT NULL COMMENT '链接地址',
|
||||
@@ -341,12 +325,12 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__links` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='友情链接表';
|
||||
|
||||
-- 正在导出表 __PREFIX__links 的数据:~1 rows (大约)
|
||||
INSERT INTO `__PREFIX__links` (`id`, `title`, `url`, `logo`, `description`, `sort`, `status`, `create_at`, `update_at`) VALUES
|
||||
-- 正在导出表 __PREFIX__common_links 的数据:~1 rows (大约)
|
||||
INSERT INTO `__PREFIX__common_links` (`id`, `title`, `url`, `logo`, `description`, `sort`, `status`, `create_at`, `update_at`) VALUES
|
||||
(3, '示例站点', 'https://example.com', '/static/common/img/link.png', '', 0, 1, 1778788611, 1778788611);
|
||||
|
||||
-- 导出 表 __PREFIX__spider_log 结构(全站搜索蜘蛛抓取明细,由全局中间件 SpiderStat 写入)
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__spider_log` (
|
||||
-- 导出 表 __PREFIX__common_spider_log 结构(全站搜索蜘蛛抓取明细,由全局中间件 SpiderStat 写入)
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_spider_log` (
|
||||
`id` bigint unsigned NOT NULL AUTO_INCREMENT COMMENT '主键ID',
|
||||
`spider` varchar(20) NOT NULL DEFAULT '' COMMENT '蜘蛛标识',
|
||||
`url` varchar(500) NOT NULL DEFAULT '' COMMENT '抓取URL',
|
||||
@@ -360,16 +344,16 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__spider_log` (
|
||||
KEY `idx_create_at` (`create_at`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='搜索蜘蛛抓取日志';
|
||||
|
||||
-- 导出 表 __PREFIX__spider_stat 结构(按日聚合,报表免全表扫描)
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__spider_stat` (
|
||||
-- 导出 表 __PREFIX__common_spider_stat 结构(按日聚合,报表免全表扫描)
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_spider_stat` (
|
||||
`stat_date` date NOT NULL COMMENT '统计日期',
|
||||
`spider` varchar(20) NOT NULL DEFAULT '' COMMENT '蜘蛛标识',
|
||||
`count` int unsigned NOT NULL DEFAULT '0' COMMENT '抓取次数',
|
||||
PRIMARY KEY (`stat_date`,`spider`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='搜索蜘蛛按日统计';
|
||||
|
||||
-- 导出 表 __PREFIX__sms 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__sms` (
|
||||
-- 导出 表 __PREFIX__common_sms 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_sms` (
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`mobile` varchar(20) NOT NULL COMMENT '手机号',
|
||||
`code` varchar(10) NOT NULL COMMENT '验证码',
|
||||
@@ -565,8 +549,8 @@ INSERT INTO `__PREFIX__member_rule` (`id`, `pid`, `title`, `name`, `type`, `modu
|
||||
(3, 2, '我的资料', 'user:profile', 1, 'member', 'user/profile', '', 0, 1, 0, 1777461899, 0),
|
||||
(9, 0, '首页', 'index:index', 1, 'frontend', 'Index/index', '', 0, 1, 1777464473, 1777464473, 0);
|
||||
|
||||
-- 导出 表 __PREFIX__member_wallets 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__member_wallets` (
|
||||
-- 导出 表 __PREFIX__member_wallet 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__member_wallet` (
|
||||
`id` int NOT NULL AUTO_INCREMENT,
|
||||
`uid` int NOT NULL COMMENT '用户ID',
|
||||
`balance` decimal(10,2) DEFAULT '0.00' COMMENT '余额',
|
||||
@@ -591,7 +575,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__member_wallets` (
|
||||
-- ----------------------------
|
||||
-- 营运模块数据表
|
||||
-- ----------------------------
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__notice` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_notice` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '公告标题',
|
||||
`content` text COMMENT '公告内容',
|
||||
@@ -611,7 +595,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__notice` (
|
||||
KEY `idx_is_top` (`is_top`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='站点公告';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__ad` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_ad` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '广告标题',
|
||||
`type` tinyint(1) NOT NULL DEFAULT 1 COMMENT '类型 1图片2文字3代码',
|
||||
@@ -629,7 +613,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__ad` (
|
||||
KEY `idx_status_sort` (`status`,`sort`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='站点广告';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__task` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_task` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '任务标题',
|
||||
`description` text COMMENT '任务描述',
|
||||
@@ -667,7 +651,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__member_task` (
|
||||
KEY `idx_uid` (`uid`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci COMMENT='用户任务领取记录';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__prop` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_prop` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '道具名称',
|
||||
`icon` varchar(255) NOT NULL DEFAULT '' COMMENT '图标',
|
||||
@@ -681,7 +665,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__prop` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='道具中心';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__medal` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_medal` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '勋章名称',
|
||||
`image` varchar(255) NOT NULL DEFAULT '' COMMENT '图片',
|
||||
@@ -718,7 +702,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__sms_template` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='短信模板表';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__help` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_help` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`category` varchar(50) NOT NULL DEFAULT '' COMMENT '帮助分类(如:新手指南/常见问题/使用说明)',
|
||||
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '帮助标题',
|
||||
@@ -734,7 +718,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__help` (
|
||||
KEY `idx_status_sort` (`status`,`sort`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='站点帮助';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__shop` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_shop` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`title` varchar(200) NOT NULL DEFAULT '' COMMENT '商品名称',
|
||||
`price` decimal(10,2) NOT NULL DEFAULT 0.00 COMMENT '价格',
|
||||
@@ -748,7 +732,7 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__shop` (
|
||||
PRIMARY KEY (`id`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='电子商务';
|
||||
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__card` (
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__common_card` (
|
||||
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`uid` int(11) NOT NULL DEFAULT 0 COMMENT '兑换会员ID(0未兑换)',
|
||||
`batch_no` varchar(30) NOT NULL DEFAULT '' COMMENT '批量生成批次号',
|
||||
@@ -766,8 +750,8 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__card` (
|
||||
KEY `idx_batch_no` (`batch_no`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='充值卡密';
|
||||
|
||||
-- 导出 表 __PREFIX__score_rule 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__score_rule` (
|
||||
-- 导出 表 __PREFIX__member_score_rule 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__member_score_rule` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`name` varchar(100) NOT NULL DEFAULT '' COMMENT '规则名称',
|
||||
`action` varchar(50) NOT NULL DEFAULT '' COMMENT '触发动作标识(task_complete/signin/register等)',
|
||||
@@ -783,8 +767,8 @@ CREATE TABLE IF NOT EXISTS `__PREFIX__score_rule` (
|
||||
KEY `idx_status_sort` (`status`,`sort`)
|
||||
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='积分规则';
|
||||
|
||||
-- 导出 表 __PREFIX__score_log 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__score_log` (
|
||||
-- 导出 表 __PREFIX__member_score_log 结构
|
||||
CREATE TABLE IF NOT EXISTS `__PREFIX__member_score_log` (
|
||||
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
|
||||
`uid` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '用户ID',
|
||||
`rule_id` int(10) unsigned NOT NULL DEFAULT 0 COMMENT '关联规则ID',
|
||||
|
||||
@@ -1,10 +1,10 @@
|
||||
/*
|
||||
* @Author: YwxApp <ywx@ywxapp.cn>
|
||||
* @Description: 前台主导航菜单管理(后台)
|
||||
* @Description: 前台主导航菜单管理(后台,treeTable 树形表格)
|
||||
*/
|
||||
layui.define(['http', 'auth', 'table', 'treeTable'], function (exports) {
|
||||
var $ = layui.$,
|
||||
table = layui.table,
|
||||
treeTable = layui.treeTable,
|
||||
form = layui.form,
|
||||
layer = layui.layer,
|
||||
laytpl = layui.laytpl,
|
||||
@@ -13,38 +13,47 @@ layui.define(['http', 'auth', 'table', 'treeTable'], function (exports) {
|
||||
|
||||
auth.init((layui.data('backend').permission) || []);
|
||||
|
||||
// 两级树拍平成单表,子项缩进展示
|
||||
function flatTree(list, level) {
|
||||
var rows = [];
|
||||
layui.each(list || [], function (i, item) {
|
||||
item._level = level;
|
||||
item._title = (level > 0 ? ' ├ ' : '') + item.title;
|
||||
rows.push(item);
|
||||
if (item.child && item.child.length) {
|
||||
rows = rows.concat(flatTree(item.child, level + 1));
|
||||
}
|
||||
});
|
||||
return rows;
|
||||
}
|
||||
|
||||
var dataTable = table.render({
|
||||
// 树形表格:数据为扁平 pid 列表(isSimpleData),pid=0 为根自动建树
|
||||
treeTable.render({
|
||||
elem: '#dataTable',
|
||||
url: 'index',
|
||||
page: false,
|
||||
parseData: function (res) {
|
||||
return { code: res.code === 0 ? 0 : 1, msg: res.msg || '', count: res.count || 0, data: res.data || [] };
|
||||
},
|
||||
tree: {
|
||||
customName: {
|
||||
children: 'children',
|
||||
isParent: 'is_parent',
|
||||
name: 'title',
|
||||
id: 'id',
|
||||
pid: 'pid',
|
||||
icon: 'icon'
|
||||
},
|
||||
data: { isSimpleData: true, rootPid: 0 },
|
||||
view: {},
|
||||
async: {},
|
||||
callback: {}
|
||||
},
|
||||
height: 'full-100',
|
||||
toolbar: '#tableBar',
|
||||
cols: [[
|
||||
{ field: 'id', title: 'ID', width: 70, align: 'center' },
|
||||
{ field: 'title', title: '菜单名称', minWidth: 180, templet: function (d) { return d._title || d.title; } },
|
||||
{ field: 'parent_id', title: '层级', width: 90, align: 'center', templet: '#parentTpl' },
|
||||
{ type: 'checkbox', fixed: 'left' },
|
||||
{ field: 'id', title: 'ID', width: 80, sort: true, fixed: 'left', align: 'center' },
|
||||
{ field: 'title', title: '菜单名称', minWidth: 200, fixed: 'left' },
|
||||
{
|
||||
field: 'app', title: '所属应用', width: 110, align: 'center', templet: function (d) {
|
||||
if (!d.app) return '<span class="layui-badge layui-bg-green">前台</span>';
|
||||
if (d.app === 'member') return '<span class="layui-badge layui-bg-blue">会员</span>';
|
||||
if (d.app === 'backend') return '<span class="layui-badge layui-bg-orange">后台</span>';
|
||||
return '<span class="layui-badge layui-bg-black">' + d.app + '</span>';
|
||||
}
|
||||
},
|
||||
{ field: 'url', title: '链接', minWidth: 200 },
|
||||
{ field: 'sort', title: '排序', width: 80, align: 'center' },
|
||||
{ field: 'status', title: '状态', width: 110, align: 'center', templet: '#statusTpl' },
|
||||
{ title: '操作', width: 200, align: 'center', toolbar: '#dataBar', fixed: 'right' }
|
||||
{ field: 'sort', title: '排序', width: 80, sort: true, align: 'center' },
|
||||
{ field: 'status', title: '状态', width: 96, align: 'center', templet: '#statusTpl' },
|
||||
{ fixed: 'right', title: '操作', width: 200, align: 'center', toolbar: '#dataBar' }
|
||||
]],
|
||||
response: { statusCode: 0 },
|
||||
parseData: function (res) {
|
||||
return { code: res.code, msg: res.msg, count: res.count || 0, data: flatTree(res.data, 0) };
|
||||
},
|
||||
page: false,
|
||||
done: function () {
|
||||
auth.render();
|
||||
}
|
||||
@@ -55,50 +64,71 @@ layui.define(['http', 'auth', 'table', 'treeTable'], function (exports) {
|
||||
var id = obj.value;
|
||||
var status = obj.elem.checked ? 1 : 0;
|
||||
http.post('status', { id: id, status: status }).then(function (res) {
|
||||
if (res.code !== 0) { layer.msg(res.msg || '操作失败'); dataTable.reload(); }
|
||||
if (res.code !== 0) {
|
||||
layer.msg(res.msg || '操作失败');
|
||||
obj.elem.checked = !obj.elem.checked;
|
||||
form.render('checkbox');
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
// 工具条(新建)
|
||||
table.on('toolbar(dataTable)', function (obj) {
|
||||
if (obj.event === 'dataCreate') { openForm({}); }
|
||||
// 搜索 / 重置
|
||||
form.on('submit(data-search-btn)', function (obj) {
|
||||
treeTable.reload('dataTable', { where: { title: obj.field.title || '' } }, true);
|
||||
return false;
|
||||
});
|
||||
$('#btn-reset').on('click', function () {
|
||||
$('.layui-form[lay-filter="search-form"] input[name="title"]').val('');
|
||||
treeTable.reload('dataTable', { where: {} }, true);
|
||||
});
|
||||
|
||||
// 行操作
|
||||
table.on('tool(dataTable)', function (obj) {
|
||||
var d = obj.data;
|
||||
if (obj.event === 'update') { openForm(d); }
|
||||
else if (obj.event === 'addChild') { openForm({ parent_id: d.id }); }
|
||||
else if (obj.event === 'delete') {
|
||||
layer.confirm('确定删除该菜单吗?', function (idx) {
|
||||
http.delete('delete', { id: d.id }).then(function (res) {
|
||||
if (res.code === 0) { layer.close(idx); dataTable.reload(); }
|
||||
else { layer.msg(res.msg || '操作失败'); }
|
||||
});
|
||||
});
|
||||
// 工具条(新建 / 批量删除)
|
||||
treeTable.on('toolbar(dataTable)', function (obj) {
|
||||
if (obj.event === 'dataCreate') {
|
||||
openForm({});
|
||||
} else if (obj.event === 'dataDelete') {
|
||||
var checkStatus = treeTable.checkStatus('dataTable');
|
||||
delRows((checkStatus.data || []).map(function (item) { return item.id; }));
|
||||
}
|
||||
});
|
||||
|
||||
// 表单弹窗:拉取一级菜单作为父级选项
|
||||
// 行操作
|
||||
treeTable.on('tool(dataTable)', function (obj) {
|
||||
var d = obj.data;
|
||||
if (obj.event === 'update') { openForm(d); }
|
||||
else if (obj.event === 'create') { openForm({ parent_id: d.id }); }
|
||||
else if (obj.event === 'delete') { delRows([d.id]); }
|
||||
});
|
||||
|
||||
// 删除(单条或批量)
|
||||
function delRows(ids) {
|
||||
if (!ids || !ids.length) return layer.msg('请选择要删除的项');
|
||||
layer.confirm('确定删除选中的 ' + ids.length + ' 项吗?', function (idx) {
|
||||
http.delete('delete', { ids: ids.join(',') }).then(function (res) {
|
||||
if (res.code === 0) { layer.close(idx); treeTable.reload('dataTable', {}, true); }
|
||||
else { layer.msg(res.msg || '操作失败'); }
|
||||
});
|
||||
});
|
||||
}
|
||||
|
||||
// 表单抽屉:拉取一级菜单作为父级选项
|
||||
function openForm(data) {
|
||||
http.get('index').then(function (res) {
|
||||
var parents = [];
|
||||
layui.each((res.data || []), function (i, p) {
|
||||
if (p.parent_id == 0) parents.push(p);
|
||||
if (p.pid == 0) parents.push(p);
|
||||
});
|
||||
var html = laytpl($('#dataFormTpl').html()).render($.extend({ parents: parents }, data));
|
||||
var html = laytpl($('#dataFormTpl').html()).render($.extend({ parents: parents, plugins: window.navPlugins || [] }, data));
|
||||
layer.open({
|
||||
type: 1, title: data.id ? '编辑菜单' : '新建菜单',
|
||||
area: ['480px', 'auto'], content: html,
|
||||
btn: ['保存', '取消'],
|
||||
type: 1, title: data.id ? '编辑菜单' : (data.parent_id ? '添加子菜单' : '新建菜单'),
|
||||
area: ['520px', '98%'], offset: 'r', anim: 'slideLeft', shade: 0.1, shadeClose: true,
|
||||
btnAlign: 'l', btn: ['保存', '取消'], content: html,
|
||||
success: function () { form.render(); },
|
||||
yes: function (idx, layero) {
|
||||
var field = form.val('wxapp-form-submit') || {};
|
||||
// 用表单序列化兜底
|
||||
var fd = {};
|
||||
$(layero).find('form').serializeArray().map(function (x) { fd[x.name] = x.value; });
|
||||
http.post(data.id ? 'update' : 'save', fd).then(function (r) {
|
||||
if (r.code === 0) { layer.close(idx); dataTable.reload(); }
|
||||
if (r.code === 0) { layer.close(idx); treeTable.reload('dataTable', {}, true); }
|
||||
else { layer.msg(r.msg || '操作失败'); }
|
||||
});
|
||||
}
|
||||
|
||||
@@ -0,0 +1,95 @@
|
||||
:root{
|
||||
--dl-primary:#1E9FFF;
|
||||
--dl-primary-dark:#0C7CD5;
|
||||
--dl-primary-light:#e8f5ff;
|
||||
--dl-text:#222;
|
||||
--dl-sub:#888;
|
||||
--dl-line:#eee;
|
||||
--dl-bg:#f5f6f8;
|
||||
--dl-radius:14px;
|
||||
}
|
||||
*{box-sizing:border-box;}
|
||||
|
||||
/* 下载站主体容器(套在全站 layout 的 main-wrapper 内) */
|
||||
.dl-wrap{max-width:1180px;margin:24px auto;padding:0 20px;}
|
||||
|
||||
/* 首屏主推引导 */
|
||||
.dl-hero{background:linear-gradient(120deg,#1E9FFF,#48b1ff);border-radius:var(--dl-radius);padding:36px 40px;color:#fff;display:flex;align-items:center;justify-content:space-between;gap:30px;flex-wrap:wrap;margin-bottom:28px;}
|
||||
.dl-hero h2{margin:0 0 10px;font-size:30px;}
|
||||
.dl-hero p{margin:0;opacity:.92;font-size:15px;}
|
||||
.dl-hero .slogan{margin-top:14px;font-size:13px;opacity:.85;}
|
||||
.dl-hero-btn{display:inline-block;background:#fff;color:var(--dl-primary);padding:12px 34px;border-radius:24px;font-weight:700;font-size:16px;text-decoration:none;box-shadow:0 4px 14px rgba(0,0,0,.12);white-space:nowrap;}
|
||||
.dl-hero-btn:hover{transform:translateY(-1px);}
|
||||
|
||||
/* 区块标题 */
|
||||
.dl-block{background:#fff;border:1px solid var(--dl-line);border-radius:var(--dl-radius);padding:22px 26px;margin-bottom:24px;}
|
||||
.dl-block-head{display:flex;align-items:center;justify-content:space-between;margin-bottom:18px;}
|
||||
.dl-block-title{font-size:18px;margin:0;font-weight:700;}
|
||||
.dl-block-title::before{content:"";display:inline-block;width:4px;height:16px;background:var(--dl-primary);border-radius:2px;margin-right:10px;vertical-align:-2px;}
|
||||
.dl-refresh{font-size:13px;color:var(--dl-primary);cursor:pointer;border:1px solid var(--dl-primary);background:#fff;border-radius:16px;padding:4px 14px;}
|
||||
.dl-refresh:hover{background:var(--dl-primary-light);}
|
||||
|
||||
/* 内联搜索条(列表/搜索页顶部) */
|
||||
.dl-searchbar{display:flex;gap:10px;margin-bottom:20px;}
|
||||
.dl-searchbar input{flex:1;border:1px solid var(--dl-line);border-radius:20px;outline:0;padding:10px 18px;font-size:14px;background:#f7f8fa;}
|
||||
.dl-searchbar input:focus{border-color:var(--dl-primary);background:#fff;}
|
||||
.dl-searchbar button{border:0;background:var(--dl-primary);color:#fff;padding:0 26px;border-radius:20px;cursor:pointer;font-size:14px;}
|
||||
.dl-searchbar button:hover{background:var(--dl-primary-dark);}
|
||||
|
||||
/* 分类导航(首页卡片式) */
|
||||
.dl-cat-grid{display:grid;grid-template-columns:repeat(auto-fill,minmax(180px,1fr));gap:18px;}
|
||||
.dl-cat{background:#fafbfc;border:1px solid var(--dl-line);border-radius:10px;padding:16px;}
|
||||
.dl-cat h3{margin:0 0 10px;font-size:15px;}
|
||||
.dl-cat h3 a{color:#333;text-decoration:none;}
|
||||
.dl-cat h3 a:hover{color:var(--dl-primary);}
|
||||
.dl-cat-list{list-style:none;margin:0;padding:0;display:flex;flex-wrap:wrap;gap:8px 14px;}
|
||||
.dl-cat-list a{color:#666;text-decoration:none;font-size:13px;}
|
||||
.dl-cat-list a:hover{color:var(--dl-primary);}
|
||||
.dl-cat-more{display:inline-block;margin-top:12px;font-size:13px;color:var(--dl-primary);text-decoration:none;}
|
||||
|
||||
/* 软件卡片网格 */
|
||||
.dl-grid{list-style:none;margin:0;padding:0;display:grid;grid-template-columns:repeat(auto-fill,minmax(150px,1fr));gap:18px;}
|
||||
.dl-card{background:#fff;border:1px solid var(--dl-line);border-radius:12px;padding:16px;text-align:center;transition:.2s;display:flex;flex-direction:column;align-items:center;}
|
||||
.dl-card:hover{box-shadow:0 6px 20px rgba(30,159,255,.12);border-color:#cfe9ff;transform:translateY(-3px);}
|
||||
.dl-cover{width:72px;height:72px;object-fit:cover;border-radius:14px;background:#f2f2f2;margin-bottom:10px;}
|
||||
.dl-name{font-size:14px;color:#333;text-decoration:none;font-weight:600;display:block;max-width:100%;overflow:hidden;text-overflow:ellipsis;white-space:nowrap;}
|
||||
.dl-card:hover .dl-name{color:var(--dl-primary);}
|
||||
.dl-desc{font-size:12px;color:var(--dl-sub);margin:6px 0 0;height:18px;overflow:hidden;white-space:nowrap;text-overflow:ellipsis;}
|
||||
.dl-meta{font-size:12px;color:#aaa;margin:8px 0 12px;}
|
||||
.dl-card-btn{margin-top:auto;display:inline-block;padding:6px 18px;border-radius:16px;background:var(--dl-primary);color:#fff;text-decoration:none;font-size:13px;}
|
||||
.dl-card-btn:hover{background:var(--dl-primary-dark);}
|
||||
|
||||
/* 分页 */
|
||||
.dl-pager{margin-top:22px;text-align:center;color:#666;}
|
||||
.dl-pager a,.dl-pager span{padding:6px 12px;margin:0 3px;border-radius:6px;text-decoration:none;color:#555;border:1px solid var(--dl-line);display:inline-block;}
|
||||
.dl-pager .active{background:var(--dl-primary);color:#fff;border-color:var(--dl-primary);}
|
||||
|
||||
/* 详情页 */
|
||||
.dl-detail{display:flex;gap:30px;background:#fff;border:1px solid var(--dl-line);border-radius:var(--dl-radius);padding:28px;flex-wrap:wrap;}
|
||||
.dl-detail-cover{width:150px;height:150px;object-fit:cover;border-radius:16px;background:#f2f2f2;}
|
||||
.dl-detail-info{flex:1;min-width:280px;}
|
||||
.dl-detail-title{margin:0 0 16px;font-size:24px;}
|
||||
.dl-detail-row{margin:8px 0;color:#666;}
|
||||
.dl-tag-free{background:#e8f5e9;color:#2e7d32;padding:3px 12px;border-radius:14px;font-size:12px;}
|
||||
.dl-tag-pay{background:#fff3e0;color:#ef6c00;padding:3px 12px;border-radius:14px;font-size:12px;}
|
||||
.dl-btn-down{display:inline-block;margin-top:18px;padding:12px 40px;background:var(--dl-primary);color:#fff;border-radius:10px;text-decoration:none;font-weight:700;font-size:16px;}
|
||||
.dl-btn-down:hover{background:var(--dl-primary-dark);}
|
||||
.dl-detail-intro{margin-top:24px;background:#fff;border:1px solid var(--dl-line);border-radius:var(--dl-radius);padding:24px;}
|
||||
.dl-detail-intro h3{margin-top:0;}
|
||||
.dl-back{display:inline-block;margin-top:18px;color:var(--dl-primary);text-decoration:none;}
|
||||
|
||||
/* 面包屑 */
|
||||
.dl-crumb{font-size:13px;color:#999;margin-bottom:14px;}
|
||||
.dl-crumb a{color:#666;text-decoration:none;}
|
||||
.dl-crumb a:hover{color:var(--dl-primary);}
|
||||
.dl-crumb span{margin:0 6px;color:#ccc;}
|
||||
|
||||
/* 空态 */
|
||||
.dl-empty{color:#999;text-align:center;padding:50px 0;}
|
||||
|
||||
@media (max-width:640px){
|
||||
.dl-wrap{padding:0 16px;}
|
||||
.dl-hero{padding:24px;flex-direction:column;align-items:flex-start;}
|
||||
.dl-hero h2{font-size:24px;}
|
||||
.dl-grid{grid-template-columns:repeat(auto-fill,minmax(120px,1fr));gap:12px;}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" width="150" height="150" viewBox="0 0 150 150">
|
||||
<rect width="150" height="150" rx="18" fill="#e8f5ff"/>
|
||||
<g fill="none" stroke="#1E9FFF" stroke-width="6" stroke-linecap="round" stroke-linejoin="round">
|
||||
<path d="M75 40 v50"/>
|
||||
<path d="M55 72 l20 20 20-20"/>
|
||||
<path d="M45 110 h60"/>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 350 B |
@@ -97,7 +97,7 @@ body {
|
||||
.mynav-empty { color: var(--nav-muted); font-size: 13px; padding: 6px 0; }
|
||||
|
||||
/* 分类 */
|
||||
.section-title { background: var(--nav-card); padding: 10px 16px; border-radius: 10px 10px 0 0; margin-bottom: 5px; box-shadow: 0 2px 15px rgba(0,0,0,.1); }
|
||||
.section-title {display:flex;justify-content:space-between; background: var(--nav-card); padding: 10px 16px; border-radius: 10px 10px 0 0; margin-bottom: 5px; box-shadow: 0 2px 15px rgba(0,0,0,.1); }
|
||||
.section-title h2 { font-size: 18px; }
|
||||
.section-title h2 a { color: var(--nav-card-text); text-decoration: none; }
|
||||
|
||||
@@ -107,6 +107,8 @@ body {
|
||||
.sub-category .sub-title { display: flex; align-items: center; gap: 8px; margin: 10px 0 4px; font-size: 15px; font-weight: 700; color: var(--nav-card-text); }
|
||||
.sub-category .sub-title::before { content: ""; width: 4px; height: 15px; border-radius: 2px; background: var(--nav-primary); display: inline-block; }
|
||||
.sub-category .website-grid { margin-bottom: 6px; }
|
||||
.sub-category .sub-more { margin-left: auto; font-size: 13px; font-weight: 400; color: var(--nav-muted); text-decoration: none; }
|
||||
.sub-category .sub-more:hover { color: var(--nav-primary); }
|
||||
.website-card {
|
||||
background: var(--nav-card); border-radius: 10px; padding: 12px 8px; text-align: center; transition: all .3s;
|
||||
box-shadow: 0 2px 10px rgba(0,0,0,.1); cursor: pointer; position: relative;
|
||||
|
||||
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 4.3 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 503 B |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 5.1 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.8 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 664 B |
|
After Width: | Height: | Size: 37 KiB |
|
After Width: | Height: | Size: 763 B |
|
After Width: | Height: | Size: 3.8 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 497 B |
|
After Width: | Height: | Size: 582 B |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 17 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.4 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 900 B |
|
After Width: | Height: | Size: 2.2 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 15 KiB |
@@ -0,0 +1,8 @@
|
||||
<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 128 128">
|
||||
<style>
|
||||
.st0 { fill: #42B883; }
|
||||
.st1 { fill: #35495E; }
|
||||
</style>
|
||||
<path class="st0" d="M78.8,10L64,35.4L49.2,10H0l64,110l64-110C128,10,78.8,10,78.8,10z" />
|
||||
<path class="st1" d="M78.8,10L64,35.4L49.2,10H25.6L64,76l38.4-66H78.8z" />
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 316 B |
|
After Width: | Height: | Size: 31 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 1.0 KiB |
|
After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.7 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 5.5 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.7 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 2.8 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 5.6 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 348 B |
|
After Width: | Height: | Size: 5.9 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 9.4 KiB |
|
After Width: | Height: | Size: 842 B |
|
After Width: | Height: | Size: 8.0 KiB |
|
After Width: | Height: | Size: 15 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 382 B |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 91 KiB |
|
After Width: | Height: | Size: 1.3 KiB |
|
After Width: | Height: | Size: 1.4 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 1.1 KiB |
|
After Width: | Height: | Size: 995 B |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 3.7 KiB |
|
After Width: | Height: | Size: 5.3 KiB |
|
After Width: | Height: | Size: 4.2 KiB |
|
After Width: | Height: | Size: 4.1 KiB |