diff --git a/.env.example b/.env.example index 9bb1bd7..35612ec 100755 --- a/.env.example +++ b/.env.example @@ -17,6 +17,10 @@ DB_PASSWORD= BROADCAST_DRIVER=log CACHE_DRIVER=file +SWAGGER_ENABLED=false +ADMIN_SMS_CACHE_STORE=redis +# Empty allows all source IPs; configure office/VPN egress IPs to restrict production access. +ADMIN_SMS_ALLOWED_IPS= FILESYSTEM_DISK=local QUEUE_CONNECTION=sync SESSION_DRIVER=file diff --git a/app/Console/Commands/RevokeAdminTokens.php b/app/Console/Commands/RevokeAdminTokens.php new file mode 100644 index 0000000..4635971 --- /dev/null +++ b/app/Console/Commands/RevokeAdminTokens.php @@ -0,0 +1,25 @@ +chunkById(100, function ($admins) use (&$count) { + foreach ($admins as $admin) { + $count += $admin->tokens()->delete(); + } + }); + + $this->info("Revoked {$count} administrator token(s)."); + return self::SUCCESS; + } +} diff --git a/app/Http/Controllers/Admin/AuthController.php b/app/Http/Controllers/Admin/AuthController.php index 43be554..579ad0a 100755 --- a/app/Http/Controllers/Admin/AuthController.php +++ b/app/Http/Controllers/Admin/AuthController.php @@ -12,7 +12,8 @@ use App\Models\Config; use App\Models\OperateLog; use App\Models\Permission; use App\Models\RoleHasPermission; -use Illuminate\Support\Facades\Cache; +use App\Services\AdminSmsChallengeService; +use Illuminate\Support\Facades\Log; use Illuminate\Support\Facades\Validator; class AuthController extends Controller @@ -164,14 +165,17 @@ class AuthController extends Controller } /** - * @OA\Get( + * @OA\Post( * path="/api/admin/auth/sms-login", * tags={"后台管理"}, * summary="验证码登陆", * description="", - * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"), - * @OA\Parameter(name="code", in="query", @OA\Schema(type="string"), required=true, description="验证码"), - * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\RequestBody(required=true, @OA\JsonContent( + * required={"mobile", "code", "challenge_id"}, + * @OA\Property(property="mobile", type="string", example="13800138000"), + * @OA\Property(property="code", type="string", example="123456"), + * @OA\Property(property="challenge_id", type="string", format="uuid") + * )), * @OA\Response( * response="200", * description="" @@ -180,27 +184,31 @@ class AuthController extends Controller */ public function smsLogin() { - $all = \request()->all(); + $all = request()->all(); $messages = [ 'mobile.required' => '手机号必填', - 'mobile.numeric' => '手机号格式错误', - 'code' => '验证码必填', + 'mobile.digits' => '手机号格式错误', + 'code.digits' => '验证码格式错误', ]; $validator = Validator::make($all, [ - 'mobile' => 'required|numeric', - 'code' => 'required', + 'mobile' => 'required|digits:11', + 'code' => 'required|digits:6', + 'challenge_id' => 'required|uuid', ], $messages); if ($validator->fails()) { return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $key = 'sms_admin_' . $all['mobile']; - $check = Cache::get($key); - if (empty($check)) return $this->fail([ResponseCode::ERROR_BUSINESS, '请先发送验证码']); - if ($check['code'] != $all['code']) return $this->fail([ResponseCode::ERROR_BUSINESS, '验证码错误']); - // 判断手机号是否存在 $admin = Admin::where('mobile', $all['mobile'])->first(); - if (empty($admin)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '用户不存在']); + $result = app(AdminSmsChallengeService::class)->verify( + $all['challenge_id'], + $all['mobile'], + $all['code'], + request()->ip(), + $admin, + (string) request()->userAgent() + ); + if (!$result['ok']) { + return $this->fail([ResponseCode::ERROR_BUSINESS, $result['message']]); } $token = $admin->createToken("token")->plainTextToken; // 加日志 @@ -209,13 +217,15 @@ class AuthController extends Controller } /** - * @OA\Get ( + * @OA\Post( * path="/api/admin/auth/send-sms", * tags={"后台管理"}, * summary="短信发送", * description="", - * @OA\Parameter(name="mobile", in="query", @OA\Schema(type="string"), required=true, description="手机号"), - * @OA\Parameter(name="token", in="query", @OA\Schema(type="string"), required=true, description="token"), + * @OA\RequestBody(required=true, @OA\JsonContent( + * required={"mobile"}, + * @OA\Property(property="mobile", type="string", example="13800138000") + * )), * @OA\Response( * response="200", * description="" @@ -224,37 +234,44 @@ class AuthController extends Controller */ public function sendSms() { - $all = \request()->all(); + $all = request()->all(); $messages = [ 'mobile.required' => '手机号必填', - 'mobile.numeric' => '手机号格式错误', + 'mobile.digits' => '手机号格式错误', ]; $validator = Validator::make($all, [ - 'mobile' => 'required|numeric', + 'mobile' => 'required|digits:11', ], $messages); if ($validator->fails()) { return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, implode(',', $validator->errors()->all())]); } - $key = 'sms_admin_' . $all['mobile']; - $check = Cache::get($key); - if (isset($check) && time() - $check['time'] <= 60) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '请勿频繁发送']); - } - // 用户检测 + $service = app(AdminSmsChallengeService::class); + $canSend = $service->canSend($all['mobile'], request()->ip()); $admin = Admin::where('mobile', $all['mobile'])->first(); - if (empty($admin)) { - return $this->fail([ResponseCode::ERROR_BUSINESS, '用户不存在']); - } - $code = rand(1000, 9999); - $smsSign = Config::getValueByKey('sms_sign'); - $content = "{$smsSign}验证码{$code},您正在登陆苏州科技商学院信息化系统,请在5分钟内完成验证。"; - $result = ymSms($all['mobile'], $content); - if ($result) { - // 缓存 - Cache::put($key, ['code' => $code, 'time' => time()], 300); - return $this->success("发送成功"); + $challengeId = null; + + if ($canSend && $admin) { + $smsSign = Config::getValueByKey('sms_sign'); + $challengeId = $service->issueChallenge($all['mobile'], request()->ip(), function ($code) use ($all, $smsSign) { + $content = "{$smsSign}验证码{$code},您正在登陆苏州科技商学院信息化系统,请在5分钟内完成验证。"; + try { + return (bool) ymSms($all['mobile'], $content); + } catch (\Throwable $e) { + // Do not expose provider/network errors or the mobile number to the client. + Log::error('admin_sms_provider_error', [ + 'mobile_hash' => hash('sha256', (string) $all['mobile']), + 'exception' => get_class($e), + ]); + return false; + } + }, (string) request()->userAgent()); } - return $this->fail([StarterResponseCode::START_ERROR_PARAMETER, "发送失败"]); + + // Always return the same shape, including for unknown or throttled numbers. + return $this->success([ + 'message' => '如果手机号已登记,验证码将发送', + 'challenge_id' => $challengeId ?: $service->issueDecoyChallenge($all['mobile'], request()->ip(), (string) request()->userAgent()), + ]); } diff --git a/app/Http/Controllers/Controller.php b/app/Http/Controllers/Controller.php index f9930e1..0c3b52b 100755 --- a/app/Http/Controllers/Controller.php +++ b/app/Http/Controllers/Controller.php @@ -9,7 +9,7 @@ use Illuminate\Foundation\Validation\ValidatesRequests; use Illuminate\Routing\Controller as BaseController; use OpenApi\Attributes as OA; -define('APP_NAME', env("APP_NAME")); +define('APP_NAME', env("APP_NAME", 'Application API')); #[OA\Info(title: APP_NAME, version: "1.0")] class Controller extends BaseController diff --git a/app/Http/Controllers/SwaggerController.php b/app/Http/Controllers/SwaggerController.php index 5d623ee..eb1d8ab 100755 --- a/app/Http/Controllers/SwaggerController.php +++ b/app/Http/Controllers/SwaggerController.php @@ -9,9 +9,11 @@ class SwaggerController extends Controller */ public function getJSON() { - if(config('app.debug')){ - $swagger = \OpenApi\Generator::scan([app_path('Http/Controllers/')]); - return response()->json($swagger, 200); + if (!config('app.debug') || !config('app.swagger_enabled') || app()->environment('production')) { + abort(404); } + + $swagger = \OpenApi\Generator::scan([app_path('Http/Controllers/')]); + return response()->json($swagger, 200); } } diff --git a/app/Http/Kernel.php b/app/Http/Kernel.php index f1f3cd5..db0e032 100755 --- a/app/Http/Kernel.php +++ b/app/Http/Kernel.php @@ -4,6 +4,7 @@ namespace App\Http; use App\Http\Middleware\Rbac; use App\Http\Middleware\SanctumJWT; +use App\Http\Middleware\SwaggerAccess; use Illuminate\Foundation\Http\Kernel as HttpKernel; class Kernel extends HttpKernel @@ -67,5 +68,6 @@ class Kernel extends HttpKernel 'verified' => \Illuminate\Auth\Middleware\EnsureEmailIsVerified::class, 'sanctum.jwt' => SanctumJWT::class, 'rbac' => Rbac::class, + 'swagger.access' => SwaggerAccess::class, ]; } diff --git a/app/Http/Middleware/SwaggerAccess.php b/app/Http/Middleware/SwaggerAccess.php new file mode 100644 index 0000000..4c27a9c --- /dev/null +++ b/app/Http/Middleware/SwaggerAccess.php @@ -0,0 +1,19 @@ +environment('production')) { + abort(404); + } + + return $next($request); + } +} diff --git a/app/Services/AdminSmsChallengeService.php b/app/Services/AdminSmsChallengeService.php new file mode 100644 index 0000000..91afe3b --- /dev/null +++ b/app/Services/AdminSmsChallengeService.php @@ -0,0 +1,259 @@ +isIpAllowed($ip)) { + Log::warning('admin_sms_send_blocked', [ + 'mobile_hash' => $this->hashValue($mobile), + 'ip_hash' => $this->hashValue($ip), + 'reason' => 'ip_not_allowed', + ]); + return false; + } + + $mobileKey = $this->key('send', $this->hashValue($mobile)); + $minuteCount = $this->increment($mobileKey . ':minute', config('admin-sms.send_minute_window')); + $dailyCount = $this->increment($mobileKey . ':daily', config('admin-sms.send_daily_window')); + + $allowed = $minuteCount <= 1 && $dailyCount <= config('admin-sms.send_daily_limit'); + if (!$allowed) { + Log::warning('admin_sms_send_blocked', [ + 'mobile_hash' => $this->hashValue($mobile), + 'ip_hash' => $this->hashValue($ip), + 'reason' => $minuteCount > 1 ? 'minute_limit' : 'daily_limit', + ]); + } + return $allowed; + } + + public function issueChallenge(string $mobile, string $ip, callable $send, string $device = ''): ?string + { + $challengeId = (string) Str::uuid(); + $code = (string) random_int(100000, 999999); + $cache = $this->cache(); + + $challenge = [ + 'mobile_hash' => $this->hashValue($mobile), + 'ip_hash' => $this->hashValue($ip), + 'device_hash' => $this->hashValue($device), + 'scenario' => 'admin_login', + 'code_hash' => Hash::make($code), + 'created_at' => time(), + ]; + + if (!$send($code)) { + return null; + } + + $cache->put($this->challengeKey($challengeId), $challenge, config('admin-sms.challenge_ttl')); + Log::info('admin_sms_challenge_sent', [ + 'mobile_hash' => $challenge['mobile_hash'], + 'ip_hash' => $challenge['ip_hash'], + ]); + return $challengeId; + } + + public function issueDecoyChallenge(string $mobile, string $ip, string $device = ''): string + { + $challengeId = (string) Str::uuid(); + $this->cache()->put($this->challengeKey($challengeId), [ + 'mobile_hash' => $this->hashValue($mobile), + 'ip_hash' => $this->hashValue($ip), + 'device_hash' => $this->hashValue($device), + 'scenario' => 'admin_login', + 'code_hash' => Hash::make((string) random_int(100000, 999999)), + 'created_at' => time(), + 'decoy' => true, + ], config('admin-sms.challenge_ttl')); + + return $challengeId; + } + + public function verify(string $challengeId, string $mobile, string $code, string $ip, ?Admin $admin, string $device = ''): array + { + $cache = $this->cache(); + $lock = $cache->lock($this->key('lock', $challengeId), 5); + + try { + $lock->block(2); + + if (!$this->isIpAllowed($ip) || $this->isLocked($mobile, $ip, $admin)) { + Log::warning('admin_sms_login_blocked', [ + 'mobile_hash' => $this->hashValue($mobile), + 'ip_hash' => $this->hashValue($ip), + ]); + return ['ok' => false, 'locked' => true, 'message' => '登录失败次数过多,请稍后再试']; + } + + $challenge = $cache->get($this->challengeKey($challengeId)); + + if (!is_array($challenge) + || ($challenge['scenario'] ?? null) !== 'admin_login' + || !hash_equals((string) ($challenge['mobile_hash'] ?? ''), $this->hashValue($mobile)) + || !hash_equals((string) ($challenge['ip_hash'] ?? ''), $this->hashValue($ip)) + || !hash_equals((string) ($challenge['device_hash'] ?? ''), $this->hashValue($device))) { + return $this->failure($challengeId, $mobile, $ip, $admin); + } + + if (!Hash::check($code, $challenge['code_hash'] ?? '')) { + return $this->failure($challengeId, $mobile, $ip, $admin); + } + + $cache->forget($this->challengeKey($challengeId)); + $cache->forget($this->key('challenge-fail', $challengeId)); + $this->clearFailureCounters($mobile, $ip, $admin); + + if (!$admin || !empty($challenge['decoy'])) { + return ['ok' => false, 'message' => '验证码错误或已失效']; + } + + return ['ok' => true, 'admin' => $admin]; + } finally { + optional($lock)->release(); + } + } + + public function challengeKey(string $challengeId): string + { + return $this->key('challenge', $challengeId); + } + + private function failure(string $challengeId, string $mobile, string $ip, ?Admin $admin): array + { + $challengeFailures = $this->increment( + $this->key('challenge-fail', $challengeId), + config('admin-sms.challenge_ttl') + ); + $phoneFailures = $this->increment( + $this->key('phone-fail', $this->hashValue($mobile)), + config('admin-sms.phone_failure_window') + ); + $ipFailures = $this->increment( + $this->key('ip-fail', $this->hashValue($ip)), + config('admin-sms.ip_failure_window') + ); + $accountFailures = 0; + + if ($admin) { + $accountFailures = $this->increment( + $this->key('account-fail', (string) $admin->getKey()), + config('admin-sms.account_lock_seconds') + ); + if ($accountFailures >= config('admin-sms.account_max_failures')) { + $this->cache()->put( + $this->key('account-lock', (string) $admin->getKey()), + true, + config('admin-sms.account_lock_seconds') + ); + } + } + + if ($challengeFailures >= config('admin-sms.challenge_max_failures')) { + $this->cache()->forget($this->challengeKey($challengeId)); + } + + $accountLocked = $admin + ? $this->cache()->has($this->key('account-lock', (string) $admin->getKey())) + : false; + $locked = $phoneFailures >= config('admin-sms.phone_max_failures') + || $ipFailures >= config('admin-sms.ip_max_failures') + || $accountFailures >= config('admin-sms.account_max_failures') + || $accountLocked; + + $result = [ + 'ok' => false, + 'locked' => $locked, + 'message' => $locked ? '登录失败次数过多,请稍后再试' : '验证码错误或已失效', + ]; + Log::warning('admin_sms_login_failed', [ + 'challenge_hash' => hash('sha256', $challengeId), + 'mobile_hash' => $this->hashValue($mobile), + 'ip_hash' => $this->hashValue($ip), + 'locked' => $locked, + ]); + return $result; + } + + private function clearFailureCounters(string $mobile, string $ip, ?Admin $admin): void + { + $cache = $this->cache(); + $hadFailures = $cache->has($this->key('phone-fail', $this->hashValue($mobile))) + || $cache->has($this->key('ip-fail', $this->hashValue($ip))) + || ($admin && $cache->has($this->key('account-fail', (string) $admin->getKey()))); + $cache->forget($this->key('phone-fail', $this->hashValue($mobile))); + $cache->forget($this->key('ip-fail', $this->hashValue($ip))); + if ($admin) { + $cache->forget($this->key('account-fail', (string) $admin->getKey())); + $cache->forget($this->key('account-lock', (string) $admin->getKey())); + } + if ($hadFailures) { + Log::info('admin_sms_login_unlocked', [ + 'mobile_hash' => $this->hashValue($mobile), + 'ip_hash' => $this->hashValue($ip), + 'admin_id_hash' => $admin ? hash('sha256', (string) $admin->getKey()) : null, + ]); + } + } + + private function isLocked(string $mobile, string $ip, ?Admin $admin): bool + { + $cache = $this->cache(); + $phoneFailures = (int) $cache->get($this->key('phone-fail', $this->hashValue($mobile)), 0); + $ipFailures = (int) $cache->get($this->key('ip-fail', $this->hashValue($ip)), 0); + + if ($phoneFailures >= config('admin-sms.phone_max_failures') + || $ipFailures >= config('admin-sms.ip_max_failures')) { + return true; + } + + return $admin && $cache->has($this->key('account-lock', (string) $admin->getKey())); + } + + private function isIpAllowed(string $ip): bool + { + $allowed = config('admin-sms.allowed_ips', []); + if (!app()->environment('production')) { + return true; + } + + // An empty allowlist is an explicit compatibility mode: rate limiting, + // challenge binding and one-time verification still remain enabled. + if ($allowed === []) { + return true; + } + + return $ip !== '' && in_array($ip, $allowed, true); + } + + private function increment(string $key, int $ttl): int + { + $cache = $this->cache(); + $cache->add($key, 0, $ttl); + return (int) $cache->increment($key); + } + + private function cache() + { + return Cache::store(config('admin-sms.cache_store', 'redis')); + } + + private function key(string $type, string $value): string + { + return 'admin_sms_v2:' . $type . ':' . $value; + } + + private function hashValue(string $value): string + { + return hash_hmac('sha256', $value, (string) config('app.key')); + } +} diff --git a/config/admin-sms.php b/config/admin-sms.php new file mode 100644 index 0000000..680508d --- /dev/null +++ b/config/admin-sms.php @@ -0,0 +1,18 @@ + env('ADMIN_SMS_CACHE_STORE', 'redis'), + // Empty means all source IPs are allowed; configure trusted office/VPN IPs to restrict access. + 'allowed_ips' => array_values(array_filter(array_map('trim', explode(',', env('ADMIN_SMS_ALLOWED_IPS', ''))))), + 'challenge_ttl' => 300, + 'challenge_max_failures' => 5, + 'phone_failure_window' => 600, + 'phone_max_failures' => 5, + 'account_lock_seconds' => 900, + 'account_max_failures' => 5, + 'ip_failure_window' => 600, + 'ip_max_failures' => 30, + 'send_minute_window' => 60, + 'send_daily_window' => 86400, + 'send_daily_limit' => 10, +]; diff --git a/config/app.php b/config/app.php index e9b2738..9343fa8 100755 --- a/config/app.php +++ b/config/app.php @@ -54,6 +54,9 @@ return [ 'debug' => (bool)env('APP_DEBUG', false), + // Swagger is disabled by default and must be explicitly enabled outside production. + 'swagger_enabled' => (bool)env('SWAGGER_ENABLED', false), + /* |-------------------------------------------------------------------------- | Application URL diff --git a/config/l5-swagger.php b/config/l5-swagger.php index a3ce546..bf4cc38 100644 --- a/config/l5-swagger.php +++ b/config/l5-swagger.php @@ -74,7 +74,9 @@ return [ /* * Route Group options */ - 'group_options' => [], + 'group_options' => [ + 'middleware' => ['swagger.access'], + ], ], 'paths' => [ diff --git a/public/swagger/favicon-16x16.png b/resources/swagger-static/favicon-16x16.png similarity index 100% rename from public/swagger/favicon-16x16.png rename to resources/swagger-static/favicon-16x16.png diff --git a/public/swagger/favicon-32x32.png b/resources/swagger-static/favicon-32x32.png similarity index 100% rename from public/swagger/favicon-32x32.png rename to resources/swagger-static/favicon-32x32.png diff --git a/public/swagger/index.html b/resources/swagger-static/index.html similarity index 100% rename from public/swagger/index.html rename to resources/swagger-static/index.html diff --git a/public/swagger/oauth2-redirect.html b/resources/swagger-static/oauth2-redirect.html similarity index 100% rename from public/swagger/oauth2-redirect.html rename to resources/swagger-static/oauth2-redirect.html diff --git a/public/swagger/swagger-ui-bundle.js b/resources/swagger-static/swagger-ui-bundle.js similarity index 100% rename from public/swagger/swagger-ui-bundle.js rename to resources/swagger-static/swagger-ui-bundle.js diff --git a/public/swagger/swagger-ui-bundle.js.map b/resources/swagger-static/swagger-ui-bundle.js.map similarity index 100% rename from public/swagger/swagger-ui-bundle.js.map rename to resources/swagger-static/swagger-ui-bundle.js.map diff --git a/public/swagger/swagger-ui-standalone-preset.js b/resources/swagger-static/swagger-ui-standalone-preset.js similarity index 100% rename from public/swagger/swagger-ui-standalone-preset.js rename to resources/swagger-static/swagger-ui-standalone-preset.js diff --git a/public/swagger/swagger-ui-standalone-preset.js.map b/resources/swagger-static/swagger-ui-standalone-preset.js.map similarity index 100% rename from public/swagger/swagger-ui-standalone-preset.js.map rename to resources/swagger-static/swagger-ui-standalone-preset.js.map diff --git a/public/swagger/swagger-ui.css b/resources/swagger-static/swagger-ui.css similarity index 100% rename from public/swagger/swagger-ui.css rename to resources/swagger-static/swagger-ui.css diff --git a/public/swagger/swagger-ui.css.map b/resources/swagger-static/swagger-ui.css.map similarity index 100% rename from public/swagger/swagger-ui.css.map rename to resources/swagger-static/swagger-ui.css.map diff --git a/public/swagger/swagger-ui.js b/resources/swagger-static/swagger-ui.js similarity index 100% rename from public/swagger/swagger-ui.js rename to resources/swagger-static/swagger-ui.js diff --git a/public/swagger/swagger-ui.js.map b/resources/swagger-static/swagger-ui.js.map similarity index 100% rename from public/swagger/swagger-ui.js.map rename to resources/swagger-static/swagger-ui.js.map diff --git a/routes/api.php b/routes/api.php index 3de505f..efb28c6 100755 --- a/routes/api.php +++ b/routes/api.php @@ -41,8 +41,8 @@ Route::group(["namespace" => "Admin", "prefix" => "admin"], function () { Route::get('other/courses-home-export', [\App\Http\Controllers\Admin\OtherController::class, "coursesHomeExport"]); // 验证码登陆 - Route::get('auth/sms-login', [\App\Http\Controllers\Admin\AuthController::class, "smsLogin"]); - Route::get('auth/send-sms', [\App\Http\Controllers\Admin\AuthController::class, "sendSms"]); + Route::post('auth/sms-login', [\App\Http\Controllers\Admin\AuthController::class, "smsLogin"]); + Route::post('auth/send-sms', [\App\Http\Controllers\Admin\AuthController::class, "sendSms"]); Route::get('company/config', [\App\Http\Controllers\Admin\CompanyController::class, "config"]); diff --git a/routes/web.php b/routes/web.php index 7a9e6e9..46becfd 100755 --- a/routes/web.php +++ b/routes/web.php @@ -17,7 +17,7 @@ Route::get('/', function () { return redirect('/admin/index.html'); }); -Route::group(['prefix' => 'swagger'], function () { +Route::group(['prefix' => 'swagger', 'middleware' => ['swagger.access']], function () { Route::get('json', [\App\Http\Controllers\SwaggerController::class, "getJSON"]); }); diff --git a/scripts/vuln02_regression.sh b/scripts/vuln02_regression.sh new file mode 100755 index 0000000..5f9f4f8 --- /dev/null +++ b/scripts/vuln02_regression.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +BASE_URL="${BASE_URL:-https://wx.sstbc.com}" +CURL_TIMEOUT="${CURL_TIMEOUT:-20}" +CURL_RESOLVE="${CURL_RESOLVE:-}" +TMP_DIR="$(mktemp -d)" +trap 'rm -rf "$TMP_DIR"' EXIT + +CURL_ARGS=(-sS -L --max-time "$CURL_TIMEOUT") +if [[ "${CURL_INSECURE:-0}" == "1" ]]; then + CURL_ARGS+=(-k) +fi +if [[ -n "$CURL_RESOLVE" ]]; then + CURL_ARGS+=(--resolve "$CURL_RESOLVE") +fi + +paths=( + "/docs/" + "/swagger/" + "/swagger/json" + "/api/documentation" + "/docs/api-docs.json" + "/docs/api-docs.yaml" + "/swagger/index.html" + "/swagger/swagger-ui.js" + "/storage/api-docs/api-docs.json" +) + +failed=0 +for index in "${!paths[@]}"; do + path="${paths[$index]}" + body="$TMP_DIR/response-$index.body" + status="" + + if ! status="$(curl "${CURL_ARGS[@]}" -o "$body" -w '%{http_code}' "$BASE_URL$path")"; then + status="000" + fi + + if [[ "$status" != "403" && "$status" != "404" ]]; then + printf '%-38s HTTP %s FAIL\n' "$path" "$status" + failed=1 + continue + fi + + if grep -Eiq 'swagger|openapi|api-docs' "$body"; then + printf '%-38s HTTP %s DOCUMENT_CONTENT_FAIL\n' "$path" "$status" + failed=1 + continue + fi + + printf '%-38s HTTP %s PASS\n' "$path" "$status" +done + +if [[ "$failed" -ne 0 ]]; then + exit 1 +fi + +printf 'VULN02_DOCUMENTATION_EXPOSURE PASS\n' diff --git a/scripts/vuln03_regression.sh b/scripts/vuln03_regression.sh new file mode 100755 index 0000000..5a9d840 --- /dev/null +++ b/scripts/vuln03_regression.sh @@ -0,0 +1,59 @@ +#!/usr/bin/env bash +set -euo pipefail + +BASE_URL="${BASE_URL:-https://wx.sstbc.com}" +CURL_TIMEOUT="${CURL_TIMEOUT:-20}" +CURL_RESOLVE="${CURL_RESOLVE:-}" +TMP_DIR="$(mktemp -d)" +trap 'rm -rf "$TMP_DIR"' EXIT + +CURL_ARGS=(-sS -L --max-time "$CURL_TIMEOUT") +if [[ "${CURL_INSECURE:-0}" == "1" ]]; then CURL_ARGS+=(-k); fi +if [[ -n "$CURL_RESOLVE" ]]; then CURL_ARGS+=(--resolve "$CURL_RESOLVE"); fi + +request() { + local name="$1" + local method="$2" + local path="$3" + local payload="${4:-{\"mobile\":\"13800138000\",\"code\":\"1234\",\"challenge_id\":\"not-a-uuid\"}}" + local body="$TMP_DIR/$name.json" + local status + + if ! status="$(curl "${CURL_ARGS[@]}" -X "$method" -H 'Accept: application/json' -H 'Content-Type: application/json' \ + -d "$payload" \ + -o "$body" -w '%{http_code}' "$BASE_URL$path")"; then + status="000" + fi + printf '%-32s HTTP %s\n' "$name" "$status" + printf '%s\n' "$body" + printf '%s' "$status" > "$TMP_DIR/$name.status" +} + +request legacy-login GET /api/admin/auth/sms-login +request legacy-send GET /api/admin/auth/send-sms +request invalid-login POST /api/admin/auth/sms-login +request invalid-send POST /api/admin/auth/send-sms '{"mobile":"invalid"}' + +if [[ "$(cat "$TMP_DIR/legacy-login.status")" != "405" || "$(cat "$TMP_DIR/legacy-send.status")" != "405" ]]; then + printf 'LEGACY_GET_CLOSED FAIL\n' + exit 1 +fi +printf 'LEGACY_GET_CLOSED PASS\n' + +if ! grep -Eq '"errcode"[[:space:]]*:[[:space:]]*30001' "$TMP_DIR/invalid-login.json"; then + printf 'LOGIN_VALIDATION FAIL\n' + exit 1 +fi +if grep -Eiq 'access_token|token' "$TMP_DIR/invalid-login.json"; then + printf 'LOGIN_TOKEN_LEAK FAIL\n' + exit 1 +fi +printf 'LOGIN_VALIDATION PASS\n' + +if ! grep -Eq '"errcode"[[:space:]]*:[[:space:]]*30001' "$TMP_DIR/invalid-send.json"; then + printf 'SEND_VALIDATION FAIL\n' + exit 1 +fi +printf 'SEND_VALIDATION PASS\n' + +printf 'VULN03_ENDPOINT_REGRESSION PASS\n' diff --git a/storage/api-docs/api-docs.json b/storage/api-docs/api-docs.json deleted file mode 100755 index c1da69d..0000000 --- a/storage/api-docs/api-docs.json +++ /dev/null @@ -1,11817 +0,0 @@ -{ - "openapi": "3.0.0", - "info": { - "title": "Laravel", - "version": "1.0" - }, - "paths": { - "/api/admin/admin": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取后台用户", - "description": "", - "operationId": "8fd1da113086757bc0cc9672b6dbf0db", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取后台用户" - } - } - } - }, - "/api/admin/show": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取后台用户详情", - "description": "", - "operationId": "86eabe57c0f2f08613e5508af14c3863", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取后台用户" - } - } - } - }, - "/api/admin/admin/save": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "保存后台用户", - "description": "", - "operationId": "b861dab00723e315f99ad0da933b90ce", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "菜单ID,为空表示新增,不为空表示更新", - "schema": { - "type": "integer" - } - }, - { - "name": "name", - "in": "query", - "description": "名称", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "username", - "in": "query", - "description": "用户名", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "密码,新建时请前端处理为必填,修改时留空表示不修改", - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "手机号码", - "schema": { - "type": "string" - } - }, - { - "name": "department_id", - "in": "query", - "description": "所属部门ID", - "schema": { - "type": "integer" - } - }, - { - "name": "position", - "in": "query", - "description": "职位", - "schema": { - "type": "string" - } - }, - { - "name": "sortnumber", - "in": "query", - "description": "同级排序,默认为0", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "保存后台用户" - } - } - } - }, - "/api/admin/admin/delete": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "删除后台用户", - "description": "", - "operationId": "cc166224c2a6f8a3acd7a4b5198e3573", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "ID", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "删除后台用户" - } - } - } - }, - "/api/admin/admin/set-roles": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "后台用户授权", - "description": "", - "operationId": "1e31da222d2ab67e65588982390279ad", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "ID", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "role_id", - "in": "query", - "description": "角色id,数组形式", - "required": true, - "schema": { - "type": "object" - } - } - ], - "responses": { - "200": { - "description": "后台用户授权" - } - } - } - }, - "/api/admin/admin/set-roles-many": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "后台用户授权批量处理", - "description": "", - "operationId": "9d44dcbfdc79b89f2bd6845fb28bd2ee", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "ids", - "in": "query", - "description": "用户id数组", - "required": true, - "schema": { - "type": "object" - } - }, - { - "name": "role_id", - "in": "query", - "description": "角色id", - "required": true, - "schema": { - "type": "object" - } - } - ], - "responses": { - "200": { - "description": "后台用户授权" - } - } - } - }, - "/api/admin/appointment-configs/index": { - "get": { - "tags": [ - "地点配置管理" - ], - "summary": "列表", - "description": "", - "operationId": "2150f2ca8bb570e6b5da366bc041f7f2", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-configs/show": { - "get": { - "tags": [ - "地点配置管理" - ], - "summary": "详情", - "description": "", - "operationId": "e29a50d2335ed08bfeceeefd626f3e2a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-configs/save": { - "post": { - "tags": [ - "地点配置管理" - ], - "summary": "更新或新增", - "operationId": "567158a69a46c18d95f0f49a376fb163", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "配置名字", - "schema": { - "type": "string" - } - }, - { - "name": "no", - "in": "query", - "description": "编号", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "content", - "in": "query", - "description": "内容", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "total", - "in": "query", - "description": "人数", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "file_ids", - "in": "query", - "description": "文件id数组", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "status", - "in": "query", - "description": "状态-0禁用1启用", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "value", - "in": "query", - "description": "会议室id(技术人员填写)", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "room", - "in": "query", - "description": "第三方会议室信息(技术人员填写)", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "door", - "in": "query", - "description": "第三方门禁信息(技术填写)", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "use_student", - "in": "query", - "description": "是否只有学员可以预约0否1是", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "start_time", - "in": "query", - "description": "开始时间", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "end_time", - "in": "query", - "description": "结束时间", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "address", - "in": "query", - "description": "地址", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "appointment_type_id", - "in": "query", - "description": "场地类型id", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "description": "排序", - "schema": { - "type": "string", - "format": "date" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/appointment-configs/destroy": { - "get": { - "tags": [ - "地点配置管理" - ], - "summary": "删除", - "description": "", - "operationId": "99b930f43b86c9229235a619cdd4582a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-configs/excel-show": { - "post": { - "tags": [ - "地点配置管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "1d2f7f5be62c8c5f6fe192cfef917456", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-configs/import": { - "post": { - "tags": [ - "地点配置管理" - ], - "summary": "导入", - "description": "", - "operationId": "75f4a6faf26a4d061ff7ffbadd900333", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointments/index": { - "get": { - "tags": [ - "预约管理" - ], - "summary": "列表", - "description": "", - "operationId": "8bb057d0d49b85cb93488dc3842322c3", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods,thirdAppointmentLogs第三方日志记录,thirdPlateLogs第三方车牌预约记录", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "user_name", - "in": "query", - "description": "用户名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointments/show": { - "get": { - "tags": [ - "预约管理" - ], - "summary": "详情", - "description": "", - "operationId": "67ebd2358368b235c256ca7464e37145", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods,thirdAppointmentLogs第三方日志记录,thirdPlateLogs第三方车牌预约记录", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointments/save": { - "post": { - "tags": [ - "预约管理" - ], - "summary": "更新或新增", - "operationId": "879743c2b4755654fab3af74acd1bb77", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "user_id", - "in": "query", - "description": "用户id,创建时多个用户英文逗号分隔", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "date", - "in": "query", - "description": "预约日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "start_time", - "in": "query", - "description": "开始时间,例如:2023-01-01 11:11:11", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "end_time", - "in": "query", - "description": "结束时间,例如:2023-01-01 11:11:11", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "content", - "in": "query", - "description": "预约事项", - "schema": { - "type": "string" - } - }, - { - "name": "site", - "in": "query", - "description": "预约地点ID。数字1-6", - "schema": { - "type": "integer" - } - }, - { - "name": "plate", - "in": "query", - "description": "车牌号。多个英文逗号分隔", - "schema": { - "type": "string" - } - }, - { - "name": "accompany_total", - "in": "query", - "description": "陪同人数", - "schema": { - "type": "integer" - } - }, - { - "name": "status", - "in": "query", - "description": "状态 0未审核 1审核通过 2审核不通过3取消", - "schema": { - "type": "integer" - } - }, - { - "name": "reason", - "in": "query", - "description": "审核不通过原因", - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "手机号", - "schema": { - "type": "string" - } - }, - { - "name": "idcard", - "in": "query", - "description": "身份证号码", - "schema": { - "type": "string" - } - }, - { - "name": "accompany", - "in": "query", - "description": "陪同人员,二维数组,包括:name,idcard,mobile", - "schema": { - "type": "string" - } - }, - { - "name": "is_hand", - "in": "query", - "description": "是否手动预约0否1是", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/appointments/destroy": { - "get": { - "tags": [ - "预约管理" - ], - "summary": "删除", - "description": "", - "operationId": "b20d16ca7083a9d3182bccac566e8b18", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointments/excel-show": { - "post": { - "tags": [ - "预约管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "055484c0d9da4bcb227896159ced332f", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointments/import": { - "post": { - "tags": [ - "预约管理" - ], - "summary": "导入", - "description": "", - "operationId": "60b6f9a377c7ca89d4fb8cb1c5b734c0", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointments/retry-appointment": { - "get": { - "tags": [ - "预约管理" - ], - "summary": "重新发送第三方预约信息", - "description": "", - "operationId": "57354b71b14bb179a143f9bb0f1753f8", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-type/index": { - "get": { - "tags": [ - "地点类型管理" - ], - "summary": "列表", - "description": "", - "operationId": "eeb81e371c23e14993a2573bdfde5af4", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-type/show": { - "get": { - "tags": [ - "地点类型管理" - ], - "summary": "详情", - "description": "", - "operationId": "d5a7bfba32aa336a1978bea377aef1f7", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-type/save": { - "post": { - "tags": [ - "地点类型管理" - ], - "summary": "更新或新增", - "operationId": "e16600924fff505e1fb17dede09237f7", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "配置名字", - "schema": { - "type": "string" - } - }, - { - "name": "image_id", - "in": "query", - "description": "封面图id数组", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "introduce", - "in": "query", - "description": "内容", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "start_time", - "in": "query", - "description": "开始时间", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "end_time", - "in": "query", - "description": "结束时间", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "tips", - "in": "query", - "description": "预约须知", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "is_show", - "in": "query", - "description": "是否小程序显示0否1是", - "schema": { - "type": "string", - "format": "date" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/appointment-type/destroy": { - "get": { - "tags": [ - "地点类型管理" - ], - "summary": "删除", - "description": "", - "operationId": "656586563a854b6b50e62cde77ecfb27", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-type/excel-show": { - "post": { - "tags": [ - "地点类型管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "28bd549516289a214535be933ff3a6e1", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/appointment-type/import": { - "post": { - "tags": [ - "地点类型管理" - ], - "summary": "导入", - "description": "", - "operationId": "b8027714a0f1a7a3351d55732d8f99b2", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/auth/login": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "用户名密码登录", - "description": "", - "operationId": "b8098605e389c86dcb60db12b1b4dfe2", - "parameters": [ - { - "name": "username", - "in": "query", - "description": "用户名", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "密码", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "用户名密码登录" - } - } - } - }, - "/api/admin/auth/me": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "获取用户基本信息", - "description": "", - "operationId": "328064bf31986debc9b4ae90c3a4b52d", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取用户基本信息" - } - } - } - }, - "/api/admin/auth/logout": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "退出登录", - "description": "", - "operationId": "59a49d30177042d9f58b1de69afbc903", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "退出登录" - } - } - } - }, - "/api/admin/auth/permissions": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取权限菜单", - "description": "", - "operationId": "ee71984d6aee2fad6d0a4352b07e058a", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取权限菜单" - } - } - } - }, - "/api/admin/auth/sms-login": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "验证码登陆", - "description": "", - "operationId": "edb56f7b1c5eaaa28693e2ab4a8be9e4", - "parameters": [ - { - "name": "mobile", - "in": "query", - "description": "手机号", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "code", - "in": "query", - "description": "验证码", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/admin/auth/send-sms": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "短信发送", - "description": "", - "operationId": "3bd46af932e33c7b8f448151934a5329", - "parameters": [ - { - "name": "mobile", - "in": "query", - "description": "手机号", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/admin/auth-node/index": { - "get": { - "tags": [ - "权限" - ], - "summary": "列表", - "description": "", - "operationId": "ef68cfd66f342a7c4dca72f2d5b1909d", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/auth-node/store": { - "post": { - "tags": [ - "权限" - ], - "summary": "添加", - "description": "", - "operationId": "63c9fb30bb87ed88459f1556fb0a09ed", - "parameters": [ - { - "name": "tag", - "in": "query", - "description": "标示", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/auth-node/show": { - "get": { - "tags": [ - "权限" - ], - "summary": "详情", - "description": "", - "operationId": "50814a73c80d41f3673014603d642874", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/auth-node/save": { - "post": { - "tags": [ - "权限" - ], - "summary": "更新", - "description": "", - "operationId": "1a8f6d67f7c7481e583d83b2a39f8390", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "Id", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "tag", - "in": "query", - "description": "标示", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/auth-node/delete": { - "get": { - "tags": [ - "权限" - ], - "summary": "删除", - "description": "", - "operationId": "16361fae0137319c97269359264c91da", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/banners/index": { - "get": { - "tags": [ - "Banner图管理" - ], - "summary": "列表", - "description": "", - "operationId": "906c0ec359b736e3e90cf6eb23f15361", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/banners/show": { - "get": { - "tags": [ - "Banner图管理" - ], - "summary": "详情", - "description": "", - "operationId": "1ae017725b187beff165e20ec69d0990", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/banners/save": { - "post": { - "tags": [ - "Banner图管理" - ], - "summary": "更新或新增", - "operationId": "2d37e8e4dcdecdd273c12237bede971d", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名称", - "schema": { - "type": "string" - } - }, - { - "name": "image_id", - "in": "query", - "description": "图片ID", - "schema": { - "type": "integer" - } - }, - { - "name": "jump_type", - "in": "query", - "description": "跳转类型(1小程序,2H5)", - "schema": { - "type": "integer" - } - }, - { - "name": "jump_url", - "in": "query", - "description": "跳转地址", - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "description": "排序", - "schema": { - "type": "integer" - } - }, - { - "name": "position", - "in": "query", - "description": "显示位置(1首页)", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/banners/destroy": { - "get": { - "tags": [ - "Banner图管理" - ], - "summary": "删除", - "description": "", - "operationId": "57744ac92f87348e48d0cb80bae8a751", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/banners/excel-show": { - "post": { - "tags": [ - "Banner图管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "5286cae2b9b967cc099f4a533769a745", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/banners/import": { - "post": { - "tags": [ - "Banner图管理" - ], - "summary": "导入", - "description": "", - "operationId": "5e0b5004372524cd22f5a4f6c46fb233", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/{table_name}/index": { - "get": { - "tags": [ - "通用接口" - ], - "summary": "列表", - "description": "", - "operationId": "7241eaefadbac3463d3c3cea0a57e1e1", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/{table_name}/show": { - "get": { - "tags": [ - "通用接口" - ], - "summary": "详情", - "description": "", - "operationId": "3d2ed0dbfbbf20b49108beb46a707e6d", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/{table_name}/save": { - "post": { - "tags": [ - "通用接口" - ], - "summary": "更新", - "description": "", - "operationId": "55b3ba836ca415276f64a0b23539a60a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "Id(存在更新,不存在新增)", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/{table_name}/destroy": { - "get": { - "tags": [ - "通用接口" - ], - "summary": "删除", - "description": "", - "operationId": "c1888a2d9a21c1611e40c87c8e25c147", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/{table_name}/excel-show": { - "post": { - "tags": [ - "通用接口" - ], - "summary": "导入预览", - "description": "", - "operationId": "b19a44939dbcca2d2b489947d4672f80", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "统一数据键值对数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/{table_name}/import": { - "post": { - "tags": [ - "通用接口" - ], - "summary": "导入", - "description": "", - "operationId": "ec86790f4d2a2526a64b9f83ae2349b1", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/base-form/index": { - "get": { - "tags": [ - "自定义表单增删改查操作" - ], - "summary": "列表", - "description": "", - "operationId": "b4e1bb0b1ffef6488893ae2ac594be3f", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "is_auth", - "in": "query", - "description": "是否鉴权 0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,不填输出全部,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/base-form/show": { - "get": { - "tags": [ - "自定义表单增删改查操作" - ], - "summary": "详情", - "description": "", - "operationId": "8c76430d593ba0664d275c9f34da95b7", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/base-form/save": { - "post": { - "tags": [ - "自定义表单增删改查操作" - ], - "summary": "更新", - "description": "", - "operationId": "7f8d3c3203c6341ed080dd70c34056f2", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "Id(存在更新,不存在新增)", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "字段名_relation", - "in": "query", - "description": "关联表数据,二维数组。如果存在id则更新,否则新增 ", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/base-form/destroy": { - "get": { - "tags": [ - "自定义表单增删改查操作" - ], - "summary": "删除", - "description": "", - "operationId": "f87f3ec868377d10a6e090fbcbb60dd9", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "destroy_relation", - "in": "query", - "description": "需要删除的关联关系字段数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/base-form/excel-show": { - "post": { - "tags": [ - "自定义表单增删改查操作" - ], - "summary": "导入预览", - "description": "", - "operationId": "e79142dfe67152c8fa91c48e9a240649", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/base-form/import": { - "post": { - "tags": [ - "自定义表单增删改查操作" - ], - "summary": "导入", - "description": "", - "operationId": "0b83282c40a7e952aa420cefdb398e34", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/base-form/logs": { - "get": { - "tags": [ - "自定义表单增删改查操作" - ], - "summary": "更新记录", - "description": "", - "operationId": "69b6dafd72f7f5396f6a87ccb5c3b4f9", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "table_id", - "in": "query", - "description": "记录id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/configs/index": { - "get": { - "tags": [ - "配置管理" - ], - "summary": "列表", - "description": "", - "operationId": "b626aaed2b5da7076169d725e424f34e", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/configs/show": { - "get": { - "tags": [ - "配置管理" - ], - "summary": "详情", - "description": "", - "operationId": "4a0fcb73d8390abb9a050665d71bdb3a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/configs/save": { - "post": { - "tags": [ - "配置管理" - ], - "summary": "更新或新增", - "operationId": "86f4fd5633bbc06192449200685a2fcc", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "配置名字", - "schema": { - "type": "string" - } - }, - { - "name": "key", - "in": "query", - "description": "英文标识", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "value", - "in": "query", - "description": "配置值", - "schema": { - "type": "string", - "format": "date" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/configs/destroy": { - "get": { - "tags": [ - "配置管理" - ], - "summary": "删除", - "description": "", - "operationId": "c89c950110864d93af0a027394a5031e", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/configs/excel-show": { - "post": { - "tags": [ - "配置管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "c012b459fd123b084bc0357381e581b0", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/configs/import": { - "post": { - "tags": [ - "配置管理" - ], - "summary": "导入", - "description": "", - "operationId": "5e3dede7137f5bd215563f5e715cbabd", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-appointment-total/index": { - "get": { - "tags": [ - "预约次数管理" - ], - "summary": "列表", - "description": "", - "operationId": "d2feea81974074ab518b69be7247db5a", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "course_name", - "in": "query", - "description": "课程名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-appointment-total/show": { - "get": { - "tags": [ - "预约次数管理" - ], - "summary": "详情", - "description": "", - "operationId": "16ee1c22c700c721a34e4ec248454486", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-appointment-total/batch-update-total": { - "post": { - "tags": [ - "预约次数管理" - ], - "summary": "批量调整次数", - "description": "", - "operationId": "f00e69677ede4d246cb41710540363fe", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "total", - "in": "query", - "description": "次数", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-appointment-total/save": { - "post": { - "tags": [ - "预约次数管理" - ], - "summary": "更新或新增", - "operationId": "310f9c2fe52e655c06f3286b3a3abfd9", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "course_id", - "in": "query", - "description": "课程id", - "schema": { - "type": "string" - } - }, - { - "name": "user_id", - "in": "query", - "description": "用户id", - "schema": { - "type": "string" - } - }, - { - "name": "start_time", - "in": "query", - "description": "开始时间", - "schema": { - "type": "string" - } - }, - { - "name": "end_time", - "in": "query", - "description": "结束时间", - "schema": { - "type": "string" - } - }, - { - "name": "total", - "in": "query", - "description": "次数", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/course-appointment-total/destroy": { - "get": { - "tags": [ - "预约次数管理" - ], - "summary": "删除", - "description": "", - "operationId": "9705797a3221f3d163f691163d37f51e", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-contents/index": { - "get": { - "tags": [ - "排课" - ], - "summary": "列表", - "description": "", - "operationId": "968acbc628f375eaef6bc16f8b70aa23", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "file_name", - "in": "query", - "description": "导出文件名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,不填输出全部,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-contents/show": { - "get": { - "tags": [ - "排课" - ], - "summary": "详情", - "description": "", - "operationId": "961a5266eb8718e0750b4f40f5d8b597", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-contents/save": { - "post": { - "tags": [ - "排课" - ], - "summary": "更新或新增", - "operationId": "f0e2c5678be89a8e8d1c91da77545a22", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "course_id", - "in": "query", - "description": "课程ID", - "schema": { - "type": "integer" - } - }, - { - "name": "period", - "in": "query", - "description": "时段", - "schema": { - "type": "string" - } - }, - { - "name": "date", - "in": "query", - "description": "日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "teacher_id", - "in": "query", - "description": "老师ID", - "schema": { - "type": "integer" - } - }, - { - "name": "address", - "in": "query", - "description": "地址", - "schema": { - "type": "string" - } - }, - { - "name": "theme", - "in": "query", - "description": "主题", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/course-contents/destroy": { - "get": { - "tags": [ - "排课" - ], - "summary": "删除", - "description": "", - "operationId": "4656cd160a1a88cfb1cdf46c5c8ae90d", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-contents/excel-show": { - "post": { - "tags": [ - "排课" - ], - "summary": "导入预览", - "description": "", - "operationId": "ce7706493c98efe49f540fa7f8927a4a", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程ID", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-contents/import": { - "post": { - "tags": [ - "排课" - ], - "summary": "导入", - "description": "", - "operationId": "fd6618cb0b9a2cdb6e74bb3c586fd855", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/courses/index": { - "get": { - "tags": [ - "课程管理" - ], - "summary": "列表", - "description": "", - "operationId": "4c2f19a2f43cfdd34c3d5fdffb5aa201", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字。当值是sign_status是按照课程状态排序", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "has_course_forms", - "in": "query", - "description": "是否有自定义表单0否1是", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/courses/show": { - "get": { - "tags": [ - "课程管理" - ], - "summary": "详情", - "description": "", - "operationId": "a8f83f1d9be0307ffb54ea5bba848f3a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/courses/save": { - "post": { - "tags": [ - "课程管理" - ], - "summary": "更新或新增课程信息", - "description": "根据传入的id决定是更新现有课程还是新增新的课程信息。", - "operationId": "21bd2dfd26d228ef7267e9556ffe4632", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "课程名称", - "schema": { - "type": "string" - } - }, - { - "name": "start_date", - "in": "query", - "description": "开课日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "end_date", - "in": "query", - "description": "结课日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sign_start_date", - "in": "query", - "description": "报名开始日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sign_end_date", - "in": "query", - "description": "报名结束日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "type", - "in": "query", - "description": "课程类型:接口获取", - "schema": { - "type": "integer" - } - }, - { - "name": "content", - "in": "query", - "description": "课程内容", - "schema": { - "type": "string" - } - }, - { - "name": "total", - "in": "query", - "description": "开课人数", - "schema": { - "type": "integer" - } - }, - { - "name": "class", - "in": "query", - "description": "所在班级", - "schema": { - "type": "string" - } - }, - { - "name": "is_arrange", - "in": "query", - "description": "是否排课-0否1是", - "schema": { - "type": "integer" - } - }, - { - "name": "is_fee", - "in": "query", - "description": "是否缴费-0否1是", - "schema": { - "type": "integer" - } - }, - { - "name": "status", - "in": "query", - "description": "课程状态:0待发布, 1已发布", - "schema": { - "type": "integer" - } - }, - { - "name": "teacher_id", - "in": "query", - "description": "班主任ID,多个英文逗号分隔", - "schema": { - "type": "integer" - } - }, - { - "name": "publicize_content", - "in": "query", - "description": "宣传内容", - "schema": { - "type": "integer" - } - }, - { - "name": "publicize_ids", - "in": "query", - "description": "宣传内容附件id数组", - "schema": { - "type": "integer" - } - }, - { - "name": "sign_total", - "in": "query", - "description": "报名人数,默认0不限制", - "schema": { - "type": "integer" - } - }, - { - "name": "image_id", - "in": "query", - "description": "图片id", - "schema": { - "type": "integer" - } - }, - { - "name": "qun_image_id", - "in": "query", - "description": "群图片id", - "schema": { - "type": "integer" - } - }, - { - "name": "is_virtual", - "in": "query", - "description": "是否虚拟课程0否1是", - "schema": { - "type": "integer" - } - }, - { - "name": "course_content_status", - "in": "query", - "description": "课表状态:0未发布, 1已发布", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/courses/destroy": { - "get": { - "tags": [ - "课程管理" - ], - "summary": "删除", - "description": "", - "operationId": "57c19e7073bcd1c76d11f6499ca55b75", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/courses/excel-show": { - "post": { - "tags": [ - "课程管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "08732fba18f8e3f63f0c8740dfc6e3b8", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/courses/import": { - "post": { - "tags": [ - "课程管理" - ], - "summary": "导入", - "description": "", - "operationId": "04537b21457c077b1542bb2f26c96abf", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/courses/qrcode": { - "get": { - "tags": [ - "课程管理" - ], - "summary": "报名二维码", - "description": "", - "operationId": "7b03b84a0c2771dc81fe580e46e29e79", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/courses/send-sms": { - "get": { - "tags": [ - "课程管理" - ], - "summary": "发送短信通知", - "description": "", - "operationId": "87cf77e1662eafc1e5deb6c35a89b209", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-forms/index": { - "get": { - "tags": [ - "课程表单" - ], - "summary": "列表", - "description": "", - "operationId": "6e382657c1bf238491c17496645b0c53", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-forms/show": { - "get": { - "tags": [ - "课程表单" - ], - "summary": "详情", - "description": "", - "operationId": "19d8aa68eed452cc449b0d9fc633e24b", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-forms/save": { - "post": { - "tags": [ - "课程表单" - ], - "summary": "更新或新增", - "operationId": "5662e235e0983b28f98b71362dc85ee5", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "配置名字", - "schema": { - "type": "string" - } - }, - { - "name": "field", - "in": "query", - "description": "英文标识", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "edit_input", - "in": "query", - "description": "输入框类型。包括:text文本,radio单选,checkbox多选,date日期,日期时间datetime,file单文件,files多文件上传", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "rule", - "in": "query", - "description": "检测规则,多个英文逗号分隔。包括:required", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "sort", - "in": "query", - "description": "排序", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "course_id", - "in": "query", - "description": "课程id", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "help", - "in": "query", - "description": "提示文字", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "select_item", - "in": "query", - "description": "数组,选项文字", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "need_fill", - "in": "query", - "description": "是否需要填写0否1是", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "belong_user", - "in": "query", - "description": "是否属于用户数据0否1是", - "schema": { - "type": "string", - "format": "date" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/course-forms/destroy": { - "get": { - "tags": [ - "课程表单" - ], - "summary": "删除", - "description": "", - "operationId": "f4b196b7021a67b530b5d279379879ef", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-forms/excel-show": { - "post": { - "tags": [ - "课程表单" - ], - "summary": "导入预览", - "description": "", - "operationId": "05e7b4a58c1d9e74623dfedf9e4d6484", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-forms/import": { - "post": { - "tags": [ - "课程表单" - ], - "summary": "导入", - "description": "", - "operationId": "f2f992498d1082ef93becd8d872eac4a", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-forms/clone": { - "get": { - "tags": [ - "课程表单" - ], - "summary": "克隆表单", - "operationId": "26fa2f996832fad8fda399ffac9e1eba", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "from_course_id", - "in": "query", - "description": "来源课程id", - "schema": { - "type": "string" - } - }, - { - "name": "to_course_id", - "in": "query", - "description": "目标课程id", - "schema": { - "type": "string", - "format": "date" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/course-keeps/index": { - "get": { - "tags": [ - "考勤管理" - ], - "summary": "列表", - "description": "", - "operationId": "c60027a2708f7127a5778d3da1dea414", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "file_name", - "in": "query", - "description": "导出文件名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-keeps/show": { - "get": { - "tags": [ - "考勤管理" - ], - "summary": "详情", - "description": "", - "operationId": "bc866531362c5712cd24490d4ac39219", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-keeps/save": { - "post": { - "tags": [ - "考勤管理" - ], - "summary": "更新或新增", - "operationId": "9701d2bdb6656be8176a7eb1a082e34a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "访问令牌", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "course_id", - "in": "query", - "description": "课程ID", - "schema": { - "type": "integer" - } - }, - { - "name": "course_content_id", - "in": "query", - "description": "排课ID", - "schema": { - "type": "integer" - } - }, - { - "name": "user_id", - "in": "query", - "description": "用户ID", - "schema": { - "type": "integer" - } - }, - { - "name": "status", - "in": "query", - "description": "考勤状态(0缺勤,1正常)", - "schema": { - "type": "integer" - } - }, - { - "name": "date", - "in": "query", - "description": "考勤日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "time", - "in": "query", - "description": "考勤时间", - "schema": { - "type": "string", - "format": "date-time" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/course-keeps/destroy": { - "get": { - "tags": [ - "考勤管理" - ], - "summary": "删除", - "description": "", - "operationId": "223aef89cc377e79c6bd3d7a309e8c88", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course_keeps/excel-show": { - "post": { - "tags": [ - "考勤管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "26a2cb8a10d2bf8b2e7dfb86b2c5a190", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "里面包含course_id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "file", - "in": "query", - "description": "文件。包含字段:学员名字,日期,考勤时间,状态", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-keeps/import": { - "post": { - "tags": [ - "考勤管理" - ], - "summary": "导入", - "description": "", - "operationId": "50628100aaf8d5626bca82509a938c7d", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/index": { - "get": { - "tags": [ - "报名管理" - ], - "summary": "列表", - "description": "", - "operationId": "c53c6d0af329f648b9c4e4168eb8d4c5", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "file_name", - "in": "query", - "description": "导出文件名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据.thirdAppointmentLogs第三方日志记录,thirdPlateLogs第三方车牌预约记录", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_name", - "in": "query", - "description": "公司名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_position", - "in": "query", - "description": "职务", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_area", - "in": "query", - "description": "所属区域", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_type", - "in": "query", - "description": "企业性质", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_industry", - "in": "query", - "description": "所属行业", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "is_schoolmate", - "in": "query", - "description": "is_schoolmate", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "手机号", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "education", - "in": "query", - "description": "education学历", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "filter_date", - "in": "query", - "description": "自定义字段筛选二维数组,包含键名name,value", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/show": { - "get": { - "tags": [ - "报名管理" - ], - "summary": "详情", - "description": "", - "operationId": "3ef520467da444a68441eded7386b30b", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据.thirdAppointmentLogs第三方日志记录,thirdPlateLogs第三方车牌预约记录", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/save": { - "post": { - "tags": [ - "报名管理" - ], - "summary": "更新或新增", - "operationId": "8803ce4fe51b25c4735d8bde371ca928", - "parameters": [ - { - "name": "update_user", - "in": "query", - "description": "是否更新用户信息0否1是", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "course_id", - "in": "query", - "description": "课程id", - "schema": { - "type": "string" - } - }, - { - "name": "title", - "in": "query", - "description": "标题", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "content", - "in": "query", - "description": "内容", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "status", - "in": "query", - "description": "状态0待审核1通过2拒绝3面试候选", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "reason", - "in": "query", - "description": "原因", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "score", - "in": "query", - "description": "分数", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "position", - "in": "query", - "description": "职位", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "fee_status", - "in": "query", - "description": "0未缴费1缴费成功2缴费失败3待确认", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "file_ids", - "in": "query", - "description": "附件id数组", - "schema": { - "type": "string", - "format": "date" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/course-signs/destroy": { - "get": { - "tags": [ - "报名管理" - ], - "summary": "删除", - "description": "", - "operationId": "0a422f4e709fb6cd2cf7ee6069dd1752", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/excel-show": { - "post": { - "tags": [ - "报名管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "9cc5f42a669c2e47cc954ae44b3f39bb", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/import": { - "post": { - "tags": [ - "报名管理" - ], - "summary": "导入", - "description": "", - "operationId": "0d52b99e4b8ea093fffd93a0525db980", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/batch-update-status": { - "post": { - "tags": [ - "报名管理" - ], - "summary": "批量修改审核状态", - "description": "", - "operationId": "198b9776ae8982aa478136a93283d9a4", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "ids", - "in": "query", - "description": "英文逗号分隔的id数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "状态0待审核1通过2拒绝", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "reason", - "in": "query", - "description": "reason", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/batch-update-fee-status": { - "post": { - "tags": [ - "报名管理" - ], - "summary": "批量修改缴费状态", - "description": "", - "operationId": "d4a9c3ee591decfd9b4af959ca774faa", - "parameters": [ - { - "name": "ids", - "in": "query", - "description": "英文逗号分隔的id数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "fee_status", - "in": "query", - "description": "0未缴费1缴费成功2缴费失败", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/batch-notice": { - "post": { - "tags": [ - "报名管理" - ], - "summary": "批量发送缴费通知", - "description": "", - "operationId": "6593138f5f39ddd0d32c7471a327baa6", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "ids", - "in": "query", - "description": "英文逗号分隔的id数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "content", - "in": "query", - "description": "发送内容", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-signs/retry-appointment": { - "get": { - "tags": [ - "报名管理" - ], - "summary": "重新发送第三方预约信息", - "description": "", - "operationId": "6f00aa5eeb9b6050a4983aa392abe11d", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-types/index": { - "get": { - "tags": [ - "课程类别" - ], - "summary": "列表", - "description": "", - "operationId": "b5eba398cb8624da725bdb04c80495dd", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-types/show": { - "get": { - "tags": [ - "课程类别" - ], - "summary": "详情", - "description": "", - "operationId": "f64e6348dfef33c47af5e366717bee87", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-types/save": { - "post": { - "tags": [ - "课程类别" - ], - "summary": "更新或新增", - "operationId": "649da1a2ea57c67bc4c2b1b25076a08e", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "验证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "配置名字", - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "状态0禁用1启用", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "wait_tip", - "in": "query", - "description": "待审核提示", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "pass_tip", - "in": "query", - "description": "通过提示", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "fault_tip", - "in": "query", - "description": "不通过提示", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "back_tip", - "in": "query", - "description": "面试候选提示", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "year_total", - "in": "query", - "description": "年预约次数", - "schema": { - "type": "string", - "format": "date" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/course-types/destroy": { - "get": { - "tags": [ - "课程类别" - ], - "summary": "删除", - "description": "", - "operationId": "5d7a2a7b4ffc50b46472ea483c3b4b21", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-types/excel-show": { - "post": { - "tags": [ - "课程类别" - ], - "summary": "导入预览", - "description": "", - "operationId": "670baacc934508947e38f648997c1976", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/course-types/import": { - "post": { - "tags": [ - "课程类别" - ], - "summary": "导入", - "description": "", - "operationId": "966b7cd8208939ed566984ae4a74f4bc", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/index": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "列表", - "description": "", - "operationId": "0b1750755af3319af2bbca10fac52dc1", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/real-table-index": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "获取实体数据表", - "description": "", - "operationId": "76b584eb528ef70c3b57906419110752", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/show": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "详情", - "description": "", - "operationId": "c28b3c78e085d578b8b8d2548e7fb862", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/real-table-show": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "获取实体表字段详情", - "description": "", - "operationId": "3a0852aea6a592e4f82aaa8a6c0b30d6", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "except", - "in": "query", - "description": "排除的字段名数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/save": { - "post": { - "tags": [ - "自定义表单" - ], - "summary": "更新", - "description": "", - "operationId": "d560b9e3a1247197b776605730beb029", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "Id(存在更新,不存在新增)", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "table_name", - "in": "query", - "description": "表名", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "relation", - "in": "query", - "description": "关联关系二维数组,包含字段:id存在更新,不存在新增,custom_form_field,link_table_name关联表名,link_relation关联关系,local_key本地字段,foreign_key关联表字段", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "fields", - "in": "query", - "description": "字段详情二维数组,包含字段:id存在更新,不存在新增。和其他字段详见字段更新接口", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/destroy": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "删除", - "description": "", - "operationId": "172be449a3f65455102b1c354fd84a9a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/relation-destroy": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "关联关系删除", - "description": "", - "operationId": "99a2c982970e1d3db53c5d16d7f37473", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "关联关系id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/update-table": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "数据表同步", - "description": "", - "operationId": "81e2deb6133c813ab874ae673f2e1926", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form/clone-table": { - "get": { - "tags": [ - "自定义表单" - ], - "summary": "克隆表结构", - "description": "", - "operationId": "83a83932e8ceff36011e176c1982653e", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "自定义表单表名", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form-field/index": { - "get": { - "tags": [ - "自定义表单字段" - ], - "summary": "列表", - "description": "", - "operationId": "61e668b036ec422261c707c1fef6d965", - "parameters": [ - { - "name": "custom_form_id", - "in": "query", - "description": "表id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form-field/show": { - "get": { - "tags": [ - "自定义表单字段" - ], - "summary": "详情", - "description": "", - "operationId": "46856168c3901d47e2e75e5b6826cd21", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form-field/save": { - "post": { - "tags": [ - "自定义表单字段" - ], - "summary": "更新", - "description": "", - "operationId": "7bbedc46a3effbf8d6fb31f7eb3bedea", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "Id(存在更新,不存在新增)", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "custom_form_id", - "in": "query", - "description": "表单id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "field", - "in": "query", - "description": "字段标示(汉字转拼音接口自动填充)", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "search_input", - "in": "query", - "description": "查询类型text输入框,radio单选,date_range日期范围选择,datetime_range日期时间范围选择", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "edit_input", - "in": "query", - "description": "编辑类型,从配置接口获取", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "description": "排序", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "help", - "in": "query", - "description": "帮助文字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "validation", - "in": "query", - "description": "验证规则,config接口获取,一维数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "select_item", - "in": "query", - "description": "选择框选项", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "list_show", - "in": "query", - "description": "是否列表显示0和1", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "form_show", - "in": "query", - "description": "是否表单显示0和1", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "is_fix", - "in": "query", - "description": "是否固定0否1是", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "width", - "in": "query", - "description": "列宽度", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form-field/destroy": { - "get": { - "tags": [ - "自定义表单字段" - ], - "summary": "删除", - "description": "", - "operationId": "bfa4261e40462825865162011a328f51", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form-field/pinyin": { - "get": { - "tags": [ - "自定义表单字段" - ], - "summary": "汉字转拼音", - "description": "", - "operationId": "66540b5a3a661450be4385f679bc911c", - "parameters": [ - { - "name": "str", - "in": "query", - "description": "汉字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/custom-form-field/config": { - "get": { - "tags": [ - "自定义表单字段" - ], - "summary": "验证规则选项和编辑类型选项", - "description": "", - "operationId": "5b0ce8b3a8102cabcff05c1624e6045a", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/department": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取部门", - "description": "", - "operationId": "94d839b43560f5e94bb362f906d8a22f", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取部门" - } - } - } - }, - "/api/admin/department/show": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取部门详情", - "description": "", - "operationId": "4679dfab6b34f87596dbb1c3690aa3fc", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取部门" - } - } - } - }, - "/api/admin/department/save": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "保存部门", - "description": "", - "operationId": "d5946ac7c3ba761ca13e250c84f555c5", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "部门ID,为空表示新增,不为空表示更新", - "schema": { - "type": "integer" - } - }, - { - "name": "name", - "in": "query", - "description": "名称", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "父id,默认为0", - "schema": { - "type": "integer" - } - }, - { - "name": "manager_id", - "in": "query", - "description": "部门负责人ID", - "schema": { - "type": "integer" - } - }, - { - "name": "leader_id", - "in": "query", - "description": "部门分管人ID", - "schema": { - "type": "integer" - } - }, - { - "name": "sortnumber", - "in": "query", - "description": "同级排序,默认为0", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "保存部门" - } - } - } - }, - "/api/admin/department/delete": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "删除部门", - "description": "", - "operationId": "9fef22f933be4fcd1e732ccd2fd1e35a", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "ID", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "删除部门" - } - } - } - }, - "/api/admin/menu": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取菜单", - "description": "", - "operationId": "63d9065efe48814fea7ff1aff75e352b", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取菜单" - } - } - } - }, - "/api/admin/menu/show": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取菜单详情", - "description": "", - "operationId": "a9ac0af0b385e1b7b2e8706807f1be47", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取菜单" - } - } - } - }, - "/api/admin/menu/save": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "保存菜单", - "description": "", - "operationId": "3927c9c5ced2186bf414e49fcf5fe785", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "菜单ID,为空表示新增,不为空表示更新", - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名称", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "父id,默认为0", - "schema": { - "type": "string" - } - }, - { - "name": "url", - "in": "query", - "description": "页面路由", - "schema": { - "type": "string" - } - }, - { - "name": "ptah", - "in": "query", - "description": "路由", - "schema": { - "type": "string" - } - }, - { - "name": "api_prefix", - "in": "query", - "description": "API前缀(基于前后端约定同一个页面的API前缀相同)", - "schema": { - "type": "string" - } - }, - { - "name": "icon", - "in": "query", - "description": "图标样式", - "schema": { - "type": "string" - } - }, - { - "name": "visible", - "in": "query", - "description": "是否可见,默认为1", - "schema": { - "type": "string" - } - }, - { - "name": "auth_node_tags", - "in": "query", - "description": "绑定的权限节点tag,多个标示英文逗号分隔", - "schema": { - "type": "string" - } - }, - { - "name": "sortnumber", - "in": "query", - "description": "同级排序,默认为0", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "保存菜单" - } - } - } - }, - "/api/admin/menu/delete": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "删除菜单", - "description": "", - "operationId": "b555ee7c6cb8252db36c5af160f9a015", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "ID", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "删除菜单" - } - } - } - }, - "/api/admin/notifications/index": { - "get": { - "tags": [ - "通知管理" - ], - "summary": "列表", - "description": "", - "operationId": "93ff09d105fdeacb299e8c1b1a8d97a2", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/notifications/show": { - "get": { - "tags": [ - "通知管理" - ], - "summary": "详情", - "description": "", - "operationId": "f6218fbac1b87d89928a4aa341bd71c9", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/notifications/save": { - "post": { - "tags": [ - "通知管理" - ], - "summary": "重新发送", - "operationId": "4579829a2169cb12267db4acf0cd7382", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "消息id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/notifications/destroy": { - "get": { - "tags": [ - "通知管理" - ], - "summary": "删除", - "description": "", - "operationId": "36769340aa411d7cbfa5525836095514", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/operate-log/index": { - "get": { - "tags": [ - "操作日志" - ], - "summary": "列表", - "description": "", - "operationId": "898e3ea8176de2f2e45c908546a2b1f2", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "admin_id", - "in": "query", - "description": "管理员id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "内容", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/other/admin-user-list": { - "post": { - "tags": [ - "其他" - ], - "summary": "后台用户列表", - "description": "", - "operationId": "cc3b529c89b0bca19ec24623ba6fe837", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "department_id", - "in": "query", - "description": "部门id", - "required": false, - "schema": { - "type": "int" - } - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/other/admin-department-list": { - "post": { - "tags": [ - "其他" - ], - "summary": "后台部门列表", - "description": "", - "operationId": "f4cf8d3e58b688c0e5ed89a20dbddd86", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码。不传则全部,传入则分页", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_tree", - "in": "query", - "description": "是否显示树形结构 0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/other/table-fileds": { - "get": { - "tags": [ - "其他" - ], - "summary": "获取表字段", - "description": "", - "operationId": "f9ae89d3870d2313be027d91db581844", - "parameters": [ - { - "name": "table_name", - "in": "query", - "description": "table_name", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "except", - "in": "query", - "description": "排除的字段数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/parameter/index": { - "get": { - "tags": [ - "数据参数字典" - ], - "summary": "数据参数字典列表", - "description": "", - "operationId": "1d06d4fb0d890b44517bb66d6cd1f2b1", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "number", - "in": "query", - "description": "编号", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "状态 0禁用 1启用", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/parameter/store": { - "post": { - "tags": [ - "数据参数字典" - ], - "summary": "添加数据参数字典", - "description": "", - "operationId": "143c606ca44e670840c2234c337a4cf3", - "parameters": [ - { - "name": "number", - "in": "query", - "description": "编号", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "父id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "description": "排序", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "状态 0禁用1启用", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "remark", - "in": "query", - "description": "备注", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "detail_list", - "in": "query", - "description": "字典明细二维数组。包括:key数据源id,value数据值,sort排序,status状态0禁用1启用,remark备注", - "required": false, - "schema": { - "type": "object" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/parameter/show": { - "get": { - "tags": [ - "数据参数字典" - ], - "summary": "数据参数字典详情", - "description": "", - "operationId": "32d002bab4bca88636c64b140b359201", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id值或数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "number", - "in": "query", - "description": "number编号值或数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "父id值或数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/parameter/save": { - "post": { - "tags": [ - "数据参数字典" - ], - "summary": "更新数据参数字典", - "description": "", - "operationId": "db745de23f8198982c6083d0f47de7a6", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "Id", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "number", - "in": "query", - "description": "编号", - "required": true, - "schema": { - "type": "int" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "父id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "sort", - "in": "query", - "description": "排序", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "状态 0禁用1启用", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "remark", - "in": "query", - "description": "备注", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "detail_list", - "in": "query", - "description": "字典明细二维数组。包括:id数据原始id,有就传没有就传空,value数据值,sort排序,status状态0禁用1启用,remark备注", - "required": false, - "schema": { - "type": "object" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/parameter/delete": { - "get": { - "tags": [ - "数据参数字典" - ], - "summary": "删除数据参数字典", - "description": "", - "operationId": "a2578a0438837f0fcbe66460826c05f4", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "数据参数字典id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/parameter/detail-delete": { - "get": { - "tags": [ - "数据参数字典" - ], - "summary": "删除数据参数字典详情记录", - "description": "", - "operationId": "c042eb7796319e4e7291124e9cebb5ce", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "数据参数详情id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/role": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取角色", - "description": "", - "operationId": "432d0553165dc1c248421fa36871567e", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取角色" - } - } - } - }, - "/api/admin/role/show": { - "get": { - "tags": [ - "后台管理" - ], - "summary": "获取角色详情", - "description": "", - "operationId": "9815083cc76091a16a3388ba833efe31", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "获取角色" - } - } - } - }, - "/api/admin/role/save": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "保存角色", - "description": "", - "operationId": "80f92184eae29a6efd829fc0f82a6bf9", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "菜单ID,为空表示新增,不为空表示更新", - "schema": { - "type": "integer" - } - }, - { - "name": "name", - "in": "query", - "description": "名称", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "introduce", - "in": "query", - "description": "说明", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "allow_level", - "in": "query", - "description": "数据权限0全部1部分2自己", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "sortnumber", - "in": "query", - "description": "同级排序,默认为0", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "保存角色" - } - } - } - }, - "/api/admin/role/delete": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "删除角色", - "description": "", - "operationId": "dc85bbd29c8ecc9534c23543c2588f17", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "ID", - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "删除角色" - } - } - } - }, - "/api/admin/role/set-permissions": { - "post": { - "tags": [ - "后台管理" - ], - "summary": "角色授权", - "description": "", - "operationId": "c6ac574837d7578e18a94b8ebfd79c36", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "id", - "in": "query", - "description": "ID", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "permission_list", - "in": "query", - "description": "二维数组形式,包括:permission_id权限id,auth_node_tags英文逗号分隔的权限标示", - "required": true, - "schema": { - "type": "object" - } - } - ], - "responses": { - "200": { - "description": "角色授权" - } - } - } - }, - "/api/admin/supply-demand/index": { - "get": { - "tags": [ - "供需信息管理" - ], - "summary": "列表", - "description": "", - "operationId": "0f7251b9f256e8fe64f2d0577499437f", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/supply-demand/show": { - "get": { - "tags": [ - "供需信息管理" - ], - "summary": "详情", - "description": "", - "operationId": "7b7e1c9c85848d37d22c6d2c34bcc04a", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/supply-demand/save": { - "post": { - "tags": [ - "供需信息管理" - ], - "summary": "更新或新增", - "operationId": "60da62531ba9ea53f0c0339709060101", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "需求供应表ID(存在则更新,不存在则新增)", - "required": false, - "schema": { - "type": "integer" - } - }, - { - "name": "title", - "in": "query", - "description": "标题", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "supply_demand_type_id", - "in": "query", - "description": "分类ID", - "required": false, - "schema": { - "type": "integer" - } - }, - { - "name": "content", - "in": "query", - "description": "内容", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "tag", - "in": "query", - "description": "标签", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "wechat", - "in": "query", - "description": "微信号", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "电话", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "email", - "in": "query", - "description": "邮箱", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "审核状态(0:待审核;1:通过;2:拒绝)", - "required": false, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/supply-demand/destroy": { - "get": { - "tags": [ - "供需信息管理" - ], - "summary": "删除", - "description": "", - "operationId": "8031bd3d6803d827fd962dc42e3b1066", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/teachers/index": { - "get": { - "tags": [ - "老师管理" - ], - "summary": "列表", - "description": "", - "operationId": "b9c77db2e25a7539cca27ea656a160b4", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/teachers/show": { - "get": { - "tags": [ - "老师管理" - ], - "summary": "详情", - "description": "", - "operationId": "8e50fd1d7d2f4ac4fba12b19895eae55", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/teachers/save": { - "post": { - "tags": [ - "时间段设置" - ], - "summary": "更新或新增", - "operationId": "32ce6f0497e018a7a40edda40159a67e", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "访问令牌", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "schema": { - "type": "integer" - } - }, - { - "name": "sex", - "in": "query", - "description": "性别", - "schema": { - "type": "string" - } - }, - { - "name": "speciality", - "in": "query", - "description": "专业", - "schema": { - "type": "string" - } - }, - { - "name": "theme", - "in": "query", - "description": "主题", - "schema": { - "type": "string" - } - }, - { - "name": "remark", - "in": "query", - "description": "备注", - "schema": { - "type": "string" - } - }, - { - "name": "introduce", - "in": "query", - "description": "介绍", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/teachers/destroy": { - "get": { - "tags": [ - "老师管理" - ], - "summary": "删除", - "description": "", - "operationId": "486544134d89a64d9fb4a0efe036e1fd", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/teachers/excel-show": { - "post": { - "tags": [ - "老师管理" - ], - "summary": "导入预览", - "description": "", - "operationId": "2ab672c4364b32a72a80f97df434a5ba", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/teachers/import": { - "post": { - "tags": [ - "老师管理" - ], - "summary": "导入", - "description": "", - "operationId": "e0731f9bed9c4b91e3044c3f19490739", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/upload-file": { - "post": { - "tags": [ - "其他" - ], - "summary": "上传文件", - "description": "", - "operationId": "2c233caa0e77aedf4bf95a402620b402", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "file" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/index": { - "get": { - "tags": [ - "用户信息" - ], - "summary": "所有用户列表", - "description": "", - "operationId": "0e65c24967a8ebe2771e38fdebdb4d27", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "export_fields", - "in": "query", - "description": "需要导出的字段数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "filter", - "in": "query", - "description": "查询条件。数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,包括:courses,courseSigns,teacher,courseSettings,coursePeriods", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/study": { - "get": { - "tags": [ - "用户信息" - ], - "summary": "学员管理(参与了课程的用户包含统计数据)", - "description": "", - "operationId": "3f874ae4d6232375fc98ec7b50499bb4", - "parameters": [ - { - "name": "is_export", - "in": "query", - "description": "是否导出0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "file_name", - "in": "query", - "description": "导出文件名", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "course_name", - "in": "query", - "description": "课程名称", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_name", - "in": "query", - "description": "公司名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_position", - "in": "query", - "description": "职务", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_area", - "in": "query", - "description": "所属区域", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_type", - "in": "query", - "description": "企业性质", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_industry", - "in": "query", - "description": "所属行业", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "courses_start_date", - "in": "query", - "description": "课程开始时间", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "courses_end_date", - "in": "query", - "description": "课程结束时间", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "is_vip", - "in": "query", - "description": "是否vip0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "courses_ing", - "in": "query", - "description": "是否课程进行中0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "is_schoolmate", - "in": "query", - "description": "is_schoolmate", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "mobile", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "审核状态", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "course_type", - "in": "query", - "description": "course_type", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "company_has_share", - "in": "query", - "description": "是否有股份", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "keyword", - "in": "query", - "description": "关键词", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "start_company_date", - "in": "query", - "description": "开始成立日期", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "end_company_date", - "in": "query", - "description": "结束成立日期", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "start_birthday", - "in": "query", - "description": "开始出生日期", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "end_birthday", - "in": "query", - "description": "结束出生日期", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "company_need_fund", - "in": "query", - "description": "是否需要融资", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "is_fee", - "in": "query", - "description": "是否缴费0否1是", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "has_openid", - "in": "query", - "description": "是否绑定小程序0否1是", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "year", - "in": "query", - "description": "年份", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/show": { - "get": { - "tags": [ - "用户信息" - ], - "summary": "详情", - "description": "", - "operationId": "e1c7e516645ea3e01d9228642f1f2e9d", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "show_relation", - "in": "query", - "description": "需要输出的关联关系数组,填写输出指定数据", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/save": { - "post": { - "tags": [ - "时间段设置" - ], - "summary": "更新或新增", - "operationId": "223b4be53194747c01738c8fa4b18041", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "课程ID(存在则更新,不存在则新增)", - "required": true, - "schema": { - "type": "integer" - } - }, - { - "name": "token", - "in": "query", - "description": "访问令牌", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "openid", - "in": "query", - "description": "用户openid", - "schema": { - "type": "string" - } - }, - { - "name": "sex", - "in": "query", - "description": "性别男/女", - "schema": { - "type": "string" - } - }, - { - "name": "nickname", - "in": "query", - "description": "昵称", - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "手机号", - "schema": { - "type": "string" - } - }, - { - "name": "country", - "in": "query", - "description": "国家", - "schema": { - "type": "string" - } - }, - { - "name": "province", - "in": "query", - "description": "省份", - "schema": { - "type": "string" - } - }, - { - "name": "city", - "in": "query", - "description": "城市", - "schema": { - "type": "string" - } - }, - { - "name": "headimgurl", - "in": "query", - "description": "头像URL", - "schema": { - "type": "string" - } - }, - { - "name": "username", - "in": "query", - "description": "用户名", - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "密码", - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "schema": { - "type": "string" - } - }, - { - "name": "birthday", - "in": "query", - "description": "生日", - "schema": { - "type": "string" - } - }, - { - "name": "email", - "in": "query", - "description": "邮箱", - "schema": { - "type": "string" - } - }, - { - "name": "education", - "in": "query", - "description": "学历", - "schema": { - "type": "integer" - } - }, - { - "name": "school", - "in": "query", - "description": "学校", - "schema": { - "type": "string" - } - }, - { - "name": "speciality", - "in": "query", - "description": "专业", - "schema": { - "type": "string" - } - }, - { - "name": "honour", - "in": "query", - "description": "荣誉", - "schema": { - "type": "string" - } - }, - { - "name": "introduce", - "in": "query", - "description": "介绍", - "schema": { - "type": "string" - } - }, - { - "name": "company_name", - "in": "query", - "description": "公司名称", - "schema": { - "type": "string" - } - }, - { - "name": "company_position", - "in": "query", - "description": "个人职务", - "schema": { - "type": "string" - } - }, - { - "name": "company_has_share", - "in": "query", - "description": "是否有股份0否1是", - "schema": { - "type": "string" - } - }, - { - "name": "company_build_date", - "in": "query", - "description": "公司成立日期", - "schema": { - "type": "string" - } - }, - { - "name": "company_area", - "in": "query", - "description": "公司区域-数据字典", - "schema": { - "type": "string" - } - }, - { - "name": "company_type", - "in": "query", - "description": "公司性质-数据字典", - "schema": { - "type": "string" - } - }, - { - "name": "company_industry", - "in": "query", - "description": "公司所属行业-数据字典", - "schema": { - "type": "string" - } - }, - { - "name": "company_business", - "in": "query", - "description": "公司主营业务", - "schema": { - "type": "string" - } - }, - { - "name": "company_fund", - "in": "query", - "description": "公司融资情况0否1是", - "schema": { - "type": "string" - } - }, - { - "name": "company_need_fund", - "in": "query", - "description": "公司是否需要融资0否1是", - "schema": { - "type": "integer" - } - }, - { - "name": "sign_from", - "in": "query", - "description": "报名信息来源", - "schema": { - "type": "string" - } - }, - { - "name": "remark", - "in": "query", - "description": "备注", - "schema": { - "type": "string" - } - }, - { - "name": "has_appointment_total", - "in": "query", - "description": "预约剩余次数", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/admin/users/destroy": { - "get": { - "tags": [ - "用户信息" - ], - "summary": "删除", - "description": "", - "operationId": "8e3cbeb0566f9efba6c2d2fc2fb3b707", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/excel-show": { - "post": { - "tags": [ - "用户信息" - ], - "summary": "导入预览", - "description": "", - "operationId": "ad1513c76e93120171377bdd24021da3", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/import": { - "post": { - "tags": [ - "用户信息" - ], - "summary": "导入", - "description": "", - "operationId": "1658fd176abf9de13048032aec3935c2", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/import-study": { - "post": { - "tags": [ - "用户信息" - ], - "summary": "导入学员信息(旧的校友库导入)", - "description": "", - "operationId": "85d3cac0c7e39908ce9c48b2376797a3", - "parameters": [ - { - "name": "data", - "in": "query", - "description": "导入分析获取到的二维数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/admin/users/batch-update-schoolmate": { - "post": { - "tags": [ - "用户信息" - ], - "summary": "设置取消校友库", - "description": "", - "operationId": "63f36c757324a37e05099c7ec7f4cd29", - "parameters": [ - { - "name": "ids", - "in": "query", - "description": "英文逗号分隔的id数组", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "is_schoolmate", - "in": "query", - "description": "是否校友库-0否1是", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/mobile/course/notices": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "通知公告", - "operationId": "c89adc994f0e7e02c1ef62b0aa96f94c", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/course": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "课程列表", - "operationId": "18e8ec736e952dd5385462b6dc66cc3a", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_name", - "in": "query", - "description": "排序字段名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "sort_type", - "in": "query", - "description": "排序类型", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "type", - "in": "query", - "description": "课程类型", - "schema": { - "type": "integer" - } - }, - { - "name": "status", - "in": "query", - "description": "状态", - "schema": { - "type": "integer" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/course-detail": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "课程详情", - "operationId": "2a58b695a93f7f214a77317134d8cf1f", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/course-detail-pc": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "课程详情PC", - "operationId": "6cfdce8dbd8b459da386bc3f40778e77", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/sign": { - "post": { - "tags": [ - "小程序-课程" - ], - "summary": "报名", - "operationId": "b99397a5c70340888a6883a0badde8cd", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "is_change", - "in": "query", - "description": "用户数据是否变化0否1是", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "change_data", - "in": "query", - "description": "变化的数组,键值对形式的一维数组", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "data", - "in": "query", - "description": "自定义数据的数据,二维数组。包括键名:name,field,value", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/my-course": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "我的课程", - "operationId": "b17ac0faa67da3f9ac681171d26b9f00", - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/my-course-content": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "我的课表", - "operationId": "232c814681b5da5edec505a0ec95808a", - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/get-sign": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "课程报名详情", - "operationId": "064d84918d3397ffec01adab588cd0da", - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/update-sign": { - "post": { - "tags": [ - "小程序-课程" - ], - "summary": "更新报名信息", - "operationId": "ed2ceffab06b5600cb3cce658b5ea668", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "报名id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "fee_file_ids", - "in": "query", - "description": "文件id数组", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/contents": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "课表", - "operationId": "2e9349656fbeb25f528ed45dcc060f14", - "parameters": [ - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/user-list": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "校友库和本班通讯录", - "operationId": "9412a8e90e1580453b460c99a9eead1d", - "parameters": [ - { - "name": "type", - "in": "query", - "description": "类型1校友库2本班通讯录", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "course_id", - "in": "query", - "description": "课程id", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_business", - "in": "query", - "description": "主营业务", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_name", - "in": "query", - "description": "公司名字", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_position", - "in": "query", - "description": "职务", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_area", - "in": "query", - "description": "所属区域", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_type", - "in": "query", - "description": "企业性质", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "company_industry", - "in": "query", - "description": "所属行业", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "letter", - "in": "query", - "description": "首字母", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/news": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "文章列表", - "operationId": "f9b20de2bae8ad2f4f8fdca70ec6d120", - "parameters": [ - { - "name": "page_size", - "in": "query", - "description": "每页显示的条数", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/course/news-detail": { - "get": { - "tags": [ - "小程序-课程" - ], - "summary": "文章详情", - "operationId": "87d328e01768df3b8ba7c09d04d2833d", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/other/config": { - "get": { - "tags": [ - "小程序-其他" - ], - "summary": "获取配置信息", - "operationId": "f7601d94f6103fd195caad54e079a992", - "parameters": [ - { - "name": "appointment_type_id", - "in": "query", - "description": "场地类型", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/other/banner": { - "get": { - "tags": [ - "小程序-其他" - ], - "summary": "获取banner", - "operationId": "b2a8ae8e05645e34def69a97cae0cd6e", - "parameters": [ - { - "name": "position", - "in": "query", - "description": "位置1首页", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/schedule/index": { - "get": { - "tags": [ - "小程序-预约管理" - ], - "summary": "预约列表", - "description": "", - "operationId": "d417d99cfc0f00c75929ef9a539e1b6d", - "parameters": [ - { - "name": "status", - "in": "query", - "description": "status", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "page", - "in": "query", - "description": "页码", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/schedule/detail": { - "get": { - "tags": [ - "小程序-预约管理" - ], - "summary": "预约详情", - "description": "", - "operationId": "e065b8209c8c9a8bdced5bdae9fc1248", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/schedule/check": { - "get": { - "tags": [ - "小程序-预约管理" - ], - "summary": "检测是否可预约", - "description": "", - "operationId": "d52e662f5cba313152551cc8f741b526", - "parameters": [ - { - "name": "site", - "in": "query", - "description": "预约地点id,从config接口获取", - "schema": { - "type": "integer" - } - }, - { - "name": "myself", - "in": "query", - "description": "是否检测自己的数据0否1是", - "schema": { - "type": "integer" - } - }, - { - "name": "start_time", - "in": "query", - "description": "开始时间,例如:2023-01-01 11:11:11", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "end_time", - "in": "query", - "description": "结束时间,例如:2023-01-01 11:11:11", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/schedule/save": { - "post": { - "tags": [ - "小程序-预约管理" - ], - "summary": "创建更新预约", - "description": "", - "operationId": "646a96c009204748b4bfa8f477d3207c", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "存在更新,不存在新增", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "date", - "in": "query", - "description": "预约日期", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "start_time", - "in": "query", - "description": "开始时间,例如:2023-01-01 11:11:11", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "end_time", - "in": "query", - "description": "结束时间,例如:2023-01-01 11:11:11", - "schema": { - "type": "string", - "format": "date-time" - } - }, - { - "name": "content", - "in": "query", - "description": "预约事项", - "schema": { - "type": "string" - } - }, - { - "name": "site", - "in": "query", - "description": "预约地点id,从config接口获取", - "schema": { - "type": "integer" - } - }, - { - "name": "plate", - "in": "query", - "description": "车牌号。多个英文逗号分隔", - "schema": { - "type": "string" - } - }, - { - "name": "accompany_total", - "in": "query", - "description": "陪同人数", - "schema": { - "type": "integer" - } - }, - { - "name": "status", - "in": "query", - "description": "状态 0未审核 1审核通过 2审核不通过3取消", - "schema": { - "type": "integer" - } - }, - { - "name": "reason", - "in": "query", - "description": "审核不通过原因", - "schema": { - "type": "string" - } - }, - { - "name": "accompany", - "in": "query", - "description": "陪同人员,二维数组,包括:name,idcard,mobile", - "schema": { - "type": "string" - } - }, - { - "name": "idcard", - "in": "query", - "description": "身份证号码", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/schedule/cancel": { - "get": { - "tags": [ - "小程序-预约管理" - ], - "summary": "取消预约", - "description": "", - "operationId": "7755b60b50d4ca3d470e9634edada88b", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "schema": { - "type": "string", - "format": "date" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/supply-demand/detail": { - "get": { - "tags": [ - "小程序-供需" - ], - "summary": "详情", - "operationId": "8807f44957ff9c1a35ee5a579eb9816e", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/supply-demand/save": { - "post": { - "tags": [ - "小程序-供需" - ], - "summary": "更新", - "description": "", - "operationId": "c569f0cddb4ef0c7880bcea7872a8a40", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "需求供应表ID(存在则更新,不存在则新增)", - "required": false, - "schema": { - "type": "integer" - } - }, - { - "name": "title", - "in": "query", - "description": "标题", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "supply_demand_type_id", - "in": "query", - "description": "分类ID", - "required": false, - "schema": { - "type": "integer" - } - }, - { - "name": "content", - "in": "query", - "description": "内容", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "tag", - "in": "query", - "description": "标签", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "wechat", - "in": "query", - "description": "微信号", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "电话", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "email", - "in": "query", - "description": "邮箱", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "status", - "in": "query", - "description": "审核状态(0:待审核;1:通过;2:拒绝)", - "required": false, - "schema": { - "type": "integer" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/mobile/supply-demand/destroy": { - "get": { - "tags": [ - "小程序-供需" - ], - "summary": "删除", - "description": "", - "operationId": "a7633209b8e2c6f497e4d4cc25e4efb0", - "parameters": [ - { - "name": "id", - "in": "query", - "description": "id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/mobile/supply-demand/send-message": { - "get": { - "tags": [ - "小程序-供需" - ], - "summary": "发送消息", - "description": "", - "operationId": "6c8c72c97e564e881bf18555dbf01c5e", - "parameters": [ - { - "name": "supply_demand_id", - "in": "query", - "description": "供需信息id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "content", - "in": "query", - "description": "内容", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "to_user_id", - "in": "query", - "description": "接收人用户id", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/mobile/upload-file": { - "post": { - "tags": [ - "小程序-其他" - ], - "summary": "上传文件", - "description": "", - "operationId": "35f4fde3cda084187506b95c8d056e21", - "parameters": [ - { - "name": "file", - "in": "query", - "description": "文件", - "required": true, - "schema": { - "type": "file" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "暂无" - } - } - } - }, - "/api/mobile/user/applet-login": { - "get": { - "tags": [ - "小程序-用户管理" - ], - "summary": "小程序静默登陆", - "operationId": "6637e6acb7458523a306be7c1ed75bd4", - "parameters": [ - { - "name": "code", - "in": "query", - "description": "code", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "pid", - "in": "query", - "description": "上级id", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/user/account-login": { - "get": { - "tags": [ - "小程序-用户管理" - ], - "summary": "账号密码登陆", - "operationId": "b2dcb7c5702d3d65045573682c902587", - "parameters": [ - { - "name": "mobile", - "in": "query", - "description": "mobile", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "password", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/user/update-user": { - "post": { - "tags": [ - "小程序-用户管理" - ], - "summary": "更新用户信息", - "operationId": "10397159c5f07743d3386bb7f1277833", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "认证token", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "openid", - "in": "query", - "description": "用户的openid", - "schema": { - "type": "string" - } - }, - { - "name": "sex", - "in": "query", - "description": "性别男/女", - "schema": { - "type": "string" - } - }, - { - "name": "nickname", - "in": "query", - "description": "昵称", - "schema": { - "type": "string" - } - }, - { - "name": "mobile", - "in": "query", - "description": "手机号", - "schema": { - "type": "string" - } - }, - { - "name": "country", - "in": "query", - "description": "国家", - "schema": { - "type": "string" - } - }, - { - "name": "province", - "in": "query", - "description": "省份", - "schema": { - "type": "string" - } - }, - { - "name": "city", - "in": "query", - "description": "城市", - "schema": { - "type": "string" - } - }, - { - "name": "headimgurl", - "in": "query", - "description": "头像url", - "schema": { - "type": "string" - } - }, - { - "name": "username", - "in": "query", - "description": "用户名", - "schema": { - "type": "string" - } - }, - { - "name": "old_password", - "in": "query", - "description": "旧密码", - "schema": { - "type": "string" - } - }, - { - "name": "password", - "in": "query", - "description": "密码", - "schema": { - "type": "string" - } - }, - { - "name": "name", - "in": "query", - "description": "名字", - "schema": { - "type": "string" - } - }, - { - "name": "birthday", - "in": "query", - "description": "生日", - "schema": { - "type": "string" - } - }, - { - "name": "email", - "in": "query", - "description": "邮箱", - "schema": { - "type": "string" - } - }, - { - "name": "education", - "in": "query", - "description": "学历", - "schema": { - "type": "integer" - } - }, - { - "name": "school", - "in": "query", - "description": "学校", - "schema": { - "type": "string" - } - }, - { - "name": "speciality", - "in": "query", - "description": "专业", - "schema": { - "type": "string" - } - }, - { - "name": "honour", - "in": "query", - "description": "荣誉", - "schema": { - "type": "string" - } - }, - { - "name": "introduce", - "in": "query", - "description": "介绍", - "schema": { - "type": "string" - } - }, - { - "name": "company_name", - "in": "query", - "description": "公司名称", - "schema": { - "type": "string" - } - }, - { - "name": "company_position", - "in": "query", - "description": "个人职务", - "schema": { - "type": "string" - } - }, - { - "name": "company_has_share", - "in": "query", - "description": "是否有股份", - "schema": { - "type": "string" - } - }, - { - "name": "company_build_date", - "in": "query", - "description": "公司成立日期", - "schema": { - "type": "string" - } - }, - { - "name": "company_area", - "in": "query", - "description": "公司区域", - "schema": { - "type": "string" - } - }, - { - "name": "company_type", - "in": "query", - "description": "公司性质", - "schema": { - "type": "string" - } - }, - { - "name": "company_industry", - "in": "query", - "description": "公司所属行业", - "schema": { - "type": "string" - } - }, - { - "name": "company_business", - "in": "query", - "description": "公司主营业务", - "schema": { - "type": "string" - } - }, - { - "name": "company_fund", - "in": "query", - "description": "公司融资情况", - "schema": { - "type": "string" - } - }, - { - "name": "company_need_fund", - "in": "query", - "description": "公司是否需要融资", - "schema": { - "type": "boolean" - } - }, - { - "name": "sign_from", - "in": "query", - "description": "报名信息来源", - "schema": { - "type": "string" - } - }, - { - "name": "remark", - "in": "query", - "description": "备注", - "schema": { - "type": "string" - } - }, - { - "name": "idcard", - "in": "query", - "description": "身份证号码", - "schema": { - "type": "string" - } - }, - { - "name": "plate", - "in": "query", - "description": "车牌号多个英文逗号分隔", - "schema": { - "type": "string" - } - }, - { - "name": "type", - "in": "query", - "description": "人才类型", - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/user/get-user-info": { - "get": { - "tags": [ - "小程序-用户管理" - ], - "summary": "获取用户信息", - "operationId": "a8c6f34c09cf8a2007e694e7a7b16450", - "parameters": [ - { - "name": "token", - "in": "query", - "description": "token", - "required": false, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "操作成功" - } - } - } - }, - "/api/mobile/user/mobile": { - "get": { - "tags": [ - "小程序-用户管理" - ], - "summary": "获取微信授权手机号", - "description": "", - "operationId": "14a7843f4ffaafef7278beb04b20fbfe", - "parameters": [ - { - "name": "code", - "in": "query", - "description": "code", - "required": false, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/user/bind-mobile": { - "get": { - "tags": [ - "手机端-用户管理" - ], - "summary": "验证码绑定手机号", - "description": "", - "operationId": "6889ff023b0d44b475a30bad8b8b4609", - "parameters": [ - { - "name": "mobile", - "in": "query", - "description": "手机号", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "code", - "in": "query", - "description": "验证码", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "is_bind", - "in": "query", - "description": "是否绑定手机号", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/user/check-mobile": { - "get": { - "tags": [ - "手机端-用户管理" - ], - "summary": "检测手机号", - "description": "", - "operationId": "6e0ac349cb29f5045cbc0629faa5f754", - "parameters": [ - { - "name": "mobile", - "in": "query", - "description": "手机号", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "code", - "in": "query", - "description": "验证码", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/user/send-sms": { - "get": { - "tags": [ - "手机端-用户管理" - ], - "summary": "短信发送", - "description": "", - "operationId": "8e1407f35b2364f5b101060be968d510", - "parameters": [ - { - "name": "mobile", - "in": "query", - "description": "手机号", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - }, - "/api/mobile/user/update-donates": { - "post": { - "tags": [ - "手机端-用户管理" - ], - "summary": "新增校友捐赠", - "description": "", - "operationId": "290838cc1429305bc68b828607266b90", - "parameters": [ - { - "name": "xxx", - "in": "query", - "description": "字段", - "required": true, - "schema": { - "type": "string" - } - }, - { - "name": "token", - "in": "query", - "description": "token", - "required": true, - "schema": { - "type": "string" - } - } - ], - "responses": { - "200": { - "description": "" - } - } - } - } - }, - "tags": [ - { - "name": "后台管理", - "description": "后台管理" - }, - { - "name": "地点配置管理", - "description": "地点配置管理" - }, - { - "name": "预约管理", - "description": "预约管理" - }, - { - "name": "地点类型管理", - "description": "地点类型管理" - }, - { - "name": "权限", - "description": "权限" - }, - { - "name": "Banner图管理", - "description": "Banner图管理" - }, - { - "name": "通用接口", - "description": "通用接口" - }, - { - "name": "自定义表单增删改查操作", - "description": "自定义表单增删改查操作" - }, - { - "name": "配置管理", - "description": "配置管理" - }, - { - "name": "预约次数管理", - "description": "预约次数管理" - }, - { - "name": "排课", - "description": "排课" - }, - { - "name": "课程管理", - "description": "课程管理" - }, - { - "name": "课程表单", - "description": "课程表单" - }, - { - "name": "考勤管理", - "description": "考勤管理" - }, - { - "name": "报名管理", - "description": "报名管理" - }, - { - "name": "课程类别", - "description": "课程类别" - }, - { - "name": "自定义表单", - "description": "自定义表单" - }, - { - "name": "自定义表单字段", - "description": "自定义表单字段" - }, - { - "name": "通知管理", - "description": "通知管理" - }, - { - "name": "操作日志", - "description": "操作日志" - }, - { - "name": "其他", - "description": "其他" - }, - { - "name": "数据参数字典", - "description": "数据参数字典" - }, - { - "name": "供需信息管理", - "description": "供需信息管理" - }, - { - "name": "老师管理", - "description": "老师管理" - }, - { - "name": "时间段设置", - "description": "时间段设置" - }, - { - "name": "用户信息", - "description": "用户信息" - }, - { - "name": "小程序-课程", - "description": "小程序-课程" - }, - { - "name": "小程序-其他", - "description": "小程序-其他" - }, - { - "name": "小程序-预约管理", - "description": "小程序-预约管理" - }, - { - "name": "小程序-供需", - "description": "小程序-供需" - }, - { - "name": "小程序-用户管理", - "description": "小程序-用户管理" - }, - { - "name": "手机端-用户管理", - "description": "手机端-用户管理" - } - ] -} \ No newline at end of file diff --git a/tests/Feature/AdminSmsLoginSecurityTest.php b/tests/Feature/AdminSmsLoginSecurityTest.php new file mode 100644 index 0000000..7d0ce4b --- /dev/null +++ b/tests/Feature/AdminSmsLoginSecurityTest.php @@ -0,0 +1,25 @@ +getJson('/api/admin/auth/sms-login')->assertStatus(405); + $this->getJson('/api/admin/auth/send-sms')->assertStatus(405); + } + + public function test_sms_login_requires_six_digit_code_and_challenge(): void + { + $response = $this->postJson('/api/admin/auth/sms-login', [ + 'mobile' => '13800138000', + 'code' => '1234', + 'challenge_id' => 'not-a-uuid', + ]); + + $response->assertOk()->assertJsonPath('errcode', 30001); + } +} diff --git a/tests/Feature/SwaggerExposureTest.php b/tests/Feature/SwaggerExposureTest.php new file mode 100644 index 0000000..ef82fd8 --- /dev/null +++ b/tests/Feature/SwaggerExposureTest.php @@ -0,0 +1,47 @@ + false, + 'app.swagger_enabled' => true, + ]); + + foreach ([ + '/swagger/json', + '/api/documentation', + '/docs', + '/docs/asset/swagger-ui.css', + '/docs/api-docs.json', + '/docs/api-docs.yaml', + '/swagger/index.html', + '/swagger/swagger-ui.js', + '/storage/api-docs/api-docs.json', + ] as $path) { + $response = $this->get($path); + + $response->assertNotFound(); + $this->assertStringNotContainsString('openapi', strtolower($response->getContent())); + $this->assertStringNotContainsString('swagger', strtolower($response->getContent())); + } + } + + public function test_documentation_can_be_enabled_in_a_debug_test_environment(): void + { + config([ + 'app.debug' => true, + 'app.swagger_enabled' => true, + ]); + + $response = $this->get('/swagger/json'); + + $response->assertOk(); + $response->assertJsonStructure(['openapi', 'paths']); + } +} diff --git a/tests/Unit/Services/AdminSmsChallengeServiceTest.php b/tests/Unit/Services/AdminSmsChallengeServiceTest.php new file mode 100644 index 0000000..ceada2f --- /dev/null +++ b/tests/Unit/Services/AdminSmsChallengeServiceTest.php @@ -0,0 +1,133 @@ + 'test-key', + 'admin-sms.cache_store' => 'array', + ]); + Cache::store('array')->flush(); + } + + public function test_challenge_is_six_digits_hashed_and_single_use(): void + { + $service = app(AdminSmsChallengeService::class); + $sentCode = null; + $challengeId = $service->issueChallenge('13800138000', '127.0.0.1', function ($code) use (&$sentCode) { + $sentCode = $code; + return true; + }); + + $this->assertNotNull($challengeId); + $this->assertMatchesRegularExpression('/^\d{6}$/', $sentCode); + $stored = Cache::store('array')->get($service->challengeKey($challengeId)); + $this->assertArrayNotHasKey('code', $stored); + $this->assertNotSame($sentCode, $stored['code_hash']); + $this->assertTrue(Hash::check($sentCode, $stored['code_hash'])); + + $admin = new Admin(); + $admin->forceFill(['id' => 7, 'mobile' => '13800138000']); + $success = $service->verify($challengeId, '13800138000', $sentCode, '127.0.0.1', $admin); + $replay = $service->verify($challengeId, '13800138000', $sentCode, '127.0.0.1', $admin); + + $this->assertTrue($success['ok']); + $this->assertFalse($replay['ok']); + } + + public function test_fifth_failed_attempt_locks_and_invalidates_challenge(): void + { + $service = app(AdminSmsChallengeService::class); + $challengeId = $service->issueChallenge('13800138000', '127.0.0.1', fn () => true); + $admin = new Admin(); + $admin->forceFill(['id' => 7, 'mobile' => '13800138000']); + + $result = null; + for ($attempt = 0; $attempt < 5; $attempt++) { + $result = $service->verify($challengeId, '13800138000', '000000', '127.0.0.1', $admin); + } + + $this->assertFalse($result['ok']); + $this->assertTrue($result['locked']); + $this->assertNull(Cache::store('array')->get($service->challengeKey($challengeId))); + } + + public function test_phone_send_limit_allows_one_request_per_minute(): void + { + $service = app(AdminSmsChallengeService::class); + + $this->assertTrue($service->canSend('13800138000')); + $this->assertFalse($service->canSend('13800138000')); + } + + public function test_ip_limit_applies_across_multiple_mobile_numbers(): void + { + config([ + 'admin-sms.ip_max_failures' => 2, + 'admin-sms.phone_max_failures' => 10, + ]); + $service = app(AdminSmsChallengeService::class); + $admin = new Admin(); + $admin->forceFill(['id' => 7, 'mobile' => '13800138000']); + + foreach (['13800138000', '13900139000'] as $mobile) { + $challengeId = $service->issueChallenge($mobile, '127.0.0.1', fn () => true); + $result = $service->verify($challengeId, $mobile, '000000', '127.0.0.1', $mobile === $admin->mobile ? $admin : null); + $this->assertFalse($result['ok']); + } + + $third = $service->issueChallenge('13700137000', '127.0.0.1', fn () => true); + $result = $service->verify($third, '13700137000', '000000', '127.0.0.1', null); + $this->assertTrue($result['locked']); + } + + public function test_account_lock_applies_across_challenges(): void + { + config([ + 'admin-sms.account_max_failures' => 2, + 'admin-sms.phone_max_failures' => 10, + 'admin-sms.ip_max_failures' => 30, + ]); + $service = app(AdminSmsChallengeService::class); + $admin = new Admin(); + $admin->forceFill(['id' => 8, 'mobile' => '13800138000']); + + for ($attempt = 0; $attempt < 2; $attempt++) { + $challengeId = $service->issueChallenge('13800138000', '127.0.0.' . ($attempt + 1), fn () => true); + $result = $service->verify($challengeId, '13800138000', '000000', '127.0.0.' . ($attempt + 1), $admin); + } + + $this->assertTrue($result['locked']); + $third = $service->issueChallenge('13800138000', '127.0.0.3', fn () => true); + $result = $service->verify($third, '13800138000', '000000', '127.0.0.3', $admin); + $this->assertTrue($result['locked']); + } + + public function test_production_sms_sending_is_restricted_to_configured_ips(): void + { + config([ + 'admin-sms.allowed_ips' => ['10.0.0.8'], + ]); + $this->app->instance('env', 'production'); + + $service = app(AdminSmsChallengeService::class); + + $this->assertFalse($service->canSend('13800138000', '10.0.0.9')); + $this->assertTrue($service->canSend('13800138000', '10.0.0.8')); + + config(['admin-sms.allowed_ips' => []]); + $this->assertTrue($service->canSend('13900139000', '10.0.0.9')); + + $this->app->instance('env', 'testing'); + } +}