version-2.6[项目最终上线+修改Api+打包前后端+配置https,nginx文件+Docker]

pull/1/head
dyh 3 years ago
parent 3a7849163d
commit d0adc326bf

@ -10,6 +10,8 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>backend</artifactId>
<!-- 新加 -->
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
@ -129,5 +131,24 @@
</exclusions>
</dependency>
</dependencies>
<!-- 新加 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.kob.backend.BackendApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -40,7 +40,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/user/account/token/", "/user/account/register/").permitAll()
.antMatchers("/api/user/account/token/", "/api/user/account/register/").permitAll()
.antMatchers("/pk/start/game/","/pk/receive/bot/move/").hasIpAddress("127.0.0.1")
.antMatchers(HttpMethod.OPTIONS).permitAll()
.anyRequest().authenticated();

@ -14,7 +14,7 @@ public class RankListController {
@Autowired
private RankListService rankListService;
@GetMapping("/ranklist/getlist")
@GetMapping("/api/ranklist/getlist")
public JSONObject getList(@RequestParam Map<String,String> data){
Integer page = Integer.parseInt(data.get("page"));
return rankListService.getList(page);

@ -14,7 +14,7 @@ public class GetRecordListController {
@Autowired
private GetRecordListService getRecordListService;
@GetMapping("/record/getlist/")
@GetMapping("/api/record/getlist/")
public JSONObject getList(@RequestParam Map<String,String> data){
Integer page = Integer.parseInt(data.get("page"));
return getRecordListService.getList(page);

@ -12,7 +12,7 @@ public class InfoController {
@Autowired
private InfoService infoService;
@GetMapping("/user/account/info/")
@GetMapping("/api/user/account/info/")
public Map<String,String> getInfo()
{
return infoService.getInfo();

@ -19,7 +19,7 @@ public class LoginController {
@Autowired
private LoginService loginService;//接口实例调用接口方法==>调用实现类中的方法
@PostMapping("/user/account/token/")
@PostMapping("/api/user/account/token/")
public Map<String,String> getToken(@RequestParam Map<String,String> map)
{
String username = map.get("username");

@ -14,7 +14,7 @@ public class RegisterController {
@Autowired
private RegisterService registerService;
@PostMapping("/user/account/register/")
@PostMapping("/api/user/account/register/")
public Map<String,String> register(@RequestParam Map<String,String> map)
{
String username = map.get("username");

@ -14,7 +14,7 @@ public class AddController {
@Autowired
private AddService addService;
@PostMapping("/user/bot/add/")
@PostMapping("/api/user/bot/add/")
public Map<String ,String> add(@RequestParam Map<String,String> data)
{
return addService.add(data);

@ -13,7 +13,7 @@ public class GetListController{
@Autowired
private GetListService getListService;
@GetMapping("/user/bot/getlist/")
@GetMapping("/api/user/bot/getlist/")
public List<Bot> getList()
{
return getListService.getList();

@ -13,7 +13,7 @@ public class RemoveController {
@Autowired
private RemoveService removeService;
@PostMapping("/user/bot/remove/")
@PostMapping("/api/user/bot/remove/")
public Map<String,String> remove(@RequestParam Map<String,String> data)
{
return removeService.remove(data);

@ -13,7 +13,7 @@ public class UpdateController {
@Autowired
private UpdateService updateService;
@PostMapping("/user/bot/update/")
@PostMapping("/api/user/bot/update/")
public Map<String,String> update(@RequestParam Map<String,String> data){
return updateService.update(data);
}

@ -1,7 +1,7 @@
server.port=3000
spring.datasource.username=root
spring.datasource.password=dyh20011022
spring.datasource.password=Dd20011022
spring.datasource.url=jdbc:mysql://localhost:3306/kob?serverTimezone=Asia/Shanghai&useUnicode=true&characterEncoding=utf-8
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

@ -10,7 +10,8 @@
<modelVersion>4.0.0</modelVersion>
<artifactId>botrunningsystem</artifactId>
<!-- 新加 -->
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
@ -68,5 +69,24 @@
</exclusions>
</dependency>
</dependencies>
<!-- 新加 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.kob.botrunningsystem.BotRunningSystemApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -10,7 +10,11 @@ import org.springframework.util.LinkedMultiValueMap;
import org.springframework.util.MultiValueMap;
import org.springframework.web.client.RestTemplate;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.UUID;
import java.util.function.Supplier;
@Component
public class Consumer extends Thread{
@ -37,7 +41,7 @@ public class Consumer extends Thread{
}
private String addUid(String code,String uid){
int k = code.indexOf(" implements BotInterface");
int k = code.indexOf(" implements java.util.function.Supplier<Integer>");
return code.substring(0,k) + uid +code.substring(k);
}
@ -46,12 +50,21 @@ public class Consumer extends Thread{
UUID uuid = UUID.randomUUID();
String uid = uuid.toString().substring(0,8);
BotInterface botInterface = Reflect.compile(
//更普遍的一个接口
Supplier<Integer> botInterface = Reflect.compile(
"com.kob.botrunningsystem.utils.Bot" + uid,
addUid(bot.getBotCode(),uid)
).create().get();
//bot.getInput()写入文件
File file = new File("input.txt");
try(PrintWriter printWriter = new PrintWriter(file)){
printWriter.println(bot.getInput());
printWriter.flush();
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Integer direction = botInterface.nextMove(bot.getInput());
Integer direction = botInterface.get();
System.out.println("move-direction: " + bot.getUserId() + " " + direction);

@ -1,8 +1,85 @@
package com.kob.botrunningsystem.utils;
public class Bot implements com.kob.botrunningsystem.utils.BotInterface {
@Override
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Bot implements java.util.function.Supplier<Integer> {
static class Cell {
public int x, y;
public Cell(int x, int y) {
this.x = x;
this.y = y;
}
}
private boolean check_tail_increasing(int step) { // 检验当前回合,蛇的长度是否增加
if (step <= 10) return true;
return step % 3 == 1;
}
public List<Cell> getCells(int sx, int sy, String steps) {
steps = steps.substring(1, steps.length() - 1);
List<Cell> res = new ArrayList<>();
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
int x = sx, y = sy;
int step = 0;
res.add(new Cell(x, y));
for (int i = 0; i < steps.length(); i ++ ) {
int d = steps.charAt(i) - '0';
x += dx[d];
y += dy[d];
res.add(new Cell(x, y));
if (!check_tail_increasing( ++ step)) {
res.remove(0);
}
}
return res;
}
public Integer nextMove(String input) {
String[] strs = input.split("#");
int[][] g = new int[13][14];
for (int i = 0, k = 0; i < 13; i ++ ) {
for (int j = 0; j < 14; j ++, k ++ ) {
if (strs[0].charAt(k) == '1') {
g[i][j] = 1;
}
}
}
int aSx = Integer.parseInt(strs[1]), aSy = Integer.parseInt(strs[2]);
int bSx = Integer.parseInt(strs[4]), bSy = Integer.parseInt(strs[5]);
List<Cell> aCells = getCells(aSx, aSy, strs[3]);
List<Cell> bCells = getCells(bSx, bSy, strs[6]);
for (Cell c: aCells) g[c.x][c.y] = 1;
for (Cell c: bCells) g[c.x][c.y] = 1;
int[] dx = {-1, 0, 1, 0}, dy = {0, 1, 0, -1};
for (int i = 0; i < 4; i ++ ) {
int x = aCells.get(aCells.size() - 1).x + dx[i];
int y = aCells.get(aCells.size() - 1).y + dy[i];
if (x >= 0 && x < 13 && y >= 0 && y < 14 && g[x][y] == 0) {
return i;
}
}
return 0;
}
@Override
public Integer get() {
File file = new File("input.txt");
try {
Scanner sc = new Scanner(file);
return nextMove(sc.next());
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
}
}

@ -0,0 +1 @@
11111111111111100100001100011000000000000110000000100001100001011100011000110000000110000000000001100000001100011000111010000110000100000001100000000000011000110000100111111111111111#1#12#(22222222223000000000012)#11#1#(00000000001211011121110)

@ -1,94 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
<component name="FacetManager">
<facet type="web" name="Web">
<configuration>
<webroots />
<sourceRoots>
<root url="file://$MODULE_DIR$/src/main/java" />
<root url="file://$MODULE_DIR$/src/main/resources" />
</sourceRoots>
</configuration>
</facet>
<facet type="Spring" name="Spring">
<configuration />
</facet>
</component>
<component name="NewModuleRootManager" LANGUAGE_LEVEL="JDK_1_8">
<output url="file://$MODULE_DIR$/target/classes" />
<output-test url="file://$MODULE_DIR$/target/test-classes" />
<content url="file://$MODULE_DIR$">
<sourceFolder url="file://$MODULE_DIR$/src/main/java" isTestSource="false" />
<sourceFolder url="file://$MODULE_DIR$/src/main/resources" type="java-resource" />
<sourceFolder url="file://$MODULE_DIR$/src/test/java" isTestSource="true" />
<excludeFolder url="file://$MODULE_DIR$/target" />
</content>
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-security:2.7.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter:2.3.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot:2.3.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-autoconfigure:2.3.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-logging:2.3.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-classic:1.2.3" level="project" />
<orderEntry type="library" name="Maven: ch.qos.logback:logback-core:1.2.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-to-slf4j:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.logging.log4j:log4j-api:2.13.3" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:jul-to-slf4j:1.7.30" level="project" />
<orderEntry type="library" name="Maven: jakarta.annotation:jakarta.annotation-api:1.3.5" level="project" />
<orderEntry type="library" name="Maven: org.yaml:snakeyaml:1.26" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-aop:5.2.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-beans:5.2.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-config:5.3.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-core:5.3.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-context:5.2.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.security:spring-security-web:5.3.6.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-expression:5.2.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-web:2.3.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-json:2.3.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-databind:2.11.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-annotations:2.11.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.core:jackson-core:2.11.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jdk8:2.11.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.11.3" level="project" />
<orderEntry type="library" name="Maven: com.fasterxml.jackson.module:jackson-module-parameter-names:2.11.3" level="project" />
<orderEntry type="library" name="Maven: org.springframework.boot:spring-boot-starter-tomcat:2.3.7.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-core:9.0.41" level="project" />
<orderEntry type="library" name="Maven: org.glassfish:jakarta.el:3.0.3" level="project" />
<orderEntry type="library" name="Maven: org.apache.tomcat.embed:tomcat-embed-websocket:9.0.41" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-web:5.2.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-webmvc:5.2.12.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-starter-test:2.3.7.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test:2.3.7.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework.boot:spring-boot-test-autoconfigure:2.3.7.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.jayway.jsonpath:json-path:2.4.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:json-smart:2.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.minidev:accessors-smart:1.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.ow2.asm:asm:5.0.4" level="project" />
<orderEntry type="library" name="Maven: org.slf4j:slf4j-api:1.7.30" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.xml.bind:jakarta.xml.bind-api:2.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: jakarta.activation:jakarta.activation-api:1.2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.assertj:assertj-core:3.16.1" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.hamcrest:hamcrest:2.2" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter:5.6.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-api:5.6.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.apiguardian:apiguardian-api:1.1.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.opentest4j:opentest4j:1.2.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-commons:1.6.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-params:5.6.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.jupiter:junit-jupiter-engine:5.6.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.junit.platform:junit-platform-engine:1.6.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-core:3.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy:1.10.18" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: net.bytebuddy:byte-buddy-agent:1.10.18" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.objenesis:objenesis:2.6" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.mockito:mockito-junit-jupiter:3.3.3" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.skyscreamer:jsonassert:1.5.0" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: com.vaadin.external.google:android-json:0.0.20131108.vaadin1" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-core:5.2.12.RELEASE" level="project" />
<orderEntry type="library" name="Maven: org.springframework:spring-jcl:5.2.12.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.springframework:spring-test:5.2.12.RELEASE" level="project" />
<orderEntry type="library" scope="TEST" name="Maven: org.xmlunit:xmlunit-core:2.7.0" level="project" />
</component>
</module>

@ -11,7 +11,7 @@
<groupId>com.kob.matchingsystem</groupId>
<artifactId>matchingsystem</artifactId>
<packaging>jar</packaging>
<properties>
<maven.compiler.source>8</maven.compiler.source>
<maven.compiler.target>8</maven.compiler.target>
@ -60,5 +60,24 @@
</exclusions>
</dependency>
</dependencies>
<!-- 新加 -->
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<!--这里写上main方法所在类的路径-->
<configuration>
<mainClass>com.kob.matchingsystem.MatchingSystemApplication</mainClass>
</configuration>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>

@ -16,7 +16,7 @@ public class SecurityConfig extends WebSecurityConfigurerAdapter {
.sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS)
.and()
.authorizeRequests()
.antMatchers("/player/add/","/player/remove/").hasIpAddress("localhost")//新加
.antMatchers("/player/add/","/player/remove/").hasIpAddress("127.0.0.1")//新加
.antMatchers(HttpMethod.OPTIONS).permitAll()
.anyRequest().authenticated();
}

@ -69,7 +69,7 @@ export default {
const refresh_bots = () => {
$.ajax({
url: "http://127.0.0.1:3000/user/bot/getlist/",
url: "https://snake.mycomputer.top/api/user/bot/getlist/",
type: "get",
headers: {
'Authorization': "Bearer " + store.state.user.token,

@ -2,7 +2,10 @@
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<router-link class='navbar-brand' :to="{name:'home'}">AI Snake</router-link>
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarText"
aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarText">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<!-- <li class="nav-item">

@ -44,7 +44,7 @@ export default {
//更新token
login(context, data) {//context value
$.ajax({
url: "http://127.0.0.1:3000/user/account/token/",
url: "https://snake.mycomputer.top/api/user/account/token/",
type: "post",
data: {
username: data.username,
@ -69,7 +69,7 @@ export default {
getinfo(context,data)
{
$.ajax({
url:"http://localhost:3000/user/account/info/",
url:"https://snake.mycomputer.top/api/user/account/info/",
type:"get",
headers:{
Authorization:"Bearer " + context.state.token ,

@ -2,6 +2,8 @@
<PlayGround v-if="$store.state.pk.status === 'playing'"></PlayGround>
<MatchGround v-if="$store.state.pk.status === 'matching'"></MatchGround>
<ResultBoard v-if="$store.state.pk.loser != 'none'"/>
<div class="user-color" v-if="$store.state.pk.status === 'playing' && parseInt($store.state.user.id) === parseInt($store.state.pk.a_id)"></div>
<div class="user-color" v-if="$store.state.pk.status === 'playing' && parseInt($store.state.user.id) === parseInt($store.state.pk.b_id)"></div>
</template>
<script>
@ -22,7 +24,7 @@ export default {
setup(){
const store = useStore();
const socketUrl = `ws://127.0.0.1:3000/websocket/${store.state.user.token}/`;
const socketUrl = `wss://snake.mycomputer.top/websocket/${store.state.user.token}/`;
let socket = null;
store.commit("updateLoser","none");
@ -100,6 +102,11 @@ export default {
</script>
<style>
<style scoped>
div.user-color {
text-align: center;
color: white;
font-size: 30px;
font-weight: 600;
}
</style>

@ -92,7 +92,7 @@ export default {
const pull_page = page =>{
current_page = page ;
$.ajax({
url:"http://127.0.0.1:3000/ranklist/getlist/",
url:"https://snake.mycomputer.top/api/ranklist/getlist/",
type:"get",
data:{
page:page,

@ -108,7 +108,7 @@ export default {
console.log(total_records,current_page);
current_page = page ;
$.ajax({
url:"http://127.0.0.1:3000/record/getlist/",
url:"https://snake.mycomputer.top/api/record/getlist/",
type:"get",
data:{
page:page,

@ -43,7 +43,7 @@ export default {
const register = () =>{
$.ajax({
url:"http://localhost:3000/user/account/register/",
url:"https://snake.mycomputer.top/api/user/account/register/",
type:"post",
data:{
//500

@ -1,932 +0,0 @@
// const add_bot = () =>{
// botadd.error_message="",
// $.ajax({
// url:"http://localhost:3000/user/bot/add/",
// type: "POST",
// data:{
// title:botadd.title,
// description:botadd.description,
// content:botadd.content,
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// if(resp.error_message === "success"){
// botadd.title = "",
// botadd.description = "",
// botadd.content = "",
// Modal.getInstance("#add-bot-btn").hide();
// refresh_bots();
// } else {
// botadd.error_message = resp.error_message;
// }
// }
// })
// }
return {
bots,
botadd,
add_bot,
}
// //bot add
// $.ajax({
// url:"http://localhost:3000/user/bot/add/",
// type:"post",
// data:{
// title:"My title ",
// description:"My description ",
// content:"My content ",
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// console.log(resp);
// },
// errror(resp){
// console.log(resp);
// }
// });
// //bot remove
// $.ajax({
// url:"http://localhost:3000/user/bot/remove/",
// type:"post",
// data:{
// bot_id : 5,
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// console.log(resp);
// },
// errror(resp){
// console.log(resp);
// }
// });
// //bot update
// $.ajax({
// url:"http://localhost:3000/user/bot/update/",
// type:"post",
// data:{
// bot_id : 8,
// title:"new title",
// description:"new description",
// content:"new content",
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// console.log(resp);
// },
// errror(resp){
// console.log(resp);
// }
// });
<template>
<div class="container">
<div class="row">
<div class="col-3">
<div class="card" style="margin-top:20px;">
<div class="card-body">
<img :src="$store.state.user.photo" alt="头像无法显示~" style="width:100%; border-radius:150px">
</div>
</div>
</div>
<div class="col-9">
<div class="card" style="margin-top:20px;">
<div class="card-header">
<span style="font-size:130%">我的Bot</span>
<button type="button" class="btn btn-info float-end" data-bs-toggle="modal" data-bs-target="#add-bot-btn">创建</button>
</div>
<div class="card-body">
<table class="table table-striped table-hover">
<!-- 表头 -->
<thead>
<tr>
<th>名称</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<!-- 表身 -->
<tbody>
<tr v-for="bot in bots" :key="bot.id">
<th>{{bot.title}}</th>
<th>{{bot.createtime}}</th>
<th>
<button type="button" class="btn btn-secondary">修改</button>
<button type="button" class="btn btn-danger" style="margin-left:20px">删除</button>
</th>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
<!-- Modal -->
<div class="modal fade" id="add-bot-btn" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title" id="exampleModalLabel">创建Bot</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="add-bot-title" class="form-label">名称</label>
<input v-model="botadd.title" type="text" class="form-control" id="add-bot-title" placeholder="请输入Bot名称">
</div>
<div class="mb-3">
<label for="add-bot-description" class="form-label">简介</label>
<textarea v-model="botadd.description" type="text" class="form-control" id="add-bot-description" rows="3" placeholder="请输入Bot代码"></textarea>
</div>
<div class="mb-3">
<label for="add-bot-code" class="form-label">代码</label>
<textarea v-model="botadd.content" type="text" class="form-control" id="add-bot-code" rows="7" placeholder="请输入Bot代码"></textarea>
</div>
</div>
<div class="modal-footer">
<div class="error-message">{{botadd.error_message}}</div>
<button type="button" class="btn btn-secondary" @click="add_bot"></button>
<button type="button" class="btn btn-primary" data-bs-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
</template>
<script>
import { ref , reactive } from "vue"
import $ from "jquery"
import { useStore } from "vuex"
import { Modal } from 'bootstrap/dist/js/bootstrap'
export default {
setup(){
const store = useStore();
let bots = ref([]);
const botadd = reactive({
title:"",
description:"",
content:"",
error_message:"",
})
const refresh_bots = ( ) =>{
$.ajax({
url:"http://localhost:3000/user/bot/getlist/",
type:"get",
headers:{
Authorization:"Bearer " + store.state.user.token,
},
success(resp){
console.log(resp);
bots.value = resp ;
},
errror(resp){
console.log(resp);
}
})
}
refresh_bots();
const add_bot = () => {
botadd.error_message = "";
$.ajax({
url: "http://127.0.0.1:3000/user/bot/add/",
type: "post",
data: {
title: botadd.title,
description: botadd.description,
content: botadd.content,
},
headers: {
Authorization: "Bearer " + store.state.user.token,
},
success(resp) {
if (resp.error_message === "success") {
botadd.title = "";
botadd.description = "";
botadd.content = "";
Modal.getInstance("#add-bot-btn").hide();
refresh_bots();
} else {
botadd.error_message = resp.error_message;
}
}
})
}
// const add_bot = () =>{
// botadd.error_message="",
// $.ajax({
// url:"http://localhost:3000/user/bot/add/",
// type: "POST",
// data:{
// title:botadd.title,
// description:botadd.description,
// content:botadd.content,
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// if(resp.error_message === "success"){
// botadd.title = "",
// botadd.description = "",
// botadd.content = "",
// Modal.getInstance("#add-bot-btn").hide();
// refresh_bots();
// } else {
// botadd.error_message = resp.error_message;
// }
// }
// })
// }
return {
bots,
botadd,
add_bot,
}
// //bot add
// $.ajax({
// url:"http://localhost:3000/user/bot/add/",
// type:"post",
// data:{
// title:"My title ",
// description:"My description ",
// content:"My content ",
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// console.log(resp);
// },
// errror(resp){
// console.log(resp);
// }
// });
// //bot remove
// $.ajax({
// url:"http://localhost:3000/user/bot/remove/",
// type:"post",
// data:{
// bot_id : 5,
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// console.log(resp);
// },
// errror(resp){
// console.log(resp);
// }
// });
// //bot update
// $.ajax({
// url:"http://localhost:3000/user/bot/update/",
// type:"post",
// data:{
// bot_id : 8,
// title:"new title",
// description:"new description",
// content:"new content",
// },
// headers:{
// Authorization:"Bearer " + store.state.user.token,
// },
// success(resp){
// console.log(resp);
// },
// errror(resp){
// console.log(resp);
// }
// });
}
}
</script>
<style scoped>
div.error-message {
color: red;
}
</style>
<template>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<router-link class='navbar-brand' :to="{name:'home'}">King Of Bots</router-link>
<!-- <a class="navbar-brand" href="#">King Of Bots</a> -->
<button class="navbar-toggler" type="button" data-bs-toggle="collapse" data-bs-target="#navbarText" aria-controls="navbarText" aria-expanded="false" aria-label="Toggle navigation">
<span class="navbar-toggler-icon"></span>
</button>
<div class="collapse navbar-collapse" id="navbarText">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<!-- <a class="nav-link active" aria-current="page" href="/pk/">对战</a> -->
<!-- router-link单页面 -->
<router-link :class="route_name == 'pk_index' ? 'nav-link active' : 'nav-link' " :to="{name:'pk_index'}">PK</router-link>
</li>
<li class="nav-item">
<!-- <a class="nav-link" href="/record/">对局列表</a> -->
<router-link :class="route_name == 'record_index' ? 'nav-link active' : 'nav-link' " :to="{name:'record_index'}">对局列表</router-link>
</li>
<li class="nav-item">
<!-- <a class="nav-link" href="/ranklist/">排行榜</a> -->
<router-link :class="route_name == 'ranklist_index' ? 'nav-link active' : 'nav-link' " :to="{name:'ranklist_index'}">排行榜</router-link>
</li>
</ul>
<ul class="navbar-nav" v-if="$store.state.user.is_login">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
{{$store.state.user.username}}
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown" style="margin:0">
<router-link class="dropdown-item" :to="{name:'user_bot_index'}">我的Bots</router-link>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" @click="logout" href="#">退出</a></li>
</ul>
</li>
</ul>
<ul class="navbar-nav" v-else-if="!$store.state.user.pulling_info">
<li class="nav-item">
<router-link class="nav-link" :to="{name:'user_account_login'}" role="button" aria-expanded="false">
登录
</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link" :to="{name:'user_account_register'}" role="button" aria-expanded="false">
注册
</router-link>
</li>
</ul>
</div>
</div>
</nav>
</template>
<script>
// {}
import { useRoute } from "vue-router";
import { computed } from "vue";
import { useStore } from "vuex";
export default {
setup(){
const route = useRoute();
const store = useStore();
//
let route_name = computed( () => route.name );
const logout = () => {
store.dispatch("logout");
}
return {
route_name,
logout,
}
}
}
</script>
<style scoped>
</style>
<template>
<div class="container">
<div class="row">
<div class="col-3">
<div class="card" style="margin-top:20px;">
<div class="card-body">
<img :src="$store.state.user.photo" alt="头像无法显示~" style="width:100%;">
</div>
</div>
</div>
<div class="col-9">
<div class="card" style="margin-top:20px;">
<div class="card-header">
<span style="font-size:130%">我的Bot</span>
<button type="button" class="btn btn-info float-end" data-bs-toggle="modal" data-bs-target="#add-bot-btn">创建</button>
<!-- Modal -->
<!-- aria-labelledby="exampleModalLabel" aria-hidden="true" -->
<div class="modal fade" id="add-bot-btn" tabindex="-1">
<div class="modal-dialog modal-xl">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">创建Bot</h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<div class="mb-3">
<label for="add-bot-title" class="form-label">名称</label>
<input v-model="botadd.title" type="text" class="form-control" id="add-bot-title" placeholder="请输入Bot名称">
</div>
<div class="mb-3">
<label for="add-bot-description" class="form-label">简介</label>
<textarea v-model="botadd.description" class="form-control" rows="3" id="add-bot-description" placeholder="请输入Bot简介"></textarea>
</div>
<div class="mb-3">
<label for="add-bot-code" class="form-label">代码</label>
<textarea v-model="botadd.content" class="form-control" rows="7" id="add-bot-code" placeholder="请输入Bot代码"></textarea>
</div>
</div>
<div class="modal-footer">
<div class="error-message">{{botadd.error_message}}</div>
<button type="button" class="btn btn-primary" @click="add_bot"></button>
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
</div>
</div>
</div>
</div>
</div>
<div class="card-body">
<table class="table table-striped table-hover">
<!-- 表头 -->
<thead>
<tr>
<th>名称</th>
<th>创建时间</th>
<th>操作</th>
</tr>
</thead>
<!-- 表身 -->
<tbody>
<tr v-for="bot in bots" :key="bot.id">
<th>{{bot.title}}</th>
<th>{{bot.createtime}}</th>
<th>
<button type="button" class="btn btn-secondary" style="margin-right:10px">修改</button>
<button type="button" class="btn btn-danger" >删除</button>
</th>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
</div>
</template>
<script>
import { ref , reactive } from "vue"
import $ from "jquery"
import { useStore } from "vuex"
import { Modal } from "bootstrap/dist/js/bootstrap.js"
export default {
setup(){
const store = useStore();
let bots = ref([]);
const botadd = reactive({
title:"",
description:"",
content:"",
error_message:"",
})
const refresh_bots = () =>{
$.ajax({
url:"http://localhost:3000/user/bot/getlist/",
type:"get",
headers:{
Authorization:"Bearer " + store.state.user.token,
},
success(resp){
bots.value = resp ;
}
})
}
refresh_bots();
const add_bot = () => {
botadd.error_message = "";
$.ajax({
url: "http://127.0.0.1:3000/user/bot/add/",
type: "post",
data: {
title: botadd.title,
description: botadd.description,
content: botadd.content,
},
headers: {
Authorization: "Bearer " + store.state.user.token,
},
success(resp) {
if (resp.error_message === "success") {
botadd.title = "";
botadd.description = "";
botadd.content = "";
Modal.getInstance("#add-bot-btn").hide();
refresh_bots();
} else {
botadd.error_message = resp.error_message;
}
}
})
}
return {
bots,
botadd,
add_bot,
}
}
}
</script>
<style scoped>
div.error-message {
color: red;
}
</style>
<template>
<nav class="navbar navbar-expand-lg navbar-dark bg-dark">
<div class="container">
<router-link class='navbar-brand' :to="{name:'home'}">King Of Bots</router-link>
<div class="collapse navbar-collapse" id="navbarText">
<ul class="navbar-nav me-auto mb-2 mb-lg-0">
<li class="nav-item">
<!-- router-link单页面 -->
<router-link :class="route_name == 'pk_index' ? 'nav-link active' : 'nav-link' " :to="{name:'pk_index'}">PK</router-link>
</li>
<li class="nav-item">
<router-link :class="route_name == 'record_index' ? 'nav-link active' : 'nav-link' " :to="{name:'record_index'}">对局列表</router-link>
</li>
<li class="nav-item">
<router-link :class="route_name == 'ranklist_index' ? 'nav-link active' : 'nav-link' " :to="{name:'ranklist_index'}">排行榜</router-link>
</li>
</ul>
<ul class="navbar-nav" v-if="$store.state.user.is_login">
<li class="nav-item dropdown">
<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-bs-toggle="dropdown" aria-expanded="false">
{{$store.state.user.username}}
</a>
<ul class="dropdown-menu" aria-labelledby="navbarDropdown" style="margin:0">
<li>
<router-link class="dropdown-item" :to="{name:'user_bot_index'}">我的Bots</router-link>
</li>
<li><hr class="dropdown-divider"></li>
<li><a class="dropdown-item" @click="logout" href="#">退出</a></li>
</ul>
</li>
</ul>
<ul class="navbar-nav" v-else-if="!$store.state.user.pulling_info">
<li class="nav-item">
<router-link class="nav-link" :to="{name:'user_account_login'}" role="button">
登录
</router-link>
</li>
<li class="nav-item">
<router-link class="nav-link" :to="{name:'user_account_register'}" role="button">
注册
</router-link>
</li>
</ul>
</div>
</div>
</nav>
</template>
<script>
// {}
import { useRoute } from "vue-router";
import { computed } from "vue";
import { useStore } from "vuex";
export default {
setup(){
const route = useRoute();
const store = useStore();
//
let route_name = computed( () => route.name );
const logout = () => {
store.dispatch("logout");
}
return {
route_name,
logout,
}
}
}
</script>
<style scoped>
</style>
<template>
<NavBar/>
<router-view/>
</template>
<script>
import NavBar from './components/NavBar.vue';
import "bootstrap/dist/css/bootstrap.min.css";
import "bootstrap/dist/js/bootstrap.min.js";
export default {
components: { NavBar },
name:"app",
}
</script>
<style>
body {
background-image: url("@/assets/images/background.png");
background-size: cover;
}
</style>
// false
const g=[]
for(let r=0;r<this.rows;r++)
{
g[r]=[];
for(let c=0;c<this.cols;c++)
{
g[r][c]=false;
}
}
// g
//
for(let r=0;r<this.rows;r++){
g[r][0]=g[r][this.cols-1]=true;
}
//
for(let c=0;c<this.rows;c++){
g[0][c]=g[this.rows-1][c]=true;
}
//
for(let i=0;i<this.inner_walls_count/2;i++)
{
for(let j=0;j<=10000;j++)
{
let r = parseInt(Math.random()*this.rows);
let c = parseInt(Math.random()*this.cols);
// console.log(r,c);
//
if(g[r][c]||g[this.rows-1-r][this.cols-1-c])continue;//
if(r==this.rows-2 && c==1||r==1&&c==this.cols-2)continue;//
g[r][c]=g[this.rows-1-r][this.cols-1-c]=true;//
break; //
}
}
//
const copy_g = JSON.parse(JSON.stringify(g));
if(!this.check_connectivity(copy_g,this.rows-2,1,1,this.cols-2)) return false;//

@ -160,7 +160,7 @@ export default {
//bot
const refresh_bots = () =>{
$.ajax({
url:"http://localhost:3000/user/bot/getlist/",
url:"https://snake.mycomputer.top/api/user/bot/getlist/",
type:"get",
headers:{
Authorization:"Bearer " + store.state.user.token,
@ -177,7 +177,7 @@ export default {
const add_bot = () => {
botadd.error_message = "";
$.ajax({
url: "http://127.0.0.1:3000/user/bot/add/",
url: "https://snake.mycomputer.top/api/user/bot/add/",
type: "post",
data: {
title: botadd.title,
@ -204,7 +204,7 @@ export default {
//bot
const remove_bot = (bot) => {
$.ajax({
url: "http://127.0.0.1:3000/user/bot/remove/",
url: "https://snake.mycomputer.top/api/user/bot/remove/",
type: "post",
data: {
bot_id:bot.id,
@ -225,7 +225,7 @@ export default {
const update_bot = (bot) => {
bot.error_message = "";
$.ajax({
url: "http://127.0.0.1:3000/user/bot/update/",
url: "https://snake.mycomputer.top/api/user/bot/update/",
type: "post",
data: {
bot_id:bot.id,

Loading…
Cancel
Save