1

我正在改造一个允许预订每年举办的活动的网站。每个活动都有自己的页面,目前完全是静态的:每个页面都包含标题、描述和按地点排序的日期列表。每年当有新的日期可用时,必须有人进去手动更改每个日期的 HTML,这显然是一项费力的任务。

我想通过拥有一个存储日期(可以零碎地添加)的CSV文件来稍微自动化这个过程,然后页面在加载时从那里获取相关日期。我对服务器端的东西没有经验,但我对 jQuery 有一点了解,而且我觉得我应该能够使用 AJAX 或类似的东西来做到这一点——但是怎么做呢?

4

4 回答 4

2

我认为 ivoszz 的想法对你来说是最好的。如果您想获得一个数据库和 PHP,您将需要一种将数据放入数据库本身的方法,这会打开一个全新的蠕虫罐。当然,数据库 + 服务器端前端是行业标准,但我觉得它对于您的要求来说太大了。

从简单的文本文件中读取 JSON 时,更容易学习如何使用 jQuery 显示 JSON。您只需编写此代码一次。

然后,只要有变化,您就可以使用简单的工作流程:使用 Excel 输入事件,使用预先录制的格式。然后将 Excel 文件导出为 .csv。使用一个小程序读取 CSV 并将其序列化为 JSON。将输出复制到服务器上的预定位置。一切都准备好了。

如果其他人必须在您不在的情况下更新站点,他们所需要的只是 Excel、转换工具(很小)和服务器密码。我在此答案的末尾发布了转换工具的代码。

或者,您可以使用代码创建一个 ASP .NET WebForms 项目。您可以制作一个 .aspx 页面并使用服务器端代码在其上显示数据,而不是序列化代码创建的对象。然而,这有一些缺点。

  • .net webforms 的学习曲线比 JavaScript 更陡峭,生成的代码可能会使用服务器端控件,除非您知道如何正确使用,否则很难使用 CSS 设置样式。
  • 如果您使用廉价的托管包而不是您自己的服务器,则必须确保提供商在其服务器上具有所需的 .net 版本。此外,由于 .net Web 项目中通常包含所有库,它可能会占用更多空间。
  • 如果输入数据的结构永远不会改变,您可以编译一次转换器并开始将其视为黑匣子。对内容显示方式的任何更改都可以在 JSON 读取代码中进行,并直接在浏览器中进行调试。对于 .net 解决方案,您必须保留 Visual Studio 的安装。
  • .net webforms 不是面向未来的技能。Microsoft 已经创建了一种新的、更方便的 Web 技术 .NET MVC,我不建议现在开始学习旧技术。另一方面,如果您已经有一堆现有的静态页面,那么将这个项目制作成MVC并不是一个好主意,因为MVC不能轻易混合静态和动态页面。您可能可以使用这些内容,但必须重写整个路由系统并替换每个内部链接。

这是将 csv 转换为 JSON 的 C# 应用程序的代码。编译后,将 .exe 放在与 csv 相同的目录中,称为 DataSource.csv。双击它。它将在同一目录中生成一个名为 autoOutput.json 的新文件。.csv 文件中的每一行都必须以该event name; venue; date; cost;格式构建。您可以在 Excel 的右侧添加注释或类似内容cost,它们将被丢弃。行的顺序无关紧要。只要活动名称是唯一的,以它开头的所有场地和日期都将被解释为属于该活动。只要活动名称和地点的组合是唯一的,所有日期都将被解释为与该地点的该活动有关。

我没有对哪些行因为太短而无法读取的信息做任何事情。您可以将其附加到文件中,或将其内容与警告交换。然后进行转换的人将不得不摆弄 csv 直到没有警告,或者您可以尝试将其保留在文件中,但在加载以进行显示时忽略它。

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Web.Script.Serialization; 

namespace ElendilEvents2JSON
{
    public class Event
    {
        public String Name { get; set; }
        public List<EventInVenue> venues { get; set; }

    }

    public class EventInVenue 
    {
        public String VenueName { get; set; }
        public List<EventInstance> Dates { get; set; }
    }

        public class EventInstance
    {
        public String When { get; set; }
        public String Cost { get; set; }

    }

    class Program
    {
        static void Main(String[] args)
        {
            //read the file 
            List<int> unreadable;
            List<Event> events = readFile(@".\SourceData.csv", out unreadable);

            //write the file using the normal JSON serializer. Will output just everything as a single line. If the data structure is changed, it will output in the new structure. 
            string autoOutput;
            JavaScriptSerializer serializer = new JavaScriptSerializer();
            autoOutput = serializer.Serialize(events); 
            File.WriteAllText(@".\autoOutput.json", autoOutput); 
        }

         public static List<Event> readFile(string path, out List<int> unreadableLines)
        {
            //get the contents out of the file
            var lines = System.IO.File.ReadLines(path);
            // split each line into an array of strings
            var csv = lines
                .Select(line => line.Split(';'))
                .ToArray();

            //will hold all events 
            List<Event> events = new List<Event>();
            //will hold the numbers of all lines which were OK
            List<int> unreadable = new List<int>();

            //read each line, if you want to skip header lines, change the zero
            for (int lineCounter = 0; lineCounter < csv.Length; lineCounter++)
            {
                string[] line = csv[lineCounter];

                if (line.Length >= 4)
                {
                    string eventName = line[0];

                    Event currentEvent;
                    //if we haven't yet created the event, create it now and add it to the dictionary 
                    if (!events.Select(ev => ev.Name).Contains(eventName))
                    {
                        currentEvent = new Event { Name = eventName };
                        //the venues of the new event are still empty
                        currentEvent.venues = new List<EventInVenue>();
                        events.Add(currentEvent);
                    }
                    else currentEvent = events.Where(ev => ev.Name == eventName).Single();

                    // the same as above: we have the event now, if the current venue isn't yet on its list, enter it, else use the old one
                    string venueName = line[1];
                    EventInVenue currentVenue;
                    if (!currentEvent.venues.Select(ven => ven.VenueName).Contains(venueName))
                    {
                        currentVenue = new EventInVenue { VenueName = venueName };
                        currentVenue.Dates = new List<EventInstance>();
                        currentEvent.venues.Add(currentVenue);
                    }
                    else currentVenue = currentEvent.venues.Where(ven => ven.VenueName == venueName).Single(); 

                    string date = line[2];
                    string cost = line[3];

                    EventInstance currentEventInstance = new EventInstance { When = date, Cost = cost };
                    currentVenue.Dates.Add(currentEventInstance);
                }
                else
                    //if the line was too short
                    unreadable.Add(lineCounter + 1);

            }
            unreadableLines = unreadable;
            return events;
        }
    }
}
于 2013-10-25T16:50:14.327 回答
1

你不需要开始学习 PHP 来做这么简单的事情。如果您对 jQuery 有一点了解,只需将 JSON 文件添加到您的服务器,例如。events.json使用这种结构:

[
  {
     "event": "Event name",
     "description": "description of the event",
     "dates": [
       {
         "date": "20131028",
         "place": "Dublin"
       }, {
         "date": "20131030",
         "place": "London"
       }
     ]
   }, {
       ... another event here with the same structure...
   }
]

加载它jquery.get,使用一些模板库(例如underscore)并在页面内制作简单的模板来显示事件和详细信息。最后,您将只有 2 个页面(或者可能只有一个),home.html用于显示事件列表并event.html显示有关事件的详细信息。

现在编辑events.json添加和更改主页和详细信息页面上的事件。这只是一个粗略的示例,需要根据您的要求进行定制。

于 2013-10-25T12:00:22.507 回答
1

最简单的方法是使用 PHP 和 mySQL 数据库。您可以使用 CSV 文件添加/覆盖数据库,但从长远来看,您最好开发一个简单的输入表单来更新数据库,而不是手动完成覆盖/更新 mysql 数据库的任务,使用CSV 文件。

于 2013-10-25T11:37:00.310 回答
0

Ajax 是一种允许客户端脚本和服务器端脚本之间进行对话的技术。所以为了使用它,你必须研究一些服务器端的东西。JQuery 是一个客户端脚本,这意味着它只在浏览器的客户端计算机上运行。

我建议您从 php 开始,它更易于学习和使用。只需阅读文件即可轻松学习。

于 2013-10-25T11:37:11.353 回答