# 基础配置

# 概述

初次接触一个新项目时,会给人一种一筹莫展的感觉,尤其是一个全新的未知的项目,首页我们拿到一个新项目(或新框架),首页我们先看下项目框架的具体架构和设计思路,在上一章节《目录结构》中我们做了详细的介绍,这里我们不做扩展,本章节我们重点介绍下框架的基础配置;

# 项目依赖

框架使用Composer作为依赖包管理工具,在开始使用项目前请务必安装好第三方依赖库,以便项目在实际运行过程中出现缺少依赖或者莫名的报错问题(切记),框架默认集成的依赖如下:

"php": ">=7.1.0",
"topthink/framework": "^6.0.0",
"topthink/think-image": "^1.0",
"topthink/think-captcha": "^3.0.3",
"topthink/think-orm": "^2.0",
"topthink/think-multi-app": "^1.0",
"topthink/think-view": "^1.0",
"overtrue/pinyin": "~4.0",
"phpmailer/phpmailer": "^6.0",
"phpoffice/phpexcel": "^1.8",
"phpoffice/phpword": "^0.14.0",
"aliyuncs/oss-sdk-php": "^2.3",
"qiniu/php-sdk": "^7.2",
"endroid/qrcode": "^3.5",
"jpush/jpush": "*",
"php-amqplib/php-amqplib": "2.7.*",
"alibabacloud/sdk": "^1.8",
"php-ffmpeg/php-ffmpeg": "^0.14.0",
"topthink/think-template": "^2.0"
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19

由于ThinkPHP6框架本身将以前的版本(如5.15.0)中集成的部分第三方依赖进行了剔除,所以我们在使用ThinkPHP6进行项目开发时需要手动将一些必备的依赖包进行自行加入,如模板支持依赖think-template、多应用支持依赖think-multi-app、视图绑定依赖think-view等等基础依赖,同时根据现实需求,我们还引入了阿里短信依赖alibabacloud/sdk、多媒体文件处理依赖php-ffmpeg/php-ffmpeg、消息中间件依赖php-amqplib/php-amqplib以及消息推送依赖jpush/jpush等等;如需其他依赖,请根据现实的业务做相应的依赖引入,然后安装即可;

# 环境变量

系统环境变量配置文件.env,系统运行所需的参数如有需要都可以作为环境变量参数存在,内容如下:

APP_DEBUG = false

[APP]
DEFAULT_TIMEZONE = Asia/Shanghai
// HOST域名
host = www.demo.cn

// 数据库配置
[DATABASE]
TYPE = mysql
HOSTNAME = 127.0.0.1
DATABASE = rxthink.pro6
USERNAME = root
PASSWORD =
HOSTPORT = 3306
CHARSET = utf8mb4
PREFIX = think_
DEBUG = true

// 缓存配置
[CACHE]
TYPE = redis
HOST = 127.0.0.1
PORT = 6379
PASSWORD =
SELECT = 1
TIMEOUT = 0
EXPIRE = 0
PREFIX = PRO6_

[LANG]
default_lang = zh-cn

// 系统配置
[SYSTEM]
SITENAME = RXThinkCMF_TP6_PRO旗舰版
NICKNAME = 旗舰版v1.0.0
VERSION = v1.0.0

// 网址配置
[DOMAIN]
IMG_URL = http://images.demo.cn
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42

备注:APP_DEBUG参数表示是否开启调试模式,host参数为网站主域名,如www.baidu.com,DATABASE为数据库连接相关配置,CACHE系统缓存配置,对应的配置文件是cache.php,SYSTEM是系统常规参数配置,定义了系统的名称及版本号等信息,DOMAIN主要设定系统访问需要的域名,如图片域名(需单独配置);

IMG_URL这里声明的是系统的图片域名,系统会读取当前参数做图片访问域名解析使用,在下文(《虚拟主机配置》)[]中会做详细说明;

# 应用配置

系统公共应用配置文件app.php,应用配置文件中提供了基础全部参数的配置,系统架构采用的是多引用模式,域名和多应用模块目录的绑定也在此文件中配置,域名绑定参数为:domain_bind,域名及相关目录的绑定下面有更详细的说明,配置文件内容如下:

return [
    // 应用地址
    'app_host'         => env('app.host', ''),
    // 应用的命名空间
    'app_namespace'    => '',
    // 是否启用路由
    'with_route'       => true,
    // 是否启用事件
    'with_event'       => true,
    // 默认应用
    'default_app'      => 'index',
    // 默认时区
    'default_timezone' => 'Asia/Shanghai',

    // 应用映射(自动多应用模式有效)
    'app_map'          => [],
    // 域名绑定(自动多应用模式有效)
    'domain_bind'      => [
        'www'          =>  'index',
        'admin'        =>  'admin',
        'm'            =>  'm',
        'api'          =>  'api',
        'script'       =>  'script',
    ],
    // 禁止URL访问的应用列表(自动多应用模式有效)
    'deny_app_list'    => ['common'],

    // 异常页面的模板文件
    'exception_tmpl'   => app()->getThinkPath() . 'tpl/think_exception.tpl',

    // 错误显示信息,非调试模式有效
    'error_message'    => '页面错误!请稍后再试~',
    // 显示错误信息
    'show_error_msg'   => false,
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35

此处需要详细说明的是domain_bind域名绑定配置参数:

  • 二级域名www绑定模块index;
  • 二级域名admin绑定模块admin;
  • 二级域名m绑定模块m;
  • 二级域名api绑定模块api;
  • 二级域名script绑定模块script;

同时上述域名绑定配置,此时我们及可以通过www.demo.cn域名访问前台网站模块,admin.demo.cn域名访问后台系统模块,m.demo.cn域名访问手机站(WAP站)模块,api.demo.cn访问接口模块,script.demo.cn访问脚本模块;图片(images)域名需要单独配置,环境变量配置文件中有具体的说明;

切记如果是本地部署时请在本地hosts文件中写入本地127.0.0.1解析,以上为例hosts配置为:127.0.0.1 www.demo.cn admin.demo.cn m.demo.cn api.demo.cn script.demo.cn images.demo.cn

# 缓存配置

为了系统的性能提升和运行效率,框架底层已经友好的封装了继承了缓存功能,只需要开启即可,根据系统设计要求,框架目前支持两种缓存模式:文件缓存Redis缓存,缓存配置文件内容如下:

return [
    // 默认缓存驱动
    'default' => env('cache.driver', 'redis'),

    // 缓存连接方式配置
    'stores'  => [
        // File文件缓存
        'file' => [
            // 驱动方式
            'type'       => 'File',
            // 缓存保存目录
            'path'       => '',
            // 缓存前缀
            'prefix'     => '',
            // 缓存有效期 0表示永久缓存
            'expire'     => 0,
            // 缓存标签前缀
            'tag_prefix' => 'tag:',
            // 序列化机制 例如 ['serialize', 'unserialize']
            'serialize'  => [],
        ],
        // Redis缓存配置
        'redis' => [
            // 驱动方式
            'type'       => 'redis',
            'host'       => env('redis.host', '127.0.0.1'),
            'port'       => env('redis.port', 6379),
            'password'   => env('redis.password', ''),
            'select'     => env('redis.select', 0),
            'timeout'    => env('redis.timeout', 0),
            // 全局缓存有效期(0为永久有效)
            'expire'     => env('redis.expire', 0),
            'persistent' => env('redis.persistent', ''),
            // 缓存前缀
            'prefix'     => env('redis.prefix', 'TH_'),
            'tag_prefix' => env('redis.tag_prefix', 'tag:'),
            'serialize'  => [],
        ],
        // 更多的缓存连接
    ],
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41

如以上内容所示,缓存驱动的模式从环境变量中获取env('cache.driver', 'redis')默认系统使用的是redis缓存,所以再使用之前,需要开启Redis服务的支持,根据缓存模式的不同,各自的参数及配置值也是有所差异的,有关配置参数有不明白请查询相关资料;

# 短信配置

在众多的场景中,我们或多或少的都会使用到短信发送的功能,因此在设计系统时已经把这块功能集成进去了,特地为短信发送单独建立一个配置文件sms.php,文件内容如下:

/**
 * 短信配置类
 */
return [
    // 阿里云短信
    'aliyunsms' => [
        'accessKeyId' => 'LTAIiiZGTbjvJRFMAE',
        'accessKeySecret' => 'xkki8v10wV3uUx637mk4eNNykTaMzNFGH',
        'signName' => '研发中心',
        'templateCode' => 'SMS_18122342354',
        'templateParam' => '',
    ],
    // 更多短信平台账号请依次配置。。。
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14

根据上述得知,实现短信发送功能需要安装阿里短信SDK依赖包alibabacloud/sdk,根据业务实现我们封装了短信发送工具类及发送短信方法sendSms,具体内容请移至框架扩展目录extend中的AliSms.php文件进行查询;

# 布局配置

上述我们所描述的都是公共配置中的内容,当然我们也可以针对具体的业务层模块进行局部配置,此处我们以后台admin模块举例说明,根据系统架构设计需求我们开启多模板布局的功能,因此我们要针对模板布局配置一下参数,配置文件为config/view.php,内容如下:

return [
    // 是否开启模板编译缓存,设为false则每次都会重新编译
    'tpl_cache'          => false,
    // 布局模板开关
    'layout_on'          => true,
    // 布局模板入口文件
    'layout_name'        => 'public/layout',
    // 布局模板的内容替换标识
    'layout_item'        => '{__CONTENT__}',
    // 视图输出字符串内容替换
    'tpl_replace_string' => [
        '__STATIC__'     => '/static',
        '__ADMIN__'      => '/static/admin',
        '__JS__'         => '/static/admin/js',
        '__CSS__'        => '/static/admin/css',
        '__IMAGES__'     => '/static/admin/images',
    ],
    'taglib_build_in'    => 'cx',
    // 预先加载的标签库
    'taglib_pre_load'    => implode(',', [
        \app\admin\widget\Widget::class,
        \app\admin\widget\Common::class,
        \app\admin\widget\Upload::class,
        \app\admin\widget\Item::class,
        \app\admin\widget\Editor::class,
        \app\admin\widget\Layout::class,
        \app\admin\widget\Icon::class,
        \app\admin\widget\Checkbox::class,
        \app\admin\widget\City::class,
        \app\admin\widget\Date::class,
    ]),
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32

参数分析:

  • 设计模板布局配置的参数主要有tpl_cachelayout_onlayout_namelayout_itemtpl_replace_string,其中layout_name是设置布局文件,默认是public/layout文件;参数tpl_replace_string是模板替换标签,如__ADMIN____IMAGES__声明之后可以全局使用,无需在写复杂的路径;
  • 由于ThinkPHP6取消了widget的支持,所以我们使用模板标签来封装框架的UI组件,因此这里需要配置对模板标签的支持(这里是后台的组件,如果是其他模块需要在各自模块内配置相关的模板标签支持),主要涉及参数有taglib_build_intaglib_pre_load,重点需要说明的是,所有的模板标签都需要在此处进行生命,否则模板标签无法正常解析,一定切记。对于参数的具体意思可以直接查看TP官方文档或者查阅相关资料,具体的组件我们会在《UI组件》章节中会做具体的解读;

同时在模块内部我们需要对一些常规的常量进行配置,ThinkPHP6已经为我们做了架构层面的解析,我们只需要在模块内建立config文件夹,以admin模块为例,我们在config局部配置目录里面新建文件admin.php,在此文件中我们写入常规的配置参数,使用系统本身的获取配置的方式即可获取,如config('admin.gender_list'),系统admin.php详细内容如下:

<?php
// +----------------------------------------------------------------------
// | RXThinkCMF框架 [ RXThinkCMF ]
// +----------------------------------------------------------------------
// | 版权所有 2017~2020 南京RXThinkCMF研发中心
// +----------------------------------------------------------------------
// | 官方网站: http://www.rxthink.cn
// +----------------------------------------------------------------------
// | Author: 牧羊人 <1175401194@qq.com>
// +----------------------------------------------------------------------

/**
 * 后台配置类
 *
 * @author 牧羊人
 * @since 2020-04-21
 */
return [

    /**
     * 性别
     */
    'gender_list' => [
        1 => '男',
        2 => '女',
        3 => '未知',
    ],

    /**
     * 菜单类型
     */
    'menu_type' => [
        1 => '模块',
        2 => '导航',
        3 => '菜单',
        4 => '节点',
    ],

    /**
     * 菜单节点
     */
    'menu_func' => [
        1 => '列表',
        5 => '添加',
        10 => '修改',
        15 => '删除',
        20 => '详情',
        25 => '状态',
    ],

    /**
     * 配置类型
     */
    'config_type' => [
        'hidden' => '隐藏',
        'readonly' => '只读文本',
        'number' => '数字',
        'text' => '单行文本',
        'textarea' => '多行文本',
        'array' => '数组',
        'password' => '密码',
        'radio' => '单选框',
        'checkbox' => '复选框',
        'select' => '下拉框',
        'icon' => '字体图标',
        'date' => '日期',
        'datetime' => '时间',
        'image' => '单张图片',
        'images' => '多张图片',
        'file' => '单个文件',
        'files' => '多个文件',
        'ueditor' => '富文本编辑器',
        'json' => 'JSON',
    ],

    /**
     * 友链类型
     */
    'link_type' => [
        1 => '友情链接',
        2 => '合作伙伴',
    ],

    /**
     * 友链形式
     */
    'link_form' => [
        1 => '文字链接',
        2 => '图片链接',
    ],

    /**
     * 友链平台
     */
    'link_platform' => [
        1 => 'PC站',
        2 => 'WAP站',
        3 => '小程序',
        4 => 'APP应用',
    ],

    /**
     * 站点类型
     */
    'item_type' => [
        1 => '普通站点',
        2 => '其他',
    ],

    /**
     * 广告平台
     */
    'ad_platform' => [
        1 => 'PC站',
        2 => 'WAP站',
        3 => '小程序',
        4 => 'APP应用',
    ],

    /**
     * 广告类型
     */
    'ad_type' => [
        1 => '图片',
        2 => '文字',
        3 => '视频',
        4 => '其他',
    ],

    /**
     * 布局推荐类型
     */
    'layout_type' => [
        1 => 'CMS文章',
        2 => '其他',
    ],

    /**
     * 城市级别
     */
    'city_level' => [
        1 => "省份",
        2 => "城市",
        3 => "区县",
    ],

    /**
     * 行为类型
     */
    'action_type' => [
        1 => '模块',
        2 => '插件',
        3 => '主题',
    ],

    /**
     * 执行操作
     */
    'action_execution' => [
        1 => '自定义操作',
        2 => '记录操作',
    ],

    /**
     * 设备类型
     */
    'user_device' => [
        1 => '苹果',
        2 => '安卓',
        3 => 'WAP站',
        4 => 'PC站',
        5 => '微信小程序',
        6 => '后台添加',
    ],

    /**
     * 用户来源
     */
    'user_source' => [
        1 => '注册会员',
        2 => '马甲会员',
    ],

    /**
     * 定时任务类型
     */
    'crontab_type' => [
        1 => '请求URL',
        2 => '执行SQL',
        3 => '执行Shell',
    ],

    /**
     * 通知来源
     */
    'notice_source' => [
        1 => '云平台',
    ],

    /**
     * 通知状态
     */
    'notice_status' => [
        1 => '草稿箱',
        2 => '立即发布',
        3 => '定时发布',
    ],
];
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208

系统加载完成后,当前配置文件会默认加载到系统中,此时我们可以使用框架自带的获取配置参数的方式获取参数值,如:config('admin.gender_list')等等,以此类推;

# 虚拟主机

上面我们详细的介绍了系统中的全局配置文件内容及参数设定和各自模块中如何设置模块内的配置文件,下面我们给大家介绍下虚拟主机的配置方案,要想项目可以正常的访问,配置虚拟主机是必不可少的步骤:

  • Apache虚拟主机配置
<VirtualHost *:80>
    ServerAdmin zongjinlong@yunhengwang.com
    ServerName dev6.cn
    ServerAlias www.demo.cn admin.demo.cn m.demo.cn api.demo.cn script.demo.cn
    DocumentRoot "D:\sites\RXThinkCMF\RXThinkCMF_TP6_DEV\public"
    ErrorLog "logs/dev6.cn-error.log"
    CustomLog "logs/dev6.cn-access.log" common
</VirtualHost>

<VirtualHost *:80>
    ServerAdmin zongjinlong@yunhengwang.com
	  ServerName images.demo.cn
    DocumentRoot "D:\sites\RXThinkCMF\RXThinkCMF_TP6_DEV\public\uploads"
    ErrorLog "logs/yunheng.net-error.log"
    CustomLog "logs/yunheng.net-access.log" common
</VirtualHost>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

第一个虚拟主机是配置各模块的域名解析,第二个域名是专门为图片域名images.demo.cn配置的,指向指定的图片存放目录;

  • Nginx虚拟主机配置
  1. 模块域名配置
server {
    listen       80;
    server_name  www.demo.cn admin.demo.cn m.demo.cn api.demo.cn script.demo.cn;
    root    /www/webroot/RXThink/V6.0/pro/public;
    index   index.php;
    charset utf-8;

    # redirect server error pages to the static page /50x.html
    error_page   500 502 503 504  /50x.html;

    location = /50x.html {
        root   html;
    }
    error_log /www/logs/nginx/manage.pro6.rxthink.cn.error.log;
    access_log /www/logs/nginx/manage.pro6.rxthink.cn.access.log;


    if (!-e $request_filename) {
        rewrite  ^(.*)$  /index.php?s=$1  last;
        break;
    }
    location ~ \.php$ {
        fastcgi_pass   127.0.0.1:9000;
        fastcgi_index  index.php;
        fastcgi_param  SCRIPT_FILENAME  $document_root$fastcgi_script_name;
        include        fastcgi_params;
    }

    # deny access to .htaccess files, if Apache's document root
    location ~ /\.ht {
        deny  all;
    }
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33