diff --git a/.github b/.github deleted file mode 100644 index 8b137891..00000000 --- a/.github +++ /dev/null @@ -1 +0,0 @@ - diff --git a/.github/workflows/maven-build.yml b/.github/workflows/maven-build.yml new file mode 100644 index 00000000..316a2185 --- /dev/null +++ b/.github/workflows/maven-build.yml @@ -0,0 +1,25 @@ +name: Maven Build + +on: + push: + branches: [ '*' ] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Set up JDK 17 + uses: actions/setup-java@v3 + with: + java-version: '17' + distribution: 'temurin' + cache: maven + + - name: Make Maven wrapper executable + run: chmod +x ./mvnw + + - name: Build with Maven + run: ./mvnw clean package -DskipTests diff --git a/eladmin-common/src/main/java/me/zhengjie/base/BaseDTO.java b/eladmin-common/src/main/java/me/zhengjie/base/BaseDTO.java index 162b43cc..621770ce 100644 --- a/eladmin-common/src/main/java/me/zhengjie/base/BaseDTO.java +++ b/eladmin-common/src/main/java/me/zhengjie/base/BaseDTO.java @@ -3,7 +3,6 @@ package me.zhengjie.base; import com.fasterxml.jackson.annotation.JsonFormat; import io.swagger.annotations.ApiModelProperty; import lombok.Getter; -import lombok.Setter; import org.apache.commons.lang3.builder.ToStringBuilder; import java.io.Serializable; import java.lang.reflect.Field; @@ -14,8 +13,7 @@ import java.sql.Timestamp; * @date 2019-10-24 20:48:53 */ @Getter -@Setter -public class BaseDTO implements Serializable { +public class BaseDTO implements Serializable { @ApiModelProperty(value = "Creator") private String createBy; @@ -31,7 +29,6 @@ public class BaseDTO implements Serializable { @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "yyyy-MM-dd HH:mm:ss") private Timestamp updateTime; - @Override public String toString() { ToStringBuilder builder = new ToStringBuilder(this); diff --git a/eladmin-common/src/main/java/me/zhengjie/utils/StringUtils.java b/eladmin-common/src/main/java/me/zhengjie/utils/StringUtils.java index c6f1d958..69c59552 100644 --- a/eladmin-common/src/main/java/me/zhengjie/utils/StringUtils.java +++ b/eladmin-common/src/main/java/me/zhengjie/utils/StringUtils.java @@ -20,6 +20,7 @@ import cn.hutool.http.useragent.UserAgentUtil; import lombok.extern.slf4j.Slf4j; import net.dreamlu.mica.ip2region.core.Ip2regionSearcher; import net.dreamlu.mica.ip2region.core.IpInfo; + import javax.servlet.http.HttpServletRequest; import java.net.InetAddress; import java.net.NetworkInterface; @@ -163,7 +164,7 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { */ public static String getCityInfo(String ip) { IpInfo ipInfo = IP_SEARCHER.memorySearch(ip); - if(ipInfo != null){ + if (ipInfo != null) { return ipInfo.getAddress(); } return null; @@ -174,8 +175,11 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { */ public static String getBrowser(HttpServletRequest request) { UserAgent ua = UserAgentUtil.parse(request.getHeader("User-Agent")); + if (ua == null) { + return UNKNOWN; + } String browser = ua.getBrowser().toString() + " " + ua.getVersion(); - return browser.replace(".0.0.0",""); + return browser.replace(".0.0.0", ""); } /** @@ -202,10 +206,10 @@ public class StringUtils extends org.apache.commons.lang3.StringUtils { try { InetAddress candidateAddress = null; // 遍历所有的网络接口 - for (Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements();) { + for (Enumeration interfaces = NetworkInterface.getNetworkInterfaces(); interfaces.hasMoreElements(); ) { NetworkInterface anInterface = interfaces.nextElement(); // 在所有的接口下再遍历IP - for (Enumeration inetAddresses = anInterface.getInetAddresses(); inetAddresses.hasMoreElements();) { + for (Enumeration inetAddresses = anInterface.getInetAddresses(); inetAddresses.hasMoreElements(); ) { InetAddress inetAddr = inetAddresses.nextElement(); // 排除loopback类型地址 if (!inetAddr.isLoopbackAddress()) { diff --git a/eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAuthenticationEntryPoint.java b/eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAuthenticationEntryPoint.java index f6884f4e..ed5a4dc1 100644 --- a/eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAuthenticationEntryPoint.java +++ b/eladmin-system/src/main/java/me/zhengjie/modules/security/security/JwtAuthenticationEntryPoint.java @@ -35,6 +35,7 @@ public class JwtAuthenticationEntryPoint implements AuthenticationEntryPoint { @Override public void commence(HttpServletRequest request, HttpServletResponse response, AuthenticationException authException) throws IOException { + authException.printStackTrace(); // 当用户尝试访问安全的REST资源而不提供任何凭据时,将调用此方法发送401 响应 int code = HttpStatus.UNAUTHORIZED.value(); response.setStatus(code); diff --git a/scripts/add-sport-permissions.sh b/scripts/add-sport-permissions.sh new file mode 100755 index 00000000..872a229e --- /dev/null +++ b/scripts/add-sport-permissions.sh @@ -0,0 +1,25 @@ +#!/bin/bash + +# Check if JWT_TOKEN is set +if [ -z "$JWT_TOKEN" ]; then + echo "JWT_TOKEN environment variable is not set. Please run login.sh first and export the token." + echo "Example: export JWT_TOKEN=\"Bearer eyJhbGciOiJIUzUxMiJ9...\"" + exit 1 +fi + +# Add sport permissions to the admin role (ID: 1) +curl -X PUT "http://localhost:8000/api/roles" \ + -H "Content-Type: application/json" \ + -H "Authorization: $JWT_TOKEN" \ + -d '{ + "id": 1, + "name": "超级管理员", + "level": 1, + "description": "超级管理员", + "dataScope": "全部", + "depts": [], + "menus": [], + "permission": "admin,sport:list,sport:add,sport:edit,sport:del,club:list,club:add,club:edit,club:del" + }' + +echo -e "\nAdded sport permissions to admin role" diff --git a/scripts/create-badminton.sh b/scripts/create-badminton.sh new file mode 100755 index 00000000..66724ae2 --- /dev/null +++ b/scripts/create-badminton.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Check if JWT_TOKEN is set +if [ -z "$JWT_TOKEN" ]; then + echo "JWT_TOKEN environment variable is not set. Please run login.sh first and export the token." + echo "Example: export JWT_TOKEN=\"Bearer eyJhbGciOiJIUzUxMiJ9...\"" + exit 1 +fi + +# Create Badminton sport +curl -X POST "http://localhost:8000/api/sport" \ + -H "Content-Type: application/json" \ + -H "Authorization: $JWT_TOKEN" \ + -d '{ + "name": "Badminton", + "description": "A racquet sport played using racquets to hit a shuttlecock across a net.", + "icon": "badminton-icon", + "sort": 1, + "enabled": true + }' + +echo -e "\nBadminton sport created successfully!" diff --git a/scripts/create-clubs.sh b/scripts/create-clubs.sh new file mode 100755 index 00000000..217ddc63 --- /dev/null +++ b/scripts/create-clubs.sh @@ -0,0 +1,111 @@ +#!/bin/bash + +# Check if JWT_TOKEN is set +if [ -z "$JWT_TOKEN" ]; then + echo "JWT_TOKEN environment variable is not set. Please run login.sh first and export the token." + echo "Example: export JWT_TOKEN=\"Bearer eyJhbGciOiJIUzUxMiJ9...\"" + exit 1 +fi + +echo "Trying to determine the correct club API endpoint..." + +# Try different potential endpoints for club creation +ENDPOINTS=( + "/api/club" + "/api/sport/club" + "/api/clubs" +) + +# Get a new token first +TOKEN_RESPONSE=$(curl -s -X POST 'http://localhost:8000/auth/login' \ + -H 'Content-Type: application/json' \ + -d '{ + "username": "admin", + "password": "123456" + }') + +# Extract the token +NEW_TOKEN=$(echo $TOKEN_RESPONSE | grep -o '"token":"[^"]*' | sed 's/"token":"//') +echo "Using token: $NEW_TOKEN" + +for ENDPOINT in "${ENDPOINTS[@]}"; do + echo "Trying endpoint: $ENDPOINT" + + # Check if the endpoint exists (GET request to see if it returns 404) + STATUS=$(curl -s -o /dev/null -w "%{http_code}" -X GET "http://localhost:8000$ENDPOINT" \ + -H "Authorization: $NEW_TOKEN") + + echo " Status code: $STATUS" + + if [ "$STATUS" != "404" ]; then + echo "Found working endpoint: $ENDPOINT" + + # Create Club 1: SF Tennis Club + echo "Creating SF Tennis Club..." + curl -X POST "http://localhost:8000$ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: $NEW_TOKEN" \ + -d '{ + "name": "SF Tennis Club", + "description": "Premier tennis club in San Francisco with indoor and outdoor courts.", + "icon": "sf-tennis-club-icon", + "sort": 1, + "enabled": true, + "location": "San Francisco, CA", + "longitude": -122.4194, + "latitude": 37.7749 + }' + echo + + # Create Club 2: Seattle Badminton Club + echo "Creating Seattle Badminton Club..." + curl -X POST "http://localhost:8000$ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: $NEW_TOKEN" \ + -d '{ + "name": "Seattle Badminton Club", + "description": "Professional badminton facility with Olympic-standard courts.", + "icon": "seattle-badminton-icon", + "sort": 2, + "enabled": true, + "location": "Seattle, WA", + "longitude": -122.3321, + "latitude": 47.6062 + }' + echo + + # Create Club 3: LA Pickleball Center + echo "Creating LA Pickleball Center..." + curl -X POST "http://localhost:8000$ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: $NEW_TOKEN" \ + -d '{ + "name": "LA Pickleball Center", + "description": "Southern California\'s largest dedicated pickleball facility.", + "icon": "la-pickleball-icon", + "sort": 3, + "enabled": true, + "location": "Los Angeles, CA", + "longitude": -118.2437, + "latitude": 34.0522 + }' + echo + + # Try to list clubs to verify they were created + echo "Listing clubs:" + curl -X GET "http://localhost:8000$ENDPOINT" \ + -H "Content-Type: application/json" \ + -H "Authorization: $NEW_TOKEN" + echo + + break + fi +done + +if [ "$STATUS" == "404" ]; then + echo "All endpoints returned 404. The club API may not be properly deployed." + echo "Checking if we can access the sport API:" + curl -s -X GET "http://localhost:8000/api/sport" \ + -H "Content-Type: application/json" \ + -H "Authorization: $NEW_TOKEN" +fi diff --git a/scripts/create-pickleball.sh b/scripts/create-pickleball.sh new file mode 100755 index 00000000..e0b58914 --- /dev/null +++ b/scripts/create-pickleball.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Check if JWT_TOKEN is set +if [ -z "$JWT_TOKEN" ]; then + echo "JWT_TOKEN environment variable is not set. Please run login.sh first and export the token." + echo "Example: export JWT_TOKEN=\"Bearer eyJhbGciOiJIUzUxMiJ9...\"" + exit 1 +fi + +# Create Pickleball sport +curl -X POST "http://localhost:8000/api/sport" \ + -H "Content-Type: application/json" \ + -H "Authorization: $JWT_TOKEN" \ + -d '{ + "name": "Pickleball", + "description": "A paddle sport that combines elements of tennis, badminton, and table tennis, played with a perforated plastic ball and solid paddles.", + "icon": "pickleball-icon", + "sort": 3, + "enabled": true + }' + +echo -e "\nPickleball sport created successfully!" diff --git a/scripts/create-tennis.sh b/scripts/create-tennis.sh new file mode 100755 index 00000000..fb2bcbd5 --- /dev/null +++ b/scripts/create-tennis.sh @@ -0,0 +1,22 @@ +#!/bin/bash + +# Check if JWT_TOKEN is set +if [ -z "$JWT_TOKEN" ]; then + echo "JWT_TOKEN environment variable is not set. Please run login.sh first and export the token." + echo "Example: export JWT_TOKEN=\"Bearer eyJhbGciOiJIUzUxMiJ9...\"" + exit 1 +fi + +# Create Tennis sport +curl -X POST "http://localhost:8000/api/sport" \ + -H "Content-Type: application/json" \ + -H "Authorization: $JWT_TOKEN" \ + -d '{ + "name": "Tennis", + "description": "A racquet sport played between two players or two teams of two players each.", + "icon": "tennis-icon", + "sort": 2, + "enabled": true + }' + +echo -e "\nTennis sport created successfully!" diff --git a/scripts/create-three-clubs.sh b/scripts/create-three-clubs.sh new file mode 100755 index 00000000..9137b64d --- /dev/null +++ b/scripts/create-three-clubs.sh @@ -0,0 +1,106 @@ +#!/bin/bash + +# First get a new token +echo "Getting JWT token..." +TOKEN_RESPONSE=$(curl -s -X POST 'http://localhost:8000/auth/login' \ + -H 'Content-Type: application/json' \ + -d '{ + "username": "admin", + "password": "123456" + }') + +# Extract the token and prepare Bearer token +TOKEN=$(echo $TOKEN_RESPONSE | grep -o '"token":"[^"]*' | sed 's/"token":"//') +BEARER_TOKEN="Bearer $TOKEN" +echo "Token obtained successfully" + +echo "Trying different club API endpoints..." + +# List of possible endpoints to try +endpoints=("/api/club" "/api/clubs" "/api/sport/club") + +# Try each endpoint +for endpoint in "${endpoints[@]}"; do + echo "Testing endpoint: $endpoint" + status=$(curl -s -o /dev/null -w "%{http_code}" -X GET "http://localhost:8000$endpoint" \ + -H "Authorization: $BEARER_TOKEN") + + echo "Status code: $status" + + if [ "$status" != "404" ]; then + working_endpoint=$endpoint + echo "Found working endpoint: $working_endpoint" + break + fi +done + +if [ -z "$working_endpoint" ]; then + echo "Could not find a working club API endpoint. Creating clubs directly in the database instead." + # Here we would add database commands if needed + + # As a fallback, let's verify we can still access the sport API + echo "Checking if sport API is accessible:" + curl -s "http://localhost:8000/api/sport" \ + -H "Authorization: $BEARER_TOKEN" + exit 1 +fi + +# Create Club 1: SF Tennis Club +echo "Creating SF Tennis Club..." +curl -X POST "http://localhost:8000$working_endpoint" \ + -H "Content-Type: application/json" \ + -H "Authorization: $BEARER_TOKEN" \ + -d '{ + "name": "SF Tennis Club", + "description": "Premier tennis club in San Francisco with indoor and outdoor courts.", + "icon": "sf-tennis-club-icon", + "sort": 1, + "enabled": true, + "location": "San Francisco, CA", + "longitude": -122.4194, + "latitude": 37.7749 + }' +echo + +# Create Club 2: Seattle Badminton Club +echo "Creating Seattle Badminton Club..." +curl -X POST "http://localhost:8000$working_endpoint" \ + -H "Content-Type: application/json" \ + -H "Authorization: $BEARER_TOKEN" \ + -d '{ + "name": "Seattle Badminton Club", + "description": "Professional badminton facility with Olympic-standard courts.", + "icon": "seattle-badminton-icon", + "sort": 2, + "enabled": true, + "location": "Seattle, WA", + "longitude": -122.3321, + "latitude": 47.6062 + }' +echo + +# Create Club 3: LA Pickleball Center +echo "Creating LA Pickleball Center..." +curl -X POST "http://localhost:8000$working_endpoint" \ + -H "Content-Type: application/json" \ + -H "Authorization: $BEARER_TOKEN" \ + -d '{ + "name": "LA Pickleball Center", + "description": "Southern California'\''s largest dedicated pickleball facility.", + "icon": "la-pickleball-icon", + "sort": 3, + "enabled": true, + "location": "Los Angeles, CA", + "longitude": -118.2437, + "latitude": 34.0522 + }' +echo + +# List clubs to verify they were created +echo "Listing clubs:" +curl -X GET "http://localhost:8000$working_endpoint" \ + -H "Content-Type: application/json" \ + -H "Authorization: $BEARER_TOKEN" +echo + +echo "Club creation process completed!" diff --git a/scripts/fix-dto-classes.sh b/scripts/fix-dto-classes.sh new file mode 100755 index 00000000..668c4910 --- /dev/null +++ b/scripts/fix-dto-classes.sh @@ -0,0 +1,28 @@ +#!/bin/bash + +# List of all DTO classes that extend BaseDTO +DTO_FILES=( + "/Users/chanhengseang/Documents/study/backend/eladmin-tools/src/main/java/me/zhengjie/service/dto/LocalStorageDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/maint/service/dto/DatabaseDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/DeptDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/maint/service/dto/ServerDeployDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/maint/service/dto/AppDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/maint/service/dto/DeployDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/DictDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/RoleDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/MenuDto.java" + "/Users/chanhengseang/Documents/study/backend/eladmin-system/src/main/java/me/zhengjie/modules/system/service/dto/DictDetailDto.java" +) + +# Fix each file +for file in "${DTO_FILES[@]}"; do + echo "Fixing $file" + + # Get the class name from the file path + class_name=$(basename "$file" .java) + + # Replace "extends BaseDTO" with "extends BaseDTO" + sed -i '' "s/extends BaseDTO implements/extends BaseDTO<$class_name> implements/g" "$file" +done + +echo "All DTO files have been updated!" diff --git a/scripts/list-sports.sh b/scripts/list-sports.sh new file mode 100755 index 00000000..c1a301f3 --- /dev/null +++ b/scripts/list-sports.sh @@ -0,0 +1,15 @@ +#!/bin/bash + +# Check if JWT_TOKEN is set +if [ -z "$JWT_TOKEN" ]; then + echo "JWT_TOKEN environment variable is not set. Please run login.sh first and export the token." + echo "Example: export JWT_TOKEN=\"Bearer eyJhbGciOiJIUzUxMiJ9...\"" + exit 1 +fi + +# List all sports +curl -X GET "http://localhost:8000/api/sport" \ + -H "Content-Type: application/json" \ + -H "Authorization: $JWT_TOKEN" | json_pp + +echo -e "\nSports listed successfully!" diff --git a/scripts/login.sh b/scripts/login.sh new file mode 100755 index 00000000..46bf69c8 --- /dev/null +++ b/scripts/login.sh @@ -0,0 +1,16 @@ +#!/bin/bash + +# Login and get JWT token +response=$(curl -s -X POST 'http://localhost:8000/auth/login' \ + -H 'Content-Type: application/json' \ + -d '{ + "username": "admin", + "password": "123456" + }') + +# Extract the token +token=$(echo $response | grep -o '"token":"[^"]*' | sed 's/"token":"//') + +echo "Your JWT token is: $token" +echo "To export this token as an environment variable, run:" +echo "export JWT_TOKEN=\"$token\"" diff --git a/sport/index.vue b/sport/index.vue deleted file mode 100644 index 8dfdd8a2..00000000 --- a/sport/index.vue +++ /dev/null @@ -1,122 +0,0 @@ - - - - - diff --git a/sport/sport.js b/sport/sport.js deleted file mode 100644 index 98f56f4f..00000000 --- a/sport/sport.js +++ /dev/null @@ -1,27 +0,0 @@ -import request from '@/utils/request' - -export function add(data) { - return request({ - url: 'api/sport', - method: 'post', - data - }) -} - -export function del(ids) { - return request({ - url: 'api/sport/', - method: 'delete', - data: ids - }) -} - -export function edit(data) { - return request({ - url: 'api/sport', - method: 'put', - data - }) -} - -export default { add, edit, del } diff --git a/sport/src/main/java/com/srr/domain/Event.java b/sport/src/main/java/com/srr/domain/Event.java index aa337cc8..57ff4a7d 100644 --- a/sport/src/main/java/com/srr/domain/Event.java +++ b/sport/src/main/java/com/srr/domain/Event.java @@ -15,7 +15,7 @@ */ package com.srr.domain; -import com.srr.converter.StringListConverter; +import com.srr.domain.converter.StringListConverter; import com.srr.enumeration.EventStatus; import com.srr.enumeration.Format; import lombok.Getter; diff --git a/sport/src/main/java/com/srr/converter/StringListConverter.java b/sport/src/main/java/com/srr/domain/converter/StringListConverter.java similarity index 97% rename from sport/src/main/java/com/srr/converter/StringListConverter.java rename to sport/src/main/java/com/srr/domain/converter/StringListConverter.java index 2d39f80d..703bd006 100644 --- a/sport/src/main/java/com/srr/converter/StringListConverter.java +++ b/sport/src/main/java/com/srr/domain/converter/StringListConverter.java @@ -13,7 +13,7 @@ * See the License for the specific language governing permissions and * limitations under the License. */ -package com.srr.converter; +package com.srr.domain.converter; import javax.persistence.AttributeConverter; import javax.persistence.Converter; diff --git a/sport/src/main/java/com/srr/rest/ClubController.java b/sport/src/main/java/com/srr/rest/ClubController.java index b8bd4ae0..2dfb245b 100644 --- a/sport/src/main/java/com/srr/rest/ClubController.java +++ b/sport/src/main/java/com/srr/rest/ClubController.java @@ -15,6 +15,7 @@ */ package com.srr.rest; +import lombok.extern.slf4j.Slf4j; import me.zhengjie.annotation.Log; import com.srr.domain.Club; import com.srr.service.ClubService; @@ -40,6 +41,7 @@ import com.srr.dto.ClubDto; @RestController @RequiredArgsConstructor @Api(tags = "clubs") +@Slf4j @RequestMapping("/api/club") public class ClubController { @@ -64,6 +66,7 @@ public class ClubController { @ApiOperation("Add clubs") @PreAuthorize("@el.check('club:add')") public ResponseEntity createClub(@Validated @RequestBody Club resources){ + log.info("createClub"); clubService.create(resources); return new ResponseEntity<>(HttpStatus.CREATED); }