Compare commits
13 Commits
ac580599b3
...
0.2.3
| Author | SHA1 | Date | |
|---|---|---|---|
| 2d913e397f | |||
| 74bc8aa498 | |||
| 5d747faee1 | |||
| 7bd8eeca77 | |||
| 782b2dd82e | |||
| f9c0abb3a0 | |||
| c5300591e6 | |||
| f96629566f | |||
| 8d581ac638 | |||
| acc80074ea | |||
| 62d28be032 | |||
| 5b956e1365 | |||
| 7485ba16e6 |
115
.gitea/workflows/ci.yml
Normal file
115
.gitea/workflows/ci.yml
Normal file
@@ -0,0 +1,115 @@
|
||||
name: CI
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- Django
|
||||
workflow_dispatch:
|
||||
inputs:
|
||||
version:
|
||||
description: 版本号(如 0.2.2),为空则自动生成
|
||||
required: false
|
||||
|
||||
concurrency:
|
||||
group: ci-${{ github.ref }}
|
||||
cancel-in-progress: true
|
||||
|
||||
jobs:
|
||||
docker-ci:
|
||||
if: github.event_name == 'workflow_dispatch' || (github.event_name == 'push' && contains(github.event.head_commit.message, '[ci]'))
|
||||
runs-on: ubuntu-latest
|
||||
timeout-minutes: 40
|
||||
env:
|
||||
DJANGO_SECRET_KEY: ${{ secrets.DJANGO_SECRET_KEY }}
|
||||
DJANGO_DEBUG: "False"
|
||||
DJANGO_ALLOWED_HOSTS: "127.0.0.1,localhost"
|
||||
IMAGE_NAME: achievement_inputing_ci
|
||||
ALIST_URL: https://alist.spdis.top
|
||||
ALIST_USER: ${{ secrets.ALIST_USER }}
|
||||
ALIST_PASSWORD: ${{ secrets.ALIST_PASSWORD }}
|
||||
GITEA_SERVER: ${{ github.server_url }}
|
||||
GITEA_REPO: ${{ github.repository }}
|
||||
RELEASE_TOKEN: ${{ secrets.token }}
|
||||
steps:
|
||||
- name: Ensure source present
|
||||
env:
|
||||
SERVER: ${{ github.server_url }}
|
||||
REPO: ${{ github.repository }}
|
||||
REF: ${{ github.ref }}
|
||||
SHA: ${{ github.sha }}
|
||||
TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||
run: |
|
||||
if [ -f "$GITHUB_WORKSPACE/Dockerfile" ]; then exit 0; fi
|
||||
mkdir -p "$GITHUB_WORKSPACE"
|
||||
cd "$GITHUB_WORKSPACE"
|
||||
git init .
|
||||
if [ -z "$TOKEN" ]; then
|
||||
git fetch --depth=1 "$SERVER/$REPO.git" "$REF"
|
||||
else
|
||||
git -c http.extraHeader="Authorization: Bearer $TOKEN" fetch --depth=1 "$SERVER/$REPO.git" "$REF"
|
||||
fi
|
||||
git checkout FETCH_HEAD
|
||||
- name: Derive version
|
||||
run: |
|
||||
msg="${{ github.event.head_commit.message }}"
|
||||
ver_input="${{ github.event.inputs.version }}"
|
||||
ver=""
|
||||
if [ -n "$ver_input" ]; then
|
||||
ver="$ver_input"
|
||||
else
|
||||
ver=$(echo "$msg" | grep -Eo "\[[0-9]+(\.[0-9]+){1,}\]" | head -n1 | tr -d '[]')
|
||||
fi
|
||||
if [ -z "$ver" ]; then
|
||||
ver="$(date +%Y%m%d%H%M)-${GITHUB_SHA:0:7}"
|
||||
fi
|
||||
echo "VERSION=$ver" >> $GITHUB_ENV
|
||||
- name: Build application image
|
||||
run: |
|
||||
docker build -t "$IMAGE_NAME:$VERSION" -f "$GITHUB_WORKSPACE/Dockerfile" "$GITHUB_WORKSPACE"
|
||||
- name: Output image info
|
||||
run: |
|
||||
docker image inspect "$IMAGE_NAME:$VERSION" --format '{{.Id}} {{.Size}}'
|
||||
- name: Export image tar
|
||||
run: |
|
||||
ART="achievement_inputing_ci_${VERSION}.tar"
|
||||
docker save -o "$GITHUB_WORKSPACE/$ART" "$IMAGE_NAME:$VERSION"
|
||||
echo "$ART" > "$GITHUB_WORKSPACE/.artifact_name"
|
||||
- name: Upload to Alist
|
||||
run: |
|
||||
set -e
|
||||
ART=$(cat "$GITHUB_WORKSPACE/.artifact_name")
|
||||
BASE="${ALIST_URL%/}"
|
||||
curl -sS -o "$GITHUB_WORKSPACE/login.json" -w "%{http_code}" -X POST "$BASE/api/auth/login" -H "Content-Type: application/json" -d "{\"username\":\"$ALIST_USER\",\"password\":\"$ALIST_PASSWORD\"}" > "$GITHUB_WORKSPACE/login.code"
|
||||
if [ "$(cat "$GITHUB_WORKSPACE/login.code")" != "200" ]; then
|
||||
echo login_failed
|
||||
cat "$GITHUB_WORKSPACE/login.json"
|
||||
exit 1
|
||||
fi
|
||||
TOKEN=$(sed -n 's/.*"token":"\([^"]*\)".*/\1/p' "$GITHUB_WORKSPACE/login.json")
|
||||
if [ -z "$TOKEN" ]; then
|
||||
TOKEN=$(sed -n 's/.*"auth":"\([^"]*\)".*/\1/p' "$GITHUB_WORKSPACE/login.json")
|
||||
fi
|
||||
if [ -z "$TOKEN" ]; then
|
||||
echo token_not_found
|
||||
cat "$GITHUB_WORKSPACE/login.json"
|
||||
exit 1
|
||||
fi
|
||||
curl -sS -X POST "$BASE/api/fs/mkdir" -H "Authorization: $TOKEN" -H "Content-Type: application/json" -d "{\"path\":\"/ci\"}" >/dev/null 2>&1 || true
|
||||
UPLOAD_STATUS=$(curl -sS -w "%{http_code}" -o /dev/null -X PUT "$BASE/api/fs/form" -H "Authorization: $TOKEN" -F "path=/ci" -F "file=@$GITHUB_WORKSPACE/$ART;type=application/x-tar")
|
||||
if [ "$UPLOAD_STATUS" -ge 400 ]; then
|
||||
UPLOAD_STATUS=$(curl -sS -w "%{http_code}" -o /dev/null -X PUT "$BASE/api/fs/form" -H "Authorization: Bearer $TOKEN" -F "path=/ci" -F "file=@$GITHUB_WORKSPACE/$ART;type=application/x-tar")
|
||||
fi
|
||||
if [ "$UPLOAD_STATUS" -ge 400 ]; then
|
||||
echo upload_failed
|
||||
exit 1
|
||||
fi
|
||||
- name: Create release with download link
|
||||
if: env.RELEASE_TOKEN != ''
|
||||
run: |
|
||||
ART=$(cat "$GITHUB_WORKSPACE/.artifact_name")
|
||||
BRANCH=${GITHUB_REF#refs/heads/}
|
||||
TAG="$VERSION"
|
||||
NAME="$VERSION"
|
||||
DL="${ALIST_URL%/}/ci/$ART"
|
||||
JSON=$(printf '{"tag_name":"%s","target_commitish":"%s","name":"%s","body":"%s"}' "$TAG" "$BRANCH" "$NAME" "$DL")
|
||||
curl -sS -X POST "$GITEA_SERVER/api/v1/repos/$GITEA_REPO/releases" -H "Content-Type: application/json" -H "Authorization: token $RELEASE_TOKEN" -d "$JSON"
|
||||
@@ -167,6 +167,9 @@ let currentId = '';
|
||||
let currentWriter = '';
|
||||
let currentImage = '';
|
||||
let allDataCache = []; // 缓存所有数据,避免重复请求
|
||||
let currentSearchQuery = ''; // 记录当前搜索查询
|
||||
let isFuzzySearch = false; // 记录当前是否为模糊搜索
|
||||
let isDeleting = false; // 标记是否正在删除
|
||||
|
||||
// 图片缩放相关变量
|
||||
let currentScale = 1;
|
||||
@@ -186,6 +189,8 @@ async function performSearch(type) {
|
||||
return;
|
||||
}
|
||||
|
||||
currentSearchQuery = query;
|
||||
isFuzzySearch = type === 'fuzzy';
|
||||
showSearchLoading();
|
||||
|
||||
try {
|
||||
@@ -244,6 +249,7 @@ function showSearchMessage(message, type = '') {
|
||||
|
||||
// 加载所有数据
|
||||
async function loadAllData() {
|
||||
currentSearchQuery = '';
|
||||
showSearchLoading();
|
||||
|
||||
try {
|
||||
@@ -282,6 +288,7 @@ function displayAllData(data) {
|
||||
function clearSearch() {
|
||||
searchQueryInput.value = '';
|
||||
searchResultDiv.style.display = 'none';
|
||||
currentSearchQuery = '';
|
||||
|
||||
// 如果有缓存数据,显示全部
|
||||
if (allDataCache.length > 0) {
|
||||
@@ -488,15 +495,9 @@ async function saveEdit(){
|
||||
alert('保存成功');
|
||||
closeModal();
|
||||
// 重新加载数据以显示更新
|
||||
if (searchResultDiv.style.display !== 'none') {
|
||||
if (currentSearchQuery) {
|
||||
// 如果当前显示的是搜索结果,重新执行搜索
|
||||
const query = searchQueryInput.value.trim();
|
||||
if (query) {
|
||||
const isFuzzy = document.querySelector('.search-result').textContent.includes('模糊');
|
||||
performSearch(isFuzzy ? 'fuzzy' : 'exact');
|
||||
} else {
|
||||
loadAllData();
|
||||
}
|
||||
performSearch(isFuzzySearch ? 'fuzzy' : 'exact');
|
||||
} else {
|
||||
loadAllData();
|
||||
}
|
||||
@@ -506,8 +507,20 @@ async function saveEdit(){
|
||||
}
|
||||
|
||||
async function doDelete(id){
|
||||
if (isDeleting) {
|
||||
alert('正在处理删除操作,请稍候...');
|
||||
return;
|
||||
}
|
||||
|
||||
if(!confirm('确认删除该记录?此操作不可撤销')) return;
|
||||
|
||||
isDeleting = true;
|
||||
const deleteButton = document.querySelector(`button[onclick="doDelete('${id}')"]`);
|
||||
if (deleteButton) {
|
||||
deleteButton.disabled = true;
|
||||
deleteButton.textContent = '删除中...';
|
||||
}
|
||||
|
||||
try {
|
||||
const response = await fetch(`/elastic/data/${id}/delete/`, {
|
||||
method:'DELETE',
|
||||
@@ -519,20 +532,32 @@ async function doDelete(id){
|
||||
if(data.status!=='success') throw new Error(data.message || '删除失败');
|
||||
|
||||
alert('删除成功');
|
||||
// 重新加载数据
|
||||
if (searchResultDiv.style.display !== 'none') {
|
||||
const query = searchQueryInput.value.trim();
|
||||
if (query) {
|
||||
const isFuzzy = document.querySelector('.search-result').textContent.includes('模糊');
|
||||
performSearch(isFuzzy ? 'fuzzy' : 'exact');
|
||||
// 清空缓存,确保下次加载获取最新数据
|
||||
allDataCache = [];
|
||||
|
||||
// 根据当前显示状态重新加载数据
|
||||
if (currentSearchQuery) {
|
||||
// 如果当前显示的是搜索结果,重新执行搜索
|
||||
performSearch(isFuzzySearch ? 'fuzzy' : 'exact');
|
||||
} else {
|
||||
loadAllData();
|
||||
// 修复:重新加载所有数据时,强制刷新缓存
|
||||
const response = await fetch('/elastic/all-data/');
|
||||
const data = await response.json();
|
||||
if (data.status === 'success') {
|
||||
allDataCache = data.data || [];
|
||||
displayAllData(allDataCache);
|
||||
} else {
|
||||
showSearchMessage(`加载数据失败: ${data.message || '未知错误'}`, 'error');
|
||||
}
|
||||
} else {
|
||||
loadAllData();
|
||||
}
|
||||
} catch (e) {
|
||||
alert(e.message||'删除失败');
|
||||
} finally {
|
||||
isDeleting = false;
|
||||
if (deleteButton) {
|
||||
deleteButton.disabled = false;
|
||||
deleteButton.textContent = '删除';
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user