前台前后端分离

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> <!doctype html>
<html> <html lang="en">
<head> <head>
<meta charset="utf-8" /> <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> <title></title>
</head> </head>
<body> <body class="hold-transition sidebar-mini layout-fixed">
<script> <div id="app">
window.location.href = '/IoTCenter/?v=' + Date.parse(new Date()); <router-view></router-view>
</script> <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> </body>
</html> </html>

@ -1,58 +1,12 @@
<!doctype html> <!DOCTYPE html>
<html lang="en"> <html>
<head> <head>
<meta charset="utf-8" /> <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> <title></title>
</head> </head>
<body class="hold-transition sidebar-mini layout-fixed"> <body>
<div id="app"> <script>
<router-view></router-view> window.location.href = '/IoTCenter/?v=' + Date.parse(new Date());
<div id="loadingToast" style="display: none;"> </script>
<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> </body>
</html> </html>

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

@ -1,5 +1,5 @@
Vue.component('layout', function (resolve, reject) { 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)); resolve(parseModel(response));
}); });
}); });

@ -1,4 +1,4 @@
var config = { 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) 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) { connection.on("ServerToClient", function (method, message, to, from) {
console.log(method + ':' + message);
PubSub.publish(method, {message:message,to:to,from:from}); PubSub.publish(method, {message:message,to:to,from:from});
}); });
connect(); 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> <template>
<layout> <layout v-bind:title="title">
<div v-if="device"> <div v-if="device">
<div class="row"> <div class="row">
<div class="col"> <div class="col">
@ -55,6 +55,7 @@
} }
}, },
mounted: function () { mounted: function () {
this.subscribe();
this.load(); this.load();
}, },
methods: { methods: {

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

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

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

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

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

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