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 currentWriter = '';
|
||||||
let currentImage = '';
|
let currentImage = '';
|
||||||
let allDataCache = []; // 缓存所有数据,避免重复请求
|
let allDataCache = []; // 缓存所有数据,避免重复请求
|
||||||
|
let currentSearchQuery = ''; // 记录当前搜索查询
|
||||||
|
let isFuzzySearch = false; // 记录当前是否为模糊搜索
|
||||||
|
let isDeleting = false; // 标记是否正在删除
|
||||||
|
|
||||||
// 图片缩放相关变量
|
// 图片缩放相关变量
|
||||||
let currentScale = 1;
|
let currentScale = 1;
|
||||||
@@ -186,6 +189,8 @@ async function performSearch(type) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
currentSearchQuery = query;
|
||||||
|
isFuzzySearch = type === 'fuzzy';
|
||||||
showSearchLoading();
|
showSearchLoading();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -244,6 +249,7 @@ function showSearchMessage(message, type = '') {
|
|||||||
|
|
||||||
// 加载所有数据
|
// 加载所有数据
|
||||||
async function loadAllData() {
|
async function loadAllData() {
|
||||||
|
currentSearchQuery = '';
|
||||||
showSearchLoading();
|
showSearchLoading();
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -282,6 +288,7 @@ function displayAllData(data) {
|
|||||||
function clearSearch() {
|
function clearSearch() {
|
||||||
searchQueryInput.value = '';
|
searchQueryInput.value = '';
|
||||||
searchResultDiv.style.display = 'none';
|
searchResultDiv.style.display = 'none';
|
||||||
|
currentSearchQuery = '';
|
||||||
|
|
||||||
// 如果有缓存数据,显示全部
|
// 如果有缓存数据,显示全部
|
||||||
if (allDataCache.length > 0) {
|
if (allDataCache.length > 0) {
|
||||||
@@ -488,15 +495,9 @@ async function saveEdit(){
|
|||||||
alert('保存成功');
|
alert('保存成功');
|
||||||
closeModal();
|
closeModal();
|
||||||
// 重新加载数据以显示更新
|
// 重新加载数据以显示更新
|
||||||
if (searchResultDiv.style.display !== 'none') {
|
if (currentSearchQuery) {
|
||||||
// 如果当前显示的是搜索结果,重新执行搜索
|
// 如果当前显示的是搜索结果,重新执行搜索
|
||||||
const query = searchQueryInput.value.trim();
|
performSearch(isFuzzySearch ? 'fuzzy' : 'exact');
|
||||||
if (query) {
|
|
||||||
const isFuzzy = document.querySelector('.search-result').textContent.includes('模糊');
|
|
||||||
performSearch(isFuzzy ? 'fuzzy' : 'exact');
|
|
||||||
} else {
|
|
||||||
loadAllData();
|
|
||||||
}
|
|
||||||
} else {
|
} else {
|
||||||
loadAllData();
|
loadAllData();
|
||||||
}
|
}
|
||||||
@@ -506,8 +507,20 @@ async function saveEdit(){
|
|||||||
}
|
}
|
||||||
|
|
||||||
async function doDelete(id){
|
async function doDelete(id){
|
||||||
|
if (isDeleting) {
|
||||||
|
alert('正在处理删除操作,请稍候...');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if(!confirm('确认删除该记录?此操作不可撤销')) return;
|
if(!confirm('确认删除该记录?此操作不可撤销')) return;
|
||||||
|
|
||||||
|
isDeleting = true;
|
||||||
|
const deleteButton = document.querySelector(`button[onclick="doDelete('${id}')"]`);
|
||||||
|
if (deleteButton) {
|
||||||
|
deleteButton.disabled = true;
|
||||||
|
deleteButton.textContent = '删除中...';
|
||||||
|
}
|
||||||
|
|
||||||
try {
|
try {
|
||||||
const response = await fetch(`/elastic/data/${id}/delete/`, {
|
const response = await fetch(`/elastic/data/${id}/delete/`, {
|
||||||
method:'DELETE',
|
method:'DELETE',
|
||||||
@@ -519,20 +532,32 @@ async function doDelete(id){
|
|||||||
if(data.status!=='success') throw new Error(data.message || '删除失败');
|
if(data.status!=='success') throw new Error(data.message || '删除失败');
|
||||||
|
|
||||||
alert('删除成功');
|
alert('删除成功');
|
||||||
// 重新加载数据
|
// 清空缓存,确保下次加载获取最新数据
|
||||||
if (searchResultDiv.style.display !== 'none') {
|
allDataCache = [];
|
||||||
const query = searchQueryInput.value.trim();
|
|
||||||
if (query) {
|
// 根据当前显示状态重新加载数据
|
||||||
const isFuzzy = document.querySelector('.search-result').textContent.includes('模糊');
|
if (currentSearchQuery) {
|
||||||
performSearch(isFuzzy ? 'fuzzy' : 'exact');
|
// 如果当前显示的是搜索结果,重新执行搜索
|
||||||
|
performSearch(isFuzzySearch ? 'fuzzy' : 'exact');
|
||||||
} else {
|
} 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) {
|
} catch (e) {
|
||||||
alert(e.message||'删除失败');
|
alert(e.message||'删除失败');
|
||||||
|
} finally {
|
||||||
|
isDeleting = false;
|
||||||
|
if (deleteButton) {
|
||||||
|
deleteButton.disabled = false;
|
||||||
|
deleteButton.textContent = '删除';
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user