diff --git a/.gitattributes b/.gitattributes
index 0546f650..6cfd1957 100644
--- a/.gitattributes
+++ b/.gitattributes
@@ -2,4 +2,6 @@
*.less linguist-language=Java
*.js linguist-language=Java
*.html linguist-language=Java
-*.vue linguist-language=Java
\ No newline at end of file
+*.vue linguist-language=Java
+*.xml linguist-language=Java
+*.sql linguist-language=Java
diff --git a/.gitignore b/.gitignore
new file mode 100644
index 00000000..7f4ecdf7
--- /dev/null
+++ b/.gitignore
@@ -0,0 +1,8 @@
+node_modules/
+/dist/
+npm-debug.log*
+yarn-debug.log*
+yarn-error.log*
+.idea
+target/
+!.mvn/wrapper/maven-wrapper.jar
\ No newline at end of file
diff --git a/README.md b/README.md
index 1a2302ae..930c573d 100644
--- a/README.md
+++ b/README.md
@@ -1,6 +1,8 @@
-扫码加微信,备注V部落,进群讨论。
+扫码加微信(微信ID:**a_java_boy2**),备注V部落,进群讨论。
-
+
+
+V 部落姊妹篇:[https://github.com/lenve/vhr](https://github.com/lenve/vhr)
V部落是一个多用户博客管理平台,采用Vue+SpringBoot开发。
diff --git a/blogserver/pom.xml b/blogserver/pom.xml
index ced5cf6d..215beab7 100644
--- a/blogserver/pom.xml
+++ b/blogserver/pom.xml
@@ -14,7 +14,7 @@
org.springframework.boot
spring-boot-starter-parent
- 1.5.9.RELEASE
+ 2.2.7.RELEASE
diff --git a/blogserver/src/main/java/org/sang/config/MyPasswordEncoder.java b/blogserver/src/main/java/org/sang/config/MyPasswordEncoder.java
new file mode 100644
index 00000000..b51e8665
--- /dev/null
+++ b/blogserver/src/main/java/org/sang/config/MyPasswordEncoder.java
@@ -0,0 +1,27 @@
+package org.sang.config;
+
+import org.springframework.security.crypto.password.PasswordEncoder;
+import org.springframework.stereotype.Component;
+import org.springframework.util.DigestUtils;
+
+/**
+ * @作者 江南一点雨
+ * @微信公众号 江南一点雨
+ * @网站 http://www.itboyhub.com
+ * @国际站 http://www.javaboy.org
+ * @微信 a_java_boy
+ * @GitHub https://github.com/lenve
+ * @Gitee https://gitee.com/lenve
+ */
+@Component
+public class MyPasswordEncoder implements PasswordEncoder {
+ @Override
+ public String encode(CharSequence rawPassword) {
+ return DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes());
+ }
+
+ @Override
+ public boolean matches(CharSequence rawPassword, String encodedPassword) {
+ return encodedPassword.equals(DigestUtils.md5DigestAsHex(rawPassword.toString().getBytes()));
+ }
+}
diff --git a/blogserver/src/main/java/org/sang/config/WebSecurityConfig.java b/blogserver/src/main/java/org/sang/config/WebSecurityConfig.java
index e8a6976f..ae7c648b 100644
--- a/blogserver/src/main/java/org/sang/config/WebSecurityConfig.java
+++ b/blogserver/src/main/java/org/sang/config/WebSecurityConfig.java
@@ -32,22 +32,7 @@ public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
@Override
protected void configure(AuthenticationManagerBuilder auth) throws Exception {
- auth.userDetailsService(userService).passwordEncoder(new PasswordEncoder() {
- @Override
- public String encode(CharSequence charSequence) {
- return DigestUtils.md5DigestAsHex(charSequence.toString().getBytes());
- }
-
- /**
- * @param charSequence 明文
- * @param s 密文
- * @return
- */
- @Override
- public boolean matches(CharSequence charSequence, String s) {
- return s.equals(DigestUtils.md5DigestAsHex(charSequence.toString().getBytes()));
- }
- });
+ auth.userDetailsService(userService);
}
@Override
diff --git a/blogserver/src/main/java/org/sang/controller/ArticleController.java b/blogserver/src/main/java/org/sang/controller/ArticleController.java
index 77a489f1..ffc767b1 100644
--- a/blogserver/src/main/java/org/sang/controller/ArticleController.java
+++ b/blogserver/src/main/java/org/sang/controller/ArticleController.java
@@ -93,6 +93,14 @@ public RespBean updateArticleState(Long[] aids, Integer state) {
return new RespBean("error", "删除失败!");
}
+ @RequestMapping(value = "/restore", method = RequestMethod.PUT)
+ public RespBean restoreArticle(Integer articleId) {
+ if (articleService.restoreArticle(articleId) == 1) {
+ return new RespBean("success", "还原成功!");
+ }
+ return new RespBean("error", "还原失败!");
+ }
+
@RequestMapping("/dataStatistics")
public Map dataStatistics() {
Map map = new HashMap<>();
diff --git a/blogserver/src/main/java/org/sang/controller/CategoryController.java b/blogserver/src/main/java/org/sang/controller/CategoryController.java
index f099f988..17dfe850 100644
--- a/blogserver/src/main/java/org/sang/controller/CategoryController.java
+++ b/blogserver/src/main/java/org/sang/controller/CategoryController.java
@@ -36,7 +36,13 @@ public RespBean deleteById(@PathVariable String ids) {
@RequestMapping(value = "/", method = RequestMethod.POST)
public RespBean addNewCate(Category category) {
+
+ if ("".equals(category.getCateName()) || category.getCateName() == null) {
+ return new RespBean("error", "请输入栏目名称!");
+ }
+
int result = categoryService.addCategory(category);
+
if (result == 1) {
return new RespBean("success", "添加成功!");
}
diff --git a/blogserver/src/main/java/org/sang/controller/LoginRegController.java b/blogserver/src/main/java/org/sang/controller/LoginRegController.java
index 23fea02a..0c7a39e9 100644
--- a/blogserver/src/main/java/org/sang/controller/LoginRegController.java
+++ b/blogserver/src/main/java/org/sang/controller/LoginRegController.java
@@ -4,6 +4,7 @@
import org.sang.bean.User;
import org.sang.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
@@ -38,7 +39,7 @@ public RespBean loginPage() {
return new RespBean("error", "尚未登录,请登录!");
}
- @RequestMapping("/reg")
+ @PostMapping("/reg")
public RespBean reg(User user) {
int result = userService.reg(user);
if (result == 0) {
diff --git a/blogserver/src/main/java/org/sang/mapper/ArticleMapper.java b/blogserver/src/main/java/org/sang/mapper/ArticleMapper.java
index 7fd00bb6..2f893025 100644
--- a/blogserver/src/main/java/org/sang/mapper/ArticleMapper.java
+++ b/blogserver/src/main/java/org/sang/mapper/ArticleMapper.java
@@ -23,6 +23,8 @@ public interface ArticleMapper {
int updateArticleState(@Param("aids") Long aids[], @Param("state") Integer state);
+ int updateArticleStateById(@Param("articleId") Integer articleId, @Param("state") Integer state);
+
int deleteArticleById(@Param("aids") Long[] aids);
Article getArticleById(Long aid);
diff --git a/blogserver/src/main/java/org/sang/mapper/ArticleMapper.xml b/blogserver/src/main/java/org/sang/mapper/ArticleMapper.xml
index d304dd23..9d594272 100644
--- a/blogserver/src/main/java/org/sang/mapper/ArticleMapper.xml
+++ b/blogserver/src/main/java/org/sang/mapper/ArticleMapper.xml
@@ -65,7 +65,9 @@
#{aid}
-
+
+ UPDATE article SET state=#{state} WHERE id = #{articleId}
+
DELETE FROM article WHERE id IN
diff --git a/blogserver/src/main/java/org/sang/service/ArticleService.java b/blogserver/src/main/java/org/sang/service/ArticleService.java
index 7842abdf..f4809e5a 100644
--- a/blogserver/src/main/java/org/sang/service/ArticleService.java
+++ b/blogserver/src/main/java/org/sang/service/ArticleService.java
@@ -113,6 +113,10 @@ public int updateArticleState(Long[] aids, Integer state) {
}
}
+ public int restoreArticle(Integer articleId) {
+ return articleMapper.updateArticleStateById(articleId, 1); // 从回收站还原在原处
+ }
+
public Article getArticleById(Long aid) {
Article article = articleMapper.getArticleById(aid);
articleMapper.pvIncrement(aid);
diff --git a/blogserver/src/main/java/org/sang/service/UserService.java b/blogserver/src/main/java/org/sang/service/UserService.java
index 7a17f2bd..11c67cca 100644
--- a/blogserver/src/main/java/org/sang/service/UserService.java
+++ b/blogserver/src/main/java/org/sang/service/UserService.java
@@ -2,6 +2,7 @@
import org.sang.bean.Role;
import org.sang.bean.User;
+import org.sang.config.MyPasswordEncoder;
import org.sang.mapper.RolesMapper;
import org.sang.mapper.UserMapper;
import org.sang.utils.Util;
@@ -9,6 +10,7 @@
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.core.userdetails.UsernameNotFoundException;
+import org.springframework.security.crypto.password.PasswordEncoder;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.util.DigestUtils;
@@ -25,6 +27,8 @@ public class UserService implements UserDetailsService {
UserMapper userMapper;
@Autowired
RolesMapper rolesMapper;
+ @Autowired
+ PasswordEncoder passwordEncoder;
@Override
public UserDetails loadUserByUsername(String s) throws UsernameNotFoundException {
@@ -51,7 +55,7 @@ public int reg(User user) {
return 1;
}
//插入用户,插入之前先对密码进行加密
- user.setPassword(DigestUtils.md5DigestAsHex(user.getPassword().getBytes()));
+ user.setPassword(passwordEncoder.encode(user.getPassword()));
user.setEnabled(true);//用户可用
long result = userMapper.reg(user);
//配置用户的角色,默认都是普通用户
diff --git a/blogserver/src/main/resources/application.properties b/blogserver/src/main/resources/application.properties
index 857ce9a6..0e4544cc 100644
--- a/blogserver/src/main/resources/application.properties
+++ b/blogserver/src/main/resources/application.properties
@@ -1,7 +1,7 @@
spring.datasource.type=com.alibaba.druid.pool.DruidDataSource
-spring.datasource.url=jdbc:mysql:///vueblog?useUnicode=true&characterEncoding=UTF-8
-spring.datasource.username=username
-spring.datasource.password=password
+spring.datasource.url=jdbc:mysql:///vueblog2?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghai
+spring.datasource.username=root
+spring.datasource.password=123
mybatis.config-location=classpath:/mybatis-config.xml
server.port=8081
diff --git a/vueblog/.gitignore b/vueblog/.gitignore
index 541a820f..81de835b 100644
--- a/vueblog/.gitignore
+++ b/vueblog/.gitignore
@@ -12,3 +12,4 @@ yarn-error.log*
*.ntvs*
*.njsproj
*.sln
+.editorconfig
\ No newline at end of file
diff --git a/vueblog/src/components/ArticleList.vue b/vueblog/src/components/ArticleList.vue
index 304133eb..ddf90d34 100644
--- a/vueblog/src/components/ArticleList.vue
+++ b/vueblog/src/components/ArticleList.vue
@@ -3,19 +3,19 @@
-
+
-
+
-
+
-
+
-
+
diff --git a/vueblog/src/components/BlogTable.vue b/vueblog/src/components/BlogTable.vue
index 6f427447..c91d2f92 100644
--- a/vueblog/src/components/BlogTable.vue
+++ b/vueblog/src/components/BlogTable.vue
@@ -57,6 +57,10 @@
size="mini"
@click="handleEdit(scope.$index, scope.row)" v-if="showEdit">编辑
+ 还原
+
{
+ _this.loading = true;
+ putRequest('/article/restore', {articleId: row.id}).then(resp=> {
+ if (resp.status == 200) {
+ var data = resp.data;
+ _this.$message({type: data.status, message: data.msg});
+ if (data.status == 'success') {
+ window.bus.$emit('blogTableReload')//通过选项卡都重新加载数据
+ }
+ } else {
+ _this.$message({type: 'error', message: '还原失败!'});
+ }
+ _this.loading = false;
+ });
+ }).catch(() => {
+ _this.$message({
+ type: 'info',
+ message: '已取消还原'
+ });
+ });
+ },
deleteToDustBin(state){
var _this = this;
this.$confirm(state != 2 ? '将该文件放入回收站,是否继续?' : '永久删除该文件, 是否继续?', '提示', {
@@ -208,6 +239,6 @@
});
}
},
- props: ['state', 'showEdit', 'showDelete', 'activeName']
+ props: ['state', 'showEdit', 'showDelete', 'activeName', 'showRestore']
}