別人都寫的那麼好了,爲何還要再寫一份? 本身手打記錄,印象深入javascript
代碼:github.com/MarkerHub/v…
視頻:www.bilibili.com/video/BV1PQ…
文檔:juejin.im/post/5ecfca…
css
git clone git@gitee.com:okokabcd/mdblog.git
複製代碼
start.spring.io/
html
項目使用了spring-boot-devtools,追加配置文件 resources/META-INF/spring-devtools.properties前端
restart.include.shiro-redis=/shiro-[\\w-\\.]+jar
複製代碼
<!-- mp -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-boot-starter</artifactId>
<version>3.2.0</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-freemarker</artifactId>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<scope>runtime</scope>
</dependency>
<!-- mp代碼生成器 -->
<dependency>
<groupId>com.baomidou</groupId>
<artifactId>mybatis-plus-generator</artifactId>
<version>3.2.0</version>
</dependency>
複製代碼
# DataSource Config
spring:
datasource:
driver-class-name: com.mysql.cj.jdbc.Driver
url: jdbc:mysql://localhost:3306/mdblog?useUnicode=true&useSSL=false&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: root
password:
mybatis-plus:
mapper-locations: classpath*:/mapper/**Mapper.xml
複製代碼
com.example.mdblog.config.MyBatisPlusConfig.javavue
@Configuration
@EnableTransactionManagement
@MapperScan("com.example.mdblog.mapper")
public class MyBatisPlusConfig {
@Bean
public PaginationInterceptor paginationInterceptor() {
PaginationInterceptor paginationInterceptor = new PaginationInterceptor();
return paginationInterceptor;
}
}
複製代碼
com.example.mdblog.CodeGenerator.java java
com.example.mdblog.controller.UserControllernode
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
UserService userService;
@GetMapping("/test")
public ServerResponse<User> index() {
return ServerResponse.success().setData(userService.getById(1L));
}
}
複製代碼
com.example.mdblog.common.ResponseCode
org.springframework.http.HttpStatus
com.example.mdblog.common.ServerResponse mysql
com.example.mdblog.common.exception.GlobalExceptionHandler webpack
com.example.mdblog.config.CorsConfig
com.example.mdblog.shiro.JwtFilter 追加以下方法ios
@Override
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
HttpServletRequest httpServletRequest = WebUtils.toHttp(request);
HttpServletResponse httpServletResponse = WebUtils.toHttp(response);
httpServletResponse.setHeader("Access-control-Allow-Origin", httpServletRequest.getHeader("Origin"));
httpServletResponse.setHeader("Access-Control-Allow-Methods", "GET,POST,OPTIONS,PUT,DELETE");
httpServletResponse.setHeader("Access-Control-Allow-Headers", httpServletRequest.getHeader("Access-Control-Request-Headers"));
// 跨域時會首先發送一個OPTIONS請求,這裏咱們給OPTIONS請求直接返回正常狀態
if (httpServletRequest.getMethod().equals(RequestMethod.OPTIONS.name())) {
httpServletResponse.setStatus(org.springframework.http.HttpStatus.OK.value());
return false;
}
return super.preHandle(request, response);
}
複製代碼
登陸邏輯
# node cnpm
node -v
npm -v
cnpm -v
# vue-cli安裝依賴包
cnpm install -g vue-cli
複製代碼
cli.vuejs.org/guide/
徒手建立項目
# 1. 安裝依賴 npm install xxx or cnpm install xxx
# 生成package-lock.json
# 2. 初始化 npm init -f or cnpm init -f
# 生成package.json
# 3. 安裝組件,並查看安裝後的內容
mkdir project1
cd project1
npm install
npm i vue-router -D
npm i es-lint -D
複製代碼
配置下鏡像
npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global
複製代碼
使用模板建立
# 使用圖形界面
# vue ui
# 使用命令行
vue create mdblog-ui
選擇手動
組件選擇:只安裝Router和Vuex
上下鍵在組件間移動,空格選中或不選中,回車下一步
Use history mode for router? 輸入 y
In package.json 選這個
Save this as a preset for future projects? (y/N) 輸入 n
複製代碼
安裝後
# 啓動,注意是serve
npm run serve
複製代碼
# 安裝 element-ui
cnpm install element-ui --save
複製代碼
引入element-ui依賴,src/main.js中追加以下代碼
import Element from 'element-ui'
import "element-ui/lib/theme-chalk/index.css"
Vue.use(Element)
複製代碼
# 安裝axios
cnpm install axios --save
複製代碼
引入axios依賴
import axios from 'axios'
Vue.prototype.$axios = axios
複製代碼
使用axios
組件中,咱們就能夠經過this.$axios.get()來發起咱們的請求了
<template>
<div>
</div>
</template>
複製代碼
模板頁面裏面只能有一個標籤
延遲加載
{
path: '/about',
name: 'About',
// route level code-splitting
// this generates a separate chunk (about.[hash].js) for this route
// which is lazy-loaded when the route is visited.
component: function () {
return import(/* webpackChunkName: "about" */ '../views/About.vue')
}
}
複製代碼
{
path: '/blog/:blogId/edit',
name: 'BlogEdit',
component: BlogEdit,
meta: {
requireAuth: true
}
},
複製代碼
cnpm install mavon-editor --save
複製代碼
引入依賴
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
Vue.use(mavonEditor)
複製代碼
cnpm install markdown-it --save
cnpm install github-markdown-css --save
複製代碼
引入依賴
import mavonEditor from 'mavon-editor'
import 'mavon-editor/dist/css/index.css'
複製代碼
使用
<mavon-editor v-model="ruleForm.content"></mavon-editor> <div class="markdown-body" v-html="blog.content"></div> // 渲染 var MardownIt = require("markdown-it") var md = new MardownIt() var result = md.render(blog.content) _this.blog.content = result 複製代碼