复习

  1. *小目标列表
    1. 新增
      1. 按键修饰符绑定enter键按下
      2. 通过v-model获取到输入的待办事项的内容
      3. 转换成一个待办列表项,放入待办列表中
    2. 删除
      1. 在组件内部点击事件,触发一个_自定义事件_del,附带一个待办事项
      2. 通过事件冒泡,将要删除的待办事项传递给了外部,外部监听自定义事件del,分派给处理函数,附带的待办事项就是处理函数的参数
      3. 处理函数内部,删除待办列表中的该待办事项
    3. 分状态列表展示
      1. 计算属性,根据选择的状态,筛选展示的数据 Array.filter(筛选函数)
      2. 页面展示的是计算属性
    4. 分状态统计
      1. 计算属性:根据状态筛选计算
    5. 勾选改变状态
      1. 在组件内部更新状态
    6. 修改内容
      1. html属性 contenteditable
      2. 获得焦点 focus 存原始数据
      3. 失去焦点 blur 保存修改
      4. 按键esc 重置数据为原始数据
    7. Vue编程的一大特点:做数据处理,不涉及DOM操作
  2. 插槽 ```html

Vue.component(‘submit-button’,{ template:`

`

})

填入内容

Vue.component(‘base-layout’,{ template:`

` })

  1. 一个组件对外的接口有哪些?
  2. - props 属性
  3. - 自定义事件
  4. - slot 插槽
  5. 3. elementui的使用
  6. - 导入链接:
  7. - 样式
  8. - vue.js
  9. - elementui.js
  10. - 看文档
  11. - 示例代码
  12. - 属性 事件 slot method 文档
  13. - 布局 24
  14. - el-row el-col
  15. - span属性 offset偏移
  16. - 响应式 xs sm md lg xl
  17. - container
  18. - el-container el-header el-main el-footer el-aside
  19. - form table 走马灯 dialog message ....
  20. Q&A:
  21. 1. 前后端传值
  22. 1. 使用get方法,{params:{k:v}}
  23. 1. 使用post方法,跟对象 直接用this.form @RequestBody接受
  24. 1. 回调函数用箭头函数,解决this绑定问题,this指向vue实例
  25. 1. 回调函数的返回值的结构 response.data<=>返回的result
  26. 2. 格式化 状态 日期
  27. ```html
  28. <!-- 格式化器 -->
  29. <el-table-column
  30. prop="state"
  31. :formatter="stateFormatter"
  32. label="状态">
  33. </el-table-column>
  34. methods:{
  35. stateFormatter(row, column, cellValue, index){
  36. switch(cellValue){
  37. case 'wait': return '待审核';
  38. case 'normal': return '审核通过';
  39. case 'fail': return '审核失败';
  40. default : console.error("错误的状态"+cellValue+",无法格式化");
  41. }
  42. },
  43. ..
  44. }
  1. spring:
  2. mvc:
  3. format:
  4. date-time: yyyy-MM-dd HH:mm:ss
  5. jackson:
  6. date-format: yyyy-MM-dd HH:mm:ss
  1. 根据条件显示按钮
  1. <!DOCTYPE html>
  2. <html lang="en">
  3. <head>
  4. <meta charset="UTF-8" />
  5. <meta http-equiv="X-UA-Compatible" content="IE=edge" />
  6. <meta name="viewport" content="width=device-width, initial-scale=1.0" />
  7. <!-- 引入样式 -->
  8. <link
  9. rel="stylesheet"
  10. href="https://unpkg.com/element-ui/lib/theme-chalk/index.css"
  11. />
  12. <title>Document</title>
  13. </head>
  14. <body>
  15. <div id="app">
  16. <el-container>
  17. <el-header>
  18. <el-menu default-active="1" class="el-menu-demo" mode="horizontal">
  19. <el-menu-item index="1">处理中心</el-menu-item>
  20. <el-submenu index="2">
  21. <template slot="title">我的工作台</template>
  22. <el-menu-item index="2-1">选项1</el-menu-item>
  23. <el-menu-item index="2-2">选项2</el-menu-item>
  24. <el-menu-item index="2-3">选项3</el-menu-item>
  25. <el-submenu index="2-4">
  26. <template slot="title">选项4</template>
  27. <el-menu-item index="2-4-1">选项1</el-menu-item>
  28. <el-menu-item index="2-4-2">选项2</el-menu-item>
  29. <el-menu-item index="2-4-3">选项3</el-menu-item>
  30. </el-submenu>
  31. </el-submenu>
  32. <el-menu-item index="3" disabled>消息中心</el-menu-item>
  33. <el-menu-item index="4"><a href="https://www.ele.me" target="_blank">订单管理</a></el-menu-item>
  34. </el-menu>
  35. </el-header>
  36. <el-main>
  37. <el-form :inline="true" :model="searchForm" class="demo-form-inline">
  38. <el-form-item label="教师姓名">
  39. <el-input v-model="searchForm.teacherName" placeholder="教师姓名"></el-input>
  40. </el-form-item>
  41. <el-form-item label="审核状态">
  42. <el-select clearable v-model="searchForm.state" placeholder="审核状态">
  43. <el-option label="待审核" value="wait"></el-option>
  44. <el-option label="审核通过" value="normal"></el-option>
  45. <el-option label="审核失败" value="fail"></el-option>
  46. </el-select>
  47. </el-form-item>
  48. <el-form-item>
  49. <el-button type="primary" @click="search">查询</el-button>
  50. <el-button type="success" @click="addTeacherDialogVisible=true" icon="el-icon-plus" circle></el-button>
  51. </el-form-item>
  52. </el-form>
  53. <el-row>
  54. <el-col >
  55. <el-table
  56. :data="tableData"
  57. style="width: 100%">
  58. <el-table-column
  59. prop="teacherId"
  60. label="教师ID"
  61. width="180">
  62. </el-table-column>
  63. <el-table-column
  64. prop="teacherName"
  65. label="教师姓名"
  66. width="180">
  67. </el-table-column>
  68. <!-- 格式化器 -->
  69. <el-table-column
  70. prop="state"
  71. :formatter="stateFormatter"
  72. label="状态">
  73. </el-table-column>
  74. <el-table-column
  75. prop="email"
  76. label="邮箱">
  77. </el-table-column>
  78. <el-table-column
  79. label="操作">
  80. <template slot-scope='scope'>
  81. <el-button v-if='scope.row.state=="wait"' @click="audit(scope.row,true)" type="text" size="small">审核通过</el-button>
  82. <el-button v-if='scope.row.state=="wait"' @click="audit(scope.row,false)" type="text" size="small">审核失败</el-button>
  83. <el-button v-if='scope.row.state=="normal"' @click="fire(scope.row)" type="text" size="small">开除</el-button>
  84. </template>
  85. </el-table-column>
  86. </el-table>
  87. <el-pagination
  88. background
  89. layout="prev, pager, next,sizes"
  90. :total="page.total"
  91. :current-page='page.current'
  92. :page-size='page.size'
  93. @current-change='search'
  94. >
  95. </el-pagination>
  96. </el-col>
  97. </el-row>
  98. </el-main>
  99. </el-container>
  100. <el-dialog title="新增讲师" :visible.sync="addTeacherDialogVisible">
  101. <el-form :model="addTeacherForm">
  102. <el-row>
  103. <el-col :span='15'>
  104. <el-form-item label="讲师姓名" label-width="180px">
  105. <el-input v-model="addTeacherForm.teacherName" autocomplete="off"></el-input>
  106. </el-form-item>
  107. </el-col>
  108. </el-row>
  109. <el-row>
  110. <el-col :span='15'>
  111. <el-form-item label="生日" label-width="180px">
  112. <el-date-picker
  113. v-model="addTeacherForm.birthday"
  114. type="date"
  115. format="yyyy-MM-dd"
  116. value-format="yyyy-MM-dd HH:mm:ss"
  117. placeholder="选择生日">
  118. </el-date-picker>
  119. </el-form-item>
  120. </el-col>
  121. </el-row>
  122. <el-form-item label="email" label-width="180px">
  123. <el-input v-model="addTeacherForm.email" autocomplete="off"></el-input>
  124. </el-form-item>
  125. </el-form>
  126. <div slot="footer" class="dialog-footer">
  127. <el-button @click="addTeacherDialogVisible = false">取 消</el-button>
  128. <el-button type="primary" @click="addTeacher">新增</el-button>
  129. </div>
  130. </el-dialog>
  131. </div>
  132. <script src="https://unpkg.com/vue/dist/vue.js"></script>
  133. <!-- 引入组件库 -->
  134. <script src="https://unpkg.com/element-ui/lib/index.js"></script>
  135. <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
  136. <script>
  137. let app = new Vue({
  138. el:'#app',
  139. data:{
  140. page:{
  141. total:0,
  142. current:1,
  143. size:10
  144. },
  145. searchForm:{
  146. teacherName:'',
  147. state:''
  148. },
  149. formLabelWidth:"80px",
  150. addTeacherForm: {
  151. teacherName: '',
  152. email:'',
  153. birthday:''
  154. },
  155. addTeacherDialogVisible:false,
  156. tableData:[]
  157. },
  158. mounted(){
  159. this.search(1);
  160. },
  161. methods:{
  162. addTeacher(){
  163. console.log(this.addTeacherForm)
  164. axios.post('http://localhost:8000/addNewTeacher',this.addTeacherForm)
  165. .then(resp=>{
  166. this.$message({message:"新增成功",type:"success"});
  167. this.search(1);
  168. this.addTeacherDialogVisible=false;
  169. }).catch(resp=>{
  170. this.$message({message:"操作失败",type:"warning"});
  171. this.addTeacherDialogVisible=false;
  172. })
  173. },
  174. stateFormatter(row, column, cellValue, index){
  175. switch(cellValue){
  176. case 'wait': return '待审核';
  177. case 'normal': return '审核通过';
  178. case 'fail': return '审核失败';
  179. default : console.error("错误的状态"+cellValue+",无法格式化");
  180. }
  181. },
  182. audit(row,pass){
  183. console.log(row,pass);
  184. axios.post('http://localhost:8000/audit',{"teacherId":row.teacherId,"pass":pass})
  185. .then(resp=>{
  186. this.$message({message:"审核操作完成",type:"success"});
  187. this.search(1);
  188. }).catch(resp=>{
  189. this.$message({message:"操作失败",type:"warning"});
  190. })
  191. },
  192. fire(row){
  193. },
  194. handleClick(row){
  195. console.log(row);
  196. this.dialogFormVisible=true;
  197. // this.$message({message:'你查看成功了',type:'warning'});
  198. },
  199. search(current){
  200. //发请求到后端,搜索数据
  201. let param = this.searchForm;
  202. param.pageIndex=current;
  203. param.pageSize=this.page.size;
  204. axios.get('http://localhost:8000/queryTeacher',{
  205. params:param
  206. })
  207. .then(resp=>{
  208. if(resp.status=200&&resp.data.success){
  209. let data = resp.data.data;
  210. this.tableData=data.records;
  211. //将后端返回的数据绑定到分页条上
  212. this.page.total=data.total;
  213. this.page.current=data.current;
  214. this.page.size=data.size;
  215. }else{
  216. this.$message({
  217. message:'查询失败,'+resp.data.message,
  218. type:'warning'
  219. })
  220. }
  221. })
  222. .catch(error=>{
  223. this.$message({
  224. message:'查询失败,'+error.message,
  225. type:'error'
  226. })
  227. })
  228. }
  229. }
  230. });
  231. </script>
  232. </body>
  233. </html>

分页

  1. <el-pagination
  2. background
  3. layout="prev, pager, next,sizes"
  4. :total="page.total" 总条数
  5. :current-page='page.current' 当前页
  6. :page-size='page.size' 页容量
  7. @current-change='search' 当前页码改变时间,回传改变后的页码
  8. >
  9. </el-pagination>
  10. search(current){
  11. //发请求到后端,搜索数据
  12. let param = this.searchForm;
  13. param.pageIndex=current;
  14. param.pageSize=this.page.size;
  15. axios.get('http://localhost:8000/queryTeacher',{
  16. params:param
  17. })
  18. .then(resp=>{
  19. if(resp.status=200&&resp.data.success){
  20. let data = resp.data.data;
  21. this.tableData=data.records;
  22. //将后端返回的数据绑定到分页条上
  23. this.page.total=data.total;
  24. this.page.current=data.current;
  25. this.page.size=data.size;
  26. }else{
  27. this.$message({
  28. message:'查询失败,'+resp.data.message,
  29. type:'warning'
  30. })
  31. }
  32. })
  33. .catch(error=>{
  34. this.$message({
  35. message:'查询失败,'+error.message,
  36. type:'error'
  37. })
  38. })
  39. }
  40. }

demo56.zip


JS发展

nodejs js运行时环境 让js脱离浏览器,在电脑上运行

  • 后端代码,创建httpserver,接受http请求,并且响应;可以访问数据库;可以创建文件读取文件
    • 框架 express / sequelize
  • 桌面端应用程序
    • 框架 electron
  • 移动端应用程序
    • react-native
    • vue -> uniapp / weex

npm nodejs 自带的包管理器,功能类似于maven的依赖管理
webpack 打包工具,类似于Maven的构建流程

html => pug模板,简化html的编写
css => sass / less css拓展语言
js => typescript / coffeescript 升级

安装Node环境

  1. nodejs 自带npm

https://nodejs.org/zh-cn/
安装,下一步,下一步

  1. 测试 node -v npm -v
  2. 编写一个例子
    1. # 编写一个helloworld.js,内容如下
    2. console.log("hello world");
    3. # 通过node命令运行
    4. node helloworld.js
    1. npm init
    2. npm install mysql
    3. # 编写index.js,内容如下
    4. # 运行
    5. node index.js
    6. # 访问 localhost:8888 即可在控制台看到数据
    ```javascript var mysql = require(‘mysql’); var http = require(‘http’);

http.createServer(function (request, response) {

  1. // 发送 HTTP 头部
  2. // HTTP 状态值: 200 : OK
  3. // 内容类型: text/plain
  4. response.writeHead(200, {'Content-Type': 'text/plain'});
  5. var connection = mysql.createConnection({
  6. host: 'localhost',
  7. port:3306,
  8. user: 'root',
  9. password: 'root123',
  10. database: 'edu_56'
  11. });
  12. connection.connect();
  13. connection.query('SELECT * from edu_teacher', function (error, results, fields) {
  14. if (error) throw error;
  15. console.log('The solution is: ', results);
  16. // 发送响应数据 "Hello World"
  17. response.end(results);
  18. });

}).listen(8888);

// 终端打印如下信息 console.log(‘Server running at http://127.0.0.1:8888/‘);

  1. 4. 安装taobaonpm
  2. ```bash
  3. npm i -g cnpm --registry=https://registry.npm.taobao.org

vue-cli

  1. 安装

    1. cnpm install -g @vue/cli
    2. vue -V
  2. 创建项目

    1. # cmd
    2. vue create my-project
    3. # 界面
    4. vue ui

    image.png

image.png
image.png
image.png
image.png

  1. cd vue56
  2. npm run serve
  3. # 访问 IP:8080 看到界面

作业

  1. 完成讲师管理练习,新增一个修改讲师的功能,点击修改则弹窗,修改完成后刷新列表
  2. 创建并运行一个vue脚手架项目