前台前后端分离

Former-commit-id: f4cd35e8dae827272959d2ec8922dcd698edeb7c
Former-commit-id: af6fed96be2b6198c5514b82c257243314db5109
TangShanKaiPing
wanggang 5 years ago
parent 52ae6b3dc5
commit f4c442d6ce

@ -0,0 +1,66 @@
using Application.Domain.Entities;
using Infrastructure.Application.Services.Settings;
using Infrastructure.Data;
using Infrastructure.Extensions;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Logging;
using System;
using System.Collections.Generic;
using System.Linq;
namespace IoTCenter.Api.Controllers
{
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]/[action]")]
[ApiController]
public class SiteController : ControllerBase
{
private readonly ILogger<SiteController> _logger;
private readonly ISettingService _settingService;
private readonly IRepository<User> _userRepo;
public SiteController(
ILogger<SiteController> logger,
ISettingService settingService,
IRepository<User> userRepo)
{
this._logger = logger;
this._settingService = settingService;
this._userRepo = userRepo;
}
public IActionResult GetSite()
{
try
{
var username = User.Identity.IsAuthenticated ? this.HttpContext.User.Identity.Name : null;
var permissions = new List<string>();
if (User.Identity.IsAuthenticated)
{
permissions = this._userRepo.ReadOnlyTable()
.Where(o => o.UserName == username)
.SelectMany(o => o.UserRoles)
.Select(o => o.Role)
.SelectMany(o => o.RolePermissions)
.Select(o => o.Permission)
.Select(o => o.Number)
.ToList();
}
return Ok(new
{
logo = this._settingService.GetSetting("logo").Value,
name = this._settingService.GetSetting("name").Value,
copyright = this._settingService.GetSetting("copyright").Value,
version = Helper.Instance.GetVersion(),
username,
permissions
});
}
catch (Exception ex)
{
this._logger.LogError(ex, ex.Message);
return Problem(ex.Message);
}
}
}
}

@ -1,12 +1,58 @@
<!DOCTYPE html>
<html>
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="lib/fontawesome-free/css/all.min.css" />
<link rel="stylesheet" href="lib/ionicons/css/ionicons.min.css" />
<link rel="stylesheet" href="lib/admin-lte/css/adminlte.min.css" />
<!--<link rel="stylesheet" href="lib/toastr.js/toastr.min.css" />-->
<!--<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />-->
<!--<link rel="stylesheet" href="lib/bootstrap-vue/bootstrap-vue.min.css" />-->
<!--<link rel="stylesheet" href="lib/ant-design-vue/antd.min.css" />-->
<!--<link rel="stylesheet" href="lib/element-ui/theme-chalk/index.css" />-->
<link rel="stylesheet" href="lib/weui/style/weui.min.css" />
<link rel="stylesheet" href="css/site.css" />
<title></title>
</head>
<body>
<script>
window.location.href = '/IoTCenter/?v=' + Date.parse(new Date());
</script>
<body class="hold-transition sidebar-mini layout-fixed">
<div id="app">
<router-view></router-view>
<div id="loadingToast" style="display: none;">
<div class="weui-mask_transparent"></div>
<div class="weui-toast">
<i class="weui-loading weui-icon_toast"></i>
<p class="weui-toast__content">加载中</p>
</div>
</div>
</div>
<script src="lib/jquery/jquery.min.js"></script>
<script src="lib/jquery.serializeJSON/jquery.serializejson.min.js"></script>
<script src="lib/linq.js/linq.min.js"></script>
<script src="lib/axios/axios.min.js"></script>
<script src="lib/pubsub-js/pubsub.min.js"></script>
<script src="lib/vue/vue.min.js"></script>
<script src="lib/vuex/vuex.min.js"></script>
<script src="lib/vue-router/vue-router.min.js"></script>
<script src="lib/jwt-decode/build/jwt-decode.min.js"></script>
<script src="lib/admin-lte/js/adminlte.min.js"></script>
<script src="lib/signalr/signalr.min.js"></script>
<script src="lib/chart.js/Chart.bundle.min.js"></script>
<script src="lib/flv.js/flv.min.js"></script>
<!--<script src="lib/toastr.js/toastr.min.js"></script>-->
<!--<script src="lib/bootstrap/js/bootstrap.min.js"></script>-->
<!--<script src="lib/bootstrap-vue/bootstrap-vue.min.js"></script>-->
<!--<script src="lib/moment.js/moment.min.js"></script>
<script src="lib/moment.js/locale/zh-cn.js"></script>
<script src="lib/ant-design-vue/antd.min.js"></script>-->
<!--<script src="lib/element-ui/index.js"></script>-->
<script src="js/common.js"></script>
<script src="js/config.js"></script>
<script src="js/axios.js"></script>
<script src="js/route.js"></script>
<script src="js/components.js"></script>
<script src="js/state.js"></script>
<script src="js/signalr.js"></script>
<script src="js/iot.js"></script>
<script src="js/main.js"></script>
</body>
</html>
</html>

@ -1,58 +1,12 @@
<!doctype html>
<html lang="en">
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8" />
<link rel="stylesheet" href="lib/fontawesome-free/css/all.min.css" />
<link rel="stylesheet" href="lib/ionicons/css/ionicons.min.css" />
<link rel="stylesheet" href="lib/admin-lte/css/adminlte.min.css" />
<!--<link rel="stylesheet" href="lib/toastr.js/toastr.min.css" />-->
<!--<link rel="stylesheet" href="lib/bootstrap/css/bootstrap.min.css" />-->
<!--<link rel="stylesheet" href="lib/bootstrap-vue/bootstrap-vue.min.css" />-->
<!--<link rel="stylesheet" href="lib/ant-design-vue/antd.min.css" />-->
<!--<link rel="stylesheet" href="lib/element-ui/theme-chalk/index.css" />-->
<link rel="stylesheet" href="lib/weui/style/weui.min.css" />
<link rel="stylesheet" href="css/site.css" />
<title></title>
</head>
<body class="hold-transition sidebar-mini layout-fixed">
<div id="app">
<router-view></router-view>
<div id="loadingToast" style="display: none;">
<div class="weui-mask_transparent"></div>
<div class="weui-toast">
<i class="weui-loading weui-icon_toast"></i>
<p class="weui-toast__content">加载中</p>
</div>
</div>
</div>
<script src="lib/jquery/jquery.min.js"></script>
<script src="lib/jquery.serializeJSON/jquery.serializejson.min.js"></script>
<script src="lib/linq.js/linq.min.js"></script>
<script src="lib/axios/axios.min.js"></script>
<script src="lib/pubsub-js/pubsub.min.js"></script>
<script src="lib/vue/vue.min.js"></script>
<script src="lib/vuex/vuex.min.js"></script>
<script src="lib/vue-router/vue-router.min.js"></script>
<script src="lib/jwt-decode/build/jwt-decode.min.js"></script>
<script src="lib/admin-lte/js/adminlte.min.js"></script>
<script src="lib/signalr/signalr.min.js"></script>
<script src="lib/chart.js/Chart.bundle.min.js"></script>
<script src="lib/flv.js/flv.min.js"></script>
<!--<script src="lib/toastr.js/toastr.min.js"></script>-->
<!--<script src="lib/bootstrap/js/bootstrap.min.js"></script>-->
<!--<script src="lib/bootstrap-vue/bootstrap-vue.min.js"></script>-->
<!--<script src="lib/moment.js/moment.min.js"></script>
<script src="lib/moment.js/locale/zh-cn.js"></script>
<script src="lib/ant-design-vue/antd.min.js"></script>-->
<!--<script src="lib/element-ui/index.js"></script>-->
<script src="js/common.js"></script>
<script src="js/config.js"></script>
<script src="js/axios.js"></script>
<script src="js/route.js"></script>
<script src="js/components.js"></script>
<script src="js/state.js"></script>
<script src="js/signalr.js"></script>
<script src="js/iot.js"></script>
<script src="js/main.js"></script>
<body>
<script>
window.location.href = '/IoTCenter/?v=' + Date.parse(new Date());
</script>
</body>
</html>
</html>

@ -32,7 +32,7 @@ function update(list, item, key) {
list.push(item);
result = true;
}
console.log(result ? 'insert' : 'update' + ' data by ' + key);
//console.log(result ? 'insert' : 'update' + ' data by ' + key);
return result;
}
//delete
@ -87,7 +87,6 @@ function execApi(number, method, query) {
loading.show();
axios.post(config.baseUrl+'/IoTCenter/api/v1/api/execApi', { connectionId, number, method, query })
.then(function (response) {
console.log(response);
})
.catch(function (error) {
console.log(error);

@ -1,5 +1,5 @@
Vue.component('layout', function (resolve, reject) {
axios.get("/components/layout.html").then(function (response) {
axios.get("/pages/shared/layout.html").then(function (response) {
resolve(parseModel(response));
});
});

@ -1,4 +1,4 @@
var config = {
baseUrl: 'http://localhost',//window.location.protocol + '//' + window.location.hostname,
baseUrl: window.location.protocol + '//' + window.location.host,
isMobile: /(iPhone|iPad|iPod|iOS|Android)/i.test(navigator.userAgent)
};

@ -22,7 +22,6 @@ connection.on('Connected', function (id) {
});
connection.on("ServerToClient", function (method, message, to, from) {
console.log(method + ':' + message);
PubSub.publish(method, {message:message,to:to,from:from});
});
connect();

@ -0,0 +1,14 @@
<template>
<layout v-bind:title="title">
<h1>后台首页</h1>
</layout>
</template>
<script>
export default {
data: function () {
return {
title: '后台列表'
}
}
}
</script>

@ -0,0 +1,14 @@
<template>
<layout v-bind:title="title">
<h1>列表页</h1>
</layout>
</template>
<script>
export default {
data: function () {
return {
title: '列表页'
}
}
}
</script>

@ -1,5 +1,5 @@
<template>
<layout>
<layout v-bind:title="title">
<div v-if="device">
<div class="row">
<div class="col">
@ -55,6 +55,7 @@
}
},
mounted: function () {
this.subscribe();
this.load();
},
methods: {

@ -1,5 +1,5 @@
<template>
<layout v-bind:title="title" v-bind:url="url">
<layout v-bind:title="title">
<div class="row overlay-wrapper">
<div class="col-md-2 col-sm-4 col-xs-6" v-for="item in products">
<div class="card">
@ -27,6 +27,7 @@
}
},
mounted: function () {
this.subscribe();
this.load();
},
methods: {
@ -35,7 +36,6 @@
var vm = this;
axios.post(url).then(function (response) {
vm.products = response.data;
vm.subscribe();
});
},
subscribe() {

@ -1,5 +1,5 @@
<template>
<layout>
<layout v-bind:title="title">
<!--场景-->
<div class="row" v-if="node.scenes.length">
<div class="col">
@ -99,6 +99,7 @@
};
},
mounted: function () {
this.subscribe();
this.load();
},
methods: {

@ -1,5 +1,5 @@
<template>
<layout v-bind:title="title" v-bind:url="url">
<layout v-bind:title="title">
<div class="row overlay-wrapper">
<div class="col-md-2 col-sm-4 col-xs-6" v-for="item in nodes">
<div class="card">
@ -29,6 +29,7 @@
}
},
mounted: function () {
this.subscribe();
this.load();
},
methods: {
@ -37,7 +38,6 @@
var vm = this;
axios.post(url).then(function (response) {
vm.nodes = response.data;
vm.subscribe();
});
},
subscribe() {

@ -1,5 +1,5 @@
<template>
<layout v-bind:title="title" v-bind:url="url">
<layout v-bind:title="title">
<div class="row overlay-wrapper">
<div class="col-md-2 col-sm-4 col-xs-6" v-for="item in organs">
<div class="card">

@ -1,5 +1,5 @@
<template>
<layout v-bind:title="title" v-bind:url="url">
<layout v-bind:title="title">
<div class="row overlay-wrapper">
<div class="col-md-2 col-sm-4 col-xs-6" v-for="item in product.devices">
<div class="card">
@ -30,6 +30,7 @@
}
},
mounted: function () {
this.subscribe();
this.load();
},
methods: {
@ -38,7 +39,6 @@
var vm = this;
axios.post(url).then(function (response) {
vm.product = response.data;
vm.subscribe();
});
},
subscribe() {

@ -6,7 +6,7 @@
<a class="nav-link" data-widget="pushmenu" href="#"><i class="fas fa-bars"></i></a>
</li>
<li class="nav-item d-none d-sm-inline-block">
<a href="/" class="nav-link">首页</a>
<router-link :to="{path:'/'}" class="nav-link">首页</router-link>
</li>
</ul>
<ul class="navbar-nav ml-auto">
@ -35,7 +35,7 @@
<nav class="mt-2">
<ul class="nav nav-pills nav-sidebar flex-column" data-widget="treeview" role="menu" data-accordion="false">
<li class="nav-item">
<router-link :to="{path:'/'}" :class="'nav-link'+isActive(['/','/pages/product.html','/pages/device.html'])">
<router-link :to="{path:'/'}" :class="isPageActive('/','/pages/product.html','/pages/device.html')">
<i class="nav-icon far fa-image"></i>
<p>
产品
@ -43,7 +43,7 @@
</router-link>
</li>
<li class="nav-item">
<router-link :to="{path:'/pages/nodes.html'}" :class="'nav-link'+isActive(['/pages/nodes.html','/pages/node.html'])">
<router-link :to="{path:'/pages/nodes.html'}" :class="isPageActive('/pages/nodes.html','/pages/node.html')">
<i class="nav-icon far fa-image"></i>
<p>
节点
@ -94,17 +94,18 @@
return {
activeIndex: 1,
openKeys: ['sub1'],
url: config.baseUrl + '/UserCenter/api/v1/token/getLayout',
url: config.baseUrl + '/IoTCenter/api/v1/site/getSite',
model: {
title: '',
logo: '/images/logo.png',
copyright: '',
version: '',
username: ''
username: '',
permissions: []
}
}
},
mounted: function () {
document.querySelector('title').innerText = this.$attrs.title;
var vm = this;
axios.post(this.url).then(function (response) {
vm.model = response.data;
@ -113,20 +114,31 @@
}).finally(function () {
//loading.hide();
});
console.log(this.$route.path);
//console.log(this.$route.path);
},
methods: {
logout() {
store.commit('logout');
router.push('/pages/login.html');
},
isActive(pages) {
for (var i = 0; i < pages.length; i++) {
if (this.$route.path == pages[i]) {
return ' active';
hasPermission(permission) {
return Enumerable.from(this.model.permissions).any(o => o == permission);
},
isPageActive() {
var cls = 'nav-link';
for (var i = 0; i < arguments.length; i++) {
if (this.$route.path == arguments[i]) {
return cls + ' active';
}
}
return '';
return cls;
},
isEntityActive(entity) {
var cls = 'nav-link';
if (this.$route.query.entity === entity) {
return cls + ' active';
}
return cls;
}
}
}
Loading…
Cancel
Save