[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-9053":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":10,"language":11,"languages":10,"totalLinesOfCode":10,"stars":12,"forks":13,"watchers":14,"openIssues":15,"contributorsCount":16,"subscribersCount":16,"size":16,"stars1d":16,"stars7d":16,"stars30d":17,"stars90d":16,"forks30d":16,"starsTrendScore":16,"compositeScore":18,"rankGlobal":10,"rankLanguage":10,"license":19,"archived":20,"fork":20,"defaultBranch":21,"hasWiki":22,"hasPages":20,"topics":23,"createdAt":10,"pushedAt":10,"updatedAt":31,"readmeContent":32,"aiSummary":33,"trendingCount":16,"starSnapshotCount":16,"syncStatus":34,"lastSyncTime":35,"discoverSource":36},9053,"adminify","topfullstack\u002Fadminify","topfullstack","An Admin Dashboard based on Vuetify material","",null,"Vue",960,219,53,8,0,1,51.13,"MIT License",false,"master",true,[24,25,26,27,28,29,30],"admin","adonisjs","dashboard","sidebar","vue","vuejs","vuetify","2026-06-12 04:00:42","# Adminify\n\n## [Deprecated]: Please check [REST-ADMIN](https:\u002F\u002Fgithub.com\u002Fwxs77577\u002Frest-admin) - admin dashboard based on vue 2 and bootstrap v4\n\n[![Join the chat at https:\u002F\u002Fgitter.im\u002Fvue-adminify\u002FLobby](https:\u002F\u002Fbadges.gitter.im\u002Fvue-adminify\u002FLobby.svg)](https:\u002F\u002Fgitter.im\u002Fvue-adminify\u002FLobby?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)\n\n- An Admin dashboard based on [Vuetify](https:\u002F\u002Fvuetifyjs.com\u002F) .\n- Data in demo use `axios-mock-adapter`\n- Better Server API is built on [AdonisJs](http:\u002F\u002Fwww.adonisjs.com\u002F) . \n- Also welcome to [Adonis China](https:\u002F\u002Fadonis-china.org\u002F) .\n\n## Live Demo\n[http:\u002F\u002Fadminify.genyii.com](http:\u002F\u002Fadminify.genyii.com)\n\n\n## Features\n- Vue + Vue Router + Vuex + Axios.\n- Material Design Style - [Vuetify](https:\u002F\u002Fvuetifyjs.com\u002F)\n- Data Grid with server side `sort`,`search`,`pagination` and json config.\n- Dynamic Form Builder with `text`,`textarea`,`radios`,`checkboxes`,`select`,`html` input types and json config.\n- Built in `localStorage` proxy for any data types.\n- Axios Mock with `axios-mock-adapter`\n- Configurable side menu with json\n- i18n with `vue-i18n`\n- `Basic` and `Main` layouts\n- Stylus processor\n- And more of your requests.\n\n## Getting start\n1. `git clone https:\u002F\u002Fgithub.com\u002Fwxs77577\u002Fadminify.git`\n1. Copy `src\u002Fconfig.sample.js` to `src\u002Fconfig.js`\n1. `npm install`\n1. `npm run dev`\n1. **Remove `line:6 ~ line:9` in `\u002Fsrc\u002Fhttp.js` to speed up page loading if you don't need http mock.**\n\n> Use `cnpm` instead `npm` in China\n\n\n## Screenshots\n|  |  |\n|---|---|\n|![1.png](screenshots\u002F1.png)|![2.png](screenshots\u002F2.png)|\n|![3.png](screenshots\u002F3.png)|![4.png](screenshots\u002F4.png)|\n|![5.png](screenshots\u002F5.png)|![6.png](screenshots\u002F6.png)|\n|![7.png](screenshots\u002F7.png)||\n|![](.\u002Fscreenshots\u002Ftfs-qrcode.png) Wechat Group|![](.\u002Fscreenshots\u002Ftfs-logo.png) Free Videos|\n\n## Config\n> `src\u002Fconfig.js`\n```javascript\nconst baseUrl = 'http:\u002F\u002Flocalhost:3333'\nconst config = {\n  locale: 'en-US', \u002F\u002Fen-US, zh-CN\n  url: baseUrl,\n  debug: {\n    mock: 1, \u002F\u002Fenable mock\n    http: true, \u002F\u002Fhttp request log\n  },\n  api: `${baseUrl}\u002Fadmin\u002Fapi`\n  \u002F\u002F locale: 'en', \u002F\u002Fen\n  \u002F\u002F api: 'http:\u002F\u002F192.168.1.108:3333\u002Fadmin\u002Fapi'\n}\n```\n\n## Menu Config\n> `src\u002Fmenu.js`\n```javascript\nexport default [\n  { \"href\": \"\u002F\", \"title\": \"Home\", \"icon\": \"home\" },\n  { \"href\": \"\u002Fcrud\u002Ftypes\", \"title\": \"Types\", \"icon\": \"view_list\" },\n  { \"href\": \"\u002Fcrud\u002Fposts\", \"title\": \"Posts\", \"icon\": \"view_list\" },\n  { \"href\": \"\u002Fcrud\u002Fposts\u002Fcreate\", \"title\": \"Create Post\", \"icon\": \"note_add\" },\n\n\n  { \"href\": \"\u002Fcrud\u002Fcomments\", \"title\": \"Comments\", \"icon\": \"view_list\" },\n  { \"href\": \"\u002Fcrud\u002Fusers\", \"title\": \"Users\", \"icon\": \"people\" },\n  \n  \n  \n  { \"href\": \"\u002Fchat\", \"title\": \"Chat\", \"icon\": \"chat\" },\n  {\n    \"title\": \"Pages\",\n    \"icon\": \"domain\",\n    \"items\": [\n      { \"href\": \"\u002Fexample\", \"title\": \"Example\" },\n      { \"href\": \"\u002Fabout\", \"title\": \"About\" }\n    ]\n  },\n  { \"href\": \"\u002Fsettings\", \"title\": \"Settings\", \"icon\": \"settings\" },\n\n  { \"href\": \"\u002Flogin\", \"icon\": \"lock\", \"title\": \"Logout\" }\n]\n```\n>  No more explaination needed right?\n\n## Routes\n> Part of `src\u002Frouter.js`\n\n\n\n```javascript\n  \u002F\u002F The signature of `route` function :\n  function route(path, file, name, children) {}\n\n  \u002F\u002Froutes\n  [\n    route('\u002Flogin', 'Login', 'login'),\n    route('\u002Ferror', 'Error', 'error'),\n\n    \u002F\u002Fpath, file(*.vue), name, children\n    \n    route('\u002F', 'Main', null, [\n      route('\u002F', 'Home', 'home'),\n      route('\u002Fcrud\u002F:resource', 'CrudGrid', 'grid'),\n      route('\u002Fcrud\u002F:resource\u002F:id\u002Fedit', 'CrudForm', 'edit'),\n      route('\u002Fcrud\u002F:resource\u002Fcreate', 'CrudForm', 'create'),\n      route('\u002Fcrud\u002F:resource\u002F:id\u002F:action', 'CrudForm', 'action'),\n      route('\u002Fcrud\u002F:resource\u002F:action', 'CrudForm', 'indexAction'),\n      route('\u002Fexample', 'Example'),\n      route('\u002Fsettings', 'Settings'),\n      route('\u002Ftheme', 'Theme'),\n      route('\u002Fchat', 'Chat'),\n      route('\u002Fabout', 'About'),\n    ]),\n    \n\n    \u002F\u002F Global redirect for 404\n    { path: '*', redirect: '\u002Ferror', query: {code: 404, message: 'Page Not Found.'} }\n  ]\n```\n\n## Grid View Config\n> `src\u002Fmock\u002Findex.js`\n```javascript\nmock.onGet('\u002Ftypes\u002Fgrid').reply(200, {\n  \"options\": {\n    \"sort\": \"id\", \u002F\u002Fdefault sort column\n    \"create\": false, \u002F\u002Fshow Create button\n    \"update\": true, \u002F\u002Fshow update button\n    \"delete\": false \u002F\u002Fshow delete button\n  },\n  \"filters\": {\n    \"model\": {\n      \"name\": \"\",\n      \"created_at\": \"\"\n    },\n    \"fields\": { \u002F\u002Ffilters fields config\n      \"name\": {\n        \"label\": \"Name\"\n      },\n      \"created_at\": {\n        \"label\": \"Created At\",\n        \"type\": \"date\"\n      }\n    },\n    \"rules\": {}\n  },\n  \"columns\": [ \u002F\u002Fcolumns config\n    {\n      \"text\": \"Id\", \u002F\u002Fcolumn header text\n      \"value\": \"id\" \u002F\u002Ffield name\n    },\n    {\n      \"text\": \"Name\",\n      left: true, \u002F\u002Fmake text align left, default is right\n      \"value\": \"name\"\n    }\n  ]\n});\n```\n\n## Grid View Data \n> `src\u002Fmock\u002Findex.js`\n```javascript\nmock.onGet(\u002F\\\u002F(posts|users|types|comments)$\u002F).reply(({ params = { page: 1, perPage: 10 }, url }) => {\n  let resource = url.split('\u002F')[1]\n  let offset = (params.page - 1) * params.perPage\n  let models = data[resource]\n  return [200, { \u002F\u002Freturn like this format\n    currentPage: params.page,\n    lastPage: Math.ceil(models.length \u002F params.perPage),\n    perPage: params.perPage,\n    total: data[resource].length,\n    data: models.slice(offset, offset + params.perPage)\n  }]\n});\n```\n\n## Form Builder Config\n> `src\u002Fmock\u002Findex.js`\n\n```javascript\nmock.onGet('\u002Fsettings\u002Fform').reply(({ params }) => {\n  return [200, {\n    \"model\": { \u002F\u002Fform model\n      name: 'Adminify',\n      logo: 'http:\u002F\u002Fplaceimg.com\u002F128\u002F128\u002Fany',\n      date: null,\n      \n      type: 1,\n      status: 1,\n      \n      tags: [],\n      description: 'An Awesome Site',\n      intro: '',\n    },\n    \"fields\": { \u002F\u002Fform fields\n      \"name\": {label: 'Name'}, \u002F\u002Fdefault type is 'text'\n      \"logo\": {label: 'Logo', type: 'image'}, \u002F\u002Fworking in progress\n      \"date\": {label: 'Created At', type: 'date'},\n      \"type\": {label: 'Type', type: 'select', options: [\n        {text: 'Blog', value: 1},\n        {text: 'Company', value: 2},\n        {text: 'Game', value: 3},\n      ]},\n      \"status\": {label: 'Status', type: 'radios', width: 'md3', options: [\n        {text: 'Enabled', value: 1},\n        {text: 'Disabled', value: 2}\n      ]},\n      \"tags\": {label: 'Tags', type: 'checkboxes', width: 'md3', options: [\n        {text: 'Enabled', value: 1},\n        {text: 'Disabled', value: 2}\n      ]},\n      \"description\": {label: 'Description', type: 'textarea'},\n      \"intro\": {label: 'Intro', type: 'html'},\n    }\n  }]\n})\n```\n\n## Comunication\n### Gitter IM \n[https:\u002F\u002Fgitter.im\u002Fvue-adminify\u002F](https:\u002F\u002Fgitter.im\u002Fvue-adminify\u002F)\n","Adminify 是一个基于 Vuetify 的管理后台仪表盘项目。它利用了 Vue、Vue Router、Vuex 和 Axios 等技术栈，结合 Vuetify 材料设计风格，提供了美观且功能丰富的用户界面。该项目支持服务器端的数据排序、搜索和分页，并且内置了动态表单构建器，可以轻松配置多种输入类型。此外，Adminify 还集成了 i18n 国际化支持以及可配置的侧边菜单。适用于需要快速搭建美观且响应式的后台管理系统场景，特别是对于偏好使用 Vue 生态圈技术栈的开发者来说非常友好。虽然项目已不再维护，但其设计理念和技术实现仍值得参考。",2,"2026-06-11 03:20:58","top_language"]