421 lines
13 KiB
JavaScript
421 lines
13 KiB
JavaScript
|
|
/**
|
|||
|
|
* Created by Strawmanbobi
|
|||
|
|
* 2016-11-13
|
|||
|
|
*/
|
|||
|
|
|
|||
|
|
var LS_KEY_ID = "user_name";
|
|||
|
|
var LS_KEY_TOKEN = "token";
|
|||
|
|
|
|||
|
|
var categoriesStated = false;
|
|||
|
|
|
|||
|
|
var colorClass = ["default", "primary", "success", "warning", "danger", "info"];
|
|||
|
|
|
|||
|
|
// global container var
|
|||
|
|
var gCategories = [];
|
|||
|
|
// 2-dimensions brand array
|
|||
|
|
var gBrands = [];
|
|||
|
|
// 1-dimension city array
|
|||
|
|
var gCities = [];
|
|||
|
|
|
|||
|
|
$("#document").ready(function() {
|
|||
|
|
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
// sign in
|
|||
|
|
function signIn() {
|
|||
|
|
var userName = $("#user_name").val();
|
|||
|
|
var password = $("#password").val();
|
|||
|
|
if (null == userName || "" == userName || null == password || "" == password) {
|
|||
|
|
toastr.error("请填写用户账户和密码");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
var pwHash = MD5(password);
|
|||
|
|
doSignIn(userName, pwHash);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onChangePassword() {
|
|||
|
|
var userName = $("#user_name").val();
|
|||
|
|
if (null == userName || "" == userName) {
|
|||
|
|
toastr.error("请填写用户账户");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
$("#changepw_confirm_dialog").modal();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function popUpHintDialog(hint) {
|
|||
|
|
$("#text_hint").empty();
|
|||
|
|
$("#text_hint").append(hint);
|
|||
|
|
$("#hint_dialog").modal();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function navigateToPage(page, id, token) {
|
|||
|
|
var form = $("<form method='post'></form>"),
|
|||
|
|
input;
|
|||
|
|
form.attr({"action" : "/irext/nav/nav_to_url"});
|
|||
|
|
|
|||
|
|
input = $("<input type='hidden'>");
|
|||
|
|
input.attr({"name": "admin_id"});
|
|||
|
|
input.val(id);
|
|||
|
|
form.append(input);
|
|||
|
|
|
|||
|
|
input = $("<input type='hidden'>");
|
|||
|
|
input.attr({"name": "token"});
|
|||
|
|
input.val(token);
|
|||
|
|
form.append(input);
|
|||
|
|
|
|||
|
|
input = $("<input type='hidden'>");
|
|||
|
|
input.attr({"name": "page"});
|
|||
|
|
input.val(page);
|
|||
|
|
form.append(input);
|
|||
|
|
|
|||
|
|
form.submit();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function changePassword() {
|
|||
|
|
var userName = $("#user_name").val();
|
|||
|
|
if (null == userName || "" == userName) {
|
|||
|
|
popUpHintDialog("请填写用户账户");
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
$.ajax({
|
|||
|
|
url: "/irext/certificate/change_pw",
|
|||
|
|
type: "POST",
|
|||
|
|
data: {
|
|||
|
|
user_name : userName,
|
|||
|
|
callback_url : window.location.hostname
|
|||
|
|
},
|
|||
|
|
timeout: 20000,
|
|||
|
|
success: function (response) {
|
|||
|
|
if(response.status.code == 0) {
|
|||
|
|
$("#changepw_confirm_dialog").modal('hide');
|
|||
|
|
popUpHintDialog("新密码已经成功发送到您的邮箱,请查看并确认");
|
|||
|
|
} else {
|
|||
|
|
$("#changepw_confirm_dialog").modal('hide');
|
|||
|
|
popUpHintDialog("申请密码修改失败,请确认您是合法人员,且邮箱地址无误");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
error: function () {
|
|||
|
|
$("#changepw_confirm_dialog").modal('hide');
|
|||
|
|
popUpHintDialog("申请密码修改失败,请确认您是合法人员,且邮箱地址无误");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onSignIn() {
|
|||
|
|
$("#signin_dialog").modal();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function doSignIn(userName, password) {
|
|||
|
|
var token = "";
|
|||
|
|
var adminID = "";
|
|||
|
|
$.ajax({
|
|||
|
|
url: "/irext/certificate/admin_login",
|
|||
|
|
type: "POST",
|
|||
|
|
data: JSON.stringify({user_name: userName, password: password}),
|
|||
|
|
contentType: "application/json; charset=utf-8",
|
|||
|
|
timeout: 20000,
|
|||
|
|
success: function(response) {
|
|||
|
|
if(response.status.code == 0) {
|
|||
|
|
token = response.entity.token;
|
|||
|
|
adminID = response.entity.id;
|
|||
|
|
toastr.success("登入成功,3秒后自动进入控制台");
|
|||
|
|
var permission = token.substring(token.indexOf(",") + 1);
|
|||
|
|
var index = null;
|
|||
|
|
var page = "";
|
|||
|
|
if (null != permission && permission != "") {
|
|||
|
|
index = permission.substring(0, 1);
|
|||
|
|
}
|
|||
|
|
if (null == index) {
|
|||
|
|
window.location = "./error/auth_error.html";
|
|||
|
|
} else {
|
|||
|
|
page = "code";
|
|||
|
|
}
|
|||
|
|
setTimeout(function() {
|
|||
|
|
// navigateToPage(page, adminID, token);
|
|||
|
|
window.location = "./" + page + "/index.html";
|
|||
|
|
}, 3000);
|
|||
|
|
localStorage.setItem(LS_KEY_ID, adminID);
|
|||
|
|
localStorage.setItem(LS_KEY_TOKEN, token);
|
|||
|
|
} else {
|
|||
|
|
toastr.error("登入失败,请确认密码是否正确");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
error: function() {
|
|||
|
|
toastr.error("登入失败,请确认密码是否正确");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
// stat
|
|||
|
|
function onStatCategories() {
|
|||
|
|
if (true == categoriesStated) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
console.debug("stat categories");
|
|||
|
|
statCategories();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function onStatBrands(categoryIndex) {
|
|||
|
|
var categoryID = 0;
|
|||
|
|
if (true == gBrands[categoryIndex].brandStated) {
|
|||
|
|
return;
|
|||
|
|
}
|
|||
|
|
categoryID = gCategories[categoryIndex].id;
|
|||
|
|
|
|||
|
|
if (3 != categoryID) {
|
|||
|
|
statBrands(gCategories[categoryIndex].id, categoryIndex);
|
|||
|
|
} else {
|
|||
|
|
statCities(gCategories[categoryIndex].id, categoryIndex);
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function getStatInfo() {
|
|||
|
|
$.ajax({
|
|||
|
|
url: "/irext/stat/generic_count",
|
|||
|
|
type: "POST",
|
|||
|
|
dataType: 'json',
|
|||
|
|
data: {
|
|||
|
|
admin_id : id,
|
|||
|
|
token : token
|
|||
|
|
},
|
|||
|
|
timeout: 20000,
|
|||
|
|
success: function (response) {
|
|||
|
|
if(response.status.code == 0) {
|
|||
|
|
refreshStatInfo(response.entity);
|
|||
|
|
} else {
|
|||
|
|
console.log("get remote instance count failed");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
error: function () {
|
|||
|
|
console.log("get remote instance count failed");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function statCategories() {
|
|||
|
|
$.ajax({
|
|||
|
|
url: "/irext/stat/stat_categories",
|
|||
|
|
type: "POST",
|
|||
|
|
timeout: 20000,
|
|||
|
|
success: function (response) {
|
|||
|
|
if(response.status.code == 0) {
|
|||
|
|
gCategories = response.entity;
|
|||
|
|
refreshCategoryList();
|
|||
|
|
} else {
|
|||
|
|
console.log("stat categories failed");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
error: function () {
|
|||
|
|
console.log("stat categories failed");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function statBrands(categoryID, categoryIndex) {
|
|||
|
|
$.ajax({
|
|||
|
|
url: "/irext/stat/stat_brands",
|
|||
|
|
type: "POST",
|
|||
|
|
dataTpe: "JSON",
|
|||
|
|
data: {
|
|||
|
|
category_id: categoryID
|
|||
|
|
},
|
|||
|
|
timeout: 20000,
|
|||
|
|
success: function (response) {
|
|||
|
|
if(response.status.code == 0) {
|
|||
|
|
gBrands[categoryIndex].brands = response.entity;
|
|||
|
|
// console.log("brands stat result = " + JSON.stringify(gBrands[categoryIndex].brands));
|
|||
|
|
refreshBrandList(categoryID, categoryIndex);
|
|||
|
|
} else {
|
|||
|
|
console.log("stat brands failed");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
error: function () {
|
|||
|
|
console.log("stat brands failed");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function statCities(categoryID, categoryIndex) {
|
|||
|
|
$.ajax({
|
|||
|
|
url: "/irext/stat/stat_cities",
|
|||
|
|
type: "POST",
|
|||
|
|
timeout: 20000,
|
|||
|
|
success: function (response) {
|
|||
|
|
if(response.status.code == 0) {
|
|||
|
|
gCities.cities = response.entity;
|
|||
|
|
console.log("cities stat result = " + JSON.stringify(gCities.cities));
|
|||
|
|
refreshCityList(categoryID, categoryIndex);
|
|||
|
|
} else {
|
|||
|
|
console.log("stat cities failed");
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
error: function () {
|
|||
|
|
console.log("stat cities failed");
|
|||
|
|
}
|
|||
|
|
});
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function showStat() {
|
|||
|
|
$("#stat_dialog").modal();
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function refreshStatInfo(statInfo) {
|
|||
|
|
var categoriesCountPanel = $("#categories_count");
|
|||
|
|
var brandsCountPanel = $("#brands_count");
|
|||
|
|
var remoteIndexesCountPanel = $("#remote_indexes_count");
|
|||
|
|
|
|||
|
|
categoriesCountPanel.empty();
|
|||
|
|
categoriesCountPanel.append(statInfo.categories_count);
|
|||
|
|
brandsCountPanel.empty();
|
|||
|
|
brandsCountPanel.append(statInfo.brands_count);
|
|||
|
|
remoteIndexesCountPanel.empty();
|
|||
|
|
remoteIndexesCountPanel.append(statInfo.remote_indexes_count);
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function refreshCategoryList() {
|
|||
|
|
var categoryContent = "";
|
|||
|
|
gBrands = new Array();
|
|||
|
|
for (var i = 0; i < gCategories.length; i++) {
|
|||
|
|
var category = gCategories[i];
|
|||
|
|
|
|||
|
|
if (category.id == 11) {
|
|||
|
|
category.name = "機上盒";
|
|||
|
|
}
|
|||
|
|
var panelID = "category_" + category.id;
|
|||
|
|
var collapseID = "collapse" + category.id;
|
|||
|
|
var colorSpace = i % 6;
|
|||
|
|
var includingText = "";
|
|||
|
|
if (3 != category.id) {
|
|||
|
|
includingText = "个品牌";
|
|||
|
|
} else {
|
|||
|
|
includingText = "个省份";
|
|||
|
|
}
|
|||
|
|
// console.log(colorClass[colorSpace]);
|
|||
|
|
categoryContent +=
|
|||
|
|
"<div class='panel panel-default'>" +
|
|||
|
|
"<div class='panel-heading' role='tab' id='" + panelID + "'>" +
|
|||
|
|
"<h4 class='panel-title' style='text-align:left;'>" +
|
|||
|
|
"<a style='display: block; width: 100%; text-decoration: none;'" +
|
|||
|
|
"role='button' data-toggle='collapse' data-parent='#categories_panel'" +
|
|||
|
|
"href='#" + collapseID +"' onclick='onStatBrands(" + i + ")' " +
|
|||
|
|
"aria-expanded='true' aria-controls='" + collapseID + "'>" +
|
|||
|
|
category.name + " (" + category.brands_count + " " + includingText + ")" +
|
|||
|
|
"</a>" +
|
|||
|
|
"</h4>" +
|
|||
|
|
"</div>" +
|
|||
|
|
"<div id='" + collapseID + "' class='panel-collapse collapse' role='tabpanel' aria-labelledby='headingOne'>" +
|
|||
|
|
"<div class='panel-body' style='text-align:left;' id='brand_charts_" + category.id + "'>" +
|
|||
|
|
"正在加载..." +
|
|||
|
|
"</div>" +
|
|||
|
|
"</div>" +
|
|||
|
|
"</div>";
|
|||
|
|
gBrands[i] = new Array();
|
|||
|
|
gBrands[i].brandStated = false;
|
|||
|
|
}
|
|||
|
|
$("#categories_panel").html(categoryContent);
|
|||
|
|
categoriesStated = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function refreshBrandList(categoryID, categoryIndex) {
|
|||
|
|
// draw charts with highcharts
|
|||
|
|
// adjust the container of charts according to the number of brands in this category
|
|||
|
|
var containerHeight = gBrands[categoryIndex].brands.length * 30 + 200;
|
|||
|
|
console.log("container height = " + containerHeight);
|
|||
|
|
$("#brand_charts_" + categoryID).css("width", "100%");
|
|||
|
|
$("#brand_charts_" + categoryID).css("height", containerHeight + "px");
|
|||
|
|
$("#brand_charts_" + categoryID).css("padding", "0px");
|
|||
|
|
|
|||
|
|
// generate brand names and supported remote index counts
|
|||
|
|
var brandNames = [];
|
|||
|
|
var remoteIndexCounts = [];
|
|||
|
|
for (var i = 0; i < gBrands[categoryIndex].brands.length; i++) {
|
|||
|
|
brandNames[i] = gBrands[categoryIndex].brands[i].name;
|
|||
|
|
remoteIndexCounts[i] = gBrands[categoryIndex].brands[i].remote_indexes_count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$("#brand_charts_" + categoryID).highcharts({
|
|||
|
|
chart: {
|
|||
|
|
type: "bar",
|
|||
|
|
style: {
|
|||
|
|
fontFamily: '微软雅黑'
|
|||
|
|
},
|
|||
|
|
events: {
|
|||
|
|
load: function(event) {
|
|||
|
|
// nothing to do
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
title: {
|
|||
|
|
text: gCategories[categoryIndex].name + "品牌分布"
|
|||
|
|
},
|
|||
|
|
xAxis: {
|
|||
|
|
categories: brandNames
|
|||
|
|
},
|
|||
|
|
yAxis: {
|
|||
|
|
title: {
|
|||
|
|
text: '支持型号数'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
series: [{
|
|||
|
|
name: '型号数',
|
|||
|
|
data: remoteIndexCounts,
|
|||
|
|
dataLabels: {
|
|||
|
|
enabled: true
|
|||
|
|
}
|
|||
|
|
}]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
gBrands[categoryIndex].brandStated = true;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
function refreshCityList(categoryID, categoryIndex) {
|
|||
|
|
// draw charts with highcharts
|
|||
|
|
// adjust the container of charts according to the number of brands in this category
|
|||
|
|
var containerHeight = gCities.cities.length * 30 + 200;
|
|||
|
|
console.log("container height = " + containerHeight);
|
|||
|
|
$("#brand_charts_" + categoryID).css("width", "100%");
|
|||
|
|
$("#brand_charts_" + categoryID).css("height", containerHeight + "px");
|
|||
|
|
$("#brand_charts_" + categoryID).css("padding", "0px");
|
|||
|
|
|
|||
|
|
// generate brand names and supported remote index counts
|
|||
|
|
var provinceNames = [];
|
|||
|
|
var cityCounts = [];
|
|||
|
|
for (var i = 0; i < gCities.cities.length; i++) {
|
|||
|
|
provinceNames[i] = gCities.cities[i].name;
|
|||
|
|
cityCounts[i] = gCities.cities[i].city_count;
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
$("#brand_charts_" + categoryID).highcharts({
|
|||
|
|
chart: {
|
|||
|
|
type: "bar",
|
|||
|
|
style: {
|
|||
|
|
fontFamily: '微软雅黑'
|
|||
|
|
},
|
|||
|
|
events: {
|
|||
|
|
load: function(event) {
|
|||
|
|
// nothing to do
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
title: {
|
|||
|
|
text: gCategories[categoryIndex].name + "地区分布"
|
|||
|
|
},
|
|||
|
|
xAxis: {
|
|||
|
|
categories: provinceNames
|
|||
|
|
},
|
|||
|
|
yAxis: {
|
|||
|
|
title: {
|
|||
|
|
text: '支持城市数'
|
|||
|
|
}
|
|||
|
|
},
|
|||
|
|
series: [{
|
|||
|
|
name: '城市数',
|
|||
|
|
data: cityCounts,
|
|||
|
|
dataLabels: {
|
|||
|
|
enabled: true
|
|||
|
|
}
|
|||
|
|
}]
|
|||
|
|
});
|
|||
|
|
|
|||
|
|
gBrands[categoryIndex].brandStated = true;
|
|||
|
|
}
|