那每次跳转页面时,页面栈是怎样变化的呢?下面我们来分析一下使用各种跳转方式页面栈的变化过程。我们可以用 getCurrentPages() 方法来验证,getCurrentPages()方法可以获取当前页面栈的实例,展现页面栈中页面存储的情况,返回的结果是数组形式。数组的第一个元素为初始化页面,数组的最后一个元素为当前页面。
继续编辑 pages/index/index.vue 文件,我们创建几个 methods 方法,在方法里面实现页面跳转。实例:navigateTo(){ uni.navigateTo({ url: this.url })},redirectTo(){ uni.redirectTo({ url: this.url });},switchTab(){ uni.switchTab({ url: this.url });}在 template 标签中添加下面代码,添加点击事件。实例:<button type="default" @tap="navigateTo">跳转到新页面</button><button type="default" @tap="redirectTo">在当前页打开</button><button type="default" @tap="switchTab">跳转到tab页面</button>这样我们就可以点击工具栏–运行–运行到内置浏览器查看效果了,与上面的效果是一样的
创建second.xml,作为登录后页面的布局文件:<?xml version="1.0" encoding="utf-8"?><LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical"> <TextView android:id="@+id/result" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="170dp" android:textSize="20sp" /> <Button android:id="@+id/logout" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_gravity="center" android:layout_marginTop="20dp" android:text="注销登录" /></LinearLayout>主要是一个欢迎页面,带上了用户的账号名,另外就是一个“注销登录”按钮,可以删除登录记录并跳转回登录首页,登陆成功后页面如下:
进入 /home 目录,使用 emacs 命令查看 new.log 文件内容,命令如下:cd /homelsemacs new.log执行结果如下图:执行如上图所示命令就会进入 emacs 编辑器界面,如下图所示:Tips:如图所示编辑完自己想要修改的内容之后点击 Save即可保存,和在 windows 中用法相似。
前面的测试过程有一个遗憾,没有看到错误信息,没有明确的告诉使用者哪些数据输入没有符合验证要求。要实现这个功能,只需要在控制器中把错误信息保存到请求域,然后在页面中显示出来。修改一下控制器中的代码。比前面的代码多了一个 ModelMap 对象,用于把错误信息保存到请求作用域中;@RequestMapping(value = "/save", method = RequestMethod.POST)public String register(@Valid Teacher teacher, BindingResult result, ModelMap model) { if (result.hasErrors()) { List<FieldError> fieldsErrors = result.getFieldErrors(); for (FieldError fieldError : fieldsErrors) { model.put(fieldError.getField(), fieldError.getDefaultMessage()); } return "fail"; } return "success"; }Tips: 如果验证失败,错误提示信息会自动保存到 BindingResult 类型 。在提交失败的页面中显示错误。<body>老师注册失败原因!<br/> ${name} <br/> ${age}</body>Tips: EL 表达式中的 name、age 是表单提交时的参数名(也就是表单控件的名字)。model.put (fieldError.getField (), fieldError.getDefaultMessage ()) 这行代码会把错误信息以表单控件名为 key 保存在请求作用域中。再次在浏览器中打开 teacher.html 页面,输入不符合规则的数据,提交后在错误页面中看到。
要使用快速跳转功能,首先唤起搜索面板 Ctrl+P,快捷键如下:说明Windows/LinuxMacOS触发快速搜索框Ctrl+P⌘+P
进入 /home 目录,使用 nano 命令查看 new.log 文件内容,命令如下:cd /homelsnano new.log执行结果如下图:执行如上图所示命令就会进入 nano 编辑器界面,如下图所示:Tips:如图所示编辑完自己想要修改的内容之后按下 Ctrl + X 输入 y 回车即可保存退出。
我们来实现从 index 页面跳转到刚刚创建的 page1 页面,编辑 pages/index/index.vue 文件。在 data 中添加变量 url。实例:data() { return { url:"/pages/page1/page1" }}然后在 template 标签中添加下面代码。实例:<!-- open-type的表示跳转方式 --><!-- open-type为navigate,如果不写open-type跳转方式默认为navigate --><navigator :url="url" open-type="navigate"> <button type="default">跳转到新页面</button></navigator><!-- open-type为redirect --><navigator :url="url" open-type="redirect"> <button type="default">在当前页打开</button></navigator><!-- open-type为switchTab --><navigator :url="url" open-type="switchTab"> <button type="default">跳转到tab页面</button></navigator>点击工具栏–运行–运行到内置浏览器,查看效果。点击按钮就能通过open-type指定的跳转方式跳转到 page1 页面。
要搞清楚页面栈概念,我们首先要了解“栈”是什么意思,在学习数据结构的时候,我们应该都了解过,栈是一种连续储存的数据结构,具有先进后出的性质。在古代,存储货物或供旅客住宿的地方叫做栈。引申到计算机领域中,就是暂时存储数据的地方,这样进栈、出栈的说法也比较容易理解了,进栈就是将数据添加到栈顶部,出栈就是将数据从栈顶部删除。但这样说还是有点抽象,我们可以将栈想象成一个开口的盒子,将书一本一本的放进盒子中,先放进去的书总是会被后放进去的书压在下面,这就是进栈的过程。那如果想拿出底部的书,需要先将顶部的书(也就是后放进的书)一本一本的拿出来,这是出栈的过程。这样解释栈的先进后出的性质就比容易理解了。页面栈就是用来储存页面的栈,也有栈的特性。uni-app 是通过页面栈来管理所有的页面,我们可以将页面栈理解为一个放页面的容器。每次跳转页面,都会从这个容器中添加或者删除页面。为了便于大家理解,我们来看一下示意图:
关于一个纯文本页面,这里的纯文本,也不是指页面中一个图片或者其他多媒体元素都没有,只是说以文字占比大部分的网页。那么这类网页设计的步骤我们要有一个怎么样的流程?这就是这个知识点要介绍的。基本可以分为五个步骤。第一步:内容规划,把你要粘贴到各种 HTML 元素的内容,也就是文字材料先收集,准备好。可以放在 txt 文件里,也可以放在剪贴板里。第二步: HTML 元素的规划,涉及到文字的 HTML 元素并不多,比如 p 标签,a 标签,input标签等,也有像 article ,div 这样的容器标签可以选择。这一步就是要规划好,你到底用哪种标签来承载哪些文本内容,这一步很重要,正所谓:“标签选的好不好,完美设计跑不了!”第三步:我们来设置每一个文本元素的 CSS 样式,我们有两种方式可以选择,一种是为 HTML 元素同意编写 CSS 文件,然后以引入的方式进行引入。另一种就是利用之前我们学习过的 CSS 设置操作,在 Dreaweaver CC 2018 里进行设置。其实利用 Dreawweaver CC 2018 设置好之后,原理等同于 Dreaweaver CC 2018 帮助我们自动写出了 CSS 样式文件。我们在两种方式之间的选择只不过是选择了一种我们与设计工具的一种交互方式。第四步:就是保存页面,写好页面固然重要,但我曾见过多少“老司机”在设计的过程中,因为不习惯保存,或者没有保存的好习惯,而遭遇了断电,电脑故障损坏,而导致半天,几小时的工作量化为流水的。所以同学们在制作网页文件的时候一定勤于保存。第五步:发布到网站,在浏览器里打开测试。这一步也是我们的网页要见客户,见用户前最后一步了,这里如果没问题,那用户只要浏览器不是太奇葩,或者打开方式有问题,就基本不会出现我们的“返工”。这一步只需要你的一点仔细和留心。以上就是我们再这个小节中给大家讲述的设计纯文本页面的五个基本步骤,其中大多数的操作,老师都已经在之前的章节做过讲解,大家有不会的可以翻阅之前的资料。
前面小节介绍了用户权限相关的知识,从这一小节开始我们将要开始学习文件权限相关的知识,如何给文件修改权限,之前小节介绍过 ls 命令展示出来的一些文件相关的信息,这里面就有和文件权限相关的信息。在 Linux 系统中,有时候某些文件内容不能修改,只能拥有只读权限,某些文件需要读写权限,即可以读,又可以写,某些文件需要可执行权限,这个时候若文件的相关权限不正确,就可能报错业务出错,因此需要对文件权限进行修改。
默认情况下,错误报告是 ZIP 文件。ZIP 文件名类似 bugreport-BUILD_ID-DATE.zip,它可能会包含多个文件,但最重要的文件是 bugreport-BUILD_ID-DATE.txt。此文件就是错误报告,它包含系统服务 (dumpsys)、错误日志 (dumpstate) 和系统消息日志 (logcat) 的诊断输出。系统消息包括设备抛出错误时的堆栈轨迹,以及从所有应用中使用 Log 类写入的消息。ZIP 文件中有一个 version.txt 元数据文件,其中包含 Android 版本号,而且启用 systrace 后,ZIP 文件中还会包含 systrace.txt 文件。Systrace 工具可以获取并显示应用进程和其他 Android 系统进程的执行时间,从而帮助分析应用的性能。dumpstate 工具会将文件从设备的文件系统复制到 ZIP 文件的 FS 文件夹下,以便我们引用它们。例如,设备中的 /dirA/dirB/fileC 文件会在 ZIP 文件中生成 FS/dirA/dirB/fileC 条目错误报告文件结构如下:
想象一下,你奋笔疾书写了100行代码,突然停电了,当然你也没有保存代码。一顿捶胸顿足,后来打开编辑器发现代码都还在。请注意这不是笑话,而是Sublime编辑器的一个功能而已。快跟随我来看看吧。编辑器只会在你关闭当前没有保存的页面的时候给你提示,其他情况会暂存文件的修改。可以清楚的看到,我们修改某个文件,然后关闭编辑器再打开发现修改状态还在。所以某一天停电,电脑死机,也不用抱头痛哭了,因为编辑器会暂存所有的代码改动。
你可能会问,我如果换了一台电脑,这些配置咋办?答案:我们可以把配置保存起来,这样只需要准备配置文件即可。快跟着我操作起来吧!入口 Preferences => Package Settings => HTML-CSS-JS Prettify => Prettify Preferences-User。自定义配置页面是一个新页面,我们可以按照配置要求来写我们自己的配置,格式如下:{ "all":{ "end_with_newline":true, "indent_size": 2, ... }, "html":{ ... }, "css":{ ... }, "js":{ ... }, "json":{ ... }, "custom":{ ... }}操作动图如下:当然,我们也可以只设置all里面的属性,需要哪个就设置哪个。
上面的操作我们也看到了,当新增了一个文件之后,使用 "git status" 命令查看文件状态信息时,最后一行内容:nothing added to commit but untracked files present (use “git add” to track)。提示我们没有提交任何内容但是存在未跟踪的文件,括号里面说可以使用 “git add” 命令去使其被跟踪管理。这个 “git add” 命令就是将新做的修改添加到 git 暂存区的,那么我们就来试一下,把上一步新建的文件进行添加:$ git add test2.txt之后再查看下文件状态:$ git statusOn branch masterYour branch is up to date with 'origin/master'.Changes to be committed: (use "git reset HEAD <file>..." to unstage) new file: test2.tx此时,文件 test2.txt 就到了 “Changes to be committed” 的内容下面,也就是将要被提交的修改,因为已经添加到了暂存区,接下来可以进行提交。直到这里,一切都是那么顺滑,不对,顺利!附:演示流程如下:
在之前的小节中,我们学习了使用 <router-link to="path">...</router-link> 的方式来实现路由跳转。实际上 router-link 的 to 属性可以接收一个对象: <router-link :to="{path: 'path'}">...</router-link>让我们来看一个简单的示例:777代码解释:HTML 代码第 12 行,我们定义了首页跳转链接,通过对象的形式给属性 to 赋值。HTML 代码第 13 行,我们定义了文章跳转链接,通过字符串的形式给属性 to 赋值。HTML 代码第 15 行,我们使用 <router-view></router-view> 组件来渲染匹配组件。JS 代码第 5-7 行,我们定义了组件 Index。JS 代码第 9-11 行,我们定义了组件 Article。JS 代码第 13-16 行,我们定义了路由数组:- 1. 首页路由,地址为 ‘/index’,匹配组件 Index。- 2. 文章路由,地址为 ‘/article’,匹配组件 Article。JS 代码第 18-20 行,创建 router 实例,然后传 routes 配置。JS 代码第 24 行,通过 router 配置参数注入路由。除了通过 path 可以链接到路由外,还可以通过路由 name 实现链接跳转:`<router-link :to="{name: 'name'}">...</router-link>`778代码解释:HTML 代码第 12-13 行,我们定义了两个跳转链接,通过对象的形式给属性 to 赋值,跳转指定 name 的路由。HTML 代码第 15 行,我们使用 <router-view></router-view> 组件来渲染匹配组件。JS 代码第 5-7 行,我们定义了组件 Index。JS 代码第 9-11 行,我们定义了组件 Article。JS 代码第 13-16 行,我们定义了路由数组:首页路由,地址为 ‘/index’, 路由名为 index,匹配组件 Index。文章路由,地址为 ‘/article’, 路由名为 article,匹配组件 Article。JS 代码第 18-20 行,创建 router 实例,然后传 routes 配置。JS 代码第 24 行,通过 router 配置参数注入路由。
首先我们点击一个成熟的网页。这里以百度为例。大家可以访问百度等成熟的商业网站,然后单击Ctrl+S,再弹出的页面中点击保存,即可把百度首页的HTML保存下来(同时会带一些CSS文件和JS文件)。还是那句话,学习网页设计没有捷径可走,最好的方式之一就是学习前人设计的网页的思路和技巧,在自己的理解基础上,进行积淀,才能成为一个合格的网页设计师。下面我们来具体的看一看用 Dreamweaver CC 2018 设置界面外观具体需要哪些步骤:第一步:我们先把保存到电脑内的百度网页导入到 Dreamweaver CC 2018 中。点击文件,再点击打开。选择刚刚保存的百度首页。导入后点击屏幕上方的拆分视图,即可在一个页面中同时观察到网页的预览效果和代码效果。第二步:为了学会在 Dreamweaver CC 2018 中设置外观的方法,我们需要打开属性面板。认真学习本教程的同学们不难发现,如何打开属性面板,我们在前两节中就有过相关的讲述,在此就不赘述。打开属性面板后,我们鼠标左键单击上方实时视图的时候可以发现,属性面板中显示的内容在动态的跟随我们的点击变化。如下图所示。这个时候,我们只需要在属性面板中修改你想要改变的外观属性之,就可以达到修改CSS,进而外观的作用了。
article 用于定义网页中文档、章节、段落相关的文本结构,一个网页中可以定义多个 article 标签。与 span 不同的是,article 具有明确定义的语义。每个 article 中通常包含 header、H1-H6、address 等和文章标题、作者等相关信息的标签。1008注意: article 是 HTML5 新增的元素,可能不兼容低版本的 IE 浏览器。
有时我们使用 Vim 打开某一个文件时只需要阅读某一特定位置就行,这个时候可以使用 Vim 的跳转快捷键来帮我们快速的定位需要阅读的位置:Vim 跳转快捷方式:快捷方式功能ctrl+f/F跳转到下一页ctrl+b/B跳转到上一页ctrl+d/u向上或向下跳转半页gg跳转到文件第一行G跳转到文件最后一行<行数>gg/G跳转到指定行数,例如 12gg或者12G 代表跳转到 12 行{g}+Ctrl-g/G查看文件信息。
let 不允许在同一个函数或块作用域中重复声明同一个变量,否则会引起语法错误(SyntaxError)。{ let x = 10; let x = 11;}// Uncaught SyntaxError: Identifier 'x' has already been declared在上面的代码中报错,所以,同一个变量名不可以在同一个作用域内重复声明。{ let x = 10; var x = 1;}即使使用 var 去声明也是不可以的,我们知道当使用 let 声明的时候 x 已经是一个死区了,不可以被重复声明了。Tips:注意在 switch 语句中只有一个块级作用域,所以下面这种情况也是会报错的。let x = 1;switch(x) { case 0: let num; break; case 1: let num;//重复声明了 break;}// 报错如果把 case 后面的语句放到块作用域中则不会报错。let x = 1;switch(x) { case 0: {//块 let num; break; } case 1: {//块 let num;//这里就没有关系了,可以正常声明 break; }}上方代码,case 后面的语句 let 变量声明在放到块中,是单独的作用域,所以就不会报错。
创建控制器类,由于是商品相关的控制器,所以命名为 GoodsController ,代码如下:实例:/** * 商品控制器 */@Controller // 标注为控制器public class GoodsController { /** * 获取商品列表 */ @RequestMapping("/goods") // 请求路径 public String goods() { return "goods";// 跳转到goods.ftl页面 }}我们具体解释下该类的作用。@Controller 注解标注在 GoodsController 类上,会为该类注册一个控制器组件,放入 Spring 容器中。该组件具备处理请求的能力,其中的方法可以响应 HTTP 请求;@RequestMapping ("/goods") 注解标注在方法 goods () 上,所以请求路径如果匹配 /goods ,则由该方法进行处理;返回值是字符串 "goods" ,由于我们已经引入 FreeMarker 依赖,所以该返回值会跳转到 goods.ftl 页面。Tips: 注意需要在 application.properties 文件中设置模板文件的后缀,即: spring.freemarker.suffix=.ftl 。如果不添加该配置,直接 return "goods.ftl"; 会报错。
a 标签为双标签,需要有首尾标签。a 标签的 href 属性为必填属性,表示该 a 标签点击过后跳转网页的地址。例如:<a href="https://www.imooc.com/">去往慕课网</a>在网页中会呈现以下效果:注意:a 标签的 href 属性必须添加网络协议,如:HTTP 或者 HTTPS 协议,一般为 HTTPS 协议,不能单纯的编写网址;a 标签有很多默认样式,默认字体为蓝色,文本有下划线,点击过后,字体变为偏紫色;a 标签默认在本页面跳转,既不会新开一个网页跳转;a 标签的 href 属性如果为错误的网络地址,则页面会跳转,但不会显示网页的内容。a 标签还有一个属性为 target,表示跳转的网页为在当前页面跳转,还是新开一个页面跳转。默认值为 _self,表示为在当前页面跳转,如果将 a 标签的 target 属性设置为 _blank,则表示新开一个网页跳转,代码如下:<a href="https://www.imooc.com/" target="_blank">去往慕课网</a>a 标签的 target 属性为可选属性。
成功配置好模板后让我们回到项目源码页面,可以看到仓库多了一些文件:第一个是配置文件,我们不用管,如果想改变刚刚网站的内容,只需要修改 index.md 文件即可。例如像我这样,直接编辑文件,改成简历的形式,然后提交 commit。完成后,再打开我们刚才的网址,就能看到页面已经更新成我们刚提交的内容啦。这样,就实现了一个简单的个人简历网站。
在之前的小节中,我们学习了如何使用 $router 实例来实现编程式的导航。我们也可以使用 $router 实例跳转指定名字的路由地址:779代码解释:HTML 代码第 12-13 行,我们定义了两个按钮,并给他们点击事件 jump。HTML 代码第 15 行,我们使用 <router-view></router-view> 组件来渲染匹配组件。JS 代码第 5-7 行,我们定义了组件 Index。JS 代码第 9-11 行,我们定义了组件 Article。JS 代码第 13-16 行,我们定义了路由数组:1. 首页路由,地址为 ‘/index’,匹配组件 Index。2. 文章路由,地址为 ‘/article’,匹配组件 Article。JS 代码第 18-20 行,创建 router 实例,然后传 routes 配置。JS 代码第 24 行,通过 router 配置参数注入路由。JS 代码第 29-31 行,我们定义来 jump 函数,通过 router.push 实现路由跳转。
我们可以看到,默认 Admin 管理页面给我们提供的增删改查操作,页面的内容比较单一。如果我们想自定义管理页面的内容以及功能的时候,可以使用 ModelAdmin 类,它是模型在 Admin 界面中的表示形式,封装了模型的 Admin 功能和选项。通常,会将它们放在应用中的名为 admin.py 的文件里。from django.contrib import adminfrom .models import Member, VIPLevel@admin.register(Member)class MemberAdmin(admin.ModelAdmin): pass@admin.register(VIPLevel)class VIPLevelAdmin(admin.ModelAdmin): pass上面这样的写法等价于我们使用默认的管理方式,和之前的 admin.site.register([Member, VIPLevel]) 注册函数功能一致,仅仅是表示注册。我们来看看 ModelAdmin 的常用属性值:actions_on_top / actions_on_bottom:用来控制列表页按钮显示位置;date_hierarchy:只可作用在 DateField 和 DateTimeField 上。设置后, 可以根据时间段, 去过滤数据;empty_value_display:此属性会覆盖记录字段为空的默认显示值。 默认值为-(破折号);exclude:排除新增/编辑页面需要显示的字段;fields:指定新增、编辑页面要显示的字段;fieldsets:设置 fieldsets 以控制管理页面的 “Add” 和 “Change” 按钮跳转页面的布局;list_display:控制列表页要显示的字段;如果我们没有设置 list_display 属性,那么 admin 站点仅显示一列,显示 __str__() 的结果,这正是我们前面看到的现象;list_display_links:指定哪些在列表页显示的字段上加链接;list_editable:指定哪些字段可以直接在列表页编辑;list_filter:指定列表页过滤字段;list_per_page:指定列表页每页显示的记录数;ordering:指定字段的排序,比如正序、倒叙等等。我们使用 ModelAdmin 类来改造下前面的 Member 模型的展示页面,代码如下:from django.contrib import adminfrom .models import Member, VIPLevel# Register your models here.@admin.register(Member)class MemberAdmin(admin.ModelAdmin): actions_on_top = False actions_on_bottom = True date_hierarchy = 'register_date' empty_value_display = '-empty-' list_display = ('name', 'age', 'city', 'sex', 'occupation', 'phone_num') list_editable = ('age', 'sex') list_filter = ('occupation', 'city') ordering = ['-age'] list_per_page = 5@admin.register(VIPLevel)class VIPLevelAdmin(admin.ModelAdmin): pass每个属性值对应的效果如下图所示:更多关于 ModelAdmin 类的属性及其用法,我们需要参看官方文档,那里有十分详细的属性说明以及代码演示。及时查看官方文档辅助学习 Django 是一个非常有效的学习手段,毕竟那里才是 Django 一切学习文档的来源地。
在学习完如何利用 DReamweaverf CC 2018 改变页面的CSS外观后,接下来我们要给大家介绍一下如何设置页面的字体。Dreamweaver CC 2018 作为工具强大之处就在于托管和集成功能了得。首先,我们还是到第一个知识点中涉及到的页面属性页面。在弹出的页面中我们可以看到分类中有外观选项,点击它后看到右边出现了我们想要设置的字体属性。接下来只要修改相关属性就可以改变整个网页的字体啦。
def query(): user = session.get('user') return render_template('query.html', user = user)query 函数从 Session 中获取名称为 ‘user’ 的变量,将值作为参数传递给页面模板 query.html,服务端渲染后生成包含有 Session 变量的值内容,返回给浏览器。Flask 程序对 Sesion 进行设置、修改、删除的操作后,最后调用 query () 函数将 Session 中包含的变量的值返回给浏览器。注意:可以通过 session [‘user’] 的方法获取名称为 ‘user’ 的变量的值,两者的区别在于:如果变量 user 不存在,session [‘user’] 会抛出异常如果变量 user 不存在,session.get (‘user’) 返回 None,不会抛出异常
面试官提问: 操作系统的页面置换算法是什么?常用算法有哪些?题目解析:首先要明确页面置换算法是针对内存管理的算法。页面置换算法是虚拟内存的运行机制核心,内存被分页之后,每个页都是一段连续的地址,每个进程拥有的都是一段虚拟地址,需要经过内存管理单元(Memory Management Unit,也就是 MMU)将虚拟地址转换为物理地址。操作系统的 CPU 和内存都是稀缺资源,所以资源比较紧张,内存具有非常高的 I/O 速度,但是空间很小。硬盘具有很大的存储空间,但是 I/O 能力一般。所以操作系统综合了两者的特性,将硬盘作为内存的缓存,虚拟内存就是硬盘空间的一部分。进程运行时,操作系统访问内存空间,如果访问的页面在内存中不存在则从硬盘中将其调入,如果内存没有空闲空间,则将内存中的一段数据调出到硬盘空间。我们介绍三种最常见的内存管理算法:LRU、FIFO、OPT 算法。
在 app\controller\Study 中新建 ExceptionController 控制器和 testException 方法:<?phpnamespace app\controller\Study;use app\BaseController;use app\Service\StudentService;use think\facade\Log;class ExceptionController extends BaseController{ public function testException() { try{ $studentService = new StudentService(); $studentService->update(); }catch(\Exception $exception){ Log::write($exception->getMessage(),'test'); return json("内部错误:".$exception->getMessage()); } return json("请求成功"); }}如下图所示:其中 StudentService 类的定义代码如下:<?phpnamespace app\Service;use app\Models\Study\StudentModel;use think\Exception;class StudentService{ public function update($id = 1){ try { $student = StudentModel::where('id',$id)->find(); //这里修改主键 id 的值,并保存会报错 $student->id = "test"; $student->save(); }catch(\Exception $e){ throw new Exception("数据保存失败:".$e->getMessage()); } }}Tips: 上述代码是为了演示方便故意写的一个报错代码,目的是为了异常捕获。
我们知道,如果对一个文件做了修改,想要提交至版本库之前必须先加入暂存区。但是,git 提供了一个偷懒的办法(毕竟,程序员效率至上嘛),就是可以跳过暂存区提交,使用如下命令:$ git commit -a -m '备注'演示流程如下:注意:“git commit -a -m” 这个命令必须在文件内容修改后使用,如果你的文件是刚新建的并且还没提交过,那么还是需要先 “git add”。正常的开发过程中,对于提交日志的规范都有要求。日志是我们作为历史版本维护的一个很重要的内容,一个好的日志模板可以方便进行代码 review,以及后续开发者快速了解历史问题等等。本教程只是演示,实际开发中请遵守具体规范!