Commit d5d6e481 authored by Junling Bu's avatar Junling Bu
Browse files

Merge branch 'master' into dev

parents 91c74f8e 8086d8a1
#!/bin/bash
cd /home/ubuntu/docker
sudo docker-compose down
sudo docker-compose build
sudo docker image prune -f
sudo docker-compose up -d
#!/bin/bash
# 本脚本的作用是重置部署环境
# 1.重置数据库
# 2.删除storage文件夹内文件
# 3.调用deploy.sh启动服务
# 注意:由于1和2的原因,请仅在开发测试阶段使用本脚本!
# 重置数据库
# i. 请在`XXXXXX`处设置相应的root密码
# ii. 同时请注意root密码放在脚本是非常危险的,因此这里仅仅是用于开发测试阶段。
ROOT=root
PASSWORD=litemall123456
if test -z "$PASSWORD"
then
echo "请设置云服务器MySQL的root账号密码"
exit 1
fi
# 删除storage文件夹内文件
cd /home/ubuntu/docker/litemall/storage || exit 2
sudo rm -f ./**
cd /home/ubuntu/docker || exit 3
sudo docker-compose down
sudo docker-compose build
sudo docker image prune -f
# 删除db/data文件夹内文件重置数据
# 这样docker启动时会自动运行db/init-sql脚本,导入新的数据
cd /home/ubuntu/docker/db/data || exit 1
sudo rm -rf ./**
cd /home/ubuntu/docker || exit 3
sudo docker-compose up -d
FROM openjdk:8-jre FROM openjdk:8-jre
COPY application.yml /litemall/application.yml COPY application.yml application.yml
COPY litemall.jar /litemall/litemall.jar COPY litemall.jar litemall.jar
ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","litemall.jar"] ENTRYPOINT ["java","-Djava.security.egd=file:/dev/./urandom","-jar","litemall.jar"]
\ No newline at end of file
...@@ -7,10 +7,10 @@ ...@@ -7,10 +7,10 @@
# 请设置云服务器的IP地址和账户 # 请设置云服务器的IP地址和账户
# 例如 ubuntu@122.51.199.160 # 例如 ubuntu@122.51.199.160
REMOTE= REMOTE=ubuntu@122.51.199.160
# 请设置本地SSH私钥文件id_rsa路径 # 请设置本地SSH私钥文件id_rsa路径
# 例如 /home/litemall/id_rsa # 例如 /home/litemall/id_rsa
ID_RSA= ID_RSA=/d/00/cloud/litemall.txt
if test -z "$REMOTE" if test -z "$REMOTE"
then then
...@@ -38,8 +38,8 @@ cd $LITEMALL_HOME || exit 2 ...@@ -38,8 +38,8 @@ cd $LITEMALL_HOME || exit 2
scp -i $ID_RSA -r ./docker $REMOTE:/home/ubuntu/ scp -i $ID_RSA -r ./docker $REMOTE:/home/ubuntu/
# 远程登录云服务器并执行reset脚本 # 远程登录云服务器并执行reset脚本
#ssh $REMOTE -i $ID_RSA << eeooff ssh $REMOTE -i $ID_RSA << eeooff
#cd /home/ubuntu cd /home/ubuntu
#sudo ./docker/bin/reset.sh sudo ./docker/bin/reset.sh
#exit exit
#eeooff eeooff
\ No newline at end of file \ No newline at end of file
package org.linlinjava.litemall.core.task; package org.linlinjava.litemall.core.task;
import com.google.common.primitives.Ints;
import java.time.LocalDateTime;
import java.util.concurrent.Delayed; import java.util.concurrent.Delayed;
import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeUnit;
...@@ -24,7 +27,7 @@ public abstract class Task implements Delayed, Runnable{ ...@@ -24,7 +27,7 @@ public abstract class Task implements Delayed, Runnable{
@Override @Override
public int compareTo(Delayed o) { public int compareTo(Delayed o) {
return (int)(this.getDelay(TimeUnit.MILLISECONDS) - o.getDelay(TimeUnit.MILLISECONDS)); return Ints.saturatedCast(this.start - ((Task) o).start);
} }
@Override @Override
......
...@@ -89,4 +89,21 @@ public class TaskTest { ...@@ -89,4 +89,21 @@ public class TaskTest {
e.printStackTrace(); e.printStackTrace();
} }
} }
@Test
public void test2() {
DateTimeFormatter df = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String now = df.format(LocalDateTime.now());
System.out.println("start at time=" + now);
taskService.addTask(new DemoTask("1", 0));
taskService.addTask(new DemoTask("2", 1200));
taskService.addTask(new DemoTask("3", 5200));
try {
Thread.sleep(10 * 1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
} }
drop database if exists litemall; drop database if exists litemall;
drop user if exists 'litemall'@'localhost'; drop user if exists 'litemall'@'%';
-- 支持emoji:需要mysql数据库参数: character_set_server=utf8mb4 -- 支持emoji:需要mysql数据库参数: character_set_server=utf8mb4
create database litemall default character set utf8mb4 collate utf8mb4_unicode_ci; create database litemall default character set utf8mb4 collate utf8mb4_unicode_ci;
use litemall; use litemall;
create user 'litemall'@'localhost' identified by 'litemall123456'; create user 'litemall'@'%' identified by 'litemall123456';
grant all privileges on litemall.* to 'litemall'@'localhost'; grant all privileges on litemall.* to 'litemall'@'%';
flush privileges; flush privileges;
\ No newline at end of file
...@@ -59,6 +59,13 @@ export function authProfile(data) { ...@@ -59,6 +59,13 @@ export function authProfile(data) {
}) })
} }
const AuthRegister='wx/auth/register'; //账号注册 const AuthRegister='wx/auth/register'; //账号注册
export function authRegister(data) {
return request({
url: AuthRegister,
method: 'post',
data
});
}
const AuthReset='wx/auth/reset'; //账号密码重置 const AuthReset='wx/auth/reset'; //账号密码重置
export function authReset(data) { export function authReset(data) {
return request({ return request({
......
...@@ -10,8 +10,9 @@ export default [ ...@@ -10,8 +10,9 @@ export default [
component: () => import('@/views/login/register-getCode') component: () => import('@/views/login/register-getCode')
}, },
{ {
path: '/login/registerSubmit', path: '/login/registerSubmit/:phone',
name: 'registerSubmit', name: 'registerSubmit',
props: true,
component: () => import('@/views/login/register-submit') component: () => import('@/views/login/register-submit')
}, },
{ {
......
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
<script> <script>
import field from '@/components/field/'; import field from '@/components/field/';
import fieldGroup from '@/components/field-group/'; import fieldGroup from '@/components/field-group/';
import { mobileReg } from '@/utils/validate';
export default { export default {
data() { data() {
...@@ -30,7 +31,21 @@ export default { ...@@ -30,7 +31,21 @@ export default {
methods: { methods: {
submitCode() { submitCode() {
this.$router.push({ name: 'registerSubmit' }); if(this.mobile === ''){
return
}
if(!mobileReg.test(this.mobile)){
this.mobile = ''
return
}
try {
this.$router.push({
name: 'registerSubmit',
params: { phone: this.mobile}
});
} catch (error) {
console.log(error.message);
}
} }
}, },
......
...@@ -5,39 +5,63 @@ ...@@ -5,39 +5,63 @@
<div>{{statusText}}</div> <div>{{statusText}}</div>
</div> </div>
<div class="status_text"><span class="red">3秒</span>后返回到登录页, 您也可以<router-link to="/login" class="red">点此登录</router-link></div> <div class="status_text">
<span class="red">
<countdown v-if="counting" :time="3000" @end="countDownEnd">
<template slot-scope="props">{{ +props.seconds || 3 }}</template>
</countdown>
</span>
后返回到登录页, 您也可以
<router-link to="/login" class="red">点此登录</router-link>
</div>
</div> </div>
</template> </template>
<script> <script>
import field from '@/components/field/';
import fieldGroup from '@/components/field-group/';
export default { export default {
name: 'payment-status', name: 'payment-status',
props: { props: {
status: String status: String
}, },
data() { data() {
return { return {
isSuccess: true counting: true,
}; isSuccess: true
}, };
},
computed: {
statusText() { methods:{
return this.isSuccess ? '注册成功' : '注册失败'; countDownEnd() {
}, this.counting = false;
statusIcon() { window.location = '#/login/';
return this.isSuccess ? 'checked' : 'fail'; }
}, },
statusClass() {
return this.isSuccess ? 'success_icon' : 'fail_icon'; computed: {
} statusText() {
}, return this.isSuccess ? '注册成功' : '注册失败';
},
activated() { statusIcon() {
this.isSuccess = this.status === 'success'; return this.isSuccess ? 'checked' : 'fail';
} },
statusClass() {
return this.isSuccess ? 'success_icon' : 'fail_icon';
}
},
activated() {
this.isSuccess = this.status === 'success';
},
components: {
[field.name]: field,
[fieldGroup.name]: fieldGroup
}
}; };
</script> </script>
......
...@@ -2,12 +2,13 @@ ...@@ -2,12 +2,13 @@
<md-field-group class="register_submit"> <md-field-group class="register_submit">
<md-field v-model="code" icon="mobile" placeholder="请输入验证码"> <md-field v-model="code" icon="mobile" placeholder="请输入验证码">
<div slot="rightIcon" @click="getCode" class="getCode red"> <div slot="rightIcon" @click="getCode" class="getCode red">
<countdown v-if="counting" :time="60000" @end="countdownend"> <countdown v-if="counting" :time="60000" @end="countDownEnd">
<template slot-scope="props">{{ +props.seconds || 60 }}秒后获取</template> <template slot-scope="props">{{ +props.seconds || 60 }}秒后获取</template>
</countdown> </countdown>
<span v-else>获取验证码</span> <span v-else>获取验证码</span>
</div> </div>
</md-field> </md-field>
<md-field v-model="username" icon="username" placeholder="请输入用户名"/>
<md-field v-model="password" icon="lock" placeholder="请输入密码"/> <md-field v-model="password" icon="lock" placeholder="请输入密码"/>
<md-field v-model="repeatPassword" icon="lock" placeholder="请再次确认密码"/> <md-field v-model="repeatPassword" icon="lock" placeholder="请再次确认密码"/>
...@@ -20,29 +21,83 @@ ...@@ -20,29 +21,83 @@
<script> <script>
import field from '@/components/field/'; import field from '@/components/field/';
import fieldGroup from '@/components/field-group/'; import fieldGroup from '@/components/field-group/';
import { authRegisterCaptcha } from '@/api/api';
import { authRegister } from '@/api/api';
import {Toast} from "vant";
export default { export default {
data() { props: {
return { phone: String
counting: true, },
code: '', data() {
password: '', return {
repeatPassword: '' counting: true,
}; code: '',
}, username: '',
password: '',
repeatPassword: ''
};
},
mounted:function(){
this.getCode();
},
methods: { methods: {
registerSubmit() { registerSubmit() {
this.$router.push({ if(this.username === '' || this.code === ''){
name: 'registerStatus', return
params: { status: 'success' } }
if(this.password === '' || this.repeatPassword === ''){
return
}
if(this.password !== this.repeatPassword){
this.password = ''
this.repeatPassword = ''
return
}
let data = this.getRegisterData();
authRegister(data).then(res => {
this.$router.push({
name: 'registerStatus',
params: { status: 'success' }
});
}).catch (error => {
Toast.fail(error.data.errmsg);
if (error.data.errno == 705) {
window.location = '#/login/';
}
}); });
}, },
getCode() { getCode() {
this.counting = true; this.counting = true;
let data = {
mobile: this.phone
};
authRegisterCaptcha(data).then(res => {
this.counting = true;
}).catch(error => {
alert(error.data.errmsg);
this.counting = true;
});
}, },
countdownend() {
getRegisterData() {
const password = this.password;
const code = this.code;
const repeatPassword = this.repeatPassword;
const mobile = this.phone;
const username = this.username;
return {
code: code,
username: username,
password: password,
repeatPassword: repeatPassword,
mobile: mobile
};
},
countDownEnd() {
this.counting = false; this.counting = false;
} }
}, },
......
...@@ -318,14 +318,13 @@ public class WxAuthController { ...@@ -318,14 +318,13 @@ public class WxAuthController {
// token // token
String token = UserTokenManager.generateToken(user.getId()); String token = UserTokenManager.generateToken(user.getId());
Map<Object, Object> result = new HashMap<Object, Object>(); Map<Object, Object> result = new HashMap<Object, Object>();
result.put("token", token); result.put("token", token);
result.put("userInfo", userInfo); result.put("userInfo", userInfo);
return ResponseUtil.ok(result); return ResponseUtil.ok(result);
} }
/** /**
* 请求验证码 * 请求验证码
* *
......
...@@ -78,7 +78,7 @@ ...@@ -78,7 +78,7 @@
<dependency> <dependency>
<groupId>org.hibernate.validator</groupId> <groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId> <artifactId>hibernate-validator</artifactId>
<version>6.0.15.Final</version> <version>6.1.0.Final</version>
</dependency> </dependency>
<!-- MySQL 连接驱动依赖 --> <!-- MySQL 连接驱动依赖 -->
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment