# 基础配置

# 概述

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

# 项目依赖

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

"php": "^7.1.3",
"fideloper/proxy": "^4.0",
"illuminate/redis": "^5.8",
"laravel/framework": "5.8.*",
"laravel/tinker": "^1.0",
"mews/captcha": "~2.0",
"predis/predis": "1.1",
"spatie/laravel-view-components": "^1.3"
1
2
3
4
5
6
7
8

框架中基于视图封装了视图组件,因为需要引入第三方依赖库spatie/laravel-view-components,同时登录时使用的验证码功能需要引入第三方库mews/captcha,以及为了支持Redis的缓存支持,因为框架必须引入第三方依赖库predis/predis;

# 环境变量

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

APP_NAME=Laravel
APP_ENV=local
APP_KEY=base64:gCHL9mk/Hc8B3pxNQzWIm6Pvqt+GJXqa0f+nrpyszB4=
APP_DEBUG=true
APP_URL=http://localhost

LOG_CHANNEL=stack

DB_CONNECTION=mysql
DB_HOST=127.0.0.1
DB_PORT=3306
DB_DATABASE=laravel.pro5.8
DB_USERNAME=root
DB_PASSWORD=
DB_PREFIX=think_

BROADCAST_DRIVER=log
CACHE_DRIVER=redis
QUEUE_CONNECTION=sync
SESSION_DRIVER=file
SESSION_LIFETIME=120

REDIS_HOST=127.0.0.1
REDIS_PASSWORD=null
REDIS_PORT=6379
REDIS_DATABASE=0

MAIL_DRIVER=smtp
MAIL_HOST=smtp.mailtrap.io
MAIL_PORT=2525
MAIL_USERNAME=null
MAIL_PASSWORD=null
MAIL_ENCRYPTION=null

AWS_ACCESS_KEY_ID=
AWS_SECRET_ACCESS_KEY=
AWS_DEFAULT_REGION=us-east-1
AWS_BUCKET=

PUSHER_APP_ID=
PUSHER_APP_KEY=
PUSHER_APP_SECRET=
PUSHER_APP_CLUSTER=mt1

MIX_PUSHER_APP_KEY="${PUSHER_APP_KEY}"
MIX_PUSHER_APP_CLUSTER="${PUSHER_APP_CLUSTER}"

SITE_NAME = RXThinkCMF_LV5.8旗舰版
NICK_NAME = Laravel旗舰版
VERSION = v1.0.0

IMG_URL = http://images.laravel.pro
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
  • 相关配置可以自行查阅Laravel官方文档,这里中间介绍下自定义的几个参数:SITE_NAME表示系统全称,NICK_NAME表示系统简称,VERSION表示系统版本;

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

# 模板继承

在很多模板文件中具有共同的头部脚本,因此我们采用模板继承的方式,把头部和脚部单独拆分出来,写一个模板布局文件layout.blade.php,在布局文件中引入头部和脚部,然后其他模块文件集成布局文件即可,这样可以尽量保证代码的可维护性和高效性,具体拆分文件如下:

  • 头部文件header.blade.php
<head>
	<meta charset="utf-8"/>
	<meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
	<meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1">
	<title>{{$siteName}} | {{ Config::get('app.name') }}</title>
	<link href="/static/admin/assets/images/favicon.ico" rel="icon">
	<link rel="stylesheet" href="/static/admin/assets/libs/layui/css/layui.css"/>
	<link rel="stylesheet" href="/static/admin/assets/module/admin.css?v={$Think.env.app_debug?time():'2.0.7'}"/>
	<!--[if lt IE 9]>
	<script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"></script>
	<script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"></script>
	<![endif]-->
	<script type="text/javascript" src="/static/admin/assets/libs/layui/layui.js"></script>
	<script type="text/javascript" src="/static/admin/assets/js/common.js?v=318"></script>
	<script type="text/javascript">
		var C = '{{$app}}';
		var A = '{{$act}}';
		var mUrl = "/";
		var cUrl = "/" + C;
		var aUrl = cUrl+"/"+A;
	</script>
</head>

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
  • 脚部文件footer.blade.php
<script type="text/javascript" src="/static/admin/module/think_{{$app}}.js"></script>

1
2
  • 布局文件layout.blade.php
<!DOCTYPE html>
<html>
<!-- 引入头部 -->
@include("public.header")
<body>

<!-- 面包屑 -->
@include("public.crumb")

<!-- 主体部分开始 -->
<div class="layui-fluid">
    <div class="layui-card">
        <div class="layui-card-body">
            <!-- 内容区 -->
            @yield('content')
        </div>
    </div>
</div>
<!-- 主体部分结束 -->

<!-- 引入脚部 -->
@include("public.footer")
</body>
</html>

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

以上便是框架前端模块文件的整体拆分方式,模块文件中只需要继承布局文件layout.blade.php即可,案例如下:

<!-- 引入基类模板 -->
@extends('public.layout')

<!-- 主体部分 -->
@section('content')

    <!-- 功能操作区一 -->
    <form class="layui-form toolbar">
        <div class="layui-form-item">
            <div class="layui-inline">
                <label class="layui-form-label w-auto">职级名称:</label>
                <div class="layui-input-inline">
                    <input type="text" name="name" placeholder="请输入职级名称" autocomplete="off" class="layui-input">
                </div>
            </div>
            <div class="layui-inline">
                <div class="layui-input-inline" style="width: auto;">
                    @render('WidgetComponent', ['name'=>'query|查询'])
                    @render('WidgetComponent', ['name'=>'add|添加职级'])
                    @render('WidgetComponent', ['name'=>'dall|批量删除'])
                </div>
            </div>
        </div>
    </form>

    <!-- TABLE渲染区 -->
    <table class="layui-hide" id="tableList" lay-filter="tableList"></table>

    <!-- 操作功能区二 -->
    <script type="text/html" id="toolBar">
        @render('WidgetComponent', ['name'=>'edit|编辑'])
        @render('WidgetComponent', ['name'=>'delete|删除'])
    </script>

    <!-- 状态 -->
    <script type="text/html" id="statusTpl">
        <input type="checkbox" name="status" value="@{{ d.id }}" lay-skin="switch" lay-text="正常|禁用" lay-filter="status" @{{ d.status == 1 ? 'checked' : '' }} >
    </script>

@endsection
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

# 常量配置

在系统中存在一些定值,不会随着外接的变化而变化的值,我们统称为常量,因此在框架中后台我们专门开辟了一个常量配置文件admin.php,存放在框架config目录下:

<?php

/**
 * 后台配置文件
 */
return [

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

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

    /**
     * 菜单节点
     */
    'menu_func' => [
        1 => '列表',
        5 => '添加',
        10 => '修改',
        15 => '删除',
        20 => '详情',
        25 => '状态',
        30 => '批量删除',
        35 => '添加子级',
        40 => '全部展开',
        45 => '全部折叠',
    ],

    /**
     * 配置类型
     */
    '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' => [
        0 => '未知',
        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