在当今社会,公民对于自己所在地区的代表和地方议题的了解程度往往不尽如人意。许多人甚至不清楚自己地区的代表是谁,更不用说如何参与到地方议题的讨论和决策中了。为了解决这一问题,正在开发一款名为“了解代表”的应用程序,旨在通过平板电脑平台提升公民意识和参与度。
“了解代表”应用程序的核心目标是让每个公民都能够轻松地找到并联系到自己地区的代表,无论是市议会、州议会还是国会。通过这个平台,用户可以基于地理位置查看和联系他们的官方代表,并提出他们关心的问题。同时,用户还可以查看这些问题的最新状态,了解代表们是如何回应和解决这些问题的。
用户可以通过地理位置查看并联系他们的官方代表,并提出他们关心的问题。应用程序提供了以下特点:
计划使用Visual Studio 2012进行应用程序的编码(C#)和页面设计(XAML)。后端服务将使用Windows Azure来存储用户注册信息、问题和回应以及投票数据。Azavea-Cicero GIS API将用于根据地理位置获取官员信息。最终版本的应用程序将在平板电脑和Windows Phone 8上提供。将使用可移植类库在平板电脑和Windows Phone 8应用程序之间共享对象。
还将使用Restful客户端获取立法官员的详细信息,并研究更经济的推送通知服务。
应用程序的页面和用户界面将使用Visual Studio 2012、C#和XAML进行开发。Windows SQL Azure和移动服务将用于存储论坛数据。
GPS技术将被用来检测用户的地理位置,从而加载当地的官员信息。
以下是应用程序中用于与远程数据库连接并保存和获取数据的代码示例。
public class AzureHelper<T> where T : class {
internal static MobileServiceClient MobileService = new MobileServiceClient(
"AZURE DB URL",
"AZUREKEY"
);
private MobileServiceCollection<T, T> items;
private IMobileServiceTable<T> currentTable = MobileService.GetTable<T>();
public async Task<T> Save(T instance) {
await currentTable.InsertAsync(instance);
return instance;
}
public async Task<T> Update(T instance) {
await currentTable.UpdateAsync(instance);
return instance;
}
public async void Delete(T instance) {
await currentTable.DeleteAsync(instance);
}
public async void GetList() {
items = await currentTable.ToCollectionAsync();
}
public async void GetList(Expression<Func<T, bool>> predicate) {
items = await currentTable.Where(predicate).ToCollectionAsync();
}
public MobileServiceCollection<T, T> ListItems {
get {
return items;
}
}
}
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using Newtonsoft.Json;
using RestSharp;
using KnowYourCouncil;
namespace KnowYourCouncil {
public class RestHelper {
private string _username;
private string _password;
string base_url = "http://cicero.azavea.com/v3.1/";
string ApiKey = "";
public RestHelper() {
_username = "";
_password = "";
_client = new RestClient(base_url);
}
public RestHelper(string username, string password) {
_username = username;
_password = password;
_client = new RestClient(base_url);
}
private TimeSpan _opTimeOut = TimeSpan.FromSeconds(30);
private RestClient _client;
private class RestAsyncResult<T> : IAsyncResult where T : class {
public object AsyncState { get; set; }
public WaitHandle AsyncWaitHandle { get; set; }
public bool CompletedSynchronously { get; set; }
public bool IsCompleted { get; set; }
public T Value { get; set; }
}
private async Task<T> ExecuteAsync<T>(RestRequest request, IObserver<string> progress) where T : class {
var tcs = new TaskCompletionSource<T>();
_client.ExecuteAsync(request, resp => {
if (resp.StatusCode != System.Net.HttpStatusCode.OK) {
var ex = new RestInvokeException((int)resp.StatusCode, resp.StatusDescription);
if (progress != null) progress.OnError(ex);
tcs.SetException(ex);
}
var value = JsonConvert.DeserializeObject<T>(resp.Content);
if (value == null) {
var ex = new RestInvokeException(100, "value.ErrorDesc");
if (progress != null) progress.OnError(ex);
tcs.SetException(ex);
} else tcs.SetResult(value);
});
return await tcs.Task;
}
public async Task<Token> getToken(string userId, IObserver<string> progress) {
var url = "token/new.json";
var request = new RestRequest(url, Method.POST);
progress.OnNext("Getting token");
return (await ExecuteAsync<Token>(request, progress));
}
public async Task<RootObject> getofficials(Token token, string location, IObserver<string> progress) {
var url = "official?order=district&sort=asc&f=JSON&search_loc=" + location + "&user=" + token.user + "&token=" + token.token;
// +"&district_type=NATIONAL_EXEC";
url = Uri.EscapeUriString(url);
var request = new RestRequest(url, Method.GET);
progress.OnNext("Getting token");
return (await ExecuteAsync<RootObject>(request, progress));
}
}
}