<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="zh-Hans-CN">
	<id>https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:ImageCleaner?action=history&amp;feed=atom</id>
	<title>微件:ImageCleaner - 版本历史</title>
	<link rel="self" type="application/atom+xml" href="https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:ImageCleaner?action=history&amp;feed=atom"/>
	<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/w/%E5%BE%AE%E4%BB%B6:ImageCleaner?action=history"/>
	<updated>2026-07-26T19:29:16Z</updated>
	<subtitle>本wiki上该页面的版本历史</subtitle>
	<generator>MediaWiki 1.43.6</generator>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:ImageCleaner&amp;diff=12794&amp;oldid=prev</id>
		<title>2026年7月20日 (一) 01:17 愤怒的郎朗</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:ImageCleaner&amp;diff=12794&amp;oldid=prev"/>
		<updated>2026-07-20T01:17:14Z</updated>

		<summary type="html">&lt;p&gt;&lt;/p&gt;
&lt;a href=&quot;https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:ImageCleaner&amp;amp;diff=12794&amp;amp;oldid=12792&quot;&gt;显示更改&lt;/a&gt;</summary>
		<author><name>愤怒的郎朗</name></author>
	</entry>
	<entry>
		<id>https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:ImageCleaner&amp;diff=12792&amp;oldid=prev</id>
		<title>愤怒的郎朗：​创建页面，内容为“&lt;includeonly&gt; &lt;style&gt; .image-cleaner-wrap {     margin: 15px 0; } .image-cleaner-btn {     padding: 10px 24px;     background: #f44336;     color: #fff;     border: none;     border-radius: 8px;     cursor: pointer;     font-size: 14px;     margin: 5px; } .image-cleaner-btn:hover { background: #d32f2f; } .image-cleaner-btn:disabled { background: #ccc; cursor: not-allowed; } .image-cleaner-result {     margin-top: 10px;     max-height: 500px;     overflow-y: aut…”</title>
		<link rel="alternate" type="text/html" href="https://new.pvzhe.wiki/index.php?title=%E5%BE%AE%E4%BB%B6:ImageCleaner&amp;diff=12792&amp;oldid=prev"/>
		<updated>2026-07-20T01:14:12Z</updated>

		<summary type="html">&lt;p&gt;创建页面，内容为“&amp;lt;includeonly&amp;gt; &amp;lt;style&amp;gt; .image-cleaner-wrap {     margin: 15px 0; } .image-cleaner-btn {     padding: 10px 24px;     background: #f44336;     color: #fff;     border: none;     border-radius: 8px;     cursor: pointer;     font-size: 14px;     margin: 5px; } .image-cleaner-btn:hover { background: #d32f2f; } .image-cleaner-btn:disabled { background: #ccc; cursor: not-allowed; } .image-cleaner-result {     margin-top: 10px;     max-height: 500px;     overflow-y: aut…”&lt;/p&gt;
&lt;p&gt;&lt;b&gt;新页面&lt;/b&gt;&lt;/p&gt;&lt;div&gt;&amp;lt;includeonly&amp;gt;&lt;br /&gt;
&amp;lt;style&amp;gt;&lt;br /&gt;
.image-cleaner-wrap {&lt;br /&gt;
    margin: 15px 0;&lt;br /&gt;
}&lt;br /&gt;
.image-cleaner-btn {&lt;br /&gt;
    padding: 10px 24px;&lt;br /&gt;
    background: #f44336;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    border: none;&lt;br /&gt;
    border-radius: 8px;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 14px;&lt;br /&gt;
    margin: 5px;&lt;br /&gt;
}&lt;br /&gt;
.image-cleaner-btn:hover { background: #d32f2f; }&lt;br /&gt;
.image-cleaner-btn:disabled { background: #ccc; cursor: not-allowed; }&lt;br /&gt;
.image-cleaner-result {&lt;br /&gt;
    margin-top: 10px;&lt;br /&gt;
    max-height: 500px;&lt;br /&gt;
    overflow-y: auto;&lt;br /&gt;
}&lt;br /&gt;
.image-item {&lt;br /&gt;
    display: flex;&lt;br /&gt;
    align-items: center;&lt;br /&gt;
    padding: 8px;&lt;br /&gt;
    border-bottom: 1px solid #eee;&lt;br /&gt;
    font-size: 13px;&lt;br /&gt;
    justify-content: space-between;&lt;br /&gt;
}&lt;br /&gt;
.image-item img {&lt;br /&gt;
    width: 48px;&lt;br /&gt;
    height: 48px;&lt;br /&gt;
    object-fit: contain;&lt;br /&gt;
    margin-right: 10px;&lt;br /&gt;
    border-radius: 4px;&lt;br /&gt;
}&lt;br /&gt;
.image-item .file-info {&lt;br /&gt;
    flex: 1;&lt;br /&gt;
}&lt;br /&gt;
.image-item .file-name {&lt;br /&gt;
    font-weight: bold;&lt;br /&gt;
}&lt;br /&gt;
.image-item .file-usage {&lt;br /&gt;
    font-size: 11px;&lt;br /&gt;
    color: #888;&lt;br /&gt;
}&lt;br /&gt;
.image-item .delete-btn {&lt;br /&gt;
    padding: 4px 12px;&lt;br /&gt;
    background: #f44336;&lt;br /&gt;
    color: #fff;&lt;br /&gt;
    border: none;&lt;br /&gt;
    border-radius: 4px;&lt;br /&gt;
    cursor: pointer;&lt;br /&gt;
    font-size: 12px;&lt;br /&gt;
}&lt;br /&gt;
.image-item .delete-btn:hover { background: #d32f2f; }&lt;br /&gt;
.image-item .delete-btn:disabled { background: #ccc; cursor: not-allowed; }&lt;br /&gt;
.image-progress {&lt;br /&gt;
    margin: 10px 0;&lt;br /&gt;
    font-size: 13px;&lt;br /&gt;
    color: #888;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/style&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div class=&amp;quot;image-cleaner-wrap&amp;quot;&amp;gt;&lt;br /&gt;
    &amp;lt;button class=&amp;quot;image-cleaner-btn&amp;quot; id=&amp;quot;img-scan-btn&amp;quot;&amp;gt;🔍 扫描未使用图片&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;button class=&amp;quot;image-cleaner-btn&amp;quot; id=&amp;quot;img-delete-all-btn&amp;quot; style=&amp;quot;display:none;&amp;quot;&amp;gt;🗑️ 一键清除全部&amp;lt;/button&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;image-progress&amp;quot; id=&amp;quot;img-progress&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
    &amp;lt;div class=&amp;quot;image-cleaner-result&amp;quot; id=&amp;quot;img-result&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;script&amp;gt;&lt;br /&gt;
(function() {&lt;br /&gt;
    var unusedImages = [];&lt;br /&gt;
    var allImages = [];&lt;br /&gt;
    var totalChecked = 0;&lt;br /&gt;
    var batchSize = 10;&lt;br /&gt;
&lt;br /&gt;
    function fetchAllImages(continueFrom) {&lt;br /&gt;
        $(&amp;#039;#img-progress&amp;#039;).text(&amp;#039;正在获取图片列表...&amp;#039;);&lt;br /&gt;
        $.getJSON(mw.util.wikiScript(&amp;#039;api&amp;#039;), {&lt;br /&gt;
            action: &amp;#039;query&amp;#039;,&lt;br /&gt;
            list: &amp;#039;allimages&amp;#039;,&lt;br /&gt;
            ailimit: 50,&lt;br /&gt;
            aifrom: continueFrom || undefined,&lt;br /&gt;
            format: &amp;#039;json&amp;#039;&lt;br /&gt;
        }, function(data) {&lt;br /&gt;
            if (data.query &amp;amp;&amp;amp; data.query.allimages) {&lt;br /&gt;
                allImages = allImages.concat(data.query.allimages);&lt;br /&gt;
                if (data.continue &amp;amp;&amp;amp; data.continue.aifrom) {&lt;br /&gt;
                    fetchAllImages(data.continue.aifrom);&lt;br /&gt;
                } else {&lt;br /&gt;
                    checkUsage();&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function checkUsage() {&lt;br /&gt;
        unusedImages = [];&lt;br /&gt;
        totalChecked = 0;&lt;br /&gt;
        var total = allImages.length;&lt;br /&gt;
        $(&amp;#039;#img-progress&amp;#039;).text(&amp;#039;正在检查引用... 0/&amp;#039; + total);&lt;br /&gt;
        $(&amp;#039;#img-scan-btn&amp;#039;).prop(&amp;#039;disabled&amp;#039;, true);&lt;br /&gt;
&lt;br /&gt;
        function processBatch(index) {&lt;br /&gt;
            var batch = allImages.slice(index, index + batchSize);&lt;br /&gt;
            if (batch.length === 0) {&lt;br /&gt;
                showResults();&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            var titles = batch.map(function(img) { return &amp;#039;File:&amp;#039; + img.name; }).join(&amp;#039;|&amp;#039;);&lt;br /&gt;
            $.getJSON(mw.util.wikiScript(&amp;#039;api&amp;#039;), {&lt;br /&gt;
                action: &amp;#039;query&amp;#039;,&lt;br /&gt;
                list: &amp;#039;imageusage&amp;#039;,&lt;br /&gt;
                iutitles: titles,&lt;br /&gt;
                iulimit: 1,&lt;br /&gt;
                format: &amp;#039;json&amp;#039;&lt;br /&gt;
            }, function(data) {&lt;br /&gt;
                var usedFiles = {};&lt;br /&gt;
                if (data.query &amp;amp;&amp;amp; data.query.imageusage) {&lt;br /&gt;
                    data.query.imageusage.forEach(function(iu) {&lt;br /&gt;
                        usedFiles[iu.title.replace(&amp;#039;File:&amp;#039;, &amp;#039;&amp;#039;)] = true;&lt;br /&gt;
                    });&lt;br /&gt;
                }&lt;br /&gt;
                batch.forEach(function(img) {&lt;br /&gt;
                    totalChecked++;&lt;br /&gt;
                    if (!usedFiles[img.name]) {&lt;br /&gt;
                        unusedImages.push(img);&lt;br /&gt;
                    }&lt;br /&gt;
                });&lt;br /&gt;
                $(&amp;#039;#img-progress&amp;#039;).text(&amp;#039;正在检查引用... &amp;#039; + totalChecked + &amp;#039;/&amp;#039; + total);&lt;br /&gt;
                setTimeout(function() { processBatch(index + batchSize); }, 200);&lt;br /&gt;
            });&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        processBatch(0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function showResults() {&lt;br /&gt;
        $(&amp;#039;#img-scan-btn&amp;#039;).prop(&amp;#039;disabled&amp;#039;, false);&lt;br /&gt;
        $(&amp;#039;#img-progress&amp;#039;).text(&amp;#039;共 &amp;#039; + allImages.length + &amp;#039; 张图片，&amp;#039; + unusedImages.length + &amp;#039; 张未使用&amp;#039;);&lt;br /&gt;
        var $result = $(&amp;#039;#img-result&amp;#039;).empty();&lt;br /&gt;
&lt;br /&gt;
        if (unusedImages.length === 0) {&lt;br /&gt;
            $result.html(&amp;#039;&amp;lt;p style=&amp;quot;color:#4CAF50;&amp;quot;&amp;gt;✅ 所有图片都被引用，没有未使用的图片！&amp;lt;/p&amp;gt;&amp;#039;);&lt;br /&gt;
            $(&amp;#039;#img-delete-all-btn&amp;#039;).hide();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        $(&amp;#039;#img-delete-all-btn&amp;#039;).show();&lt;br /&gt;
&lt;br /&gt;
        unusedImages.forEach(function(img) {&lt;br /&gt;
            var $item = $(&amp;#039;&amp;lt;div class=&amp;quot;image-item&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
            $item.append(&amp;#039;&amp;lt;img src=&amp;quot;&amp;#039; + img.url + &amp;#039;&amp;quot; alt=&amp;quot;&amp;#039; + img.name + &amp;#039;&amp;quot;&amp;gt;&amp;#039;);&lt;br /&gt;
            $item.append(&amp;#039;&amp;lt;div class=&amp;quot;file-info&amp;quot;&amp;gt;&amp;lt;div class=&amp;quot;file-name&amp;quot;&amp;gt;&amp;#039; + img.name + &amp;#039;&amp;lt;/div&amp;gt;&amp;lt;div class=&amp;quot;file-usage&amp;quot;&amp;gt;未使用&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&amp;#039;);&lt;br /&gt;
            $item.append(&amp;#039;&amp;lt;button class=&amp;quot;delete-btn&amp;quot; data-name=&amp;quot;&amp;#039; + img.name + &amp;#039;&amp;quot;&amp;gt;删除&amp;lt;/button&amp;gt;&amp;#039;);&lt;br /&gt;
            $result.append($item);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    function deleteImage(name, $btn) {&lt;br /&gt;
        if (!confirm(&amp;#039;确定删除 &amp;#039; + name + &amp;#039; 吗？此操作不可恢复！&amp;#039;)) return;&lt;br /&gt;
        $btn.prop(&amp;#039;disabled&amp;#039;, true).text(&amp;#039;删除中...&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        var api = new mw.Api();&lt;br /&gt;
        api.postWithEditToken({&lt;br /&gt;
            action: &amp;#039;delete&amp;#039;,&lt;br /&gt;
            title: &amp;#039;File:&amp;#039; + name,&lt;br /&gt;
            reason: &amp;#039;清理未使用图片&amp;#039;&lt;br /&gt;
        }).then(function() {&lt;br /&gt;
            $btn.text(&amp;#039;✅ 已删除&amp;#039;).css(&amp;#039;background&amp;#039;, &amp;#039;#4CAF50&amp;#039;);&lt;br /&gt;
            $btn.closest(&amp;#039;.image-item&amp;#039;).fadeOut(1000, function() { $(this).remove(); });&lt;br /&gt;
        }).fail(function() {&lt;br /&gt;
            $btn.prop(&amp;#039;disabled&amp;#039;, false).text(&amp;#039;❌ 失败&amp;#039;);&lt;br /&gt;
        });&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $(&amp;#039;#img-scan-btn&amp;#039;).click(fetchAllImages);&lt;br /&gt;
&lt;br /&gt;
    $(&amp;#039;#img-delete-all-btn&amp;#039;).click(function() {&lt;br /&gt;
        if (!confirm(&amp;#039;确定删除全部 &amp;#039; + unusedImages.length + &amp;#039; 张未使用图片吗？此操作不可恢复！&amp;#039;)) return;&lt;br /&gt;
        var $btn = $(this);&lt;br /&gt;
        $btn.prop(&amp;#039;disabled&amp;#039;, true).text(&amp;#039;删除中...&amp;#039;);&lt;br /&gt;
&lt;br /&gt;
        var api = new mw.Api();&lt;br /&gt;
        var done = 0;&lt;br /&gt;
        var total = unusedImages.length;&lt;br /&gt;
        var failed = [];&lt;br /&gt;
&lt;br /&gt;
        unusedImages.forEach(function(img) {&lt;br /&gt;
            api.postWithEditToken({&lt;br /&gt;
                action: &amp;#039;delete&amp;#039;,&lt;br /&gt;
                title: &amp;#039;File:&amp;#039; + img.name,&lt;br /&gt;
                reason: &amp;#039;批量清理未使用图片&amp;#039;&lt;br /&gt;
            }).then(function() {&lt;br /&gt;
                done++;&lt;br /&gt;
                $btn.text(&amp;#039;删除中... &amp;#039; + done + &amp;#039;/&amp;#039; + total);&lt;br /&gt;
                if (done &amp;gt;= total) finishDelete($btn, failed);&lt;br /&gt;
            }).fail(function() {&lt;br /&gt;
                done++;&lt;br /&gt;
                failed.push(img.name);&lt;br /&gt;
                if (done &amp;gt;= total) finishDelete($btn, failed);&lt;br /&gt;
            });&lt;br /&gt;
        });&lt;br /&gt;
    });&lt;br /&gt;
&lt;br /&gt;
    function finishDelete($btn, failed) {&lt;br /&gt;
        if (failed.length === 0) {&lt;br /&gt;
            $btn.text(&amp;#039;✅ 全部删除完成&amp;#039;).css(&amp;#039;background&amp;#039;, &amp;#039;#4CAF50&amp;#039;);&lt;br /&gt;
            $(&amp;#039;#img-result&amp;#039;).html(&amp;#039;&amp;lt;p style=&amp;quot;color:#4CAF50;&amp;quot;&amp;gt;✅ 所有未使用图片已删除！&amp;lt;/p&amp;gt;&amp;#039;);&lt;br /&gt;
        } else {&lt;br /&gt;
            $btn.text(&amp;#039;⚠️ &amp;#039; + failed.length + &amp;#039; 张删除失败&amp;#039;).prop(&amp;#039;disabled&amp;#039;, false);&lt;br /&gt;
        }&lt;br /&gt;
        $(&amp;#039;#img-progress&amp;#039;).text(&amp;#039;&amp;#039;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    $(&amp;#039;#img-result&amp;#039;).on(&amp;#039;click&amp;#039;, &amp;#039;.delete-btn&amp;#039;, function() {&lt;br /&gt;
        var name = $(this).data(&amp;#039;name&amp;#039;);&lt;br /&gt;
        deleteImage(name, $(this));&lt;br /&gt;
    });&lt;br /&gt;
})();&lt;br /&gt;
&amp;lt;/script&amp;gt;&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;/div&gt;</summary>
		<author><name>愤怒的郎朗</name></author>
	</entry>
</feed>