Переместите отделение на основе пользователя, голосующего

Я являюсь новым здесь, но я люблю сайт. Я послал багажом другие подобные вопросы, но я не видел то, что я ищу.

Я - музыкант, и я делал "песню дня" вещь некоторое время, где я пишу немного песни каждый день. Я хочу отправить песни как <div>s внутри <li>. В отделениях я просто хочу простой MP3-плеер и "подобную" кнопку или кнопку "неприязни". Пользователь может голосовать, и песня переместится вверх или вниз <li> на основе количества голосов.

Я хочу сохранить это простым с математикой - просто вычитание неприязни от подобных в <li> массив и упорядочивание их от самого высокого до самого низкого.

Было бы хорошо иметь в распоряжении простую систему cookie, чтобы, по крайней мере, помешать кому-то голосовать много за все в одном нахождении, но я не слишком обеспокоен этим.

Я искал простой PHP или учебное руководство JavaScript на этом. Кто-либо может указать на меня в правильных направлениях?Спасибо!

5
задан Justin Johnson 1 January 2010 в 04:31
поделиться

2 ответа

Вам понадобится центральное место для хранения информации об этой композиции, в основном о голосах, но вы можете также хранить там информацию о других композициях (например, название, путь к музыкальному файлу и т.д.). Я предлагаю простую таблицу MySQL следующим образом

CREATE TABLE daily_song (
    daily_song_id SMALLINT UNSIGNED NOT NULL AUTO_INCREMENT,
    vote          INT          NOT NULL DEFAULT 0,
    title         VARCHAR(255) NOT NULL DEFAULT "" COMMENT "Name of the song",
    path          VARCHAR(255) NOT NULL DEFAULT "" COMMENT "Path to the song on the server",
    ctime         DATETIME     NOT NULL            COMMENT "Datetime the song was added",
    PRIMARY KEY(daily_song_id)
);

Я использовал следующую структуру HTML:

<ul id="daily-songs">
    <li id="song-id-1">
        <h3>Song 1</h3>
        <div class="voting-controls">
            <a href="#" class="vote-up">Up</a>
            <div class="votes">8</div>
            <a href="#" class="vote-down">Down</a>
        </div>
        <div class="player"></div>
    </li>
    <li id="song-id-2">
        <h3>Song 2</h3>
        <div class="player"></div>
        <div class="voting-controls">
            <a href="#" class="vote-up">Up</a>
            <div class="votes">5</div>
            <a href="#" class="vote-down">Down</a>
        </div>
    </li>
    <li id="song-id-3">
        <h3>Song 3</h3>
        <div class="player"></div>
        <div class="voting-controls">
            <a href="#" class="vote-up">Up</a>
            <div class="votes">4</div>
            <a href="#" class="vote-down">Down</a>
        </div>
    </li>
</ul>

И оттенок CSS

#daily-songs li { clear: both; list-style: none; }
#daily-songs h3 { margin: 0 10px 0 0; float: left; }
#daily-songs .voting-controls { height: 1em; }
#daily-songs .voting-controls * { float: left; }
#daily-songs .voting-controls .votes { padding: 0 10px; }

Вот JavaScript, использующий jQuery

$(function() {
    var listContainer = $("#daily-songs"),
        songs         = [];
    var songSort = function(a, b) {
        return +b.vote.text() - +a.vote.text();
    };

    var submitVote = function(song, delta) {
        $.post("vote.php", 
            {
                id:    song.node.attr("id").match(/\d+$/)[0],
                delta: delta,
                votes: song.vote.text() // temporary
            }, 
            function(data) {
                if ( isNaN(data) ) { return; }
                song.vote.text(data);

                // Re-order the song list
                $.each(songs.sort(songSort), function() {
                    listContainer.append(this.node);
                });
            }
        );
    };

    listContainer.find("li").each(function() {
        var $this = $(this); 
        var song  = {
            node: $this,
            vote: $this.find(".votes")
        };
        $this.find(".vote-up").click(function() {
            submitVote(song, 1);
        });
        $this.find(".vote-down").click(function() {
            submitVote(song, -1);
        });

        songs.push(song);
    });
});

И немного корешка PHP для vote.php:

<?php

$songId = !empty($_POST['id'])    ? (int)$_POST['id']    : 0;
$delta  = !empty($_POST['delta']) ? (int)$_POST['delta'] : 0;

if ( !$songId || !$delta ) {
    die("Invalid parameters");
}

// Make sure the voting value is within the valid rang
$delta = $delta > 0 ? 1 : -1;

// Check to see if user has already voted for this song,

// If they haven't voted yet, connect to the database

// If the database connection is succesful, update song entry
// UPDATE daily_song SET votes=votes+$delta WHERE daily_song_id=$songId

// If the UPDATE is successful, SELECT the new vote value
// SELECT vote FROM daily_song WHERE daily_song_id=$songId

// Output the new vote value

// But for now, just accept the current vote and apply the delta
echo $_POST['votes'] + $delta;

Я оставлю PHP для заполнения. Не должно быть слишком много растяжек. Дайте мне знать, если у вас возникнут вопросы.

:

<?php

$songId = !empty($_POST['id'])    ? (int)$_POST['id']    : 0;
$delta  = !empty($_POST['delta']) ? (int)$_POST['delta'] : 0;

if ( !$songId || !$delta ) {
    die("Invalid parameters");
}

// Make sure the voting value is within the valid rang
$delta = $delta > 0 ? 1 : -1;

// Check to see if user has already voted for this song,

// If they haven't voted yet, connect to the database

// If the database connection is succesful, update song entry
// UPDATE daily_song SET votes=votes+$delta WHERE daily_song_id=$songId

// If the UPDATE is successful, SELECT the new vote value
// SELECT vote FROM daily_song WHERE daily_song_id=$songId

// Output the new vote value

// But for now, just accept the current vote and apply the delta
echo $_POST['votes'] + $delta;

.

4
ответ дан 15 December 2019 в 01:03
поделиться
[

] Да, таблица MySQL кажется критичной, чтобы поддерживать голоса по мере их сбора. Затем функция возвращает или выводит []

  • [] в отсортированном порядке, по мере того, как вы строите страницу. Если Джастин не вернётся с большим количеством голосов, я добавлю ещё позже.[

    ].
  • 0
    ответ дан 15 December 2019 в 01:03
    поделиться
    Другие вопросы по тегам:

    Похожие вопросы: